gpt4 book ai didi

c++ - 来自 C++ DLL 的 Free Pascal 回调

转载 作者:行者123 更新时间:2023-11-28 07:37:12 28 4
gpt4 key购买 nike

专有 DLL header 中有声明:

class CJDummyClass
{
};
typedef CJDummyClass * J_IMG_CALLBACK_OBJECT;
#ifdef __BORLANDC__
typedef void (__stdcall*J_IMG_CALLBACK_FUNCTION)(J_tIMAGE_INFO * pAqImageInfo);
#else
typedef void (CJDummyClass::*J_IMG_CALLBACK_FUNCTION)(J_tIMAGE_INFO * pAqImageInfo);
#endif

还有一个exported function可以将callback function链接到DLL,然后可以通过指针pAqImageInfo处理一些放在内存中的数据

我在 FreePascal 中使用这个 DLL 编写应用程序,几乎所有我需要的东西都已成功翻译、动态链接并包装到一个类中,但现在我遇到了回调函数的问题。这是我的部分代码:

interface
type
pJ_tIMAGE_INFO = ^J_tIMAGE_INFO;
TJ_IMG_CALLBACK_FUNCTION = procedure( const pAqImageInfo: pJ_tIMAGE_INFO ) of object; cdecl;
PJ_IMG_CALLBACK_FUNCTION = ^TJ_IMG_CALLBACK_FUNCTION;

TJaiFactory = class( TObject )
.....
procedure ImageCallback( const pAqImageInfo: pJ_tIMAGE_INFO ); cdecl;
.....
end;
implementation
procedure TJaiFactory.ImageCallback(pAqImageInfo: pJ_tIMAGE_INFO); cdecl;
begin
// some data processing here
end;

在我的 ImageCallback 中,我得到了 pAqImageInfo = nil 而不是一些实际的指针。我怀疑我必须以其他方式为回调定义类型或参数,但我不知道如何。

第一个问题:如果在 C++ 中有一个 void 函数,那么据我所知,它是 Pascal 中的过程,它应该被定义为过程或具有一些指针结果(但没有实际结果)的函数?

第二个问题:如果函数在 C++ 中声明为类的成员,那么将此函数的类型转换为 Pascal 的正确方法是什么?我不确定“这个”指针是怎么回事。

谢谢。

最佳答案

  1. 过程相当于C/C++中的void函数。
  2. 在 Visual C++ 中,this 指针在 ecx 寄存器中传递,成员函数的默认调用约定等同于 __stdcall 除非您通过可变参数,它将更改为 __cdecl。除了调用约定外,您的回调应该是正确的。

关于c++ - 来自 C++ DLL 的 Free Pascal 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16562849/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com