1

我有一个 C++ 程序调用GetEnvironmentVariable()来获取“路径”变量信息。如果我正在运行我的程序,同时,我通过“MyComputer->Properties->Environment Variables”更改我的“路径”变量?...如果不重新启动我的程序,是否 100% 不可能检索更新的“路径”变量GetEnvironmentVariable()(和 Visual Studio)。

这篇文章中,Anders K提到:

“确保在读取环境变量之前重新启动应用程序。如果您打开控制台窗口并更改“我的电脑”上的环境变量,也会发生同样的情况,这些不会在任何现有控制台窗口中记录。您需要重新启动它们以获取新环境变量的副本。”

这是否意味着 100% 无法检索更新的“路径”变量?我不确定我是否在浪费时间。

另外,我尝试过这样的事情,但没有成功。

谢谢你。

4

4 回答 4

3

好吧,不是100%不可能。像这样编辑环境变量只会设置注册表项。您可以使用 Regedit.exe 查看它们,导航到 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet\Control\Session Manager\Environment,您将看到在编辑框中看到的值列表。用户特定的存储在 HKEY_CURRENT_USER\Environment 中。

关键是进程何时开始使用这些值。这取决于,一个进程可以从启动它的进程继承环境, CreateProcess() 的 lpEnvironment 参数决定了这一点。传递 NULL 并因此继承是非常常见的,因此启动的进程不会看到更改,它从其父级获得了陈旧环境的副本。真正确定的唯一方法是注销并重新登录,这样您就知道这样一个过程是从改变的环境开始的。或者只是尝试一下,这样你就知道了。

不是 100% 不可能的角度是实际读取这些注册表项。不是很实用,当然也完全不便携。PATH 环境变量仅在从 shell 启动程序时才真正有用。

于 2012-06-22T19:49:20.590 回答
2

如果你需要它在这个意义上是动态的,那么你使用的是错误的东西。不要使用环境变量,使用注册表项之类的东西。

于 2012-06-22T19:54:50.950 回答
1

环境变量不直接从注册表到您的应用程序,它们由资源管理器读取一次,然后由它创建的任何子进程传递/继承。然而,有一种机制允许应用程序在更改注册表值时告诉应用程序使用指向包含“环境”的字符串的WM_SETTINGCHANGE广播消息重新加载这些值。lParam

通常,只有资源管理器会处理此消息,但您可以在自己的应用程序中检测到它并直接从注册表中重新读取数据。

于 2012-06-25T10:21:14.507 回答
0

根据乐于助人的响应者的建议,我决定使用注册表项来获取更新的环境变量。

假设:

    DWORD BufferSize = 16383;  
    TCHAR pathVar[16383];

之前,我做过:

    GetEnvironmentVariable(_T("Path"),pathVar,16383);

如果我通过“我的电脑”->“属性”进行更新,它从来没有给我更新过的 Path 环境变量。

现在,我这样做:

    DWORD dwRet = RegGetValue(HKEY_LOCAL_MACHINE, 
    _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"), 
    _T("Path"), RRF_RT_ANY, NULL, (PVOID)&pathVar, &BufferSize);

    if(dwRet != ERROR_SUCCESS){
        GetEnvironmentVariable(_T("Path"),pathVar,16383);
    }

它从注册表项中获取值。但是,如果由于某种原因RegGetValue()失败,它将通过 获取值GetEnvironmentVariable(),这可能没有完全更新,但至少我得到了一个我可以使用的值。谢谢大家的建议。

于 2012-06-27T18:09:12.323 回答