3

32ビットアドレスにアクセスしようとしていますが、IntPtrを作成すると、OverflowExceptionがスローされます。コードは次のとおりです。

uint memAddr = 0xF5920824;
IntPtr bufPtr = new IntPtr(memAddr);
byte[] data = new byte[4];
Marshal.Copy(bufPtr, data, 0, 4);

そのアドレスにアクセスするにはどうすればよいですか?

4

3 に答える 3

3

このような大きな数 > 2^31-1 の場合は、64 ビットとしてコンパイルする必要があります。

Configuration Manager... に移動し、プラットフォームを x86 から Any CPU または x64 に変更します。

于 2012-06-27T15:11:59.720 に答える
2

プログラムは別のプログラムのメモリ アドレスにアクセスできません(読み取るアドレスが に適合しない場合でもこの投稿Int32を参照して、それが何であるかを理解してください) を使用するだけです。IntPtr

最初のプログラム (共有メモリなど) で何らかの形で共有する必要があります。さらに、あるプログラムのアドレス XYZは、同じプログラムの別のインスタンスでもまったく異なるものになる場合があります (アドレスが VIRTUAL であるため)。

メモリ アドレスが確かな場合 (どうやって? プロセス メモリをスキャンする必要さえあるかもしれません)、 P/Invoke を実行する必要があります。これはReadProcessMemory()、デバッグ目的で設計された関数であり、実行可能ファイルに十分な権限があれば、別のメモリを読み取ることができます。処理する。例については、 SO に関するこの投稿
を参照してください。

于 2012-06-27T15:19:53.493 に答える
2

By passing a uint to IntPtr, you are converting it to a long, as IntPtr doesn't support unsigned integers. Then, if you are running in a 32-bit process, your uint overflows an int.

You need to use 64-bit to read that address.

于 2012-06-27T15:12:13.617 に答える