進程間通信的四種方式:剪貼板、匿名管道、命名管道和郵槽html
//設置剪切板內容 CString str; this->GetDlgItemText(IDC_EDIT1, str); OpenClipboard();//打開剪貼板查看,並防止其餘應用程序修改剪貼板的內容. EmptyClipboard();//EmptyClipboard Function該函數清空剪切板並釋放剪切板內數據的句柄。函數在以後會將剪切板的全部權指派給當前打開剪切板的窗口。 HANDLE hclip = GlobalAlloc(GMEM_MOVEABLE, str.GetLength() + 1); char *pBuf = (char *)GlobalLock(hclip); //WideCharToMultiByte()//字形轉換 strcpy(pBuf, str.GetBuffer()); //memcpy(pBuf, str.GetBuffer(), GetLength()+2); GlobalLock(hclip); SetClipboardData(CF_TEXT, hclip);//SetClipboardData是把指定數據按照指定格式放入剪切板中 CloseClipboard();//關閉剪貼板,這使其餘窗口或程序能訪問剪貼板。 //得到剪切板內容 OpenClipboard(); if (IsClipboardFormatAvailable(CF_TEXT))//是以NULL結尾的ASCII字符的文本格式,則該函數返回值爲true,不然爲false。 { HANDLE hclip; hclip = GetClipboardData(CF_TEXT);//用來打開剪貼板並獲取剪貼板內容。 char *pBuf = (char *)GlobalLock(hclip); GlobalUnlock(hclip); CString STR; SetDlgItemText(IDC_EDIT1, pBuf); } CloseClipboard(); //參考: //http://bbs.kechuang.org/t/72605 //http://www.cnblogs.com/BoyXiao/archive/2010/12/25/1916677.html
//父進程實現 //建立匿名管道 SECURITY_ATTRIBUTES sa; sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; sa.nLength = sizeof(SECURITY_ATTRIBUTES); if (!CreatePipe(&m_hRead, &m_hWrite, &sa, 0)) { AfxMessageBox(_T("create pipe error")); } //子進程的建立 STARTUPINFO sui; PROCESS_INFORMATION pi; sui.cb = sizeof(STARTUPINFO); ZeroMemory(&sui, sizeof(STARTUPINFO)); sui.dwFlags = STARTF_USESTDHANDLES; sui.hStdInput = m_hRead; sui.hStdOutput = m_hWrite; sui.hStdError = GetStdHandle(STD_ERROR_HANDLE); if (!CreateProcess(_T("../debug/child.exe"), NULL , NULL, NULL, TRUE, 0, NULL, NULL, &sui, &pi )) { AfxMessageBox(_T("建立子進程錯誤")); } //關閉進程 線程計數器 if (pi.hThread) { CloseHandle(pi.hThread); } if (pi.hProcess) { CloseHandle(pi.hProcess); } //發送數據 char buf[] = "this is pipe server"; DWORD dwWrite = 0; if (!WriteFile(m_hWrite, buf, strlen(buf) + 1, &dwWrite, NULL)) { AfxMessageBox(_T("write error parent")); } //接收數據 char buf[128] = {0}; DWORD dwRead = 0; ReadFile(m_hRead, buf, sizeof(buf), &dwRead, NULL ); //子進程實現 //獲取繼承自父進程的匿名管道讀寫句柄 m_hRead = GetStdHandle(STD_INPUT_HANDLE); m_hWrite = GetStdHandle(STD_OUTPUT_HANDLE); //寫入數據 char buf[] = "this is pipe child"; DWORD dwWrite = 0; if (!WriteFile(m_hWrite, buf, strlen(buf) + 1, &dwWrite, NULL)) { AfxMessageBox(_T("write error child")); } //讀取數據 char buf[128] = {0}; DWORD dwRead = 0; ReadFile(m_hRead, buf, sizeof(buf), &dwRead, NULL ); //參考 http://www.cnblogs.com/BoyXiao/archive/2011/01/01/1923828.html
//服務端 //建立命名管 m_hPipe = CreateNamedPipe(_T("\\\\.\\pipe\\mypipe"), PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, /*OVERLAPPED是爲了知足異步實現非阻塞的工能,當鏈接上用事件通知*/ 0, 1, 1024, 1024, 0, NULL); if (m_hPipe == INVALID_HANDLE_VALUE) { return; } //建立事件 HANDLE hEvent; hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!hEvent) { MessageBox(_T("建立事件對象失敗!")); CloseHandle(m_hPipe); m_hPipe = NULL; return; } OVERLAPPED ovlap; ZeroMemory(&ovlap, sizeof(OVERLAPPED)); ovlap.hEvent = hEvent; if (!ConnectNamedPipe(m_hPipe, &ovlap)) { if (ERROR_IO_PENDING != GetLastError()) { MessageBox(_T("等待客戶鏈接失敗!")); CloseHandle(m_hPipe); CloseHandle(hEvent); m_hPipe = NULL; return; } } //重疊操做 if (WAIT_FAILED == WaitForSingleObject(hEvent, INFINITE)) { MessageBox(_T("等待對象失敗!")); CloseHandle(m_hPipe); CloseHandle(hEvent); m_hPipe = NULL; return; } CloseHandle(hEvent); //寫數據 char buf[] = "this is named pipe server"; DWORD dwWrite = 0; WriteFile(m_hPipe, buf, strlen(buf) + 1, &dwWrite, NULL); //讀數據 char buf[128] = {0}; DWORD dwRead = 0; ReadFile(m_hPipe, buf, 128, &dwRead, NULL); //客戶端 //鏈接命名管道 if (!WaitNamedPipe(_T("\\\\.\\pipe\\mypipe"), NMPWAIT_WAIT_FOREVER)) { return; } m_hPipe = CreateFile(_T("\\\\.\\pipe\\mypipe"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //寫入數據 char buf[] = "this is named pipe client"; DWORD dwWrite = 0; WriteFile(m_hPipe, buf, strlen(buf) + 1, &dwWrite, NULL); //讀取數據 char buf[128] = {0}; DWORD dwRead = 0; ReadFile(m_hPipe, buf, 128, &dwRead, NULL); //參考 //http://www.cnblogs.com/BoyXiao/archive/2011/01/02/1924188.html
//服務端 HANDLE hMail = CreateMailslot(_T("\\\\.\\mailslot\\myslot"), 424, MAILSLOT_WAIT_FOREVER, NULL); if (hMail == INVALID_HANDLE_VALUE) { int nRes = GetLastError(); CString str; str.Format(_T("%s"), nRes); AfxMessageBox(str); return; } char buf[424] = {0}; DWORD dwSize = 0; ReadFile(hMail, buf, 424, &dwSize, NULL); CString str; str = buf; MessageBox(str); //客戶端 HANDLE hMailslot; hMailslot = CreateFile(_T("\\\\.\\mailslot\\myslot"), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hMailslot) { MessageBox(_T("打開郵槽失敗!")); return; } char buf[] = "this is mail slot client"; DWORD dwSize = 0; if (!WriteFile(hMailslot, buf, strlen(buf) + 1, &dwSize, NULL)) { MessageBox(_T("寫入郵槽失敗!")); } //http://blog.csdn.net/kylin_p/article/details/5146797 //http://www.cnblogs.com/BoyXiao/archive/2010/12/31/1923462.html //http://www.cnblogs.com/jzincnblogs/p/5192654.html