こんばんわ。E46-M3です。

さっそくですが、自身のアプリケーションのフルパスを
取得することは出来たのですが
(GetModuleFileName使用)
他の起動中アプリケーションのフルパスを
取得することが出来ません。
どなたかご存知な方いましたら教えて下さい。
具体的なサンプルコード等ありましたら
なおうれしいです。よろしくお願い致します。

A 回答 (1件)

Windows9x/Me/2000であれば


CreateToolHelp32SnapShot()し、そのハンドルからProcess32First/Next()を使ってPROCESSENTRY32構造体からProcessIDとmoduleIDを取得、その後でGetModuleFileNameEx()で取得できそうな気がしますが・・・

ちなみにNT4.0以前ではToolHelp32系APIが使用不可能ですのでPSAPIを使う必要があるらしいです。

起動中アプリケーションの列挙までに関しては参考URLに載っています。

参考URL:http://www.microsoft.com/JAPAN/support/kb/articl …
    • good
    • 0
この回答へのお礼

さっそくの回答ありがとうございます。
結構奥が深そうですね。うーん。むずかしそうです。

お礼日時:2001/06/14 19:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QGetModuleFileName(他のアプリ, buf, 255);

HINSTANCE hInst;
hInst = (HINSTANCE)GetWindowLong(hWndElse, GWL_HINSTANCE);
GetModuleFileName(hInst, buf, 255);

というソースで、buf[0] が 0 でした。

GetWindowText( ) のように、GetModuleFileName( ) も
他のアプリに対しては 0 を返すんですか?

Aベストアンサー

GetModuleFileName() のヘルプを見ると、第一引数の型は HMODULE でモジュールハンドルを
渡すことになってます。

それなのにインスタンスハンドルを渡しているからエラーになっているのでしょう。

GetModuleFileName() 関数の戻り値と GetLastError() を使って詳細の情報を
取得して、ヘルプを参照して見てください。

QCの関数で自分自身のパス取得

関数で現在実行しているファイルのパスを取得するものがあると聞いたことがあるんですが、見当もつかないです。
知ってる方がいたら教えてください。

お願いいたします

Aベストアンサー

Windowsの場合でしたら

GetModuleFileName

で第一引数にNULLを指定すれば自分のファイルパス(ファイル名含む)まで
取得できます。

QVC++2005 VC++6.0で使えた関数がつかえない?(たとえば、GetModuleFileNameとか、、)

VC++超超初心者です。

いままであったVC++6.0で利用できていた、VC++2005で
GetModuleFileNameができなくなりました。
(利用できないことなんて、ないと思いますが、、、)

何か宣言とかinclude文とか必要なのでしょうか。

すみませんが、よろしくお願いします。

Aベストアンサー

VC++2005無料版にはPlatformSDKが別になっているのでそのままでは使えません
別にPlatformSDKをインストールしてVC++2005の設定を変える必要があります
VC++2008では無料版にもSDKが付属しています

Qほかのアプリケーションからのメッセージの取得

他のアプリケーションからのメッセージの取得方法を教えて下さい。

現在マインスイーパを起動し、そのボタンが押下される順番を記憶するプログラミングを制作しています。
マウスの左クリックに関するメッセージを取得すれば良いと思い、
GetMessage(&msg, hWnd, WM_LBUTTONDOWN, WM_LBUTTONUP);←hWndはマインスイーパのウィンドウハンドル
のように書いたんですが、うまくいきませんでした。

調べてみるとGetMessageの第二引数は呼び出し側のスレッドに所属していなくてはならないということで、
この辺が原因なのだろうと思うのですが…。

どなたかご教授ねがいます。

<環境>
 Windows Vista Home Premium
 Visual C++ Express Edition

Aベストアンサー

★アドバイス
・マウスフックを調べてみましょう。
 http://www.kumei.ne.jp/c_lang/sdk2/sdk_160.htm→『第160章 メッセージフックの基礎』
 http://www.kumei.ne.jp/c_lang/sdk2/sdk_162.htm→『第162章 マウス・フック』
 あとdllの作り方もお勉強した方が良いでしょう。

QGetModuleFileNameでエラーが出てしまう。

#include<windows.h>
#include<string.h>

// 関数のプロトタイプ宣言
VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
// エントリポイント
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
EnumWindows((WNDENUMPROC)EnumWindowsProc,NULL);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
char Caption[201];
char FileName[1024]="";
char FindList[1][80]={"Microsoft Internet Explorer"};
GetWindowText(hwnd, Caption, 200);
for(int i=0;i<=0;i++)
if(NULL!=strstr(Caption,FindList[i]))
{

HINSTANCE hInst;
hInst = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
if(GetModuleFileName(hInst, FileName, 1023)!=0)
{
// ファイル名取得成功したときの動作
MessageBox(NULL,Caption,FileName,MB_OK|MB_SETFOREGROUND);
}else{
MessageBox(NULL,Caption,"Error",MB_OK|MB_SETFOREGROUND);
}
}
return true;
}

実行するとIEが起動されてたらそのウインドウのキャプションとプログラム名を表示される予定なのですが、
GetModuleFileNameでエラーが返されます。
何が原因なのでしょう?

#include<windows.h>
#include<string.h>

// 関数のプロトタイプ宣言
VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
// エントリポイント
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
EnumWindows((WNDENUMPROC)EnumWindowsProc,NULL);
while(GetMessage(&ms...続きを読む

Aベストアンサー

DLLを注入して、モジュール名を取得する方法です。

1.GetWindowProcessTheradIdで対象プロセスのThreadIDを取得
2.ThreadIDを指定し、SetWindowsHookExでWH_GETMESSAGEでメッセージフックをかける
3.対象のウィンドウに、WM_USER等の独自定義メッセージを送る。
4.フックプロシージャの中で、GetModuleHandleやGetWndowLongでインスタンスハンドルを取得し、GetModuleFileNameを使用してモジュール名を取得。
5.取得したプロセス名を自アプリに渡す。
共有メモリでもWM_COPYDATAでも何でもかまわない。

てな感じで出来ます。

この方法のメリットとしては、相手プロセスの、メモリ空間で動作するので何でも出来ることです。
デメリットは、危険なところです(^^;;
作成したDLLにバグがあると、相手プロセスを落とすことになります。
また、相手アプリが異常終了したりすると、DLLが開放されない事態も発生します。



ちなみにGetWindowModuleFileName、古いSDKだと定義されていないかもしれませんね。
以前は隠し関数?だったのかな?
最新のWindowsSDKを取得して使用することをお勧めします。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/getwindowmodulefilename.asp

DLLを注入して、モジュール名を取得する方法です。

1.GetWindowProcessTheradIdで対象プロセスのThreadIDを取得
2.ThreadIDを指定し、SetWindowsHookExでWH_GETMESSAGEでメッセージフックをかける
3.対象のウィンドウに、WM_USER等の独自定義メッセージを送る。
4.フックプロシージャの中で、GetModuleHandleやGetWndowLongでインスタンスハンドルを取得し、GetModuleFileNameを使用してモジュール名を取得。
5.取得したプロセス名を自アプリに渡す。
共有メモリでもWM_COPYDATAでも何でもかまわない。

...続きを読む


人気Q&Aランキング

おすすめ情報