2012-06-20 140 views
4

我有一个C++ DLL,我写了一个具有单个暴露函数的函数,它将函数指针(回调函数)作为参数。在C++ DLL中调用Delphi中的回调函数

#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函数,并注册将来使用的回调函数。但我不确定如何在Delphi中创建一个函数指针,这个指针可以与暴露的C++ DLL函数一起工作。我有Delphi application calling a simple exposed c++ DLL functions从这个问题得到的帮助。

我正在构建C++ DLL,如果需要,我可以更改其参数。

我的问题是:

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

回答

11

通过声明函数类型在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函数,您应该首先使用一个匹配回调类型的签名的Delphi函数。例如:

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

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

RegisterCallbackGetProperty(Callback);