LPOVERLAPPED_COMPLETION_ROUTINE
コールバックシグネチャ
void LPOVERLAPPED_COMPLETION_ROUTINE(
DWORD dwErrorCode,
DWORD dwNumberOfBytesTransfered,
OVERLAPPED* lpOverlapped
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| dwErrorCode | DWORD | I/O の完了状態です。このパラメーターには、 システム エラー コードのいずれかが設定されます。 |
| dwNumberOfBytesTransfered | DWORD | 転送されたバイト数です。エラーが発生した場合、このパラメーターは 0 になります。 |
| lpOverlapped | OVERLAPPED* | 非同期 I/O 関数で指定された OVERLAPPED 構造体への ポインターです。 システムは、完了ルーチンが呼び出された後は OVERLAPPED 構造体を 使用しません。そのため、完了ルーチンでオーバーラップ構造体に使用されているメモリを解放できます。 |
公式ドキュメント
アプリケーション定義のコールバック関数で、 ReadFileEx 関数および WriteFileEx 関数と共に使用します。この関数は、非同期の 入出力 (I/O) 操作が完了または取り消され、かつ呼び出し元のスレッドが (SleepEx、 MsgWaitForMultipleObjectsEx、 WaitForSingleObjectEx、または WaitForMultipleObjectsEx 関数の fAlertable パラメーターに TRUE を指定することで) アラート可能状態になっているときに呼び出されます。
LPOVERLAPPED_COMPLETION_ROUTINE 型は、このコールバック関数へのポインターを定義します。FileIOCompletionRoutine は、 アプリケーション定義の関数名のプレースホルダーです。
解説(Remarks)
非同期操作の戻り値は、操作が正常に完了した場合、または警告付きで完了した場合は 0 (ERROR_SUCCESS) です。 I/O 操作が正常に完了したかどうかを判断するには、dwErrorCode が 0 であることを確認したうえで GetOverlappedResult を呼び出し、続いて GetLastError を呼び出します。たとえば、ReadFileEx の呼び出しで すべてのデータを受け取るにはバッファーが十分な大きさでなかった場合、 dwErrorCode は 0 に設定され、 GetOverlappedResult は失敗し、 GetLastError は ERROR_MORE_DATA を返します。
この関数から戻ると、保留中の別の I/O 完了ルーチンを呼び出せるようになります。待機中のすべての 完了ルーチンは、アラート可能なスレッドの待機が WAIT_IO_COMPLETION という戻りコードで完了する前に呼び出されます。システムは、待機中の完了ルーチンを任意の順序で呼び出す場合があります。 I/O 関数が完了した順序で呼び出されるとは限りません。
システムが完了ルーチンを呼び出すたびに、アプリケーションのスタックの一部が使用されます。完了ルーチンが さらに非同期 I/O やアラート可能な待機を行う場合、スタックが増大する可能性があります。
詳細については、 Asynchronous Procedure Calls を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)