我有一个C ++程序,可以调用GetEnvironmentVariable()
来获取'路径'可变信息。如果我正在运行我的程序,同时,我改变了我的路径'变量通过" MyComputer->属性 - >环境变量"?...是否100%无法检索更新的'路径'变量来自GetEnvironmentVariable()
而没有重新启动我的程序(和Visual Studio)。
在this posting中,Anders K提及:
"确保在读取环境变量之前重新启动应用程序。如果打开控制台窗口并更改“我的电脑”上的环境变量,则会发生同样的情况,这些在任何现有控制台窗口中都没有记录。您需要重新启动它们以获取新环境变量的副本。"
这是否意味着100%无法检索已更新"路径"变量?我不确定我是否在浪费时间。
另外,我尝试了类似this的内容,但没有成功。
谢谢。
答案 0 :(得分:3)
嗯,不是100%不可能的。编辑像这样的环境变量只设置注册表项。您可以使用Regedit.exe查看它们,导航到HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet \ Control \ Session Manager \ Environment,您将看到在编辑框中看到的值列表。用户特定的存储在HKEY_CURRENT_USER \ Environment。
中当进程使用这些值开始时,键正好是。这取决于,进程可以从启动它的进程继承环境,CreateProcess()的lpEnvironment参数确定这一点。传递NULL并因此继承是非常常见的,因此启动的进程将不会看到更改,它从其父级获得了过时环境的副本。唯一可以确定的方法是注销并重新登录,以便了解这样一个过程是从已更改的环境开始的。或者只是尝试一下,所以你知道。
不是100%不可能的角度是实际读取这些注册表项。不完全非常实用,当然完全不便携。 PATH环境变量实际上仅在从shell启动程序时有用。
答案 1 :(得分:2)
如果你需要它在那个意义上是动态的那么你使用的是错误的东西。不要使用环境变量,使用类似注册表项的内容。
答案 2 :(得分:1)
环境变量不是直接从注册表到您的应用程序,它们由资源管理器读取一次,然后由它创建的任何子进程传递/继承。但是有一种机制允许应用程序在更改注册表值时告诉应用程序使用WM_SETTINGCHANGE
广播消息重新加载这些值,lParam
指向包含“环境”的字符串。
通常情况下,只有资源管理器会尊重此消息,但您可以在自己的应用程序中检测到它,并直接从注册表中读取数据。
答案 3 :(得分:0)
根据有用的响应者的建议,我决定使用注册表项来获取更新的环境变量。
假设:
DWORD BufferSize = 16383;
TCHAR pathVar[16383];
之前,我做过:
GetEnvironmentVariable(_T("Path"),pathVar,16383);
如果我通过“我的电脑” - >“属性”进行了更新,那么从未给过我更新过的Path环境变量。
现在,我这样做:
DWORD dwRet = RegGetValue(HKEY_LOCAL_MACHINE,
_T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"),
_T("Path"), RRF_RT_ANY, NULL, (PVOID)&pathVar, &BufferSize);
if(dwRet != ERROR_SUCCESS){
GetEnvironmentVariable(_T("Path"),pathVar,16383);
}
从注册表项获取值。但是,如果由于某种原因RegGetValue()
失败,它将通过GetEnvironmentVariable()
得到值,这可能没有完全更新,但至少我得到了一个我可以使用的值。谢谢大家的建议。