用Inno Setup制作WEB程序安装包

原文 用Inno Setup制作WEB程序安装包

最近做了一个WEB程序的安装包,我把制作的过程做个介绍,贴出源码给大家做个参考

看看inno 的脚本

   
[Setup]

AppCopyright=test

AppName=test

AppVerName=test v2.0

SolidCompression=true

OutputDir=Output\

OutputBaseFilename=test_setup

DefaultDirName={pf}\Lms

DefaultGroupName=Lms

;安装程序的基本信息

[_ISTool]

UseAbsolutePaths=false



[UninstallDelete]

Type: files; Name: {app}\init_test.log

Type: dirifempty; Name: {app}\database

;需要提示卸载程序额外删除的目录

[Run]

Filename: {tmp}\SetACL.EXE; Parameters: "-ot file -on ""{app}"" -actn ace -ace ""n:S-1-5-20;s:y;p:change,full"""; Flags: runhidden waituntilterminated skipifdoesntexist

Filename: {tmp}\SetACL.EXE; Parameters: "-ot file -on ""{app}"" -actn ace -ace ""n:S-1-5-32-545;s:y;p:change,full"""; Flags: runhidden waituntilterminated skipifdoesntexist

Filename: {tmp}\SetACL.EXE; Parameters: "-ot file -on ""{app}"" -actn ace -ace ""n:S-1-1-0;s:y;p:change,full"""; Flags: runhidden waituntilterminated skipifdoesntexist

Filename: {tmp}\SetACL.EXE; Parameters: "-ot file -on ""{app}\database"" -actn ace -ace ""n:S-1-1-0;s:y;p:change,full"""; Flags: runhidden waituntilterminated skipifdoesntexist

Filename: {tmp}\init_test.exe; Parameters: """{app}"" 2.0"; Description: Configure SQLServer; StatusMsg: Configuring Database; Flags: postinstall skipifdoesntexist

;uncomment this line to use for dotnet 1.1

;Filename: {tmp}\SetACL.exe; Parameters: "-ot file -on ""{win}\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files"" -actn ace -ace ""n:S-1-1-0;s:y;p:change,full"""; Flags: runhidden

Filename: {tmp}\SetACL.exe; Parameters: "-ot file -on ""{win}\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files"" -actn ace -ace ""n:S-1-1-0;s:y;p:change,full"""; Flags: runhidden

;安装过程需要运行的程序,SetACL.EXE是一个第三方组件使用方法大家可以google一下,init_test.exe为附加数据库和数据还有设置asp.net版本的程序



[Dirs]

Name: {app}\database

Name: {app}\course

;产生目录

[Types]

Name: Custom; Description: Custom installation; Flags: iscustom



[Files]

Source: 3rdParty\SetACL.exe; DestDir: {tmp}; flags: deleteafterinstall

Source: test\*; DestDir: {app}; Excludes:*.webinfo,*.vspscc, \obj,Thumbs.db,CVS,*.pdb,*.cs,*.scc,*.bak,*.csproj,*.log,*.Old,*.user,*.lic,*.sln,*.suo,8.rar; Flags: recursesubdirs

Source: test_table.sql; DestDir: {tmp}; Flags: deleteafterinstall

Source: test_Data.sql; DestDir: {tmp}; Flags: deleteafterinstall

Source: init_test.exe; DestDir: {tmp}; flags: deleteafterinstall

;需要随安装包一起打包的文件

[Code]

const

  VDirName = 'test';

  Vwebctrl = 'webctrl_client';

  IISServerNumber = '1';

  

function SafeCreateOleObject(ProgId:String;ExceptionMsg:String):Variant;

var

  retobj:Variant;

begin

  try

    retobj := CreateOleObject(ProgId);

  except

    RaiseException(ExceptionMsg+''#13#13'(Error ''' + GetExceptionMessage + ''' occurred)');

  end;

  Result:=retobj;

end;



{

   create virtual directory, pointing to installation directory

}



procedure SetupIIS;

var

  IIS, WebSite, WebServer, WebRoot, VDir: Variant;

begin

  { Create the main IIS COM Automation object }

  IIS:=SafeCreateOleObject('IISNamespace','Please install Microsoft IIS first.');

  { Connect to the IIS server }



  WebSite := IIS.GetObject('IIsWebService', GetComputerNameString() + '/w3svc');

  WebServer := WebSite.GetObject('IIsWebServer', IISServerNumber);

  WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');



  { (Re)create a virtual dir }



  try

    WebRoot.Delete('IIsWebVirtualDir', VDirName);

  except

  end;

  try

    WebRoot.Delete('IIsWebVirtualDir', Vwebctrl);

  except

  end;



  If DirExists(ExpandConstant('{app}')) then

  begin

  VDir := WebRoot.Create('IIsWebVirtualDir', VDirName);

  VDir.AccessRead := True;

  VDir.AccessFlags:=529;

  VDir.AppFriendlyName := 'LMS Website';

  VDir.Path := ExpandConstant('{app}\');

  VDir.EnableDirBrowsing:=False;

  VDir.EnableDefaultDoc:=True;

  VDir.DefaultDoc :='Default.aspx';

  VDir.AppCreate(True);

  VDir.SetInfo();

  end;



  If DirExists(ExpandConstant('{app}\IEWebControl\'+Vwebctrl)) then

  begin

  VDir := WebRoot.Create('IIsWebVirtualDir', Vwebctrl);

  VDir.AccessRead := True;

  VDir.AccessFlags:=529;

  VDir.AppFriendlyName := 'visual web ctral';

  VDir.Path := ExpandConstant('{app}\IEWebControl\'+Vwebctrl);

  VDir.EnableDirBrowsing:=False;

  VDir.EnableDefaultDoc:=True;

  VDir.DefaultDoc :='default.htm';

  VDir.AppCreate(True);

  VDir.SetInfo();

  end;

end;

procedure ControlIIS(bState:boolean);

var

  resultcode:integer;

  param:string;

begin

      if bState then

         param:='START'

      else param:='STOP';



      Exec('NET.EXE',param+' "IIS ADMIN"',

              ExpandConstant('{sys}'),SW_SHOW,ewWaitUntilTerminated,resultcode

          );

end;

;在IIS默认站点下添加虚拟目录

procedure CurStepChanged(CurStep: TSetupStep);

begin

    case CurStep of

      ssPostInstall:

        begin

          SetupIIS();

          //ControlIIS(true);

        end;

      ssInstall:

        //ControlIIS(false);

    else

       ;

    end;

end;

  

再来看一下init_lms.exe的主要方法:

  
 private void CreateDatabase()

        {

            string sql = " CREATE DATABASE "

                               + dbName;

                              

            if (IsLocalInstall())

            {

                sql += " ON PRIMARY (NAME = " + dbDataName + ", "

                       + " FILENAME = '" + getDir("database\\" + dbDataName + ".mdf") + "', "

                               + " SIZE = 5MB,"

                               + " FILEGROWTH =1) "

                               + " LOG ON (NAME =" + dbLogName + ", "

                               + " FILENAME = '" + getDir("database\\" + dbLogName + ".ldf") + "', "

                               + " SIZE = 1MB, "

                               + " FILEGROWTH =1) ";

            }

            sql += " COLLATE Chinese_PRC_CI_AS";

            try

            {

                this.Cursor = Cursors.WaitCursor;

                frmProg.StepText("drop database");

                if (chkCreateDB.Checked)

                {

                    try

                    {

                        execSQL("master", "DROP DATABASE " + dbName);

                        writeLog("old database dropped");

                    }

                    catch (Exception)

                    {

                        writeLog("database not found or unable to be dropped");

                    }

 

                }

                frmProg.StepText("creating database");

                if (chkCreateDB.Checked)

                {                 

                    try

                    {

                        execSQL("master", sql);

                        writeLog("DB CREATED:" + sql);

                    }

                    catch (Exception e)

                    {

                        writeLog("DB CREATING ERROR:" + e.Message);

                    }

                }                

                

                frmProg.StepText("creating tables");

                

                if (chkTables.Checked)

                {

                    writeLog("exec lmsdb_table.sql");

                    dmoExecSQL(sqlb_t.ToString());//dbName, sqlb);

                }

                

                frmProg.StepText("initialize base data");

                

                if (chkDatas.Checked)

                {

                    //writeLog(sqlb.ToString());

                    writeLog("exec lmsbasedata.sql");

                    dmoExecSQL(sqlb_d.ToString());//execSQL(dbName, sqlb);

                }

                frmProg.StepText("database initialization is done");

            }

            finally

            {

                this.Cursor = Cursors.Default;

            }

        }

  


这个方法主要是创建数据库文件

  
private void setAspNetVersion(string m,string i)

         {

             string dotnetdir=addBackSlash(Environment.GetEnvironmentVariable("windir"))+"Microsoft.Net";

             string[] dirs = Directory.GetDirectories(dotnetdir+"\\Framework\\");

             foreach (string d in dirs)

             {

                 int p = d.LastIndexOf("\\v");

                 if (p >= 0)

                 {

                     string v = d.Substring(p + 2);

                     aspver = v;

                     string[] mi = v.Split(new char[] { '.' });

                     if (mi[0].CompareTo(m)==0 && mi[1].CompareTo(i)>=0)

                     {                        

                         //found the directory

                         string regiis = d + "\\aspnet_regiis.exe";

                         if (File.Exists(regiis)){

                             Process proc=new Process();

                             try{

                                 proc.StartInfo.FileName=regiis;

                                 proc.StartInfo.Arguments = "-s W3SVC/1/ROOT/Lms";

                                 proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

                                 proc.StartInfo.CreateNoWindow=true;

                                 proc.Start();

                                 proc.WaitForExit(10000);

                             }catch (Win32Exception e){

                                 

                                  if(e.NativeErrorCode == ERROR_FILE_NOT_FOUND)

                                 {

                                 Console.WriteLine(e.Message + ". Check the path.");

                                  } else if (e.NativeErrorCode == ERROR_ACCESS_DENIED)

                                 {

                                      Console.WriteLine(e.Message + 

                         ". You do not have permission to run.");

                                  }

                             }    //catch                                           

                         }//if file.exists

                     }//if compare version

                 }//if pos>=0

             }//for each

 

         }

  


这个方法主要是利用aspnet_regiis.exe来修改ASP.NET的版本,这个文件在Microsoft.Net目录下

你可能感兴趣的:(Inno Setup)