2013-05-15 44 views
0

有专有DLL头声明:在免帕斯卡回调从C++ 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 =零,而不是一些实际的指针。我怀疑我必须以其他方式定义回调的类型或参数,但我不知道如何。

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

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

谢谢。

回答

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

谢谢。但是我仍然不了解有关调用会员函数的约定。我应该如何在Pascal中声明它?我应该声明一些东西还是提供一些使回调正确的东西?我不确定,但它看起来像指针无零是“这个”。我也试过stdcall,结果是一样的 - 无指针。 –

+0

DLL是x86吗?什么是DLL正在使用的编译器?在Free Pascal中为成员函数调用约定与Delphi相同?我不了解Free Pascal。但是,在Delphi中,第一个参数在'edx'寄存器中传递。 – UltimaWeapon

+0

DLL是x86,免费的Pascal编译器也是x86,并且在delphi兼容模式下(当它处于默认objfpc模式时,回调函数根本没有链接)。 –

0
  1. A * bla()相当于bla()。 IOW一个函数TYPE在Pascal中隐含地是一个指针。
  2. C++类不能用不同的编译器表示。即使两个C++编译器也可能有不同的表示。作为(2)的结果,功能类型不是对象。这不是帕斯卡班。 OF OBJECT将使函数类型成为两个指针类型(实例+地址),afaik是C++没有的概念。

所以

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

是一个合理的近似。

+0

也谢谢!有用! –