无需重新启动即可访问自定义环境变量(使用C++)
Access custom environment variable without rebooting (using C++)
我正在使用C++编写一个程序,该程序利用了自定义的系统范围环境变量。该变量由msi安装程序设置。稍后,我的程序使用GetEnvironmentVariable()API读取它。
问题是,似乎需要重新启动系统,才能在程序中看到我的自定义环境变量,我不愿意为此重新启动系统。
奇怪的是,如果(不重新启动)我右键单击"我的电脑",然后进入"属性"->"高级"并单击"环境变量",我的自定义环境变量就在该列表中,但由于某种原因,GetEnvironmentVariable()仍然看不到它。
那么,有没有其他API可以在不重新启动系统的情况下使用?(正如系统属性可以清楚地看到的那样。)
如果你想在不重新启动系统的情况下做到这一点,你需要广播它
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
(LPARAM) "Environment", SMTO_ABORTIFHUNG,
5000, &dwReturnValue);
资源管理器正确处理此消息,因此在此广播后启动的程序将看到更改。
- 此外,从技术上讲,您不需要重新启动,只需简单的注销和登录就足够了
- 另一种选择是简单地重新启动资源管理器
我最近遇到了这样的事情,广播消息是正确的方式,正如本kb(和parapura)所解释的那样:
http://support.microsoft.com/kb/104011
但是,我建议将_T()放在"Environment"(或者可能是一个"L")周围,以确保您传递的字符串(ansi或wide)是正确的。像这样:
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
(LPARAM) _T("Environment"), SMTO_ABORTIFHUNG,
5000, &dwReturnValue);
我在命令行应用程序中使用了以上内容。如果没有_T(),消息发送成功,但我的系统似乎从未接收到环境变量的更新。
顺便说一句,"setx"命令行可能使用相同的机制来更新环境变量。另外,我在一个atl dll中使用这个。
相关文章:
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 定义C++新的环境变量并在 bat 文件中使用它
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 如何设置Qt应用程序以使用类Unix系统的实际环境变量?
- 如何使用boost :: program_options提取环境变量
- 如何在Log4CPP属性文件中使用环境变量
- 在源代码中使用环境变量(编译时间)
- 使用ROS2环境变量创建C 项目
- 如何在Qt5中使用Windows环境变量
- 如何使用CMakeLists.txt为我的可执行文件设置bash中的环境变量
- 如何使用.bat文件在VS2010中添加环境变量
- 如何使用Java发送HTTP GET,并使用用C++编写的CGI应用程序打印QUERY_STRING环境变量
- 使用 QProcessEnvironment 更改 cmd.exe 的 PATH 环境变量
- 在 Linux 上使用 Getenv 在 C++ 中读取数组环境变量
- 在多线程环境中使用atomic保护两个变量
- 在Boost文件系统中使用环境变量
- 为visual studio 2010定义环境变量,以便在生成过程中使用
- 在 XCode 6.1 的"Build Phases"中使用 "Run Script" 时如何使用 ~/.bash_profile 环境变量?
- 无需重新启动即可访问自定义环境变量(使用C++)
- 环境变量使用批处理文件和c++