Inno setup Inno安装程序仅卸载某些组件

Inno setup Inno安装程序仅卸载某些组件,inno-setup,uninstallation,pascalscript,Inno Setup,Uninstallation,Pascalscript,对于安装在同一文件夹中的每个不同零售产品,我都有一个通用的应用程序(如媒体播放器),即 C:\ProgramFiles\myapp 而不同的内容(如电影)都安装在同一个文件夹中 C:\ProgramFiles\myapp\movies 对于每个单独的安装(单独的零售产品),我只需创建一个快捷方式,用特定的内容打开应用程序,如mediaplayer-f movie1.mp4,但它可以从相同的环境打开所有其他内容 在我的例子中,问题是卸载。Inno安装程序不支持选择要卸载的组件 我的策略(当时我的想

对于安装在同一文件夹中的每个不同零售产品,我都有一个通用的应用程序(如媒体播放器),即

C:\ProgramFiles\myapp

而不同的内容(如电影)都安装在同一个文件夹中

C:\ProgramFiles\myapp\movies

对于每个单独的安装(单独的零售产品),我只需创建一个快捷方式,用特定的内容打开应用程序,如
mediaplayer-f movie1.mp4
,但它可以从相同的环境打开所有其他内容

在我的例子中,问题是卸载。Inno安装程序不支持选择要卸载的组件

我的策略(当时我的想法)是向用户提供一个自定义表单,以选择要卸载的内容。比如说

[X] Main Application 
[X] Movie1 Full Title Description 
[X] Movie2 Full Title Description
[X] Movie3 Full Title Description
通过这种方式,通用卸载将适用于每个单独的零售安装

问题是:

  • 如何创建这样一个表单
  • 如何扫描公共共享文件夹,即本例中的
    电影
    ,以查找所有已安装的内容,即
    电影1.mp4
    电影2.mp4
  • 如何打开并读取每部电影的标题,以读取一些数据,如完整标题,从而在卸载过程中显示它,而不是文件名
  • 我以前在DOS时代写Pascal代码,但现在我是一名C++/MFC程序员

    有什么想法、建议、策略吗


    致以最诚挚的问候。

    Inno安装程序不支持部分卸载

    卸载完成后,整个应用程序以及所有已安装的组件(电影)将被删除

    您可以做的是在
    初始化安装
    中显示带有电影列表的自定义表单。如果用户选择仅卸载(部分)电影,而不卸载整个应用程序(查看器),则可以使用自己的代码删除电影并中止卸载(通过从
    初始化安装中返回
    False
    )。如果用户选择卸载所有内容,则让卸载完成

    函数InitializeUninstall():布尔值;
    变量
    表格:TSetupForm;
    确定按钮、取消按钮:TNewButton;
    CheckListBox:TNewCheckListBox;
    一、 计数,已删除:整数;
    FindRec:TFindRec;
    MoviePath:string;
    电影:停机坪;
    开始
    MoviePath:=ExpandConstant(“{app}\movies\”);
    计数:=0;
    如果FindFirst(MoviePath+'*',FindRec),则
    开始
    尝试
    重复
    如果FindRec.Attributes和FILE_ATTRIBUTE_DIRECTORY=0,则
    开始
    公司(计数);
    设置阵列长度(电影、计数);
    电影[Count-1]:=FindRec.Name;
    结束;
    直到没有FindNext(FindRec);
    最后
    FindClose(FindRec);
    结束;
    结束;
    如果计数=0,则
    开始
    日志('未发现正在进行完全卸载的电影');
    结果:=真;
    结束
    其他的
    开始
    日志(格式('找到%d部电影',[Count]);
    表单:=CreateCustomForm();
    尝试
    Form.ClientWidth:=ScaleX(350);
    Form.ClientHeight:=ScaleY(250);
    表单.标题:=“卸载”;
    形式、位置:=poDesktopCenter;
    CheckListBox:=TNewCheckListBox.Create(表单);
    CheckListBox.Parent:=表单;
    CheckListBox.Left:=ScaleX(10);
    CheckListBox.Width:=Form.ClientWidth-2*CheckListBox.Left;
    CheckListBox.Top:=ScaleY(10);
    复选框。高度:=
    Form.ClientHeight-ScaleY(23+10+10+CheckListBox.Top);
    CheckListBox.AddCheckBox(
    '卸载查看器和所有电影','',0,真,真,真,真,零);
    对于I:=0进行计数-1 do
    开始
    AddCheckBox(电影[I],'',1,真,真,假,真,零);
    结束;
    确定按钮:=TNewButton.Create(表单);
    OKButton.Parent:=表单;
    宽度:=ScaleX(75);
    确定按钮高度:=ScaleY(23);
    OKButton.Left:=Form.ClientWidth-ScaleX(75+6+75+10);
    OKButton.Top:=Form.ClientHeight-ScaleY(23+10);
    OK按钮。标题:=“OK”;
    OKButton.ModalResult:=mrOk;
    OK按钮。默认值:=True;
    CancelButton:=TNewButton.Create(表单);
    CancelButton.Parent:=表单;
    CancelButton.Width:=OKButton.Width;
    CancelButton.Height:=OKButton.Height;
    CancelButton.Left:=OKButton.Left+OKButton.Width+ScaleX(6);
    CancelButton.Top:=OKButton.Top;
    取消按钮。标题:=“取消”;
    CancelButton.ModalResult:=mrCancel;
    CancelButton.Cancel:=True;
    Form.ActiveControl:=复选框;
    如果Form.ShowModal()mrOk,则
    开始
    日志(“用户已取消卸载”);
    结果:=假;
    结束
    其他的
    开始
    如果CheckListBox.State[0]=cbChecked,则
    开始
    日志(“用户选择完成卸载”);
    结果:=真;
    结束
    其他的
    开始
    对于I:=0进行计数-1 do
    开始
    如果CheckListBox.Checked[I+1],则
    开始
    如果删除文件(MoviePath+Movies[I]),则
    开始
    公司(已删除);
    日志(格式(‘已删除的电影%s’,[Movies[I]]);
    结束
    其他的
    开始
    MsgBox(格式('Error deleting%s',[Movies[I]]),mbError,MB_OK);
    结束;
    结束;
    结束;
    MsgBox(格式(‘已删除%d部电影’,[Deleted]),MB信息,MB_OK);
    结果:=假;
    结束;
    结束;
    最后
    Form.Free();
    结束;
    结束;
    结束;
    

    Inno安装程序不支持部分卸载

    卸载完成后,整个应用程序以及所有已安装的组件(电影)将被删除

    您可以做的是在
    初始化安装
    中显示带有电影列表的自定义表单。如果用户选择仅卸载(部分)电影,而不是整个应用程序(查看器),则可以使用自己的代码删除电影并中止卸载a