论坛风格切换切换到宽版
  • 4649阅读
  • 5回复

求助:如何使用【code】段控制components的选取 [复制链接]

上一主题 下一主题
离线qiuqiuye
 

发帖
153
金钱
90
威望
9
只看楼主 倒序阅读 0 发表于: 2009-11-14
大家好,我最近使用inno setup时遇到一个问题:

如何使用【code】段控制components的选取。

我查阅了很多的资料还有尝试了几种方法都失败了,

在这里想请问下大家 Inno setup 是否可以利用

【code】段控制控制components的选取?

谢谢大家!
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 1 发表于: 2009-11-14
可以。components 是一个列表,你可以在 CODE 段直接控制该列表每一项的状态。
离线raindy

发帖
1931
金钱
10
威望
1
只看该作者 2 发表于: 2009-11-14
inno中的组件选择默认就可以实现组件选择效果
不至这么复杂还要利用Code来选择文件
偶提供一个自定义名称的组件选择,脚本如下:
QUOTE

[Setup]
AppName=SoftPerfect Bandwidth Manager Lite
AppVerName=SoftPerfect Bandwidth Manager Lite 2.9.10
DefaultDirName={pf}\SoftPerfect Bandwidth Manager
DefaultGroupName=SoftPerfect Bandwidth Manager
OutputBaseFilename=SBML_setup
OutputDir=E:\Hanzify\Han-封包
Compression=lzma
ArchitecturesAllowed=x86 x64
ArchitecturesInstallIn64BitMode=x64
LicenseFile=E:\Hanzify\Han-封包\Network\Bandwidth Manager\{app}\汉化说明.txt
SetupIconFile=E:\Hanzify\Han-封包\Resources\Ico\FlashPlayer Plus.ico
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp

[Files]
Source: "{app}\bwm.exe"; DestDir: "{app}"; Components: gui; MinVersion: 0.0,5.0; Flags: ignoreversion
Source: "{app}\汉化说明.txt"; DestDir: "{app}";Components: gui; MinVersion: 0.0,5.0; Flags: ignoreversion
Source: "{app}\bwm.chm"; DestDir: "{app}"; Components: gui; MinVersion: 0.0,5.0; Flags: ignoreversion
Source: "{app}\bwmsvc.exe"; DestDir: "{app}"; Components: svc; MinVersion: 0.0,5.0; Flags: restartreplace ignoreversion
Source: "{app}\ndisapi.dll"; DestDir: "{app}"; Components: svc; MinVersion: 0.0,5.0; Flags: restartreplace ignoreversion
Source: "{sys}\Drivers\spfdrv.sys"; DestDir: "{sys}\Drivers"; Components: svc; Check: "not Is64BitInstallMode"; MinVersion: 0.0,5.0; OnlyBelowVersion: 0.0,5.01; Flags: ignoreversion
Source: "{app}\spfdrv,1.sys"; DestDir: "{app}"; DestName: "spfdrv.sys"; Components: svc; Check: "not Is64BitInstallMode"; MinVersion: 0.0,5.01; Flags: restartreplace ignoreversion
Source: "{app}\snetcfg,1.exe"; DestDir: "{app}"; DestName: "snetcfg.exe"; Components: svc; Check: "not Is64BitInstallMode"; MinVersion: 0.0,5.01; Flags: ignoreversion
Source: "{app}\spfdrv,1.inf"; DestDir: "{app}"; DestName: "spfdrv.inf"; Components: svc; Check: "not Is64BitInstallMode"; MinVersion: 0.0,5.01;
Source: "{app}\spfdrv_m,1.inf"; DestDir: "{app}"; DestName: "spfdrv_m.inf"; Components: svc; Check: "not Is64BitInstallMode"; MinVersion: 0.0,5.01;
Source: "{app}\spfdrv,2.sys"; DestDir: "{app}"; DestName: "spfdrv.sys"; Components: svc; Check: "Is64BitInstallMode"; MinVersion: 0.0,5.01; Flags: restartreplace ignoreversion
Source: "{app}\snetcfg,2.exe"; DestDir: "{app}"; DestName: "snetcfg.exe"; Components: svc; Check: "Is64BitInstallMode"; MinVersion: 0.0,5.01; Flags: ignoreversion
Source: "{app}\spfdrv,2.inf"; DestDir: "{app}"; DestName: "spfdrv.inf"; Components: svc; Check: "Is64BitInstallMode"; MinVersion: 0.0,5.01;
Source: "{app}\spfdrv_m,2.inf"; DestDir: "{app}"; DestName: "spfdrv_m.inf"; Components: svc; Check: "Is64BitInstallMode"; MinVersion: 0.0,5.01;
Source: "{app}\drvsign,1.exe"; DestDir: "{app}"; DestName: "drvsign.exe"; Components: svc; Check: "Is64BitInstallMode"; MinVersion: 0.0,5.01; OnlyBelowVersion: 0.0,6.0; Flags: deleteafterinstall ignoreversion
Source: "{app}\drvsign,2.exe"; DestDir: "{app}"; DestName: "drvsign.exe"; Components: svc; Check: "not Is64BitInstallMode"; MinVersion: 0.0,5.01; OnlyBelowVersion: 0.0,6.0; Flags: deleteafterinstall ignoreversion

[Types]
Name: "custom"; Description: "安装组件"; MinVersion: 0.0,5.0; Flags: iscustom

[Components]
Name: "svc"; Description: "系统服务"; Types: "custom"; MinVersion: 0.0,5.0;
Name: "gui"; Description: "控制工具 (GUI 前端)"; Types: "custom"; MinVersion: 0.0,5.0;

[Registry]
Root: HKLM; Subkey: "System\CurrentControlSet\Services\SPFDRV"; ValueName: "Type"; ValueType: Dword; ValueData: "$1"; Components: svc; MinVersion: 0.0,5.0; OnlyBelowVersion: 0.0,5.01; Flags: uninsdeletekey
Root: HKLM; Subkey: "System\CurrentControlSet\Services\SPFDRV"; ValueName: "Group"; ValueType: String; ValueData: "Streams Drivers"; Components: svc; MinVersion: 0.0,5.0; OnlyBelowVersion: 0.0,5.01; Flags: uninsdeletevalue
Root: HKLM; Subkey: "System\CurrentControlSet\Services\SPFDRV"; ValueName: "Start"; ValueType: Dword; ValueData: "$1"; Components: svc; MinVersion: 0.0,5.0; OnlyBelowVersion: 0.0,5.01; Flags: uninsdeletevalue
Root: HKLM; Subkey: "System\CurrentControlSet\Services\SPFDRV"; ValueName: "ErrorControl"; ValueType: Dword; ValueData: "$1"; Components: svc; MinVersion: 0.0,5.0; OnlyBelowVersion: 0.0,5.01; Flags: uninsdeletevalue

[Run]
Filename: "{app}\bwmsvc.exe"; Parameters: "/sinstall"; WorkingDir: "{app}"; StatusMsg: "正在安装服务..."; Components: svc; MinVersion: 0.0,5.0;
Filename: "{app}\drvsign.exe"; Parameters: "/off"; StatusMsg: "正在禁用未指派的驱动警告..."; Components: svc; MinVersion: 0.0,5.01; OnlyBelowVersion: 0.0,6.0;
Filename: "{app}\snetcfg.exe"; Parameters: "-v -l spfdrv.inf -m spfdrv_m.inf -c s -i nt_spfdrv"; StatusMsg: "正在安装 x86 NDIS IM 网络驱动..."; Components: svc; Check: "not Is64BitInstallMode"; MinVersion: 0.0,5.01;
Filename: "{app}\snetcfg.exe"; Parameters: "-v -l spfdrv.inf -m spfdrv_m.inf -c s -i nt_spfdrv"; StatusMsg: "正在安装 x64 NDIS IM 网络驱动..."; Components: svc; Check: "Is64BitInstallMode"; MinVersion: 0.0,5.01;
Filename: "{app}\drvsign.exe"; Parameters: "/on"; StatusMsg: "正在启用未指派的驱动警告..."; Components: svc; MinVersion: 0.0,5.01; OnlyBelowVersion: 0.0,6.0;
Filename: "{app}\bwm.exe"; Description:"运行程序(&R)"; Flags: nowait postinstall shellexec
Filename: "{app}\汉化说明.txt"; Description:"汉化说明(&R)"; Flags: nowait postinstall shellexec

[UninstallRun]
Filename: "{app}\bwmsvc.exe"; Parameters: "/suninstall"; WorkingDir: "{app}"; StatusMsg: "正在卸载服务..."; Components: svc; MinVersion: 0.0,5.0;
Filename: "{app}\snetcfg.exe"; Parameters: "-v -u nt_spfdrv"; StatusMsg: "正在卸载 x86 NDIS IM 网络驱动..."; Components: svc; Check: "not Is64BitInstallMode"; MinVersion: 0.0,5.01;
Filename: "{app}\snetcfg.exe"; Parameters: "-v -u nt_spfdrv"; StatusMsg: "正在卸载 x64 NDIS IM 网络驱动..."; Components: svc; Check: "Is64BitInstallMode"; MinVersion: 0.0,5.01;

[Icons]
Name: "{group}\运行程序"; Filename: "{app}\bwm.exe"; Components: gui; MinVersion: 0.0,5.0;
Name: "{group}\汉化说明"; Filename: "{app}\汉化说明.txt"; Components: gui; MinVersion: 0.0,5.0;
Name: "{group}\卸载程序"; Filename: "{uninstallexe}"; Components: gui; MinVersion: 0.0,5.0;
Name: "{group}\用户手册"; Filename: "{app}\bwm.chm"; Components: gui; MinVersion: 0.0,5.0;
Name: "{userdesktop}\SoftPerfect BWM"; Filename: "{app}\bwm.exe"; Components: gui; MinVersion: 0.0,5.0;

[UninstallDelete]
Name: {app}; Type: filesandordirs

预览效果图:
[attachmentid=26883]
离线qiuqiuye

发帖
153
金钱
90
威望
9
只看该作者 3 发表于: 2009-11-16
谢谢楼上两位前辈。

一开始我没有把问题说清楚。

我的目的是这样的:

首先查询注册表中程序的安装路径,如果找到了程序的路径就

利用 msgbox 询问用户要安装那些组件。


if MsgBox('点击安装所选组件,点击“是”安装组件A,点击“否”安装组件B。', mbConfirmation, MB_YESNO) = IDYES then
begin
  安装组件A;
end
else
begin
  安装组件B;
end;

Iscomponents,我只知道这个函数,但是这儿不是我想要的,我想通过上面的msgbox 询问用户的方式----通过用户点击“是”和“否”选择相应的组件安装,然后 Inno 不调用components选择 界面,直接进行安装。

请问前辈,这个怎么实现?谢谢
离线WLDNA

发帖
232
金钱
950
威望
95
只看该作者 4 发表于: 2009-11-16
QUOTE(qiuqiuye @ 2009年 11月 16日 20时 57分) [snapback]365508[/snapback]

谢谢楼上两位前辈。

一开始我没有把问题说清楚。

我的目的是这样的:

首先查询注册表中程序的安装路径,如果找到了程序的路径就

利用 msgbox 询问用户要安装那些组件。


if MsgBox('点击安装所选组件,点击“是”安装组件A,点击“否”安装组件B。', mbConfirmation, MB_YESNO) = IDYES then
begin
  安装组件A;
end
else
begin
  安装组件B;
end;

Iscomponents,我只知道这个函数,但是这儿不是我想要的,我想通过上面的msgbox 询问用户的方式----通过用户点击“是”和“否”选择相应的组件安装,然后 Inno 不调用components选择 界面,直接进行安装。

请问前辈,这个怎么实现?谢谢



呵呵 这个就更简单了,使用 check ,看帮助吧,

然后,声明一个全局变量,判断,返回,就OK了

甚至 都不需要 Components Page,一个提示就好了,


QUOTE

Pascal 脚本: 检查参数
这里是一个被所有段中被参数分开的条目支持的可选参数这就是:

Check
确定是否被处理或不处理的检查函数名。函数必须是一个 [Code] 段中的自定义函数或支持函数。

除单一的名字外,你也可以使用 boolean 表达式。查阅组件和任务参数获取 boolean 表达式的详细资料。

对于每个检查函数,可以包含一个安装程序用于检查函数的逗号隔开的参数列表。允许的参数类型是字符串,整数和布尔数。字符串参数可以包含常量。

这是一个可以从参数列表内部调用的支持函数: ExpandConstant。

示例:
[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"; Check: MyProgCheck
Source: "A\MYFILE.TXT"; DestDir: "{app}"; Check: MyDirCheck(ExpandConstant('{app}\A'))
Source: "B\MYFILE.TXT"; DestDir: "{app}"; Check: DirExists(ExpandConstant('{app}\B'))
所有检查函数必须有一个布尔返回值。如果检查函数 (或布尔表达式) 返回 True,那么条目将被处理,否则跳过。

安装程序可能随时调用检查函数,即使只有一个条目使用检查函数。如果你的函数执行一个长的代码段,你可以通过在全局变量中“缓冲”结果执行代码来优化它。

如果安装程序已经确定不处理条目,那么检查函数不被调用。

这里是上述使用的包含检查函数的 [Code] 段的示例。函数 DirExists 是支持函数,因此不包含在这个 [Code] 段内。

[Code]
var
MyProgChecked: Boolean;
MyProgCheckResult: Boolean;

function MyProgCheck(): Boolean;
begin
if not MyProgChecked then begin
  MyProgCheckResult := MsgBox('Do you want to install MyProg.exe to ' + ExtractFilePath(CurrentFileName) + '?', mbConfirmation, MB_YESNO) = idYes;
  MyProgChecked := True;
end;
Result := MyProgCheckResult;
end;

function MyDirCheck(DirName: String): Boolean;
begin
Result := DirExists(DirName);
end;

潜水,做自己的事,^_^
努力,学习,不断成长……
离线qiuqiuye

发帖
153
金钱
90
威望
9
只看该作者 5 发表于: 2009-11-27
谢谢楼上的指点,呵呵,回去试试看,再次感谢