Delphi 2010 App加载Delphi 7 DLL

Raf*_*cci 1 delphi dll delphi-2010

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

D2010 app LOADS D7 DLL LOADS D2010 DLL
Run Code Online (Sandbox Code Playgroud)

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

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

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

它为什么有效?

什么可能出错?

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

Rem*_*eau 7

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

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

这是String跨越DLL边界传递类型的又一个论点.只是不要这样做,永远.使用WideStringPAnsiChar/ PWideChar代替.