将 WININICHANGE 消息发送到广播地址是正确的做法。但是,并不要求所有正在运行的进程都正确地继承该消息并为该进程更新它们的环境变量。他们应该这样做,但并不总是发生。最臭名昭著的例子是服务控制管理器。您必须重新启动 SCM 才能看到新的变量/值。
现在,如果您问“如何让我当前正在运行的进程看到这个值?” (Cosmin 似乎认为这就是您要问的,但我不确定您是否是)那么答案在于了解环境空间有四个集合:
用户机器进程不稳定
http://msdn.microsoft.com/en-us/library/6s7w15a0(v=vs.85).aspx
您的代码所做的是为 SYSTEM 设置环境变量。这就像您在 autoexec.bat ( SET FOO=BAR ) 中放入一行并重新启动的过去一样。但是您也可以从 Windows 中创建一个新的 dos 提示符并执行 SET SOMETHING=ELSE 并且它只会在该进程和子进程的生命周期内看到,而不会在其他进程中看到。这是“进程”空间与“系统”空间。此外,如果您使用新变量更新了 AUTEXEC.BAT 并在不重新启动的情况下创建了一个新进程,它将看不到新变量,但您始终可以自己设置并查看它(尽管从技术上讲不是同一个)。
我知道,使用 SendMessage 您不需要重新启动,但并非所有进程都会收到消息。
因此,如果您需要当前的 InstallScript 进程也有这个新变量,您将需要调用 Kernel32 的SetEnvironmentVariable函数,该函数根据 MSDN“为当前进程设置指定环境变量的内容”。
有趣的 InstallScript 有一个 GetEnvVar 函数,但没有一个 SetEnvVar 函数,因此您必须将其原型化为外部函数,然后调用它。
可以在此处找到与示例的讨论。