我们使用 InstallShield 2008 进行产品安装。产品由几个组件组成。安装组件时,将执行具有特定于此组件的一些安装后例程的批处理文件。
问题:安装后批处理文件使用通过 InstallScript 在产品安装期间设置的一些环境变量。但似乎批处理文件无法立即看到注册表(以及新创建的环境变量)的更改。
有没有办法在没有系统重启的情况下完成安装?
潜在有用的信息:目标系统 - Windows XP ,当前登录的用户位于管理员组。
答案 0 :(得分:4)
我在早期版本的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。 希望它有所帮助。
答案 1 :(得分:1)
使用InstallShield 2010或更高版本的InstallShield用户。
重要说明:自2010版Unicode以来,InstallScript引擎已发生变化。
因此使用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到所有顶级窗口。通过这种方式,他们意识到已经进行了全系统的改变。