2011-10-19 15 views
1

私は問題なくデルファイXE2プログラムでC DLLを使用しています。 DLL関数の1つが引数としての関数を取ります。ここ C DLLでデルファイコールバック関数を使用

は、関数のプロトタイプである:

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

関数のCの元のプロトタイプであった:

type 
TCallBackProcedure = procedure(bla : Pointer) stdcall; 

I:

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

TCallBackProcedureは、以下のように定義されます。このように関数を呼び出す:

LMX_MySetOption(LmxHandle, LMX_OPT_HEARTBEAT_EXIT_FUNCTION, UserExitRoutine); 

UserExitRoutineは以下の通りですdefinede:

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

私がC DLLを変更することはできません(アクセス違反) を働いていません。

何か考えてくれてありがとうございました!

+0

をこの

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); 

を宣言することができますTCallbackProcedure'と 'const void * pSetting'は一致しないようです。 –

答えて

0

Cプロシージャの場合は、stdcallを使用しないでください。cdeclを使用してください。

そして、あなたは、単に `それが動作するはずです...それは多分あなたは関数が持っているパラメータの正確なNRを知っていないしていない場合...

+0

ありがとうございますが、動作していません。コールバック関数のシグネチャは、元のCヘッダファイルのように宣言されています: 'typedef void(LMX_CALLBACK * HeartbeatExit_pfn)(void * pVendorData);'。 _WIN32が定義されている場合、LMX_CALLBACKは '__stdcall'として定義されます。 –

+0

多分、pVendorDataは、追加のバイトを必要とする構造を参照し、メモリの領域を書き込むためのtryesはコミットされません...私はあなたのために持っていない別の説明。 – opc0de

+0

多くのありがとう、それは実際に働いている、それは私がそれが期待されたときにコールバックを呼び出さなかったdllだけです! –