Как установить глобальную переменную окружения из программы установки Inno Setup?
Как задать глобальную переменную окружения в программе установки Inno?
фон: я использую утилиту установки Inno и должен установить глобальную переменную окружения, прежде чем я сделаю фактическую установку.
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
чтобы запустить его в собственном (видимом) окне консоли.