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. 命令行