我们使用InstallShield 2008进行产品安装。产品由几个组件组成。安装组件时,会执行一个批处理文件,其中包含特定于该组件的一些安装后例程。
问题:安装后批处理文件使用了一些在产品安装期间通过InstallScript设置的环境变量。但似乎批处理文件无法立即看到注册表(以及新创建的环境变量)的变化。
有没有办法在不重新启动系统的情况下完成安装?
可能有用的信息:目标系统 - Windows XP,当前登录的用户在管理员组中。
我们使用InstallShield 2008进行产品安装。产品由几个组件组成。安装组件时,会执行一个批处理文件,其中包含特定于该组件的一些安装后例程。
问题:安装后批处理文件使用了一些在产品安装期间通过InstallScript设置的环境变量。但似乎批处理文件无法立即看到注册表(以及新创建的环境变量)的变化。
有没有办法在不重新启动系统的情况下完成安装?
可能有用的信息:目标系统 - Windows XP,当前登录的用户在管理员组中。
我在使用早期版本的 InstallShield 时遇到了同样的问题。这是我解决它的方法(快速而肮脏的代码)。
#define HWND_BROADCAST 0xffff
#define WM_SETTINGCHANGE 0x001A
function UpdateEnvironmentVariable(szKey, szValue)
NUMBER nResult;
STRING szEnv;
POINTER pEnv;
begin
nResult = RegDBSetKeyValueEx(szKey, "PATH", REGDB_STRING, szValue, -1);
szEnv = "Environment";
pEnv = &szEnv;
SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, pEnv );
end;
关键是使用SendMessage。希望能帮助到你。
使用 InstallShield 2010 或更高版本的 InstallShield 用户。
重要提示: InstallScript 引擎自 2010 版以来已针对 Unicode 进行了更改。
所以使用POINTER pEnv;
将不再起作用。您必须WPOINTER pEnv;
改用。我个人使用InstallShield 2013,我发现的所有内容都建议使用“POINTER
方法”,但这是一段无法转换为更高版本的遗留代码。
我在 InstallShield 2013 中使用以下 InstallScript 函数:
// Flush the NT registry to all applications.
function RefreshEnvironment()
STRING szEnv;
WPOINTER pEnv;
begin
szEnv = "Environment";
pEnv = &szEnv;
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, pEnv);
end;
对于我的定义,我使用:
// defines
#define WM_SETTINGCHANGE 0x001A
#define HWND_BROADCAST 0xffff
所以这里的关键是向所有顶层窗口广播WM_SETTINGCHANGE 。通过这种方式,他们知道已经进行了系统范围的更改。