【问题标题】:Memory error in Assembly code with newer version of Delphi较新版本的 Delphi 汇编代码中的内存错误
【发布时间】:2022-08-11 08:42:15
【问题描述】:

谁能告诉我为什么这段代码在 Delphi 7 中有效,但在 10.4 版中却出现内存错误?

procedure ChatPrintf(ChatPrintMSG: PChar);
var
  ChatPrint: Cardinal;

  procedure ChatPrintASM(ChatPrintMSG: PChar); assembler;
  asm
    lea edx, [ChatPrintMSG]
    push edx
    call [ChatPrint]
    pop edx
  end;
begin
  ChatPrint := $009E0C30;
  ChatPrintASM(ChatPrintMSG);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  ChatPrintf(\'it: works\');
end;
  • Stack Overflow 是一个英文网站。
  • 总之:在 Delphi 2009 中,字符串从 Ansi(每个字符 1 个字节)变为 Unicode(每个字符 2 个字节)。这可能是问题所在。
  • 你为什么要编写asm代码?
  • @DavidHeffernan 他没有 - 再次它是没有链接来源的副本:thisthat。该地址很可能不存在任何内容(和/或OP正在以64位编译,如果它是Delphi XE2)。
  • 在这段代码中根本没有充分的理由使用汇编。可以使用纯 Pascal 重写,例如:procedure ChatPrintf(ChatPrintMSG: PAnsiChar); type ChatPrintProc = procedure(Msg: PAnsiChar); cdecl; var ChatPrint: ChatPrintProc; begin ChatPrint := ChatPrintProc($009E0C30); ChatPrint(ChatPrintMSG); end;

标签: delphi pascal delphi-10.4.2


【解决方案1】:

正如 Andreas 所提到的,默认字符串类型已更改。最简单的修复方法是更换pchar番石榴

新的定义是

procedure ChatPrintASM(ChatPrintMSG: PAnsiChar);

【讨论】:

  • 我进行了更改,但我有同样的错误“访问冲突地址”
  • 我刚刚尝试过,该代码对我有用。你有没有想过,也许绝对地址你分配给你的外部程序是不正确的?
  • 我在 delphi 7 上使用相同的代码并且可以工作,但 10.4 出现错误
  • 您认为绝对地址在不同版本的编译器中是相同的,有什么特别的原因吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多