c - 在 C dll 中使用 delphi 回调函数

标签 c delphi dll callback

我在 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/

相关文章:

c - C K&R中的逻辑运算符(波兰语反向计算器)

delphi - Indy IMAP4 无法正确显示德语符号

delphi - 在自定义 Delphi 组件中实现 Columns.Columns 属性

c++ - 缺少 MSVCP100D.dll (OpenCV) Visual Studio 2013

VBA Excel 找不到 DLL

Const 不就是 const 吗?

c - 函数指针不兼容的指针类型 void (*)(void *) from void (my_type *)

c++ - 使用CanFestival的CanOpen同时进行多个药膏

Delphi 7 - 为什么 VK_RETURN 对我不起作用?

c# - 如何获取 mscorlib.ni.lib (.Net Framework 3.5) 的 PDB 文件