无需重新启动即可访问自定义环境变量(使用C++)

Access custom environment variable without rebooting (using C++)

本文关键字:环境变量 使用 C++ 自定义 访问 重新启动      更新时间:2023-10-16

我正在使用C++编写一个程序,该程序利用了自定义的系统范围环境变量。该变量由msi安装程序设置。稍后,我的程序使用GetEnvironmentVariable()API读取它。

问题是,似乎需要重新启动系统,才能在程序中看到我的自定义环境变量,我不愿意为此重新启动系统。

奇怪的是,如果(不重新启动)我右键单击"我的电脑",然后进入"属性"->"高级"并单击"环境变量",我的自定义环境变量就在该列表中,但由于某种原因,GetEnvironmentVariable()仍然看不到它。

那么,有没有其他API可以在不重新启动系统的情况下使用?(正如系统属性可以清楚地看到的那样。)

如果你想在不重新启动系统的情况下做到这一点,你需要广播它

 SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
    (LPARAM) "Environment", SMTO_ABORTIFHUNG,
    5000, &dwReturnValue);

资源管理器正确处理此消息,因此在此广播后启动的程序将看到更改。

  1. 此外,从技术上讲,您不需要重新启动,只需简单的注销和登录就足够了
  2. 另一种选择是简单地重新启动资源管理器

我最近遇到了这样的事情,广播消息是正确的方式,正如本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中使用这个。