5

成功すると、ShellExecuteはハンドルを返します。

このハンドルを閉じる必要がありますか?もしそうなら、どのように?

私のMicrosoftが公開した例によると、このハンドルを閉じる必要はありません。しかし、ShellExecute自体のドキュメントは、この件に関しては無言です。このハンドルを閉じる必要がないことを確認できますか?

しかし、それでは、どのようにしてハンドルを有効にし、閉じる必要がないのでしょうか?次の説明のうち、正しいものはどれですか。

  1. ハンドルが無効であり、何もできません。
  2. ハンドルが解放されることはなく、(Microsoftが後援する)メモリリークが発生します(呼び出し元プログラムが終了するまで)。
  3. ハンドルは、ある時点でシステムによって自動的に解放され、後で再利用されることはありません(->別の種類のリソースリーク)。それを使おうとすると、それがまだ何かを指しているかどうかを知ることができます。
  4. ほかに何か ?
4

3 に答える 3

5

そのヒントは16ビットのものです。win32では、成功した場合は32を超える数値であり、関数が失敗した場合のエラーコードとして以外の目的で使用することはできません。一方、SEE_MASK_NOCLOSEPROCESSをExバージョンに渡す場合は、閉じる必要のあるハンドルがあります。

于 2010-05-06T10:51:08.307 に答える
4

取得元:http ://msdn.microsoft.com/en-us/library/bb762153%28VS.85%29.aspx

関数が成功すると、32より大きい値が返されます。関数が失敗すると、失敗の原因を示すエラー値が返されます。戻り値は、16ビットWindowsアプリケーションとの下位互換性のためにHINSTANCEとしてキャストされます。ただし、これは真のHINSTANCEではありません。これはintにのみキャストでき、32または以下の次のエラーコードと比較できます。

于 2010-05-06T10:49:44.843 に答える
0

とは何かを少しクリアしHINSTANCEますHMODULE。これはではなくHANDLE、メモリアドレス(ポインタ)としての機能です。hInstanceロードされたモジュールにをキャストして(IMAGE_DOS_HEADER *)内部を見るだけで、これを理解できます。を使用VirtualQueryEx (GetCurrentProcess(),...)して、メモリアドレスからより多くの情報(サイズなど)を受け取ることができます。

http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspxおよびhttp://www.apriorit.com/our-experience/articles/9-sd-articles/74-をご覧ください。 hmodule-hinstance-handle-from-static-library-in-cHINSTANCEを実行すると、メモリアドレス(__ImageBase)からを受信する方法がわかります。

したがってLoadLibrary、たとえば、を受け取る場合HMODULE(と同じHINSTANCEです)。FreeLibrary「ハンドルを閉じる」のではなく、メモリからモジュールをアンロードするために使用する必要があります。たとえば、を使用する場合GetModuleHandle、同じアドレスも受け取ります(としてキャストされたアドレスを受け取ります)が、 「ハンドルを閉じる」ためにHMODULE呼び出すべきではありません。FreeLibrary

それらが何でHINSTANCEありHMODULE、どのように使用されるべきかを理解すれば、HINSTANCEから返された使用方法を知ることができますShellExecute

于 2010-05-13T10:53:34.407 に答える