2009-06-26 32 views
1

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

#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),它将按预期工作。有任何想法吗?谢谢。

回答

2

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

3

请确保您重新启动应用程序,然后才能读取环境变量。如果您打开了一个控制台窗口并更改了“我的电脑”上的环境变量,则这些都不会在任何现有的控制台窗口中记录。您需要重新启动它们以获取新环境变量的副本。

+0

安德斯,我确实重新启动了我的游戏机以及Visual Studio – 2009-06-26 16:07:23

+3

以及您从VisStudio开始的程序。应用程序在启动时从其“父”继承其环境,并且不会更改。启动后,上下文中的环境变化X不会传播到上下文Y. – 2009-06-26 16:27:10

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

3

这一切都取决于你如何设置环境变量:

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

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

  • 如果你使用的系统或用户控制面板或setx命令来设置MY_ENV_NAME,那么你已经设置MY_ENV_NAME持续,它会为你重新启动计算机后,所有的进程设置。另外,您可能会发现某些进程(如Explorer)会立即收到环境变量更改。

    这可以通过将新环境变量存储在注册表下的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentHKEY_CURRENT_USER\Environment来实现,具体取决于您是选择设置系统环境变量还是每个用户环境变量。通知现有流程存在环境变量broadcasting the WM_SETTINGCHANGE message with lParam=="Environment"。如果他们知道如何,此消息使他们重新从注册表中读取持久性环境变量。 KB104011有更多的细节。因此,如果使用系统或用户控制面板设置新的环境变量,退出Visual Studio IDE并从资源管理器(不是命令提示符)重新启动它应导致它及其子进程看到新的环境变量。