【VC】【全局修改windows系统环境变量】 实现和原理详解
创始人
2024-02-02 09:34:18

文章目录

    • 导读
      • 开发环境
    • 实现
      • 通过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:**文章中内容仅用于技术交流,请勿用于违规违法行为。

相关内容

热门资讯

脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...