3

我们使用InstallShield 2008进行产品安装。产品由几个组件组成。安装组件时,会执行一个批处理文件,其中包含特定于该组件的一些安装后例程。

问题:安装后批处理文件使用了一些在产品安装期间通过InstallScript设置的环境变量。但似乎批处理文件无法立即看到注册表(以及新创建的环境变量)的变化。

有没有办法在不重新启动系统的情况下完成安装?

可能有用的信息:目标系统 - Windows XP,当前登录的用户在管理员组中。

4

2 回答 2

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。希望能帮助到你。

于 2010-01-20T18:39:43.520 回答
1

使用 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 。通过这种方式,他们知道已经进行了系统范围的更改。

于 2013-12-03T22:11:21.553 回答