加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

程序打包之SetupFactory

发布时间:2020-12-16 23:02:09 所属栏目:大数据 来源:网络整理
导读:http://blog.csdn.net/syf442/archive/2010/08/20/5824198.aspx 近来在做程序打包的工作,从网上了解、下载了N多个打包的程序,虽说一个个介绍的天花乱坠,但是最后还是趋向于主流大家,选择了VS2005自带的SetupeProject、Install Shield 还有 SetupFactory

http://blog.csdn.net/syf442/archive/2010/08/20/5824198.aspx

近来在做程序打包的工作,从网上了解、下载了N多个打包的程序,虽说一个个介绍的天花乱坠,但是最后还是趋向于主流大家,选择了VS2005自带的SetupeProject、Install Shield 还有 SetupFactory 做为主攻方向。
一、VS2005自带的SetupeProject
优点:功能基本完善,用户自定义的功能比较多,对于注册表、系统文件的读取和设置都有比较规整的规则和访问格式;因其直接以工程的形式建立在VS中,所以可以通过建立程序代码的方式来进行自己想要的安装操作,例如安装过程、卸载等都可以自己来写,包括窗体,并且在一个solution中,其dll等动态链接动态更新。
不足:界面美化不够好,安装界面交互的自定义功能不够强大,还有就是其自身封装的.Net Framwork以及Dependence的管理没有参数选项设置,自行其事,用起来不够爽。
二、Install Shield
从网上找了N多,结果没有一个能下载的地方,看来此软件打击盗版的能力不错,只好放弃
三、SetupFactory7.0
他的所有操作几乎都是图形化的,特点主要有:
1、向导化建立工程,方便快捷。
2、支持各种主题,这样可以让你的安装程序更加各性化,而且这些主题都非常漂亮;
3、自动包含卸载程序,不用做单独的工作;
4、控件可以在文件属性中注册为com组件,很方便,很有用;
5、支持卸载程序的自定义;
6、在安装程序中支持脚本运行;
7、可以自定义一组序列号,设置软件的到期控制;
8、支持多形式安装,可以设置自定义、最大、最小安装;
9、支持多种语言,你可以选择多种语言进行安装;
10、提供多种安装模式,WEB单个文件/CDROM/软盘等;

其功能真的是相当强大,最起码来说界面设计和用户交互就省掉了好些力气,再者就是其对脚本运行的支持(好像是VB的样子),使其更像一个小型的开发平台。通过自己编写脚本,在安装过程中运行,再结合其自身已有的种种功能,简直可以无所不能了。下面是我接触到的比较实用的也是网上好多人有疑问的几个问题:

(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,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",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,"BreezeGIS",REG_SZ);
Registry.SetValue(HKEY_CLASSES_ROOT,"BrowserFlags",00000008,REG_DWORD);
Registry.SetValue(HKEY_CLASSES_ROOT,"EditFlags",00000000,"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);
--程序指定


最后想说的是,想操作好脚本,其软件自身带的Help资源丰富,并且简洁易懂,自己总纳闷为啥用English来讲解程序代码就那么好懂呢?!啥时候出中文的编译系统啊! 还有就是SetupFactory的“添加操作”和“添加代码”功能相当强大,给出了常用的各种代码格式,对于小型程序编写相当有人性化和实用性。

P.S. 在将结束本文的时候,看到了一篇“SF7在生成的安装程序中自动完成.NET WORK的安装”的帖子,该作者是通过编写xml配置文件来进行该环境的安装,感觉功能很强大,可惜就是配置参数太庞大,不好掌握,有空再看吧:)

引自: http://bbs.esrichina-bj.cn/esri/thread-46117-1-1.html

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/syf442/archive/2010/08/20/5824198.aspx

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读