DLL(Dynamic link library)が呼び出されているかどうか

[戻る]
ストーンフォール 2015/11/09(月) 18:49:44
ネットを調べていてもなかなか情報がなく、質問させて頂きます。

特定のDLL(Dynamic link library)が呼び出されているかどうか確認したいです。

上記DLLはC++で作成したものです。

何か良い方法はありませんでしょうか?

ご教授おねがいします!

K 2015/11/09(月) 19:07:18
「呼び出されている」の定義が曖昧だと思いますが・・・

HMODULE h = ::GetModuleHandle( _T("foo.dll") );
if( h != NULL ) {
    //  foo.dll がこのプロセスのアドレス空間にマップされている
} else {
    //  マップされていない
}

とか?

ストーンフォール 2015/11/09(月) 19:44:11
Kさん
早速のアドバイス有難うございます。

GetModuleHandleで確認出来ました

しかし、1つ伝え忘れたことがありました。。。すみません。


確認するプログラムはfoo.dll内で行いたいです。

つまり、foo.dllは既にあるEXEファイルから呼び出されている状態で

他のEXEファイルがfoo.dllを使っていないかを確認したいです。

ご教授お願いします!

K 2015/11/10(火) 13:54:09
まず最初に、何のためにそれを知りたいのか?を書いた方がいいように思います。

foo.dll は自作(もしくは変更可能)ですね?
ならば DllEntryPoint() でカウントする、とか。
カウントする変数はプロセス間で共有するセクションに置かないといけない、とか
実行するユーザの権限が違っててても大丈夫なのか?とか
プロセスが異常終了したような場合でも安全か?とか
心配事はたくさんあります。私は未確認です。

あとは PSAPI で EnumProcesses() OpenProcess() EnumProcessModules() して
GetModuleFileNameEx() や GetModuleBaseName() でしょうか。
これも私は使ったこと無いと思います。

ストーンフォール 2015/11/10(火) 18:48:04
Kさん アドバイス有難うございます。

なるほど、、今回の目的は同一ユーザーによる多重起動防止です。


そのため、DllEntryPoint() でカウントするという方法では難しいかと思います。

WinAPIなどでfoo.dllを使用している起動中のプロセスを探す事が出来ればいいんです
が、全く方法が分かりません。。

ストーンフォール 2015/11/10(火) 18:54:53
方法としてはメモリマップトファイルで起動中フラグを保存する事でも対応できるので
しょうか。

しかし、以下の条件の場合、対応できませんね。。


>プロセスが異常終了したような場合でも安全か?

ストーンフォール 2015/11/10(火) 18:58:30
コマンドプロンプトで 

tasklist /m

を行ったところ

boo.exe N/A となってしまい取得できませんでした。

※ boo.exe は foo.dllの呼び出し元EXE

ストーンフォール 2015/11/10(火) 19:02:34
また、MSが提供しているDependency WalkerでEXEファイルの
関連DLLを検索する無料ツールがありまして

http://www.atmarkit.co.jp/fdotnet/dotnettips/866depends/depends.html

これで検索してもヒットしませんでした。。。
動的に呼び出すので、見つからないのかもしれません。

K 2015/11/10(火) 19:12:38
> 今回の目的は同一ユーザーによる多重起動防止です。

「普通は」は、ともかく、
私なら Mutex を使います。
「Mutex 多重起動」とかのキーワードで検索すればいくらでもヒットします。

「同一ユーザによる」ということは、
別ユーザなら多重起動してもいい、ってことですよね?
よくあるサンプルでは、デフォルトの Local Mutex なので
「同一ユーザのみ多重起動禁止で、別ユーザだと許可」だったりします。

ストーンフォール 2015/11/11(水) 08:28:11
[[解決]]
なるほどMutexの手がありましたか!

>「同一ユーザによる」ということは、
>別ユーザなら多重起動してもいい、ってことですよね?

はい、そうなります。

ありがとうございます!

古いスレッドには追加発言できません。