在关闭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环境变量的消息[重复]。的主要内容,如果未能解决你的问题,请参考以下文章
Windows 7 上错误的桌面快捷方式图标(Inno Setup)
C/S打包 客户端/windows程序 Inno Setup