2

この関数を使用して、ReadProcessMemory実行中の外部アプリのコンテンツを読み取ります。PChar(UNICODE)を指すメモリアドレスがあります。その値を文字列変数に戻す適切な方法はどれですか?

今、私はこのコードを使用していますが、機能していません

var
c : char;

repeat
  if not ReadProcessMemory(ph, Address, @c, sizeof(c), BytesRead) then
    raise exception.create(syserrormessage(getlasterror));
  result:=result+c;
  Address:=pointer(integer(address)+sizeof(c));
until (c=#0#0) or (BytesRead<>sizeof(c));

このエラーが発生します

ReadProcessMemoryまたはWriteProcessMemoryリクエストの一部のみが完了しました

4

1 に答える 1

4

文字列を超えて読み取っています。バイトではなく文字を読み取っているので、ヌルターミネータを文字と比較してください。つまり、次のようになります。

until (c=#0) or (BytesRead<>sizeof(c));

#0はすでに2バイト、は4バイトです(どのChar#0#0とも等しくすることはできません)。

文字列を超えて「アクセスできないプロセスの領域に」ドキュメントによると)読み取ると、エラーが返されます。

于 2012-05-26T00:54:36.637 に答える