【问题标题】:Strange string behaviour with dll calldll调用的奇怪字符串行为
【发布时间】:2010-09-22 09:19:36
【问题描述】:

我有一个 Delphi 2007 程序,它调用一个 Delphi 2010 DLL。该程序很大,还没有移植到 2010 年,所以我现在无法更改。

我使用 SimpleShareMem Unit 传递字符串,但也尝试使用 borlndmm.dll 进行 ShareMem。

对于一个函数,我现在将一个字符串从 Delphi 2007 程序传递给 dll(因此是 AnsiString)。调试dll时,这个AnsiString看起来很正常,可以在监视列表中查看。但如果我做一个简单的思考,就像

AnAnsiString := PassedAnsiString;

变量 AnAnsistring 获取值 '???????'#0#0#0'???A',但 PassedAnsiString 在监视列表中仍然可读。还有一个字符串追加像

AnAnsiString := PassedAnsiString + NotPassedAnsiString;

使用'???????'#0#0#0'???A' 作为值。

问题出在哪里?它是 2007 2010 年的问题吗?如何解决? 感谢您的帮助。

【问题讨论】:

    标签: delphi string dll


    【解决方案1】:

    这可能是因为在 D2009 中添加到 ansistring 的编码字段。 IOW 在 ansistring 指针负偏移处的记录 (TAnsiRec) 是不同的,并且在 unicode 和非 unicode Delphi 之间移动(在 unicode 版本中 ansistring 也发生了变化!)

    除了退回到 p(ansi)char 级别之外,我认为没有合适的解决方案

    【讨论】:

    • 确实; DLL 边界只对非 Delphi 特定的类型是安全的。跨 DLL 边界共享 Delphi 特定类型仅当这些类型的底层二进制表示在边界的任一侧都相同时才有效。从 Delphi 2009 开始,AnsiString 的二进制表示发生了变化,因此它不再与以前的 Delphi 版本二进制兼容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2023-03-20
    • 1970-01-01
    • 2020-06-18
    • 2015-05-29
    • 2023-03-26
    相关资源
    最近更新 更多