2017-06-15 110 views
0

我有方法BCB5 DLL:C++ XE 5應用程序和C++ Builder 5 DLL兼容性

extern "C" void __declspec(dllexport) __stdcall SM(TDataSource *DS) { 

TForm *form = new TForm(Application); 
form->Width = 300; 
form->Height = 300; 
form->Name = "frm"; 

TDBGrid *grd = new TDBGrid(form); 
grd->Parent = form; 
grd->Name = "grd"; 
grd->Align = alClient; 
grd->DataSource = DS; 

form->ShowModal(); 

} 

當我打電話從C此方法++ Builder的5應用程序,它的正常工作。但是,如果我試圖從C++ XE 5應用程序中調用此方法,則會出現Access Violation(訪問衝突)。

有沒有辦法解決從XE 5應用程序到BCB 5 DLL的數據傳輸問題,而無需在XE5中重新編譯DLL?

回答

0

除非在啓動Runtime Packages的情況下編譯EXE和DLL,以便它們共享同一個RTL和VCL框架的公共實例,否則在DLL邊界上傳遞/使用RTL/VCL對象並不安全(但是,您必須在應用程序中部署RTL/VCL BPL二進制文件)。

您的DLL在XE5中無法正常工作,因爲DLL期望BCB5版本的TDataSource組件,而不是XE5版本。不,它們不兼容,因爲它們有不同的內存佈局和依賴關係。

那麼你的選擇是要麼:

  1. 重新編譯XE5的DLL,並與經過TDataSource在DLL邊界不是一般的安全,除非您啓用運行時包的危險生活。

  2. 將DLL重新編寫爲而不是運行時包(BPL)。然後在EXE和DLL之間傳遞TDataSource是安全的。但是,運行時軟件包是特定於版本的,因此如果需要繼續使用BCB5和XE5中的代碼,則需要編譯單獨的BPL。

  3. 重新編寫該DLL以不通過TDataSource通過DLL邊界開始。找出另一種互操作性安全的方式來在EXE和DLL之間交換數據。