我有一个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函数可以使用函数指针。
通过声明一个功能类型声明在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);