刷新环境变量的值

时间:2011-10-20 11:18:14

标签: installshield installscript

在我的Installscript项目中,我需要重新启动才能注册环境变量的值。但是我希望应用程序无需重启即可设置。那么他们是否可以刷新Environment变量的值,以便我的应用程序被注册并且不需要重新启动? 我已经在使用以下代码行:

define WM_WININICHANGE 0x001A'
define HWND_BROADCAST 0xffff'
szEnv = "Environment";
pEnv = &szEnv;
SendMessage( HWND_BROADCAST, WM_WININICHANGE, 0, pEnv );`

他们是否有其他方式刷新环境变量值? 我在Windows XP上运行它。

2 个答案:

答案 0 :(得分:0)

设置环境变量的Windows进程无法访问该变量以进行读取。这是Windows中的限制。我们的想法是,如果您的流程设置了一个变量,它就已经知道了变量值。

因此,如果您的安装程序正在设置环境变量,那么您的应用程序必须在一个单独且无关的进程中运行才能读取该变量。这就是安装完成后启动应用程序不起作用的原因。

解决方案是在安装期间启动变量值时通过应用程序命令行传递变量值。任何未来的发布仍将直接访问变量。

答案 1 :(得分:0)

将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函数,所以你必须将它作为外部函数原型化,然后调用它。

可以找到与样本的讨论here