杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1860|回复: 0

Inno Setup 实现软件多版本智能化判断决定安装文件而非使用组件勾选安装

[复制链接]
发表于 2017-1-9 10:29:48 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        问题描述:
       在一些插件或汉化文件包装时,需要对多个软件版本进行检索遍历,这就涉及到多版本的判断和安装文件夹与安装文件的对应安装,除了组件的分类安装外,还想自行根据注册表变化来智能判断。最终的目的是实现软件的智能化判断与释放文件。在开始打包前,需要对逻辑进行梳理,才能更好地理解所想要的操作,在编码时才能做到心中有数和达到想要的效果。下面只是列举了一个样本仅供参考,更多需求需要更加用户或打包者的主观意志来决定。


  1. function InitializeSetup (): Boolean;
  2. var
  3. i: integer;
  4. begin
  5. Result := False;
  6. for i := 5 to 9
  7.    begin
  8.    if RegValueExists(HKLM32, 'SOFTWARE\Ulead Systems\ IntToStr\Installer','Path') then begin
  9.         Result := True;
  10.          break;
  11.     end;
  12.    end;
  13. begin
  14.    if Result = False then begin
  15.        MsgBox('检测到没有安装原版,请先安装原版。', mbInformation, MB_OK);
  16.    end;
  17. end;
  18. [Tasks]
  19. Name: K5; Description: 安装插件到版本5.0; Flags: checkablealone;
  20. Name: K6; Description: 安装插件到版本6.0; Flags: checkablealone;
  21. Name: K7; Description: 安装插件到版本7.0; Flags: checkablealone;
  22. Name: K8; Description: 安装插件到版本8.0; Flags: checkablealone;
  23. Name: K9; Description: 安装插件到版本9.0; Flags: checkablealone;

  24. [Files]
  25. Source: {app}\CnFilter.8bf; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\5.0\Installer,Path}\plug; Flags: ignoreversion; Tasks : K5
  26. Source: {app}\CnFilter.8bf; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\6.0\Installer,Path}\plug; Flags: ignoreversion; Tasks : K6
  27. Source: {app}\CnFilter.8bf; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\7.0\Installer,Path}\plug; Flags: ignoreversion; Tasks : K7
  28. Source: {app}\CnFilter.8bf; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\8.0\Installer,Path}\plug; Flags: ignoreversion; Tasks : K8
  29. Source: {app}\CnFilter.8bf; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\9.0\Installer,Path}\plug; Flags: ignoreversion; Tasks : K9
复制代码


改变
  1. [Setup]
  2. AppName=My Program
  3. AppVerName=My Program version 1.5
  4. DefaultDirName={pf}\My Program
  5. DisableProgramGroupPage=yes
  6. UninstallDisplayIcon={app}\MyProg.exe
  7. OutputDir=userdocs:Inno Setup Examples Output

  8. [Files]
  9. Source: MyDll.dll; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\5.0\Installer,Path}\plug; Flags: ignoreversion; Tasks : K5
  10. Source: MyDll.dll; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\6.0\Installer,Path}\plug; Flags: ignoreversion; Tasks : K6
  11. Source: MyDll.dll; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\7.0\Installer,Path}\plug; Flags: ignoreversion; Tasks : K7
  12. Source: MyDll.dll; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\8.0\Installer,Path}\plug; Flags: ignoreversion; Tasks : K8
  13. Source: MyDll.dll; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\9.0\Installer,Path}\plug; Flags: ignoreversion; Tasks : K8

  14. [Tasks]
  15. Name: K5; Description: 安装插件到版本5.0; Flags: unchecked ; check: CheckVersion('5.0')
  16. Name: K6; Description: 安装插件到版本6.0; Flags: unchecked ; check: CheckVersion('6.0')
  17. Name: K7; Description: 安装插件到版本7.0; Flags: unchecked ; check: CheckVersion('7.0')
  18. Name: K8; Description: 安装插件到版本8.0; Flags: unchecked ; check: CheckVersion('8.0')
  19. Name: K9; Description: 安装插件到版本9.0; Flags: unchecked ; check: CheckVersion('9.0')

  20. [code]
  21. function InitializeSetup (): Boolean;
  22.   var
  23.   i: integer;
  24.   begin
  25.     Result := False;
  26.     for i := 5 to 9 do
  27.       begin
  28.       if RegValueExists(HKLM32, 'SOFTWARE\Ulead Systems\' + IntToStr(i) + '.0\Installer','Path') then begin
  29.           Result := True;
  30.           break;
  31.       end;
  32.     end;
  33.     begin
  34.       if Result = False then begin
  35.           MsgBox('检测到没有安装原版,请先安装原版。', mbInformation, MB_OK);
  36.       end;
  37.   end;
  38. end;

  39. function CheckVersion(Version: string): Boolean;
  40. begin
  41.   result:= RegValueExists(HKLM32, 'SOFTWARE\Ulead Systems\' + Version + '\Installer', 'Path');
  42. end;
复制代码


如果不想要用户自选的话,只需要取消Tasks段即可
  1. [Tasks]
  2. Name: K5; Description: 安装插件到版本5.0; Flags: unchecked ; check: CheckVersion('5.0')
  3. Name: K6; Description: 安装插件到版本6.0; Flags: unchecked ; check: CheckVersion('6.0')
  4. Name: K7; Description: 安装插件到版本7.0; Flags: unchecked ; check: CheckVersion('7.0')
  5. Name: K8; Description: 安装插件到版本8.0; Flags: unchecked ; check: CheckVersion('8.0')
  6. Name: K9; Description: 安装插件到版本9.0; Flags: unchecked ; check: CheckVersion('9.0')
复制代码

示例代码如下
  1. [Setup]
  2. AppName=My Program
  3. AppVerName=My Program version 1.5
  4. DefaultDirName={pf}\My Program
  5. DisableProgramGroupPage=yes
  6. UninstallDisplayIcon={app}\MyProg.exe
  7. OutputDir=userdocs:Inno Setup Examples Output

  8. [Files]
  9. Source: MyDll.dll; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\5.0\Installer,Path}\plug; Flags: ignoreversion; check: CheckVersion('5.0')
  10. Source: MyDll.dll; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\6.0\Installer,Path}\plug; Flags: ignoreversion; check: CheckVersion('6.0')
  11. Source: MyDll.dll; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\7.0\Installer,Path}\plug; Flags: ignoreversion; check: CheckVersion('7.0')
  12. Source: MyDll.dll; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\8.0\Installer,Path}\plug; Flags: ignoreversion; check: CheckVersion('8.0')
  13. Source: MyDll.dll; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\9.0\Installer,Path}\plug; Flags: ignoreversion; check: CheckVersion('9.0')

  14. [code]
  15. function InitializeSetup (): Boolean;
  16.   var
  17.   i: integer;
  18.   begin
  19.     Result := False;
  20.     for i := 5 to 9 do
  21.       begin
  22.       if RegValueExists(HKLM32, 'SOFTWARE\Ulead Systems\' + IntToStr(i) + '.0\Installer','Path') then begin
  23.           Result := True;
  24.           break;
  25.       end;
  26.     end;
  27.     begin
  28.       if Result = False then begin
  29.           MsgBox('检测到没有安装原版,请先安装原版。', mbInformation, MB_OK);
  30.       end;
  31.   end;
  32. end;

  33. function CheckVersion(Version: string): Boolean;
  34. begin
  35.   MsgBox(Version, mbInformation, MB_OK);
  36.   result:= RegValueExists(HKLM32, 'SOFTWARE\Ulead Systems\' + Version + '\Installer', 'Path');
  37. end;
复制代码


在这里,其实可以定义几个变量,譬如版本号与路径
var usver        #先定义一个变量
function k5(): Boolean;          #然后用户选择
   usver='5.0'  还是 StrCpy usver '5.0'    还是其他写法       #变量赋值
function k6(): Boolean;
usver='6.0'
function k7(): Boolean;
usver='7.0'
function k8(): Boolean;
usver='8.0'
function k9(): Boolean;
usver='9.0'

#再判断用户选定的版本是否存在,变量的引用是否$usver,以及连接符,你去修改。
if RegValueExists(HKLM32, 'SOFTWARE\Ulead Systems\' + $usver + '\Installer','Path') then

#下面这一句也可以合并成一句了:
result:= RegValueExists(HKLM32, 'SOFTWARE\Ulead Systems\' + $usver + '\Installer', 'Path');

#最后同样:
[Files]
Source: {app}\CnFilter.8bf; DestDir: {reg:HKLM32\SOFTWARE\Ulead Systems\' + $usver + '\Installer,Path}\plug; Flags: ignorever


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-19 21:50 , Processed in 0.114573 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表