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

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 起動中の他のアプリのパスを取得したい

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

by キルケゴール » 2006年1月22日(日) 18:48

皆様、レスありがとうございます。

皆様が教えてくれた事や、サイトは勿論、
自分でも色々調べて以下のサイトを見、
大体こんな流れだろうというのまでは分かりました。
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では出来ない見たいだし。
また、勉強してから出直してきます。
すいません。ありがとうございました。

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

by イグトランス » 2006年1月21日(土) 21:35

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

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

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

by hira » 2006年1月21日(土) 19:32

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

by イグトランス » 2006年1月20日(金) 22:16

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

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

コード: 全て選択

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

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

by 7 » 2006年1月19日(木) 18:04

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

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

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

by キルケゴール » 2006年1月19日(木) 16:34

件名そのままなのですが、
例えば、メモ帳が起動中なら"C:\WINDOWS\system32\notepad.exe"という風にパスを得たいのです。

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

コード: 全て選択

hWnd As DWord
Dim buffer[MAX_PATH] As Byte

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

ページトップ