我的应用程序是用Delphi2010编译的。该应用程序加载Delphi 7编译的DLL,该DLL加载Delphi 2010编译的DLL。
D2010 app LOADS D7 DLL LOADS D2010 DLLDelphi的导出函数使用Widestrings,D7 2010DLL的导出函数使用strings。
众所周知,Delphi2010中的strings是Unicode (2字节),而Delphi7中是Ansi (1字节)。
我的所有测试表明,尽管它不应该工作,但它仍在工作。我想知道:
为什么它起作用了?
会出什么问题呢?
我应该使用哪个内存管理器(Delphi 2010或Delphi 7内存管理器DLL)
发布于 2011-12-07 03:58:07
在D2009和D2010中,RTL具有适当的逻辑(编译器的{$STRINGCHECKS ON}指令),允许AnsiString跨模块边界接收Unicode有效载荷和UnicodeString,然后在访问AnsiString/UnicodeString数据时执行静默内联数据转换为正确的字符串类型。这主要是为了支持遗留的C++项目,这些项目使用事件处理程序,在Delphi端使用AnsiString参数,在C++端使用UnicodeString变量。在这种情况下,它还可以允许D7 DLL将Ansi数据传递给D2010 DLL (不过在XE中删除了STRINGCHECKS指令)。
但是,我预计D2010 DLL会失败,因为StrRec记录(在内存中的字符数据之前)的内存布局在D2009中进行了更改,以添加对代码页的支持,因此在将AnsiString值传递给D7 DLL中的StrRec参数时,D7 DLL不会分配与D2010兼容的AnsiString。我预计当D2010 DLL试图访问/释放不存在的内存时,它会崩溃。
这是反对跨越DLL边界传递String类型的另一个理由。千万别做,永远不要。请改用WideString或PAnsiChar/PWideChar。
https://stackoverflow.com/questions/8400571
复制相似问题