C++ 进程间通讯

当一个进程启动的时候.操作系统会为这个进程分配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.邮槽

你可能感兴趣的:(C/C++)