目标:从我的应用程序中我想启动任意命令,例如cmd.exe
与当前环境变量,例如当我的应用程序运行并且用户修改路径时,启动终端应该获取新路径。
根据我的理解,如果启动一个进程,它将从其启动进程接收环境变量值(继承值或单独值)。在 Windows 上,可以通过读取注册表项来访问环境变量的最新值(请参阅 question "Where are environment variables stored in registry?" )。它们按照配置存储在注册表中,例如Comspec
:%SystemRoot%\system32\cmd.exe
。因此,您将需要其他环境变量(例如 SystemRoot
)的值来扩展它们。
不幸的是,当查看我的进程从父进程接收到的所有环境变量与我可以从注册表中读取的环境变量时,似乎存在很大差异。我只是无法使用继承的环境变量并用它们的值替换注册表配置的环境变量,因为这样用户在应用程序运行时删除的自定义环境变量将占上风。
在哪里可以找到Windows默认提供的环境变量,例如系统根
?
最佳答案
CreateEnvironmentBlock
WINAPI可以用来获取当前的环境变量。它的 bInherit
参数允许您选择是否从进程继承变量。
演示它的 C++ 代码片段:
HANDLE userToken = 0;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &userToken))
{
_tprintf(_T("ERROR: OpenProcessToken"));
return 1;
}
void* envVars = 0;
if (!CreateEnvironmentBlock(&envVars, userToken, TRUE))
{
_tprintf(_T("ERROR: CreateEnvironmentBlock"));
return 1;
}
const wchar_t* iter = (const wchar_t*)envVars;
while (*iter)
{
_tprintf(_T("ENV: %s\n"), iter);
iter += _tcslen(iter) + 1;
}
DestroyEnvironmentBlock(envVars);
关于Windows:获取所有*当前*环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57140076/