现在的位置: 首页 > 综合 > 正文

进程间通信-剪贴板 z

2014年03月20日 ⁄ 综合 ⁄ 共 1445字 ⁄ 字号 评论关闭

进程间通信的四种方式:

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();

              }

       }

}

抱歉!评论已关闭.