运行已安装应用时使用Inno Setup卸载

8
我刚开始使用Inno Setup,它似乎工作得很好。但是,当我运行已安装了应用程序的安装程序时,它会重新安装。我想让用户卸载应用程序。这可行吗?如果可以,怎样做?
具体而言,我为一个家庭作业编写了一个游戏。我使用Inno Setup制作了一个安装程序。应用程序安装正常,并且可以通过控制面板进行卸载,但我的教授希望能够通过重新运行安装程序并选择卸载选项来卸载应用程序。这将为他节省时间,因为他有大约50个这样的作业要评分。
谢谢,
Gerry

很难猜测你要做什么。例如,当应用程序已安装时,您是否想要询问用户是否要卸载该应用程序?我的意思是,当用户启动安装程序时,会弹出一个确认消息,如“应用程序已安装,您是否要先卸载它?” - TLama
我认为你可以在这里找到答案:http://wix.sourceforge.net/manual-wix3/create_an_uninstall_shortcut.htm - Zz Oussama
这正是我想要做的。如果应用程序已经安装,我不想在未给用户“修复”或“卸载”的选项的情况下覆盖此安装。 - gmoerkerken
更具体地说,当安装程序启动并且用户选择“是”时,您想要为用户提供一个对话框“应用程序已安装,您是否要先卸载它?”然后先前的应用程序将被卸载,是吗? - TLama
我已经更新了问题,使其更具体。 - gmoerkerken
3个回答

13
下面的脚本将在启动安装程序时,如果目标系统上已经安装了应用程序,则创建以下选项表单:

enter image description here

当用户点击“修复”按钮时,通常会启动设置。当用户单击“卸载”按钮时,先前安装的应用程序将被卸载。当用户关闭该表单时,不会发生任何事情。
以下是脚本(不要忘记为您的脚本指定理想的、某些唯一值的AppId设置指令):
[Setup]
AppName=My Program
AppVersion=1.5
AppId=1C9FAC66-219F-445B-8863-20DEAF8BB5CC
DefaultDirName={pf}\My Program
OutputDir=userdocs:Inno Setup Examples Output

[CustomMessages]
OptionsFormCaption=Setup options...
RepairButtonCaption=Repair
UninstallButtonCaption=Uninstall

[Code]
const
  mrRepair = 100;
  mrUninstall = 101;

function ShowOptionsForm: TModalResult;
var
  OptionsForm: TSetupForm;
  RepairButton: TNewButton;
  UninstallButton: TNewButton;
begin
  Result := mrNone;
  OptionsForm := CreateCustomForm;
  try
    OptionsForm.Width := 220;
    OptionsForm.Caption := ExpandConstant('{cm:OptionsFormCaption}');
    OptionsForm.Position := poScreenCenter;

    RepairButton := TNewButton.Create(OptionsForm);
    RepairButton.Parent := OptionsForm;
    RepairButton.Left := 8;
    RepairButton.Top := 8;
    RepairButton.Width := OptionsForm.ClientWidth - 16;
    RepairButton.Caption := ExpandConstant('{cm:RepairButtonCaption}');
    RepairButton.ModalResult := mrRepair;

    UninstallButton := TNewButton.Create(OptionsForm);
    UninstallButton.Parent := OptionsForm;
    UninstallButton.Left := 8;
    UninstallButton.Top := RepairButton.Top + RepairButton.Height + 8;
    UninstallButton.Width := OptionsForm.ClientWidth - 16;
    UninstallButton.Caption := ExpandConstant('{cm:UninstallButtonCaption}');
    UninstallButton.ModalResult := mrUninstall;

    OptionsForm.ClientHeight := RepairButton.Height + UninstallButton.Height + 24;
    Result := OptionsForm.ShowModal;
  finally
    OptionsForm.Free;
  end;
end;

function GetUninstallerPath: string;
var
  RegKey: string;
begin
  Result := '';
  RegKey := Format('%s\%s_is1', ['Software\Microsoft\Windows\CurrentVersion\Uninstall', 
    '{#emit SetupSetting("AppId")}']);
  if not RegQueryStringValue(HKEY_LOCAL_MACHINE, RegKey, 'UninstallString', Result) then
    RegQueryStringValue(HKEY_CURRENT_USER, RegKey, 'UninstallString', Result);
end;

function InitializeSetup: Boolean;
var
  UninstPath: string;
  ResultCode: Integer;  
begin
  Result := True;
  UninstPath := RemoveQuotes(GetUninstallerPath);
  if UninstPath <> '' then
  begin
    case ShowOptionsForm of
      mrRepair: Result := True;
      mrUninstall: 
      begin
        Result := False;
        if not Exec(UninstPath, '', '', SW_SHOW, ewNoWait, ResultCode) then
          MsgBox(FmtMessage(SetupMessage(msgUninstallOpenError), [UninstPath]), mbError, MB_OK);
      end;
    else
      Result := False;
    end;
  end;
end;

谢谢。当我使用Arax的ExpandConstant()代码时,它可以工作。 - Michał Niklas

3
由于某些原因,您的代码出现了问题。
RegKey := Format('%s\%s_is1', ['Software\Microsoft\Windows\CurrentVersion\Uninstall', 
    '{#emit SetupSetting("AppId")}']);

返回的_is1值多了一个{符号。我没有时间检查我的实现有什么错误或者错在哪里,我只能确认我的安装程序可以正常使用。

RegKey := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1');

备选的。

希望有所帮助。

感谢您提供的代码示例。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接