GetModuleHandle とLoadLibrary

[戻る]
tenteku 2011/08/02(火) 11:22:04
環境はWinXP VS2008

MSDNによると違いは参照カウントのみのようですが

HINSTANCE hDLL = GetModuleHandle(pszModuleName);//失敗
if(hDLL == NULL)
{
    hDLL = LoadLibrary(pszModuleName);//成功
}
GetLastErrorでは
Code 126, 指定されたモジュールが見つかりません。が返ってきます
解決方法をご存知の方お願いします。

何をしたいかというと、あるライブラリ関数にグローバルフックを仕掛けて
関数を置き換えしてログを取りたいのです

tenteku 2011/08/02(火) 11:36:57
追記ですが参考にしたページ
http://ruffnex.oc.to/kenji/text/api_hook/

YuO [E-Mail] 2011/08/02(火) 11:56:55
> MSDNによると違いは参照カウントのみのようですが

MSDN: GetModuleHandle Function (Windows)
http://msdn.microsoft.com/en-us/library/ms683199.aspx
見て,どこにそんなことが書いてあるのだろうか,とか思ったのですが,
MSDN: GetModuleHandle 関数
http://msdn.microsoft.com/ja-jp/library/cc429129.aspx
にあるのですね。
日本語版は古いままなので,英語版を確認することをお勧めします。

LoadLibraryは
・ロードしていないDLLをロードする (参照カウントは1)
・ロードしなかった場合はDLLへの参照カウントを1増やす
・DLLのハンドルを返す
のに対して,GetModuleHandleは
・ロードしているDLLのハンドルを返す
という機能です。当然,GetModuleHandleがロードしていないDLLのハンドルを返すことは
ありません。

根本的にLoadLibraryとGetModuleHandleは機能が別です。
参考にされたページではuser32.dllという必ず読み込まれているライブラリをフックする
ためにGetModuleHandleを使っているわけですが,
常に読み込まれているライブラリで無いならば,LoadLibraryで読み込むようにすべきで
す。

ロマ 2011/08/02(火) 13:22:41
> HINSTANCE hDLL = GetModuleHandle(pszModuleName);//失敗
> if(hDLL == NULL)
> {
>     hDLL = LoadLibrary(pszModuleName);//成功
> }

成功した後にGetLastError()を呼んでいるのでしょうか。
関数が成功した場合、last-error code はリセットされません。

tenteku 2011/08/02(火) 13:36:03
[[解決]]
了解です。しかしこのレベルのプログラムは難しいですね…
自分の頭の足りなさが恨めしい
とりあえず質問は完了いたします

ryo 2011/08/02(火) 13:40:18
質問内容は、

「GetModuleHandle とLoadLibraryの結果が違う理由が分からない」

なのか

「GetModuleHandle で失敗したらLoadLibraryするように対応したが、
それでも、GetLastErrorで126が返ってしまう。どうしたらいいか?」

どっちなのでしょうか?

ロマ 2011/08/02(火) 13:41:28
訂正
> 関数が成功した場合、last-error code はリセットされません
vs2003のmsdnにはこの記述がありましたが、
onlineのmsdn "Last_Error Code"では削除されてました。

経験的には、成功した場合にはリセットされない場合があります。

tenteku 2011/08/02(火) 13:41:33
ロマさん
失敗後に呼んでいます。ちなみにGetModuleHandleに失敗した後
LoadLibrary成功後では
Code 6, ハンドルが無効です。が返ってくるようですね

tenteku 2011/08/02(火) 13:46:05
ryoさん
違う理由がわからないの方です。
質問の仕方が悪かったですね。すみません

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