C++ 从C++;动态链接库

C++ 从C++;动态链接库,c++,dll,callback,freepascal,C++,Dll,Callback,Freepascal,专有DLL标头中有声明: 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_t

专有DLL标头中有声明:

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
还有一个导出函数将回调函数链接到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++中有空格函数,那么据我所知,它是Pascal的过程,它应该被定义为过程或函数,具有一些指针结果(但没有实际结果)?

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

多谢各位

  • 该程序相当于C/C++中的void函数
  • <> LI> VisualC++中,<>代码>该< <代码>指针在 ECX< /Cord>登记器中传递,默认函数调用成员函数等价于您的回调应该正确,调用约定除外
  • *bla()相当于bla()。函数类型隐式地是Pascal中的指针
  • 一个C++类不能用不同的编译器来表示。甚至两个C++编译器都可能有不同的表示。
  • 作为(2)的结果,函数类型不是OBJECT。它不是Pascal类。对象将使函数类型为双指针类型(实例+地址),而不是C++所没有的概念。 所以


    这是一个合理的近似值。

    谢谢。但我仍然不明白如何调用成员函数的约定。我应该如何用帕斯卡语言声明它?我应该声明一些东西还是提供一些东西使回调正确?我不确定,但指针中的nil似乎是“this”的nil。我也尝试了stdcall,结果是相同的-指针为零。DLL是x86吗?DLL使用的编译器是什么?自由Pascal中成员函数的调用约定是否与Delphi相同?我对自由帕斯卡知之甚少。但是,在Delphi中,第一个参数在
    edx
    register.DLL中传递,Free Pascal编译器也是x86,并且在Delphi兼容模式下(在默认objfpc模式下,回调函数根本没有链接)。检查您的专有DLL它使用的编译器是什么。如果VisualC++、过程IMAGE ECALBACK(PAQIMAIGEFION:PJYTIMAGEAGNOFIN);stdcall应该正在工作。不要将
    ImageCallback
    作为成员函数。如果这样做,Free Pascal会将
    pAqImageInfo
    分配给
    edx
    寄存器,而不是VC++在堆栈中传递的变量。非常感谢!我确定我检查了这个组合但是。。。现在看来我没有。或者是当我使用objfpc模式而不是delphi兼容时。无论如何,谢谢你!
     Type
        J_IMG_CALLBACK_FUNCTION = procedure (pAqImageInfo:Pointer); StdCall; 
     // or cdecl depending on compiler