调用从C在Delphi中的回调函数++ DLL(Calling a callback functio

2019-06-25 15:14发布

我有一个C ++ DLL我写具有单一暴露的功能,即需要一个函数指针(回调函数)作为参数。

#define DllExport   extern "C" __declspec( dllexport )

DllExport bool RegisterCallbackGetProperty( bool (*GetProperty)( UINT object_type, UINT object_instnace, UINT property_identifer, UINT device_identifier, float * value ) ) {
    // Do something. 
}

我希望能够从Delphi应用程序中调用该暴露的C ++ DLL函数并注册在未来某一日期使用的回调函数。 但我不确定如何使德尔福的函数指针将与暴露的C ++ DLL函数工作。

我有Delphi应用程序调用一个简单的暴露C ++ DLL函数从我在这个问题得到了帮助。

我建立了C ++ DLL,如果需要,我可以改变它的参数。

我的问题是:

  • 如何创建在Delphi函数指针
  • 如何正确我从Delphi应用程序中调用暴露C ++ DLL函数,使得C ++ DLL函数可以使用函数指针。

Answer 1:

通过声明一个功能类型声明在Delphi函数指针。 例如,对于您的回调函数类型可以被定义如下:

type
  TGetProperty = function(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean; cdecl;

注意调用约定cdecl因为你的C ++代码指定的调用约定,并CDECL是C ++编译器通常默认调用约定。

然后你就可以使用该类型来定义DLL函数:

function RegisterCallbackGetProperty(GetProperty: TGetProperty): Boolean; cdecl; external 'dllname';

更换'dllname'与您的DLL的名称。

要调用DLL函数,你首先应该有回调类型相匹配的签名的德尔福功能。 例如:

function Callback(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean cdecl;
begin
  Result := False;
end;

然后,你可以调用的DLL函数,并通过回调就像你任何其他变量:

RegisterCallbackGetProperty(Callback);


文章来源: Calling a callback function in Delphi from a C++ DLL