GetModuleHandle(NULL)とGetWindowLong(hwnd, GWL_HINSTANCE)で取得できるハンドルっ
て同一のものとして扱っても構わないの?
そもそもインスタンスハンドルとモジュールハンドルって何か違いでもあるんでしょう
か?
基本的には同じものですから、HINSTANCE を GetModuleFileName 等の HMODULE を取る関
数に与えても問題ありません。
ただし、GetModuleHandle( NULL ) と GetWindowLong( hwnd, GWL_HINSTANCE ) が常に同
じ値を返すかどうかはわかりません。
余談:
インスタンスハンドルもモジュールハンドルも、そのモジュール(DLLやEXE)がメモリ上
にマップ(ロード)されているアドレスです。
ですから、それらを GetMappedFileName に与えることでもファイル名を得られます(見
慣れない形式で返ってくるでしょうけど…)。
>GetModuleHandle(NULL)とGetWindowLong(hwnd, GWL_HINSTANCE)で取得できるハンドルっ
>て同一のものとして扱っても構わないの?
ウインドウハンドルが他のプロセスのものでないなら同じではないかと思います。
>そもそもインスタンスハンドルとモジュールハンドルって何か違いでもあるんでしょう
>か?
違いがないと書かれたドキュメントは見つけられませんでしたが
windef.hにはHINSTANCEの代わりにHMODULEが使えるというコメントがあります。
typedef HINSTANCE HMODULE; /* HMODULEs can be used in place of HINSTANCEs */
>ウインドウハンドルが他のプロセスのものでないなら同じではないかと思います。
と書きましたが、プロセスが同じでも異なる場合もありますね。
CreateWindowのパラメータに他のDLLのインスタンスハンドルを
渡していた場合にはGetWindowLongの戻り値はDLLのインスタンスハンドルになります。
うーん。
分かったような分からないような・・
ちょっと難しいです。
おとなしくオーソドックスな方法を時と場所に応じて用いたほうがいいのかな?・・
(汗
返答してくれた方々、ありがとうございました。
> CreateWindowのパラメータに他のDLLのインスタンスハンドルを
> 渡していた場合にはGetWindowLongの戻り値はDLLのインスタンスハンドルになります。
検証していませんが、NT系のOSではCreateWindowのHINSTANCEは無視されるとあります。
違う値が返りました?
>検証していませんが、NT系のOSではCreateWindowのHINSTANCEは無視されるとあります。
>違う値が返りました?
XP環境でLoadLibraryで適当なDLLをロードしてHINSTANCEに指定するとその値になりました。
NULLを指定するとGetWindowLongの戻り値もNULLになるようです。
確かにCreateWindowの説明にはHINSTANCEは無視されると書いてありますね・・・
検証ありがとうございます。
とりあえず渡された値は保持しておくが、使ってはいないということですかね。
# 検証できる環境を作らないとな…