Inno setup Inno安装程序:检查新的更新
在阅读了这篇文章之后,我已经根据需要修改了代码,但是我有一些问题 我想做的是,当我运行安装程序时,它会检查新的更新。1) 如果没有新的更新,则不显示任何消息。2) 如果有新的更新,显示一条消息询问您是否要下载它 这是我的代码:Inno setup Inno安装程序:检查新的更新,inno-setup,Inno Setup,在阅读了这篇文章之后,我已经根据需要修改了代码,但是我有一些问题 我想做的是,当我运行安装程序时,它会检查新的更新。1) 如果没有新的更新,则不显示任何消息。2) 如果有新的更新,显示一条消息询问您是否要下载它 这是我的代码: procedure InitializeWizard; var DxLastVersion: string; DxSetupVersion: String; begin if DownloadFile('http://dex.wotanksmods.com/
procedure InitializeWizard;
var
DxLastVersion: string;
DxSetupVersion: String;
begin
if DownloadFile('http://dex.wotanksmods.com/latestver.txt', DxLastVersion) then
MsgBox(DxLastVersion, mbInformation, MB_YESNO)
else
MsgBox(DxLastVersion, mbError, MB_OK)
end;
非常感谢高级版。既然您决定使用通用版本字符串模式,那么您将需要一个函数来解析和比较安装程序的版本字符串和从站点下载的版本字符串。由于Inno设置中没有内置这样的功能,所以您需要有自己的功能 我见过一些比较版本字符串的函数,例如中使用的函数,但我决定编写自己的函数。它可以检测到无效的版本字符串,并将缺少的版本块视为0,这会导致版本字符串的比较相等,如下所示:
1.2.3
1.2.3.0.0.0
以下脚本可能会执行您想要的操作(安装版本由指令定义):
[设置]
AppName=我的程序
AppVersion=1.2.3
DefaultDirName={pf}\My程序
[守则]
常数
设置URL=http://dex.wotanksmods.com/setup.exe';
VersionURL=http://dex.wotanksmods.com/latestver.txt';
类型
TinteGrarray=整数数组;
t比较结果=(
克鲁斯,
皱纹,
大黄蜂
);
函数Max(A,B:整数):整数;
开始
如果A>B,则结果:=A,否则结果:=B;
结束;
函数CompareValue(A,B:整数):t比较结果;
开始
如果A=B,则
结果:=crEquals
其他的
如果A=0)和(索引<长度),则
结果:=A[指数];
结束;
函数CompareVersionStr(常量A,B:string):tCompareSult;
变量
I:整数;
VerLenA,VerLenB:整数;
VerIntA,VerIntB:TIntegerArray;
开始
结果:=皱纹;
VerLenA:=ParseVersionStr(A,VerIntA);
VerLenB:=ParseVersionStr(B,VerIntB);
对于I:=0到最大值(VerLenA,VerLenB)-1 do
开始
结果:=比较值(GetVersionValue(VerIntA,I,VerLenA),
GetVersionValue(VerIntB,I,VerLenB));
如果结果不一致,那么
出口
结束;
结束;
函数下载文件(consturl:string;var响应:string):布尔;
变量
WinHttpRequest:变量;
开始
结果:=真;
尝试
WinHttpRequest:=CreateOleObject('WinHttp.WinHttpRequest.5.1');
WinHttpRequest.Open('GET',URL,False);
WinHttpRequest.Send;
响应:=WinHttpRequest.ResponseText;
除了
结果:=假;
响应:=GetExceptionMessage;
结束;
结束;
函数初始化设置:布尔;
变量
错误代码:整数;
设置版本:字符串;
最新版本:字符串;
开始
结果:=真;
如果下载文件(VersionURL,LatestVersion),则
开始
SetupVersion:='{#SetupSetting('AppVersion')}';
如果CompareVersionStr(最新版本,设置版本)=Cr大于
开始
如果MsgBox('此安装程序有更新版本可用。请执行'+
“你想访问该网站吗?”,MB确认,MB_YESNO)=那么
开始
结果:=非ShellExec(“”,SetupURL,“”,SW_SHOW,ewNoWait,
错误代码);
结束;
结束;
结束;
结束;
如果将版本号存储为单个整数值,将更容易。比较只需要一行代码,而通用版本模式x.x.x
需要解析和比较每个值。这不止一行。我对设置做了一些小的修改,所以我通常必须有2.3版本,例如。两个值就足够了。你能帮我吗?我已经为此工作了好几天,但我无法做到这一点。非常感谢。您可以将数字$00020003(或131075)表示为版本2.3。我一直在检查我的代码,我认为用@TLama所说的简单方法(版本号作为单个整数值)更容易实现。但我还是做不到。有人能帮我吗?提前谢谢。
[Setup]
AppName=My Program
AppVersion=1.2.3
DefaultDirName={pf}\My Program
[Code]
const
SetupURL = 'http://dex.wotanksmods.com/setup.exe';
VersionURL = 'http://dex.wotanksmods.com/latestver.txt';
type
TIntegerArray = array of Integer;
TCompareResult = (
crLesser,
crEquals,
crGreater
);
function Max(A, B: Integer): Integer;
begin
if A > B then Result := A else Result := B;
end;
function CompareValue(A, B: Integer): TCompareResult;
begin
if A = B then
Result := crEquals
else
if A < B then
Result := crLesser
else
Result := crGreater;
end;
function AddVersionChunk(const S: string; var A: TIntegerArray): Integer;
var
Chunk: Integer;
begin
Chunk := StrToIntDef(S, -1);
if Chunk <> -1 then
begin
Result := GetArrayLength(A) + 1;
SetArrayLength(A, Result);
A[Result - 1] := Chunk;
end
else
RaiseException('Invalid format of version string');
end;
function ParseVersionStr(const S: string; var A: TIntegerArray): Integer;
var
I: Integer;
Count: Integer;
Index: Integer;
begin
Count := 0;
Index := 1;
for I := 1 to Length(S) do
begin
case S[I] of
'.':
begin
AddVersionChunk(Copy(S, Index, Count), A);
Count := 0;
Index := I + 1;
end;
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
begin
Count := Count + 1;
end;
else
RaiseException('Invalid char in version string');
end;
end;
Result := AddVersionChunk(Copy(S, Index, Count), A);
end;
function GetVersionValue(const A: TIntegerArray; Index,
Length: Integer): Integer;
begin
Result := 0;
if (Index >= 0) and (Index < Length) then
Result := A[Index];
end;
function CompareVersionStr(const A, B: string): TCompareResult;
var
I: Integer;
VerLenA, VerLenB: Integer;
VerIntA, VerIntB: TIntegerArray;
begin
Result := crEquals;
VerLenA := ParseVersionStr(A, VerIntA);
VerLenB := ParseVersionStr(B, VerIntB);
for I := 0 to Max(VerLenA, VerLenB) - 1 do
begin
Result := CompareValue(GetVersionValue(VerIntA, I, VerLenA),
GetVersionValue(VerIntB, I, VerLenB));
if Result <> crEquals then
Exit;
end;
end;
function DownloadFile(const URL: string; var Response: string): Boolean;
var
WinHttpRequest: Variant;
begin
Result := True;
try
WinHttpRequest := CreateOleObject('WinHttp.WinHttpRequest.5.1');
WinHttpRequest.Open('GET', URL, False);
WinHttpRequest.Send;
Response := WinHttpRequest.ResponseText;
except
Result := False;
Response := GetExceptionMessage;
end;
end;
function InitializeSetup: Boolean;
var
ErrorCode: Integer;
SetupVersion: string;
LatestVersion: string;
begin
Result := True;
if DownloadFile(VersionURL, LatestVersion) then
begin
SetupVersion := '{#SetupSetting('AppVersion')}';
if CompareVersionStr(LatestVersion, SetupVersion) = crGreater then
begin
if MsgBox('There is a newer version of this setup available. Do ' +
'you want to visit the site ?', mbConfirmation, MB_YESNO) = IDYES then
begin
Result := not ShellExec('', SetupURL, '', '', SW_SHOW, ewNoWait,
ErrorCode);
end;
end;
end;
end;