readfile 重叠IO的怪问题

KevinJHoo 2014-12-02 03:23:59
以前系统是win2003运行没啥问题,后来转win2012了,发现readfile在失败的时候,从GetLastError或取的状态码为ERROR_MORE_DATA,且readfile中收到的具体长度是0。

按网上的说法,说readfile出现ERROR_MORE_DATA后,可能会被后续的readfile读到,不管我是再次循环还是不循环,始终接收到的是ERROR_MORE_DATA这个错误码,且收到的实际数据是0。

...全文
199 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
boygo1982 2014-12-04
  • 打赏
  • 举报
回复
我没有做过您这个类似的项目,所以给个经验性的建议,如果是ERROR_MORE_DATA,而您又读到的是0的话。。那么底层的缓冲区是不是没开啊。。 我做过完成端口的东西,在WSARecv的时候,参数里要设置,挂接一个wsabuf,有人曾经粗心忘记给这个wsabuf申请空间,导致程序一直出现和你一样的状况。
KevinJHoo 2014-12-03
  • 打赏
  • 举报
回复
读取的内容是远程桌面中的虚拟通道。 我确定没有看错哈。返回码为234,就是ERROR_MORE_DATA。 大概代码是这样子的。

BOOL Open(LPCSTR szChannelName,PHANDLE lpHandle)
{
	HANDLE hWTSHandle = NULL;
	HANDLE hWTSFileHandle = NULL;
	PVOID vcFileHandlePtr = NULL;
	BOOL bSucc = FALSE;
	DWORD len;
	
	hWTSHandle = WTSVirtualChannelOpen(
			WTS_CURRENT_SERVER_HANDLE,
			WTS_CURRENT_SESSION,
			(LPSTR)szChannelName
			);

	bSucc = WTSVirtualChannelQuery(
                    hWTSHandle,
                    WTSVirtualFileHandle,
                    &vcFileHandlePtr,
                    &len );

	if(bSucc)
	{
			hWTSFileHandle = *(HANDLE *)vcFileHandlePtr;

			DuplicateHandle(
				GetCurrentProcess(),
				hWTSFileHandle,
				GetCurrentProcess(),
				lpHandle,
				0,
				FALSE,
				DUPLICATE_SAME_ACCESS 
				);
	}
		
	if(vcFileHandlePtr)
	{
		WTSFreeMemory( vcFileHandlePtr );
		vcFileHandlePtr = NULL;
	}
	if(hWTSHandle != NULL)
	{
		WTSVirtualChannelClose( hWTSHandle );
	}

	return bSucc;
}
这个函数第二个参数,会返回一个lpHandle值,就是句柄。后面的readfile以此句柄为基础进行操作了。
vocanicy 2014-12-03
  • 打赏
  • 举报
回复
你读取的是文件,还是管道、串口什么的? 另外怀疑你是不是把ERROR_NO_DATA错看成ERROR_MORE_DATA

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧