안녕하세요.
C로 만들어진 DLL을 델에서 불러 쓰려고 하는데요..
C의 형 선언이
extern "C" LONG WINAPI Command_1( LONG Address, LPCSTR SdBuff, LPBYTE RdBuff )
인데 델에서 선언시
.
.
procedure Command_1(Address: integer; SdBuff: lpcstr; RdBuff: Pointer);
implementation
{$R *.DFM}
procedure Command00H;external 'abc.dll';
.
.
.
로 정의한 후 호출하면 에러가 납니다. 호출문은
procedure TForm1.Button1Click(Sender: TObject);
var cmd: lpcstr;
rcv: Pointer;
begin
cmd:= #$2;
Command_1(0,cmd,rcv);
end;
무엇이 잘못되었나요? 죽을맛이네요..이넘의 포인트만 나옴 버벅댄답니다.
그럼 즐거운 하루 되세요.
extern "C" LONG WINAPI Command_1( LONG Address, LPCSTR SdBuff, LPBYTE RdBuff ) 이고, dll 이름이 abc.dll 이라면...
{ implementation 내에서만 사용된다고 가정하면 - Delphi 6 기준}
uses Windows; { LPCSTR 타입 정의 때문에... 만일 사용하기 싫으시면 아래의 LPCSTR를 단순히 Pointer 로 하면 될 듯 합니다. PBYTE 역시도 걍 Pointer 사용해도 상관 없음. }
function Command_1(Address:Cardinal; SdBuff:LPCSTR; RdBuff:PByte):Cardinal;stdcall;extern 'abc.dll';
형식이 맞는 듯 한데요...
extern "C" --> 이름 변환 C 형식 (이름 변환 없음)
LONG --> 리턴 값이 LONG( Delphi, Cardinal)
WINAPI --> stdcall in Win32 on Win-Tel
이렇게 바뀌지 않나요??
글구 제 생각에는 정작 문제는 선언보다는 구현상에서 있지 않나 싶은데...
dll-exported 함수 내에서 메모리를 생성해서 넘겨주는 인자면... PPBYTE (^PBYTE)를 사용할 테니깐... 정작 dll 함수에서 요구하는 LPBYTE 인자는 호출하는 쪽에서 메모리를 할당해서 넘겨 달라는 거 아닐까요??? 에러가 난다고하는 것이 Access violation 일 듯 해서...
암튼 오늘도 즐입니다...