【VC】【全局修改windows系统环境变量】 实现和原理详解

news2025/7/13 3:56:30

文章目录

    • 导读
      • 开发环境
    • 实现
      • 通过procexp打开1836进程的环境变量列表
      • 修改注册表(手动/编码实现)
      • 广播WM_SETTINGCHANGE消息
      • 再次通过procexp打开1836进程的环境变量列表
      • 也可以通过《系统属性 > 环境变量》来查看是否生效
    • 文章小结
    • 参考资料

导读

一直都很好奇一些安装软件,如何将自己安装的路径,添加到环境变量PATH中的(之前尝试用API SetEnvironmentVariable只在当前进程有效)。今天终于查了查资料实现了该需求,并通过工具验证了该实现。
在这里插入图片描述

开发环境

版本号描述
文章日期2022-11-19
操作系统Win11-22H2内部版本号22621.674
Visual Studio 201916.11.12
Windows SDK10.0.17763.0

实现

通过procexp打开1836进程的环境变量列表

参考下面的比较图片

修改注册表(手动/编码实现)

在这里插入图片描述

广播WM_SETTINGCHANGE消息

编写如下代码并执行:

	// 阻塞
	UINT fuFlags = SMTO_BLOCK;
	// The duration of the time-out period, in milliseconds. If the message is a broadcast message, each window can use the full time-out period. For example, if you specify a five second time-out period and there are three top-level windows that fail to process the message, you could have up to a 15 second delay.
	// 消息超时时间,每个顶层窗口都会等待uTimeout毫秒。
	UINT uTimeout = 100;
	DWORD dwResult = 0;
	LRESULT ret = ::SendMessageTimeoutA(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)_T("Environment"), fuFlags, uTimeout, &dwResult);
	printf("ret, dwResult, GetLastError() = %d %d %d \n", ret, dwResult, GetLastError());

再次通过procexp打开1836进程的环境变量列表

比较执行广播消息前后的列表,发现已经新增了环境变量FLAG_MY_PIPE_NAME
在这里插入图片描述

也可以通过《系统属性 > 环境变量》来查看是否生效

在这里插入图片描述
在这里插入图片描述

文章小结

下面两组函数只能修改当前进程的环境变量(子进程默认继承修改后的环境变量)。

  • getenv & setenv
  • GetEnvironmentStrings & SetEnvironmentVariable

环境变量存储在注册表HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment中,系统启动后,将所有环境变量加载到explorer等进程中(保存到PBE中),explorer之后的进程会继承该环境变量。

如果直接修改注册表项,并不能修改已经启动进程的环境变量,需要通过广播消息WM_SETTINGCHANGE通知给所有已经启动的带窗口处理函数的进程(cmd命令的进程不处理窗口消息,不能更新环境变量)。

ps: 通过三方工具修改环境变量,《Windows修改环境变量的工具—Rapid Environment Editor》https://blog.csdn.net/COCO56/article/details/102425383

参考资料

  • https://learn.microsoft.com/zh-cn/windows/win32/procthread/environment-variables
  • https://learn.microsoft.com/zh-cn/windows/win32/winmsg/wm-settingchange
  • qq群:夜猫逐梦技术交流裙/953949723
    逐梦中原技术交流QQ群

**ps:**文章中内容仅用于技术交流,请勿用于违规违法行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]java毕业设计水果商城

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

十三、Mysql的存储引擎

Mysql的存储引擎十三、Mysql的存储引擎一、什么是存储引擎二、存储引擎的常见功能三、存储引擎的种类及特性对比1、存储引擎的种类2、常见存储引擎的特性对比3、查看存储引擎四、InnoDB存储引擎1、InnoDB存储引擎介绍2、InnoDB存储引擎的优点3、InnoDB与MyISAM的区别4、存储引擎…

PTA题目 三天打鱼两天晒网

中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”? 输入格式: 输入在一行中给出一个不超过1000的正整数N。 输出格式: 在一行中输…

【网页设计】基于HTML在线图书商城购物项目设计与实现

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业,Web大学生网页 HTML&a…

java面试强基(6)

面向对象三大特征了解吗? 封装 ​封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。如果属性不想被外界访问,我们…

【滤波跟踪】基于扩展卡尔曼滤波的无人机路径跟踪附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

Linux基础8 - 网络配置

Linux基础8 - 网络配置 一、网络连接的三种方式 Vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。 1、桥接模式…

[每周一更]-(第21期):什么是RPC?

RPC,也就是远程过程调用,是分布式系统中不同节点调用的方式(进程间通信),属于 C/S 模式。RPC 由客户端发起,调用服务端的方法进行通信,然后服务端把结果返回给客户端。 RPC的核心有两个&#x…

商品推荐系统实战:基于AFM推荐算法的推荐系统实现 代码+数据

例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。AFM推荐算法概…

Spring Boot官方推荐的Docker镜像编译方式-分层jar包

目录参考一、普通Dockerfile的缺点二、Docker分层三、Spring Boot分层四、实践核心理论新建demo工程pom.xml测试代码编写Dockerfile我们在项目根目录执行打包命令发布docker镜像修改代码重新发布docker参考 Spring Boot官方推荐的Docker镜像编译方式-分层jar包 Spring Boot la…

Windows11安装Maven

Windows11安装Maven官网下载压缩包:https://maven.apache.org/download.cgi 解压到任意盘 配置环境变量 3.1 右击我的电脑,选择属性 3.2 选择高级系统设置 3.3 选择环境变量 3.4 在系统变量中单击新建 3.5 新建 MAVEN_HOME 变量,然后…

四十四、​Fluent 收敛标准-质量和能量守恒

1. Fluent质量和能量守恒 Fluent收敛性的判断有时候很让人头疼,我们在三十二、Fluent收敛判断标准及方法中概括的讲述过几种收敛标准。 通常我们判断是否收敛最直接的就是看残差曲线,但是很多时候,残差曲线(尤其连续性曲线&#x…

web前端期末大作业 html+css古诗词主题网页设计

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 茶文化网站 | 中华传统文化题材 | 京剧文化水墨风书画 | 中国民间年画文化艺术网站 | 等网站的设计与制作 | HTML期末大学生网页设计作业,…

Linux从入门到入土③(GCC、静态与动态链接库、Git、Make、Makefile)

文章目录编译工具GCCGCC基本语法GCC编译流程预处理阶段编译阶段汇编阶段链接阶段GCC常用参数总结多文件编译静态与动态链接库Linux库的创建与使用静态库与动态库的区别静态库的制作与使用动态库的制作与使用解决动态库无法加载问题库的工作原理动态链接器解决方案静态库和动态库…

[附源码]java毕业设计日常饮食健康推荐平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【快速掌握Docker】Docker高级运用汇总--Dockerfile、Docker Compose与Docker Swarm使用

一、Dockerfile的构建 1、指定镜像 采用FROM指令: FROM 指定镜像名称2、设置标签信息 对镜像进行备注说明: LABEL manager"admin" \ label1"docker build1" \ lable2"docker build2"3、运行命令 容器运行后&#xf…

跟艾文学编程《Python基础》(6)numpy数值计算

作者: 艾文,计算机硕士学位,企业内训讲师和金牌面试官,公司资深算法专家,现就职BAT一线大厂。 邮箱: 1121025745qq.com 博客:https://wenjie.blog.csdn.net/ 内容:跟艾文学编程《Pyt…

java学习之包

包的引入 举例:小明和小强都想给自己定义的类命名为Dog(在同一个文件夹下不能有同名的类),包可以解决这个问题 包的作用 1.区分相同名字的类:可以把Dog类放在不同的包 2.当类很多的时候,可以很好的管理…

人工智能在医疗保健服务演变中的作用越来越大

人工智能正被应用于医疗保健服务中,使用的更多技术,从物联网和大数据到聊天机器人。然而,人工智能将破坏医疗保健的主要案例,是计算机辅助诊断。研究综述。 医疗保健提供者和支付方都在进行数字化转型。研究显示,现在…

sp-踩坑小记

想把$BSGS修改为从gUserdefined继承,只能删掉原来的$BSGS,然后在gUserdefined新建一个$BSGS----坑① 如果这个BSGS里面有200个属性,那么还得手动再敲一遍(无法批量导入属性)--坑② 新建的时候,在虚拟机的…