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

Ami*_*t G 1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Dol*_*hin 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附加到它并从那里正常调试.