Inno设置:避免关闭应用程序/任务,除非安装新版本

时间:2016-12-08 12:28:31

标签: inno-setup

我的程序有4个服务,第一个小服务控制其他三个服务(在文件服务器上阻止它们进行覆盖)。第一个非常小而且简单,通常不应该关闭(仅在更新时)。

[Files]
Source: "ctrlserversvc3.exe"; DestDir: "{code:GetInstallDir|Program}"

它位于Files部分。 Inno Setup每次都要求我关闭服务并在最后重新启动它。但它应该只问我设置中的服务何时有更新版本,而不是相同版本。

如果无需更改,我如何告诉Inno安装程序跳过此文件或问题?

1 个答案:

答案 0 :(得分:0)

不幸的是,

Inno Setup在检查文件是否被锁定之前没有检查文件版本。它应该,imho。因为文件最终没有安装,如果它有相同的版本。

无论如何,您可以使用Check parameter;

自行实施检查
[Files]
Source: "ctrlserversvc3.exe"; DestDir: "{code:GetInstallDir|Program}"; \
    Check: IsNewer('{#GetFileVersion("ctrlserversvc3.exe")}')

[Code]

procedure CutVersionPart(var VersionString: string; var VersionPart: Word);
var
  P: Integer;
begin
  P := Pos('.', VersionString);
  if P > 0 then
  begin
    VersionPart := StrToIntDef(Copy(VersionString, 1, P - 1), 0);
    Delete(VersionString, 1, P);
  end
    else
  begin
    VersionPart := StrToIntDef(VersionString, 0);
    VersionString := '';
  end;
end;

function IsNewer(InstalledVersion: string): Boolean;
var
  Filename: string;
  ExistingMS, ExistingLS: Cardinal;
  ExistingMajor, ExistingMinor, ExistingRev, ExistingBuild: Cardinal;
  InstalledMajor, InstalledMinor, InstalledRev, InstalledBuild: Word;
begin
  Filename := ExpandConstant(CurrentFilename);
  Log(Format('Checking if %s should be installed', [Filename]));
  if not FileExists(Filename) then
  begin
    Log(Format('File %s does not exist yet, allowing installation', [FileName]));
    Result := True;
  end
    else
  if not GetVersionNumbers(FileName, ExistingMS, ExistingLS) then
  begin
    Log(Format('Cannot retrieve version of existing file %s, allowing installation',
      [FileName]));
    Result := True;
  end
    else
  begin
    ExistingMajor := ExistingMS shr 16;
    ExistingMinor := ExistingMS and $FFFF;
    ExistingRev := ExistingLS shr 16;
    ExistingBuild := ExistingLS and $FFFF;
    Log(Format('Existing file %s version: %d.%d.%d.%d',
      [FileName, ExistingMajor, ExistingMinor, ExistingRev, ExistingBuild]));

    Log(Format('Installing version: %s', [InstalledVersion]));
    CutVersionPart(InstalledVersion, InstalledMajor);
    CutVersionPart(InstalledVersion, InstalledMinor);
    CutVersionPart(InstalledVersion, InstalledRev);
    CutVersionPart(InstalledVersion, InstalledBuild);
    Log(Format('Installing version: %d.%d.%d.%d',
      [InstalledMajor, InstalledMinor, InstalledRev, InstalledBuild]));

    if (InstalledMajor > ExistingMajor) or
       ((InstalledMajor = ExistingMajor) and (InstalledMinor > ExistingMinor)) or
       ((InstalledMajor = ExistingMajor) and (InstalledMinor = ExistingMinor) and
        (InstalledRev > ExistingRev)) then
    begin
      Log('Installing file that is newer than existing file, ' +
        'allowing installation.');
      Result := True;
    end
      else
    begin
      Log('Installing file that is same or older than existing file, ' +
        'skipping installation.');
      Result := False;
    end;
  end;
end;