1

我正在使用 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,它会按预期工作。有任何想法吗?谢谢。

4

4 回答 4

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 附加到它并从那里正常调试。

于 2009-06-26T17:16:43.477 回答
3

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

于 2009-06-26T15:58:41.173 回答
3

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

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

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

  • 如果您使用 System 或 Users 控制面板或setx命令 set MY_ENV_NAME,则您已MY_ENV_NAME永久设置,并且在您重新启动计算机后将为所有进程设置。此外,您可能会发现某些进程(例如资源管理器)会立即获取环境变量更改。

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

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

于 2009-06-27T11:40:51.430 回答
2

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

于 2009-06-29T08:53:59.483 回答