<Return[G]><Top>

GetOverlappedResult

Declare Function Api_GetOverlappedResult& Lib "kernel32" Alias "GetOverlappedResult" (ByVal hFile&, lpOverlapped As OVERLAPPED, lpNumberOfBytesTransferred&, ByVal bWait&)

Declare Function GetOverlappedResult Lib "kernel32" Alias "GetOverlappedResult" (ByVal hFile As Long, lpOverlapped As OVERLAPPED, lpNumberOfBytesTransferred As Long, ByVal bWait As Long) As Long

指定されたファイル、名前付きパイプ、通信デバイスに関するオーバーラップ(非同期)操作の結果を返す。
Windows 95/98:この関数は、通信デバイスと、 関数を使って開いたファイルに対してのみ機能する。

パラメータ
hFile
    ファイル、名前付きパイプ、通信デバイスいずれかのハンドルを指定する。
lpOverlapped
    オーバーラップ操作を開始する際に指定した、1 個の 構造体へのポインタを指定する。
lpNumberOfBytesTransferred
    1 個の変数へのポインタを指定する。関数から制御が返ると、この変数に、読み取り(または書き込み)の操作によって実際に転送されたバ

    イト数が格納される。 関数を使って操作を行った場合は、パイプから読み取ったバイト数が格納される。 関数を使って操作を行った場合

    は、デバイスドライバが返した出力データのバイト数が格納される。 関数、または 関数を使って操作を行った場合に格納される値は、未

    定義である。
bWait
    未処理のオーバーラップ操作の完了を待つかどうかを指定する。TRUE を指定すると、この関数は、操作が完了するまで待機する。

    FALSE を指定すると、操作が未処理である場合、この関数は 0(FALSE)を返し、 関数は ERROR_IO_INCOMPLETE を返す。

戻り値
    関数が成功すると、0 以外の値が返る。
    関数が失敗すると、0 が返る。拡張エラー情報を取得するには、 関数を使う。

解説
    GetOverlappedResult 関数が報告する処理結果は、指定された 構造体に対して、指定されたハンドルに関係する直前のオーバーラップ

    操作を適用した結果、およびこの関数が制御を返した時点でその操作が未処理だった結果を表している。操作が未処理だった場合、その

    操作を開始した関数は 0(FALSE)を返し、GetLastError 関数は ERROR_IO_PENDING を返す。I/O 操作が未処理の場合、その操作

    を開始した関数は構造体のメンバをリセットして、非シグナル状態に設定する。その後、未処理だった操作が完了すると、システムはこの

    イベントオブジェクトをシグナル状態に設定する。
    OVERLAPPED 構造体の hEvent メンバで、手動リセットイベントオブジェクトを指定する。自動リセットイベントオブジェクトを指定した場合、

    オーバーラップ操作を開始した後、GetOverlappedResult 関数を呼び出すまでの間は、待機関数で、そのイベントオブジェクトを指定できな

    い。待機関数が制御を返すと、自動リセットイベントオブジェクトは非シグナル状態に設定されるからである。その後、bWait パラメータで

    TRUE を指定して GetOverlappedResult 関数を呼び出すと、この関数は永続的にブロックされてしまう。
    bWait パラメータで TRUE を指定した場合、GetOverlappedResult 関数は、イベントオブジェクトがシグナル状態になるのを待機することに

    より、未処理の操作が完了したかどうかを判断する。
    Windows 95/98:bWait パラメータで TRUE を指定した場合、 構造体の hEvent メンバで NULL を指定することはできない。
    Windows NT/2000:OVERLAPPED 構造体の hEvent メンバで NULL を指定した場合、システムは、操作が完了したかどうかを判断

    するために、この関数の hFile パラメータで指定したハンドルの状態を調べる(操作が完了すると、hFile ハンドルがシグナル状態になるから

    である)。この目的で、ファイル、名前付きパイプ、通信デバイスいずれかのハンドルを指定することは望ましくない。代わりにイベントオブジェ

    クトを使う方が安全である。1 つのファイル、名前付きパイプ、通信デバイスのいずれかに対して複数のオーバーラップ操作を同時に実行す

    ると、混乱が起こる可能性がある。このような状況では、どの操作がオブジェクトをシグナル状態にしたのか把握する方法はない。