GetOverlappedResult函数详细解答

GetOverlappedResult
GetOverlappedResult函数返回指定文件、指定管道或通信设备上重叠操作的结果。

Windows95:此功能只适用于通讯设备或使用DeviceIoControl功能打开的档案

BOOL GetOverlappedResult (
HANDLE hFile、//文件、管道或通信设备的句柄
lpoverllapped, //指向重叠结构的指针
LPDWORD lpNumberOfBytesTransferred, //指向实际字节数的指针
BOOL bWait //等待标志
);

参数
hFile
文件、命名管道或通信设备的句柄。这与调用ReadFile、WriteFile、ConnectNamedPipe、TransactNamedPipe、DeviceIoControl或WaitCommEvent函数启动重叠操作时指定的句柄相同。
lpOverlapped
指向在开始重叠操作时指定的重叠结构的指针。
lpNumberOfBytesTransferred
指向32位变量的指针,该变量接收由读或写操作实际传输的字节数。对于TransactNamedPipe操作,这是从管道中读取的字节数。对于DeviceIoControl操作,这是设备驱动程序返回的输出数据字节数。对于ConnectNamedPipe或WaitCommEvent操作,这个值是未定义的。
bWait
指定函数是否应该等待挂起的重叠操作完成如果为真,则在操作完成之前函数不会返回如果为FALSE且操作仍然挂起,则函数返回FALSE,而GetLastError函数返回ERROR_IO_INCOMPLETE。
返回值
如果函数成功,则返回值为非零。

如果函数失败,则返回值为零。要获取扩展的错误信息,请调用GetLastError。

讲话
GetOverlappedResult函数报告的结果是指定句柄的最后一个重叠操作的结果,该操作提供了指定的重叠结构,并且该操作的结果正在等待处理。当启动该操作的函数返回FALSE,并且GetLastError函数返回ERROR_IO_PENDING时,将指示该操作。当I/O操作处于挂起状态时,启动该操作的函数将重叠结构的hEvent成员重置为无信号状态。然后,当挂起操作完成时,系统将事件对象设置为有信号状态。

在重叠结构中指定手动重置事件对象。如果使用自动重置事件对象,则在启动重叠操作和调用GetOverlappedResult之间的任何其他等待操作中都不能指定事件句柄。例如,事件对象有时在某个等待函数中指定,以等待操作完成。当等待函数返回时,系统将自动重置事件的状态设置为无信号状态,随后调用GetOverlappedResult,并将bWait参数设置为TRUE,这将导致函数被无限期阻塞。

如果bWait参数为TRUE,则GetOverlappedResult通过等待事件对象处于有信号状态来确定挂起操作是否已经完成。

Windows 95和Windows 98:如果bWait为真,则重叠结构的hEvent成员不能为空。

windowsnt:如果重叠结构的hEvent成员为空,系统将使用hFile句柄的状态在操作完成时发出信号。不建议为此使用文件、命名管道或通信设备句柄。使用事件对象更安全,因为在同一文件、命名管道或通信设备上执行多个同步重叠操作时可能会产生混淆。在这种情况下,无法知道是哪个操作导致对象的状态被通知。

原文地址:https://www.cnblogs.com/rosesmall/p/14822139.html