命名管道问题?????
我想利用命名管道实现进程之间的通信.
B满足条件的时候,发送数据,此时A监视到有连接.则读出数据
也就是说B需要多次发送,发送完以后,要断开连接,下次发送再连接,
我在A中建立了一个辅助线程,用来监视连接请求.
但是在B中调用CreateFile的时候出现异常,请问这是问什么????
B中发送函数
Fun1()
{
if(!WaitNamedPipe("\\\\.\\pipe\\TestPipe",NMPWAIT_WAIT_FOREVER))
{
MessageBox("当前没有可利用的命名管道实例!");
return;
}
hPipe=CreateFile("\\\\.\\pipe\\TestPipe",GENERIC_READ | GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==hPipe)
{
MessageBox("打开命名管道失败!");
hPipe=NULL;
return;
}
char buf[]="";
CString str;
DWORD dwWrite;
str.Format("编号%d",rand()%1000);
strcpy(buf,str);
if(!WriteFile(hPipe,buf,strlen(buf)+1,&dwWrite,NULL))
{
MessageBox("写入数据失败!");
return;
}
CloseHandle(hPipe);
}
A程序 在一个辅助线程里面
DWORD WINAPI ThreadProc( LPVOID lpParameter)
{
CSendTestDlg *pDlg=(CSendTestDlg*)lpParameter;
hPipe=CreateNamedPipe("\\\\.\\pipe\\TestPipe",
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
0,1,1024,1024,0,NULL);
if(INVALID_HANDLE_VALUE==hPipe)
{
AfxMessageBox("创建命名管道失败!");
hPipe=NULL;
return 0;
}
HANDLE hEvent;
hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(!hEvent)
{
AfxMessageBox("创建事件对象失败!");
CloseHandle(hPipe);
hPipe=NULL;
return 0;
}
while (true) //不停的监视是否有发送连接管道.(B使用CreateFile则触发)
{
OVERLAPPED ovlap;
ZeroMemory(&ovlap,sizeof(OVERLAPPED));
ovlap.hEvent=hEvent;
if(!ConnectNamedPipe(hPipe,&ovlap))
{
if(ERROR_IO_PENDING!=GetLastError())
{
AfxMessageBox("等待客户端连接失败!");
CloseHandle(hPipe);
CloseHandle(hEvent);
hPipe=NULL;
continue;
}
}
if(WAIT_FAILED==WaitForSingleObject(hEvent,INFINITE))
{
AfxMessageBox("等待对象失败!");
CloseHandle(hPipe);
CloseHandle(hEvent);
hPipe=NULL;
break;
}
Sleep(1000);//等待让A写入数据
char buf[100];
DWORD dwRead;
if(ReadFile(hPipe,buf,100,&dwRead,NULL))
{
pDlg->SetWindowText(buf);
}
DisconnectNamedPipe(hPipe); //断开
}
CloseHandle(hEvent);
return 0;
}