首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从C++ DLL调用Delphi中的回调函数

从C++ DLL调用Delphi中的回调函数
EN

Stack Overflow用户
提问于 2012-06-20 21:33:50
回答 1查看 5.6K关注 0票数 6

我编写了一个C++ DLL,它有一个公开的函数,它使用函数指针(回调函数)作为参数。

代码语言:javascript
运行
复制
#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++动态链接库函数。

在这个问题上,我得到了Delphi application calling a simple exposed c++ DLL functions的帮助。

我正在构建C++动态链接库,如果需要,我可以更改它的参数。

我的问题是:

  • 如何在Delphi
  • 中创建函数指针,如何从Delphi应用程序中正确调用公开的C++ DLL函数,以便C++ DLL函数可以使用函数指针。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-20 21:42:16

通过声明函数类型,在Delphi中声明函数指针。例如,回调的函数类型可以定义如下:

代码语言:javascript
运行
复制
type
  TGetProperty = function(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean; cdecl;

注意,调用约定是cdecl,因为您的C++代码没有指定调用约定,而cdecl是C++编译器通常的默认调用约定。

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

代码语言:javascript
运行
复制
function RegisterCallbackGetProperty(GetProperty: TGetProperty): Boolean; cdecl; external 'dllname';

用DLL的名称替换'dllname'

要调用DLL函数,首先应该有一个带有与回调类型匹配的签名的Delphi函数。例如:

代码语言:javascript
运行
复制
function Callback(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean cdecl;
begin
  Result := False;
end;

然后可以调用DLL函数并传递回调,就像调用任何其他变量一样:

代码语言:javascript
运行
复制
RegisterCallbackGetProperty(Callback);
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11128554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档