指定した実行中プロセスの指定したメモリアドレスの値を読み取るにはどうしたらよいのでしょうか。
例えば(あくまで例えば)グーグルアースの実行中、現在センターに来ている座標をVBで取得したい場合などです。その座標が格納されているメモリアドレスはわかっているのですが、VBからそこへの手の出し方が判らないのです。
できれば一定時間ごとにその値を取得して表示したいと思っているのですが、VBからプロセスを指定したりそのメモリの値を見るなんて方法がさっぱり判らなくて困っています。
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回取得するだけで良いです。
この回答への補足
回答ありがとうございます。なかなか解答がつかなくて本当に困っているところでした。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel VBAについてです。 少しだけ知識はあるのですが、 うまくいかなかったので 質問させてい 3 2022/09/13 18:40
- 日本株 楽天証券で逆指値注文をし、市場価格が指値の値段にいったのですが約定されず、取り消ししようとしてもこの 1 2022/05/18 09:15
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 12:30
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- 不安障害・適応障害・パニック障害 認知療法について 1 2022/09/14 20:20
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(プログラミング・Web制作) pythonでのカーソル移動がずれる 2 2023/07/30 08:51
- その他(アウトドア) 野鳥の珍しさランキング 5 2023/05/06 10:50
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 11:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
explorer.exeが異様にメモリを食う
-
他のEXEが起動しているかの確認
-
SendMessageが失敗するときがある
-
ADOでアクセスのレコードに...
-
バックグラウンドのプロセスの...
-
共有メモリを使う場合のCPU負荷...
-
警告『 別のプロセスで使用され...
-
VBでエクセルを起動し、プロ...
-
C#でのbatファイル実行結果取得
-
C++でシェルを起動
-
Linuxのchdir(カレントディレク...
-
パソコンに出てくるじゃまな表...
-
forkについて
-
OSPFでプロセスを分ける意義に...
-
CreateProcessでアプリが終了し...
-
起動中の他のプログラム(orプ...
-
タスクマネージャーのプロセス...
-
シートのコピーでプロセスが残...
-
非表示になったエクセルは?
-
子プロセスのデバッグ方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
なぜ女性は男性が忘れたことを...
-
タスクマネージャーのプロセス...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
Process.Startの戻り値を後で取得
-
C#でのbatファイル実行結果取得
-
プロセスIDからウィンドウハ...
-
c言語でプロセスIDを調べたい
-
Linuxでのスレッド間メッセージ...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
怪しいプロセス教えてください。
-
vb.netでEXCEL起動がうまくでき...
-
別のプロセスの関数を呼び出す...
-
C++のプログラムをバックグラウ...
-
Visual C++からpingを実行して...
-
VBS(WSH)で開いたIEのウィンド...
-
IISがフリーズ
おすすめ情報