C++ 进程间通讯

来源:互联网 发布:百度ps软件下载 编辑:程序博客网 时间:2024/06/14 00:03
当一个进程启动的时候.操作系统会为这个进程分配4GB的私有地址空间供这个进程使用.在一个进程中的多个线程,共享同一个地址空间.因此线程间的通讯非常简单.而因为每个进程拥有的4GB内存空间都是私有的.一个进程不能访问另一个进程地址中的数据.因此进程间的通讯相对就困难一些.在windows平台下.系统给我们提供了多种进程间通讯的机制.

进程间通讯的四种方试:
1.剪切板
    剪切板实际上是系统维护管理的一块内存区域.当你在一个进程中复制数据的时候,实际上是把数据放到了这块内存中,

在另一个进程中,当我们粘贴数据的时候.是从这块内存区域中取出数据.然后显示在窗口上.

void CClipboardDlg::OnBnClickedBtnSend(){//判断能不能打开剪切板.不能反回0, 如果能则反回非0值.if(OpenClipboard()){ CString str;TCHAR *pBuf;HANDLE hClip;EmptyClipboard();//清空剪切板,并把当前窗口设置为剪切板的所有者.GetDlgItemText(IDC_EDIT_SEND, str);//分配一个内存对象.参数1:类型, 参数2:分配的字节长度.//类型为:GMEM_MOVEABLE 返回指像进程中句柄表条目的指针, GMEM_FIXED返回实际分配内存地址.hClip = GlobalAlloc(GMEM_MOVEABLE, str.GetLength() * 2 + 2);//锁定全局句柄内存块,并把句柄转换为指针.pBuf = (TCHAR *)GlobalLock(hClip);_tcscpy(pBuf, str);//放置即将传送的数据GlobalUnlock(hClip);//对全局句柄对象解锁.//参数:1.指定一种剪切板格式, 2.数据内存地址句柄.//CF_UNICODETEXT:UNICODE文本格式.SetClipboardData(CF_UNICODETEXT, hClip);//关闭剪切板.否则其他进程无法打开剪切板CloseClipboard();}}void CClipboardDlg::OnBnClickedBtnRecv(){//判断能不能打开剪切板.不能反回0, 如果能则反回非0值.if(OpenClipboard()){//验证剪切板内是否有可用数据.是:非零,否零.if(IsClipboardFormatAvailable(CF_UNICODETEXT)){//定义一个句柄变量.HANDLE hClip;//接收数据的BUF.TCHAR *pBuf;//从剪切板中获取指定格式的数据.hClip = GetClipboardData(CF_UNICODETEXT);//锁定内存块,并把句柄转换为指针.pBuf = (TCHAR *)GlobalLock(hClip);SetDlgItemText(IDC_EDIT_RECV, pBuf);//关闭剪切板.否则其他进程无法打开剪切板.CloseClipboard();}}}

区域的内容.
2.匿名管道.
3.命名管道.
4.邮槽