2016-06-27 13 views
2

私は例えば、私がハンドルを閉じるために適切な方法であるものこのようGetModuleHandleの戻り値を保存しないとハンドルを閉じる必要がありますか?

GetProcAddress(GetModuleHandle("modulename"), "nameoftheexportedfunction") 

GetModuleHandleをコールした場合にハンドルを閉じるために持っていた場合、私は不思議でしたか?私は

HMODULE hModule = GetModuleHandle("modulename"); 
GetProcAddress(hModule, "nameoftheexportedfunction") 
CloseHandle(hModule); 

を行う必要がありますかGetModuleHandleによって返された値が変数に格納されていない場合、それは自動的に削除されますないですか?

答えて

3

ハンドルと呼ばれる複数のものがあるため、Windows APIはこの点で非常に混乱する可能性があり、それらはすべて異なる規則を持っています。

この場合、CloseHandleはカーネルハンドルを閉じます。カーネルハンドルは通常、ファイルまたは名前で作成された同期オブジェクトなどの他のカーネルリソースを参照します。これらはすべてHANDLEとして返されます。

GetModuleHandleは、ロードされたEXEまたはのHMODULE -actuallyベースアドレスを返すDLLを - と、それがHANDLEないよう、である必要はなく、CloseHandleでリリースされてはなりません。

+0

LoadLibraryは、FreeLibraryでリリースする必要があるHMODULEを返します。リリースされなければならないのは、カーネルハンドルだけではありません。 –

8

GetModuleHandleは、HMODULE(別名HINSTANCE - What is the difference between HINSTANCE and HMODULE?を参照)を返します。このデータ型はCloseHandleに渡すことはできません。

HMODULEFreeLibraryに渡すことができますが、これは必須ではありません。GetModuleHandleはモジュールの参照カウントを増加させないためです。実際には、FreeLibraryを呼び出すと、モジュールが途中でマップされずにすばやくクラッシュする可能性があります。

簡潔に:GetModuleHandleは、読み取り専用の値を返します。これは、決して取り除かれる必要はありません。あなたの質問の最初のコード行は問題ありません。

関連する問題