批处理文件无法立即查看InstallShield脚本创建的环境变量

时间:2010-01-20 18:13:36

标签: registry batch-file environment-variables installshield installscript

我们使用 InstallShield 2008 进行产品安装。产品由几个组件组成。安装组件时,将执行具有特定于此组件的一些安装后例程的批处理文件。

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

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

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

2 个答案:

答案 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到所有顶级窗口。通过这种方式,他们意识到已经进行了全系统的改变。