LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

InstallShield制作安装程序例子

admin
2013年1月17日 2:42 本文热度 4748

本文主要是打包JSP+TOMCAT+JDK+MYSQL


首先下载InstallShield软件,现在版本很多,但是脚本代码几乎差不多的。


其次下载Tomcat绿色版,MYSQL绿色版,把安装过的JDK拷贝一份。


再次把数据库文件放到MYSQL目录下,把项目放到TOMCAT下。


一切准备就绪,我们就开始了。。。。


1.设置安装语言,在选择项目后,如果选择的多种安装语言,则安装程序运行时首先让选择安装语言,此处不需我们写脚本。如果只有一种语言则安装时不弹出选择语言对话框。


2.设置启动画面,只需要把默认的图片更换即可,不过图片名称不能改变。


3.如何判断操作系统,代码如下:



Function OnBegin()
Begin
if ( !SYSINFO.bIntel) then
szMsg = "提示:该软件只能运行在Intel系列的处理器上!/n/n安装程序将终止";
MessageBox(szMsg, SEVERE);
abort;
endif;
if (SYSINFO.WIN9X.bWinMe || 
SYSINFO.WINNT.bWinNT || 
SYSINFO.WINNT.bWinNT4 || 
SYSINFO.WINNT.bWin2000) then
szMsg = "提示:该软件只能运行在WIN9X系统上才能确保程序的正常工作!/n/n是否继续安装?";
if ( !AskYesNo (szMsg, NO)) then 
abort;
endif;
endif;
end 


4.操作系统内存容量判断



if (GetSystemInfo (EXTENDEDMEMORY, nvFreeMem, svResult) < 0) then
 MessageBox ("内存检测失败,安装程序将终止!.", SEVERE);
 abort;
endif;
if ( nvFreeMem < 16384 ) then 
szMsg = "该软件只能安装在16M以上内存的机器中。/n很遗憾,本机器可用内存不足16M!/n/n安装程序将终止!"; MessageBox (szMsg, SEVERE);
abort;
endif;


5.序列号的生成(首先获得磁盘序列,然后生成序列号)



NUMBER volumeNum;  
//Before using the GetVolumeInformation API you will need to prototype it  
prototype KERNEL32.GetVolumeInformation (BYREF STRING, BYREF STRING, NUMBER, BYREF NUMBER, BYREF NUMBER, BYREF NUMBER, BYREF STRING, NUMBER);  
//prototype for the custom InstallScript function  
prototype GetVolumeSerial();  
//function definition  
function GetVolumeSerial()  
STRING lpRootPathName;  
STRING lpVolumeNameBuffer;  
NUMBER nVolumeNameSize;  
NUMBER lpVolumeSerialNumber;  
NUMBER lpMaximumComponentLength;  
NUMBER lpFileSystemFlags;  
STRING lpFileSystemNameBuffer;  
NUMBER nFileSystemNameSize;  
BOOL APIReturn;  
begin  
  lpRootPathName="d://";  
  nVolumeNameSize=60;  
  nFileSystemNameSize=60;  
  //APIReturn=GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize,   lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize);  
  APIReturn=GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize,   lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize);
    
  if (APIReturn) then          
   
   volumeNum = lpVolumeSerialNumber ;   
   if (volumeNum < 0) then  
    volumeNum = 0 - volumeNum;  
   endif;       
   //NumToStr(volumeNum,lpVolumeSerialNumber);  
    //SprintfBox(INFORMATION, "", "Volume= %s/nVolume Serial= %d", lpRootPathName, lpVolumeSerialNumber);  
   if (volumeNum > 2139999999 - 135792468) then         
   
    //volumeNum = 123456789;  
    volumeNum = volumeNum - volumeNum/100000000*100000000;  
   endif;       
     
  else                      
   
     volumeNum = 123456789;  
    //MessageBox("Failure.",0);  
  endif;  
end ;  
prototype getNumString();  
function getNumString()  
  number numSpace;  
  number numMen;  
  string tmpString;  
begin                                          
     //tmpNum = GetWindowHandle(HWND_INSTALL);  //安装主窗口的句柄   
     //numSpace = GetDiskSpace("c://"); //指定驱动器上的空闲磁盘空间   
     numSpace = GetDiskSpaceEx("c://",KBYTES); //指定驱动器上的空闲磁盘空间        BYTES   
     //numMen = GetMemFree();  //运行在Microsoft Windows下的一个应用程序可用的内存大小      
     numMen = GetDiskSpaceEx("d://",KBYTES);  
     if numSpace < 10000 then  
        numSpace = 11360000;  
     else 
      numSpace = (numSpace - numSpace/10000*10000)*10000;  
     endif;  
     if numMen < 10000 then  
        numMen = 7521;    
     else 
      numMen = numMen - numMen/10000*10000;  
     endif;                                                    
     volumeNum = 100000000 + numSpace + numMen;   
      
     //NumToStr(tmpString,volumeNum);       
    // MessageBox(tmpString,0);                              
end;


GetVolumeSerial();                      
    tmpNum =  volumeNum;               
    tmpNum = tmpNum - tmpNum / 100 * 100;    
    NumToStr(tmpCheckString,tmpNum);      
    if (tmpCheckString == "0") then  
      tmpCheckString = "0X";  
    endif;  
    checkString = "B" + tmpCheckString + "_";       
    tmpNum =  volumeNum / 100;               
    tmpNum = tmpNum - tmpNum / 100 * 100;    
    NumToStr(tmpCheckString,tmpNum);     
    if (tmpCheckString == "0") then  
      tmpCheckString = "0X";  
    endif;  
    checkString = checkString + "K" + tmpCheckString + "_";  
    tmpNum =  volumeNum / 10000;               
    tmpNum = tmpNum - tmpNum / 100 * 100;    
    NumToStr(tmpCheckString,tmpNum);    
    if (tmpCheckString == "0") then  
      tmpCheckString = "0X";  
    endif;  
    checkString = checkString + "X" + tmpCheckString + "_";  
    tmpNum =  volumeNum / 1000000;               
    tmpNum = tmpNum - tmpNum / 100 * 100;    
    NumToStr(tmpCheckString,tmpNum);  
    if (tmpCheckString == "0") then  
      tmpCheckString = "0X";  
    endif;   
    checkString = checkString + "T" + tmpCheckString;  
                                                     
    //MessageBox(checkString,INFORMATION);   
        
    //变换volumeNum的值  
    //B3242_K423_X342_T3423     
    volumeNum = volumeNum + 135792468;             
    NumToStr(localNum,volumeNum);


1.安装协议对话框代码(其中license.txt是安装协议内容)



Dlg_Start:  
    // beginning of dialogs label  
Dlg_SdWelcome:  
    szTitle = "xx系统";  
    szMsg   = "安装程序即将在本机上安装xx系统,确定是否继续安装?继续请按【下一步(next)】";  
    nResult = SdWelcome( szTitle, szMsg );  
    if (nResult = BACK) goto Dlg_Start;  


Dlg_SdLicense:    
    szLicenseFile = SUPPORTDIR ^ "license.txt";
    szTitle    = "xx系统";
    szMsg      = "";
    szQuestion = "您是否接受该协议?接受请按【是(Yes)】。继续安装必须接受该协议。";
    nResult    = SdLicense( szTitle, szMsg, szQuestion, szLicenseFile );
    if (nResult = BACK) goto Dlg_SdWelcome;


2.用户信息对话框(其中序列号checkString是上篇中,安装程序根据磁盘序列及我们设置的编码规则生成的字符串)



Dlg_SdShowInfoList:        
    szTitle = "系统本地编号";  
    szMsg    = "将下面的本地编号发送给权限授予机构,在接收到相应的注册码后,您将进行继续注册!";       
    szField1 = "编号";  
    svEdit1 = localNum;    
    nResult = SdShowDlgEdit1(szTitle, szMsg,szField1, svEdit1);          
    if (nResult = BACK) goto Dlg_SdWelcome;  
Dlg_SdRegisterUserEx:  
    szMsg   = "";  
    szTitle = "";        
    nResult = SdRegisterUserEx( szTitle, szMsg, szName, szCompany, szSerial );  
    if (nResult = BACK) goto Dlg_SdShowInfoList;  
    if (szSerial != checkString)  then       
        MessageBox( "错误!", SEVERE);  
       goto Dlg_SdRegisterUserEx;      
    endif;   
ListDestroy( list );
if (nResult = BACK) goto Dlg_SdLicense;


3.选择安装路径(包括判断磁盘容量)



Dlg_SdAskDestPath:
    szTitle = "";
    szMsg   = "";
    svTemp = szDir;
    nResult = SdAskDestPath( szTitle, szMsg, szDir, 0 );
    if ( svTemp != szDir) then 
  szDir = szDir^@COMPANY_NAME ^@PRODUCT_NAME;
 endif;
 TARGETDIR = szDir;
 GetDisk (szDir, svDrive);
 lFreeSpace = GetDiskSpace (svDrive);
 if (lFreeSpace < 209715200) then 
 MessageBox("警告:安装路径所在的磁盘空间不足200M!请重新选择!",SEVERE);
 goto Dlg_SdAskDestPath;
 endif;
    if (nResult = BACK) goto Dlg_SdRegisterUserEx;


4.安装类型对话框



Dlg_SetupType:          
    szTitle    = "xx系统";
    szMsg      = "";
    nResult = SetupType ( szTitle , szMsg , "" , nSetupType , 0 );
    if (nResult = BACK) then
        //goto Dlg_SdAskDestPath;
        goto Dlg_SdRegisterUserEx
    else
        nSetupType = nResult;
        if (nSetupType != CUSTOM) then
        szTargetPath = TARGETDIR;
        nvSize = 0;
        ComponentCompareSizeRequired(MEDIA,szTargetPath,nvSize);
        if (nvSize != 0) then     
                MessageBox( szSdStr_NotEnoughSpace, WARNING );
            goto Dlg_SetupType;
            endif;
        endif;  
    endif;


1.复制文件,并且显示用户的配置信息,显示文件复制进度条


Dlg_ObjDialogs:
    nResult = ShowObjWizardPages(nResult);
    if (nResult = BACK) goto Dlg_SdComponentTree;


Dlg_SdStartCopy:    
    szTitle = "xx系统";  
    szMsg   = "安装信息准备完毕,并且获得安装权限,下一步将进行文件拷贝。";
    listStartCopy = ListCreate( STRINGLIST ); 


    ListAddString(listStartCopy,"客户信息:",AFTER);
 ListAddString(listStartCopy,"用户名:" + szName,AFTER);
 ListAddString(listStartCopy,"用户单位:" + szCompany,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; 

    nResult = SdStartCopy( szTitle, szMsg, listStartCopy ); 
    ListDestroy(listStartCopy);       
    if (nResult = BACK) goto Dlg_ObjDialogs;   

    SetStatusWindow(0, "");
    Enable(STATUSEX);
    StatusUpdate(ON, 100); 


    return 0;
end;



配置MYSQL服务器


修改my.ini文件



[mysqld]
# 设置mysql的安装目录
basedir=$MYSQL_HOME
# 设置mysql数据库的数据的存放目录,必须是data,或者是//xxx/data
datadir=$MYSQL_HOME/data
# 设置mysql服务器的字符集
default-character-set=utf8
 
[client]
# 设置mysql客户端的字符集
default-character-set=gbk


安装MYSQL服务



LaunchAppAndWait(TARGETDIR+"//MYSQL//bin//mysqld.exe","--install MySQL --defaults-file=:/Dev/mysql-5.0.45/my.ini",WAIT);


启动MYSQL服务



LaunchAppAndWait ("net","start mysql",WAIT );


配置JAVA和TOMCAT环境变量,并且启动TOMCAT

catalina_home=TARGETDIR + "//apache-tomcat-5.5.12";  
   java_home=TARGETDIR + "//jdk1.5.0_05";     
   szKey="Environment";  
   RegDBSetDefaultRoot(HKEY_CURRENT_USER);     
   RegDBSetKeyValueEx(szKey,"JAVA_HOME",REGDB_STRING,java_home,-1);  
   RegDBSetKeyValueEx(szKey,"CATALINA_HOME",REGDB_STRING,catalina_home,-1);  
   szEnv = "Environment";  
   pEnv = &szEnv;  
   SendMessage (0xffff, 0x001A , 0, pEnv );


启动TOMCAT



LaunchAppAndWait(TARGETDIR+"//apache-tomcat-5.5.12//bin//startup.bat","",WAIT);


创建开始菜单快捷方式,创建桌面快捷方式,创建URL快捷方式,打开浏览器

szFolderName = FOLDER_STARTMENU;
  CreateProgramFolder(szFolderName);   
  szCommandLine = TARGETDIR ^ "apache-tomcat-5.5.12//bin//startup.bat";
  szCommandLine = "/"" + szCommandLine + "/"";
  szFolderName = "xx//xx.exe";
  AddFolderIcon(FOLDER_PROGRAMS, szFolderName, szCommandLine, TARGETDIR, "", 0, "", REPLACE);


szCommandLine = TARGETDIR ^ "apache-tomcat-5.5.12//bin//startup.bat";
  szCommandLine = "/"" + szCommandLine + "/"";
  szFolderName = "xx";
  if (AddFolderIcon (FOLDER_DESKTOP, szFolderName, szCommandLine, TARGETDIR,
  "", 0, "", REPLACE) < 0) then
  MessageBox ("安装程序在进行桌面上添加快捷方式失败,稍侯请自己添加!.", SEVERE);
  endif;


OpenFileMode (FILE_MODE_APPEND);
   if(CreateFile (nvFileHandle, FOLDER_DESKTOP, "xx.url")>=0) then;
    WriteLine (nvFileHandle, "[InternetShortcut]");
    WriteLine (nvFileHandle, "URL=http://LocalHost:8080/index.jsp");
    WriteLine (nvFileHandle, "IconFile=" + TARGETDIR ^ "images//icon.ico");
    WriteLine (nvFileHandle, "IconIndex=0");
    CloseFile (nvFileHandle);
   else
     MessageBox ("桌面快捷方式创建失败!",SEVERE);
   endif; 


szCmdLine = "http://LocalHost:8080/index.jsp";
   if (LaunchApp(PROGRAMFILES ^"Internet Explorer"^"IEXPLORE.EXE", szCmdLine) < 0) then
   MessageBox ("不能打开浏览器.",SEVERE);
   endif;


卸载应用程序:关闭TOMCAT,关闭MYSQL。删除注册表,删除环境变量,删除快捷方式。

LaunchAppAndWait("net","stop mysql",WAIT);
    LaunchAppAndWait(TARGETDIR+"//apache-tomcat-5.5.12//bin//shutdown.bat","",WAIT);
    LaunchAppAndWait(TARGETDIR+"//MYSQL//bin//mysqld.exe","--remove MySQL",WAIT);  
   
    RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);   
    szSubKey = "CATALINA_HOME";  
    szValue = TARGETDIR + "//apache-tomcat-5.5.12";    
    RegDBDeleteValue(szSubKey,szValue);
    szSubKey = "JAVA_HOME";  
    szValue = TARGETDIR + "//jdk1.5.0_05";    
    RegDBDeleteValue(szSubKey,szValue);
    
    DeleteFolderIcon (FOLDER_PROGRAMS,"xx");
    DeleteFolderIcon (FOLDER_PROGRAMS,"xx");
    DeleteFolderIcon (FOLDER_DESKTOP,"xx") ;


该文章在 2013/1/17 2:42:06 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved