C++ XE 5 Application and C++ Builder 5 dll compatibility

时间:2017-06-15 09:51:51

标签: c++ c++builder-xe5 c++builder-5

I have BCB5 dll with method:

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();

}

When I call this method from C++ builder 5 application, it's working fine.

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);
}

But, if I'm trying to call this method from C++ XE 5 application, I get Access Violation.

Is there a way to solve the problem of data transmission from XE 5 application to BCB 5 dll without recompile dll in XE5?

1 个答案:

答案 0 :(得分:0)

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

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

所以你的选择是:

  1. 在XE5中重新编译DLL,并承担通过TDataSource通过DLL边界一般不安全的风险,除非您启用运行时包。

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

  3. 重新编写DLL,使其无法通过DLL边界传递TDataSource。找出另一种在EXE和DLL之间交换数据的互操作方式。

相关问题