详细讲解进程间通讯的四种方式 (一)

2014-11-24 02:37:40 · 作者: · 浏览: 5

进程间通讯的四种方式:剪贴板、匿名管道、命名管道和邮槽

第一种:剪贴板
(1)新建一个基于对话框的应用程序,并设置好如下界面:

\

(2)分别编辑发送按钮和接收按钮的代码:
[cpp] void CClipboardDlg::OnBtnSend()
{
// TODO: Add your control notification handler code here
if(OpenClipboard())
{
CString str;
HANDLE hClip;
char *pBuf;
EmptyClipboard();//将剪贴板拥有权设置为当前窗口
GetDlgItemText(IDC_EDIT_SEND,str);
hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);//多分配一个字节,用于放置回车
pBuf=(char *)GlobalLock(hClip);//对一个内存对象加锁并返回内存对象句柄
strcpy(pBuf,str);
GlobalUnlock(hClip);//解锁
SetClipboardData(CF_TEXT,hClip);//放置数据
CloseClipboard();//关闭剪贴板
}
}

void CClipboardDlg::OnBtnRecv()
{
// TODO: Add your control notification handler code here
if(OpenClipboard())
{
//The IsClipboardFormatAvailable function determines whether the clipboard contains data in the specified format
if(IsClipboardFormatAvailable(CF_TEXT))
{
HANDLE hClip;
char *pBuf;
hClip=GetClipboardData(CF_TEXT);
pBuf=(char *)GlobalLock(hClip);//The GlobalLock function locks a global memory object and returns a pointer to the first byte of the object's memory block
GlobalUnlock(hClip);
SetDlgItemText(IDC_EDIT_RECV,pBuf);
CloseClipboard();
}
}
}

void CClipboardDlg::OnBtnSend()
{
// TODO: Add your control notification handler code here
if(OpenClipboard())
{
CString str;
HANDLE hClip;
char *pBuf;
EmptyClipboard();//将剪贴板拥有权设置为当前窗口
GetDlgItemText(IDC_EDIT_SEND,str);
hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);//多分配一个字节,用于放置回车
pBuf=(char *)GlobalLock(hClip);//对一个内存对象加锁并返回内存对象句柄
strcpy(pBuf,str);
GlobalUnlock(hClip);//解锁
SetClipboardData(CF_TEXT,hClip);//放置数据
CloseClipboard();//关闭剪贴板
}
}

void CClipboardDlg::OnBtnRecv()
{
// TODO: Add your control notification handler code here
if(OpenClipboard())
{
//The IsClipboardFormatAvailable function determines whether the clipboard contains data in the specified format
if(IsClipboardFormatAvailable(CF_TEXT))
{
HANDLE hClip;
char *pBuf;
hClip=GetClipboardData(CF_TEXT);
pBuf=(char *)GlobalLock(hClip);//The GlobalLock function locks a global memory object and returns a pointer to the first byte of the object's memory block
GlobalUnlock(hClip);
SetDlgItemText(IDC_EDIT_RECV,pBuf);
CloseClipboard();
}
}
}


第二种:匿名管道
<1>新建一个基于单文档的工程,工程名为"Parent"
(1)添加如下菜单项,并添加命令响应函数 CChildView::OnPipeRead()、CChildView::OnPipeWrite();

\

(2)在CParentView类中添加两个句柄HANDLE hRead 和 HANDLE hWrite,属性设为私有,并在构造函数中进行初始化,在析构函数中释放该句柄
[cpp]
CParentView::CParentView()
{
// TODO: add construction code here
hRead=NULL;
hWrite=NULL;
}

CParentView::~CChildView()
{
if(hRead)
CloseHandle(hRead);
if(hWrite)
CloseHandle(hWrite);
}

CParentView::CParentView()
{
// TODO: add construction code here
hRead=NULL;
hWrite=NULL;
}

CParentView::~CChildView()
{
if(hRead)
CloseHandle(hRead);
if(hWrite)
CloseHandle(hWrite);
}

(3)编写CParentView::OnPipeCreate() 函数,注意用到两个函数CreatePipe(...)和CreateProcess(...)分别用于创建管道和启动子进程。代码如下:
[cpp]
void CParentView::OnPipeCreate()
{
/