在C dll中使用delphi回调函数

时间:2011-10-19 13:30:05

标签: c delphi dll callback

我在Delphi XE2程序中使用C dll没有问题。其中一个DLL函数将函数作为参数。

这是函数的原型:

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的定义如下:

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

它不起作用(访问冲突) 我无法修改C dll。

非常感谢任何想法!

1 个答案:

答案 0 :(得分: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参数......