【问题标题】:Batch file can't immediately see environment variables created by InstallShield script批处理文件无法立即看到 InstallShield 脚本创建的环境变量
【发布时间】:2011-01-07 09:48:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 当安装程序创建变量时,它可能会在注册表中而不是在自己的进程中创建它们。当它生成批处理文件cmd 时,它继承了调用者的环境,即没有改变的安装程序。诚然,这对安装人员来说有点糟糕。

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


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

【讨论】:

    【解决方案2】:

    我在使用早期版本的 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。 希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 2017-06-13
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多