Q&A

  • CreateEvent 함수의 리턴값을 콜백함수의 인자로 전달하기 ㅜ.ㅜ
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-->
1  COMMENTS
  • Profile
    최도선 2006.02.28 00:41
    참고하세요.  동작은 저두 확신 못합니다.
    <!--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-->