进程间通信的四种方式:
1).剪贴板
2).匿名管道
3).命名管道
4).邮槽
1. 剪贴板
剪贴板实际是系统维护管理维护的一块特定的内存区域,当拷贝的时候是一个进程把数据放到这个内存中,粘贴时是把数据从中取出,可能传递到另外一个进程中去.
孙鑫课件中的代码片段.
发送端程序:
void CClipboardDlg::OnBtnSend()
{
if(OpenClipboard()/*打开剪贴板*/)
{
CString str;
HANDLE hClip;
char *pBuf;
/*
只有调用了这个函数,才拥有剪贴板.它清空剪贴板,并且释放当前剪贴板中所有数据的句柄,将剪贴板的所有权,分配给当前打开剪贴板的窗口.剪贴板是所有程序都可以使用的.
*/
EmptyClipboard();
GetDlgItemText(IDC_EDIT_SEND,str);
/*
从堆上分配制定数目的字节,在Win32中没有本地堆和全局堆,更常用heap functions.
如果第一个参数是GMEM_FIX,返回的值实际就是内存地址.
如果是GMEM_MOVEABLE,返回的不是实际内存的地址,而是一个指向进程中句柄表条目的指针,这个条目包含实际分配的内存的指针.
*/
hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);
/*
从一个句柄得到一个指针,它同时堆内存块加锁,锁计数加1
*/
pBuf=(char*)GlobalLock(hClip);
strcpy(pBuf,str);
GlobalUnlock(hClip);
/*
SetClipboardData向剪贴板中输入数据,
*/
SetClipboardData(CF_TEXT,hClip);
CloseClipboard();/*释放剪贴板,很重要!!*/
}
}
接受端程序:
void CClipboardDlg::OnBtnRecv()
{
if(OpenClipboard())
{
/*
通过CF_TEXT等保留字,判断现在剪贴板上是否有你想要的数据
*/
if(IsClipboardFormatAvailable(CF_TEXT))
{
HANDLE hClip;
char *pBuf;
/*
注意,不能再EmptyClipboard(),因为要从剪贴板上获得内容
*/
hClip=GetClipboardData(CF_TEXT);
pBuf=(char*)GlobalLock(hClip);
GlobalUnlock(hClip);
SetDlgItemText(IDC_EDIT_RECV,pBuf);
CloseClipboard();
}
}
}