<Return[R]><Top>

ReadFile

Declare Function Api_ReadFile& Lib "kernel32" Alias "ReadFile" (ByVal hFile&, lpBuffer As Any, ByVal nNumberOfBytesToRead&, lpNumberOfBytesRead&, lpOverlapped&)

Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long

ファイルからデータを読み取る。ファイルポインタの現在の位置が、読み取りの開始位置になる。読み取りが完了すると、ファイルポインタの位置は、実際に読み取ったバイト数だけ進む。ただし、オーバーラップ I/O(非同期 I/O)を指定してファイルのハンドルを作成した場合は、読み取り操作が完了した後、アプリケーション側でファイルポインタを調整する。

パラメータ
hFile
    読み取り対象のファイルのハンドルを指定する。

    このハンドルは、GENERIC_READ アクセス権を指定して作成したものでなければならない。
    Windows NT/2000:非同期の読み取り操作を行う場合、FILE_FLAG_OVERLAPPED フラグを指定し CreateFile 関数を呼び出して開

    いた任意のハンドル、または socket と accept どちらかの関数が返したソケットのハンドルを指定する。
    Windows 95/98:非同期の読み取り操作を行う場合、FILE_FLAG_OVERLAPPED フラグを指定し CreateFile 関数を呼び出して開いた

    通信リソース、または socket と accept どちらかの関数が返したソケットのハンドルを指定する。メールスロット、名前付きパイプ、ディスクフ

    ァイルに対する非同期読み取り操作はサポートしていません。
lpBuffer
    1 個のバッファへのポインタを指定する。関数から制御が返ると、このバッファに、ファイルから読み取ったデータが格納される。
nNumberOfBytesToRead
    読み取り対象のバイト数を指定する。
lpNumberOfBytesRead
    1 個の変数へのポインタを指定する。関数から制御が返ると、この変数に、実際に読み取ったバイト数が格納される。

    何らかの作業やエラーのチェックを行う前に、ReadFile はこの値を 0 に設定する。名前付きパイプに対してこの関数を実行し、戻り値が 0

    以外(TRUE)である場合に、この変数に値 0 が格納されたときは、メッセージモードのパイプのもう一方の側が、

    nNumberOfBytesToWrite パラメータを 0 に設定して WriteFile 関数を呼び出した(つまり、何も書き込まずに、ファイルのタイムスタンプを

    更新しただけ)ことを意味する。
    Windows NT/2000:lpOverlapped パラメータで NULL を指定した場合、lpNumberOfBytesRead パラメータで NULL を指定できませ

    ん。lpOverlapped パラメータで有効なポインタを指定した場合、lpNumberOfBytesRead パラメータで NULL を指定できる。

    オーバーラップ読み取り操作を行う場合、GetOverlappedResult 関数を呼び出すと、読み取りの終わったバイト数を取得できる。

    hFile が I/O 完了ポートに関連付けられている場合、GetQueuedCompletionStatus 関数を呼び出すと、読み取りの終わったバイト数を取

    得できる。
    Windows 95/98:このパラメータでは NULL を指定できない。
lpOverlapped
    1 個の OVERLAPPED 構造体へのポインタを指定する。hFile パラメータが、FILE_FLAG_OVERLAPPED を指定して作成したファイル

    のハンドルを指している場合、この構造体は必須である。
    hFile パラメータが、FILE_FLAG_OVERLAPPED フラグを指定して開かれたハンドルを指している場合、lpOverlapped パラメータでは

    NULL を指定できない。このパラメータでは、1 個の有効な OVERLAPPED 構造体を指定しなければならない。もしこの状況で、

    lpOverlapped パラメータで NULL を指定すると、この関数は、読み取り操作が完了したと間違って通知することがある。
    hFile パラメータが、FILE_FLAG_OVERLAPPED フラグを指定して開かれたハンドルを指していて、lpOverlapped パラメータで有効なポイ

    ンタを指定した場合、OVERLAPPED 構造体で指定したオフセットでファイルの非同期読み取りが開始され、ReadFile はファイルの読み取

    りが完了する前に制御を返すことがある。この場合、ReadFile 関数は 0(FALSE)を返し、GetLastError 関数は

    ERROR_IO_PENDING を返す。この結果、呼び出し側プロセスは読み取り操作が完了する前に、他の作業を実行できる。

    その後、読み取り操作が完了すると、OVERLAPPED 構造体で指定したイベントがシグナル状態になる。
    hFile パラメータが、FILE_FLAG_OVERLAPPED フラグを指定せずに開かれたハンドルを指していて、lpOverlapped パラメータで NULL

    を指定した場合、ファイルポインタの現在の位置からファイルの同期読み取りが開始され、ReadFile は、読み取りが完了すると制御を返

    す。
    Windows NT/2000:hFile パラメータが、FILE_FLAG_OVERLAPPED フラグを指定せずに開かれたハンドルを指していて、

    lpOverlapped パラメータで有効なポインタを指定した場合、OVERLAPPED 構造体で指定したオフセットでファイルの同期読み取りが開始さ

    れ、ReadFile は、読み取りが完了すると制御を返す。
    Windows 95/98:ファイル、ディスク、パイプ、メールスロットのいずれかを対象とする操作では、このパラメータで NULL を指定しなければ  

    ならない。OVERLAPPED 構造体へのポインタを指定すると、この関数は失敗する。ただし、Windows 95/98 は、シリアルポートとパラレ

    ルポートに対するオーバーラップ I/O をサポートしている。

戻り値
    ReadFile 関数は、次のいずれかが成立すると制御を返す。

    パイプの書き込み側で書き込みが完了するか、指定されたバイト数の読み取りが終わるか、エラーが発生した場合である。
    関数が成功すると、0 以外の値が返る。
    戻り値が 0 以外で、実際に読み取ったバイト数が 0 の場合、読み取り操作を開始する時点でファイルポインタがファイルの終わり(EOF)

    を超えていたことを示す。ただし、FILE_FLAG_OVERLAPPED フラグを指定してファイルを開いていた場合、lpOverlapped パラメータに

    NULL 以外の値を指定すると、戻り値は 0(FALSE)になる。このとき、ファイルポインタがファイルの終わりを超えていると、

    GetLastError 関数は ERROR_HANDLE_EOF を返す。
    関数が失敗すると、0 が返る。拡張エラー情報を取得するには、GetLastError 関数を使う。