GetModuleHandle とLoadLibrary – プログラミング – Home

通知
すべてクリア

[解決済] GetModuleHandle とLoadLibrary


tenteku
 tenteku
(@tenteku)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

環境はWinXP VS2008

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

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

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


引用未解決
トピックタグ
tenteku
 tenteku
(@tenteku)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

追記ですが参考にしたページ
http://ruffnex.oc.to/kenji/text/api_hook/


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

> 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で読み込むようにすべきで
す。


返信引用
ロマ
 ロマ
(@ロマ)
ゲスト
結合: 18年前
投稿: 170
 

> HINSTANCE hDLL = GetModuleHandle(pszModuleName);//失敗
> if(hDLL == NULL)
> {
> hDLL = LoadLibrary(pszModuleName);//成功
> }

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


返信引用
tenteku
 tenteku
(@tenteku)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

了解です。しかしこのレベルのプログラムは難しいですね…
自分の頭の足りなさが恨めしい
とりあえず質問は完了いたします


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

質問内容は、

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

なのか

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

どっちなのでしょうか?


返信引用
ロマ
 ロマ
(@ロマ)
ゲスト
結合: 18年前
投稿: 170
 

訂正
> 関数が成功した場合、last-error code はリセットされません
vs2003のmsdnにはこの記述がありましたが、
onlineのmsdn Last_Error Codeでは削除されてました。

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


返信引用
tenteku
 tenteku
(@tenteku)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

ロマさん
失敗後に呼んでいます。ちなみにGetModuleHandleに失敗した後
LoadLibrary成功後では
Code 6, ハンドルが無効です。が返ってくるようですね


返信引用
tenteku
 tenteku
(@tenteku)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

ryoさん
違う理由がわからないの方です。
質問の仕方が悪かったですね。すみません


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました