PB 電子会議室

コメント

発言No. 更新日 題名(クリックすると発言内容と関連するコメントが表示されます)
22261 05/10/17 18:58:40 RE(2):他のプロセスのメモリを読み取る方法 By 00102
22256 05/10/15 00:47:07 他のプロセスのメモリを読み取る方法 By Taka
22247 05/10/11 18:34:16 PB8.0: Send関数のパラメータニついて教えて頂けますでしょうか。 By 00102

カテゴリ:スクリプトの記述
日付:2005年10月15日 00:47 発信者:Taka
題名:他のプロセスのメモリを読み取る方法

00102さん、こんばんは。

通常、プロセスの中で割り当てた変数のアドレスは、そのプロセス固有の仮想メモリ空間における
相対アドレスとして扱われます。したがって、他のプロセスにそのアドレスを渡しても、実際には
まったく別のメモリ空間を参照するため、意図した結果にはなりません。

プロセス間でメモリを共有(または文字列を送信)するには様々な方法が考えられますが、
今回のように FindWindowで見つけたウィンドウに文字列を送信したいだけであれば、以下の
小技を紹介します。

--------------------------------------------------------------------------------
【ReadProcessMemory で他のプロセスのメモリを読み取る】

■送信側
・FindWindow でターゲットウィンドウを特定する
・SendMessageで、WPARAM にプロセスID,LPARAMに文字列アドレスを指定

プロセスIDは以下のAPIで取得します。
function long GetCurrentProcessId() library \"kernel32.dll\"
この戻り値を WPARAM に代入して送信します。

■受信側
・WPARAM(プロセスID)を元に、権限つきでプロセスハンドルを取得する
・ReadProcessMemory で、送信元プロセスのメモリアドレスから値を読み出す
・プロセスハンドルを閉じる

function long OpenProcess(long acs,long ib,long id) library \"kernel32.dll\"
function long ReadProcessMemory(long h,long a,ref string buf,long s,long r) library \"kernel32.dll\"
function long CloseHandle(long h) library \"kernel32.dll\"

long hProc
hProc = OpenProcess( 16, 0, WPARAM ) //16:PROCESS_VM_READ

string buf
buf = Space(100)
ReadProcessMemory( hProc, LPARAM, buf, 100, 0 )

buf = Trim(buf)
MessageBox(\"受信データ\",buf)

CloseHandle(hProc)
--------------------------------------------------------------------------------

ここで挙げた方法は、あくまでも一例です。
他にもメモリマップドファイルやパイプ,アトムなどを駆使する方法もあります。
なるべくAPIを使いたくないのであれば、DDEサーバ/クライアント型のアプリとして構築する
方法もあります。(PBの標準関数とイベントだけで実装可能)

付加情報:

PowerBuilder Version (記載なし)

Client SoftWare

OS Windows XP
DBMS Oracle Net8
Browser (記載なし)

Server SoftWare

OS (記載なし)
DBMS Oracle10G
WebServer (記載なし)

PowerSpaceの運営は、パワーフューチャー株式会社が行っております。
Copyright © 2013 Power Future Co., Ltd.