使用VisualStudio制作安装包精.docx
《使用VisualStudio制作安装包精.docx》由会员分享,可在线阅读,更多相关《使用VisualStudio制作安装包精.docx(24页珍藏版)》请在冰豆网上搜索。
使用VisualStudio制作安装包精
使用VisualStudio制作安装包
殷海峰
2012年08月04日
变更记录
日期作者说明2012.08.04殷海峰完成初稿
I
第1章简介(1
第2章后处理模块(2
2.1新建项目(2
2.2增加可重定位文件(2
2.3增加安装位置固定的文件(4
2.4编译(5
第3章系统必需(6
3.1收集文件(6
3.2新建项目(6
3.3增加自定义文件夹(6
3.4设置部署位置(8
3.5设置部署条件(8
3.6卸载时不删除(10
3.7编译(11
第4章MapX控件(12
4.1注册COM组件(12
4.2注册表(13
4.3编译(14
第5章主安装项目(15
5.1新建项目(15
5.2增加系统必需(15
5.3增加后处理模块(16
5.4增加MapX控件(17
5.5增加应用程序文件(18
5.6创建快捷方式(19
5.6.1主程序快捷方式(19
II
5.6.2“卸载程序”快捷方式(21
5.6.3快捷方式的问题(22
5.7详述项目属性(22
5.7.1AddRemoveProgramsIcon属性(24
5.7.2InstallAllUsers属性(25
5.7.3Localization属性(26
第6章杂项(27
6.1安装程序(27
6.2vdproj文件格式(27
6.3脚本(28
6.4点评(28
6.4.1优点(28
6.4.2缺点(29
III
第1章简介
第1章简介
制作安装包的工具很多,本文只讨论如何通过VS2008来打包GISMapperOffice程序。
GISMapperOffice需要安装的文件很多,大致分为如下几类:
1、后处理模块所需文件;
2、系统必需文件,如:
mfc42.dll、msvcrt.dll……
3、MapX控件所需文件;
4、BCGCBPro界面库所需文件;
5、主程序。
为了便于复用,这些文件不会完全加到一个“安装和部署”项目里,而是将它们拆分成了若干子项目。
每个子项目负责打包一组文件,最终合成一个安装包。
1
第2章后处理模块
后处理模块的文件分为两大类,一类文件要安装到CommonFiles目录下,另一类文件要和主程序(exe文件在同一文件夹下。
2.1新建项目
使用VS2008新建一个名为Post的“安装和部署”项目,如下图所示:
图2.1新建合并模块
注意:
一定要选择“合并模块项目”。
因为我们并不希望这个项目直接生成安装文件(*.msi和Setup.exe,而是希望它生成模块文件(*.msm供其它安装项目调用。
2.2增加可重定位文件
2
新建项目后,可以看到下图所示的“文件系统”。
如果看不到,请使用鼠标左键单击VS2008的【视图】【编辑器】【文件系统】菜单项。
图2.2文件系统
“ModuleRetargetable文件夹”表示该文件夹下的文件安装到电脑上的路径不固定,是可以重新定位的。
后处理模块所需的文件中,需要和exe文件在一起的文件可以放在这个“ModuleRetargetable文件夹”下。
具体操作为:
鼠标右键单击左窗格的“ModuleRetargetable文件夹”。
在弹出菜单中,单击【添加】【文件】(或【文件夹】将需要的文件添加进来即可。
图2.3增加文件或文件夹
也可以通过鼠标将文件或文件夹从资源管理器里拖放到上图的右窗格内,这样最简单。
增加文件后,显示如下:
3
图2.4增加文件后的显示
2.3增加安装位置固定的文件
后处理模块的文件中,有一部分需要安装到CommonFiles目录下。
一般情况下,这个目录位于C:
\ProgramFiles\CommonFiles。
但也有特殊情况,如:
系统盘为D的WindowsXP,这个目录就是D:
\ProgramFiles\CommonFiles。
再比如:
64位的Windows7下,这个目录就是C:
\ProgramFiles(x86\CommonFiles。
首先,需要添加CommonFiles目录,其操作如下图所示:
鼠标右键单击“目标计算机上的文件系统”,在弹出菜单中单击【添加特殊文件夹】下的【CommonFiles文件夹】菜单项
图2.5添加CommonFiles文件夹
下图中,可以看到CommonFiles文件夹已经被添加。
可以在这个文件夹
4
里添加所需的文件和文件夹,具体操作可参考上一节的内容。
图2.6添加CommonFiles文件夹之后的显示
2.4编译
选择解决方案配置为Release,然后单击【生成】菜单下的【生成解决方案】或【重新生成解决方案】菜单项。
VS2008将我们添加的文件编译打包至一个独立的文件——Post.msm,在Release目录下可以找到该文件。
msm文件是可以被其它“安装和部署”项目直接引用的,具体方法在后继章节里介绍。
5
第3章系统必需
第3章系统必需
GISMapperOffice采用VC++6.0开发,因此一些文件是必需的,如:
mfc42.dll、msvcrt.dll……这些文件将被安装到电脑的System目录下,供多个程序共同使用。
3.1收集文件
同样的mfc42.dll文件,在Windows98、Windows2000、WindowsXP……是不同的。
如果从WindowsXP的System目录下(一般位于C:
\Windows\System32获得mfc42.dll,然后直接安装到Windows98的System目录下(一般位于C:
\Windows\System,这个文件很可能是不能用的。
因此,需要针对各种操作系统,分别搜集mfc42.dll。
Windows2000及其以上版本的Windows,系统自带了诸如mfc42.dll、msvcrt.dll……这些常见的文件,搜集起来很容易,直接到C:
\Windows或C:
\WinNT目录下查找,然后复制出来即可。
Windows98就比较麻烦了,系统没有自带这些常用的文件。
只能安装VC++6.0或其它一些软件之后,到C:
\Windows目录下查找,然后复制出来。
建立三个文件夹:
win98、win2000、winXP,将GISMapperOffice需要的动态库文件(ATL.dll、mfc42.dll、msvcrt.dll、oleaut32.dll……从Windows98、Windows2000、WindowsXP里复制出来,粘贴到各个文件夹内。
3.2新建项目
使用VS2008新建一个“合并模块项目”,项目名称为SystemDll。
具体操作请参考上一章的内容。
3.3增加自定义文件夹
6
鼠标右键单击“目标计算机上的文件系统”,在弹出菜单中,单击【添加特殊文件夹】下的【Custom文件夹】
图3.1增加自定义文件夹
VS2008显示如下。
请输入文件夹名称,如:
win98,然后按下Enter键。
win98文件夹就被创建出来。
图3.2创建自定义文件夹
7
使用相同的方法再创建win2000、winXP文件夹,最后显示如下:
图3.3添加文件夹后的显示
再把Windows98、Windows2000、WindowsXP需要的文件分别增加到上图的win98、win2000、winXP文件夹下。
具体操作请参考上一章的内容。
3.4设置部署位置
我们希望win98、win2000、winXP这三个文件夹里的文件将被安装到目标电脑的System目录下。
以win98文件夹的设置为例,其步骤如下:
鼠标左键单击win98文件夹,然后设置DefaultLocation属性为[SystemFolder]。
图3.4设置部署位置
使用相同的方法,设置win2000、winXP文件夹的部署位置。
3.5设置部署条件
8
win98下的文件只能安装到Windows98或WindowsMe;win2000下的
文件只能安装到Windows2000;winXP下的文件只能安装到WindowsXP
及其以上版本的Windows。
这些需要设置部署条件。
鼠标左键单击win98文件夹,设置Condition属性为Version9X>=410。
这样win98下的文件只能被部署到Windows98及WindowsMe下。
图3.5设置win98部署条件
请设置win2000的Condition属性为VersionNT=500。
请设置winXP的Condition属性为VersionNT>=501。
需要说明的是:
Version9X是Windows9X的版本号,VersionNT是WinN
T的版本号,它们都等于主版本号乘以100再加上次版本号。
具体见下表:
表3.1Version9X和VersionNT说明
操作系统主版本次版本Version9XVersionNT
9540400
Windows
Windows98419982398?
Windows98第2版410410
WindowsMe490490
WindowsNT3/NT43/4未知未知
200050500Windows
Windows
XP51501
200352502Windows
WindowsVista和2008
60600
61601
Windows7和2008
R2
9
需要说明的是,如果部署到Windows7下,不要担心winXP文件夹下的文件会破坏Windows7已有的文件。
因为安装的时候,安装程序会比较文件的版本号,WindowsXP文件的版本号比Windows7文件的版本号低,因此不会覆盖。
3.6卸载时不删除
System目录下的文件是公用的。
卸载程序的时候,如果把mfc42.dll这些文件也删除掉,会导致其它程序不能运行。
所以在卸载程序的时候是不能删除这类文件的,具体的设置如下:
鼠标左键单击win98文件夹,然后全选该文件夹下所有文件,最后设置这些文件的Permanent为True。
这样在卸载程序的时候,这些文件就不会被删除了。
使用相同方法设置win2000、winXP下的所有文件的Permanent属性。
图3.6
注意:
在Windows2000及其以上版本的Windows,System目录下的文件是有保护机制的。
如:
在WindowsXP的C:
\Windows\System32目录下搜索mfc42.dll,你会发现有两个这样的文件,如下图所示。
如果有安装程序破坏、删除了mfc42.dll,Windows系统会根据C:
\Windows\System32\dllcache下的备份恢复。
10
图3.7文件保护机制3.7编译
请编译生成SystemDll.msm,以备后用。
11
第4章MapX控件
使用VS2008新建一个“合并模块项目”,项目名称为MapX。
把需要部署的文件增加进来。
4.1注册COM组件
MapX5.00.30的安装文件中,有两个COM组件需要注册:
MapX50.dll需要用regsvr32.exe注册;mdatasetint.tlb是类型库,需要用regtyplib.exe注册。
对于MapX50.dll请选择注册方式为vsdrfCOMSelfReg;
对于mdatasetint.tlb请选择注册方式为vsdrfCOM;
图4.1注册属性
事实上,把文件增加进来的时候,VS2008一般情况下都能很好的判断出使用何种注册方式。
不过一旦安装时发生组件注册错误的时候,请认真考虑该如何设置这一项。
12
4.2注册表
安装MapX控件需要修改注册表。
在本机上安装MapX之后,运行regedit.exe,进入注册表编辑器。
导出HKEY_LOCAL_MACHINE\SOFTWARE\MapInfo\MapX\5.0至一个reg文件。
图4.2注册表
VS2008里,单击【视图】【编辑器】【注册表】
图4.3打开安装项目的注册表
可以看到将要部署到目标计算机上的注册表项目:
图4.4安装项目的注册表
13
鼠标右键单击“目标计算机上的注册表”,在弹出菜单里单击【导入】菜单项,将本机导出的reg文件导入。
这样就省去了一项一项增加注册表项目的麻烦。
往注册表里写入的内容并不是固定不变的。
下面标有下划线、粗体部分是MapX50.dll的安装目录。
[HKEY_LOCAL_MACHINE\SOFTWARE\MapInfo\MapX\5.0]"CommonDLLDir"="C:
\\ProgramFiles\\Dacel\\GISMapperOffice\\MapX5.0""GeoDictionary"="C:
\\ProgramFiles\\Dacel\\GISMapperOffice\\MapX5.0\\GeoDict.DCT""ProgramDir"="C:
\\ProgramFiles\\Dacel\\GISMapperOffice\\MapX5.0""SearchPaths"=""
"VersionCode"="5.01"
问题是:
现在无法知道MapX50.dll的安装目录,怎么办?
请使用一个变量来代替吧,如:
MAPXPATH,然后将上面下划线部分替换为[MAPXPATH]。
具体的就是修改下图中CommonDLLDir、GeoDictionary、ProgramDir的Value属性,修改结果如下图所示。
图4.5注册表里使用变量
注意:
变量名MAPXPATH里不能有小写字母。
至于安装程序如何将MapX50.dll的安装路径传递给MAPXPATH,后面的章节将做说明。
4.3编译
请编译MapX项目,生成MapX.msm,以备后用。
14
第5章主安装项目
这一章将搭建GISMapperOffice的主安装项目。
5.1新建项目
与前几章不同,主安装项目的项目类型为“安装项目”,如下图所示:
图5.1新建项目类型
编译这种类型的项目,生成的将是最终的安装程序(*.msi和Setup.exe。
5.2增加系统必需
现在把第3章生成的SystemDll.msm添加到主安装项目GMO里,其操作如下图所示。
鼠标右键单击GMO项目,弹出菜单里单击【添加】【合并模块】,然后将SystemDll.msm添加到GMO里。
15
图5.2添加合并模块
5.3增加后处理模块
再把第2章生成的Post.msm添加到主安装项目GMO里,具体操作不再赘述。
假定安装过程中,用户选择安装目录为C:
\ProgramFiles\Dacel\GISMappingOffice3.0,这个目录就是TARGETDIR。
Post.msm里处于“ModuleRetargetable文件夹”文件夹下的文件默认将被安装到TARGETDIR。
现在的问题是:
GISMappingOffice的主程序将安装到TARGETDIR\Bin目录下,而Post.msm里的文件必须和主程序在同一文件夹下,即Post.msm里的文件也必须安装到TARGETDIR\Bin目录,此时该怎么办?
在GMO安装和部署项目里,新建一个自定义文件夹Post,具体方法请参考第3章第3节。
设置Post文件夹的DefaultLocation属性为[TARGETDIR]\Bin,如下图所示。
16
设置合并模块Post.msm的属性,指定可重定位文件夹的具体位置,如下图所示。
如果Post.msm有多个可重定位文件夹,则MergeModuleProperties里也会有多个对应的文件夹。
图5.3设置Post.msm属性
现在,Post.msm里的文件都将被安装到[TARGETDIR]\Bin,可以和主程序在同一个目录了。
5.4增加MapX控件
17
再把第4章生成的MapX.msm添加到主安装项目GMO里。
创建自定义文件夹MapX,重定向MapX.msm到MapX。
MapX文件夹的设置如下:
图5.4MapX文件夹属性
DefaultLocation属性就不用解释了。
Property属性很重要,安装程序会将DefaultLocation的实际路径传递给Property属性指定的变量里。
这里就是将[TARGETDIR]\MapX5.00.30这个目录传给变量MAPXPATH。
MapX.msm这个模块里根据MAPXPATH修改了注册表,详细信息请参考第4章。
也就是说:
主安装程序与合并模块通过Property属性来交换信息,所以Property属性很重要。
5.5增加应用程序文件
将应用程序所需文件加入到GMO安装和部署项目中来,如下图所示。
图5.5增加应用程序文件
18
BCGCBPro界面库所需文件可单独放到一个Custom文件夹内(上图中的BCG文件夹,然后指定该文件夹的DefaultLocation属性为[TARGETDIR]\Bin,这样这些文件就会和主程序文件一起被安装到目录[TARGETDIR]\Bin。
主程序文件及相关的一些文件,可以增加到上图中的“应用程序文件夹”,它的DefaultLocation属性就是默认的安装目录,即TARGETDIR。
应该对其进行设置,如下图所示:
图5.6应用程序文件夹的属性
上图中的ProgramFilesFolder表示程序目录,一般就是C:
\ProgramFiles\。
ProductName表示软件产品名称,这个是主安装项目的一个属性,是可以设置的。
5.6创建快捷方式
5.6.1主程序快捷方式
现在要在开始菜单中,增加主程序的快捷方式。
其操作步骤如下图所示:
鼠标左键单击“用户的“程序”菜单”。
然后鼠标右键单击右窗格,在弹出菜单中单击【创建新的快捷方式】菜单项。
19
图5.7创建快捷方式
VS2008显示如下界面,请在这个界面里选择“应用程序文件夹”下的Bin文件夹里的主程序文件GMOffice.exe,然后单击“确定”按钮。
图5.8选择快捷方式的目标文件
请修改这个快捷方式的Name和Icon属性,如下图所示:
20
图5.9快捷方式属性
5.6.2“卸载程序”快捷方式
现在要增加一个卸载程序的快捷方式,用户单击它之后就可以卸载GISMapperOffice了。
它的原理就是调用程序msiexec.exe,并给这个程序传入参数:
/x[ProductCode]。
MSI安装程序为每个软件都起了一个独一无二的产品代码(ProductCode,如:
msiexec.exe/x{34DB9720-A27B-4F57-8057-13438DB86BD5}将卸载产品代码为{34DB9720-A27B-4F57-8057-13438DB86BD5}的软件。
主安装程序里,有这个ProductCode。
鼠标左键单击解决方案资源管理器中的项目名称,在属性窗口将能看到ProductCode属性:
图5.10ProductCode属性
既然要用到程序msiexec.exe,就要将其加入安装项目。
需要注意的是:
不能增加WindowsXP的msiexec.exe,而应该增加Windows98系统目录下的msiexec.exe。
Windows的向下兼容使得这个程序能在多数Windows下运行。
21
创建一个快捷方式,其操作步骤请参考上一节内容。
配置这个快捷方式的属性如下:
图5.11“卸载程序”快捷方式的属性
5.6.3快捷方式的问题
一个不幸的消息是:
VS2008制作的安装包在安装程序后,快捷方式是有问题的:
一旦被安装的文件发生了改变,它就会再运行一次安装包进行修复。
如果安装包被删除了,这个快捷方式根本无法运行!
解决方法就是使用OrcaMis程序,修改msi文件的快捷方式(Shortcut的目标(Target属性。
如下图所示:
图5.12修改msi文件的Shortcut
5.7详述项目属性
鼠标左键单击解决方案资源管理器中的项目名称,在属性窗口将能看到该
22
项目的属性,如下图所示:
图5.13安装项目属性
在资源管理器里,可以查看msi文件的属性。
上图的Title、Author、Keywords、Description分别对应下图的标题、作者、关键字、备注。
23
图5.14msi文件属性
5.7.1AddRemoveProgramsIcon属性
通过“控制面板”下的“添加或删除程序”也可以删除安装好的GISMapperOffice。
这个属性是用来设置下图中的图标的:
24
图5.15删除程序里的图标
5.7.2InstallAllUsers属性
在WindowsNT下安装程序,快捷方式的位置有两种选择:
图5.16InstallAllUsers属性
25
如果选中了“只有我”,则快捷方式将被创建在如下目录。
?
?
?
表示安装程序时登录Windows的用户名,这样这个快捷方式只有这个用户能看见。
C:
\DocumentsandSettings\?
?
?
\「开始」菜单\程序
如果选中了“任何人”,则快捷方式将被创建在如下目录。
这样这个快捷方式可以被所有用户看见。
C:
\DocumentsandSettings\AllUsers\「开始」菜单\程序
InstallAllUsers属性为TRUE的时候,默认选择“任何人”,否则选择“只有我”。
5.7.3Localization属性
用来指定安装程序的语言属性。
如果选为English,则安装程序显示的将是英文。
这个属性为安装程序的国际化带来了便利。
26
第6章杂项第6章杂项6.1安装程序使用VS2008编译生成的安装程序主要有两个,一个是msi文件,一个是exe文件。
msi文件是WindowsInstaller的数据包,运行msi文件的实质是运行WindowsInstaller程序,然后打开msi文件进行安装。
文件用于检查安装环exe境,如是否需要.NETframework3.5?
如果需要就调用.NETframework3.5的安装程序进行安装。
如果msi不需要其它的安装项,则exe文件是可有可无的。
6.2vdproj文件格式vdproj是UTF-8编码的文本文件,可以使用记事本打开。
"VSVersion"="3:
800"表示VisualStudio的版本。
每个变量都是VARIANT类型的,3表示数据类型,具体含义见如下定义(定义节选自文件C:
\ProgramFiles\MicrosoftVisualStudio\VC98\Include\WTYPES.H):
enumVARENUM{VT_I2=2,VT_I4