程序間通訊—MFC三種訊息傳遞資料
阿新 • • 發佈:2019-01-28
MFC訊息型別:訊息字首:wm(系統訊息),rm(註冊訊息),um(自定義訊息)
//自定義訊息 void CServerDlg::OnBnClickedButtonUserMessage() { // TODO: 在此新增控制元件通知處理程式程式碼 UpdateData(TRUE); CWnd* DlgHwnd = FindWindow(NULL,L"Client"); if (DlgHwnd == NULL) { AfxMessageBox(TEXT("No Found")); return; } long ParameterData; ParameterData = m_CEdit_User_Message; DlgHwnd->SendMessage(UM_MSG, NULL, (LPARAM)ParameterData);// 傳送. //UINT message } //註冊訊息 void CServerDlg::OnBnClickedButtonRegisterMessage() { // TODO: 在此新增控制元件通知處理程式程式碼 UpdateData(TRUE); CWnd* DlgHwnd = FindWindow(NULL, L"Client"); if(DlgHwnd == NULL){ AfxMessageBox(TEXT("No Found")); return; } long ParameterData; ParameterData = m_CEdit_Register_Message; DlgHwnd->SendMessage(RM_MSG, NULL, (LPARAM)ParameterData);// 傳送. } //字串訊息:拷貝訊息; void CServerDlg::OnBnClickedButtonCopydataMessage() { // TODO: 在此新增控制元件通知處理程式程式碼 UpdateData(TRUE); CWnd* DlgHwnd = FindWindow(NULL, L"Client"); if (DlgHwnd == NULL) { AfxMessageBox(TEXT("No Found")); //MessageBox(TEXT("No Found")); return; } char* DestinationString = NULL; CStringToChar(&DestinationString, m_CEdit_CopyData_Message); COPYDATASTRUCT ParameterData; // 給COPYDATASTRUCT結構賦值. ParameterData.dwData = 0; ParameterData.cbData = strlen(DestinationString); //注意這裡 ParameterData.lpData = DestinationString; DlgHwnd->SendMessage(WM_COPYDATA, NULL, (LPARAM)&ParameterData);// 傳送. if (DestinationString!=NULL) { delete[] DestinationString; DestinationString = NULL; } } //CString轉單字 BOOL CStringToChar(char** DestinationString, CString& SourceString) { if (SourceString.IsEmpty()) { return FALSE; } int SourceStringLength = SourceString.GetLength(); *DestinationString = (char*)malloc((SourceStringLength * 2 + 1) * sizeof(char)); //CString的長度中漢字算一個長度 if (*DestinationString == NULL) { return FALSE; } USES_CONVERSION; strcpy(*DestinationString, W2A(SourceString.LockBuffer())); SourceString.ReleaseBuffer(); return TRUE; }
void CClientDlg::OnUserReceiveMsg(WPARAM wParam, LPARAM lParam) { m_CEdit_User_Message = long(lParam); // 更新資料. UpdateData(FALSE); } void CClientDlg::OnRegisterReceiveMsg(WPARAM wParam, LPARAM lParam) { m_CEdit_Register_Message = long(lParam); // 更新資料. UpdateData(FALSE); } BOOL CClientDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 m_CEdit_CopyData_Message = (LPSTR)pCopyDataStruct->lpData; m_CEdit_CopyData_Message = m_CEdit_CopyData_Message.Left(pCopyDataStruct->cbData); // 更新資料. UpdateData(FALSE); return CDialogEx::OnCopyData(pWnd, pCopyDataStruct); }
對於自定義訊息,UpdataData(FALSE)更新資料,UpdataData(TRUE)獲得資料
對於註冊訊息,Server端是通過訊息名稱查詢訊息ID,Client端是通過訊息名稱得到訊息ID
對於拷貝訊息,WM_COPYDATA實際上是系統訊息WM的一種
結果:
如圖所示:
第一個長整型資料代表自定義訊息,第二個長整型資料代表註冊訊息,第三個字串資料使用的是Cstring資料,代表拷貝訊息。
其中第二個註冊訊息發生了溢位!(超出long型)