ページ 1 / 1
ReadProcessMemoryが使えません
Posted: 2005年9月18日(日) 10:41
by hoge
他のアプリケーションのメモリを読みたいと試行錯誤しています。
プロセスIDを入手するまでは出来たのですが、ReadProcessMemoryが失敗します。
コード: 全て選択
Declare Function ReadProcessMemory Lib "Kernel32" _
(hProcess As HANDLE, _
lpBaseAddress As VoidPtr, _
lpBuffer As VoidPtr, _
nSize As DWord, _
lpNumberOfBytesRead As DWordPtr) As Long
Dim buf[128] As Byte
ReadProcessMemory(hProcess, &H1234ABCD As VoidPtr, buf, 80, NULL)
こんな感じでやってみてます。
OpenProcessまでは成功しているようなんですが、なにが悪いんでしょうか。
Re: ReadProcessMemoryが使えません
Posted: 2005年9月23日(金) 00:29
by Tomorrow
詳しいことはよく知らないですが...
MSDNの関数リファレンスによると、hProcessで指定するプロセスのハンドルにはPROCESS_VM_READアクセス権が必要だそうです。
OpenProcessの時点で、このアクセス権を指定していないのではないでしょうか?
あるいは、
MSDN さんが書きました:要求された読み取り処理の途中で、プロセスのアクセス不能領域が見つかると、関数は失敗します。
とあるので、そのプロセスのメモリ領域にはアクセス不能なのかも知れません。
Posted: 2005年9月25日(日) 14:59
by ゲスト
返信ありがとうございます。
PROCESS_VM_READは指定してます。
同様のことがBorland C++BuilderXでは可能なので、どうしてABでできないのかよくわかりません。
ABでできればGUIを作るのが非常に楽なのに・・・。
Posted: 2005年9月25日(日) 21:30
by イグトランス
とりあえずMSDNによるとReadProcessMemoryは失敗すると(つまりFALSEを返すと)GetLastErrorが使えるとあります。
これは確かめてみましたか?
Posted: 2005年9月26日(月) 00:38
by Tomorrow
> とりあえずMSDNによるとReadProcessMemoryは失敗すると(つまりFALSEを返すと)GetLastErrorが使えるとあります。
拡張エラー情報の表示はコレで↓
コード: 全て選択
ErrorMessageBox(0, GetLastError(), "拡張エラー情報", MB_OK Or MB_ICONEXCLAMATION)
Function ErrorMessageBox(hWnd As DWord, ErrCode As Long, lpCaption As BytePtr, uType As DWord) As Long
Dim lpMsgBuf As BytePtr
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ErrCode, LANG_USER_DEFAULT, VarPtr(lpMsgBuf), 0, NULL)
ErrorMessageBox=MessageBox(hWnd, lpMsgBuf, lpCaption, uType)
LocalFree(lpMsgBuf)
End Function
Posted: 2005年9月27日(火) 12:05
by read
AB4.10 + XP(SP2)で動作しました。
デバッグで実行するとエラーになりますが、リリースだと動作します。
その後は、デバッグでも動くようになりました。
デバッグで駄目なことが、たまにあるので試してください。