VC跨进程数据(结构体)传递-WM_COPYDATA

两个测试程序,都是MFC基于对话框的应用程序,一个是发送者,一个是接收者。

两个程序都使用同一个结构体:

typedef struct  
{
	char imsi[20];
	char options[512];
}_tagResult;

发送者

VC跨进程数据(结构体)传递-WM_COPYDATA_第1张图片

按钮点击事件:

void CCardXSenderDlg::OnButton1() 
{
	HWND hwnd = ::FindWindow(NULL, "CardXApp");
	if(hwnd)
	{
		static _tagResult result;
		static COPYDATASTRUCT sendData;

		ZeroMemory(&result, sizeof(_tagResult));
		strcpy(result.imsi, "result_imsi0");
		strcpy(result.options, "result_options0");

		ZeroMemory(&sendData, sizeof(sendData));
		sendData.lpData = &result;
		sendData.cbData = sizeof(result);

		::SendMessage(hwnd, WM_COPYDATA, NULL, (LPARAM)&sendData);
//		::PostMessage(hwnd, WM_COPYDATA, NULL, (LPARAM)&sendData);	// can't use ::PostMessage()
	}
}

接收者就是一个 WM_COPYDATA的实现函数

BOOL CCardXAppDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
{
	CString msg;
	_tagResult result;
	
	memcpy(&result, pCopyDataStruct->lpData, sizeof(result));
	
	msg.Format("imsi=[%s], options=[%s]", result.imsi, result.options);
	MessageBox(msg);
	
	return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}

完成了上面的工作就可以测试了,只要点击发送者的按钮,接收端就可以接收到发过来的消息了。

注意:发送WM_COPYDATA消息时,必须使用SendMessage,不能使用PostMessage,否则接收端会收不到消息的。

你可能感兴趣的:(VC跨进程数据(结构体)传递-WM_COPYDATA)