Delphi 2010 App加载Delphi 7 DLL

时间:2011-12-06 13:20:32

标签: delphi dll delphi-2010

我的应用程序是使用Delphi 2010编译的。该应用程序加载了Delphi 7编译的DLL,它加载了Delphi 2010编译的DLL。

D2010 app LOADS D7 DLL LOADS D2010 DLL

D7 DLL的导出函数使用Widestrings,Delphi 2010 DLL的导出函数使用strings

众所周知,Delphi 2010中的strings是Unicode(2个字节),而在Delphi 7中,它们是Ansi(1个字节)。

我的所有测试都告诉我它尽管不应该这样做但它仍在工作。我在想:

为什么有效?

可能出现什么问题?

我应该使用哪个内存管理器(Delphi 2010或Delphi 7内存管理器DLL)

1 个答案:

答案 0 :(得分:7)

在D2009和D2010中,RTL具有逻辑(编译器的{$STRINGCHECKS ON}指令),允许AnsiString接收Unicode有效负载,UnicodeString接收Ansi有效负载,跨模块边界,然后在访问AnsiString / UnicodeString数据时执行静默内联数据转换为正确的字符串类型。这主要是为了支持使用C ++端的AnsiString参数和Delphi端的UnicodeString变量的事件处理程序的旧C ++项目。在这种情况下,它还可以允许D7 DLL将Ansi数据传递给D2010 DLL(但是在XE中删除了STRINGCHECKS指令)。

我希望D2010 DLL失败,因为StrRec记录的内存布局(在内存中的字符数据之前)在D2009中更改为添加对代码页的支持,因此D7 DLL不会在将StrRec值传递给D2010 DLL中的AnsiString参数时,请分配与D2010兼容的UnicodeString。我希望D2010 DLL在尝试访问/释放不存在的内存时崩溃。

这是另一个反对在DLL边界上传递String类型的论据。只是不要这样做,永远。请改用WideStringPAnsiChar / PWideChar