【问题标题】:VC++ doesn't detect newly created env variable using GetEnvironmentVariableVC++ 不使用 GetEnvironmentVariable 检测新创建的环境变量
【发布时间】:2010-11-06 04:49:04
【问题描述】:

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

#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;
}

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

【问题讨论】:

    标签: c++ environment-variables


    【解决方案1】:

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

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

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

    【讨论】:

    • 关于在日志中输出环境的好技巧,非常有用!
    【解决方案2】:

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

    【讨论】:

    • 安德斯,我确实重启了我的控制台以及 Visual Studio
    • 还有你从​​ VisStudio 开始的程序。应用程序在启动时从其“父级”继承其环境并且不会更改。启动后对上下文 X 中的环境的更改不会传播到上下文 Y。
    • 这是否意味着当通过“MyComputer->Properties->Environment Variables”专门进行更改时,绝对无法更新来自GetEnvironmentVariable() 的环境变量??
    【解决方案3】:

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

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

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

    • 如果您使用系统或用户控制面板或setx 命令设置MY_ENV_NAME,那么您已永久设置MY_ENV_NAME,它将在您重新启动计算机后为所有进程设置。此外,您可能会发现某些进程,例如资源管理器,会立即拾取环境变量的变化。

      这通过在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentHKEY_CURRENT_USER\Environment 下的注册表中存储新环境变量来实现,具体取决于您选择设置系统环境变量还是每个用户的环境变量。 broadcasting the WM_SETTINGCHANGE message with lParam=="Environment" 通知现有进程存在环境变量更改。如果他们知道如何,此消息会导致他们从注册表中重新读取持久性环境变量。 KB104011 有更多详情。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        相关资源
        最近更新 更多