2011-10-19 52 views
1

我在Delphi XE2程序中使用C DLL沒有問題。其中一個DLL函數將函數作爲參數。在C DLL中使用delphi回調函數

下面是函數的原型:

var 
LMX_MySetOption: function(LmxHandle: LMX_HANDLE; 
          eOption: _LMX_SETTINGS; 
          callback: TCallBackProcedure): LMX_STATUS cdecl 
               {$IFDEF WIN32} stdcall {$ENDIF}; 

原始原型中的函數的C爲:

LMX_STATUS LMX_SetOption(LMX_HANDLE LmxHandle, LMX_SETTINGS eOption, 
               const void *pSetting); 

TCallBackProcedure定義如下:

type 
TCallBackProcedure = procedure(bla : Pointer) stdcall; 

我這樣調用函數:

LMX_MySetOption(LmxHandle, LMX_OPT_HEARTBEAT_EXIT_FUNCTION, UserExitRoutine); 

的UserExitRoutine是definede如下:

procedure UserExitRoutine(bla : Pointer) stdcall; 
begin 
... 
end; 

它不工作(訪問衝突) 我不能修改C DLL。

非常感謝您的任何想法!

+0

' TCallbackProcedure'和'const void * pSetting'在我看來並不匹配。 –

回答

0

如果是C程序,不要使用stdcall使用cdecl。

你可以簡單地聲明這

function LMX_MySetOption(LmxHandle: LMX_HANDLE; 
          eOption: _LMX_SETTINGS; 
          callback: Pointer): LMX_STATUS;cdecl;external 'yourmodule.dll'; 

procedure callback(bla:Pointer);cdecl; 
begin 
    //Some code 
end; 

LMX_MySetOption(LmxHandle, LMX_OPT_HEARTBEAT_EXIT_FUNCTION, @callback); 

它應該工作...如果它沒有,也許你不知道的是,函數參數的準確NR ...

+0

謝謝,但它不工作。回調函數的簽名是在原始C頭文件中聲明的:'typedef void(LMX_CALLBACK * HeartbeatExit_pfn)(void * pVendorData);'。如果_WIN32被定義,則LMX_CALLBACK被定義爲'__stdcall'。 –

+0

也許pVendorData引用一個需要額外字節的結構,並嘗試寫一個內存區域女巫沒有提交...另一種解釋我沒有給你。 – opc0de

+0

很多謝謝,實際上它正在工作,它只是當我預料到它沒有調用回調的dll! –