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

时间:2012-01-11 04:50:08

标签: c++ winapi environment-variables

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

问题是系统需要重新启动以使我的自定义环境变量在我的程序中可见,并且我不想为此重新启动系统。

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

那么我可以使用任何其他API,无需重启系统即可使用吗? (因为系统属性可以清楚地看到它。)

2 个答案:

答案 0 :(得分:3)

如果您想在不重启系统的情况下执行此操作,则需要broadcast it

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

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

  1. 从技术上讲,您不需要重新启动,只需简单注销即可 登录就足够了
  2. 另一种选择是restart explorer

答案 1 :(得分:1)

我最近遇到过这样的事情并且广播消息是正确的方式,如本kb(和parapura)中所解释的那样:

http://support.microsoft.com/kb/104011

然而,我建议将_T()放在“环境”(或者可能是“L”)周围,以确保传入正确的字符串(ansi或宽)。像这样:

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

我在命令行应用程序中使用了上述内容。没有_T()消息发送成功但我的系统似乎永远不会接收环境变量的更新。

顺便说一下,'setx'命令行可能使用相同的机制来更新环境变量。 另外,我在atl dll中使用它。