2017-06-15 76 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之间交换数据。