我在 Delphi XE2 程序中使用 C dll 没有问题。其中一个 DLL 函数将函数作为参数。
函数原型(prototype)如下:
var
LMX_MySetOption: function(LmxHandle: LMX_HANDLE;
eOption: _LMX_SETTINGS;
callback: TCallBackProcedure): LMX_STATUS cdecl
{$IFDEF WIN32} stdcall {$ENDIF};
函数的原始 C 原型(prototype)是:
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。
非常感谢任何想法!
最佳答案
如果是 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);
它应该可以工作...如果不能,可能您不知道该函数具有的参数的确切数量...
关于c - 在 C dll 中使用 delphi 回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7822063/