C++ XE 5 应用程序和C++生成器 5 dll 兼容性

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

本文关键字:C++ 兼容性 dll XE 应用程序      更新时间:2023-10-16

我有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();
}

当我从构建器5应用程序调用此方法时C++它工作正常。

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

但是,如果我尝试从 XE 5 应用程序调用此方法C++则会出现访问冲突。

有没有办法解决从XE 5应用程序到BCB 5 dll的数据传输问题,而无需在XE5中重新编译dll?

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

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

因此,您的选择是:

  1. 在 XE5 中重新编译 DLL,并冒着通过 DLL 边界传递TDataSource通常不安全的风险,除非您启用运行时包。

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

  3. 重写 DLL,
  4. 以便一开始就不通过 DLL 边界传递TDataSource。 找出另一种在 EXE 和 DLL 之间交换数据的互操作安全方法。