7

我刚刚开始使用 inno setup,它似乎运行良好。但是,当我在已安装应用程序的情况下运行安装程序时,它会重新安装。我想给用户卸载。这可能吗?如果可以,怎么做?

具体来说,我为家庭作业编写了一个游戏。我使用 inno setup 做了一个安装程序。该应用程序安装良好,可以使用控制面板卸载,但我的教授希望能够通过重新运行安装程序并选择卸载选项来卸载该应用程序。这将节省他的时间,因为他有大约 50 个这样的作业要标记。

谢谢,

格里

4

3 回答 3

13

当应用程序已经安装在目标系统上时,下一个脚本将生成以下选项表单:

在此处输入图像描述

当用户单击Repair按钮时,通常会启动设置。当用户单击该Uninstall按钮时,先前安装的应用程序将被卸载。当用户关闭该表单时,什么也没有发生。

这是脚本(不要忘记在AppId脚本中为 setup 指令指定一些唯一的值):

[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;
于 2013-01-22T02:27:24.433 回答
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');

备用。

希望能帮助到你。

感谢您提供代码示例。

于 2013-06-28T12:29:32.060 回答
1

使用 Inno Setup 时,没有理由卸载以前的版本,除非该版本是由不同的安装程序安装的。否则会自动处理升级。

你的答案在这里:

InnoSetup:如何自动卸载以前安装的版本? 以前安装的版本

于 2013-01-21T20:58:48.263 回答