typedef struct _OVERLAPPED
{
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED;
这个结构体是重叠IO模型的核心,称之为重叠结构
Internal 如果IO发生了错误 那么在这个成员中保存错误码
InternalHigh 完成时这个成员是已经操作的字节数
Offset 文件数据的偏移低32位(4字节)
OffsetHigh 文件数据的偏移高32位(4字节)
hEvent 事件对象句柄
BOOL WriteFile( [in] HANDLE hFile, [in] LPCVOID lpBuffer, [in] DWORD nNumberOfBytesToWrite, [out, optional] LPDWORD lpNumberOfBytesWritten, [in, out, optional] LPOVERLAPPED lpOverlapped );
如果函数成功,则返回值为非零 (TRUE) 。
如果函数失败或异步完成,则返回值为零, (FALSE) 。 若要获取扩展的错误信息,请调用 GetLastError 函数。
注意GetLastError 代码ERROR_IO_PENDING不是失败;它指定写入操作正在异步完成。 有关详细信息,请参阅“备注”。 需要关注WriteFile的返回值,如果是TRUE代表系统很快就可以完成写入文件操作不需要再用重叠IO的方式通知。当返回值是FALSE的时候就需要GetLastError()获取错误码 ,
但在这里当错误码是ERROR_IO_PENDING不代表错误,而是代表系统已经接收了重叠IO的方式异步写入文件。 完成通知:
在重叠IO操作被成功提交后,直到操作完成前,系统会将"文件"句柄置为无信号状态,这意味着可以用wait系列函数去等待。
如:DWORD WINAPI WaitForSingleObject(__in HANDLE hHandle, __in DWORD dwMilliseconds);
//WriteFile返回值判别完成后
//重叠IO ---> 阻塞
WaitForSingleObject(hFile,INFINITE);//一直等到完成
//重叠IO ---> 非阻塞
DWORD ret = WaitForSingleObject(hFile,TIME_OUT);
if(ret == WAIT_OBJECT_0)
{
//完成 处理
}
else if(ret == WAIT_TIMEOUT)
{
//超时时间到
//其他一些操作
}else{}
参考:https://blog.csdn.net/chijiaozhao5384/article/details/101003514
标签:异步,重叠,IO,完成,DWORD,返回值 From: https://www.cnblogs.com/zhangmo/p/17147258.html