delphi - CopyMemory 导致 Win8 上的访问冲突

标签 delphi 64-bit

我有一段代码,使用 Delphi XE3 编译成 64 位 COM DLL。

function TRPMFileReadStream.Read(var Buffer; const Count: Longint): Longint;
begin
  if ((Self.FPosition >= 0) and (Count > 0)) then
  begin
    Result := Self.FSize - Self.FPosition;
    if ((Result > 0) and (Result >= Count)) then
    begin
      if (Result > Count) then
      begin
        Result := Count;
      end;
      CopyMemory(
        Pointer(@Buffer),
        Pointer(LongWord(Self.FMemory) + Self.FPosition),
        Result
      );
      Inc(Self.FPosition, Result);
      Exit;
    end;
  end;
  Result := 0;
end;

在Win7-64位上,以上工作正常。 但在Win8-64位上,相同的DLL文件将在CopyMemory上抛出访问冲突。 CopyMemory是在WinAPI.windows单元中实现的。

是这样的。

procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: NativeUInt);
begin
  Move(Source^, Destination^, Length);
end;

有什么想法吗?谢谢。

最佳答案

此时:

Pointer(LongWord(Self.FMemory) + Self.FPosition)

您将 64 位指针截断为 32 位。因此出现了访问冲突。相反,你需要

Pointer(NativeUInt(Self.FMemory) + Self.FPosition)

您的代码在 Win7 上同样损坏,但不知何故,您很不幸,仅使用地址 < 4GB 的指针运行此代码。

您应该运行一些自上而下的内存分配测试来清除任何其他此类错误。

关于delphi - CopyMemory 导致 Win8 上的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15930608/

相关文章:

delphi - 如何使用 Windows CopyMemory 函数复制 TBitmap 内存

mysql - SQL 和 Delphi : recursive mechanism for creating a tree from a table

c++ - Windows 64 位上的 fftw3

64-bit - 64 位 OpenSuse 发行版上的 Lib 目录

delphi - Delphi Firemonkey中的鼠标事件动画

delphi - 如何在Delphi中强制分层源代码结构

c++ - 旧的 32 位 linux 程序如何最终调用 64 位库?

assembly - 在 x64 asm 中,如何使用相对于 RIP 的跳转恰好跳过 1 条指令?

c++ - 是否可以安全地假设 64 位指针中的 16 位高位(2 位对我来说足够)未设置?

mysql - 通过 FireDac 和 MySql 的主/详细数据快照 ¿为什么在一个客户端中写入详细记录的数据在第二个客户端中看不到?