C++ C++;XE 5应用程序和C++;Builder5 dll兼容性
我有BCB5 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 =
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版本。不,它们不兼容,因为它们具有不同的内存布局和依赖性
因此,您的选择是:
TDataSource
通常不安全的风险,除非启用运行时包TDataSource
是安全的。但是,运行时包是特定于版本的,因此如果需要继续在BCB5和XE5中使用代码,则需要编译单独的BPLTDataSource
。找出另一种互操作安全的方式在EXE和DLL之间交换数据