MFC多进程的创建及通信

本例演示在MFC中使用多进程。创建两个进程,并实现两者间的通信分别为第一部分仅发送消息,第二部分使用WM_COPYDATA消息实现传输内容(MFC多进程间使用WM_COPYDATA消息进行通信)。第三部分使用内存共享的方式实现数据传输(MFC多进程间使用内存共享消息进行数据传输)。
演示系统为Win10,平台为VS2017(MFC)。

第一部分:

1.使用VS2017搭建基于对话框的MFC应用程序,名为“MainProcess”。并放置一个EDIT控件和两个BUTTON控件并将对话框Caption命名为“MainProcess”,如图。
MFC多进程的创建及通信_第1张图片
2.右键“解决方案“MainProcess””->添加->新建项目
MFC多进程的创建及通信_第2张图片
3.选择“MFC应用程序”并命名为“ChildProcess
在这里插入图片描述
4.打开ChildProcess的对话框编辑页,添加一个EDIT控件并将对话框Caption命名为“ChildProcess”
MFC多进程的创建及通信_第3张图片
5. 右键“解决方案“MainProcess””->属性->启动项目,选择单项目启动“MainProcess”
6.在MainProcessDlg.cpp实现文件中添加宏定义:

//自定义用户消息
#define WM_MYMESSAGE WM_USER + 1

7.双击MainProcessDlg按钮添加按钮响应函数:

//启动子程序按钮响应函数
void CMainProcessDlg::OnBnClickedButton1()
{
	PROCESS_INFORMATION pi = { 0 };//进程信息结构
	STARTUPINFO si = { 0 };//启动信息结构
	si.cb = sizeof(si);
	si.wShowWindow = SW_SHOW;//显示窗口
	si.dwFlags = STARTF_USESHOWWINDOW;//启动标志,显示窗口
	::CreateProcess(
		TEXT("F:/Test/MainProcess/Debug/ChildProcess.exe"),//可执行文件(exe)或模块路径
		nullptr,//命令行参数 
		nullptr,//默认进程安全性 
		nullptr,//默认线程安全性
		FALSE,  //指定当前进程内局部不可以被子进程继承 
		CREATE_DEFAULT_ERROR_MODE,      //创建进程的标志,这里设为0,不需要
		nullptr,//使用本进程的环境变量
		nullptr,//使用本进程的驱动器和目录
		&si, &pi);
}
//发送指令按钮
void CMainProcessDlg::OnBnClickedButton2()
{
	HWND hWnd = ::FindWindow(_T("#32770"), _T("ChildProcess"));//目标进程的窗口类名(可通过Spy++工具查看)和窗口名
	if (NULL != hWnd)
	{
		::PostMessage(hWnd, WM_MYMESSAGE, NULL, NULL);//发送用户消息
		SetDlgItemText(IDC_EDIT1, _T("指令1已发送!"));
	}
}

8.在ChildProcessDlg.h头文件里添加函数声明:

protected:
afx_msg LRESULT OnMyMessage(WPARAM wp, LPARAM lp);

9.在ChildProcessDlg.cpp实现文件中添加自定义消息宏定义:

#define WM_MYMESSAGE WM_USER + 1

10.在ChildProcessDlg.cpp实现文件中添加自定义消息处理声明:

BEGIN_MESSAGE_MAP(CChildProcessDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)//只添加这一句,其他为示意位置
END_MESSAGE_MAP()

11.最后在ChildProcessDlg.cpp实现文件末尾添加自定义消息响应函数:

LRESULT CChildProcessDlg::OnMyMessage(WPARAM wp, LPARAM lp)
{
	SetDlgItemText(IDC_EDIT1, _T("收到指令1"));
	return 0;
}
  1. 右键“解决方案“下的“ChildProcess”->生成
    MFC多进程的创建及通信_第4张图片
    13.编译运行,先点击“启动子进程”,可以看到“ChildProcess.exe”被启动,点击“发送指令”,可以看到子进程对话框上显示。
    MFC多进程的创建及通信_第5张图片
    14.注意:修改ChildProcess后需要重新生成项目解决方案。另外PostMessge或者SendMessage()实现进程间通讯只能发生消息而不能发生内容,由于两个进程使用的是相互独立的两个虚拟内存空间,同一地址对不同的进程来说并不一定指向同一物理内存,内容也就不一定一样,因此不同进程无法通过传地址的方式传递字符串。

你可能感兴趣的:(MFC)