从C ++ DLL中回放Free Pascal

时间:2013-05-15 10:38:49

标签: 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_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;

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

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

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

谢谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

  1. A * bla()等同于bla()。 IOW函数TYPE在Pascal中是一个隐含的指针。
  2. C ++类不能在不同的编译器中表示。即使是两个C ++编译器也可能有不同的表示形式。
  3. 作为(2)的结果,函数类型不是OF OBJECT。它不是Pascal类。 OF OBJECT将使函数类型成为两个指针类型(实例+地址),具有C ++所没有的概念。
  4. 所以

     Type
        J_IMG_CALLBACK_FUNCTION = procedure (pAqImageInfo:Pointer); StdCall; 
     // or cdecl depending on compiler
    

    是一个合理的近似值。