您的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++ –