ReadFileEx
The ReadFileEx
function reads data from a file asynchronously. It is designed solely for
asynchronous operation, unlike the ReadFile
The ReadFileEx
function reports its completion status asynchronously, calling a specified
completion routine when reading is completed and the calling thread is in an
alertable wait state.
BOOL ReadFileEx(
HANDLE hFile, |
// handle of file
to read |
LPVOID lpBuffer, |
// address of
buffer |
DWORD nNumberOfBytesToRead, |
// number of bytes
to read |
LPOVERLAPPED lpOverlapped, |
// address of
offset |
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine |
// address of
completion routine |
); |
|
Parameters
hFile
An open
handle that specifies the file entity to be read from. This file handle must
have been created with the FILE_FLAG_OVERLAPPED flag and must have GENERIC_READ
access to the file.
Windows
NT: hFile can be any handle opened with the FILE_FLAG_OVERLAPPED
flag by the CreateFile
Windows
95: hFile can be a communications resource, mailslot, or named
pipe handle opened with the FILE_FLAG_OVERLAPPED flag by CreateFile, or
a socket handle returned by the socket or accept functions.
Windows 95 does not support asynchronous operations on disk files.
lpBuffer
Points to a
buffer that receives the data read from the file.
This buffer
must remain valid for the duration of the read operation. The application
should not use this buffer until the read operation is completed.
nNumberOfBytesToRead
Specifies the
number of bytes to be read from the file.
lpOverlapped
Points to an OVERLAPPED
If the file specified by hFile supports the concept of byte
offsets, the caller of ReadFileEx must specify a byte offset within the
file at which reading should begin. The caller specifies the byte offset by
setting the OVERLAPPED structure s Offset and OffsetHigh
members.
If the file entity specified by hFile does not support the
concept of byte offsets for example,
if it is a named pipe the caller
must set the Offset and OffsetHigh members to zero, or ReadFileEx
fails.
The ReadFileEx function ignores the OVERLAPPED
The ReadFileEx function does use the OVERLAPPED
structure s Internal and InternalHigh members. An application
should not set these members.
The OVERLAPPED data structure pointed to by lpOverlapped
must remain valid for the duration of the read operation. It should not be a
variable that can go out of scope while the file read operation is in progress.
lpCompletionRoutine
Points to the
completion routine to be called when the read operation is complete and the
calling thread is in an alertable wait state. For more information about the
completion routine, see FileIOCompletionRoutine
Return Values
If the
function succeeds, the return value is nonzero.
If the
function fails, the return value is zero. To get extended error information,
call GetLastError
If the
function succeeds, the calling thread has an asynchronous I/O (input/output)
operation pending: the overlapped read operation from the file. When this I/O
operation completes, and the calling thread is blocked in an alertable wait
state, the system calls the function pointed to by lpCompletionRoutine,
and the wait state completes with a return code of WAIT_IO_COMPLETION.
If the
function succeeds, and the file reading operation completes, but the calling
thread is not in an alertable wait state, the system queues the completion
routine call, holding the call until the calling thread enters an alertable
wait state. For information about alertable waits and overlapped input/output
operations, see Synchronization and Overlapped Input and Output
If ReadFileEx
attempts to read past the end of the file, the function returns zero, and GetLastError
returns ERROR_HANDLE_EOF.
Remarks
If a portion
of the file specified by hFile is locked by another process, and the
read operation specified in a call to ReadFileEx overlaps the locked
portion, the call to ReadFileEx fails.
If ReadFileEx
attempts to read data from a mailslot whose buffer is too small, the function
returns FALSE, and GetLastError returns ERROR_INSUFFICIENT_BUFFER.
Applications
must not read from nor write to the input buffer that a read operation is using
until the read operation completes. A premature access to the input buffer may
lead to corruption of the data read into that buffer.
The ReadFileEx
function may fail if there are too many outstanding asynchronous I/O requests.
In the event of such a failure, GetLastError can return
ERROR_INVALID_USER_BUFFER or ERROR_NOT_ENOUGH_MEMORY.
To cancel all
pending asynchronous I/O operations, use the CancelIO
If hFile
is a handle to a named pipe or other file entity that doesn t support the
byte-offset concept, the Offset and OffsetHigh members of the OVERLAPPED
structure pointed to by lpOverlapped must be zero, or ReadFileEx
fails.
An
application uses the MsgWaitForMultipleObjectsEx, WaitForSingleObjectEx,
WaitForMultipleObjectsEx, and SleepEx functions to enter an
alertable wait state. For more information about alertable waits and overlapped
input/output, refer to those functions reference and Synchronization
Windows
95: On this platform, neither ReadFileEx
nor WriteFileEx can be used by the comm ports to communicate. However,
you can use ReadFile and WriteFile to perform asynchronous
communication.
See Also