CloseHandle 関数 (handleapi.h)

開いているオブジェクト ハンドルを閉じます。

構文

BOOL CloseHandle(
  [in] HANDLE hObject
);

パラメーター

[in] hObject

開いているオブジェクトに対する有効なハンドル。

戻り値

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

アプリケーションがデバッガーで実行されている場合、無効なハンドル値または疑似ハンドル値を受け取った場合、関数は例外をスローします。 これは、ハンドルを 2 回閉じる場合や、FindClose 関数を呼び出す代わりに FindFirstFile 関数によって返されるハンドルに対して CloseHandle を呼び出した場合に発生する可能性があります。

注釈

CloseHandle 関数は、次のオブジェクトへのハンドルを閉じます。

  • アクセス トークン
  • 通信デバイス
  • コンソールの入力
  • コンソール画面バッファー
  • イベント
  • ファイル
  • ファイル マッピング
  • I/O 入力候補ポート
  • ジョブ
  • Mailslot
  • メモリ リソース通知
  • Mutex
  • 名前付きパイプ
  • Pipe
  • プロセス
  • Semaphore
  • スレッド
  • トランザクション
  • 待機可能タイマー
これらのオブジェクトを作成する関数のドキュメントは、オブジェクトの操作が完了したときに CloseHandle を使用する必要があり、ハンドルが閉じられた後にオブジェクトに対する保留中の操作がどうなるかを示しています。 一般に、 CloseHandle は、指定されたオブジェクト ハンドルを無効にし、オブジェクトのハンドル数を減らし、オブジェクトの保持チェックを実行します。 オブジェクトへの最後のハンドルが閉じられた後、オブジェクトはシステムから削除されます。 これらのオブジェクトの作成者関数の概要については、「 カーネル オブジェクト」を参照してください。

一般に、アプリケーションは開くハンドルごとに 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

関連項目

CreateFile

CreateFileTransacted

DeleteFile

FindClose

FindFirstFile

ハンドル関数とオブジェクト関数

カーネル オブジェクト

オブジェクト インターフェイス