从Installaware/MSI迁移到Inno Setup

问题描述 投票:0回答:1

几年前,作为 Embarcadero 产品的一部分,我已经使用 Installaware 12 很长时间了。 Embarcadero 下载不再提供此功能,而且 installaware 对于业余开发人员来说非常昂贵。因此,我想将现有的 Installaware 项目迁移到 Inno Setup。

我已经弄清楚如何设置安装程序并将我的文件放置在我想要的位置。 理想情况下,我希望 Inno Setup 安装程序替换我现有的应用程序,而不是进行另一个安装,以便我可以向人们发送我的应用程序的更新,它将替换以前的安装。

Installaware 具有用于安装的“产品代码”和“修订版本代码”。 是否可以在 Inno Setup 中使用这些,以便安装程序将我的应用程序识别为由 installaware 安装的应用程序。

如果是这样,我该怎么做?

我尝试将 Inno Setup“AppId”设置为“产品代码”,但这似乎不起作用,我最终在 Windows 中得到了一个新应用程序。

windows-installer inno-setup installaware
1个回答
1
投票

您可以在

InitializeSetup
中自由卸载任何您想要的 MSI 软件包(由 InstallAware 或其他工具生成)。

[Code]
const
  INSTALLSTATE_DEFAULT = 5;
  ProductCode = '{34144E9F-E889-467D-A28C-3858D9EBAE24}'; // PHP Manager 2 for IIS is used here. Replace with the actual MSI Product Code

function MsiQueryProductState(ProductCode: String): Integer;
  external '[email protected] stdcall';

function IsMSIInstalled(ProductCode: String): Boolean;
var
  State: Integer;
begin
  State := MsiQueryProductState(ProductCode);
  if State = INSTALLSTATE_DEFAULT then
    Result := True
  else
    Result := False;
end;

function InitializeSetup(): Boolean;
var
  UserResponse: Integer;
  ResultCode: Integer;
begin
  if IsMSIInstalled(ProductCode) then
  begin
    UserResponse := MsgBox('An existing installation of this MSI package was detected. Do you want to uninstall it before proceeding?', mbConfirmation, MB_YESNO);
    if UserResponse = IDYES then
    begin
      if Exec('msiexec.exe', '/x ' + ProductCode + ' /quiet /norestart', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then
      begin
        if ResultCode = 0 then
          MsgBox('MSI uninstalled successfully.', mbInformation, MB_OK)
        else
          MsgBox('MSI uninstallation failed with error code: ' + IntToStr(ResultCode), mbError, MB_OK);
      end;
    end
    else
    begin
      MsgBox('Proceeding with installation without uninstalling the existing MSI package.', mbInformation, MB_OK);
    end;
  end
  else
  begin
    MsgBox('Didn''t find an existing installation', mbInformation, MB_OK);
  end;

  Result := True;
end;

请注意,该代码仅用于演示目的。您必须进一步修改它以满足您的确切要求。

© www.soinside.com 2019 - 2024. All rights reserved.