首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi 2010应用程序加载Delphi 7 DLL

Delphi 2010应用程序加载Delphi 7 DLL
EN

Stack Overflow用户
提问于 2011-12-06 21:20:32
回答 1查看 601关注 0票数 1

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

代码语言:javascript
复制
D2010 app LOADS D7 DLL LOADS D2010 DLL

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

众所周知,Delphi2010中的strings是Unicode (2字节),而Delphi7中是Ansi (1字节)。

我的所有测试表明,尽管它不应该工作,但它仍在工作。我想知道:

为什么它起作用了?

会出什么问题呢?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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类型的另一个理由。千万别做,永远不要。请改用WideStringPAnsiChar/PWideChar

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8400571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档