在关闭Inno Setup到Windows之前,发送关于重新检查PATH环境变量的消息[重复]。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在关闭Inno Setup到Windows之前,发送关于重新检查PATH环境变量的消息[重复]。相关的知识,希望对你有一定的参考价值。

ChangesEnvironment 在Inno Setup安装程序问题中,.是已知参数,但在安装程序关闭前没有刷新。

ChangesEnvironment=yes 是已知参数,但在安装程序关闭前没有刷新。

我正在修改 PATH 环境变量,使用Inno-Setup。所以当安装完成后,默认的exe启动了,但是却出现了 "dll not found "的错误,因为Inno-Setup仍然没有关闭,也没有给Windows刷新路径环境,我想让Windows-OS在设置关闭前重新检查更新路径环境。因为Inno-Setup仍然没有关闭,也没有让Windows刷新路径环境,我想让Windows-OS在设置关闭前重新检查更新路径环境。

所以作为暂时的解决方案;我禁用了自动运行默认exe,应用程序需要从桌面图标手动打开。

有没有办法在Inno-Setup关闭之前,立即使用Inno-Setup向windows发送消息API?

答案

在Martin的帮助下,经过下面的修改,工作得很完美。

[Run]
Filename: "{app}{#MyAppExeName}"; BeforeInstall: AppendToPathAndRefresh;Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}";Flags: nowait postinstall shellexec skipifsilent

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

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_WININICHANGE, 0,
    PAnsiChar(S), SMTO_ABORTIFHUNG, 5000, MsgResult);
end;
////////////////////////////////////////////////////////////
function GetProgramFiles(Param: string): string;
begin
if IsWin64 then Result := ExpandConstant('{pf64}')
    else Result := ExpandConstant('{pf32}')
end;

///PATH ENVINRONMENT//////////////////////////////////////////
function Replace(Dest, SubStr, Str: string): string;
var
Position: Integer;
Ok: Integer;
begin
Ok := 1;
while Ok > 0 do
begin
    Position:=Pos(SubStr, Dest);
    if Position > 0 then
    begin
    Delete(Dest, Position, Length(SubStr));
    Insert(Str, Dest, Position);
    end else
    Ok := 0;
end;
Result:=Dest;
end;

procedure AppendToPath();
var
V: string;
Str: string;
begin
RegQueryStringValue(HKLM, 'SYSTEMCurrentControlSetControlSession ManagerEnvironment', 'Path', V)
Str := ExpandConstant('{app}libav');
V := Replace(V, Str, '');
V := V + ';' + Str;
V := Replace(V,';;',';');
RegWriteStringValue(HKLM, 'SYSTEMCurrentControlSetControlSession ManagerEnvironment', 'Path', V)

// MsgBox(V, mbInformation, MB_OK); 
end;

procedure RemoveFromPath();
var
V: string;
Str: string;
begin
RegQueryStringValue(HKLM, 'SYSTEMCurrentControlSetControlSession ManagerEnvironment', 'Path', V)
Str := ExpandConstant('{app}dlls');
V := Replace(V, Str, '');
V := Replace(V,';;',';');
RegWriteStringValue(HKLM, 'SYSTEMCurrentControlSetControlSession ManagerEnvironment', 'Path', V)
//MsgBox(V, mbInformation, MB_OK);
end;

procedure AppendToPathAndRefresh;
begin
AppendToPath;
RefreshEnvironment;
end;

(*
procedure DeinitializeSetup();
begin
AppendToPath();
end;
*)

procedure DeinitializeUninstall();
begin
RemoveFromPath();
end;
///END OF PATH ENVIRONMENT ///////////////////////////////////

以上是关于在关闭Inno Setup到Windows之前,发送关于重新检查PATH环境变量的消息[重复]。的主要内容,如果未能解决你的问题,请参考以下文章

如何用Inno Setup做更新程序

Windows 7 上错误的桌面快捷方式图标(Inno Setup)

在使用 Inno Setup 更新之前压缩本地文件

C/S打包 客户端/windows程序 Inno Setup

Inno Setup:安装其他安装程序并在继续安装之前运行它

inno setup 开机启动