gpt4 book ai didi

environment-variables - Inno Setup 中的 [Run] 程序无法识别环境变量 [不可用]

转载 作者:行者123 更新时间:2023-12-04 02:54:18 34 4
gpt4 key购买 nike

我有一个 license.exe 文件,最后在我的安装代码中调用,

代码需要设置环境变量才能正常工作,

代码如下:

[Registry]
; set PATH
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; \
ValueType: string; ValueName: "PATH"; ValueData: "{app}"

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

[Run]
Filename: "{app}\temp\installation_files\license.exe";

代码在这里执行,但没有找到正确的路径。

当我检查系统环境变量时,它设置正确,

当我运行 license.exe之后手动编写代码,它可以正常工作并查看环境变量。

有人可以告诉我如何解决这个问题吗?

或者怎么延迟 [Run]直到系统识别环境变量?

最佳答案

为执行来自 [Run] 的条目而创建的进程部分继承其父进程的环境块,即安装程序本身。因此,您必须为安装程序设置环境变量,并让它继承到您执行的应用程序。下面的脚本显示了如何做到这一点:

[Run]
Filename: "{app}\temp\installation_files\license.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('PATH', ExpandConstant('{app}')) then
MsgBox(SysErrorMessage(DLLGetLastError), mbError, MB_OK);
end;

通知系统其余部分有关变量更改的先前答案:

正如@Jerry 在他的评论中指出的那样,在 [Run] 之后执行有关环境变化的通知。部分进行处理。其实是 one of the last things由安装程序执行。

因此,在处理 [Run] 之前通知系统有关环境变化的信息。部分,您需要有一个解决方法。我重写了 RefreshEnvironment 从 Inno Setup 代码到脚本的过程。如果您有 ChangesEnvironment,它与执行的功能相同指令设置为 yes .

在以下脚本中,我删除了 ChangesEnvironment指令并添加了 RefreshEnvironment 的执行程序来自 AfterInstall 注册表项的参数函数:

[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; \
ValueType: string; ValueName: "PATH"; ValueData: "{app}"; \
AfterInstall: RefreshEnvironment;

[Run]
Filename: "{app}\temp\installation_files\license.exe";

[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;

关于environment-variables - Inno Setup 中的 [Run] 程序无法识别环境变量 [不可用],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21708140/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com