Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inno setup Inno安装程序:在升级时禁用已安装的组件_Inno Setup_Pascalscript - Fatal编程技术网

Inno setup Inno安装程序:在升级时禁用已安装的组件

Inno setup Inno安装程序:在升级时禁用已安装的组件,inno-setup,pascalscript,Inno Setup,Pascalscript,实际上,我们有一个安装程序,在安装过程中有许多组件可供选择,我们希望在客户重新安装我们的软件时禁用已安装的组件(或使其变为灰色/固定) 例如,在第一次安装期间,我们有3个组件,如下所示: Component * International * French * German 在首次安装期间,可以选择所有组件 认识到选择“德语”包,当用户重新安装产品(使用相同的安装程序)以获得新的语言包时,我们希望有这样的功能: Component * International * French * Germ

实际上,我们有一个安装程序,在安装过程中有许多组件可供选择,我们希望在客户重新安装我们的软件时禁用已安装的组件(或使其变为灰色/固定)

例如,在第一次安装期间,我们有3个组件,如下所示:

Component
* International
* French
* German
在首次安装期间,可以选择所有组件

认识到选择“德语”包,当用户重新安装产品(使用相同的安装程序)以获得新的语言包时,我们希望有这样的功能:

Component
* International
* French
* German (already installed)
无法选择“德语”的位置

有没有办法通过Inno设置实现这一点

我找到了,但是示例禁用了整个组件页面,我想保留它

编辑

这是工作为2安装。但是如果我进行第三次安装(用于安装最后一个组件),安装程序将采用第二次安装的组件,而不是第一次安装的组件

我认为这是因为安装程序覆盖了第一次安装的注册表项,因此看不到早期安装的组件

这是第一次安装时的日志和注册表项(选择英文):

这是第二次安装时的日志和注册表项(英语为灰色,无法选择,选择法语):

这是第三次安装时的日志和注册表项


显然,inno安装程序在
Software\Microsoft\Windows\CurrentVersion\Uninstall\AppId\u is1\inno安装程序:所选组件
上每次安装后都会写入,这就是为什么它只适用于第二次安装,但不记得在第三次安装期间,在第一次安装中选择了组件。

您可以从注册表值中提取已安装组件的列表

Software\Microsoft\Windows\CurrentVersion\Uninstall\AppId_is1\Inno Setup: Selected Components
问题是列表使用组件名称,并且无法将名称映射到复选框,因为只有描述是以编程方式公开的(另请参见

幸运的是,Inno安装程序本身将检查以前安装的组件。因此,最简单的解决方案是禁用所有最初检查的组件。如果在升级中添加默认检查的新组件,这将中断

另一种方法是使用,它可以返回所选组件名称和描述的列表。因此,它可以用于将描述映射到名称和名称。但仅适用于所选组件。尽管这对于您的特定用途来说已经足够了。请参阅我的代码中的
selectedcomponentdescriptionontname

一个限制是描述必须是唯一的,否则映射会失败。例如,您不能拥有不同父组件的多个“Deutsch”子组件(这将需要更复杂的代码,如果父组件具有
CheckableOnly
标志,则根本无法工作)

#定义AppId“myapp”
#定义InnoSetupReg\
“软件\Microsoft\Windows\CurrentVersion\Uninstall\”+AppId+“\u is1”
#定义InnoSetupSelectedComponents如“Inno设置:选定组件”
[设置]
AppId={#AppId}
...
[守则]
函数ExtractToken(var S:string):string;
变量
P:整数;
开始
P:=Pos(',,S);
如果P>0,则
开始
结果:=拷贝(S,1,P-1);
删除(S,1,P);
结束
其他的
开始
结果:=S;
S:='';
结束;
结束;
函数SelectedComponentDescriptionName(描述:字符串):字符串;
变量
描述:字符串;
名称:字符串;
开始
描述:=向导SelectedComponents(True);
名称:=向导SelectedComponents(False);
而描述“”可以
开始
结果:=提取令牌(名称);
如果RemoveQuotes(ExtractToken(Descriptions))=描述,则
开始
出口
结束;
结束;
结果:='';
结束;
过程初始化Wizard();
变量
升级:布尔;
SelectedComponents:字符串;
组件:字符串;
名称:字符串;
I:整数;
开始
升级:=
RegQueryStringValue(HKCU,ExpandConstant(“{#InnoSetupReg}”),
“{#InnoSetupSelectedComponentsReg}”,SelectedComponents)或
RegQueryStringValue(HKLM,ExpandConstant(“{{InnoSetupReg}”),
“{#InnoSetupSelectedComponentsReg}”,SelectedComponents);
如果不升级,那么
开始
日志(“新安装”);
结束
其他的
开始
日志(格式('升级,以前安装的组件为[%s]”[
选定的组件]);
当选择组件“”时
开始
组件:=ExtractToken(SelectedComponents);
日志(格式('Found installed component[%s]”,[component]);
对于I:=0到WizardForm.ComponentsList.Items.Count-1 do
开始
如果WizardForm.ComponentList.State[I]=cbChecked,则
开始
姓名:=
SelectedComponentDescriptionName(
WizardForm.ComponentsList.ItemCaption[I]);
如果名称=组件,则
开始
日志(格式('在%d处将已安装组件[%s]禁用为[%s][
名称、WizardForm.ComponentsList.ItemCaption[I],I]);
WizardForm.ComponentsList.ItemEnabled[I]:=False;
结束;
结束;
结束;
结束;
结束;
结束;

我尝试了您的答案,但当我重新启动安装程序时,组件仍然是可选的。但是我在注册表中找到了该项,但似乎没有效果。
WizardForm.ComponentsList.ItemEnabled[I]:=False;
应该使组件不可用吗?我已经用我的代码编辑了我的问题。让我们一起来。我已经为第三次安装编辑了我的问题。如果你有想法的话?我不明白为什么它不应该工作。向我们显示屏幕截图和日志。是的,这就是方法。不要依赖“Inno安装:所选组件”输入:
Deutch
意思是
Deutsch
(德语)或?;)@Smartis是的,没错。我打错了字。
Created temporary directory: C:\Users\mea\AppData\Local\Temp\is-QV8N6.tmp
2016-03-22 14:00:54.354   Upgrading, previously installed components are [languagepacks,languagepacks\english,canecorevit,canecorevit\2016]
2016-03-22 14:00:54.354   Found installed component [languagepacks]
2016-03-22 14:00:54.354   Disabling installed component [languagepacks] as [Content] at 0
2016-03-22 14:00:54.355   Found installed component [languagepacks\english]
2016-03-22 14:00:54.355   Disabling installed component [languagepacks\english] as [Pack International] at 1
2016-03-22 14:00:54.355   Found installed component [canecorevit]
2016-03-22 14:00:54.356   Found installed component [canecorevit\2016]
2016-03-22 14:00:54.356   Disabling installed component [canecorevit\2016] as [REVIT 2016] at 5
2016-03-22 14:02:48.691   Message box (Yes/No):
                          L'assistant d'installation a détecté que les composants suivants sont déjà installés sur votre système :

                          Pack International

                          Désélectionner ces composants ne les désinstallera pas pour autant.

                          Voulez-vous continuer malgré tout ?
2016-03-22 14:02:49.808   User chose Yes.
2016-03-22 14:02:56.000   Starting the installation process.
Created temporary directory: C:\Users\mea\AppData\Local\Temp\is-J7G5A.tmp
2016-03-22 14:07:41.582   Upgrading, previously installed components are [languagepacks,languagepacks\french,canecorevit,canecorevit\2016]
2016-03-22 14:07:41.583   Found installed component [languagepacks]
2016-03-22 14:07:41.583   Disabling installed component [languagepacks] as [Content] at 0
2016-03-22 14:07:41.583   Found installed component [languagepacks\french]
2016-03-22 14:07:41.584   Disabling installed component [languagepacks\french] as [Pack France] at 2
2016-03-22 14:07:41.584   Found installed component [canecorevit]
2016-03-22 14:07:41.584   Found installed component [canecorevit\2016]
2016-03-22 14:07:41.585   Disabling installed component [canecorevit\2016] as [REVIT 2016] at 5
2016-03-22 14:08:14.122   Message box (Yes/No):
                          L'assistant d'installation a détecté que les composants suivants sont déjà installés sur votre système :

                          Pack France

                          Désélectionner ces composants ne les désinstallera pas pour autant.

                          Voulez-vous continuer malgré tout ?
2016-03-22 14:08:15.132   User chose Yes.
Software\Microsoft\Windows\CurrentVersion\Uninstall\AppId_is1\Inno Setup: Selected Components