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)
在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中参数的AnsiString值UnicodeString.我期望D2010 DLL在尝试访问/释放不存在的内存时崩溃.
这是String跨越DLL边界传递类型的又一个论点.只是不要这样做,永远.使用WideString或PAnsiChar/ PWideChar代替.
| 归档时间: |
|
| 查看次数: |
577 次 |
| 最近记录: |