
指定した実行中プロセスの指定したメモリアドレスの値を読み取るにはどうしたらよいのでしょうか。
例えば(あくまで例えば)グーグルアースの実行中、現在センターに来ている座標を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ランキング
-
プロセスのアタッチ・デタッチ...
-
バックグラウンドのプロセスの...
-
Process.Startの戻り値を後で取得
-
vb.netでEXCEL起動がうまくでき...
-
指定した実行中プロセスの、指...
-
親子プロセス間でのデータの受...
-
C#でのbatファイル実行結果取得
-
SQLServerサービスマネージャの...
-
他のコンピュータのプロセスを取得
-
ADOでアクセスのレコードに...
-
ロードアベレージが高いのです...
-
別プロセスをの実行パスを取得...
-
子プロセスのデバッグ方法について
-
exeファイルを終了させない。
-
GPLによるソース公開の回避方法
-
プロセスIDに対応したファイル...
-
Linuxでのスレッド間メッセージ...
-
DLLにおいて、最後のプロセスデ...
-
explorer.exeが異様にメモリを食う
-
C++のプログラムをバックグラウ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
VB6.0 SHELLで起動...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
怪しいプロセス教えてください。
-
sleep関数の精度について
-
【C#】別プロセスがロックか...
-
Process.Startの戻り値を後で取得
-
IISがフリーズ
-
プロセスIDからウィンドウハ...
-
Linuxでのスレッド間メッセージ...
-
Windowsでのfork方法
-
SendMessageが失敗するときがある
-
警告『 別のプロセスで使用され...
-
WSH.Runで待機できません
-
VB.NETで起動したExcelの閉じ方...
おすすめ情報