C++ XE 5应用程序和C++ Builder 5 DLL兼容性
问题描述:
我有方法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?
答
除非在启动Runtime Packages的情况下编译EXE和DLL,以便它们共享同一个RTL和VCL框架的公共实例,否则在DLL边界上传递/使用RTL/VCL对象并不安全(但是,您必须在应用程序中部署RTL/VCL BPL二进制文件)。
您的DLL在XE5中无法正常工作,因为DLL期望BCB5版本的TDataSource
组件,而不是XE5版本。不,它们不兼容,因为它们有不同的内存布局和依赖关系。
那么你的选择是要么:
重新编译XE5的DLL,并与经过
TDataSource
在DLL边界不是一般的安全,除非您启用运行时包的危险生活。将DLL重新编写为为而不是运行时包(BPL)。然后在EXE和DLL之间传递
TDataSource
是安全的。但是,运行时软件包是特定于版本的,因此如果需要继续使用BCB5和XE5中的代码,则需要编译单独的BPL。重新编写该DLL以不通过
TDataSource
通过DLL边界开始。找出另一种互操作性安全的方式来在EXE和DLL之间交换数据。