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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
キルケゴール

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

#1 投稿記事 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)
どなたか、この事に関して教えて下さると助かります。
お願いします。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

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

#2 投稿記事 by 7 »

> GetModuleFileNameを使えば、
> 簡単に取得できる(以下参照)と思っていたのですが、上手くいかず、
どうやらGetModuleFileName()関数では自分自身のパスしか取得できず、GetModuleFileNameEx()関数を使うようです。

C言語ですが、現在起動している全てのプロセス中の全てのモジュールのファイル名を表示するサンプルが検索して引っかかりました。
http://nienie.com/~masapico/api_GetModu ... ameEx.html
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#3 投稿記事 by イグトランス »

GetModuleFileName()の第一引数はモジュールハンドルです。(インスタンスハンドルも可)
そこへウィンドウハンドルを指定しているためうまくいかないのです。

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

コード: 全て選択

Declare Function GetWindowModuleFileName Lib "user32" Alias "GetWindowModuleFileNameA" (
    hwnd As HWND,
    pszFileName As *Char,
    cchFileNameMax As DWord) As DWord
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#4 投稿記事 by hira »

私もちょっと調べてみたのですが
http://www.yoshibaworks.com/ayacy/inaso ... 00506.html
GetWindowModuleFileName() という大変便利そうなAPIがあるので、この問題の解決は楽観視していたんですが、とんでもない。インターネットの検索エンジンでちょっと調べてみるとわかりますが、この関数は平気でウソを返します。
↑もしそうだったら何のためのAPIだよ(^^;;
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#5 投稿記事 by イグトランス »

ありました。
http://support.microsoft.com/?scid=kb;ja;228469
NT系のWindowsではGetWindowModuleFileNameもGetModuleFileNameもだめだと書いてあります。

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

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

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

#7 投稿記事 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では出来ない見たいだし。
また、勉強してから出直してきます。
すいません。ありがとうございました。
返信する