指定した実行中プロセスの指定したメモリアドレスの値を読み取るにはどうしたらよいのでしょうか。
例えば(あくまで例えば)グーグルアースの実行中、現在センターに来ている座標を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ランキング
-
バックグラウンドのプロセスの...
-
Visual C++からpingを実行して...
-
explorer.exeが異様にメモリを食う
-
VB6.0 SHELLで起動...
-
ウインドウのプロセス終了について
-
C#でのbatファイル実行結果取得
-
プロセスIDの取得方法について
-
非表示になったエクセルは?
-
完全な乱数を生成する方法
-
起動しているプロセスの確認
-
子プロセスの管理
-
forkについて
-
Process.Startの戻り値を後で取得
-
execvpでのcdコマンドについて。
-
Windows7アプリケーションのプ...
-
タスクマネージャーのプロセス...
-
プロセスIDからウィンドウハ...
-
タスクマネージャの「プロセス...
-
API関数 GetExitCodeProcess
-
セマフォとmutexの違いは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
C#でのbatファイル実行結果取得
-
プロセスのアタッチ・デタッチ...
-
VB6.0 SHELLで起動...
-
プロセスIDからウィンドウハ...
-
Process.Startの戻り値を後で取得
-
ウィンドウのタイトルからプロ...
-
他のEXEが起動しているかの確認
-
ADOでアクセスのレコードに...
-
怪しいプロセス教えてください。
-
別のプロセスの関数を呼び出す...
-
Linuxでのスレッド間メッセージ...
-
C++のプログラムをバックグラウ...
-
C++でシェルを起動
-
プロセスIDの取得方法について
-
OSPFでプロセスを分ける意義に...
-
非表示になったエクセルは?
-
Windowsでのfork方法
おすすめ情報