需要在程序安装后调用其他软件的安装,关键在于脚本:

if ~~soft1.checked  then~~~~

~~~soft1.bat~~

end

repeat

setupsoft1=~~~~

until not setupsoft1

这是调用一个软件的代码结构。开始打包的那位同学只知道 if ~~~end 不知道后面部分,做的安装包不能把其它软件安装上,其实分析一下就清楚了,中间缺少一步了。

原文链接 :http://www.blog.sh/2006/gisbreeze/106701.html

近来在做程序打包的工作,从网上了解、下载了N多个打包的程序,虽说一个个介绍的天花乱坠,但是最后还是趋向于主流大家,选择了VS2005自带的SetupeProject、Install Shield 还有 SetupFactory 做为主攻方向。
一、VS2005自带的SetupeProject
优 点:功能基本完善,用户自定义的功能比较多,对于注册表、系统文件的读取和设置都有比较规整的规则和访问格式;因其直接以工程的形式建立在VS中,所以可 以通过建立程序代码的方式来进行自己想要的安装操作,例如安装过程、卸载等都可以自己来写,包括窗体,并且在一个solution中,其dll等动态链接 动态更新。
不足:界面美化不够好,安装界面交互的自定义功能不够强大,还有就是其自身封装的.Net Framwork以及Dependence的管理没有参数选项设置,自行其事,用起来不够爽。
二、Install Shield
从网上找了N多,结果没有一个能下载的地方,看来此软件打击盗版的能力不错,只好放弃:P
三、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, "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();

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

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

个人浅见,纯为实用,多多交流。转载请注明出处。

部分资料取材于:
留住这时光  http://stanleyzcm.spaces.live.com/
汉化新世纪论坛 http://bbs.hanzify.org/
Setup Factory 7.0 Group  http://www.indigorose.com/forums/forumdisplay.php?f=43

posted on 2009-08-28 21:44  秋波渡  阅读(1142)  评论(0编辑  收藏  举报