C++ C++;XE 5应用程序和C++;Builder5 dll兼容性

C++ C++;XE 5应用程序和C++;Builder5 dll兼容性,c++,c++builder-xe5,c++builder-5,C++,C++builder Xe5,C++builder 5,我有BCB5 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 =

我有BCB5 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应用程序调用这个方法时,它工作得很好。
try {
 typedef void __declspec(dllexport) __stdcall SM(TDataSource *DS);
 SM *Upload;
 HINSTANCE hDll = LoadLibrary("main.dll");

 Upload = (SM*) GetProcAddress(hDll,"SM");
 Upload(DataSource1);
 FreeLibrary(hDll);

}
catch (Exception *ex) {
  ShowMessage(ex->Message);
}
<>但是,如果我试图从C++ XE 5应用程序调用这个方法,我会访问访问。
有没有一种方法可以解决从XE 5应用程序到BCB 5 dll的数据传输问题,而无需在XE 5中重新编译dll

像您这样在DLL边界上传递/使用RTL/VCL对象是不安全的,除非EXE和DLL都是在启用运行时包的情况下编译的,以便它们共享相同RTL和VCL框架的公共实例(但随后您必须在应用程序中部署RTL/VCL BPL二进制文件)

您的DLL在XE5中不工作,因为该DLL需要的是
TDataSource
组件的BCB5版本,而不是XE5版本。不,它们不兼容,因为它们具有不同的内存布局和依赖性

因此,您的选择是:

  • 在XE5中重新编译DLL,并承担在DLL边界上传递
    TDataSource
    通常不安全的风险,除非启用运行时包

  • 将DLL重新写入运行时包(BPL)。然后,在EXE和DLL之间传递
    TDataSource
    是安全的。但是,运行时包是特定于版本的,因此如果需要继续在BCB5和XE5中使用代码,则需要编译单独的BPL

  • 重新写入DLL,使其不首先在DLL边界上传递
    TDataSource
    。找出另一种互操作安全的方式在EXE和DLL之间交换数据