環境はWinXP VS2008
MSDNによると違いは参照カウントのみのようですが
HINSTANCE hDLL = GetModuleHandle(pszModuleName);//失敗
if(hDLL == NULL)
{
hDLL = LoadLibrary(pszModuleName);//成功
}
GetLastErrorでは
Code 126, 指定されたモジュールが見つかりません。が返ってきます
解決方法をご存知の方お願いします。
何をしたいかというと、あるライブラリ関数にグローバルフックを仕掛けて
関数を置き換えしてログを取りたいのです
> 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で読み込むようにすべきで
す。
> HINSTANCE hDLL = GetModuleHandle(pszModuleName);//失敗
> if(hDLL == NULL)
> {
> hDLL = LoadLibrary(pszModuleName);//成功
> }
成功した後にGetLastError()を呼んでいるのでしょうか。
関数が成功した場合、last-error code はリセットされません。
了解です。しかしこのレベルのプログラムは難しいですね…
自分の頭の足りなさが恨めしい
とりあえず質問は完了いたします
質問内容は、
「GetModuleHandle とLoadLibraryの結果が違う理由が分からない」
なのか
「GetModuleHandle で失敗したらLoadLibraryするように対応したが、
それでも、GetLastErrorで126が返ってしまう。どうしたらいいか?」
どっちなのでしょうか?
訂正
> 関数が成功した場合、last-error code はリセットされません
vs2003のmsdnにはこの記述がありましたが、
onlineのmsdn Last_Error Codeでは削除されてました。
経験的には、成功した場合にはリセットされない場合があります。
ロマさん
失敗後に呼んでいます。ちなみにGetModuleHandleに失敗した後
LoadLibrary成功後では
Code 6, ハンドルが無効です。が返ってくるようですね
ryoさん
違う理由がわからないの方です。
質問の仕方が悪かったですね。すみません