杉宫竹苑工作室

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

Setup Factory7.0 操作实例

[复制链接]
发表于 2017-2-26 15:50:28 | 显示全部楼层 |阅读模式

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

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

x
(1)读取注册表操作:
都放在Registry类里面作为静态函数使用,主要包括Get()、Set()、DoseKeyExisit()、CreateKey()等,其读取注册表的路径格式采用一般的路径访问格式,如检验.NETwork 2.0是否被安装 Net = Registry.DoesKeyExist(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//.NETwork//policy//v2.0");检验数据访问组件MDAC是否被安装 MDAC= Registry.Get(HKEY_LOCAL_MACHINE, "Software//Microsoft//DataAccess", "Version", true);
我自己添加了一个checkbox的窗体,用来检验系统是否安装了ArcGISEngineRuntime、DotNetFramwork、MDAC,然后根据不同情况进行check设置,代码如下
  1. <!--放入窗体On Prload中-->
  2. EngineRuntime = Registry.Get(HKEY_LOCAL_MACHINE, "Software//ESRI//ArcGIS Engine Runtime", "RealVersion", true);
  3. Net = Registry.DoesKeyExist(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//.NETwork//policy//v2.0");
  4. MDAC= Registry.Get(HKEY_LOCAL_MACHINE, "Software//Microsoft//DataAccess", "Version", true);
  5. tCheckProperties1 = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_01);-- 读取CheckBox01
  6. tCheckProperties2 = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_02);
  7. tCheckProperties3 = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_03);
  8. if(EngineRuntime=="9.2")then
  9. tCheckProperties3.Enabled = false;
  10. tCheckProperties3.Checked = true;
  11. DlgCheckBox.SetProperties(CTRL_CHECK_BOX_03, tCheckProperties3);-- 设置CheckBox01的状态
  12. else
  13. tCheckProperties3.Checked = true;
  14. DlgCheckBox.SetProperties(CTRL_CHECK_BOX_03, tCheckProperties3);
  15. end
  16. if(Net) then
  17. tCheckProperties1.Enabled = false;
  18. tCheckProperties1.Checked = true;
  19. DlgCheckBox.SetProperties(CTRL_CHECK_BOX_01, tCheckProperties1);
  20. else
  21. tCheckProperties1.Checked = true;
  22. DlgCheckBox.SetProperties(CTRL_CHECK_BOX_01, tCheckProperties1);
  23. end
  24. numTemp = String.Left(MDAC, 3);-- 截取字符值MDAC(2.81.1117.0)中的前三位字符
  25. numMDAC = String.ToNumber(numTemp);-- 将该字符值转换为数字
  26. if(numMDAC>=2.6) then
  27. tCheckProperties2.Enabled = false;
  28. tCheckProperties2.Checked = true;
  29. DlgCheckBox.SetProperties(CTRL_CHECK_BOX_02, tCheckProperties2);
  30. else
  31. tCheckProperties2.Checked = true;
  32. DlgCheckBox.SetProperties(CTRL_CHECK_BOX_02, tCheckProperties2);
  33. end
复制代码


(2)安装过程中安装系统组件:
    其实前面的读取注册表功能有一部分就是为这个服务的,首先知道了系统安装没安装该软件环境,然后进行选择性安装。在设计安装流程的时候,这一步应该设计在首页之后用户信息之前,防止给用户以安装过程分离缺少整体性的感觉,也要明确是前期必备软件环境安装。
    在这里,把环境程序打包进安装程序时容易混淆程序来源,它分别有存档、外部、还有“资源”中的初始文件也就是原始文件,存档的文件是要安装在目标程序目录上的,外部的打包进安装程序可以释放到指定目录,只有“资源”中的初始文件是临时释放到TempFolder进行运行然后自清除的,我们需要使用的也是这个存贮方式。
    然后,我们在这个checkbox屏幕中添加相应代码,没有安装而被用户选中的将进行自安装。其中Shell.Execute()是执行指定程序的函数,临时目录的变量为%TempLaunchFolder%,假设该程序文件名为“dotnetfx.exe”,那么可以写成“_TempLaunchFolder.."//dotnetfx.exe"”。这个时候就需要判断这个程序是否执行完毕,才能继续下一步,比如再执行下一个外部程序。这样就得用到循环语句,通过添加代码中的“repeat …until not循环”来进行条件循环,再在循环内加入操作File.IsInUse来读取程序运行状态。
  1. <!--放入窗体On Next中-->
  2. tProperties1 = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_01);
  3. tProperties2 = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_02);
  4. if(tProperties1.Checked and tProperties1.Enabled) then
  5. Shell.Execute(_TempLaunchFolder.."//dotnetfx.exe", "open", "", "", SW_SHOWNORMAL);-- 运行临时文件夹中的dotnetfx.exe文件
  6. end
  7. repeat
  8. SetupEnd1 = File.IsInUse(_TempLaunchFolder.."//dotnetfx.exe");-- 直至dotnetfx.exe运行结束才进行下一步
  9. until not SetupEnd1
  10. if(tProperties2.Checked and tProperties2.Enabled) then
  11. Shell.Execute(_TempLaunchFolder.."//mdac_typ.exe", "open", "", "", SW_SHOWNORMAL);
  12. end
  13. repeat

  14. SetupEnd2 = File.IsInUse(_TempLaunchFolder.."//mdac_typ.exe");
  15. until not SetupEnd2
  16. -- 进入下一个屏幕
  17. Screen.Next();
复制代码


(3) 建立指定文件类型的打开程序关联:
首先看看txt是怎样关联到记事本notepad.exe的(注册表内容):
[HKEY_CLASSES_ROOT/.txt]
(默认)="txtfile"
[HKEY_CLASSES_ROOT/txtfile]
(默认)="文本文档"
[HKEY_CLASSES_ROOT/txtfile/DefaultIcon]
(默认)=%SystemRoot%/system32/shell32.dll,-152
[HKEY_CLASSES_ROOT/txtfile/shell/open/command]
(默认)="notepad.exe
%1"

往注册表里写入上面的内容就可以关联文件了。
所以有一种简洁的方式就是写注册表文件.reg,直接执行它来完成文件类型关联,但是有个问题就是不可控,因为你不知道自己的程序将要被安装到哪个指定目录下。因此还是选择了写脚本的方法来实现。

脚本的位置写在“安装之时”环节中的“On Progress”步骤中。 在以下脚本中,“.BreezeGIS”是我们要关联的扩展名。“BreezeGISfile”是贮存在注册表中的文件类型内部名字。请确认你使用了一个唯一的名字,这样你不会一不小心覆盖其它应用程序的注册表键。

“GISBreeze”是指定与文件类型关联的文件名包含的图标的注册表键。“,0”告诉资源管理器使用 MYPROG.EXE 中的第一个图标索引。(“,1”表示第二个图标索引。)
“BreezeGISfile//shell/open/command”是指定在资源管理器双击该文件类型时执行的程序的注册表键。命令行中的引号是让它可以正确处理长文件名。
  1. --文件类型关联
  2. BreezeGIS = Registry.DoesKeyExist(HKEY_CLASSES_ROOT, ".BreezeGIS");
  3. if(BreezeGIS) then
  4. else
  5. Registry.CreateKey(HKEY_CLASSES_ROOT, ".BreezeGIS");
  6. end
  7. BreezeGISfile = Registry.DoesKeyExist(HKEY_CLASSES_ROOT, "BreezeGISfile");
  8. if(BreezeGISfile) then
  9. else
  10. Registry.CreateKey(HKEY_CLASSES_ROOT, "BreezeGISfile");
  11. Registry.CreateKey(HKEY_CLASSES_ROOT, "BreezeGISfile//DefaultIcon");
  12. Registry.CreateKey(HKEY_CLASSES_ROOT, "BreezeGISfile//shell");
  13. Registry.CreateKey(HKEY_CLASSES_ROOT, "BreezeGISfile//shell//open");
  14. Registry.CreateKey(HKEY_CLASSES_ROOT, "BreezeGISfile//shell//open//command");
  15. end

  16. Registry.SetValue(HKEY_CLASSES_ROOT,".BreezeGIS", "", "BreezeGISfile", REG_SZ);--注册文件类型
  17. result = SessionVar.Expand("%AppFolder%"); --将安装路径展开
  18. Registry.SetValue(HKEY_CLASSES_ROOT, "BreezeGISfile", "", "BreezeGIS", REG_SZ);
  19. Registry.SetValue(HKEY_CLASSES_ROOT, "BreezeGISfile", "BrowserFlags", 00000008, REG_DWORD);
  20. Registry.SetValue(HKEY_CLASSES_ROOT, "BreezeGISfile", "EditFlags", 00000000, REG_DWORD);
  21. Registry.SetValue(HKEY_CLASSES_ROOT, "BreezeGISfile//DefaultIcon", "", result.."//data//Images//icon//GISBreeze.ico,0", REG_SZ);
  22. --图标指定(.. 为字符串连接符)
  23. Registry.SetValue(HKEY_CLASSES_ROOT, "BreezeGISfile//shell//open//command", "", result.."//bin//BREEZEGIS.exe", REG_SZ);
  24. --程序指定
复制代码


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 00:49 , Processed in 0.205406 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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