CloseHandle 関数 (handleapi.h)
開いているオブジェクト ハンドルを閉じます。
構文
BOOL CloseHandle(
[in] HANDLE hObject
);
パラメーター
[in] hObject
開いているオブジェクトに対する有効なハンドル。
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。
アプリケーションがデバッガーで実行されている場合、無効なハンドル値または擬似ハンドル値を受け取った場合、関数は例外をスローします。 これは、ハンドルを 2 回閉じる場合、または FindClose 関数を呼び出す代わりに FindFirstFile 関数によって返されるハンドルに対して CloseHandle を呼び出した場合に発生する可能性があります。
注釈
CloseHandle 関数は、ハンドルを次のオブジェクトに閉じます。
- アクセス トークン
- 通信デバイス
- コンソール入力
- コンソール画面バッファー
- イベント
- ファイル
- ファイル マッピング
- I/O 入力候補ポート
- ジョブ
- Mailslot
- メモリ リソース通知
- Mutex
- 名前付きパイプ
- Pipe
- Process
- Semaphore
- スレッド
- トランザクション
- 待機可能タイマー
一般に、アプリケーションは開くハンドルごとに CloseHandle を 1 回呼び出す必要があります。 ハンドルを使用する関数がERROR_INVALID_HANDLEで失敗した場合、通常は CloseHandle を呼び出す必要はありません。このエラーは通常、ハンドルが既に無効になっていることを示しているためです。 ただし、一部の関数では ERROR_INVALID_HANDLE を使用して、オブジェクト自体が有効でなくなったことを示します。 たとえば、ネットワーク上のファイルへのハンドルを使用しようとする関数は、ファイル オブジェクトが使用できなくなったため、ネットワーク接続が切断された場合、ERROR_INVALID_HANDLEで失敗する可能性があります。 この場合、アプリケーションはハンドルを閉じる必要があります。
ハンドルがトランザクションの場合、トランザクションにバインドされているすべてのハンドルは、トランザクションがコミットされる前に閉じる必要があります。 FILE_FLAG_DELETE_ON_CLOSE フラグを指定して CreateFileTransacted を 呼び出してトランザクション ハンドルを開いた場合、アプリケーションがハンドルを閉じて CommitTransaction を呼び出すまで、ファイルは削除されません。 トランザクション オブジェクトの詳細については、「 トランザクションの操作」を参照してください。
スレッド ハンドルを閉じると、関連付けられているスレッドが終了したり、スレッド オブジェクトが削除されたりすることはありません。 プロセス ハンドルを閉じても、関連付けられているプロセスが終了したり、プロセス オブジェクトが削除されたりすることはありません。 スレッド オブジェクトを削除するには、スレッドを終了してから、スレッドに対するすべてのハンドルを閉じる必要があります。 詳細については、「 スレッドの終了」を参照してください。 プロセス オブジェクトを削除するには、プロセスを終了してから、プロセスのすべてのハンドルを閉じる必要があります。 詳細については、「 プロセスの終了」を参照してください。
まだ開いているファイル ビューがある場合でも、ファイル マッピングへのハンドルを閉じると成功する可能性があります。 詳細については、「 ファイル マッピング オブジェクトを閉じる」を参照してください。
CloseHandle 関数を使用してソケットを閉じないでください。 代わりに、 closesocket 関数を使用します。この関数は、ソケット オブジェクトへのハンドルを含む、ソケットに関連付けられているすべてのリソースを解放します。 詳細については、「 ソケット クロージャ」を参照してください。
CloseHandle 関数を使用して、開いているレジストリ キーへのハンドルを閉じないでください。 代わりに、 RegCloseKey 関数を使用します。 CloseHandle はレジストリ キーへのハンドルを閉じませんが、このエラーを示すエラーは返されません。
例
dwPriorityClass = 0;
hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
if( hProcess == NULL )
printError( TEXT("OpenProcess") );
else
{
dwPriorityClass = GetPriorityClass( hProcess );
if( !dwPriorityClass )
printError( TEXT("GetPriorityClass") );
CloseHandle( hProcess );
}
コンテキストでこの例を確認するには、「 スナップショットの作成」と「プロセスの表示」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | handleapi.h (Windows.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |