1. 程式人生 > >程序間通訊—MFC三種訊息傳遞資料

程序間通訊—MFC三種訊息傳遞資料



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型)