如何从Inno Setup安装程序设置全局环境变量?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从Inno Setup安装程序设置全局环境变量?相关的知识,希望对你有一定的参考价值。
如何在Inno Setup中设置全局环境变量?
背景:我正在使用Inno安装实用程序,需要在进行实际安装之前设置全局环境变量。
尝试一下:
[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 Frequently Asked Questions - Setting Environment Variables
如果不传播变量更改(请参见Environment variable not recognized [not available] for [Run] programs in 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: Setting a System Environment Variable
在更现代(换句话说,适当的)操作系统下,例如Windows 2000,XP和Windows 2003 Server,环境变量为存储在注册表中的以下项下:
HKEY_LOCAL_MACHINE System CurrentControlSet Control Session Manager 环境
通过在此键下创建新值或通过添加新变量来修改值(如果已经存在)。要删除变量,您可以只需删除其注册表值,除非您要删除扩展值,例如PATH,在这种情况下,您只需删除零件您想要的。
此时,Windows不会知道您所做的更改,除非您注销或重新启动。为了解决这个问题,SetEnv将广播一个WM_SETTINGCHANGE进入系统中的所有窗口。这允许其他正在运行的应用程序(例如,Explorer.exe)将收到通知您的零钱。如果从命令提示符运行SetEnv,则不会更新当前DOS窗口的环境变量。这是主要是因为进程(SetEnv)无法更改其父级的环境(命令提示符)。但是,任何新您打开的DOS /命令提示符将显示新的变量/值。
运行两个setup.exe,第一个执行环境变量的设置,第二个执行真正的设置所需的操作,这会有什么问题。第一个将使用setup.exe / VERYSILENT
运行我正在添加系统范围的环境变量:
[Setup]
; Tell Windows Explorer to reload the environment
ChangesEnvironment=True
[Registry]
Root: "HKLM"; Subkey: "SYSTEMCurrentControlSetControlSession ManagerEnvironment"; ValueType: string; ValueName: "EGPL_GeoLibrarian_Drive"; ValueData: "L"; Flags: createvalueifdoesntexist preservestringtype
在许多情况下,@ Adrian答案中的解决方案(实际上是从@TLama's answer to similar question复制而来的。)
但是它不适用于带有[Run]
的runasoriginaluser
flag任务(runasoriginaluser
隐含了什么)。即该变量将不会传播到使用“完成”页面上的普通“运行我的程序”
原因是postinstall
flag的任务是由Inno Setup安装程序的未升高的隐藏父进程执行的。 postinstall
将更改安装程序的环境,但不会更改其父进程的环境。不幸的是,无法控制安装程序的父进程(imo)。
作为解决方法,要为runasoriginaluser
任务设置变量,您必须在安装程序父进程和任务之间注入一个中间进程,并让该中间进程设置该变量。
这样的中间过程很容易就是SetEnvironmentVariable
及其runasoriginaluser
:
cmd.exe
set
command隐藏set
控制台窗口,而不是应用程序(假设它是GUI应用程序)。如果它是控制台应用程序,请使用[Run] Filename: "{cmd}"; Parameters: "/C set MYVAR=MyValue & ""{app}MyProg.exe"""; Description: "Run My Program"; Flags: postinstall runhidden
在其自己的(可见)控制台窗口中启动它。
以上是关于如何从Inno Setup安装程序设置全局环境变量?的主要内容,如果未能解决你的问题,请参考以下文章
运行 Inno Setup Installer 时如何修改 PATH 环境变量?
在Inno Setup中[Run]程序无法识别[不可用]环境变量
在关闭Inno Setup到Windows之前,发送关于重新检查PATH环境变量的消息[重复]。