• 締切済み

指定した実行中プロセスの、指定したメモリアドレスの値を読み取るにはどうしたらよいのでしょうか?

 指定した実行中プロセスの指定したメモリアドレスの値を読み取るにはどうしたらよいのでしょうか。  例えば(あくまで例えば)グーグルアースの実行中、現在センターに来ている座標をVBで取得したい場合などです。その座標が格納されているメモリアドレスはわかっているのですが、VBからそこへの手の出し方が判らないのです。 できれば一定時間ごとにその値を取得して表示したいと思っているのですが、VBからプロセスを指定したりそのメモリの値を見るなんて方法がさっぱり判らなくて困っています。

みんなの回答

noname#118114
noname#118114
回答No.1

サンプルを紹介したいところですが字数制限を越えてしまうのでAPIのみ紹介しておきます。 プロセスを列挙するAPI Public Declare Function EnumProcesses Lib "PSAPI.DLL" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long プロセスを開くAPI Public Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long プロセスを閉じるAPI Public Declare Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Long) As Long メモリを読込むAPI Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByVal lpBuffer As Object, ByVal nSize As Integer, ByVal lpNumberOfBytesRead As Integer) As Integer これらを元に探せば必ず見つかりますので、後は自分にとって一番わかりやすいのを探して下さい。 一定時間毎に取得したい場合はタイマを使って取得します。 プロセスは一度画面を閉じない限り変らないので、1回取得するだけで良いです。

nishihi
質問者

補足

回答ありがとうございます。なかなか解答がつかなくて本当に困っているところでした。 Dim ps As System.Diagnostics.Process()=System.Diagnostics.Process.GetProcessesByName("プロセス名") という文、そこから Dim p As System.Diagnostics.Process For Each p In ps によって、目的のプロセスのハンドルを掴むことには成功したようです。 p.Handleの中身を見てみたところ、毎回違う、数桁の数字が入っていました。コレが私の狙っているプロセスの、その時のハンドルだと思います。 lpBaseAddress については、メモリエディタで探したメモリアドレス位置、[AB8B18]を数字に変換した値、[11242264]を直接入れました。nSize は、私が欲しい値はAB8B18から数えて4バイト分なので、[4]を直接入力しました。 問題はここからでした。lpBaseAddress とlpNumberOfBytesRead に何を入れたら良いのか判らないんです。 その二つの引数がポインタだということは判りました。ポインタというのはAB8B18のようなモノのことですよね? その値を取得し、設定するために、VarPtr()を使おうとしたら、私のVB.NETではVB6と違い、この関数がもう使えないことがわかりました。 ここでいったん大きく詰まってしまいました。 今の私のソースは、 Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Object, ByVal lpBaseAddress As Integer, ByVal lpBuffer As Object, ByVal nSize As Integer, ByVal lpNumberOfBytesRead As Integer) As Integer ReadProcessMemory(p.Handle, 11242264, VarPtr(memContent), 4, VarPtr(intLength)) こういう状態です。VarPtrが下線がついて、エラーを示しています。 このアプローチで正しいのでしょうか? 何とか他の打開策を模索しているところで System.Runtime.InteropServices.Marshal.StructureToPtrメソッド というものが今日見つかりました。 ただこれはまだ私にはまったく判らないモノでして一体これをどう使えば目的の値を取得できるのか、までは調べが至っていない状態です。

関連するQ&A