【问题标题】:using a delphi callback function in a C dll在 C dll 中使用 delphi 回调函数
【发布时间】:2011-10-19 13:30:04
【问题描述】:

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

非常感谢您的任何想法!

【问题讨论】:

  • TCallbackProcedureconst void *pSetting 在我看来并不匹配。

标签: c delphi dll callback


【解决方案1】:

如果是 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...

【讨论】:

  • 谢谢,但它不起作用。回调函数的签名在原始 C 头文件中声明为:typedef void (LMX_CALLBACK *HeartbeatExit_pfn)(void *pVendorData);。如果定义了 _WIN32,则 LMX_CALLBACK 定义为 __stdcall
  • 也许 pVendorData 引用了一个需要额外字节的结构,并试图写入一个内存区域,女巫没有提交......我没有给你的另一个解释。
  • 非常感谢,实际上它正在工作,只是dll没有在我预期的时候调用回调!
猜你喜欢
  • 2012-06-23
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
相关资源
最近更新 更多