进程间传递数据

来源:互联网 发布:珠海淘宝托管 编辑:程序博客网 时间:2024/05/16 06:04

  1. 通过消息传递

  向另外一个进程发送数据经常用到WM_SETTEXT,但缺点是对方必须有接收对象,如果接收程序是控制台程序就比较麻烦了。这里讨论通过WM_COPYDATA。

  自定义消息也是进程间通信的一种方法,其携带的参数如果是数字则没有问题,如果是指针则因为进程间的‘壁垒’而导致对方接收的指针无效。WM_COPYDATA可以避免这个问题。注意它只能用SendMessage()而不能用PostMessage()。

  (1)发送方

 HWND hwnd=::FindWindow(NULL,"Receiver");
 if(hwnd==NULL)
 {
  AfxMessageBox("没有找到接收窗体");
  return;
 }
 CString msgedit;
 GetDlgItem(IDC_EDIT1)->GetWindowText(msgedit);
 COPYDATASTRUCT data = {0}; 
 data.dwData = (DWORD)this->GetSafeHwnd();
 data.cbData = msgedit.GetLength();
 data.lpData = msgedit.GetBuffer(msgedit.GetLength());
 ::SendMessage(hwnd, WM_COPYDATA, (WPARAM)this->GetSafeHwnd(), (LPARAM)&data);

  (2)接收方

  程序需响应WM_COPYDATA消息。MFC程序中可以通过Class Wizard进行响应。VC可以通过重载消息响应函数响应。主要是3处:

  1)消息映射:

BEGIN_MESSAGE_MAP(CReceiverDlg, CDialog)
 //{{AFX_MSG_MAP(CReceiverDlg)
 ON_WM_COPYDATA()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
  2)函数声明:

 afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
  3)函数主体:

BOOL CDataMsgClientDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
     char msgdata[256]={0};
     DWORD size= pCopyDataStruct->cbData;
     CopyMemory(msgdata,pCopyDataStruct->lpData,size);
     msgdata[size]='\0';
     GetDlgItem(IDC_EDIT1)->SetWindowText(msgdata);
     return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}

  2. 共享内存

  3. 邮槽

  4. 剪切板

  5. 命令行