Как установить глобальную переменную окружения из программы установки Inno Setup?


Как задать глобальную переменную окружения в программе установки Inno?

фон: я использую утилиту установки Inno и должен установить глобальную переменную окружения, прежде чем я сделаю фактическую установку.

3 5

3 ответа:

Попробуйте это:

[Registry]
Root: HKCU; Subkey: "Environment"; ValueType:string; ValueName: "VARIABLE_NAME"; \
    ValueData: "new_value"; Flags: preservestringtype

Возможно, вам потребуется добавить следующее:

[Setup]
; Tell Windows Explorer to reload the environment
ChangesEnvironment=yes

Альтернативно попробуйте:

[Run]
Filename: "{app}\MyProg.exe"; BeforeInstall: SetEnvPath

[Code]
#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif

function SetEnvironmentVariable(lpName: string; lpValue: string): BOOL;
  external 'SetEnvironmentVariable{#AW}@kernel32.dll stdcall';

procedure SetEnvPath;
begin
  if not SetEnvironmentVariable('VARIABLE_NAME', 'new_value') then
    MsgBox(SysErrorMessage(DLLGetLastError), mbError, MB_OK);
end;

Ссылка: Inno Setup Часто Задаваемые Вопросы-Настройка Переменных Окружения

Если переменная не распространяется (см. переменная окружения не распознана [недоступна] для программ [Run] Inno Setup )

[Run]
...; AfterInstall: RefreshEnvironment

[Code]
const
  SMTO_ABORTIFHUNG = 2;
  WM_WININICHANGE = $001A;
  WM_SETTINGCHANGE = WM_WININICHANGE;

type
  WPARAM = UINT_PTR;
  LPARAM = INT_PTR;
  LRESULT = INT_PTR;

function SendTextMessageTimeout(hWnd: HWND; Msg: UINT;
  wParam: WPARAM; lParam: PAnsiChar; fuFlags: UINT;
  uTimeout: UINT; out lpdwResult: DWORD): LRESULT;
  external 'SendMessageTimeoutA@user32.dll stdcall';  

procedure RefreshEnvironment;
var
  S: AnsiString;
  MsgResult: DWORD;
begin
  S := 'Environment';
  SendTextMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
    PAnsiChar(S), SMTO_ABORTIFHUNG, 5000, MsgResult);
end;

Подробнее:

Inno Setup: установка системной переменной окружения

Под более современными (другими словами, правильными) операционными системами, такими как Windows 2000, XP и Windows 2003 Server, переменные среды являются хранится в реестре под следующим ключом:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\ Окружающая среда

Переменные добавляются путем создания нового значения под этим ключом или путем изменение значения, если оно уже существует. Чтобы удалить переменную, необходимо просто удалите его значение реестра, если только вы не удаляете часть расширенное значение, например путь, в этом случае вы удаляете только деталь ты хочешь.

На этом этапе Windows не будет знать о ваших изменениях, если вы не выйдите из системы или перезагрузитесь. Чтобы обойти это, SetEnv будет транслировать WM_SETTINGCHANGE для всех окон в системе. Это позволяет другие запущенные приложения-например, Explorer.exe-быть уведомленным о ваше изменение. Если вы запустите SetEnv из командной строки, это не произойдет. обновление переменная окружения для текущего окна DOS. Это главным образом из-за того, что процесс (SetEnv) не может изменить окружение его родителя (Командная строка). Впрочем, никаких новых В открываемых командных подсказках DOS/появится новая переменная/значение.

Что было бы не так с запуском двух установок.exe с первым из них делает установку переменных окружения, а второй делает то, что необходимо для истинной установки. Первый из них будет выполняться с помощью setup.exe / VERYSILENT

Я делаю, чтобы добавить системную переменную окружения:

[Setup]

; Tell Windows Explorer to reload the environment
ChangesEnvironment=True

[Registry]
Root: "HKLM"; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; ValueName: "EGPL_GeoLibrarian_Drive"; ValueData: "L"; Flags: createvalueifdoesntexist preservestringtype

Решения в ответе @ Adrian (фактически скопированном из ответа @TLama на аналогичный вопрос) верны для многих ситуаций.

Но это не будет работать для [Run] задач с runasoriginaluser флаг (Что подразумевается под postinstall флаг ). То есть переменная не будет распространяться на приложение, запущенное с помощью обычного флажка "выполнить мою программу" на странице "готово".

Причина в том, что задачи с runasoriginaluser выполняются не повышенным скрытым родителем процесс установки Inno Setup. SetEnvironmentVariable изменит среду для установщика, но не для его родительского процесса. К сожалению, родительский процесс установки не может быть проконтролирован (imo).

В качестве обходного пути, чтобы задать переменную для задач runasoriginaluser, необходимо ввести промежуточный процесс между родительским процессом установщика и задачей, а затем задать переменную промежуточному процессу.

Таким промежуточным процессом легко может быть cmd.exe с его set команда :

[Run]
Filename: "{cmd}"; Parameters: "/C set MYVAR=MyValue & ""{app}\MyProg.exe"""; \
    Description: "Run My Program"; Flags: postinstall runhidden

runhidden флаг скрывает окно консоли cmd.exe, а не приложение (предполагая, что это приложение с графическим интерфейсом). Если это консольное приложение, используйте start чтобы запустить его в собственном (видимом) окне консоли.