![](/img/trans.png)
[英]Calling Delphi DLL from C++ using GetProcAddress: callback function fails with invalid parameter
[英]Calling a callback function in Delphi from a C++ DLL
我有一个我编写的 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 函数并注册回调函数以供将来使用。 但是我不确定如何在 Delphi 中创建一个可以与公开的 C++ DLL 函数一起使用的函数指针。
我有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 函数,首先应该有一个带有与回调类型匹配的签名的 Delphi 函数。 例如:
function Callback(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean cdecl;
begin
Result := False;
end;
然后,您可以调用 DLL 函数并像处理任何其他变量一样传递回调:
RegisterCallbackGetProperty(Callback);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.