***************************************************
判断是否有可利用的命名管道实例
************************************************************/
if(!WaitNamedPipe("\\\\.\\pipe\\MyPipe",NMPWAIT_WAIT_FOREVER))
{
MessageBox("当前没有可利用的命名管道实例");
return;
}
/**********************************************************
打开命名管道
************************************************************/
hPipe=CreateFile("\\\\.\\pipe\\MyPipe",GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (INVALID_HANDLE_VALUE==hPipe)
{
MessageBox("打开管道失败!");
hPipe=NULL;
return;
}
(2)往管道进行读写操作
void CNamedPipeCltView::OnPipRead()
{
// TODO: Add your command handler code here
char buf[200];
DWORD dwRead;
if(!ReadFile(hPipe,buf,200,&dwRead,NULL))
{
MessageBox("读取匿名管道失败!");
return;
}
MessageBox(buf);
}
void CNamedPipeCltView::OnPipWrite()
{
// TODO: Add your command handler code here
char buf[]="乘风736博客园 http://www.cnblogs.com/chengfeng736";
DWORD dwWrite;
if(!WriteFile(hPipe,buf,strlen(buf)+1,&dwWrite,NULL))
{
MessageBox("写匿名管道失败!");
return;
}
}
运行结果如下:

这样,一个通过命名管道进行通信的服务器和客户端程序就设计好了。两个进程就可以实现通信了。
二 、邮槽
邮槽是基于广播模式的单向通信方式,服务器只能从邮槽读取数据,客户端只能往邮槽写入数据,而且利用邮槽通信的信息量不能太大。下面介绍利用邮槽进行进程通信的过程:
(一)服务器
(1)创建油槽
创建油槽可调用CreateMailslot()函数实现,该函数的第一个参数按照指定格式指定油槽的名字,第三个参数指定读操作等待的时间。下面的示例程序我设定读操作一直等待(MAILSLOT_WAIT_FOREVER),只到接收到数据为止。示例代码如下:
HANDLE hMailslot;
hMailslot=CreateMailslot("\\\\.\\mailslot\\MyMailslot",0,MAILSLOT_WAIT_FOREVER,NULL);
if (INVALID_HANDLE_VALUE==hMailslot)
{
MessageBox("创建邮槽失败!");
CloseHandle(hMailslot);
return;
}
(2)读取数据
DWORD dwRead;
char buf[200];
if(!ReadFile(hMailslot,buf,200,&dwRead,NULL))
{
MessageBox("读取数据失败!");
CloseHandle(hMailslot);
return;
}
MessageBox(buf);
CloseHandle(hMailslot);
(二)客户端
(1)打开油槽
CreateFile()函数不仅可以打开文件、管道还可以打开油槽。示例代码如下:
HANDLE hMailslot;
hMailslot=CreateFile("\\\\.\\mailslot\\MyMailslot",GENERIC_WRITE,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (INVALID_HANDLE_VALUE==hMailslot)
{
MessageBox("打开邮槽失败!");
CloseHandle(hMailslot);
return;
}
(2)写入数据
char buf[]="使用邮槽进行进程间通信\r\n乘风736博客园 http://www.cnblogs.com/chengfeng736";
DWORD dwWrite;
if(!WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,0))
{
MessageBox("写入数据失败!");
CloseHandle(hMailslot);
return;
}
CloseHandle(hMailslot);
运行结果如下:

使用油槽通信的实现是很简单的。油槽只能单向通信,如果要实现双向通信,可以在客户端和服务器分别实现读写操作就可以了