正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
x
第一部分:前言
目标需求
实现 ESL——嵌入式软件许可
在安装过程中,需要安装我们的软件产品,并且安装Oracle 数据库。安装数据库之后
需要导入基础数据,创建指定的库,创建用户和表空间。在安装Oracle 数据时,必须实现
静默安装,不能出现GUI 界面,也不能暴露出安装参数。所有安装过程一次完成,无需用
户干预。
环境说明
操作系统——Windows XP SP3
安装工具——InstallShield 2009 — Premier Edition
数据库——Oracle 10G-R2
第二部分:配置Oracle
此过程需要对Oracle 进行相关的配置,包括录制Response 文件、制作带数据的模板、
调整安装脚本、解锁用户脚本,设置环境变量等操作。
录制 response文件
1. 运行CMD,在命令行窗口进入Oracle 所在路径,这里路径为D:\Orac\database,
Oracle10gserver.rsp是要保存的文件名。
2. 运行此命令后,Oracle安装界面被打开。
3. 去掉创建启动数据库
4. 在汇总信息出现时,退出安装界面,不进行安装。
5. 此时发现在D:\Orac\database 目录中出现了Oracle10gserver.rsp 文件,说明录制成功。该
文件存放的路径,我们后续将会在Install.bat中用到。
创建用户、表空间、导入基础数据
1. 在已有的同版本数据库中创建用户、表空间、导入基础数据
2. 使用 SQL系统账号登陆,并执行CreateDB.sql脚本。注意:脚本中的路径应该以实际的
数据路径为准。
3. 导入文件zgisexp.dmp 和zproexp.dmp。把此脚本存为CMD 文件,直接执行即可。
注意:脚本中的路径应该为实际dmp 文件存放的路径。另外此脚本为本单位的数据信息,
可不作为参考!
创建用户、表空间脚本:
制作带基础数据的模板
有了以上的数据,我们就开始制作数据的模板,以便建库的时候使用。
1. 创建数据库模板
2. 创建好后,我们会在<ORACLE_HOME>\assistants\dbca\templates\目录中,发现如下两个模板
文件。temp_10g.dbc temp_10.dfb
此处两个文件的作用是,按照数据库模板的形式创建数据库,无需在导入表,创建
用户和导入基础数据。这一步,先在已有的Oracle环境下完成。我们拷贝这两个文
件即可。
3. 修改temp_10g.dbc
安装脚本描述
在进行Oracle安装过程中,需要安装程序调用以下的脚本,以实现Oracle的安装过程。
1. Install.cmd 安装Oracle软件脚本
执行此脚本时,需要带以上的参数,具体参数后边会有说明。
2. copynetca.cmd 拷贝监听文件和模板文件,并创建监听服务脚本。
Ø 脚本中存在两个接收的变量,这个是从IS 中传出来的路径参数,必须存在。另外,模
板文件必须拷贝到指定的路径下,<Oracle_Home>\assistants\dbca\templates。
3. createDB.cmd 创建带模板数据的数据库脚本。
此脚本用于根据数据模板创建数据库,命令带如下的参数:
4. unlock.bat 用户解锁脚本
安装模板生成的数据库,其用户状态为锁定,需要执行解锁脚本。
其中change.sql为:
集合Oracle安装脚本
以上的4 个脚本是安装过程必备的4 个脚本,我们现在整理为一个批处理文件install.bat,
以便我们在制作安装包的时候调用该批处理。根据上述脚本的参数类型,我们把参数补完整。
Ø 脚本中存在一个接收的环境变量%DATABASEDIR%,这是由IS运行此程序带出来的参
数,此参数为安装的目标路径。
Ø %SOURPATH%这个参数虽然没有在BAT 文件中有任何的接收说明,但是在执行安装
过程中,IS会创建该参数在BAT文件头端,该参数为目标源路径地址。如何在IS中自
动创建该变量,在第三部份中说明。
Ø 以上的脚本分别调用了上边的4 个脚本,他们后边均带有参数。
Ok,现在已经完成了Oracle方面的设置,我们需要保留的文件为1+4个批处理文件、1 个.SQL
文件和两个模板文件。这些文件将会在IS或安装中被调用。
卸载脚本描述
1. deinstall.cmd 卸载oracle软件,该脚本的参数如下:
2. completeClean.cmd 清除相关文件和设置,该脚本的相关参数如下:
集合卸载脚本
Ø 以上两个脚本为卸载数据库所用,我们把他集合为一个批处理,以方便IS调用。
Ø 该脚本中依然存在%DATABASEDIR%和%SOURPATH%两个参数。作用同install.bat
第三部分:使用IS2009
向导设置
1. 打开 InstallShield2009,新建一个Installscript MSI Project,建议选择此工程,因为该工
程支持脚本编写。选择类型为Windows Installer > InstallScript MSI Projcet
2. 进入IS 向导设置界面,下面我们分别进行设置。下图为Application Information 页面
3. 点击导航,进入Installation Architecture页面,选择YES设置软件组件结构。Files 为安
装文件,Database为数据库文件。
4. 点击导航,进入Application Files 页面,设置安装目标文件夹,并且在database 文件夹
下添加如下文件。
安装设计
1. 在向导设置中进行简单操作后,进入安装设计标签页面。
2. 在基本设置页面查看安装目录和语言设置
3. 在Organization –>Features中设置安装路径,以及其他的设置。下图为Files 的设置
下图为Database的设置,注意目标路径为[INSTALLDIR]Database,该文件夹是在Files文件夹
下的目录。
请设置好OnInstalling、OnInstalled、OnUninstalling、OnUnistalled选项。该选项允许用
户指定和调用相关的Install Scripe 函数。后边我们在IS 中的脚本编程中将讲到如何在这些
函数中写代码。
4. 用户也可以在Application Data ->Files and Folders 中查看或添加修改文件。
5. 在Behavior and Logic—>Support Files/Billboards中的Disk1下添加需要安装包支持的文件
和文件夹。Win32 文件夹是存放基础脚本的文件夹;database文件夹是Oracle的安装文件夹;
Temp_10G.dbc和Temp_10G.dfb 为建库模板文件。
以上步骤完成了IS中的基本设置和安装设置,只要是目录结构的选择,Files文件夹是
安装程序文件的文件夹,它的参数是[INSTALLDIR]。它的目录下是Database文件夹。参数
是[INSTALLDIR]Database。另外注意,3 个脚本文件必须放在指定的文件夹位置,这关系
到脚本语言中的相互调用。
支持文件将存放在光盘的跟目录下,这给我们直接调用这些文件带来了方便。
第四部分:IS2009中的脚本编程
传递源路径参数
用户在使用IS 安装过程中,我们不能够将所有信息都复制到本地硬盘进行安装,通常
情况下会读取源盘上的一些信息,譬如光盘下的某个路径中的内容。但是如何获取安装的路
径信息呢?又如何让批处理文件获知这些内容呢?
这里我们用到IS函数库中的3个函数:
BatchAdd(添加一个环境变量到一个批处理文件)
BatchFileLoad(把一个批处理文件装入内存来用高级批处理函数编辑它)
BatchFileSave(保存一个由BatchFileLoad装入的批处理文件)
BatchAdd函数插入一个SET命令或其它DOS命令到一个已经由BatchFileLoad装入内
存的批处理文件中。参数nOptions 使你可以将新命令添加到文件的第一个或最后一个语句,
用新命令取代一个现存语句,或指定将新命令添加到一个现存语句的前面或后面。调用
BatchAdd前,你必须调用BatchFileLoad来把要修改的文件装入内存。在你修改该文件后,
调用BatchFileSave来把它保存到磁盘。
下面我们在IS2009 中去使用这些函数。
1. 在 Installation Designer 中选择IS左边栏的Behavior and Logic中的InstallScript。
2. 在脚本框的上方,下拉选择框,选择Files
3. 之后,选择右边的下拉框,选择Installed
之所以选择Installed,是因为安装过程中会把Install.bat 批处理脚本复制到本地硬盘,
只有在成功复制之后,我们才能调用该批处理脚本,使用这些函数。
如图所示:
Installed 函数中的具体脚本如下: - #define EXAMPLE_BAT INSTALLDIR^"Database\\install.bat"
- #define EXAMPLE_BAK "install.bak"
- export prototype DefaultFeature_Installed();
- function DefaultFeature_Installed()
- STRING TARG,SOURCE,TARG1;
- STRING DBPATH,DATA,DATAsur,TITLE;
- begin
- // Load the batch file to be edited.
- if (BatchFileLoad (EXAMPLE_BAT) < 0) then
- MessageBox ("Unable to load " + EXAMPLE_BAT+".", SEVERE);
- abort;
- endif;
- DBPATH = SRCDISK + "\";
- // Add the line SET PATH = SRCDISK+"\\”.
- if (BatchAdd ("SOURPATH", DBPATH, "", BEFORE) < 0) then
- MessageBox ("Second call to BatchAdd failed", WARNING);
- abort;
- endif;
- // Save the updated file; back up the original file.
- if (BatchFileSave(EXAMPLE_BAK) < 0) then
- MessageBox ("Unable to save " + EXAMPLE_BAK + ".", SEVERE);
- //else
- // MessageBox ("Batch file saved. Backup created.",INFORMATION);
- endif;
复制代码
该脚本中,我们定义Install.bat 的安装路径,并且在开始处用BatchFileLoad函数调用它,
注意,该调用并不是执行它,而是在内存中临时调用。然后设置一个变量DBPATH = SRCDISK
+ "\\",SRCDISK 是IS判断Setup.inx所在的位置,取出安装盘符,当然我们后边要加上反斜
杠。譬如光盘在F:我们这样做的目的就是在批处理的第一行插入Set SOURPATH = F:\ 。
BatchAdd 函数用于加载这个变量,保证在该批处理文件中最开始就设置这一变量。最后使
用BatchFileSave保存批处理文件。
同样,在卸载时候我们同样需要在Deinstall.bat 中这样去做,只是位置要确定在
Uninstalling,并且定义deinstall.bat 的安装路径即可。
UnInstalling 函数中的具体脚本如下:
- #define UNINSTALL_BAT INSTALLDIR^"Database\\deinstall.bat"
- #define UNINSTALL_BAK "deinstall.bak"
- export prototype DefaultFeature_UnInstalling();
- function DefaultFeature_UnInstalling()
- STRING TARG,SOURCE;
- STRING DBPATH,DATA,DATAsur,TITLE;
- begin
- // Load the batch file to be edited.
- if (BatchFileLoad (UNINSTALL_BAT) < 0) then
- MessageBox ("Unable to load " + EXAMPLE_BAT+".", SEVERE);
- abort;
- endif;
- DBPATH = SRCDISK + "\";
- // Add the line SET PATH = SRCDISK+"\".
- if (BatchAdd ("SOURPATH", DBPATH, "", BEFORE) < 0) then
- MessageBox ("Second call to BatchAdd failed", WARNING);
- abort;
- endif;
- // Save the updated file; back up the original file.
- if (BatchFileSave(UNINSTALL_BAK) < 0) then
- MessageBox ("Unable to save " + UNINSTALL_BAK + ".", SEVERE);
- //else
- // MessageBox ("Batch file saved. Backup created.",INFORMATION);
- endif;
复制代码
执行批处理文件
我们修改完批处理文件,就要在修改保存之后执行它。这需要用到Is 函数库中的
LaunchAppAndWait()函数
语法:LaunchAppAndWait (szProgram, szCmdLine, lWait);
说明:LaunchAppAndWait函数运行由szProgram指定的带有szCmdLine指定的命令行
参数的应用程序。第三个参数,lWait 指示安装在继续前是否要等待直到运行的应用程序终
止。
一个安装程序只能监控由szProgram 指定的应用程序;如果该应用程序要运行其它应
用程序或进程,安装程序不能监控它们。因此,安装程序将在第一个应用程序结束后继续,
即使那时由第一个应用程序运行的其它应用程序仍在运行。注意如果运行的应用程序终止失
败,则安装程序将无限等待运行的应用程序完成。
添加在Installed脚本的后面:
- TARG = INSTALLDIR^"Database";
- if (LaunchAppAndWait(INSTALLDIR^"Database\\install.bat",TARG,LAAW_OPTION_WAIT |
- LAAW_OPTION_HIDDEN) < 0) then
- MessageBox ("Unable to launch install.bat",SEVERE);
- endif;
- end;
复制代码
LAAW_OPTION_HIDDEN 这个参数是隐藏bat 的执行窗口, 它与
LAAW_OPTION_WAIT并用是隐藏并且等待程序执行完成后返回,注意他们的前后顺序。
添加在UnInstalling脚本的后面:
- TARG = INSTALLDIR^"Database";
- if
- (LaunchAppAndWait(INSTALLDIR^"Database\\deinstall.bat",TARG,LAAW_OPTION_WAIT |
- LAAW_OPTION_HIDDEN) < 0) then
- MessageBox ("Unable to launch deinstall.bat",SEVERE);
- endif;
- end;
复制代码
脚本已经完成,我们编译脚本,并确定没有任何的问题。
第五部分:其他
修改界面风格
1. 在 Installation Designer 中选择IS左边栏的User Interface中的Dialogs
2. 在右边窗口中选择Skins,选择之后点击Select
3. 界面窗口风格改变
编译打包
1. 在 Installation Designer 中选择IS左边栏的Media 中的Realrases
2. 在右边栏Releases点击右键,选择ReleasesWizard…
3. 出现向导界面
4. 在该界面中,注意几个界面,其余均为默认
5. Filter Setting界面,不要做任何的选择
6. Media Type界面,选择Network Image
注意:该地点不要选择过滤!!默认即可,若选择,导致读取光盘1158问题!上图为错误图
完整的安装包文件
第六部分:遇到的问题
1158问题:过滤语言操作导致,不选择过滤项即可
中文输入乱码问题:在向导中进行中文输入即可
环境变量问题:由于IS提供设置环境变量的功能,先开始认为在IS中设置环境变量就可以
通过bat去读取,但是这样做是错误的,变量是可以添加成功,但不允许该次的调用,所以
放弃了这种方法,改用函数。
设计思路问题:先开始是创建新库,并分别导入表,创建用户,导入数据,这样做麻烦的要
死,参数问题不断。后来改用数据模板建库。
目录问题:开始是这样打算的,把文件和数据库用不同的目录区分开,UI 中出现两个路径
选择页面,可是IS中只提供一个安装INSTALLDIR 的目录的参数,另外一个目录路径我不
知道如何获取和调用。故采用在INSTALLDIR目录下又创建了Database文件夹。
- 部分源代码
- export prototype New_Feature_Installing();
- function New_Feature_Installing()
- begin
- end;
- //---------------------------------------------------------------------------
- // The Installing event is sent before the feature DefaultFeature
- // is installed.
- //---------------------------------------------------------------------------
- export prototype DefaultFeature_Installing();
- function DefaultFeature_Installing()
- STRING diskpath,szCommand,szCmdLine,szCommandecp,szCmdLineecp;
- begin
- diskpath = SRCDISK + "\"; //定义安装盘路径
- //运行framework20安装程序
- if (LaunchAppAndWait(SRCDIR^"supportfiles\\dotnetfx.exe","",LAAW_OPTION_WAIT/* |
- LAAW_OPTION_HIDDEN*/) < 0) then
- MessageBox ("Unable to launch dotnet",SEVERE);
- endif;
- if
- (LaunchAppAndWait(SRCDIR^"supportfiles\\framwork2.0\\setup.exe","",LAAW_OPTION_WAIT/*
- |
- LAAW_OPTION_HIDDEN*/) < 0) then
- MessageBox ("Unable to launch dotnet2",SEVERE);
- endif;
- //定义MSI文件参数及MSI文件位置
- szCommand = WINSYSDIR^"msiexec.exe";
- LongPathToShortPath(szCommand);
- szCmdLine =SRCDIR^"supportfiles\\EngineRT\\setup.msi";
- LongPathToShortPath(szCmdLine);
- //运行MSI文件
- if (LaunchAppAndWait( szCommand,"/i"+szCmdLine,LAAW_OPTION_WAIT) < 0) then
- MessageBox ("Unable to launch ACGIS",SEVERE);
- endif;
- // szCommandecp = SRCDIR^"supportfiles\\SoftwareAuthorization.exe";
- // LongPathToShortPath(szCommandecp);
- // szCmdLineecp =SRCDIR^"supportfiles\\license.ecp";
- // LongPathToShortPath(szCmdLineecp);
- if (LaunchAppAndWait(SRCDIR^"supportfiles\\Runecp.bat",diskpath,LAAW_OPTION_WAIT/*
- |
- LAAW_OPTION_HIDDEN*/) < 0) then
- MessageBox ("Unable to launch ecp",SEVERE);
- endif;
- end;
- //---------------------------------------------------------------------------
- // The Installed event is sent after the feature DefaultFeature
- // is installed.
- //---------------------------------------------------------------------------
- #define EXAMPLE_BAT INSTALLDIR^"Database\\install.bat"
- #define EXAMPLE_BAK "install.bak"
- export prototype DefaultFeature_Installed();
- function DefaultFeature_Installed()
- STRING TARG,SOURCE,TARG1;
- STRING DBPATH,DATA,DATAsur,TITLE;
- begin
- // Load the batch file to be edited.
- if (BatchFileLoad (EXAMPLE_BAT) < 0) then
- MessageBox ("Unable to load " + EXAMPLE_BAT+".", SEVERE);
- abort;
- endif;
- DBPATH = SRCDISK + "\";
- // Add the line SET PATH = SRCDISK^"test".
- if (BatchAdd ("SOURPATH", DBPATH, "", BEFORE) < 0) then
- MessageBox ("Second call to BatchAdd failed", WARNING);
- abort;
- endif;
- // Save the updated file; back up the original file.
- if (BatchFileSave(EXAMPLE_BAK) < 0) then
- MessageBox ("Unable to save " + EXAMPLE_BAK + ".", SEVERE);
- //else
- // MessageBox ("Batch file saved. Backup created.",INFORMATION);
- endif;
- //DATAsur = "C:\";
- //DATA = SRCDISK^"test";
- // TITLE = "Path buffer example";
- // PathSet (DATAsur);
- //SprintfBox (INFORMATION,TITLE,
- // "The starting search path is %s.",DATAsur);
- // if (PathAdd(DATA, "", FULL, BEFORE) < 0) then
- // MessageBox ("Unable to add DATA Path to path buffer.", SEVERE);
- // abort;
- // endif;
- // PathGet (DATAsur);
- //SprintfBox (INFORMATION,TITLE,
- // "DATA Path added before first path.\n\nThe search path is %s.",
- // DATAsur);
- TARG = INSTALLDIR^"Database";
- // SOURCE = SRCDISK^"test";
- // LaunchAppAndWait(SRCDIR^"path.bat",SOURCE,WAIT);
- if (LaunchAppAndWait(INSTALLDIR^"Database\\install.bat",TARG,LAAW_OPTION_WAIT |
- LAAW_OPTION_HIDDEN) < 0) then
- MessageBox ("Unable to launch install.bat",SEVERE);
- endif;
- //Delay(1);
- // LaunchAppAndWait(INSTALLDIR^"createdb.bat",TARG,LAAW_OPTION_WAIT);
- //Delay(2);
- // LaunchAppAndWait(SRCDISK^"test//sqlscript//setup.bat",TARG,LAAW_OPTION_WAIT);
- // Delay(2);
- // LaunchAppAndWait(SRCDISK^"test//sqlscript//importdb.bat",TARG,LAAW_OPTION_WAIT);
- end;
- //---------------------------------------------------------------------------
- // The UnInstalling event is sent just before the feature
- // DefaultFeature is uninstalled.
- //---------------------------------------------------------------------------
- #define UNINSTALL_BAT INSTALLDIR^"Database\\deinstall.bat"
- #define UNINSTALL_BAK "deinstall.bak"
- export prototype DefaultFeature_UnInstalling();
- function DefaultFeature_UnInstalling()
- STRING TARG,SOURCE;
- STRING DBPATH,DATA,DATAsur,TITLE;
- begin
- // Load the batch file to be edited.
- if (BatchFileLoad (UNINSTALL_BAT) < 0) then
- MessageBox ("Unable to load " + EXAMPLE_BAT+".", SEVERE);
- abort;
- endif;
- DBPATH = SRCDISK + "\";
- // Add the line SET PATH = SRCDISK^"test".
- if (BatchAdd ("SOURPATH", DBPATH, "", BEFORE) < 0) then
- MessageBox ("Second call to BatchAdd failed", WARNING);
- abort;
- endif;
- // Save the updated file; back up the original file.
- if (BatchFileSave(UNINSTALL_BAK) < 0) then
- MessageBox ("Unable to save " + UNINSTALL_BAK + ".", SEVERE);
- //else
- // MessageBox ("Batch file saved. Backup created.",INFORMATION);
- endif;
- //DATAsur = "C:\";
- //DATA = SRCDISK^"test";
- // TITLE = "Path buffer example";
- // PathSet (DATAsur);
- //SprintfBox (INFORMATION,TITLE,
- // "The starting search path is %s.",DATAsur);
- // if (PathAdd(DATA, "", FULL, BEFORE) < 0) then
- // MessageBox ("Unable to add DATA Path to path buffer.", SEVERE);
- // abort;
- // endif;
- // PathGet (DATAsur);
- //SprintfBox (INFORMATION,TITLE,
- // "DATA Path added before first path.\n\nThe search path is %s.",
- // DATAsur);
- TARG = INSTALLDIR^"Database";
- // SOURCE = SRCDISK^"test";
- // LaunchAppAndWait(SRCDIR^"path.bat",SOURCE,WAIT);
- if (LaunchAppAndWait(INSTALLDIR^"Database\\deinstall.bat",TARG,LAAW_OPTION_WAIT |
- LAAW_OPTION_HIDDEN) < 0) then
- MessageBox ("Unable to launch deinstall.bat",SEVERE);
- endif;
- end;
复制代码
|