定义一个附加结构
typedef struct _PipeResult
{
   OVERLAPPED Ovlap;          /*重叠IO*/               
   char    szCmd[1024];       /*数据缓冲区*/
   enumPipeType PipeType;     /*类型:1连接,2读取,3写入,4关闭*/
}PipeResult ,*lPipeResult;HANDLE g_Event;               /*事件对象*/void main()
{
/*省略部分代码*/
HANDLE PipeHandles =  CreateFile(...命名管道对象..);  
g_Event = CreateEvent(NULL, TRUE, FALSE, NULL);   
_beginthreadex(NULL,0,pfun,(void*)PipeHandles,0,NULL); /*开始一个工作线程*/

lPipeResult lPipeResult =  new PipeResult(); 
ZeroMemory(&(g_lpResult->Ovlap), sizeof(OVERLAPPED)); 
lPipeResult->Ovlap.hEvent = g_Event;
lPipeResult->PipeType     = PipeWrite;
lPipeResult(lPipeResult->szCmd,"hello");                  
/*写入请求*/
if (WriteFile(PipeHandles,lPipeResult->szCmd,5, NULL,&(lPipeResult->Ovlap)) == 0){
return 0;
}
/*省略部分代码*/
}               
/*工作线程函数*/
UINT WINAPI ReadFileFunc(LPVOID lpParam)
{
HANDLE PipeHandles = (HANDLE)lpParam;
DWORD BytesTransferred;
LPOVERLAPPED Overlapped = new OVERLAPPED();
while (TRUE){
WaitForSingleObject(g_Event,INFINITE);                           
ResetEvent(g_Event);  
GetOverlappedResult(PipeHandles,Overlapped,&BytesTransferred, TRUE); 
lPipeResult lpResult = (lPipeResult)Overlapped;               /*获取附加结构传递数据-根本没取到啊*/
printf("WriteFIle byte=[%d],string=[%s]\n", BytesTransferred,lpResult->szCmd);
}
}
我想通过lPipeResult lpResult = (lPipeResult)Overlapped;    来获取写入的数据值,
但发现取不到,应该怎么样才能取到值呢.附加数据结构到底是怎么使用的啊.我这里怎么没用啊。 

解决方案 »

  1.   

    重叠i/o简单思想:给OVERLAPPED结构体的事件CreateEvent()
    将该OVERLAPPED关连到某个读/写操作上
    然后,用一个等待函数等待OVERLAPPED里事件的触发
    事件触发后,进一步确定读写类型-----------------------------
    理解了重叠i/o的基本思想后,windows下各处的重叠i/o应用都一样
      

  2.   

    你这样带数据应该没什么问题但是GetOverlappedResult(PipeHandles,Overlapped,&BytesTransferred, TRUE);
    传入的应该是你自己的定义的结构 lPipeResult lPipeResult =  new PipeResult(); 
    即GetOverlappedResult(PipeHandles,lPipeResult ,&BytesTransferred, TRUE);你可以试一下
      

  3.   

    楼上的,首先非常感谢你的回帖,
    但我我现在就是一个线程里面不知道lPipeResult指针情况,如果取数据.比如我试过可以定义一个新的
    lPipeResult = new PipeResult();在传进去,但是这样取不到数据啊.
      

  4.   

    仔细看了一下msdn发现在GetOverlappedResult里面
    lpOverlapped 
    [in] Pointer to an OVERLAPPED structure that was specified when the overlapped operation was started. 
    也就是说是输入的值,并不会返回值估计想带数据是不可能了,如果真想带数据的话只能用完成端口了