正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
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设置,代码如下
- <!--放入窗体On Prload中-->
- EngineRuntime = Registry.Get(HKEY_LOCAL_MACHINE, "Software//ESRI//ArcGIS Engine Runtime", "RealVersion", true);
- Net = Registry.DoesKeyExist(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//.NETwork//policy//v2.0");
- MDAC= Registry.Get(HKEY_LOCAL_MACHINE, "Software//Microsoft//DataAccess", "Version", true);
- tCheckProperties1 = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_01);-- 读取CheckBox01
- tCheckProperties2 = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_02);
- tCheckProperties3 = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_03);
- if(EngineRuntime=="9.2")then
- tCheckProperties3.Enabled = false;
- tCheckProperties3.Checked = true;
- DlgCheckBox.SetProperties(CTRL_CHECK_BOX_03, tCheckProperties3);-- 设置CheckBox01的状态
- else
- tCheckProperties3.Checked = true;
- DlgCheckBox.SetProperties(CTRL_CHECK_BOX_03, tCheckProperties3);
- end
- if(Net) then
- tCheckProperties1.Enabled = false;
- tCheckProperties1.Checked = true;
- DlgCheckBox.SetProperties(CTRL_CHECK_BOX_01, tCheckProperties1);
- else
- tCheckProperties1.Checked = true;
- DlgCheckBox.SetProperties(CTRL_CHECK_BOX_01, tCheckProperties1);
- end
- numTemp = String.Left(MDAC, 3);-- 截取字符值MDAC(2.81.1117.0)中的前三位字符
- numMDAC = String.ToNumber(numTemp);-- 将该字符值转换为数字
- if(numMDAC>=2.6) then
- tCheckProperties2.Enabled = false;
- tCheckProperties2.Checked = true;
- DlgCheckBox.SetProperties(CTRL_CHECK_BOX_02, tCheckProperties2);
- else
- tCheckProperties2.Checked = true;
- DlgCheckBox.SetProperties(CTRL_CHECK_BOX_02, tCheckProperties2);
- end
复制代码
(2)安装过程中安装系统组件:
其实前面的读取注册表功能有一部分就是为这个服务的,首先知道了系统安装没安装该软件环境,然后进行选择性安装。在设计安装流程的时候,这一步应该设计在首页之后用户信息之前,防止给用户以安装过程分离缺少整体性的感觉,也要明确是前期必备软件环境安装。
在这里,把环境程序打包进安装程序时容易混淆程序来源,它分别有存档、外部、还有“资源”中的初始文件也就是原始文件,存档的文件是要安装在目标程序目录上的,外部的打包进安装程序可以释放到指定目录,只有“资源”中的初始文件是临时释放到TempFolder进行运行然后自清除的,我们需要使用的也是这个存贮方式。
然后,我们在这个checkbox屏幕中添加相应代码,没有安装而被用户选中的将进行自安装。其中Shell.Execute()是执行指定程序的函数,临时目录的变量为%TempLaunchFolder%,假设该程序文件名为“dotnetfx.exe”,那么可以写成“_TempLaunchFolder.."//dotnetfx.exe"”。这个时候就需要判断这个程序是否执行完毕,才能继续下一步,比如再执行下一个外部程序。这样就得用到循环语句,通过添加代码中的“repeat …until not循环”来进行条件循环,再在循环内加入操作File.IsInUse来读取程序运行状态。
- <!--放入窗体On Next中-->
- tProperties1 = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_01);
- tProperties2 = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_02);
- if(tProperties1.Checked and tProperties1.Enabled) then
- Shell.Execute(_TempLaunchFolder.."//dotnetfx.exe", "open", "", "", SW_SHOWNORMAL);-- 运行临时文件夹中的dotnetfx.exe文件
- end
- repeat
- SetupEnd1 = File.IsInUse(_TempLaunchFolder.."//dotnetfx.exe");-- 直至dotnetfx.exe运行结束才进行下一步
- until not SetupEnd1
- if(tProperties2.Checked and tProperties2.Enabled) then
- Shell.Execute(_TempLaunchFolder.."//mdac_typ.exe", "open", "", "", SW_SHOWNORMAL);
- end
- repeat
- SetupEnd2 = File.IsInUse(_TempLaunchFolder.."//mdac_typ.exe");
- until not SetupEnd2
- -- 进入下一个屏幕
- 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”是指定在资源管理器双击该文件类型时执行的程序的注册表键。命令行中的引号是让它可以正确处理长文件名。
- --文件类型关联
- BreezeGIS = Registry.DoesKeyExist(HKEY_CLASSES_ROOT, ".BreezeGIS");
- if(BreezeGIS) then
- else
- Registry.CreateKey(HKEY_CLASSES_ROOT, ".BreezeGIS");
- end
- BreezeGISfile = Registry.DoesKeyExist(HKEY_CLASSES_ROOT, "BreezeGISfile");
- if(BreezeGISfile) then
- else
- Registry.CreateKey(HKEY_CLASSES_ROOT, "BreezeGISfile");
- Registry.CreateKey(HKEY_CLASSES_ROOT, "BreezeGISfile//DefaultIcon");
- Registry.CreateKey(HKEY_CLASSES_ROOT, "BreezeGISfile//shell");
- Registry.CreateKey(HKEY_CLASSES_ROOT, "BreezeGISfile//shell//open");
- Registry.CreateKey(HKEY_CLASSES_ROOT, "BreezeGISfile//shell//open//command");
- end
- Registry.SetValue(HKEY_CLASSES_ROOT,".BreezeGIS", "", "BreezeGISfile", REG_SZ);--注册文件类型
- result = SessionVar.Expand("%AppFolder%"); --将安装路径展开
- Registry.SetValue(HKEY_CLASSES_ROOT, "BreezeGISfile", "", "BreezeGIS", REG_SZ);
- Registry.SetValue(HKEY_CLASSES_ROOT, "BreezeGISfile", "BrowserFlags", 00000008, REG_DWORD);
- Registry.SetValue(HKEY_CLASSES_ROOT, "BreezeGISfile", "EditFlags", 00000000, REG_DWORD);
- Registry.SetValue(HKEY_CLASSES_ROOT, "BreezeGISfile//DefaultIcon", "", result.."//data//Images//icon//GISBreeze.ico,0", REG_SZ);
- --图标指定(.. 为字符串连接符)
- Registry.SetValue(HKEY_CLASSES_ROOT, "BreezeGISfile//shell//open//command", "", result.."//bin//BREEZEGIS.exe", REG_SZ);
- --程序指定
复制代码
|