《VC++深入详解–学习笔记》(17)进程间通信

Filed Under (VC++ 学习笔记) by panmaoru on 23-12-2009

当一个进程启动后,操作系统为其分配4GB的私有地址空间,位于同一个进程中的线程共享同一个地址空间。然而由于每个进程所拥有的4GB的地址空间都是私有的,一个进程不能访问另外一个进程的地址空间的数据,因此进程之间的通信相对比较困难。本章将介绍下列4中进程通信的方式:

  • 剪贴板
  • 匿名通道
  • 命名通道
  • 邮槽

17.1剪贴板

当我们在一个程序中复制一份数据之后,可以将数据粘贴到另外一个应用程序中,这就是2个进程利用剪贴板实现诗词数据传输。剪贴板实际上是系统维护管理的一块内存区域,当在一个进程中复制数据时,这个份数据被放到该内存区域中,当执行粘帖操作时,从该内存区域中取出数据,然后显示出来。

将数据粘帖上剪切板时,首先要打开剪贴板。

BOOL OpenClipBoard();

当打开剪贴板成功,完成操作之后,需要关闭剪贴板CloseClipBoard(),以便其他程序调用。在系统系统中之后一块剪贴板区域,如果当前拥有者不关闭剪贴板,其他进程则无法获取到。手动将编辑框內数据复制到剪贴板的示例:

void CClipDlg::OnButton1()

{

       // TODO: Add your control notification handler code here

       if(OpenClipboard())

       {

              CString str;//用来存放将要放到剪贴板上的数据

              HANDLE hClip;//保存GlobalAlloc动态分配的内存对象的句柄

              char *pBuf;//保存调用GlobalLock函数返回的地址

              EmptyClipboard();//清空剪贴板

              GetDlgItemText(IDC_EDIT1,str);//获取编辑框的内容,保存到str

              hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);//动态分配内存,返回对象句柄

              pBuf=(char*)GlobalLock(hClip);//对内存对象加锁,返回地址

              strcpy(pBuf,str);//将str对象中的数据拷贝到pBuf指向的地址空间

              GlobalUnlock(hClip);//解锁

              SetClipboardData(CF_TEXT,hClip);//以指定的剪贴板格式项剪贴板上存放数据

              CloseClipboard();//关闭剪贴板

       }

}

其中GlobalAlloc动态分配一块内存区域的参数有几种默认类型,MSDN中给出了详细的说明。

调用剪贴板上的数据,显示到一个编辑框上。

void CClipDlg::OnButton2()

{

       // TODO: Add your control notification handler code here

       if(OpenClipboard())

       {

              if(IsClipboardFormatAvailable(CF_TEXT))

              {

                     HANDLE hClip;

                     char * pBuf;

                     hClip=GetClipboardData(CF_TEXT);

                     pBuf=(char*)GlobalLock(hClip);

                     GlobalUnlock(hClip);

                     SetDlgItemText(IDC_EDIT2,pBuf);

              }

       }    

}

17.2匿名管道

匿名管道是一个未命名的、单向管道,通常用来在一个父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上的两个进程间的通信,而不能实现跨网络通信。

17.3命名管道

命名管道通过网络来实现进程间的通信,它屏蔽了底层的网络协议细节,在不了解网络协议的情况下也可以利用命名管道来实现进程间的通信。命名管道不仅可以在本机上实现2个进程之间的通信,还可以跨网络实现2个进程的通信。

17.4邮槽

邮槽式基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。邮槽是一种单向的通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户端进程写入数据。为了使邮槽在各种Windows平台下运行,传输消息的时候,应该将消息的长度限制在424字节以下。

PS:后三个例子代码写不贴了。

Post a comment