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?
答案 0 :(得分:0)
在DLL边界上传递/使用RTL / VCL对象是不安全的,除非在启用运行时软件包的情况下编译EXE和DLL,以便它们共享相同RTL和VCL框架的公共实例(但是你必须在你的应用程序中部署RTL / VCL BPL二进制文件。
您的DLL在XE5中不起作用,因为DLL期望TDataSource
组件的BCB5版本,而不是XE5版本。不,它们不兼容,因为它们具有不同的内存布局和依赖性。
所以你的选择是:
在XE5中重新编译DLL,并承担通过TDataSource
通过DLL边界一般不安全的风险,除非您启用运行时包。
将DLL重新写入是运行时包(BPL)。然后在EXE和DLL之间传递TDataSource
是安全的。但是,运行时包是特定于版本的,因此如果需要继续使用BCB5和XE5中的代码,则需要编译单独的BPL。
重新编写DLL,使其无法通过DLL边界传递TDataSource
。找出另一种在EXE和DLL之间交换数据的互操作方式。