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