首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CopyMemory导致Win8上的访问冲突

CopyMemory导致Win8上的访问冲突
EN

Stack Overflow用户
提问于 2013-04-10 23:50:40
回答 2查看 1.1K关注 0票数 3

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

代码语言:javascript
复制
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上抛出访问冲突。在WinAPI.windows单元中实现了CopyMemory。

是这样的。

代码语言:javascript
复制
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: NativeUInt);
begin
  Move(Source^, Destination^, Length);
end;

有什么想法吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-10 23:52:36

此时:

代码语言:javascript
复制
Pointer(LongWord(Self.FMemory) + Self.FPosition)

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

代码语言:javascript
复制
Pointer(NativeUInt(Self.FMemory) + Self.FPosition)

你的代码在Win7上同样崩溃了,但不知何故你很不幸,只用地址小于4 4GB的指针运行过这段代码。

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

票数 7
EN

Stack Overflow用户

发布于 2013-04-11 03:39:41

David指出了你问题的根源--你的指针类型转换对于64位来说是错误的。更好的解决方案是使用指针算法,让编译器为您处理指针大小:

代码语言:javascript
复制
CopyMemory(
  @Buffer,
  PByte(Self.FMemory) + Self.FPosition,
  Result
);

或者:

代码语言:javascript
复制
Move(
  (PByte(Self.FMemory) + Self.FPosition)^,
  Buffer,
  Result
);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15930608

复制
相关文章

相似问题

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