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 を使用する必要があり、ハンドルが閉じられた後にオブジェクトに対する保留中の操作がどうなるかを示しています。 一般に、 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

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

カーネル オブジェクト

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