Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inno setup Inno安装程序:检查新的更新_Inno Setup - Fatal编程技术网

Inno setup Inno安装程序:检查新的更新

Inno setup Inno安装程序:检查新的更新,inno-setup,Inno Setup,在阅读了这篇文章之后,我已经根据需要修改了代码,但是我有一些问题 我想做的是,当我运行安装程序时,它会检查新的更新。1) 如果没有新的更新,则不显示任何消息。2) 如果有新的更新,显示一条消息询问您是否要下载它 这是我的代码: procedure InitializeWizard; var DxLastVersion: string; DxSetupVersion: String; begin if DownloadFile('http://dex.wotanksmods.com/

在阅读了这篇文章之后,我已经根据需要修改了代码,但是我有一些问题

我想做的是,当我运行安装程序时,它会检查新的更新。1) 如果没有新的更新,则不显示任何消息。2) 如果有新的更新,显示一条消息询问您是否要下载它

这是我的代码:

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;