ees*_*ees 6 installer inno-setup environment-variables
如何在Inno Setup中设置全局环境变量?
背景:我正在使用Inno安装实用程序,需要在进行实际安装之前设置全局环境变量.
Adr*_*ian 13
试试这个:
[Registry]
Root: HKCU; Subkey: "Environment"; ValueType:string; ValueName: "VARIABLE_NAME"; \
ValueData: "new_value"; Flags: preservestringtype
Run Code Online (Sandbox Code Playgroud)
您可能需要添加以下内容:
[Setup]
; Tell Windows Explorer to reload the environment
ChangesEnvironment=yes
Run Code Online (Sandbox Code Playgroud)
或者尝试:
[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;
Run Code Online (Sandbox Code Playgroud)
如果未传播变量更改(请参阅Inno Setup中[Run]程序未识别[不可用]的环境变量)
[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;
Run Code Online (Sandbox Code Playgroud)
更多细节:
在更现代(换句话说,正确)的操作系统(如Windows 2000,XP和Windows 2003 Server)下,环境变量以下列密钥存储在注册表中:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
通过在此键下创建新值或通过修改值(如果已存在)来添加变量.要删除变量,只需删除其注册表值,除非您要删除部分扩展值,例如PATH,在这种情况下,您只删除所需的部分.
此时,除非您注销或重新启动,否则Windows将不会注意您的更改.为了解决这个问题,SetEnv将向系统中的所有窗口广播 WM_SETTINGCHANGE.这允许其他正在运行的应用程序(例如,Explorer.exe)通知您的更改.如果从命令提示符运行SetEnv,则不会更新当前DOS窗口的环境变量.这主要是因为进程(SetEnv)无法更改其父级(命令提示符)的环境.但是,您打开的任何新DOS/Command提示符都将显示新的变量/值.
@Adrian 的答案中的解决方案(实际上是从@TLama 对类似问题的答案复制的)在许多情况下都是正确的。
但它不适用于具有flag 的[Run]任务( flag所暗示的含义)。即,该变量不会传播到使用“已完成”页面上常见的“运行我的程序”复选框运行的应用程序。runasoriginaluserpostinstall
原因是任务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
Run Code Online (Sandbox Code Playgroud)
该runhidden标志隐藏cmd.exe控制台窗口,而不是应用程序(假设它是 GUI 应用程序)。如果它是控制台应用程序,请start在其自己的(可见)控制台窗口中启动它。
| 归档时间: |
|
| 查看次数: |
18017 次 |
| 最近记录: |