3

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-64bit では、上記は正常に動作します。ただし、Win8-64bit では、同じ DLL ファイルが CopyMemory で Access Violation をスローします。CopyMemory は WinAPI.windows ユニットに実装されています。

こんな感じです。

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

何か案は?ありがとう。

4

2 に答える 2

7

この時点で:

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

64 ビット ポインターを 32 ビットに切り捨てます。したがって、アクセス違反です。代わりに必要です

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

あなたのコードは Win7 でも同じように壊れていますが、どういうわけか不運で、アドレスが 4GB 未満のポインタでしかこのコードを実行できませんでした。

トップダウンのメモリ割り当てテストを実行して、他のそのようなエラーを洗い流す必要があります。

于 2013-04-10T15:52:35.557 に答える