c 로 만든 dll 파일을 사용해야 하는데....
함수중 하나가 CreateEvent 의 리턴값을 인자로 요구합니다.
델파이의 Windows.pas 파일을 보니...
CreateEvent 의 리턴값은 Cardinal (4바이트) 이더군요.
function CreateEvent(lpEventAttributes: PSecurityAttributes; bManualReset, bInitialState: BOOL; lpName: PChar): THandle; stdcall;
CreateEvent 함수의 리턴값을 c쪽 헤더 파일에서 init_proc 함수의 마지막 인자 void * param 에 넣어야 하는데....어떻게 해야 할지 모르겠네요.
init_proc 함수에서는 마지막 인자값을 콜백함수의 인자로 넘긴다고 하더군요.
c 헤더파일에서는 void * 로 되어 있지만 CreateEvent 함수의 리턴값 때문에 델파이로 변환할때 init_proc 의 마지막 인자를 THandle 로 바꿨는데 맞게 한건가요???
해당 인자가 콜백 함수로 까지 넘어가기 때문에 콜백함수에서도 c헤더파일과는 다르게
pointer 대신 THandle 로 바꿔서 썼습니다.
콜백함수의 동작을 확인하기 위해 메모컴포넌트에 내용을 추가하게 했는데 동작을 안하더군요.
콜백함수의 사용 부분도 어떻게 해야 할런지 ㅜ.ㅜ
그리고 아래 소스 중에 sdkHandle : HANDLESDK; 한 부분이 안되서 Pointer 로 했는데
도무지 이해가 안됩니다. HANDLESDK 로 해도 되는거 아닌가요
고수님의 답변을 기다립니다.
---------- c 헤더파일 (dlltest.h) -------------
<!--CodeS-->
typedef void *HANDLESDK;
typedef int (*S_callback)(
void *param,
INT64 progress
);
WIN32DLL HANDLESDK init_proc(
const char *FString,
const char *SString,
S_callback proc,
void *param);
<!--CodeE-->
--------- 델파이 유닛 파일 (dlltest_h.pas) -------------------
<!--CodeS-->
type
HANDLESDK = Pointer;
S_callback = function (param:THandle; progress:Int64):integer;
function init_proc(FString, SString:Pchar; proc:S_callback; param:THandle):HANDLESDK; cdecl; external 'ExternalSDK.dll';
<!--CodeE-->
---------- 델파이 유닛 파일 (uMain.pas) ----------------------
uses 절에 dlltest_h.pas 포함.
<!--CodeS-->
function CallBackProc(param:THandle; progress:Int64):integer;
var
iResult : integer;
begin
iResult := 0;
frmMain.Memo.Lines.Add(IntToStr(progress));
application.ProcessMessages;
result := iResult;
end;
procedure TfrmMain.Button3Click(Sender: TObject);
var
hEvent : THandle;
iErr : cardinal;
sdkHandle : HANDLESDK;
szString1, szString2 : string;
begin
hEvent := CreateEvent(nil, FALSE, FALSE, nil);
sdkHandle := init_proc(PChar(szString1), PChar(szString2), CallBackProc, hEvent);
<!--CodeE-->
<!--CodeS-->
type
HANDLESDK = Pointer;
T_callback = function (param:Pointer; progress:Int64) : integer of object;
S_callback = ^T_callBack;
function init_proc(FString, SString:Pchar; proc:S_callback; param:Pointer):HANDLESDK;
<!--CodeE-->
<!--CodeS-->
var
hEvent : THandle;
iErr : cardinal;
sdkHandle : HANDLESDK;
szString1, szString2 : string;
begin
hEvent := CreateEvent(nil, FALSE, FALSE, nil);
sdkHandle := init_proc(PChar(szString1), PChar(szString2), @CallBackProc, @hEvent);
<!--CodeE-->