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

解決


よらん  2006-10-12 08:20:30  No: 23567

[開発環境]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 18:19:33  No: 23568

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


よらん  2006-10-12 19:33:40  No: 23569

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

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

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

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


通りすがり  2006-10-12 22:33:25  No: 23570

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


よらん  2006-10-12 22:43:51  No: 23571

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加