您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 探索InstallShield――制作一个完整的应用程序安装实例
探索InstallShield——制作一个完整的应用程序安装实例(一)大家一定有过这样的经历,每当我们殚精竭虑为用户开发完一个系统之后往往都是派一名技术员到用户那里进行应用软件的安装,数据库的配置,这些看似简单的配置对一般用户来说可不是件容易做的事。这不仅给那些喜欢力求完美的程序设计师带来一点遗憾外,而且也使我们设计出来的软件缺少一种安全可靠感。如果我们在交给用户软件的时候能给他们一个象一些专业软件的安装程序,这不仅给用户留下了一个良好的第一印象,同时也节省了开发维护成本。要说起制作安装程序的软件有许多,像InstallShield,CreateInstall,EasyInstall,EasySetup,SetupBuilder等等,可以举出一大堆来。但其中最为著名的当属InstallShield。目前世界上绝大多数的商业软件的安装盘都是用她来完成,比如我们可能天天在使用的NortonAntiVirus2000。InstallShield之所以很流行也许是因为程序员可以在通过编写脚本语言方便的进行Windows应用程序的注册表修改、ODBC配置等复杂的操作,以及她本身提供了一些相当智能化的功能。下面,就本人在实际开发中的一些所得和大家一起探讨,文中如有任何不妥之处还请同行们给予指教。在讲述到数据库配置的一系列问题是以目前最常用的ODBC接口为基础,文中用到的实例是在WIN98系统中,InstallShield用的是Professional6.21下开发和调试的,其中的应用程序实例用的PowerBuilder7.0下开发的演示程序。第一步:快速体验首先,我们可以来快速体验一下用InstallShield制作的安装程序是什么样的。当然,我不可能详细到怎样建立一个项目之类的问题,有关这方面的内容还请看InstallShield的入门教材。第二步:;InstallShield初探首先,用ProjectWizard建立一个新的项目,取名Demo,同时在对话框中选择所有的选项,并且在语言选择中选择Chinese(PRC)和English,即简体中文和英文支持。当然你也可以选择其它语言,为了便于讨论我只选择了Chinese(PRC)和English。运行一下试一试,一切都正常,只是一个空壳罢了,没有任何东西。好了,战斗的号角已经吹响了,让我们集中精力个个歼灭。一、语言选择由于我们在生成项目的同时在语言选择中选择了Chinese(PRC)和English,因此,在图01中的下拉列表框中会自动出现中文,英文的选项。这一步由模板自动完成,我们不要做任何事情。二、设置启动画面在我们生成项目的同时,InstallShield会为我们缺省的放上一张启动画面。见图16。从该图片上我们可以看出,一般情况下是放置一张能很好的代表你公司的图片,同时上面很清楚地标明你的应用程序的名称,版本,公司名称,版权归属等基本信息。毫无疑问,我们必须用我们自己的图片来替换它。替换的方法是,在SetupFile面板中,打开SplastScreen,找到LanguageIndependent,这时我们会发现在它右边的列表中有一个文件Setup.bmp,它就是图18的那一张,我们必须首先把它删除,然后再插入我们想要的那一张,在列表中任何一个位置点击鼠标右键,选择InsertFiles,用一个BMP文件替换它就行了。注意,我们替换的图片的文件名必须是Setup.bmp。另外,顺便提一下,在SplashScreen下除了LanguageIndependent分支外,还有Chinese(PRC)和English分支,如果在它们中放置不同的Setup.bmp文件,那么系统会根据用户在安装前选择了不同的语言而启动不同的背景,这样可以有效地避免多国语言的烦恼。同样,在设置法律声明(许可协议)和自述文件的时候也是一样的。三、开始安装这一步由系统自动给出,我们不要做任何事情。但是我们可以在这里进行软件安装前的准备工作。比如,操作系统判断,机器可用内存容量的检测等,这些往往被忽视。当我们用项目向导生成的新项目时,InstallShield只为我们生成两个事件,分别是OnFirstUIBefore和OnMoving,它们的意义是,OnFirstUIBefore:在应用程序第一次安装时为了搜集用户信息而弹出的对话框之前,应用程序所响应的事件。OnMoving:该事件在当所选择的安装组件正在安装或反安装时响应。显然,准备工作可以在事件OnFirstUIBefore中完成,但InstallShield同时还为我们提供了事件OnBegin,该事件在是在Setup脚本中第一个被触发。还记得图片02,上面有个进度条,显示了“正准备InstallShield(R)向导...”,当该进度条结束后就首先调用OnBegin,然后才是OnFirstUIBefore。因此,我们可以将一些前期的准备工作放到这里来完成。下面是如何具体实现。1、首先,如何添加OnBegin事件?InstallShield将事件分成三类:全局事件,组件事件和杂项事件。其中,全局事件的添加最为方便,只要将当前行光标移到Serup脚本的最后,然后写上functionOnBegin()begin...//函数体end;就行了。2、实现操作系统的识别像其它编程工具一样,InstallShield也为我们提供了一些系统变量,利用这些变量我们可以轻而易举的得到一些像系统目录,语言代码,CUP类型等实用数据。具体实现代码如下:/*****************程序代码*******************/FunctionOnBegin()Beginif(!SYSINFO.bIntel)thenszMsg=提示:该软件只能运行在Intel系列的处理器上!\n\n安装程序将终止;MessageBox(szMsg,SEVERE);abort;endif;if(SYSINFO.WIN9X.bWinMe||SYSINFO.WINNT.bWinNT||SYSINFO.WINNT.bWinNT4||SYSINFO.WINNT.bWin2000)thenszMsg=提示:该软件只能运行在WIN9X系统上才能确保程序的正常工作!\n\n是否继续安装?;if(!AskYesNo(szMsg,NO))thenabort;endif;endif;end/******************结束*********************/相关变量:SYSINFO存放本机的一些系统变量,如操作系统,CUP类型等。有关系统变量的具体使用请参阅编程手册。相关函数:AskYesNo该函数弹出一消息窗口,用户通过按是或非来回答该窗口显示的问题。3、实现内存容量的检测在查阅了InstallShield系统变量后并没有找到有关内存容量方面的变量,因此只有通过调用函数来实现。相关函数:GetSystemInfo()该函数返回有关目标系统的诸如CUP类型,磁盘容量,当前日期,当前操作系统,内存容量等信息,返回的内存容量是以千字节为单位。有关函数的具体使用请参阅函数手册。具体实现代码如下:/*****************程序代码*******************/if(GetSystemInfo(EXTENDEDMEMORY,nvFreeMem,svResult)0)thenMessageBox(内存检测失败,安装程序将终止!.,SEVERE);abort;endif;if(nvFreeMem16384)thenszMsg=该软件只能安装在16M以上内存的机器中。\n很遗憾,本机器可用内存不足16M!\n\n安装程序将终止!;MessageBox(szMsg,SEVERE);abort;endif;//end./******************结束*********************/四、许可协议选择SetupFile面板,打开LanguageIndependent,选择OperatingSystemIndependent,在右边列表中找到License.txt文件,双击它输入自己的许可协议就行了。五、Readme文件同上,找到Infolist.txt文件,双击它输入需要说明的自述文件。六、客户信息看一看图片,不难发现当安装程序运行这一步时上面已经填上了缺省的用户名和客户名称,甚至连序列号都有。这是怎么回事呢?原来在前面我们介绍的事件OnFirstUIBefore的开始有一段代码,如下:nSetupType=TYPICAL;TARGETDIR=PROGRAMFILES^@COMPANY_NAME^@PRODUCT_NAME;szDir=TARGETDIR;SHELL_OBJECT_FOLDER=@FOLDER_NAME;svName=;svCompany=;svSerial=;如果我们没有给svName和svCompany赋新值的话缺省的用户名和客户名称就是我们在安装Windows时注册的用户和单位。当然,如果没有给svSerial赋值的话,图片上的序列号就为空。相关系统变量:PROGRAMFILES:存放Windows程序文件夹(Programfiles)的完整路径。不能更改。七、序列号判断用InstallShield安装模板制作出的安装程序在运行过程如果没有序列号是无法再继续下去的。但如果我们在序列号上不加任何检验的话,InstallShield会默认为任何字符都是有效的而不管它是什么,此时序列号也就毫无意义,除非你想让你的应用程序无限制的发布。因此,还是建议你在安装过程中对序列号进行一下有效性检验。方法很简单,在事件OnFirstUIBefore中找到Dlg_SdRegisterUserEx分支,见下列代码:Dlg_SdRegisterUserEx::szMsg=;szTitle=;nResult=SdRegisterUserEx(szTitle,szMsg,svName,svCompany,svSerial);if(nResult=BACK)gotoDlg_SdShowInfoList;在语句if(nResult=BACK)gotoDlg_SdShowInfoList;前添上相应的序列号校验程序//*******增加序列号的检验if(svSerial!='199721')thenMessageBox(警告:输入序列号错误,请确认后重输!,SEVERE);gotoDlg_SdRegisterUserEx;endif;//end.就这么简单。声明一下,这里我只是给出的最简单的判别模式,较为安全的模式是在判别时对序列号进行必要的加解密转换,有兴趣的朋友可以自己去实现。探索InstallShield——制作一个完整的应用程序安装实例(二)八、安装文件夹在一般情况下,InstallShield默认的安装文件夹是存放Windows程序文件夹(Programfiles)的完整路径,即C:\Programfiles(如果Windows安装在C盘的话)。但是,在绝大多数情况下我们都希望客户将应用程序安装在单独的数据盘上,即不与操作系统安装在同一个硬盘分区里。一方面便于管理,另一方面也为了防止我们的程序因为系统盘格式化而受到连累。因此,我们常常会建议用户在安装应用程序的时候选择另一个硬盘,如D盘。另外,我们有时希望我们所开发出来的应用程序安装在一个带有自己公司名称和应用程序名称的目录下。InstallShield默认的目录就做的非常好,她会建立一个诸如“C:\ProgramFiles\ABCD软件工作室\Demo”的目录(在这里我虚构了一个公司“ABCD软件工作室”)。但,问题是,一旦让用户选择了其它的路径,或者硬盘,他们几乎都不会在目录上加上开发商和应用程序目录,“\ABCD软件工作室\Demo”。如果用户仅仅选择了磁盘而忘了选择任何目录的话,InstallShield就会将所有的程序和数据文件复制到磁盘根目录下,用户和我们当然都不希望这样。因此,为了避免这一切的发生我们
本文标题:探索InstallShield――制作一个完整的应用程序安装实例
链接地址:https://www.777doc.com/doc-6362282 .html