VC ++不使用GetEnvironmentVariable检测新创建的env变量

时间:2009-06-26 15:55:09

标签: c++ environment-variables

我正在使用Win32函数GetEnvironmentVariable来检索我刚刚创建的变量的值。我正在运行Windows XP和VC ++ 2005.如果我从Visual Studio中运行程序,它找不到新的变量。如果我从命令提示符运行它,它会。我重新启动VC ++但结果相同。我甚至重新启动了Visual Studio的所有实例,但仍然是同样的问题。如果我重新启动电脑可能会得到解决,但我很好奇为什么会这样。这是我正在使用的代码:

#define BUFSIZE 4096
#define VARNAME TEXT("MY_ENV_NAME")

int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR chNewEnv[BUFSIZE];

    DWORD dwEnv = ::GetEnvironmentVariable(VARNAME, chNewEnv, BUFSIZE);
    if (dwEnv == 0)
    {
        DWORD dwErr = GetLastError();
        if(dwErr == ERROR_ENVVAR_NOT_FOUND)
        {
            printf("Environment variable does not exist.\n");
            return -1;
        }
    }
    else
    {
        printf(chNewEnv);
    }

    return 0;
}

如果我用必须存在的东西替换MY_ENV_NAME,例如TEMP,它会按预期工作。有任何想法吗?感谢。

4 个答案:

答案 0 :(得分:5)

扩展Anders和Martin所说的,环境变量是启动应用程序时继承的一件事。新程序基本上会获得环境的环境副本。调试时,您的exe通常由Visual Studio启动,因此您的应用程序将具有与Visual Studio相同的环境。 Visual Studio,通常由资源管理器启动。如果您通过转到“系统属性” - >“高级” - >“环境变量”来更改环境变量,则必须重新启动Visual Studio才能查看更改。

如果您需要查看Visual Studio所见的环境变量(至少对于VS2005 / 2008),请转到工具...->选项...->项目和解决方案 - > VC ++项目设置并将日志中的显示环境设置为“是”。这将打印出所有环境变量到构建日志(ctrl +单击构建输出中的链接)。你必须构建才能获得这些信息,但这是我知道看到VS环境的最佳方式。

如果你真的需要更改环境变量然后运行并且很难调试,你可以构建你的调试exe并在你想要开始调试的地方调用DebugBreak()。然后,您可以根据需要设置环境,从资源管理器或命令提示符启动exe。然后(假设您启用了JIT调试),当您的代码进入DebugBreak()调用时,您将获得一个弹出窗口,您可以使用VS附加到它并从那里正常调试。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

这完全取决于您如何设置环境变量:

  • 如果您在命令提示符下运行set MY_ENV_NAME=val,那么您已为该MY_ENV_NAME实例设置了cmd.exe以及将来执行的所有子进程。不修改现有子进程的环境。

    在这种情况下,退出Visual Studio IDE并从命令行(而不是资源管理器)启动它应该使它及其子进程看到新的环境变量。

  • 如果使用“系统”或“用户”控制面板或setx命令设置MY_ENV_NAME,则表示已永久设置MY_ENV_NAME,并且将为所有进程设置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment重新启动计算机后。此外,您可能会发现某些进程(如Explorer)会立即更改环境变量。

    这可以通过将新环境变量存储在HKEY_CURRENT_USER\Environment或{{1}}下的注册表中,具体取决于您是选择设置系统环境变量还是设置每用户环境变量。通过broadcasting the WM_SETTINGCHANGE message with lParam=="Environment"通知现有流程环境变量发生变化。此消息使他们如果知道如何从注册表重新读取持久性环境变量。 KB104011有更多详情。

    因此,如果使用“系统”或“用户”控制面板设置新的环境变量,退出Visual Studio IDE并从资源管理器(而不是命令提示符)再次启动它应该使它及其子进程看到新的环境变量。

答案 3 :(得分:2)

感谢所有回复。正如我在我的问题中提到的,我尝试重新启动所有内容,而不是重新启动PC。事实证明,因为我的环境变量是一个SYSTEM变量,所以如果不重新启动PC,VS就无法识别它。当我将env变量从SYSTEM移动到USER并重新启动VS时,它工作正常。