操作系统——MFC实现进程创建和通信2

这篇具有很好参考价值的文章主要介绍了操作系统——MFC实现进程创建和通信2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引入

我接着上篇博客讲,如果没有构建项目的童鞋请移步到操作系统——MFC实现进程创建和通信1
实现进程通信的方法有很多,我们先用一个比较简单的方法实现一下。

用PosMessage方法通信

通信原理

window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。

从广义上讲,一个窗口可以获得对另一个窗口的引用(比如 targetWindow = window.opener),然后在窗口上调用 targetWindow.postMessage() 方法分发一个 MessageEvent 消息。接收消息的窗口可以根据需要自由处理此事件 (en-US)。传递给 window.postMessage() 的参数(比如 message )将通过消息事件对象暴露给接收消息的窗口。
大家可以看看官方的API文档,那个比较准确。Window.PostMessage

1、定义用户消息

在MFCApplication1Dlg.cpp和chileProcessDlg.cpp中分别添加宏定义消息,这个消息支持着两个进程的PostMessage通信。如果没有一个共同定义的宏变量,就需要加上一个窗口对另一个窗口的引用,为了方便就这么设计了~

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

mfcapplication是什么进程,操作系统,mfc,microsoft,c++

2、Mainapp中处理消息

在资源视图中双击(通过PostMessage)的button,跳转到button点击事件的处理程序中添加以下的代码:

void CMFCApplication1Dlg::OnBnClickedOk3()
{
	HWND hWnd = ::FindWindow(_T("#32770"), _T("ChildProcess"));//目标进程的窗口类名(可通过Spy++工具查看)和窗口名
	if (NULL != hWnd)
	{
		::PostMessage(hWnd, WM_MYMESSAGE,NULL, NULL);//发送用户消息
		SetDlgItemText(IDC_EDIT1, _T("PostMessage已发送!"));

	}
}

真正有用的其实就一句

::PostMessage(hWnd, WM_MYMESSAGE,NULL, NULL);//发送用户消息

这句话将消息WM_MYMESSAGE发送到了hwind中;
hwind是调用的查找函数找到名为ChildProcess的窗口就返回了。
然后我们如果找到了这个窗口就发送消息并且在本窗口中打印一句"PostMessage已发送!"
大家可以将文本框内容作为一个消息,双方定义一个Cstring接收一下就行了,这里我没有get文本框去获取内容

3、编译childProcessDlg.cpp

接下来我们再来处理一下接收消息的内容

在ChildProcessDlg.h里添加接受的函数声明:

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

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

BEGIN_MESSAGE_MAP(CChileProcessDlg, CDialogEx)
	/**
	这些是框架自带的一些消息处理程序,都是空的,有兴趣的童鞋可以去了解复写一下,不用自己写接口应该用起来也方便。
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	*/
	ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)//只添加这一句,其他为示意位置
	/**
	这些是我们之后要处理的消息声明
	ON_EN_CHANGE(IDC_EDIT1, &CChileProcessDlg::OnEnChangeEdit1)
	ON_WM_COPYDATA()
	ON_BN_CLICKED(IDC_BUTTON1, &CChileProcessDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CChileProcessDlg::OnBnClickedButton2)
	*/
END_MESSAGE_MAP()

在在ChildProcessDlg.cpp中添加自定义消息响应函数定义

LRESULT CChileProcessDlg::OnMyMessage(WPARAM wp, LPARAM lp)
{
	SetDlgItemText(IDC_EDIT1, _T("收到PostMessage"));
	/*
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
	pEdit->SetSel(-1);
	pEdit->ReplaceSel(_T("\r\n\n这是第1个子进程\r\n"));
	*/
	return 0;
}

我是直接在函数里面写上一个打印让自己看看有消息回复就行了,表示有WPARAM的参数传进来了。

4、重新生成childProcess项目

右键点击childProcess项目,重新生成一下 子窗口项目
重新生成之后.exe文件就被覆盖了,这个时候主项目再调用就是修改之后的child,要修改child代码的话每次都需要重新生成一下项目B让他覆盖掉之前的.exe文件。(=-=)
mfcapplication是什么进程,操作系统,mfc,microsoft,c++

5、运行解决方案

运行解决方案,点击button去创建子进程B,然后再点击下一个button调用消息处理程序:
mfcapplication是什么进程,操作系统,mfc,microsoft,c++
mfcapplication是什么进程,操作系统,mfc,microsoft,c++


还有其他的消息通信方式,我放到下一遍博客上继续讲解
操作系统——MFC实现进程创建和通信3文章来源地址https://www.toymoban.com/news/detail-731854.html

到了这里,关于操作系统——MFC实现进程创建和通信2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统练习:在Linux上创建进程,及查看进程状态

    进程在执行过程中可以创建多个新的进程。创建进程称为“父进程”,新的进程称为“子进程”。每个新的进程可以再创建其他进程,从而形成进程树。 每个进程都有一个唯一的进程标识符(process identifier,pid)。在Linux中,init进程是所有其他进程的根进程。 在Linux中,可以

    2024年02月12日
    浏览(51)
  • 操作系统进程线程(一)—进程线程协程区别、多进程多线程、进程调度算法、进程线程通信

    定义上 进程: 资源分配和拥有 的基本单位,是调度的基本单位。 运行一个可执行程序会创建一个或者多个进程;进程就是运行起来的程序 线程:程序 执行 基本单位,轻量级进程。 每个进程中都有唯一的主线程 ,主线程和进程是相互依赖的关系。 协程: 用户态 的轻量级

    2024年02月01日
    浏览(55)
  • 头歌操作系统 课堂练习3.2:进程的创建

    本实训需要设置内核版本 1 为调试分析的对象,用 gdb 调试内核,内核版本 1 的压缩文件存放在 /data/workspace/myshixun/exp1 中。 环境配置详情请移步前几关~头歌操作系统 课后作业3.1:进程的描述与状态 编程要求 根据相关知识,回答问题: (将答案填写在 /data/workspace/myshixun/第

    2024年02月04日
    浏览(53)
  • 头歌操作系统-课堂练习3.2:进程的创建

    第1关:进程创建前后TR寄存器值的分析 编程要求 根据相关知识,回答问题: (将答案填写在 /data/workspace/myshixun/第一关.txt 中) 0 号进程的 fork 系统调用(main.c:147)中的陷入指令的地址是多少? 0 号进程执行 fork 系统调用之前,TR 寄存器的值为多少? 0 号进程刚执行完 for

    2023年04月26日
    浏览(48)
  • C++ Linux Web Server 面试基础篇-操作系统(三、进程通信)

    ⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您, 麻烦点个赞 👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ Qt5.9专栏 定期更新Qt的一些项目Demo

    2023年04月22日
    浏览(98)
  • 【Linux操作系统】深入探索Linux进程:创建、共享与管理

    进程的创建是Linux系统编程中的重要概念之一。在本节中,我们将介绍进程的创建、获取进程ID和父进程ID、进程共享、exec函数族、wait和waitpid等相关内容。 在Linux系统中,进程的创建使用 fork() 系统调用。 fork() 系统调用会创建一个与当前进程相同的子进程,子进程会复制父进

    2024年02月12日
    浏览(54)
  • [入门篇]Linux操作系统fork子进程的创建以及进程的状态 超超超详解!!!我不允许有人错过!!!

    目录 0.前言 1.fork()创建子进程讲解 1.1fork()的简单介绍 1.2 创建子进程详解 1.2.1 如何理解fork创建子进程 1.2.2 子进程的PCB以及子进程的代码和数据 1.2.3为什么要共享写时拷贝 1.2.4 什么时候发生写时拷贝 1.3 fork函数返回值详解 1.3.1引入fork返回值的作用 1.3.2 fork返回执行逻辑剖析

    2024年03月21日
    浏览(62)
  • 大数据:HDFS的Shell操作,进程启动管理,文件系统操作命令,创建文件文件夹,下载上传,复制移动,删除,展示,追加内容

    2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学,当然,像很多金融企业、安全机构啥的,他们必须要用oracle数据库 这oracle比sql安全,强大多了,所以你需要学

    2024年02月07日
    浏览(65)
  • 操作系统实验——进程管理的算法实现

    笔者在大学下属的事业单位上班,最近去帮着带下操作系统的实验课,这里随手水点参考代码,欢迎各位领导老师莅临指正 编写一个简单的进程调度器 进程控制块(PCB)的定义与管理 进程调度算法的实现 进程创建、销毁和切换 给定一批进程对比3-4种调度算法的时间(自选

    2024年02月06日
    浏览(45)
  • 操作系统进程调度算法(c语言模拟实现)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包