我的应用程序是使用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)
答案 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
类型的论据。只是不要这样做,永远。请改用WideString
或PAnsiChar
/ PWideChar
。