从c ++更新系统环境变量

时间:2010-02-16 15:16:32

标签: c++ windows environment-variables

我目前正在编写一个与系统环境变量一起使用的非托管C ++程序。我正在使用GetEnvironmentVariable(...)获取值。 现在我有一个C#程序可以随时更改此变量,例如像这样:

Environment.SetEnvironmentVariable("CalledPath", System.Windows.Forms.Application.ExecutablePath, EnvironmentVariableTarget.Machine);

问题是C ++程序不会自动更新此变量(或其一般的环境块),因此我仍然使用旧值,除非我重新启动不太好的程序。 有没有办法更新环境块或最好是另一种读取系统环境变量的方法?

提前致谢, 俄

6 个答案:

答案 0 :(得分:4)

总而言之,环境变量无法作为进程间通信的一种形式可靠地运行 - 您确实需要切换到其他内容。

要工作,两个程序都需要访问一些常见的环境变量块 - 但实际上,每个进程都有自己的一组环境变量的独立副本。更糟糕的是,大多数典型的(C和C ++)标准库不允许您直接使用 - 相反,它们会为您创建环境变量的另一个副本与...合作。当/如果您调用getenv()_putenv(),则仅涉及程序的环境变量块的内部副本。这意味着即使您可以更改进程的环境变量,在该进程中运行的程序仍然也不会获得新数据。

所以,你真的需要重新思考你在做什么。将数据从一个程序发送到另一个程序有很多 lot ,包括Windows消息(例如WM_COPYDATA),匿名或命名管道,邮件槽,共享内存区域,套接字等。 list很长,但仍然不包含环境变量。

答案 1 :(得分:2)

谢谢你们,但我终于弄明白了。 由于我使用GetEnvironmentVariable接收的值不是当前值,因此我直接从注册表中读取值。 机器环境变量存储在

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

我通过RegOpenKeyEx(...)和RegQueryValueEx(...)函数读取它们,效果非常好。

答案 2 :(得分:1)

你做不到。每个进程都获取其父进程的环境变量的副本。由于它只获取副本,因此无法更改父级环境或任何其他正在运行的进程的环境。

答案 3 :(得分:0)

在您显示的调用的上下文中,您将尽可能长时间地保持环境变量更改。请参阅EnvironmentVariableTarget枚举的this MSDN explanation

使用您现在使用的EnvironmentVariableTarget.Machine设置,只要程序的进程运行,变量更改将保持不变,因此所有其他进程将能够在程序执行期间读取此变量:

  

存储环境变量或   从中获取   Windows中的HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment密钥   操作系统注册表。

     

当用户创建环境时   在集合操作中的变量,   操作系统存储   系统中的环境变量   注册表,但不是在当前   处理。 如果本地有任何用户   机器启动一个新的过程,   操作系统复制   注册表中的环境变量   到那个过程。

     

当进程终止时,   操作系统破坏了   该过程中的环境变量。   但是,环境变量在   注册表一直持续到用户   以编程方式或通过删除它   操作系统工具的手段。 [强调我的。]

答案 4 :(得分:-1)

查看putenv() - 一个C运行时函数(或MS首选的_putenv()和_putenv_s() - 用于更新的C ++等价物。

getenv()和类似的环境字符串读取。

ķ

答案 5 :(得分:-1)

我相信它在Windows上是_putenv()