首页 > 代码库 > 用Inno Setup制作WEB程序安装包
用Inno Setup制作WEB程序安装包
原文 用Inno Setup制作WEB程序安装包
最近做了一个WEB程序的安装包,我把制作的过程做个介绍,贴出源码给大家做个参考
看看inno 的脚本
[Setup]AppCopyright=testAppName=testAppVerName=test v2.0SolidCompression=trueOutputDir=OutputOutputBaseFilename=test_setupDefaultDirName={pf}\LmsDefaultGroupName=Lms;安装程序的基本信息[_ISTool]UseAbsolutePaths=false[UninstallDelete]Type: files; Name: {app}\init_test.logType: 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 skipifdoesntexistFilename: {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 skipifdoesntexistFilename: {tmp}\SetACL.EXE; Parameters: "-ot file -on ""{app}"" -actn ace -ace ""n:S-1-1-0;s:y;p:change,full"""; Flags: runhidden waituntilterminated skipifdoesntexistFilename: {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 skipifdoesntexistFilename: {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: runhiddenFilename: {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}\databaseName: {app}\course;产生目录[Types]Name: Custom; Description: Custom installation; Flags: iscustom[Files]Source: 3rdParty\SetACL.exe; DestDir: {tmp}; flags: deleteafterinstallSource: test\*; DestDir: {app}; Excludes:*.webinfo,*.vspscc, \obj,Thumbs.db,CVS,*.pdb,*.cs,*.scc,*.bak,*.csproj,*.log,*.Old,*.user,*.lic,*.sln,*.suo,8.rar; Flags: recursesubdirsSource: test_table.sql; DestDir: {tmp}; Flags: deleteafterinstallSource: test_Data.sql; DestDir: {tmp}; Flags: deleteafterinstallSource: 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制作WEB程序安装包
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。