찾았습니다.
KCPDataProcPos = function(strIp: string; lPort:Longint; StrCard:string; strRet:PChar):boolean; stdcall;
==> KCPDataProcPos = function(strIp: string; lPort:Longint; StrCard:string; strRet:string):boolean; stdcall;
로 바꾸고
strRet : PChar; => strRet : string; 로 바꾼 후
strRet를 메모리 할당을 해주니 되는군요
SetLength(strRet,1024); <==이렇게요~~
결국
procedure TForm1.Button1Click(Sender: TObject);
type
KCPDataProcPos = function(strIp: string; lPort:Longint; StrCard:string; strRet:string):boolean; stdcall;
var
i:integer;
s : string;
DataProcPos : KCPDataProcPos;
dll_hwd : THandle;
cData : array[0..1024] of char;
iRet : boolean;
strRet : PChar;
r, strRet2 : string;
ReturnCheck : boolean;
sl: TStringList;
begin
s := '';
s := s + STX;
s := s + 'TEST'; //T18O 단말기 버전
s := s + FS;
s := s + '1100'; //1100 거래구분코드
s := s + FS;
s := s + '2000010166'; //단말기ID
s := s + FS;
s := s + '20'; //거래유형
s := s + FS;
s := s + 'IV5AIC6F02D1FCB1=5WU51011416279172070'; //카드번호(암호화)
s := s + FS;
s := s + ''; //비밀번호
s := s + FS;
s := s + '00'; //할부개월수
s := s + FS;
s := s + '00020000'; //거래금액
s := s + FS;
s := s + '00000000'; //봉사료
s := s + FS;
s := s + '00002000'; //세금
s := s + FS;
s := s + '120517'; //거래일자
s := s + FS;
s := s + 'N'; //망취소유무
s := s + ETX;
try
SetLength(strRet2,1024);
FillChar(cData, SizeOf(cData), #0);
dll_hwd := LoadLibrary('KCPDLL.dll');
@DataProcPos := GetProcAddress(dll_hwd, 'KCPDataProcPos');
iRet := DataProcPos('192.168.0.5', 29976, s, strRet2);
//r := strRet;
edGetData.Text := strRet2;
FreeLibrary(dll_hwd);
except
end;
end;
이렇게 하니 되네요~~~아고 ~~이걸로 엄청 고생했는데~~
쿠핑 님이 쓰신 글 :
: procedure TfrmTEST.btnConfirmClick(Sender: TObject);
: type
: KCPDataProcPos = function(strIp: string; lPort:Longint; StrCard:string; strRet:PChar):boolean; stdcall;
: var
: i:integer;
: s : string;
: DataProcPos : KCPDataProcPos;
: dll_hwd : THandle;
: cData : array[0..1024] of char;
: iRet : boolean;
: strRet : PChar;
: r : string;
: ReturnCheck : boolean;
: begin
: s := '';
: s := s + STX;
: s := s + 'TEST'; //T18O 단말기 버전
: s := s + FS;
: s := s + '1100'; //1100 거래구분코드
: s := s + FS;
: s := s + '2000010166'; //단말기ID
: s := s + FS;
: s := s + '20'; //거래유형
: s := s + FS;
: s := s + edEncryptNum.Text; //카드번호(암호화)
: s := s + FS;
: s := s + ''; //비밀번호
: s := s + FS;
: s := s + '00'; //할부개월수
: s := s + FS;
: s := s + '00020000'; //거래금액
: s := s + FS;
: s := s + '00000000'; //봉사료
: s := s + FS;
: s := s + '00002000'; //세금
: s := s + FS;
: s := s + '120517'; //거래일자
: s := s + FS;
: s := s + 'N'; //망취소유무
: s := s + ETX;
:
: try
: FillChar(cData, SizeOf(cData), #0);
: dll_hwd := LoadLibrary('KCPDLL.dll');
: @DataProcPos := GetProcAddress(dll_hwd, 'KCPDataProcPos');
: iRet := DataProcPos('192.168.0.5', 29976, s, strRet);
:
: edGetData.Text := strRet;
:
: FreeLibrary(dll_hwd);
:
: except
:
: end;
:
: end;
:
:
: 이렇게 DLL을 사용하도록 처리를 하였습니다. dll은 VB로 만들어져 있는 DLL 입니다.
:
: 그런데 strRet 값을 받기만 하면 access violation at address~~~~ 이런 오류가 나옵니다.
:
: 이럴땐 어떻게 하는건가요???
:
: 답변 좀 부탁드리겠습니다.
|