已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
探索 InstallShield制作一个完整的应用程序安装实例(一)大家一定有过这样的经 历,每当我们殚精竭虑为用户开发完一个系统之后往往都是派一名技术员到用户那里进行应用软件的安装,数据库的配置,这些看似简单的配置对一般用户来说可不 是件容易做的事。这不仅给那些喜欢力求完美的程序设计师带来一点遗憾外,而且也使我们设计出来的软件缺少一种安全可靠感。如果我们在交给用户软件的时候能 给他们一个象一些专业软件的安装程序,这不仅给用户留下了一个良好的第一印象,同时也节省了开发维护成本。要说起制作安装程序的软件有许多,像 InstallShield,CreateInstall,Easy Install,EasySetup,SetupBuilder 等等,可以举出一大堆来。但其中最为著名的当属InstallShield。目前世界上绝 大多数的商业软件的安装盘都是用她来完成,比如我们可能天天在使用的 Norton AntiVirus 2000。InstallShield 之所以很流行也许是因为程序员可以在通过编写脚本语言方便的进行 Windows 应用程序的注册表修改、ODBC 配置等复杂的操作,以及她本身提供了一些相当智能化的功能。下面,就本人在实际开发中的一些所得和大家一起 探讨,文中如有任何不妥之处还请同行们给予指教。在讲述到数据库配置的一系列问题是以目前最常用的 ODBC 接口为基础,文中用到的实例是在 WIN98 系统中,InstallShield 用的是 Professional 6.21 下开发和调试的,其中的应用程序实例用的 PowerBuilder 7.0 下开发的演示程序。第一步:快速体验首先,我们可以来快速体验一下用 InstallShield 制作的安装程序是什么样的。当然,我不可能详细到怎样建立一个项目之类的问题,有关这方面的内容还请看 InstallShield 的入门教材。第二步:;InstallShield 初探首先,用 Project Wizard 建立一个新的项目,取名 Demo,同时在对话框中选择所有的选项,并且在语言选择中选择 Chinese(PRC)和 English,即简体中 文和英文支持。当然你也可以选择其它语言,为了便于讨论我只选择了 Chinese(PRC)和 English。运行一下试一试,一切都正常,只是一个空壳罢了,没有任何东西。好了,战斗的号角已经吹响了,让我们集中精力个个歼灭。一、 语言选择由于我们在生成项目的同时在语言选择中选择了 Chinese(PRC)和 English,因 此,在图01 中的下拉列表框中会自动出现中文,英文的选项。这一步由模板自动完成,我们不要做任何事情。二、 设置启动画面在我们生成项目的同时,InstallShield 会为我们缺省的放上一张启动画面。见图 16。从该图片上我们可以看出,一般情况下是放置一张能很好的代表你公司的图片,同时上面很清楚地标 明你的应用程序的名称,版本,公司名称,版权归属等基本信息。毫无疑问,我们必须用我们自己的图片来替换它。替换的方法是,在 Setup File 面板中,打开Splast Screen,找到 Language Independent,这时我们会发现在它右边的列表中有一个文件 Setup.bmp,它就是图 18 的那一张,我们必须首先把它删除,然后再插入我们想 要的那一张,在列表中任何一个位置点击鼠标右键,选择 Insert Files,用一个 BMP 文件替换它就行了。注意,我们替换的图片的文件名必须是 Setup.bmp。另外,顺便提一下,在 Splash Screen 下除了 Language Independent 分支外,还有Chinese(PRC)和 English 分支,如果在它们中放置不同的 Setup.bmp 文件,那么系统会根据用户 在安装前选择了不同的语言而启动不同的背景,这样可以有效地避免多国语言的烦恼。同样,在设置法律声明(许可协议)和自述文件的时候也是一样的。三、 开始安装这一步由系统自动给出,我们不要做任何事情。但是我们可以在这里进行软件安装前的准备工作。比 如,操作系统判断,机器可用内存容量的检测等,这些往往被忽视。当我们用项目向导生成的新项目时,InstallShield 只为我们生成两个事件,分别是 OnFirstUIBefore 和 OnMoving,它们的意义是,OnFirstUIBefore:在应用程序第一次安装时为了搜集用户信息而弹出的对话框之 前,应用程序所响应的事件。OnMoving:该事件在当所选择的安装组件正在安装或反安装时响应。显然,准备工作可以在事件 OnFirstUIBefore 中完成,但 InstallShield 同时还为我们提供了事件 OnBegin,该事件在是在 Setup 脚本中第一个被触发。还记得图片 02,上面有个进度条,显示了 “正准备 InstallShield(R)向导.”,当该进度条结束后就首先调用 OnBegin,然后才是 OnFirstUIBefore。因此,我 们可以将一些前期的准备工作放到这里来完成。下面是如何具体实现。1、首先,如何添加 OnBegin 事件?InstallShield 将事件分成三类:全局事件,组件事件和杂项事件。其中,全局事件的 添加最为方便,只要将当前行光标移到 Serup 脚本的最后,然后写上function OnBegin()begin. / 函数体end;就行了。2、实现操作系统的识别像其它编程工具一样,InstallShield 也为我们提供了一些系统变量,利用这些变量我 们可以轻而易举的得到一些像系统目录,语言代码,CUP 类型等实用数据。具体实现代码如下:/*程序代码*/Function OnBegin()Beginif ( !SYSINFO.bIntel) thenszMsg = “提示:该软件只能运行在 Intel 系列的处理器上!nn 安装程序将终止“;MessageBox(szMsg, SEVERE);abort;endif;if (SYSINFO.WIN9X.bWinMe |SYSINFO.WINNT.bWinNT |SYSINFO.WINNT.bWinNT4 |SYSINFO.WINNT.bWin2000) thenszMsg = “提示:该软件只能运行在 WIN9X 系统上才能确保程序的正常工作!nn 是否继续安装?“;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 ( nvFreeMem 16384 ) thenszMsg = “该软件只能安装在 16M 以上内存的机器中。n 很遗憾,本机器可用内存不足16M!nn 安装程序将终止!“;MessageBox (szMsg, SEVERE);abort;endif;/ end./*结束*/四、 许可协议选择 Setup File 面板,打开 Language Independent,选择 Operating System Independent ,在右边列表中找到 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 程序文件夹(Program files)的完整路径。不能更改。七、 序列号判断用 InstallShield 安装模板制作出的安装程序在运行过程如果没有序列号是无法再继续 下去的。但如果我们在序列号上不加任何检验的话,InstallShield 会默认为任何字符都是有效的而不管它是什么,此时序列号也就毫无意义,除非你 想让你的应用程序无限制的发布。因此,还是建议你在安装过程中对序列号进行一下有效性检验。方法很简单,在事件 OnFirstUIBefore 中找到 Dlg_SdRegisterUserEx 分支,见下列代码:Dlg_SdRegisterUserEx:szMsg = “;szTitle = “;nResult = SdRegisterUserEx( szTitle, szMsg, svName, svCompany, svSerial );if (nResult = BACK) goto Dlg_SdShowInfoList;在语句if (nResult = BACK) goto Dlg_SdShowInfoList;前添上相应的序列号校验程序/*增加序列号的检验if ( svSerial != 199721) thenMessageBox(“警告:输入序列号错误,请确认后重输!“,SEVERE);goto Dlg_SdRegisterUserEx;endif;/end.就这么简单。声明一下,这里我只是给出的最简单的判别模式,较为安全的模式是在判别时对序列号 进行必要的加解密转换,有兴趣的朋友可以自己去实现。探索 InstallShield制作一个完整的应用程序安装实例(二)八、 安装文件夹在一般情况下,InstallShield 默认的安装文件夹是存放 Windows 程序文件夹 (Program files)的完整路径,即 C: Program files(如果 Windows 安装在 C 盘的话)。但是,在绝大多数情况下我们都希望客户将应用程序安装在单独的数据盘上,即不与操作系统安装在同一个硬 盘分区里。一方面便于管理,另一方面也为了防止我们的程序因为系统盘格式化而受到连累。因此,我们常常会建议用户在安装应用程序的时候选择另一个硬盘,如 D 盘。另外,我们有时希望我们所开发出来的应用程序安装在一个带有自己公司名称和应用程序名称的目录 下。InstallShield 默认的目录就做的非常好,她会建立一个诸如“C:Program FilesABCD 软件工作室Demo”的目录(在这里我虚构了一个公司“ABCD软件工作室”)。但,问题是,一旦让用户选择了其它的路径,或者硬 盘,他们几乎都不会在目录上加上开发商和应用程序目录,“ABCD 软件工作室Demo”。如果用户仅仅选择了磁盘而忘了选择任何目录的 话,InstallShield 就会将所有的程序和数据文件复制到磁盘根目录下,用户和我们当然都不希望这样。因此,为了避免这一切的发生我们只能寄希望 于我们的安装程序能够有足够的智能来应付这一切,这样就不管用户是否选择了目录。实现方法如下。在事件 OnFirstUIBefore 中找到 Dlg_SdAskDestPath 分支,如下Dlg_SdAskDestPath:szTitle = “;szMsg = “;nResult = SdAskDestPath( szTitle, szMsg, szDir, 0 );TARGETDIR = szDir;if (nResult = BACK) goto Dlg_SdRegisterUserEx;我们首先需要定义一个临时字符串变量 svTempSTRING svTemp;然后,将语句nResult = SdAskDestPath( szTitle, szMsg, szDir, 0 );TARGETDIR = szDir;修改成如下:svTemp = szDir;nResult = SdAskDestPath( szTitle, szMsg, szDir, 0 );if ( svTemp != szDir) thenszDir = szDirCOMPANY_NAME PRODUCT_NAME;endif;TARGETDIR = szDir;该语句的功能是在用户选择的路径后加上单位和应用程序名称作为安装的目录(注:这里我并没有考 虑到用户在选择了默认外的路径后加上单位和应用程序名称作为安装目录的情况)。其中,变量 COMPANY_NAME 和 PRODUCT_NAME 中存放的是单位名和产品名,我们可以随时在资源面板中修改它的值。变量 TARGETDIR 是指向在硬盘上目的文件夹的完整路径。当调用函数 SdAskDestPath 时,该函数会创建一个对话框来让用户选择应用程序要存放的目的路径。不要以为加上了单位和程序的目录就万事大吉了,可别忘了既然让用户来选择安装的目的盘就很有可 能出现磁盘空间不够大,从而导致程序的安装失败或安装后的剩余空间不够程序将来数据的存放等等。因此,必须在用户选择之后,程序进入下一步之前对目的盘的 可用空间进行判断。在这里我假设我们的程序需要 10 兆的空间来存放目前的文件和未来几年可能的数据。为了达到上述目的就必须知道:1、 用户最终选择的是哪个硬盘2、 该硬盘当前的剩余空间是多少那么,如何来实现呢?幸好 InstallShield 为我们提供了足够多的函数来应付这一切。函数一:GetDisk该函数从指定的路径或带有路径的文件名当中提取该路径或文件所在的磁盘驱动器号。调用成功返回 0,否则返回小于 0 的任何数。函数二:GetDiskSpace该函数返回指定磁盘或指定路径所在磁盘的剩余空间,用字节表示。具体实现代码如下:/*加入磁盘剩余空间判断,目前判断剩余空间是否少于 10M/* 10M * 1024 千字节 * 1024 字节 = 10485760 字节GetDisk (szDir, svDrive);lFreeSpace = GetDiskSpace (svDrive);if (lFreeSpace 10485760) thenMessageBox(“警告:安装路径所在的磁盘空间不足 10M!请重新选 择!“,SEVERE);goto Dlg_SdAskDestPath;endif;/ end.我们只要将这段代码放入语句if (nResult = BACK) goto Dlg_SdRegisterUserEx;之前就行了。九、 安装类型该步骤是由 InstallShield 自动给出的,一般情况下我们不必做任何事。三个安装选 项:典型安装、压缩安装和自定义安装是根据我们在安装类型(Setup Type)的面板中预先设置好的值来进行的。如果用户选择了自定义安装,系统就会弹出如下界面,见图。这是由系统自动给出的,我们用不着写一行代码,这是不是很棒?不知道你有没有注意到窗口的左面有一个说明框,它是用来提示用户目前所选择的组件是干什么的。 在缺省的状态下它是空的,需要我们来添加。添加的方法是在组件(Components)的面板中,每当我们点中一个组件在左边的列表中就会有一个描述栏 (Description),它的内容就是上面提到的帮助信息,你只要将相对用户说的话写上去就行了。十、 程序文件夹这一步由 InstallShield 自动给出,一般不要做任何修改。十一、 最后确认我们一定还记得每当安装一个像 Office 等专业化软件时,在软件正式安装前系统都会给出一个 列表框,其中列出了你所做的一切选择,包括软件的安装路径,需要安装的组件等,同时还包括了注册的用户名和单位等信息。在我们用 InstallShield 制作安装盘的时候也会有这一个列表框,但遗憾的是在缺省状况下 InstallShield 提供的这个列表框是空的,什么内容也 没有,这需要我们给它加入。好在有函数 ListAddString 来帮我们的忙。相关函数:ListAddString该函数在字符串列表框的当前对象前后新增加一个字符串。调用成功返回 0,否则返回小于 0 的任何 数。在脚本 Setup.rul 的事件 OnFirstUIBefore 中找到 Dlg_SdStartCopy 分支,如下:Dlg_SdStartCopy:szTitle = “;szMsg = “;listStartCopy = ListCreate( STRINGLIST );/The following is an example of how to add a string(svName) to a list(listStartCopy)./eg. ListAddString(listStartCopy,svName,AFTER);nResult = SdStartCopy( szTitle, szMsg, listStartCopy );ListDestroy(listStartCopy);if (nResult = BACK) goto Dlg_SdSelectFolder;/ setup default statusSetStatusWindow(0, “);Enable(STATUSEX);StatusUpdate(ON, 100);return 0;在语句nResult = SdStartCopy( szTitle, szMsg, listStartCopy );前加上如下代码/*加入安装过程中用户所选择的主要步骤/ 如果不手动加入的话将会什么也不列出ListAddString(listStartCopy,“客户信息:“,AFTER);ListAddString(listStartCopy,“用户名:“ + svName,AFTER);ListAddString(listStartCopy,“用户单位:“ + svCompany,AFTER);ListAddString(listStartCopy,“,AFTER);ListAddString(listStartCopy,“程序安装路径:“ + szDir,AFTER);ListAddString(listStartCopy,“,AFTER);ListAddString(listStartCopy,“程序文件夹:“ + szfolder,AFTER);ListAddString(listStartCopy,“,AFTER);switch (nSetupType)case TYPICAL : ListAddString(listStartCopy,“安装类型:典型安装“,AFTER);case COMPACT: ListAddString(listStartCopy,“安装类型:压缩安装“,AFTER);case CUSTOM: ListAddString(listStartCopy,“安装类型:自定义安装“,AFTER);endswitch;/end.其中 svName、svCompany、szDir 等变量我们可以在 事件 OnFirstUIBefore 开始的变量定义中找到。从变量的名称我们很清楚的知道该变量存放的是用户名,单位,安装目录等。十二、 第一幅背景,第二幅背景图片 12,图片 13细心的朋友一定会注意到软件在安装过程中会出现两副不同的背景图片,图 12 和图13,这就是 InstallShield 的显示区界面,我们可以称它为布告板。这看上去是不是很像在播放幻灯片?呵呵,我们可以和微软的比一比了(说句笑话)。言归正 传,还是来说说是如何实现的吧。布告板,它只有在文件被传输时才被激活。也就是说,当你调用 ComponentTransferData 函数来解压并拷贝时布告板才被显示,该函数是有系统自动调用,用不着我们来操心。但是,你不能为一个布告板指定显示时间,InstallShield 会根据整个程序的安装时间 (指文件拷贝时间)自动的为每一个文件平均分配,但至少是 2 秒。如果你的安装程序仅持续 20 秒,而你却放置了 25 副图片,很显然系统只会显示前 10 副图 片。当你需要显示布告板之前还必须确保以下两个条件:1、 在你的脚本里,首先要确保在文件被传输前调用 Enable(BACKGROUND) 和 Enable(FULLWINDOWMODE),我们可以加在事件 OnMoving 中。形式如下:function OnMoving()STRING szAppPath;beginEnable(BACKGROUND);Enable(FULLWINDOWMODE);Enable(STATUSDLG);PlaceWindow(STATUSDLG, 400, 10, LOWER_LEFT);szAppPath = TARGETDIR;RegDBSetItem(REGDB_APPPATH, szAppPath);RegDBSetItem(REGDB_APPPATH_DEFAULT, szAppPath PRODUCT_KEY);end;相关函数:Enable(BACKGROUND) :显示安装主背景窗口Enable(FULLWINDOWMODE):设置主背景窗口为最大化。2、 在设置文件(Setup Files)面板中,在合适的目标语言和平台下放置具有特殊后缀名的布告板文件。默认的命名是:“Bbrd”,然后再跟一个数字,最后再加上后缀 “.bmp”或“.wmf”。例如,我们现在要加三副 BMP 图片,则这三副图片的名称分别应该是 Bbrd1.bmp、Bbrd2.bmp、 Bbrd3.bmp。好了,运行一下,很不错。我们可以利用这项技术在安装过程中播放类似幻灯片效果,就像安装 Windows 一样。探索 InstallShield制作一个完整的应用程序安装实例(三)二、 ODBC1、ODBC 介绍ODBC,即开放式数据库连接,它是由 Microsoft 公司提供的应用程序接口(API), 一个单独的应用程序通过它可以访问许多个不同类型的数据库及不同格式的文件。虽然继 ODBC 之后业界已推出了一些像 OLE DB,ADO 等之类的新技术,但目前,开放式数据库连接 API 也许是在 Windows 应用程序中用得最广泛的数据库接口。在每种数据库所用到的专用接口 中,除了加入特殊代码外,还需要为 ODBC API 译码。在 ODBC API 和用来与数据库交换信息的专用接口之间,特殊的 ODBC 驱动程序提供了任何一种必需的译码。2、ODBC 4.0 驱动程序以下的表列出了 ODBC 桌面数据库驱动程序 4.0 的每一个组件所要求的文件。这些文件安装在 Windows 的系统目录WindowsSystem 或 Windows NT 的系统目录WindowsSystem32 下。如果 ODBC 文件以前被安装在一个不同的目录中,请确定你使用的是在 WindowsSystem (或 System32) 目录下的新文件。某些文件是多个部件共同需要的。如果你想要和你的应用程序一起重新分配任一个 ODBC 桌面数据库驱动程序,这些文件也必须被重新分配。建议在分发软件时在你的应用程序目录下建立一个 “ODBC”目录,将这些重新拷贝到该目录底下,但一定要确保该路径是个 PATH 搜索路径。以下的文件对于每一个 ODBC 桌面数据库驱动程序 4.0 是共同的:Ds16gt.dllDs32gt.dllExpsrv.dllMsjint40.dllMsjet40.dllMsjter40.dllMsjtes40.dllMsvcrt40.dllOdbc16gt.dllOdbc32.dllOdbc32gt.dllOdbccp32.cplOdbccp32.dllOdbccr32.dllOtOdbcinst.hlpOdbcint.dllOdbcjet.hlpOtOdbcji32.dllOdbcjt32.dllOdbcjtnw.hlpOtOdbctl32.dllVbajet32.dllOdbctrac.dll下列文件是安装某一个驱动程序类型的软件所必须的:驱动程序文件Microsoft AccessMsrd2x40.dll,Msrd3x40.dllDBASEMsxbse40.dll,Oddbse32.dllMicrosoft ExcelMsexcl40.dll,Odexl32.dllParadoxMspdox40.dll,Odpdx32.dllTextMstext40.dll,Odtext32.dllAdaptive Server Anywhere见下面说明注意:1、 ODBC 桌面数据库驱动程序 4.0 版本至少需要 16 MB 的随机访问内存 (RAM)2、 有关与这些驱动程序一起使用的 ODBC 版本的信息,参考 ODBC 程序员参考手册。3、Adaptive Server Anywehre ODBC 驱动程序下表列出的是工作在 Adaptive Server Anywehre 环境下的驱动程序,必须将这些文件拷贝到一个独立的目录下,并且使系统能够搜索到。描述32 位 WindowsODBC 驱动程序Dbodbc6.dllODBC 翻译程序Dbodtr6.dll特殊语言库文件Dblgen6.dll网络接口文件Dbport6.dll连接对话框程序文件Dbcon6.dll注意:1、 ODBC 翻译程序仅仅在你的应用程序是依赖于 ANSI 标准的字符串转换。2、 网络接口程序库是专门用于网络通信用,它仅仅是在客户端的程序访问网络服务器上才必须存在。3、 连接对话框程序文件在以下的几种情况下才需要加入:a. 你的最终用户需要创建自己的数据源b. 当用户连接数据库时需要输入用户标识和口令c. 不管是出于什么目的用户需要显示连接对话框4、配置 ODBC 驱动程序为了使用 ODBC 驱动程序安装程序不仅仅只是将这些驱动程序文件拷贝到硬盘上,它还必须在注册 表中设置一组 ODBC 驱动程序的属性。Adaptive Server Anywhere 安装程序会自动在 NT 和 WIN9X 的系统注册表中标识和配置ODBC 驱动程序。因此,如果你为你的最终用户制作应用程序的安装程序时也必 须进行相同的设置。通过查看 Windows 注册表工具,我们发现 Adaptive Server Anywhere 的 ODBC 驱动程序是在下列的键中被系统所标识的。HKEY_LOCAL_MACHINESoftwareODBCODBCINST.INIAdaptive Server Anywhere 6.0,其中需要设置的下键有键名类型键值DriverStringPathdbodbc6.dllSetupStringPathdbodbc6.dll除此之外,你还必须在键 HKEY_LOCAL_MACHINESoftwareODBC ODBCINST.INIODBC Drivers 中为 Adaptive Server Anywhere 注册在该键中增加如下键键名类型键值Adaptive Server Anywhere 6.0StringInstalled5、数据源注册除了进行 ODBC 驱动程序注册外,还必须为用户的数据源进行注册。这是因为每一个用户数据源必 须被注册表登记才能被系统所识别,这样用户才能使用它。因此,必须在键HKEY_CURRENT_USERSoftwareODBC ODBC.INI中进行如下注册。键名值类型键值AutoStopStringYesDatabaseFileStringPathdemo.dbDescriptionStringAdaptive Server Anywhere Sample DatabaseDriverStringPathwin32dbodbc6.dllPWDStringSqlStartStringPathwin32dbeng6.exe -qUIDStringDba注:1、 上面的 path 除了 DatabaseFile 指的是客户数据库所在的路径,其他的都是指Adaptive Server Anywhere 的安装路径。我们在给客户分发应用软件的时候一般不再另外安装 Adaptive Server Anywhere,所以可以将 Adaptive Server Anywhere 路径下的文件 Dbeng6.exe,Dbodbc6.dll,Dblgon6.dll,Dbport6.dll,Dbcon6.dll,Dbodtr6.dll 一起分 发给客户,并且拷贝至一个单独目录下,然后将路径指向它就可以了。2、 在 dbeng6.exe 后加上“-q”是为了隐藏任务栏上的 SQLAnywhere 窗口。另外,必须将数据源加到注册表中的数据源列表中,加入到如下键中HKEY_CURRENT_USERSoftwareODBCODBC.INIODBC Data Sources该键中存放的是每一个数据源和 ODBC 驱动程序的关联。键名是指数据源名字;键值是指ODBC 驱动程序的名字。由于本文所叙述的是基于 PowerBuilder7.0 开发环境下的应用程序的发布,所以键值都是“Adaptive Server Anywhere 6.0“(因为,当我们安装PowerBuilder 7.0 时,系统默认的 ODBC 驱动程序的名字为 Adaptive Server Anywhere 6.0),当然,如果你愿意话也可以改变它。这里有必要提示一下,由于用户数据源的配置可能包含一些敏感的数据库设置,比如说连接数据库的 用户 ID 和口令。这些设置都会以无格式的文本形式存储在注册表中,可以很容易的被 Windows 注册表编辑程序 regedit.exe 或 regedt32.exe 查看,只要有点编程经验的人都能通过获这些实用工具取该 ID 和口令来修改数据库中数据。因此,你在处理这些问题的时候还要三思一 下,你可以选择加密口令或让用户在连接数据库时录入。既然我们知道了如何在注册表中为应用程序进行 ODBC 配置,那么剩下的问题是,把他们放在什么 地方?不用说,大家也猜到了,最好的地方就是当所有文件都已经复制完毕,在我们要求用户重新启动系统之前。事件 OnMoved 可以做到这一切。在做这些事 的同时我们最好能够显示给用户一个消息框,告诉用户我们在干什么,做完这一切之后再关闭它。这就要用到函数 SdShowMsg 和 Delay。见图。探索 InstallShield制作一个完整的应用程序安装实例(四)相关事 件:OnMoved该事件是在当所有在目标机器上的组件都被安装或反安装时响应,在该事件中的代码总是会被执行。相关函数:SdShowMsg:该函数打开或关闭一个非模态的小窗口,该窗口显示指定的消息。Delay:该函数可以用指定的时间(秒)来使安装程序的执行时间延迟。下面是完整的 ODBC 注册表配置的代码程序。/*程序代 码*/*当所有数据拷贝完毕后在这里配置 ODBCfunction OnMoved()STRING szMsg;STRING svDB;STRING svASAOdbcDll;STRING svASA;STRING szKey;STRING szClass;STRING svResult;STRING szNumName, szNumValue, svNumValue, szTitle;NUMBER nType, nSize, nvType, nvSize;beginszMsg = “正在进行系统配置,请等待.“;SdShowMsg (szMsg, TRUE);svDB = TARGETDIR + “dbDemo.db“;svASAOdbcDll = TARGETDIR + “ASAdbodbc6.dll“;svASA = TARGETDIR + “ASAdbeng6.exe“;RegDBSetDefaultRoot (HKEY_LOCAL_MACHINE);/ 建立 MyDemo ASA 主键szKey = “SoftwareODBCODBCINST.INIMyDemo ASA“;szClass = “;if (RegDBCreateKeyEx(szKey, szClass) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;/ 建立 MyDemo ASA 下的键值szNumName = “Driver“;szNumValue = svASAOdbcDll;nType = REGDB_STRING;nSize = -1;if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,nSize) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;szNumName = “Setup“;if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,nSize) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;szKey = “SoftwareODBCODBCINST.INIODBC Drivers“;szNumName = “MyDemo ASA“;szNumValue = “Installed“;if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,nSize) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;/*配置 ODBCRegDBSetDefaultRoot (HKEY_CURRENT_USER);/ 建立 MydemoszKey = “SoftwareODBCODBC.INIMyDemo“;if (RegDBCreateKeyEx(szKey, szClass) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;szNumName = “AutoStop“;szNumValue = “Yes“;nType = REGDB_STRING;nSize = -1;if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,nSize) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;szNumName = “DatabaseFile“;szNumValue = svDB;if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,nSize) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;szNumName = “Description“;szNumValue = “My Papers Sample“;if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,nSize) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;szNumName = “Driver“;szNumValue = svASAOdbcDll;if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,nSize) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;szNumName = “PWD“;szNumValue = “SQL“;if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,nSize) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;szNumName = “Start“;szNumValue = svASA + “ -d -c8m“;if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,nSize) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;szNumName = “UID“;szNumValue = “DBA“;if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,nSize) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;/*注册数据源szKey = “SoftwareODBCODBC.INIODBC Data Sources“;szNumName = “MyDemo“;szNumValue = “MyDemo ASA“;if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,nSize) 0) thenMessageBox (“注册表操作失败,安装程序将终止!“, SEVERE);abort;endif;/ UInstalled - 反安装后删除新建的键if ( FindFile(TARGETDIR + “db“, “Demo.db“, svResult) 0 ) thenRegDBSetDefaultRoot (HKEY_LOCAL_MACHINE);szKey = “SoftwareODBCODBCINST.INIMyDemo ASA“;if (RegDBDeleteKey (szKey) 0) thenMessageBox (“删除注册表数据失败!“, SEVERE);endif;szKey = “SoftwareODBCODBCINST.INIODBC Drivers“;if (RegDBDeleteValue (szKey, “MyDemo ASA“) 0) thenMessageBox (“删除注册表数据失败!“, SEVERE);endif;RegDBSetDefaultRoot (HKEY_CURRENT_USER);szKey = “SoftwareODBCODBC.INIMyDemo“;if (RegDBDeleteKey (szKey) 0) thenMessageBox (“删除注册表数据失败!“, SEVERE);endif;szKey = “SoftwareODBCODBC.INIODBC Data Sources“;if (RegDBDeleteValue (szKey, “MyDemo“) 0) thenMessageBox (“删除注册表数据失败!“, SEVERE);endif;endif;/ UInstalled - endDelay (1);SdShowMsg (szMsg, FALSE);end;/* 结束 */探索 InstallShield制作一个完整的应用程序安装实例(五)在进行完成注册表的添加 之后还必须做的最后一件事就是为我们的应用程序指定一个搜索路径,因为我们在安装的时候拷贝了一些 DLL 库文件。显儿易见这就要求我们在 Autoexec.bat 中文件添加一个搜索路径。涉及到的函数:* FindFile:在指定的路径下查找指定的文件,当函数返回 0 时表示文件找到,当返回小于 0 的任何数时表示没有找到。* CreateFile:创建一个新的文件,如果该文件已经存在,那么 CreateFile 将覆盖掉原先的。同样,在创建之前要先用 OpenFileMode 设置文件模式。* OpenFileMode:在你想要打开一个已存在的文件或建立一个新文件设置文件的模式。文件的模式根据文件类型的不同会有如下几种:文本文件:添加模式,只读模式二进制文件:只读模式,读写模式* OpenFile:打开一个已经存在的文本文件或二进制文件。但打开之前必须先要用OpenFileMode 设置文件打开的模式。* WriteLine:该函数在一个以添加模式(append mod
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 眼科屈光手术成本管控与差异化定价方案
- XX初中学校党支部书记2025述职报告:党建引领聚合力 做师知心育新苗
- 成本控制闭环在隐私保护中的实现
- 成本价值最大化的管理路径
- 成本管控信息化的成本预警系统
- 护理专业课件资源
- IVF周期全程护理优化策略
- 成本管控视角下的医院成本文化建设
- 地中海贫血铁螯合剂案例分析课件
- 慢性病管理的成本效益分析与实践-1
- 2025年春季高考复习必背英语考纲词汇单词
- 《智慧斑马线 高分子复合材料LED发光地砖》
- 房屋修缮加固工程施工组织设计方案
- 2025年中国邮政集团湖北分公司招聘笔试参考题库含答案解析
- 2025年度豪华酒吧独家艺人合作协议范本3篇
- 高清视频会议系统售后服务及培训计划
- 报关代理协议
- 湖北理工学院《数字逻辑》2022-2023学年期末试卷
- 《毕业生登记表》模板
- (正式版)JBT 3300-2024 平衡重式叉车 整机试验方法
- 石大中油调查报告样本
评论
0/150
提交评论