zoukankan      html  css  js  c++  java
  • 使用Installshield制作asp,asp.net应用的安装程序

    在使用asp,asp.net编写Web应用时,最大的烦恼莫过于程序的分发的部署,由于面向的最终用户,所以程序的安装的过程必须要简单,方便和快捷。
    下面提供了Installshield的脚本,改脚本功能包括:
    1,检测IIS是否安装
    2,检测IE版本
    3,自动建立SQL数据库
    4,自动建立IIS虚拟目录
    5,能读取注册表和INI文件
    6,注册.dll组件
      应用程序开发环境:Windows2000+VS 2003+SQL2000
      制作安装程序环境:Installshield7.0(其实6.22以上都可以,只是中文语言包太难找,所以就用7.0了,另7.0界面也好看多了,XP风格)

    ////////////////////////////////////////////////////////////////////////////////
    //                                                                           
    //  File Name: Setup.rul                                                  
    //                                                                           
    //  Description: InstallShield script                                       
    //                                                                           
    //  Comments: This script was generated based on the selections you made in
    //            the Project Wizard.  Refer to the help topic entitled "Modify     
    //            the script that the Project Wizard generates" for information
    //    on possible next steps.
    //
    ////////////////////////////////////////////////////////////////////////////////


    // Include header files
       
    #include "ifx.h"
       
    ////////////////////// string defines ////////////////////////////
                                number xx1,xx2;
    //////////////////// installation declarations ///////////////////

    // ----- DLL function prototypes -----


        // your DLL function prototypes


    // ---- script function prototypes -----


        // your script function prototypes
           prototype CreateDataBase(STRING,STRING,STRING);//附加数据库
     prototype CheckIIS(); //检测是否安装了iis
      prototype Checkie(); //检测ie版本
        prototype Checkmdac(); //检测mdac版本
          prototype regcom(); //注册jamil组件
         // prototype deliis(STRING);//删除虚拟目录
    prototype Writeini(STRING,STRING,STRING);  
    prototype DelDataBase(STRING,STRING,STRING);
        // your global variables

    //////////////////////////////////////////////////////////////////////////////
    //                                                                          
    //  FUNCTION:   OnFirstUIBefore                                           
    //                                                                          
    //  EVENT:      FirstUIBefore event is sent when installation is run for the first
    //              time on given machine. In the handler installation usually displays
    //              UI allowing end user to specify installation parameters. After this
    //              function returns, FeatureTransferData is called to perform file
    //              transfer.
    //                                                                          
    ///////////////////////////////////////////////////////////////////////////////
    function OnFirstUIBefore()
     //   number  nResult,nSetupType;
     //   string  szTitle, szMsg;
     //   string  szLicenseFile, szQuestion;
      //  string  szName, szCompany;
      //  string  szTargetPath;
      //  string  szDir;
      //  string  szFeatures, szTargetdir;
       // number  nLevel;
       // LIST    listStartCopy;
       //number  nvSize;
        //number  nUser; 
       
         number  nResult,nSetupType;
        string  szTitle, szMsg;
        string  szLicenseFile, szQuestion;
        string  szName, szCompany, szSerial;
        string  szFeatures, szTargetdir;
        number  nLevel;
        LIST    listStartCopy,list;
        number  nvSize;
        number  nUser;
       
        number  nOpt,svEdit1,svEdit2;
        STRING szServerIP,szServerPort,szServerIPDefault,szServerPortDefault;
        STRING szSQLsvr,szSQLusr,szSQLpwd,svSQLsvr,svSQLusr,svSQLpwd;
        STRING svName, svCompany, svSerial;
        STRING szFile,szTargetPath,szDir,szfolder;
        STRING szField1,szField2;
        STRING szDefault,svResult;
        string  szComponents;
        OBJECT piisObj; 
         STRING    szTitle1; 
         STRING szMsg1,szMsg2;
        STRING   szMsg11, szMsg12, szOpt1, szOpt2;
        BOOL     bvOpt1, bvOpt2;
    begin 
        // TO DO: if you want to enable background, window title, and caption bar title                                                                    
         //SetTitle( @PRODUCT_NAME, 24, WHITE );                                       
        // SetTitle( @PRODUCT_NAME, 0, BACKGROUNDCAPTION );                    
        // Enable( FULLWINDOWMODE );        
        // Enable( BACKGROUND );        
        // SetColor(BACKGROUND,RGB (0, 128, 128));       
        //SetFont (FONT_TITLE, STYLE_NORMAL, "宋体");
        SHELL_OBJECT_FOLDER = @PRODUCT_NAME;
       
        nSetupType = TYPICAL; 
        szDir = INSTALLDIR;
        szName    = "";
        szCompany = "";

    Dlg_Start:
        // beginning of dialogs label

    Dlg_SdWelcome:
        szTitle = "";
        szMsg   = "";
        nResult = SdWelcome( szTitle, szMsg );
        if (nResult = BACK) goto Dlg_Start;

    Dlg_SdLicense:
        szLicenseFile = SUPPORTDIR ^ "license.txt";
        szTitle    = "";
        szMsg      = "";
        szQuestion = "";
        nResult    = SdLicense( szTitle, szMsg, szQuestion, szLicenseFile );
        if (nResult = BACK) goto Dlg_SdWelcome;

    Dlg_SdCustomerInformation:
        szMsg   = "";
        szTitle = ""; 
        nResult = SdCustomerInformation( szTitle, szName, szCompany, nUser );
        if (nResult = BACK) goto Dlg_SdLicense;

    Dlg_SdAskDestPath:
        szTitle = "";
        szMsg   = "";
        nResult = SdAskDestPath( szTitle, szMsg, szDir, 0 );
        INSTALLDIR = szDir;
        if (nResult = BACK) goto Dlg_SdCustomerInformation;
         Dlg_SelMode ://设置数据库服务器 对话框
    szTitle = "是否安装.net框架";
    szMsg = "是否要安装.net框架,如果已经安装了.net框架则不需要安装。";
    szField1="我要安装.net框架。";
    szField2="我已经安装了,不需要再安装。";
    svEdit1=TRUE;
    svEdit2=FALSE;
    SetDialogTitle(DLG_ASK_TEXT,szTitle);
    //DialogSetInfo ( DLG_INFO_CHECKSELECTION, "", 1);
    nOpt = EXCLUSIVE ;
    nResult = AskOptions (nOpt,szMsg,szField1,svEdit1,szField2,svEdit2);
    if (nResult = BACK) goto Dlg_SdAskDestPath;  
    if (svEdit1=TRUE)then
    if  Checkmdac() then//如果已经安装则跳过
        if(LaunchAppAndWait (SUPPORTDIR^"mdac_typ.exe","",WAIT)<0) then
            MessageBox ("安装微软数据访问组件是发生以外,请重新安装。",SEVERE);
        goto  Dlg_SelMode;
        endif;
        endif;
       if(LaunchAppAndWait ( SUPPORTDIR ^"dotnetfx.exe " , "" ,WAIT)<0) then
        MessageBox ("安装.net框架时发生意外,请重新安装。",SEVERE);
        goto  Dlg_SelMode;
        endif;
        endif;
         
    Dlg_SetupType:  
        szTitle    = "";
        szMsg      = "";
        nResult = SetupType ( szTitle , szMsg , "" , nSetupType , 0 );
        if (nResult = BACK) then
            goto Dlg_SdAskDestPath;
        else
            nSetupType = nResult;
            if (nSetupType != CUSTOM) then
            szTargetPath = INSTALLDIR;
            nvSize = 0;
            FeatureCompareSizeRequired(MEDIA,szTargetPath,nvSize);
            if (nvSize != 0) then     
                    MessageBox( szSdStr_NotEnoughSpace, WARNING );
                goto Dlg_SetupType;
                endif;
            endif;  
        endif;

    Dlg_SdFeatureTree:
        if ((nResult = BACK) && (nSetupType != CUSTOM)) goto Dlg_SetupType;
        szTitle    = "";
        szMsg      = "";
        szTargetdir = INSTALLDIR;
        szFeatures = "";
        nLevel = 2;
        if (nSetupType = CUSTOM) then
          nResult = SdFeatureTree(szTitle, szMsg, szTargetdir, szFeatures, nLevel);
          if (nResult = BACK) goto Dlg_SetupType; 
        endif;
       
        Dlg_AskText ://设置数据库服务器 对话框
    szTitle = "设置IIS信息服务及数据库服务器";
    szMsg = "现在开始设置IIS系统";
    szQuestion=" 请输入本服务器的主机名或IP地址,安装程序将按照您提供的资料设置IIS信息服务。如果您没有填写,安装程序将自动跳过站点的创建!";
    szServerIP="地址:";
    szServerPort="端口:";
    szServerIPDefault="192.168.0.1";
    szServerPortDefault="80";
    SetDialogTitle(DLG_ASK_TEXT,szTitle);
    nResult=SdShowDlgEdit2 (szTitle, szQuestion,szServerIP,szServerPort,szServerIPDefault,szServerPortDefault);
    if (nResult = BACK) goto Dlg_SetupType; 
     
     Dlg_AskSQL ://设置数据库服务器 对话框
    szTitle = "设置数据库";
    szMsg = "现在开始设置数据库系统";
    szQuestion=" 请输入数据库服务器的用户名和密码,安装程序将按照您上步提供的IP地址和下面的用户名和密码创建和优化数据库系统。如果您提供的用户名和密码是错误的,安装程序将自动跳过数据的设置!";
    //szSQLsvr="主机名:";
    szSQLusr="用户名:";
    szSQLpwd="密码:";
    //svSQLsvr="localhost";
    svSQLusr="sa";
    svSQLpwd="";
    SetDialogTitle(DLG_ASK_TEXT,szTitle);
    nResult=SdShowDlgEdit2 (szTitle, szQuestion,szSQLusr,szSQLpwd,svSQLusr,svSQLpwd);
    if (nResult = BACK) goto Dlg_AskText;
       
       
       
    Dlg_SdStartCopy:
        szTitle = "";
        szMsg   = ""; 
        szTitle1 = "安装失败";
        szMsg11  = "由于安装时发生意外导致安装失败";
        szMsg12  = "点击完成退出安装。";
        szOpt1  = "";
        szOpt2  ="";
    listStartCopy = ListCreate( STRINGLIST );
    ListAddString(listStartCopy,"用户名:"+szName,AFTER);
    ListAddString(listStartCopy,"公司名称:"+szCompany,AFTER);
    ListAddString(listStartCopy,"目标目录:"+szDir,AFTER);
    if (svEdit1=TRUE) then
    ListAddString(listStartCopy,"IP地址:"+szServerIPDefault,AFTER);
    ListAddString(listStartCopy,"端口号:"+szServerPortDefault,AFTER);
    endif;
    ListAddString(listStartCopy,"请确认您填写的信息,按下一步开始复制文件",AFTER);  
       
       // listStartCopy = ListCreate( STRINGLIST );
        //The following is an example of how to add a string(szName) to a list(listStartCopy).
        //eg. ListAddString(listStartCopy,szName,AFTER);
        nResult = SdStartCopy( szTitle, szMsg, listStartCopy ); 
        ListDestroy(listStartCopy);
        if (nResult = BACK) goto Dlg_SdFeatureTree;

        Enable(STATUSEX);
        if CheckIIS() then
         if(xx1=2) goto Dlg_AskText;  //判断站点是否建立成功 
          // regcom();//注册组件
            CreateDataBase(szServerIPDefault,svSQLusr,svSQLpwd); // 创建和 优化数据库
              Writeini(szServerIPDefault,svSQLusr,svSQLpwd);//写ini文件
     else
         MessageBox ("你的计算机没有安装IIS!请安装后重试!",SEVERE);
        endif;   
        return 0;
    end;

    ///////////////////////////////////////////////////////////////////////////////
    //
    //  FUNCTION:   OnMaintUIBefore
    //
    //  EVENT:      MaintUIBefore event is sent when end user runs installation that
    //              has already been installed on the machine. Usually this happens
    //              through Add/Remove Programs applet. In the handler, installation
    //              usually displays UI allowing end user to modify existing installation
    //              or uninstall application. After this function returns,
    //              FeatureTransferData is called to perform file transfer.
    //
    ///////////////////////////////////////////////////////////////////////////////
    function OnMaintUIBefore()
        NUMBER nResult, nType;
        STRING szTitle, szMsg, svDir, svResult, szCaption;
        STRING svip,svuser,svpass;
    begin
        // TO DO: if you want to enable background, window title, and caption bar title           
        // SetTitle( @PRODUCT_NAME, 24, WHITE );     
        // SetTitle( @PRODUCT_NAME, 0, BACKGROUNDCAPTION );     
        // SetColor(BACKGROUND,RGB (0, 128, 128));     
        // Enable( FULLWINDOWMODE );      
        // Enable( BACKGROUND );       
     
    Dlg_Start:
        Disable(BACKBUTTON);
        nType = SdWelcomeMaint(szTitle, szMsg, MODIFY);
        Enable(BACKBUTTON);

        if (nType = REMOVEALL) then
            svResult = SdLoadString(IFX_MAINTUI_MSG);
            szCaption = SdLoadString(IFX_ONMAINTUI_CAPTION);
            nResult = SprintfBox(MB_OKCANCEL,szCaption,"%s",svResult);
            if (nResult = IDCANCEL) goto Dlg_Start;
        endif;

        nResult = NEXT;

    Dlg_SdFeatureTree:
        if (nType = MODIFY) then
            szTitle = "";
            szMsg = "";
            nResult = SdFeatureTree(szTitle, szMsg, INSTALLDIR, "", 2);
            if (nResult = BACK) goto Dlg_Start;
        endif;

        switch(nType)
            case REMOVEALL: FeatureRemoveAll();
            case REPAIR:    FeatureReinstall();
        endswitch; 
           GetProfString (SystemFolder^"dbconn.ini", "dbconnection","ip", svip);
            GetProfString (SystemFolder^"dbconn.ini", "dbconnection","db_user", svuser);
            GetProfString (SystemFolder^"dbconn.ini", "dbconnection","db_pass", svpass);
           //svall=svip+","+svuser+","+svpass;
            // SdShowMsg(svall,WAIT);
              // Delay(5);
          DelDataBase(svip,svuser,svpass);
         DeleteFile (INSTALLDIR^"database\\kill.out");
        Enable(STATUSEX);
         
    end;


    //////////////////////////
    // 创建和优化数据库
    //////////////////////////
    function CreateDataBase(svSQLsvr,svSQLusr,svSQLpwd)
    STRING szCmdLine1,szWaitTxt,szdatabase,szdatabase1,path,path1,path3;
    begin   
    path=INSTALLDIR^"database\\fenoffice.mdf";
    path3=INSTALLDIR^"database\\fenoffice_log.ldf";
    szWaitTxt=" 正在创建数据库....";
    SdShowMsg (szWaitTxt, TRUE);
    Delay(2);
    //CopyFile(SUPPORTDIR^"kill.sql",INSTALLDIR^"database\\kill.sql");
     CopyFile(SUPPORTDIR^"fenoffice.mdf",INSTALLDIR^"database\\fenoffice.mdf");
     CopyFile(SUPPORTDIR^"fenoffice_log.ldf",INSTALLDIR^"database\\fenoffice_log.ldf");
    //szCmdLine="hello";
    szdatabase = "/U "+svSQLusr+" /P "+svSQLpwd+" /S "+svSQLsvr+" /Q \"exec sp_attach_db N'fenoffice' , N'"+path+"',N'"+path3+"'\"";
    //SdShowMsg(szdatabase,WAIT);
    //Delay(3);
    if (LaunchAppAndWait("osql.exe", szdatabase,WAIT)<0) then;
    MessageBox ("数据库创建失败!请确您的系统中已安装 Microsoft SQL Server 2000.\n如仍无法解决,请联系系统供应商!",SEVERE);
    endif;    
     path1=INSTALLDIR^"database";
    //szdatabase1=" -S "+svSQLusr+" -U "+svSQLusr+"  -P "+svSQLpwd+" -d master -n -i "+path1+"\\kill.sql -o "+path1+"\\kill.out";
    //SdShowMsg(szdatabase2,WAIT);
    //Delay(3);
    if (LaunchAppAndWait("osql.exe", szdatabase1,WAIT)<0) then
    MessageBox ("配置数据库失败!请尝试手动配置!",SEVERE);
    endif;

    SdShowMsg (szWaitTxt, FALSE);
    return 0;
    end;       


        //
        //
        //检测是否安装了iis
        //
        //
     function CheckIIS()
     NUMBER nvType, nvSize;
     STRING svvalue;
    begin
     RegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );
     if (RegDBKeyExist ("System\\CurrentControlSet\\Services\\IISADMIN" ) = 1) then
      return (1);
     else
      return (0);
     endif;
    end;      
         

         //
        //
        //检测ie的版本
        //
        //
     function Checkie()
     NUMBER nvType, nvSize;
     STRING svvalue,szKey,szName;
    begin    
    szKey="SOFTWARE\\Microsoft\\Internet Explorer";  
    szName="version";
     RegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );
     RegDBGetKeyValueEx(szKey, szName, nvType, svvalue, nvSize );
         if(svvalue="6.0.2600.0000")then
      return (0);
     else
      return (1);
     endif;
    end;      

        
         //
         //检测mdac的版本
         //
         //
         function Checkmdac()
     NUMBER nvType, nvSize;
     STRING svvalue,szKey,szName;
    begin    
    szKey="SOFTWARE\\Microsoft\\DataAccess";  
    szName="version";
     RegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );
     RegDBGetKeyValueEx(szKey, szName, nvType, svvalue, nvSize );
         if(svvalue="2.71.9030.9") then
      return (0);
     else
      return (1);
     endif;
    end; 


    //
    //
    //Write dbconn.ini file
    //
    //
    function Writeini(svSQLsvr,svSQLusr,svSQLpwd)  
        string svDate,iniFile,svResult,szInfo,szWaitTxt;
         NUMBER   nvResult;
    begin
     //szWaitTxt="正在配置系统文件,请稍侯....";

      iniFile =SUPPORTDIR^"dbconn.ini";
       //SdShowMsg (szWaitTxt, TRUE);
        // Delay(2);
      if (GetSystemInfo (DATE, nvResult, svResult) < 0) then

          szInfo = "不能得到系统时间";

       else
         svDate=svResult+" ";
       endif;
       
        if (GetSystemInfo (TIME, nvResult, svResult) < 0) then

          szInfo = "不能得到系统时间";

       else
           svDate=svDate+svResult;
       endif;

     if (WriteProfString(iniFile,"dbconnection","server", svSQLsvr) <0) then
      MessageBox("dbconn.ini错误,系统将无法运行!", SEVERE);
      endif; 
     
       if (WriteProfString(iniFile,"dbconnection","ip", svSQLsvr) <0) then
      MessageBox("dbconn.ini错误,系统将无法运行!", SEVERE);
      endif;   
     
       if (WriteProfString(iniFile,"dbconnection","db_user",svSQLusr) <0) then
      MessageBox("dbconn.ini错误,系统将无法运行!", SEVERE);
      endif;
     
        if (WriteProfString(iniFile,"dbconnection","db_pass",svSQLpwd) <0) then
      MessageBox("dbconn.ini错误,系统将无法运行!", SEVERE);
      endif;
     
       if (WriteProfString(iniFile,"dbconnection","database", "fenoffice") <0) then
      MessageBox("dbconn.ini错误,系统将无法运行!", SEVERE);
      endif; 
           
         if (WriteProfString(iniFile,"webwork","webworkstart", svDate) <0) then
      MessageBox("dbconn.ini错误,系统将无法运行!", SEVERE);
      endif; 
       if (WriteProfString(iniFile,"webwork","webworkpath", INSTALLDIR) <0) then
      MessageBox("dbconn.ini错误,系统将无法运行!", SEVERE);
      endif; 
          CopyFile(SUPPORTDIR^"dbconn.ini",SystemFolder^"dbconn.ini");
    end;
     
     
     //
     //注册组件
     //       
     function regcom()
    string szLine,szWaitTxt;
    begin
    szLine=SystemFolder^"jmail.dll";  
     szWaitTxt=" 正在注册组件....";
    SdShowMsg (szWaitTxt, TRUE);
    Delay(2);
     CopyFile(SUPPORTDIR^"jmail.dll",SystemFolder^"jmail.dll");
     if (LaunchAppAndWait("regsvr32.exe",szLine,WAIT)<0) then
          MessageBox ("注册组件失败,请尝试手动注册"+szLine,SEVERE);
         // else      
           // MessageBox ("注册组件成功!"+szLine,INFORMATION);
           //SdShowMsg (szLine, TRUE);
        // Delay(3);   
         endif;
    end;

    //function deliis(VirtualFolder)
     //STRING szCmdLine;
    //begin
    //删除已经存在的虚拟目录
     // szCmdLine = SUPPORTDIR ^"adsutil.vbs delete w3svc/1/root/"^VirtualFolder;  
     // if(LaunchAppAndWait("CScript.exe", szCmdLine, WAIT)<0) then
     // MessageBox ("设置iis信息服务失败,请尝试手动配置!",INFORMATION);
     // endif;
    //end;


    //
    //删除数据库
    //
    //
    function DelDataBase(server,user,pass)
      STRING szWaitTxt,szdatabase1,szdatabase2,szdatabase3,path1;
    begin

       
    szWaitTxt=" 正在删除数据库....";
     
    szdatabase2 = "/U "+user+" /P "+pass+" /Q \" exec killspid N'fenoffice'";
    LaunchAppAndWait("osql.exe", szdatabase2,WAIT);
    //SdShowMsg(szdatabase2,WAIT);
    //Delay(3);
    szdatabase3 = "/U "+user+" /P "+pass+" /Q \" exec sp_dbremove N'fenoffice'" ;
    LaunchAppAndWait("osql.exe", szdatabase3,WAIT);
    //SdShowMsg(szdatabase3,WAIT);
    //Delay(3);
    SdShowMsg (szWaitTxt, FALSE);
    return 0;
    end;


    http://blog.csdn.net/donkeyzheng/archive/2005/12/30/566301.aspx
  • 相关阅读:
    关于typedef在struct使用上的一些问题
    软件工程--趣盒--第四次团队作业--软件实现与测试
    趣盒——快速入门手册
    软件工程趣盒软件设计
    软件工程项目需求分析
    在VS2017下配置OpenGL
    破阵子青铜团队介绍以及项目背景介绍
    海客谈瀛洲,烟涛微茫信难求——微信
    第一次作业:扑通扑通 我的IT
    5.线性回归算法
  • 原文地址:https://www.cnblogs.com/draeag/p/801068.html
Copyright © 2011-2022 走看看