杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2925|回复: 0

InstallShield 检测JDK,MYSQL,创建数据库

[复制链接]
发表于 2017-3-27 16:42:41 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  1、首先检测是否安装JDK和MySQL,如果没有则启动安装程序开始安装。
  2、启动MySql服务器,初始化数据库(建库,建表等)。
  3、复制完数据后,将jdk安装路径附到某个bat中,例如设置tomcat的startup.bat中的JAVA_HOME.。
  4、结束时,自动启动某个应用。

  创建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则表示该文件夹的路径。
  1. if(!MAINTENANCE) then
  2.        RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);  
  3.        //检测是否安装JDK   
  4.        jdkkey="SOFTWARE\\JavaSoft\\Java Development Kit\\1.6.0_05";
  5.        if (RegDBKeyExist (jdkkey) < 0) then
  6.             MessageBox ("系统检测到您没有安装JDK,系统将自动引导您安装好JDK环境", INFORMATION);
  7.              LaunchAppAndWait (SUPPORTDIR^"jdk-6u5-windows-i586-p.exe","", LAAW_OPTION_WAIT);
  8.        endif;
  9.        //检测是否安装MySql  
  10.        mysqlkey="SOFTWARE\\MySQL AB\\MySQL Server 5.0";
  11.        if(RegDBKeyExist(mysqlkey) < 0) then
  12.             MessageBox("系统检测到您没有安装MySql,系统将自动引导您安装好MySql环境", INFORMATION);
  13.              LaunchAppAndWait (SUPPORTDIR^"mysql-5.0.96-win32.exe", "", LAAW_OPTION_WAIT);
  14.        endif;
  15.      endif;
复制代码


  2、初始化MYSQL数据库

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

  主要思路就是用bat来导入SQL脚本来初始化数据库。在该程序中将ufbank.sql和ufbank.bat放到Support Files下,在安装过程中在C盘创建临时文件夹,将其复制到临时文件夹中,运行bat,执行sql脚本,然后根据生产的文件名判断是否执行成功,0.txt表示成功,1.txt表示失败。最后删除临时文件。
  1. //初始化MySql数据库
  2. Dlg_InitMySql:
  3.     svEdit1="root";
  4.     svEdit2="";
  5.     nResult = EnterLoginInfo ( "请输入MYSQL数据库用户名和密码" , svEdit1 , svEdit2 );
  6.     //nResult=SdShowDlgEdit2 ( "初始化数据库" , "请输入MYSQL数据库用户名和密码(留空则表示不初始化数据库)。" , "用户名" , "密  码" , svEdit1 ,svEdit2  );
  7.     if(nResult=BACK) goto Dlg_SdWelcome;
  8.     if(svEdit1!="" & svEdit2!="") then
  9.        //获取MYSQL安装路径
  10.        mysqlkey="SOFTWARE\\MySQL AB\\MySQL Server 5.0";
  11.        mysqlpath="";  
  12.        svSize=-1;   
  13.        RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
  14.        svType=REGDB_STRING;
  15.        if(RegDBGetKeyValueEx(mysqlkey,"location",svType,mysqlpath,svSize)<0) then
  16.                MessageBox("MySQL安装路径提取失败",INFORMATION);
  17.                goto Dlg_InitMySql;
  18.        endif;
  19.         if(mysqlpath!="") then
  20.             mysqlpath = mysqlpath+"bin\\mysql";
  21.         endif;
  22.         //复制初始化数据库的临时文件到c盘根目录
  23.         CreateDir("c:\\UFBankDBtemp");
  24.         CopyFile(SUPPORTDIR^"ufbank.sql","c:\\UFBankDBtemp\\ufbank.sql");
  25.         CopyFile(SUPPORTDIR^"ufbank.bat","c:\\UFBankDBtemp\\ufbank.bat");   
  26.         //启动MYSQL数据库
  27.         szMsg="正在启动MYSQL服务,请稍等...";
  28.         SdShowMsg(szMsg,TRUE);
  29.         LaunchAppAndWait("net","start mysql",LAAW_OPTION_WAIT);
  30.         SdShowMsg(szMsg,FALSE);
  31.         //开始执行SQL。
  32.         szMsg="正在初始化数据库,请稍等...";
  33.         SdShowMsg(szMsg,TRUE);
  34.         ISsucc=LaunchAppAndWait("c:\\UFBankDBtemp\\ufbank.bat","""+ mysqlpath+"" ""+svEdit1+"" ""+svEdit2+""",LAAW_OPTION_WAIT);
  35.         SdShowMsg(szMsg,FALSE);
  36.         if(ISsucc<0) then
  37.             MessageBox("数据库初始化失败,请确认您的数据库中已正确安装MYSQL",SEVERE);
  38.             goto Dlg_InitMySql;
  39.         else
  40.             FindFile("c:\\UFBankDBtemp","*.txt",svResult);
  41.             switch(svResult)
  42.                 case "0.txt":
  43.                 case "1.txt":
  44.                     MessageBox("用户名或密码有误,或者MYSQL安装不正确,请您重新确认。",SEVERE);   
  45.                     goto Dlg_InitMySql;
  46.             endswitch;
  47.         endif;
  48.         //删除初始化数据库的临时文件?
  49.        DeleteDir("c:\\UFBankDBtemp",ALLCONTENTS);   
  50.    else
  51.       MessageBox("用户名和密码不能为空。",INFORMATION);
  52.       goto Dlg_InitMySql;
  53.    endif;
复制代码


sql脚本
  1. CREATE DATABASE if not exists `dbs` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
  2. use log
  3. SET FOREIGN_KEY_CHECKS=0;
  4. -- ----------------------------
  5. -- Table structure for `table1`
  6. -- ----------------------------
  7. CREATE TABLE if not exists `table1`(
  8.   `id` int(11) NOT NULL auto_increment,
  9.   `name` varchar(10) default NULL,
  10.   PRIMARY KEY  (`id`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  12. INSERT ignore INTO `table1` VALUES ('1', 'name1');
  13. --ignore 关键字可以防止主键重复导致的报错信息
复制代码


bat脚本
  1. @echo off
  2. set path_bin_mysql=%1
  3. set user=%2
  4. set password=%3
  5. %path_bin_mysql% -u%user% -p%password% < ufbank.sql
  6. echo>%errorlevel%.txt
复制代码

  在Intallation Designer->Server Configuretion->SQL Script可以直接连库写SQL脚本,官方帮助和网上均有很多关于SQL Server数据库的介绍,这里的连库需要用到ODBC,SQLSERVER可以直接连接成功,但MYSQL就不可以了,需要配置ODBC等,我没有试,感兴趣的试试吧。
  3、将jdk安装路径写入到某个文件中。
  1. //获取JAVA_HOME安装路径
  2.    jdkkey="SOFTWARE\\JavaSoft\\Java Development Kit\\1.6.0_05";
  3.    JAVA_HOME="";
  4.    if(RegDBGetKeyValueEx(jdkkey,"javahome",svType,JAVA_HOME,svSize)<0) then
  5.            MessageBox("JDK安装路径提取失败",INFORMATION);
  6.    endif;
  7.      
  8.     //向BAT中设置javahome路径等信息  
  9.     //startup.bat
  10.     if (FindFile(TARGETDIR^"bin","startup.bat",svResult)=0) then         
  11.       
  12. szInsertLine="set JAVA_HOME="+JAVA_HOME;
  13.       
  14. FileInsertLine(TARGETDIR^"UFGOVBank\\bin\\startup.bat",szInsertLine,1,REPLACE);
  15.     endif;  
复制代码


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








回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-13 11:00 , Processed in 0.137857 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表