C++ XE 5 应用程序和C++生成器 5 dll 兼容性
C++ XE 5 Application and C++ Builder 5 dll compatibility
我有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 版本。 不,它们不兼容,因为它们具有不同的内存布局和依赖项。
因此,您的选择是:
-
在 XE5 中重新编译 DLL,并冒着通过 DLL 边界传递
TDataSource
通常不安全的风险,除非您启用运行时包。 -
将 DLL 重写为运行时包 (BPL)。 那么在 EXE 和 DLL 之间传递
TDataSource
是安全的。 但是,运行时包是特定于版本的,因此如果您需要继续使用 BCB5 和 XE5 中的代码,则需要编译单独的 BPL。
重写 DLL, 以便一开始就不通过 DLL 边界传递
TDataSource
。 找出另一种在 EXE 和 DLL 之间交换数据的互操作安全方法。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 提升序列化 1:73 的向后兼容性问题
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- 各种版本的 Mac OSX 向后兼容性如何?(Xcode C++
- Visual Studio 19-17 库兼容性根据 GL 标志
- C++ ABI 兼容性问题/张量流
- Oracle OCCI 和 g++ 7.1 的兼容性问题
- 为什么库API+编译器ABI足以确保具有不同版本gcc的对象之间的兼容性
- 对指针和恒常性兼容性的引用
- 检查操作系统兼容性
- 添加noexcept是否会破坏二进制兼容性
- 右值需要分配什么向后兼容性
- 如何在不添加对库的依赖的情况下添加与库结构的兼容性
- 在Qt中使用C++Lambda函数作为插槽是否有助于保持库的二进制兼容性?
- python 和 swig 版本兼容性问题
- Tensorflow C++ API 和 Caffe 兼容性问题与 Glog 相关
- 当要求兼容性时,核心OpenGL上下文?
- 启用和禁用 RTTI 的模块之间的兼容性
- 值为 std::string,同时保持向后兼容性
- 将 OpenGL 兼容性配置文件与英特尔 HD GPU + Mesa 结合使用