LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

利用InstallShield12制作安装包详细教程

admin
2013年1月17日 2:50 本文热度 8597


认识InstallShield12


    进入公司以来,头一件工作就是接手了公司所有系统平台的打包安装工作,从做这件工作到现在已经有一段时间了,趁着晚上这点闲暇时间,总结一下。
   
记得刚开始听到InstallShield时,竟不知其为何物!后来缠着InstallShield过了差不多一周时间,才渐渐有了入门的感觉。而今,打包安装工作已经成为日常工作之一了,每天花上不到半个小时的时间即可完成多个安装包的制作及相应升级包的制作。说到这里,特别准备了几个部分,也来说说利用InstallShield12制作安装包的一些方法技巧。今天是第一部分,认识InstallShield12(其实市面上已经有InstallShield2009、InstallShield2010了,只不过本人使用的是InstallShield12,故拿其作为例子)。
   
在介绍InstallShield12之前,或许很多使用InstallShield工具打包的朋友都应该很清楚,InstallShield方面的高级资料较少,一般的来源可以从InstallShield中文技术论坛(
http://installshield.jaron.cn/forum/)、InstallShield公司的社区网站(http://community.flexerasoftware.com/)及英文版的帮助文档找到部分资料。不过,说实在的,真正有帮助的还是相对较少,这其中可能就需要自己去挖掘了。
   
关于InstallShield12,首先,我们先来看看新建一个InstallScript Project后的界面示意图,如图1.1所示:



图1.1


    在图1.1中,这是一个向导式的制作安装包的全过程,如果制作简单的安装包,那么使用这个向导进行Step by step的方式就可以了,而如果要制作较为复杂的安装包或升级包,那么就需要用到Installation Designer面板中的相关操作了,这个在后面再进行阐述。
   
我们先来看看在Project Assistant面板中每一项的功能:
(1)Application Information:设置安装包的一些基本信息,如公司名称、安装包名称、安装包版本号、公司网站地址等;
(2)Installation Architecture:设置安装包的主体结构,一般用来设置安装包中有多少个安装项目;
(3)Application Files:指定安装文件路径及所需的安装文件夹,在这一步可以通过Add Files或者Add Folders将文件或文件夹添加到指定位置,如Application Target Folder或Program Files或Windows System下等,关于这其中的一些存放目录的区别会在后面进行说明;
(4)Application Redistributables:用于添加第三方组件;
(5)Application Shortcuts:创建程序启动的快捷方式,如开始菜单快捷方式、桌面快捷方式等;
(6)Application Registry:对注册表进行操作;
(7)Installation Interview:一些简单的对话框选择操作,如使用协议、公司名用户名等;
(8)Installation Localization:安装包界面语言的选择;
(9)Build Installation:选择安装包的格式并编译成安装包,如*.exe文件等;
   
以上是对Project Assistant面板中每一步的基本功能进行了简单的说明,通过这个向导,即可完成一个简单的安装包制作。
    下面我们再来看看Installation Designer面板,如图1.2所示:


图1.2


    在图1.2中,可以看到,该界面其实就是对Project Assistant面板的细化,对其中的部分功能说明如下:
(1)Installation Information->Project Properties->Setup Languages:设置安装包的语言种类,可以设置多种语言,在运行安装包时会出现安装语言选择界面;
(2)Installation Information->Project Properties->Add or Remove Programs->Disable Change Button:隐藏该安装包在添加删除程序列表中的更改按钮;
(3)Installation Information->Project Properties->Add or Remove Programs->Disable Remove Button:隐藏该安装包在添加删除程序列表中的删除按钮。


(4)Organization->Feature:特征,每个Feature可包含子Feature及若干个Component,每个Feature都会出现在Feature选择界面中,一旦Feature被选择安装其包含的Component就会被安装到系统中去;
(5)Organization->Component:组件,每个Component可设置需要安装的文件、写入的注册表信息、创建的快捷方式等等;通常在这里指定是否卸载、是否注册、安装策略(如果遇到旧版本是全部覆盖还是部分覆盖,是先版本后时间覆盖还是只按版本高低覆盖等);
(6)Organization->Setup Type:安装类型,一般默认有Minimal(压缩)、Typical(典型)、Custom(自定义),每种安装类型包含若干个Feature;
(7)Organization->Setup Design:设置Features、Components(组件)及Files(安装文件)等等。


(8)Application Data->Files and Folders:管理安装文件夹及文件,基本上每次打包都要使用;
(9)Application Data->Objects:选择需要安装的系统运行库。


(10)System Configuration->Shortcuts:创建快捷方式;
(11)System Configuration->Registry:向注册表中添加键值;
(12)System Configuration->XML File Changes:添加或更改XML文件。


(13)Server Configuration->Internet Infosmation Services:配置IIS网站及虚拟目录;
(14)Server Configuration->SQL Scripts:配置数据库,可以支持Microsoft SQL Server, MySQL, and Oracle数据库;


(15)Behavior and Logic->InstallScript:编写安装程序的脚本,这是制作复杂的基于InstallScript的安装包的最常使用的部分;
(16)Behavior and Logic->Support Files/Billboards:添加安装过程中需要的文件及安装背景;


(17)User Interface->Dialogs:编辑安装过程中使用的窗体,在InstallShield12中不包含准备安装窗体和复制文件窗体,所以如果要编辑这两个窗体的界面是很难办到的,至少是不完美的。


(18)Media->Path Variables:编辑安装路径变量;
(19)Media->Releases:制作安装媒体。


(20)Additional Tools->Dependency Scanners:搜索工具;
(21)Additional Tools->Direct Editor:命令编辑器,在这里可以查看或编辑安装程序的各类信息。


    通过上面的基本描述,要制作一个安装包,通过最常用的是Installation Information、Organization->Component、Organization->Setup Type、Application Data->Files and Folders、System Configuration->Shortcuts、Behavior and Logic->InstallScriptMedia->Releases等部分。


    此外,在这里还需要再简单说明一下Application Files中几个目录的区别,首先是Application Target Folder,该目录表示安装包在目标系统中要安装的目录,其根目录可在InstallScript脚本中编写,而用户则可以在安装过程中进行选择并安装到用户想要的目录;Program Files表示目标系统的系统磁盘的Program Files目录,是不允许更改的;Program Files(64-bits)是针对64位系统而言的;Support Folder通常用来存放帮助文档等;Fonts Folder是指目标系统的系统磁盘的字体文件夹目录;Windows System表示的是目标系统的系统磁盘的Windows System目录,如Windows XP的system32目录,也是不允许更改的;Windows System(64-bits)是针对64位系统而言的。


    OK,认识InstallShield12就先到这里,在下面的内容中,将会跟各位谈谈InstallScript脚本的编写等问题。


 


利用InstallScript脚本进行最基本的编程


    在公司负责打包安装这份日常工作,同时还负责系统或平台的升级,鉴于公司产品在升级方面要求的特殊性(在B/S上升级C/S程序),本人经过将近一个月的努力,完成了公司产品从最原始的手动升级到半自动化的升级工作,这其中除了需要自己编写升级程序之外,同时还需要结合升级包做相应的工作。
    在做安装包或升级包的过程中,很大一部分工作靠InstallScript脚本完成,在这里作简单的总结。
    首先,想必接触过InstallShield的朋友都非常清楚,IS有很多的固定函数,这些函数在安装的不同阶段分别执行,比如OnFirstUIBefore、OnFirstUIAfter、OnEnd等。这里需要强调的是,IS函数的执行顺序跟显示顺序是无关的,其执行顺序是已经固化的。
    我们可以通过脚本来实现安装界面的增加或减少,比如我们想去掉许可协议界面,那么可以删掉或注释掉OnFirstUIBefore函数中的Dlg_SdLicense2:下的这段代码:
/*
Dlg_SdLicense2:
    szTitle = "";
    szOpt1 = "";
    szOpt2 = "";
    //{{IS_SCRIPT_TAG(License_File_Path)
    szLicenseFile = SUPPORTDIR ^ "License.rtf";
    //}}IS_SCRIPT_TAG(License_File_Path)
    //{{IS_SCRIPT_TAG(Dlg_SdLicense2)
    nResult = SdLicense2Rtf( szTitle, szOpt1, szOpt2, szLicenseFile, bLicenseAccepted );
    //}}IS_SCRIPT_TAG(Dlg_SdLicense2)
    if (nResult = BACK) then
        goto Dlg_SdWelcome;
    else
        bLicenseAccepted = TRUE;
    endif;
*/
    关于各个函数的用法,可以查看InstallShield的帮助文档,亦可以到网上搜索“InstallShield内部库函数”,这里不作详述。
    下面,跟大家分享一些本人在做安装包和升级包过程中所学习或摸索到的一些小技巧。
(1)检测操作系统是否为Windows Vista
if (SYSINFO.WINNT.bWinVista) then    
     if (SYSINFO.nOSProductType = VER_NT_WORKSTATION) then  
          // 当前操作系统为Windows Vista
     endif;
endif;


(2)注册表操作
    读取注册表采用RegDBGetKeyValueEx (szKey, szNumName, nType, svvalue, nSize )函数,写入注册表采用RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue, nSize)函数,删除注册表项采用RegDBDeleteKey ( szSubKey )函数,删除注册表项中某一个键值采用RegDBDeleteValue ( szSubKey, szValue )函数,等等。所有这些都可以方便地通过InstallShield的帮助文档找到相应的使用说明。需要说明的是,如果有多个地方需要进行读注册表或写注册表操作,那么建议将这个方法写成一个自定义的函数,在需要使用的地方就可以非常方便地调用了。另外,还需要注意的是不要忘了在读注册表或写注册表等操作之前加上这句RegDBSetDefaultRoot (HKEY_LOCAL_MACHINE),当然也不用每个地方都加,在一个函数体内只需加一个就够了,而对于特殊情况当然是特殊处理了。


(3)安装完成前执行指定文件
    通常,在安装完成之前需要执行指定的文件,如为防止某些文件注册不成功,采用批处理方式进行再一次的注册,这时可以写一个批处理文件*.bat,然后通过如下面的语句执行一下即可:
sProgramme_name = WINSYSDIR ^"\\myReg.bat"; 
szCmdLine = "";
if LaunchAppAndWait(sProgramme_name, szCmdLine, WAIT) < 0 then; 
endif;


(4)隐藏安装文件复制界面
    可以在OnMoving函数中编写一行代码:Disable(STATUSOLD)即可实现。


(5)检测磁盘空间是否足够于安装
    当安装包非常大时,我们通常要考虑目标计算机的执行磁盘分区是否有足够的空间来顺利完成安装,在这里可以通过GetDisk (szDir, svDrive)、GetDiskSpace (svDrive)函数进行粗略的估算,如下:
GetDisk (szDir, svDrive);
lFreeSpace = GetDiskSpace (svDrive);   
if (lFreeSpace < 314572800) then
    MessageBoxEx("警告:本安装所需磁盘空间最低约为300M,安装路径所在的磁盘空间不足!请重新选择!","警告",WARNING);
    goto Dlg_SdAskDestPath;
endif;
上述代码一般放到OnFirstUIBefore函数的Dlg_SdAskDestPath中。


(6)创建并写数据到文件
    有时,为适应实际需要,我们需要在安装过程中创建一个配置文件(如Config.dat),并将一些初始化数据写入该文件中,这时就需要用到CreateFile函数,例程如下:
    /* 创建配置文件并写入初始化配置参数 */
    szConfigDir = TARGETDIR ^"\\Test\\Start";
    szConfigPath= TARGETDIR ^"\\Test";
    szConfigFile = "Config.dat";    
    // 以FILE_MODE_APPEND 方式打开文件
    OpenFileMode (FILE_MODE_APPEND);
    // 创建配置文件并打开该文件
    if (CreateFile (nvFileHandle, szConfigDir, szConfigFile) < 0) then
        MessageBox ("创建配置文件失败,安装程序将终止!", SEVERE);
        abort;
    else
        // 将配置数据写入配置文件
        szMsg = "[INIT]\n1="+ szConfigPath;
        if (WriteLine(nvFileHandle, szMsg) < 0) then
            MessageBox ("写入配置参数失败,安装程序将终止!", SEVERE);
            abort;
        endif;
    endif;


    CloseFile (nvFileHandle); //关闭文件


    以上都是一些最基本的脚本代码,要写好InstallScript脚本,需要在实际工作学习过程中多钻研、多去发现。只要用心,有时候还是可以在InstallShield的技术社区找到一些我们想要的东西,并且会时不时地带给我们一些意外的惊喜。


 


判断操作系统类型的多种方法


    用InstallShield制作安装包时,有时候需要判断操作系统的类型(如Windows XP或者是Windows Vista等),本人通过上InstallShield的官方社区(http://community.flexerasoftware.com/)找到了一些解决办法,现将本人整理过的方法晒出来,与各位一起分享。


方法一:采用注册表的方式进行判断,例程如下:
NUMBER nOS,nvResult;
STRING svOS;


nOS = REGDB_NUMBER;
RegDBSetDefaultRoot( HKEY_LOCAL_MACHINE );
RegDBGetKeyValueEx( "SOFTWARE//Microsoft//Windows NT//CurrentVersion","CurrentVersion", nOS, svOS, nvResult);
if (svOS == "6.0") then
    MessageBox("We are on Vista!", INFORMATION);
else
    if (svOS == "5.1") then
        MessageBox("We are on XP!",INFORMATION);
    endif;
endif;


方法二:采用GetSystemInfo函数进行处理,请看下面的说明信息:
SYSINFO.nWinMajor
4  The operating system is Windows NT 4.0.  
5  The operating system is Windows Server 2003 R2, Windows Server 2003, Windows   XP,or Windows 2000.  
6  The operating system is Windows Vista or Windows Server 2008.  


SYSINFO.nWinMinor:
 The operating system is Windows Vista, Windows Server 2008, Windows 2000, or Windows NT 4.0.  
1  The operating system is Windows XP.  
2  The operating system is Windows Server 2003 R2, Windows Server 2003, or Windows XP Professional x64 Edition. 


GetSystemInfo(WINMINOR, nvResult, svResult);
GetSystemInfo(WINMAJOR, nvResult, svResult);


方法二可以通过InstallShield的帮助文档找到更详细的信息。


方法三:通过SYSINFO.WINNT的方法进行判断,例程如下:
if (SYSINFO.WINNT.bWinVista) then   
     if (SYSINFO.nOSProductType = VER_NT_WORKSTATION) then 
          // 当前操作系统为Windows Vista
     endif;
endif;
if (SYSINFO.WINNT.bWinXP) then    
    当前操作系统为Windows XP
endif;


上述三种方法是最为常见的解决办法,当然亦可能还有其他的方法可以进行处理。


 


隐藏准备安装界面



    使用InstallShield12制作安装包、升级包的这段时间以来,一直希望能够在安装界面上做点工作,使得安装界面能够更加符合产品应用的实际需求,不过因为资料少及经验不足等原因,一直未能如愿。这两天,在打包过程中,终于发现了一点符合应用的小技巧,特别拿出来分享。


    安装包、升级包的要求中有这么一条:需要将准备安装界面隐藏。在查看了InstallShield12的帮助文档及相关资料后,可以通过设置CommandLine参数顺利实现。具体是在Installation Designer->Media->Releases->SINGLE_EXE_IMAGE->Setup Command Line加上/hide_progress即可,如下图:

    如果要隐藏整个安装过程,那么将上述的命令改为/s hide_progress即可。
    此外,我们通常希望去掉InstallShield Wizard字样,本人看过不少资料,亦按照这些资料中所讲的方法尝试过多次,可惜的是均不能完全实现这一点,部分还是可以去掉的,比如在string tables里面将InstallShield Wizard替换成自己想要的文字(如安装向导),如下图:

    同时,可以通过Edit指定对话框,对所需要的对话框做适当的修改,比如修改安装界面左侧的图片等。当然如果修改了对话框,则在我的印象中,对安装包更换皮肤的话,已修改过的界面将保持修改状态,而不会跟着更换皮肤。


    由于打包安装工作纯属本人的日常工作,而非本人的工作重心,所以平时在打包安装方面所花的时间和精力相对不足,还有不少地方未能花上足够的时间去深入研究,比如能否根据自己的需求定制每一个安装界面等,如果哪位朋友有这方面的经验,不吝赐教。


 


常见系统DLL/OCX控件信息汇集


   利用InstallShield制作安装包/升级包时,常常需要对控件进行分类,如划分为系统需要注册的控件、系统不需要注册的控件等类别,这就对打包安装开发人员提出了较高的要求,需要自己去判断哪些文件需要注册而哪些文件不需要注册等等。在这里,结合本人在打包安装工作中遇到的问题,将一些常见的与系统相关的或第三方DLL/OCX控件信息整理了一下,与各位朋友分享,如果有错误之处,欢迎指出。
































































































































































































序号


DLL文件


DLL名称


描述


属于


系统DLL


是否需要注册


安全等级(0-5


1


asycfilt.dll


Microsoft OLE DLL


Microsoft OLE (对象链接和嵌入)特性相关DLL文件


OLE




0


2


comcat.dll


Microsoft Component Category Manager Library


Microsoft Component Category Manager Library


Microsoft® Windows® Operating System




0


3


gapi32.dll


Microsoft Mail Configuration Library


微软邮件协议相关文件


Microsoft Exchange




0


4


msvbvm60.dll


VB Virtual Machine


微软Microsoft Visual Basic虚拟机相关模块


Visual Basic




0


5


oleaut32.dll


Microsoft OLE DLL


对象链接与嵌入OLE相关文件


Microsoft OLE DLL




0


6


olepro32.dll


Microsoft OLE Property Support DLL


对象链接和嵌入OLE特性相关模块


Microsoft OLE Property Support DLL




0


7


riched32.dll


RichEdit DLL


字符编辑器相关文件


RichEdit




0


8


richtx32.ocx


Microsoft Rich Text OLE Control


微软Microsoft字符编辑器控制相关程序,用于字符对话框对象高级编辑


Visual Basic




0


9


vb6stkit.dll


Visual Basic Setup Toolkit Library DLL


Visual Basic应用程序接口API相关文件


Visual Basic




0


10


mscomctl.ocx


Windows Common Controls ActiveX Control DLL


公用ActiveX插件控制模块


Windows ActiveX




0


11


comdlg32.ocx


COMDLG32 OLE Control DLL


一个ActiveX控制模块,用于通用对话框控制


OLE




0


12


hhctrl.ocx


Microsoft HTML Help Control


Microsoft帮助文档界面相关文件


Microsoft HTML Help Control




0


13


mscomct2.ocx


Microsoft Common Controls 2 ActiveX Control DLL


ActiveX插件公用管理模块


Windows ActiveX




0


14


msdxm.ocx


Windows Media Player 2 ActiveX Control


Windows Media Player播放器ActiveX控制相关文件


Windows Media Player




0


15


msscript.ocx


Microsoft Script Control


Visual Basic 6.0应用程序脚本控制的一部分,用于运行时库


Visual Basic




0


16


mswinsck.ocx


Microsoft Winsock Control DLL


Visual Basic语言的socket编程相关文件


Visual Basic




0


17


sysmon.ocx


Microsoft System Monitor Control


系统性能监视的ActiveX控件


Microsoft Windows




0


18


tabctl32.ocx


TABCTL32 OLE Control DLL


一个ActiveX控制模块,用于SSTab控制和Tabbed对话框控制


OLE




0


19


tdc.ocx


TDC ActiveX Control


Visual Basic应用程序相关表列数据ActiveX控件模块


Visual Basic




0


20


wshom.ocx


Windows Script Host Runtime Library


Windows本地脚本对象运行时相关文件


Windows Script Host




0


该文章在 2013/1/17 2:50:41 编辑过

全部评论1

admin
2013年1月17日 2:58

这个功能我找了很久,哈哈,太开心了,谢谢!!

你好,我想向你请教下关于InstallShield12注册COM组件的问题,我就问下最简单的:是怎样注册COM组件的?

注册COM组件可以使用Component选项若干选项进行处理,若注册不成功,你可以自己编写批处理文件进行再次注册。具体的你可以看看installshield的官方文档及官方论坛上的一些提问。http://community.flexerasoftware.com/showthread.php?t=148394

你好,我想请教个问题。如果每次双击installshield制作的安装包都是安装界面,而不是安装过后再次双击出现的维护/删除选项界面?谢谢,期待您的回复

不知你的要求是否是这样:安装包只提供安装功能,而无维护卸载功能?如果是,可以通过设置Project菜单中的Settings命令进行设置(因本人久未接触打包,印象中是该项),通过对工程进行编译及调试的设置,可以将安装包设置为每次都是安装(含覆盖安装)。要么通过脚本来控制也是可行的,如修改OnMaintUIBefore()等函数。关于具体的操作细节,请到installshield的官方论坛查阅相关的帖子或帮助文档。

非常感谢您的回复,我已在研究您说的内容。另外您知道像qq安装程序那种界面如果用installshield完成么,或者qq安装程序是否用其他的工作制作完成?谢谢,期待您的回复!

关于类似于QQ的安装包,本人未曾实现过。不过,鉴于InstallShield的强大,应该是可以做得到的,剩下的只是自己慢慢去研究InstallShield的一些高级技巧罢了(我个人感觉InstallShield在界面处理方面似乎不够友好,也许是本人未曾深入研究)。另,QQ安装包貌似是用NullSoft Installation制作的~

我用你的方法,可不进行安装,文件也不拷贝了,不知道你是怎么解决的,谢谢!!

关于你提到的问题,我想需要更具体地了解你所描述的问题或许才能做出判断。不知你使用的安装包类型是什么类型?是Basic MSI Project还是InstallScript MSI Project 或是其他的?如果是InstallScript MSI Project的,应该是不会出现你所说的问题,至少到目前为止我未曾遇到过。

我用的是InstallScript Project,但我用InstallScript MSI Project类型没Setup Command Line这个选项

InstallScript MSI Project类型的项目本人没有使用过,不过本人为此找了一份文档,地址如下:http://kb.flexerasoftware.com/doc/Helpnet/installshield12helplib/IHelpSetup_EXECmdLine.htm,不知对你是否有帮助。你也可以到InstallShield的论坛去找找看,或许会找到更好的帮助。

我怎么没找到Releases-&gt;SINGLE_EXE_IMAGE这个地方呢?请明示下,谢谢.

你可以在Project Assistant面板的Build Installation中勾选第一项,然后编译生成单独的exe,之后即可看到Releases-&gt;SINGLE_EXE_IMAGE了。

正在查找怎样隐藏准备安装界面,谢谢。

关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved