《进程间通信方式》由会员分享,可在线阅读,更多相关《进程间通信方式(9页珍藏版)》请在金锄头文库上搜索。
1、一一 利用剪贴板进行进程间通信利用剪贴板进行进程间通信void CClipboardDlg:OnBtnSend() / TODO: Add your control notification handler code here if(OpenClipboard() /打开剪贴板 EmptyClipboardEmptyClipboard(); /释放剪贴板中数据的句柄并分配剪贴板所有权给当 前窗口CString str;HANDLE hClip;char *pBuf;GetDlgItemText(IDC_EDIT_SEND,str);hClip=GlobalAllocGlobalAlloc(GM
2、EM_MOVEABLE,str.GetLength()+1); /从堆中分配 指定字节的内存pBuf=(char*)GlobalLock(hClip); /对全局内存对象加锁,并将句柄转 换为指针strcpy(pBuf,str);GlobalUnlock(hClip); /解锁SetClipboardDataSetClipboardData(CF_TEXT,hClip); /以指定的格式在剪贴板上放置数 据CloseClipboard(); /关闭剪贴板 void CClipboardDlg:OnBtnRecv() / TODO: Add your control notification h
3、andler code here if(OpenClipboard() if(IsClipboardFormatAvailableIsClipboardFormatAvailable(CF_TEXT) /检测剪贴板是否包含指定 格式的数据HANDLE hClip;hClip=GetClipboardDataGetClipboardData(CF_TEXT); /从剪贴板中获取指定格式的数据char *pBuf;pBuf=(char*)GlobalLock(hClip); /将句柄转换为地址GlobalUnlock(hClip);SetDlgItemText(IDC_EDIT_RECV,pBuf
4、);CloseClipboard(); 二二 利用匿名管道进行进程间通信利用匿名管道进行进程间通信( (匿名管道只能在父匿名管道只能在父子进程间通信子进程间通信) )父进程父进程void CParentView:OnPipeCreate() / TODO: Add your command handler code here SECURITY_ATTRIBUTES sa; sa.bInheritHandle=TRUE; sa.lpSecurityDescriptor=NULL; sa.nLength=sizeof(SECURITY_ATTRIBUTES);if(!CreatePipeCreat
5、ePipe(return; STARTUPINFO sui; ZeroMemory( sui.cb=sizeof(STARTUPINFO); sui.dwFlags=STARTF_USESTDHANDLES; sui.hStdInput=hRead; sui.hStdOutput=hWrite; sui.hStdError=GetStdHandle(STD_ERROR_HANDLE);PROCESS_INFORMATION pi;if(!CreateProcess(“.ChildDebugChild.exe“,NULL,NULL,NULL,TRUE,0,NULL,NULL,CloseHandl
6、e(hWrite);hRead=NULL;hWrite=NULL;MessageBox(“创建子进程失败!“);return; else CloseHandle(pi.hProcess);CloseHandle(pi.hThread); void CParentView:OnPipeRead() / TODO: Add your command handler code here char buf100; DWORD dwRead; if(!ReadFileReadFile(hRead,buf,100,return; MessageBox(buf); void CParentView:OnPi
7、peWrite() / TODO: Add your command handler code here char buf=“武汉科技大学黄家湖校区“; DWORD dwWrite; if(!WriteFileWriteFile(hWrite,buf,strlen(buf)+1,return; 子进程子进程void CChildView:OnInitialUpdate() CView:OnInitialUpdate();/ TODO: Add your specialized code here and/or call the base class hRead=GetStdHandle(STD
8、_INPUT_HANDLE); hWrite=GetStdHandle(STD_OUTPUT_HANDLE); void CChildView:OnPipeRead() / TODO: Add your command handler code here char buf100; DWORD dwRead; if(!ReadFile(hRead,buf,100,return; MessageBox(buf); void CChildView:OnPipeWrite() / TODO: Add your command handler code here char buf=“匿名管道测试程序“;
9、 DWORD dwWrite; if(!WriteFile(hWrite,buf,strlen(buf)+1,return; 三三 利用命名管道进行进程间通信利用命名管道进行进程间通信服务端进程服务端进程void CNamedPipeSrvView:OnPipeCreate() / TODO: Add your command handler code here hPipe=CreateNamedPipeCreateNamedPipe(“.pipeMyPipe“,PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,0,1,1024,1024,0,NULL); /
10、创建命名管道的实例并返回句柄 if(INVALID_HANDLE_VALUE=hPipe) MessageBox(“创建命名管道失败!“);hPipe=NULL;return; HANDLE hEvent; hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); if(!hEvent) MessageBox(“创建事件对象失败!“);CloseHandle(hPipe);hPipe=NULL;return; OVERLAPPED ovlap; ZeroMemory( ovlap.hEvent=hEvent; if(!ConnectNamedPipeConnectNa
11、medPipe(hPipe,CloseHandle(hPipe);CloseHandle(hEvent);hPipe=NULL;return; if(WAIT_FAILED=WaitForSingleObject(hEvent,INFINITE) /等待事件对象 变为有信号状态 MessageBox(“等待对象失败!“);CloseHandle(hPipe);CloseHandle(hEvent);hPipe=NULL;return; CloseHandle(hEvent); void CNamedPipeSrvView:OnPipeRead() / TODO: Add your comman
12、d handler code here char buf100; DWORD dwRead; if(!ReadFile(hPipe,buf,100,return; MessageBox(buf); void CNamedPipeSrvView:OnPipeWrite() / TODO: Add your command handler code here char buf=“武汉科技大学黄家湖校区“; DWORD dwWrite; if(!WriteFile(hPipe,buf,strlen(buf)+1,return; 客户端进程客户端进程void CNamedPipeCltView:OnP
13、ipeConnect() / TODO: Add your command handler code hereif(!WaitNamedPipeWaitNamedPipe(“.pipeMyPipe“,NMPWAIT_WAIT_FOREVER) /等待 命名管道的实例可用 MessageBox(“当前没有可利用的命名管道实例!“);return; hPipe=CreateFile(“.pipeMyPipe“,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); /打开命名管 道 if(INVA
14、LID_HANDLE_VALUE=hPipe) MessageBox(“打开命名管道失败!“);hPipe=NULL;return; void CNamedPipeCltView:OnPipeRead() / TODO: Add your command handler code here char buf100; DWORD dwRead; if(!ReadFile(hPipe,buf,100,return; MessageBox(buf); void CNamedPipeCltView:OnPipeWrite() / TODO: Add your command handler code
15、here char buf=“命名管道测试程序“; DWORD dwWrite; if(!WriteFile(hPipe,buf,strlen(buf)+1,return; 四四 利用邮槽进行进程间通信利用邮槽进行进程间通信服务端进程void CMailslotSrvView:OnMailslotRecv() / TODO: Add your command handler code here HANDLE hMailslot; hMailslot=CreateMailslotCreateMailslot(“.mailslotMyMailslot“,0,MAILSLOT_WAIT_FOREVER,NULL); /创建邮槽 if(INVALID_HANDLE_VALUE=hMailslot) MessageBox(“创建邮槽失败!“);return; char buf100; DWORD dwRead; if(!ReadFile(hMailslot,buf,100,CloseHandle(hMailslot);return; MessageBox(buf); CloseHandle(hMailslot); 客户端进程客户端进程void CMailslo