APC简介:APC
附: 套接字中的WSAOVERLAPPED 和 OVERLAPPED 是一个东西.
OVERLAPPED 中的InternalHigh 用于显示当前读取了多少字节. Internal 用于显示错误信息, 0 即无错误;
GetOverlappedResult 返回的字节以及错误都是根据 OVERLAPPED 结构中的字段来提取的.
这也是为什么GetOverlappedResult 需要的OVERLAPPED结构是一开始初始化的那个
同时也是为什么每个io操作都需要唯一一份OVERLAPPED.
注意: 如果想要复用OVERLAPPED结构(即在一次操作完成之后) . 一定要memset OVERLAPPED ,让其内部清0 .因为内部还
残留上一次操作的记录;
第一个例子. 第二个例子使用APC 来解决一些问题
/*
首先使用 OVERLAPPED 结构, 其中有Event 对象, 可用可不用,这个例子先不用
CreateFile 其中一个参数使用 FILE_FLAG_OVERLAPPED
ReadFile 默认同步, 在最后一个参数使用 OVERLAPPED ;
ReadFile 返回TRUE ,则代表已经读完了
否则应该检查 GetLastError , 系统是否为此安排了等待.
如果 GetLastError == ERROR_IO_PENDING ,则成功了, 等着取数据, 否则失败
之后可以使用 GetOverlappedResult(最后一个参数为TRUE) / WaitForSingObject 来等待直到完成;
*/
void read_overlapped(const TCHAR * path)
{
//这里没有使用其中的 Event 对象.
OVERLAPPED overlap = {0};
DWORD bytesReaded = 0;
BOOL ret = FALSE;
char * buf = new char[8196 * 10];
// 注意:FILE_FLAG_OVERLAPPED
HANDLE hFile = CreateFile(path,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_OVE