Пакетный файл не может сразу увидеть переменные среды, созданные сценарием InstallShield - PullRequest
3 голосов
/ 20 января 2010

Мы используем InstallShield 2008 для установки нашего продукта. Продукт состоит из нескольких компонентов. Когда компонент установлен, выполняется пакетный файл с некоторыми процедурами после установки, специфичными для этого компонента.

Проблема: в пакетных файлах после установки используются некоторые переменные среды, которые устанавливаются во время установки продукта с помощью InstallScript . Но кажется, что пакетные файлы не могут видеть немедленные изменения в реестре (и недавно созданные переменные среды).

Есть ли способ выполнить установку без перезагрузки системы?

Потенциально полезная информация: целевая система - Windows XP , в данный момент зарегистрированный пользователь входит в Администраторы группа.

Ответы [ 2 ]

4 голосов
/ 20 января 2010

У меня была такая же проблема с более ранней версией 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 голос
/ 04 декабря 2013

Пользователи InstallShield, использующие InstallShield 2010 или более позднюю версию.

Важно: Механизм InstallScript изменился с версии 2010 для Unicode.

Таким образом, использование POINTER pEnv; больше не будет работать. Вы должны использовать WPOINTER pEnv; вместо этого. Я лично использую InstallShield 2013 , и все, что я нашел, подсказывало "POINTER подход", но это часть устаревшего кода, который не переводится в более поздние версии.

Я использую следующую функцию InstallScript в InstallShield 2013:

// 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 на все окна верхнего уровня. Таким образом, они знают, что были внесены общесистемные изменения.

...