ページ 11

起動中の他のアプリのパスを取得したい

Posted: 2006年1月19日(木) 16:34
by キルケゴール
件名そのままなのですが、
例えば、メモ帳が起動中なら"C:\WINDOWS\system32\notepad.exe"という風にパスを得たいのです。

ウィンドウ名は分かってるので、FindWindowと、GetModuleFileNameを使えば、
簡単に取得できる(以下参照)と思っていたのですが、上手くいかず、
検索しても良い情報を見つけられませんでした。

コード: 全て選択

hWnd As DWord
Dim buffer[MAX_PATH] As Byte

hWnd=FindWindow(NULL,"ウインドウ名")
GetModuleFileName(hWnd, buffer, MAX_PATH)
どなたか、この事に関して教えて下さると助かります。
お願いします。

Re: 起動中の他のアプリのパスを取得したい

Posted: 2006年1月19日(木) 18:04
by 7
> GetModuleFileNameを使えば、
> 簡単に取得できる(以下参照)と思っていたのですが、上手くいかず、
どうやらGetModuleFileName()関数では自分自身のパスしか取得できず、GetModuleFileNameEx()関数を使うようです。

C言語ですが、現在起動している全てのプロセス中の全てのモジュールのファイル名を表示するサンプルが検索して引っかかりました。
http://nienie.com/~masapico/api_GetModu ... ameEx.html

Posted: 2006年1月20日(金) 22:16
by イグトランス
GetModuleFileName()の第一引数はモジュールハンドルです。(インスタンスハンドルも可)
そこへウィンドウハンドルを指定しているためうまくいかないのです。

ウィンドウハンドルからはGetWindowModuleFileName関数が使えます。
第一引数にウィンドウハンドルを指定すること以外は
GetModuleFileName()と同じように使えます。

コード: 全て選択

Declare Function GetWindowModuleFileName Lib "user32" Alias "GetWindowModuleFileNameA" (
    hwnd As HWND,
    pszFileName As *Char,
    cchFileNameMax As DWord) As DWord

Posted: 2006年1月21日(土) 19:32
by hira
私もちょっと調べてみたのですが
http://www.yoshibaworks.com/ayacy/inaso ... 00506.html
GetWindowModuleFileName() という大変便利そうなAPIがあるので、この問題の解決は楽観視していたんですが、とんでもない。インターネットの検索エンジンでちょっと調べてみるとわかりますが、この関数は平気でウソを返します。
↑もしそうだったら何のためのAPIだよ(^^;;

Posted: 2006年1月21日(土) 21:35
by イグトランス
ありました。
http://support.microsoft.com/?scid=kb;ja;228469
NT系のWindowsではGetWindowModuleFileNameもGetModuleFileNameもだめだと書いてあります。

さてGetModuleFileNameExは何が違うのかと調べてみたらプロセスハンドルを指定しているのですね。
ちなみにウィンドウハンドルからはGetWindowThreadProcessIdでプロセスIDが手に入ります。
後は7さんが示したページに書いてある方法が応用できるでしょう。

しかしプロセスハンドルからモジュールハンドルを列挙していますが,
そのうちどれがnotepad.exe本体のものかわからないという問題にならないでしょうか?

Posted: 2006年1月21日(土) 23:41
by ゲスト

Re: 起動中の他のアプリのパスを取得したい

Posted: 2006年1月22日(日) 18:48
by キルケゴール
皆様、レスありがとうございます。

皆様が教えてくれた事や、サイトは勿論、
自分でも色々調べて以下のサイトを見、
大体こんな流れだろうというのまでは分かりました。
http://www.hey-to.net/ML-archive/vcppML ... 00830.html

1) GetWindowThreadProcessId() で HWND から ProcessID を得る
2) OpenProcess() で ProcessID から hProcess を得る
3) EnumProcessModules() で hProcess から hModule を得る
4) hProcess / hModule を使って GetModuleFileNameEx()

コード: 全て選択


Declare Function GetModuleFileNameEx Lib "psapi" Alias "GetModuleFileNameExA" ( _
	hProcess As HANDLE, hModule As DWord, lpFileName As BytePtr, nSize As DWord) As DWord
Declare Function EnumProcessModules Lib "psapi" ( _
	ByVal hProcess As Long, ByRef hMod As Long, ByVal sizehMod As Long, ByRef dwlpdwPIDsize As Long) As Long

Dim hWnd As DWord
Dim pid As DWord
Dim hProcess As DWord
Dim buffer[MAX_PATH] As Byte

hWnd=FindWindow(NULL,"ウインドウ名") 
GetWindowThreadProcessId(hWnd,VarPtr(pid))		'プロセスIDを取得
hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,pid)		'プロセスハンドルを取得
EnumProcessModules(hProcess,?,?,?)
GetModuleFileNameEx(hProcess,?, buffer, MAX_PATH)
が、この先は、私の様な者にはちょっとムズすぎる・・・挫折。
95/98では出来ない見たいだし。
また、勉強してから出直してきます。
すいません。ありがとうございました。