您的DLL用Delphi两个不同的功能,只有C++ Builder支持,没有其他的C++编译器的作用:
你的回调使用of object
改性剂,这意味着回调可以被分配一个对象实例的非静态方法。这是在C++ Builder中使用特定供应商的__closure
编译器扩展实现的。尽管标准C++确实有使用函数指针来对象方法的语法,但实现与实现__closure
非常不同。
您的回调函数没有声明任何调用约定,所以使用Delphi的默认register
调用约定。在C++ Builder中,它与特定供应商的__fastcall
调用约定(不要与Visual C++的__fastcall
调用约定相混淆,这是完全不同的,并且在C++ Builder中实现为__msfastcall
)。
如果你只关心支持C++ Builder中,然后就可以离开DLL代码,是和相应的C++代码是这样的:
typedef void __fastcall (__closure *TOnIOChangeEvent)(TObject *Sender, int DeviceID, int iFlag);
int __stdcall LaneController_Init(TOnIOChangeEvent OnIOChangeEvent);
void __fastcall TSomeClass::SomeMethod(TObject *Sender, int DeviceID, int iFlag)
{
//...
}
TSomeClass *SomeObject = ...;
LaneController_Init(&(SomeObject->SomeMethod));
然而,如果y OU需要支持其他C++编译器,那么你需要改变DLL支持标准的C/C++,例如:
type
TOnIOChangeEvent = procedure(DeviceID, iFlag: Integer; UserData: Pointer); stdcall;
function LaneController_Init(OnIOChangeEvent: TOnIOChangeEvent; UserData: Pointer): Integer; stdcall;
然后,你可以做以下的C++:
typedef void __stdcall (*TOnIOChangeEvent)(int DeviceID, int iFlag, void *UserData);
int __stdcall LaneController_Init(TOnIOChangeEvent OnIOChangeEvent, void *UserData);
void __fastcall TSomeClass::SomeMethod(int DeviceID, int iFlag)
{
//...
}
// note: not a member of any class. If you want to use a class
// method, it will have to be declared as 'static'...
void __stdcall LaneControllerCallback(int DeviceID, int iFlag, void *UserData)
{
((TSomeClass*)UserData)->SomeMethod(DeviceID, iFlag);
}
TSomeClass *SomeObject = ...;
LaneController_Init(&LaneControllerCallback, SomeObject);
里的东西这是什么?[[使用GetProcAddress:C++从C++调用Delphi DLL失败并返回无效参数](http://stackoverflow.com/a/9726231/576719)。 –
你可以随意更改Delphi和C++代码吗? –
您还需要决定使用哪种语言,C或C++ –