VC進程間通信方法之一

編寫的一個監控程序,需要監視另外一個程序的運行狀況

參考了:http://blog.csdn.net/mail_cm/article/details/7902904

之中的WM_COPYDATA方式,只是把過程詳細了一下,同時改正了裏面的一些不兼容的問題


首先創建一個對話框程序-基於對話框-項目名DataSend

添加一個Edit控件,併爲這個控件添加一個CString類型的成員變量m_strCopyData

添加一個Button控件,並編寫響應函數如下:(這個按鈕的ID設置爲:IDC_BUTTON_Send)

void CDataSendDlg::OnBnClickedButtonSend()
{
	// TODO: 在此添加控件通知處理程序代碼
	UpdateData();                                       // 更新數據
	CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv"));    // 查找DataRecv進程
	if(pWnd==NULL){
		MessageBox(_T("Unable to find DataRecv."));
		return;
	}
	COPYDATASTRUCT cpd;                     // 給COPYDATASTRUCT結構賦值
	cpd.dwData = 0;
	cpd.cbData = (m_strCopyData.GetLength()+1) * sizeof(TCHAR);
	cpd.lpData = (void*)m_strCopyData.GetBuffer(cpd.cbData);
	pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);   // 發送
}


這裏尤其要注意cpd.cbData的字符長度的那句話,一方面要+1,另一方面要*sizeof(TCHAR)

這樣才能在unicode字符集下正常使用

然後創建另一個對話框程序-基於對話框-項目名DataRecv


一方面要在這個項目的DataRecvDlg.cpp文件中的消息映射段增加一個響應函數:

BEGIN_MESSAGE_MAP(CDataRecvDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_COPYDATA()//這個是我們增加的
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
其次要在頭文件中增加一個聲明:

BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);

並將這個函數在cpp中定義:

// 手動增加的函數
BOOL CDataRecvDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
	m_strRecvData = (LPTSTR)(pCopyDataStruct->lpData);
	// 獲得實際長度的字符串
	m_strRecvData = m_strRecvData.Left(pCopyDataStruct->cbData);
	// 更新數據
	UpdateData(FALSE);
	return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
其中m_strRecvData這個成員變量屬於向這個對話框中添加的Edit控件!

這樣,二者之間就能夠實現正常通信了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章