ReadProcessMemoryで「メモリ ロケーションへのアクセスが無効です。」とエラー

解決


よらん  2006-10-11 23:20:30  No: 23567  IP: 192.*.*.*

[開発環境]Delphi7 Professional
[  O  S  ]WindowsXP Pro
いつもお世話になっております。
早速件名についてご教授願いたいのですが
下記のコーディングを行い他のプログラムのメモリを読みとろうとすると
ReadProcessMemoryを行うと0が返ってきました。
エラー内容をみると
「メモリ ロケーションへのアクセスが無効です。」となります。

で調べたのですが、このボタンを押す度にプロセスのハンドル(t_hPrs)が変動
します。おそらくはこのせいだと思うのですが。
またC++で同様の内容をコーディングすると正常に取得でき
プロセスのハンドル値も一定です。


procedure TForm1.Button1Click(Sender: TObject);
var
  t_hWnd : HWND;
  t_uPid : Cardinal;
  t_hPrs : Cardinal;
  mBase  : Cardinal;
  dwRMem : Cardinal;
  t_Text : Pointer;
begin
  t_Text := nil;
  mBase := $04394551;

  t_hWnd := FindWindow(nil,'TEST');
  GetWindowThreadProcessId(t_hWnd,t_uPid);
  t_hPrs := OpenProcess(PROCESS_ALL_ACCESS, FALSE, t_uPid);
  ReadProcessMemory(t_hPrs,pointer(mBase),t_Text,1,dwRMem);
end;

編集 削除
は?  2006-10-12 09:19:33  No: 23568  IP: 192.*.*.*

> ReadProcessMemoryを行うと0が返ってきました。
t_Text = nil だからじゃねぇ?
記述していない部分で、メモリの確保かなんかしてるのけ?

編集 削除
よらん  2006-10-12 10:33:40  No: 23569  IP: 192.*.*.*

>t_Text = nil だからじゃねぇ?
>記述していない部分で、メモリの確保かなんかしてるのけ?

t_Text = nil をコメントアウトすると  初期化されないので
ゴミデータが保持されたまま値が変わらずそのまま終了となります。

ReadProcessMemory(t_hPrs,pointer(mBase),t_Text,1,dwRMem);
Edit1.Text := InttoStr(GetLastError());

とすると、 998が返ってくるので調べると件名のエラーがでることまでは
わかりました。

編集 削除
通りすがり  2006-10-12 13:33:25  No: 23570  IP: 192.*.*.*

t_Text = nil; のところを
GetMem(t_Text, 1);  でメモリを確保すればいいのでは?

編集 削除
よらん  2006-10-12 13:43:51  No: 23571  IP: 192.*.*.*

通りすがり様
そのとおりでございました。

GetMem(t_Text, 1);とすることで正常に取得できました。

は?様
おっしゃるとおりでございました。
まことに申し訳ありませんでした。

編集 削除