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