InstallShield 实例及学习总结

需求:

  最近遇到一个项目,需要将web打包成exe安装程序,使用了很强大的Installshield工具。在这个打包过程中,需要完成一下几个事情:

  1、首先检测是否安装JDK和MySQL,如果没有则启动安装程序开始安装。

  2、启动MySql服务器,初始化数据库(建库,建表等)。

  3、复制完数据后,将jdk安装路径附到某个bat中,例如设置tomcat的startup.bat中的JAVA_HOME.。

  4、结束时,自动启动某个应用。

在进行这个任务时,下面的几篇博客给了我很大帮助,希望大家可以看看,在此我也不做过多的重复介绍了。

帮助最大的就是官方的Help了,写的真的很好,很仔细。

http://www.cnblogs.com/Cindy_weiwei/archive/2009/05/18/1459542.html(很全,很好)

http://chorfung.blog.163.com/blog/static/1207120002010320104717707/

   我用的是InstallShield2010破解版,WIN7。

  创建InstallScript MSI Project项目。

  打开Intallation Designer->Behavior and Logic->InstallScript。

  OnFirstUIBefore中显示出开始复制数据前的所有界面,可以进行相应的修改。

  1、在显示欢迎界面之前,判断JDK和MySql是否安装等。

  在此需要向Intallation Designer->Behavior and Logic->Support Files/Billboards下的Support Files 下的Language Independent下添加jdk和mysql的安装程序,在检测到没有的情况下,调用安装。代码中SUPPORTDIR则表示该文件夹的路径。

 if(!MAINTENANCE) then
       RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
       //检测是否安装JDK
       jdkkey="SOFTWARE\\JavaSoft\\Java Development Kit\\1.6.0_05";
       if (RegDBKeyExist (jdkkey) < 0) then
            MessageBox ("系统检测到您没有安装JDK,系统将自动引导您安装好JDK环境", INFORMATION);
             LaunchAppAndWait (SUPPORTDIR^"jdk-6u5-windows-i586-p.exe","", LAAW_OPTION_WAIT);
       endif;
       //检测是否安装MySql
       mysqlkey="SOFTWARE\\MySQL AB\\MySQL Server 5.0";
       if(RegDBKeyExist(mysqlkey) < 0) then
            MessageBox("系统检测到您没有安装MySql,系统将自动引导您安装好MySql环境", INFORMATION);
             LaunchAppAndWait (SUPPORTDIR^"mysql-5.0.96-win32.exe", "", LAAW_OPTION_WAIT);
       endif;
     endif;

检测jdk和mysql

  2、初始化MYSQL数据库

  增加一个让用户输入用户名密码的界面,用于导入sql脚本来创建数据库和表。

  主要思路就是用bat来导入SQL脚本来初始化数据库。在该程序中将ufbank.sql和ufbank.bat放到Support Files下,在安装过程中在C盘创建临时文件夹,将其复制到临时文件夹中,运行bat,执行sql脚本,然后根据生产的文件名判断是否执行成功,0.txt表示成功,1.txt表示失败。最后删除临时文件。

//初始化MySql数据库
Dlg_InitMySql:
    svEdit1="root";
    svEdit2="";
    nResult = EnterLoginInfo ( "请输入MYSQL数据库用户名和密码" , svEdit1 , svEdit2 );
    //nResult=SdShowDlgEdit2 ( "初始化数据库" , "请输入MYSQL数据库用户名和密码(留空则表示不初始化数据库)。" , "用户名" , "密  码" , svEdit1 ,svEdit2  );
    if(nResult=BACK) goto Dlg_SdWelcome;
    if(svEdit1!="" & svEdit2!="") then
       //获取MYSQL安装路径
       mysqlkey="SOFTWARE\\MySQL AB\\MySQL Server 5.0";
       mysqlpath="";
       svSize=-1;
       RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
       svType=REGDB_STRING;
       if(RegDBGetKeyValueEx(mysqlkey,"location",svType,mysqlpath,svSize)<0) then
               MessageBox("MySQL安装路径提取失败",INFORMATION);
               goto Dlg_InitMySql;
       endif;
        if(mysqlpath!="") then
            mysqlpath = mysqlpath+"bin\\mysql";
        endif;
        //复制初始化数据库的临时文件到c盘根目录
        CreateDir("c:\\UFBankDBtemp");
        CopyFile(SUPPORTDIR^"ufbank.sql","c:\\UFBankDBtemp\\ufbank.sql");
        CopyFile(SUPPORTDIR^"ufbank.bat","c:\\UFBankDBtemp\\ufbank.bat");
        //启动MYSQL数据库
        szMsg="正在启动MYSQL服务,请稍等...";
        SdShowMsg(szMsg,TRUE);
        LaunchAppAndWait("net","start mysql",LAAW_OPTION_WAIT);
        SdShowMsg(szMsg,FALSE);
        //开始执行SQL。
        szMsg="正在初始化数据库,请稍等...";
        SdShowMsg(szMsg,TRUE);
        ISsucc=LaunchAppAndWait("c:\\UFBankDBtemp\\ufbank.bat","\""+ mysqlpath+"\" \""+svEdit1+"\" \""+svEdit2+"\"",LAAW_OPTION_WAIT);
        SdShowMsg(szMsg,FALSE);
        if(ISsucc<0) then
            MessageBox("数据库初始化失败,请确认您的数据库中已正确安装MYSQL",SEVERE);
            goto Dlg_InitMySql;
        else
            FindFile("c:\\UFBankDBtemp","*.txt",svResult);
            switch(svResult)
                case "0.txt":
                case "1.txt":
                    MessageBox("用户名或密码有误,或者MYSQL安装不正确,请您重新确认。",SEVERE);
                    goto Dlg_InitMySql;
            endswitch;
        endif;
        //删除初始化数据库的临时文件?
       DeleteDir("c:\\UFBankDBtemp",ALLCONTENTS);
   else
      MessageBox("用户名和密码不能为空。",INFORMATION);
      goto Dlg_InitMySql;
   endif;  

初始化MYSQL数据库

CREATE DATABASE if not exists `dbs` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
use log
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `table1`
-- ----------------------------
CREATE TABLE if not exists `table1`(
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(10) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT ignore INTO `table1` VALUES (‘1‘, ‘name1‘);
--ignore 关键字可以防止主键重复导致的报错信息

sql脚本

@echo off
set path_bin_mysql=%1
set user=%2
set password=%3
%path_bin_mysql% -u%user% -p%password% < ufbank.sql
echo>%errorlevel%.txt

bat脚本

  在Intallation Designer->Server Configuretion->SQL Script可以直接连库写SQL脚本,官方帮助和网上均有很多关于SQL Server数据库的介绍,这里的连库需要用到ODBC,SQLSERVER可以直接连接成功,但MYSQL就不可以了,需要配置ODBC等,我没有试,感兴趣的试试吧。

  3、将jdk安装路径写入到某个文件中。

//获取JAVA_HOME安装路径
   jdkkey="SOFTWARE\\JavaSoft\\Java Development Kit\\1.6.0_05";
   JAVA_HOME="";
   if(RegDBGetKeyValueEx(jdkkey,"javahome",svType,JAVA_HOME,svSize)<0) then
           MessageBox("JDK安装路径提取失败",INFORMATION);
   endif; 

    //向BAT中设置javahome路径等信息
    //startup.bat
    if (FindFile(TARGETDIR^"bin","startup.bat",svResult)=0) then         

 szInsertLine="set JAVA_HOME="+JAVA_HOME;

FileInsertLine(TARGETDIR^"UFGOVBank\\bin\\startup.bat",szInsertLine,1,REPLACE);
    endif;  

写入javahome

  4、最后启动某个应用,在OnEnd中利用LanuchAppAndWait函数实现。

时间: 2024-11-14 19:49:33

InstallShield 实例及学习总结的相关文章

通过一个具体的实例来学习hive

----资源来自于官网教程 Simple Example Use Cases MovieLens User Ratings First, create a table with tab-delimited text file format: CREATE TABLE u_data ( userid INT, movieid INT, rating INT, unixtime STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED

InstallShield 脚本语言学习笔记

InstallShield脚本语言是类似C语言,利用InstallShield的向导或模板都可以生成基本的脚本程序框架,可以在此基础上按自己的意愿进行修改和添加.     一.基本语法规则      1.变量      BOOL 布尔型 值为TRUE(1)或FALSE(0)      CHAR 字符型 一字节长的(8bit)的字符      HWND 窗口句柄 用来存放窗口句柄      INT 整型 两字节长的整数      LIST 列表型 指向InstallShield列表,用ListCr

installshield实例(三)发布,补丁,升级

原理: Installshield主要是控制Product Code,Upgrade Code,Package Code(这三个都是GUID,全球唯一的)和Product Version来达到发步,补丁,升级的. Product Code就是该产品的唯一ID,一般不需要改变. Upgrade Code在升级时才需要改变,打补丁不需要改变. Package Code在每次修改发布时都需要改变. 可以参见帮助中“upgrades [Windows Installer]”,其中有幅图详细说明了,补丁和

[OpenCV]3 在实例中学习简单函数以及数据读写

实例一 int main() {  IplImage*  img = cvLoadImage("6085.jpg", 1); IplImage* red = cvCreateImage(cvGetSize(img), img->depth, 1);  IplImage* green = cvCreateImage(cvGetSize(img), img->depth, 1);  IplImage* blue = cvCreateImage(cvGetSize(img), i

Spring-MVC入门(一):入门实例 (重点学习)

1.MVC :Model-View-Control 框架性质的C 层要完成的主要工作:封装web 请求为一个数据对象.调用业务逻辑层来处理数据对象.返回处理数据结果及相应的视图给用户. 2. 简要概述springmvc Spring C 层框架的核心是 DispatcherServlet,它的作用是将请求分发给不同的后端处理器,也即 使用了一种被称为Front Controller 的模式(后面对此模式有简要说明). Spring 的C 层框架使用了后端控制器来.映射处理器和视图解析器来共同完成

【OpenCV归纳】3 在实例中学习简单函数以及数据读写

 实例一 int main() { IplImage*  img = cvLoadImage("6085.jpg", 1); IplImage* red = cvCreateImage(cvGetSize(img), img->depth, 1); IplImage* green = cvCreateImage(cvGetSize(img), img->depth, 1); IplImage* blue = cvCreateImage(cvGetSize(img), i

【 python 学习笔记 -- OOP】在实例中学习继承(inheritance)和组合(composition)

[面向对象的三大特征]: [封装(encapsulation)]: 通过抽象的类把数据和方法封装起来.实例的数据只能通过public interface(即实例的方法)来获取或操作. [优点]:1. 功能只需在一个地方定义,而不需要在很多地方重复定义 2. 保证对象内部的数据的安全性 3. 当我们想要使用一个方法的时候,我们只需要知道我们用这个方法会返回什么结果,而不需要知道内部到底做了哪些操作来实现的.  就好像我们看电视时想要换频道,只需要按几个按钮,不需要知道要怎么调频. [继承  (in

2018-03-24 mysql多实例安装学习笔记

2018-03-24 MySQL多实例介绍 什么是mysql多实例 一台机器上开启多个不同的服务端口(如:3306,3307),运行多个mysql服务进程,这些服务进程通过不同的socket舰艇不同的服务端口来提供各自的服务. 这些mysql多实例共用一套MySQL安装程序,使用不同或相同的my.cnf配置文件.启动程序,数据文件. mysql多实例的作用与问题: 有效利用服务器资源 节约服务器资源,需要主从同步等技术时,多实例再好不过了. 资源互相抢占问题 当某个服务实例并发很高或者有慢查询时

从实例中学习grid布局

对于Web开发者来说,网页布局一直是个比较重要的问题. Web 布局主要经历了以下四个阶段: 1.table表格布局: 2.float浮动及position定位布局: 3.flex弹性盒模型布局,革命性的突破,解决传统布局方案上的三大痛点 "排列方向"."对齐方式","自适应尺寸".是目前最为成熟和强大的布局方案: 4.grid栅格布局,二维布局模块,具有强大的内容尺寸和定位能力,适合需要在两个维度上对齐内容的布局.随着 CSS Grid 的出现