Inno Setup 安装包升级处理
添加[Code]
段
Inno Setup 要实现安装包升级检测,需要编写检测代码,其语法是Pascal【看的懂伪代码及C语言的,看起来不会太难】。
首先添加Code段基础代码,inno setup中代码首先会执行InitializeSetup()
,所以我们会在此方法的基础上做升级检测。
``` ini
[Code]
function InitializeSetup(): Boolean;
begin
result := true;
end;
```
定义软件的id和version
安装包通过AppId和AppVersion来找到对应的应用信息。
``` ini
#define appid "{F3234165-547C-4DE1-AF86-767178AF3FAC}"
#define appversion "1.0.0.2"
[Setup]
AppName=HelloWorld
AppId={{#appid}
AppVersion={#appversion}
```
添加版本检测代码
注意检测代码添加至
InitializeSetup
函数之前
- 从注册表中获取已安装的版本
- 比较版本号,弹出升级提示
``` pascal
//旧版本检测,安装新版本
function GetNumber(var temp: String): Integer;
var
part: String;
pos1: Integer;
begin
if Length(temp) = 0 then
begin
Result := -1;
Exit;
end;
pos1 := Pos('.', temp);
if (pos1 = 0) then
begin
Result := StrToInt(temp);
temp := '';
end
else
begin
part := Copy(temp, 1, pos1 - 1);
temp := Copy(temp, pos1 + 1, Length(temp));
Result := StrToInt(part);
end;
end;
function CompareInner(var temp1, temp2: String): Integer;
var
num1, num2: Integer;
begin
num1 := GetNumber(temp1);
num2 := GetNumber(temp2);
if (num1 = -1) or (num2 = -1) then
begin
Result := 0;
Exit;
end;
if (num1 > num2) then
begin
Result := 1;
end
else if (num1 < num2) then
begin
Result := -1;
end
else
begin
Result := CompareInner(temp1, temp2);
end;
end;
function CompareVersion(str1, str2: String): Integer;
var
temp1, temp2: String;
begin
temp1 := str1;
temp2 := str2;
Result := CompareInner(temp1, temp2);
end;
function UpdateSetup(): Boolean;
var
oldVersion: String;
uninstaller: String;
ErrorCode: Integer;
begin
if RegKeyExists(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#appid}_is1') then
begin
RegQueryStringValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#appid}_is1','DisplayVersion', oldVersion);
if (CompareVersion(oldVersion, '{#appversion}') <= 0) then
begin
if MsgBox('已安装版本:' + oldVersion + ' 的应用. 是否覆盖安装新版本?',mbConfirmation, MB_YESNO) = IDYES then
begin
Result := True;
end
else
begin
Result := False;
end;
end
else
begin
MsgBox('已安装较新版本( ' + oldVersion + ' )的应用。安装程序即将退出',mbInformation, MB_OK);
Result := False;
end;
end
else
begin
Result := True;
end;
end;
```
将升级检测流程添加到安装流程中
``` pascal
function InitializeSetup(): Boolean;
var
Success:Boolean;
begin
Success:=true;
//升级检测
if not UpdateSetup() then
begin
Success:=false;
end
else begin end;
result := Success;
end;
```
扩展操作 —— 应用是否打开检测
安装过程中检测旧版本应用是否开启,若开启,则自动关闭,然后继续安装流程。
``` pascal
//-----------------------------------------
//关闭应用
procedure CloseApp(AppName: String);
var
WbemLocator : Variant;
WMIService : Variant;
WbemObjectSet: Variant;
WbemObject : Variant;
begin;
WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
WMIService := WbemLocator.ConnectServer('localhost', 'root\CIMV2');
WbemObjectSet := WMIService.ExecQuery('SELECT * FROM Win32_Process Where Name="' + AppName + '"');
if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
begin
WbemObject := WbemObjectSet.ItemIndex(0);
if not VarIsNull(WbemObject) then
begin
WbemObject.Terminate();
WbemObject := Unassigned;
end;
end;
end;
//--------------------------------------
//安装包初始化
function InitializeSetup(): Boolean;
var
Success:Boolean;
IsRunning: Integer;
begin
Success:=true;
IsRunning:=FindWindowByWindowName('HelloWorld');
if IsRunning<>0 then
begin
if Msgbox('安装程序检测到客户端正在运行。' #13#13 '您必须先关闭它然后单击“是”继续安装,或按“否”退出!', mbConfirmation, MB_YESNO) = idNO then
begin
Success:=false;
end
else
begin
CloseApp('HelloWorld.exe');
end;
end
else begin end;
if Success then
begin
//升级检测
if not UpdateSetup() then
begin
Success:=false;
end
else begin end;
end;
result := Success;
end;
```
掘:奇葩史