用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制作WEB程序安装包的更多相关文章
- Inno Setup制作应用程序安装包
我最近写了一个MFC应用程序,想发给其他的小伙伴玩一玩,直接发了个exe文件过去,结果发现小伙伴那边打不开.原来这个exe文件虽然是MFC静态编译的,但是还依赖了其他几个.dll文件,需要把这几个dl ...
- 用inno Setup制作web项目安装包
http://www.cnblogs.com/xionghui/archive/2012/03/22/2411207.html 用inno Setup制作安装包 新建一个文件夹exambody,放ap ...
- [Azure DevOps] 使用 Inno Setup 制作桌面软件安装包
1. 桌面应用程序的 CI/CD 桌面应用程序的 CI/CD 过程和网站有一些不同,毕竟桌面应用程序的"部署"只是将安装包分发到目标位置,连应用商店都不用上,根据公司的管理流程可以 ...
- 用inno Setup做应用程序安装包的示例脚本(.iss文件)(
用innoSetup做应用程序安装包的示例脚本(.iss文件),具体要看innoSetup附带的文档,好象是pascal语言写的脚本. 示例1(应用程序.exe,客户端安装): ;{089D6802- ...
- setup factory 9制作VB程序安装包
setup factory 使用起来很简单你可以如下:1.你把你刚编译出来的exe和相关的资源文件复制到某一空目录下.把exe文件添加到setup factory里之后,在列表里右键,属性里面可以设置 ...
- rhel7 rpmbuild 制作二进制程序安装包(.rpm) 简单示例
下载rpm-build: # yum install rpm-build 如果上述方式无法安装(没配置网络源,虚拟机下是安装媒介源) 可以用下列方式下载后再安装(实践结果可能版本问题引起的缺少太多的* ...
- INNO setup 制作安装包
1.获取SQLserver安装路径vardbpath:string;rtn:boolean;rtn := RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWA ...
- 20 Inno Setup制作安装包的几个问题
系统开发好之后,通常需要制作成安装包,才能卖给用户.利用Inno Setup的向导可以制作简单的安装包,但是如果要做个好的安装包的话可能会遇到一些麻烦,今日终于抽空解决了,Inno Setup打包的一 ...
- 用Inno setup制作以管理员权限启动的安装包
inno setup制作的安装包,默认是不需要管理员权限启动的.我们制作安装包,往往需要做一些设置工作,这些设置工作可能用到管理员权限.使用Resource Hacker修改inno setup资源, ...
随机推荐
- 【Nginx】显示器port管理
监听port属于server虚拟主机,由server{}块内的listen配置项决定. 也就是说,在server{}块配置项内定义了该虚拟主机所要监听的port. 在处理配置文件http块内main级 ...
- [Elasticsearch] 部分匹配 (一) - 前缀查询
部分匹配(Partial Matching) 敏锐的读者可能已经发现到眼下为止,介绍的查询都是在整个词条层面进行操作的. 匹配的最小单元必须是一个词条.你仅仅能找到存在于倒排索引(Inverted I ...
- 4.mysql数据库创建,表中创建模具模板脚本,mysql_SQL99标准连接查询(恩,外部连接,全外连接,交叉连接)
mysql数据库创建,表创建模等模板脚本 -- 用root用户登录系统,运行脚本 -- 创建数据库 create database mydb61 character set utf8 ; -- ...
- 编写可维护的Javascript读书笔记
写在前面:之前硬着头皮参加了java方面的编程规范培训,收货良多,工作半年有余的时候,总算感觉到一丝丝Coding之美,以及造轮子的乐趣,以至于后面开发新功能的时候,在Coding style方面花了 ...
- Android 最热的高速发展框架XUtils
近期搜了一些框架供刚開始学习的人学习,比較了一下XUtils是眼下git上比較活跃 功能比較完好的一个框架,是基于afinal开发的,比afinal稳定性提高了不少.以下是介绍: 鉴于大家的热情,我又 ...
- Robot Framework自动化测试(一)---第一个脚本(转)
最近工具中用Robot Framework框架来做自动化,所以,花时间学习了一下. =======所需环境=================== Python: https://www.python. ...
- HDU ACM 1007 Quoit Design 分而治之的方法,最近点
意甲冠军:给n坐标点.半一对点之间的距离所需的距离最近. 分析:分而治之的方法,最近点. #include<iostream> #include<algorithm> #inc ...
- 读取xml文件"分析 EntityName 时出错"的解决方案
在涉及到xml与xslt编程的过程中,经常会碰到"分析 EntityName 时出错"的提示,这个不是程序错误,是因为xml文件中使用了一些特殊符号导致的. XML 节点中不 ...
- Ubuntu通过使用PyCharm 进行调试 Odoo 8.0 可能出现的问题
实现步骤,请移步http://shine-it.net/index.php?topic=16603.0 要么 http://www.mindissoftware.com/2014/09/11/Run- ...
- POJ 3233 Matrix Power Series(矩阵高速功率+二分法)
职务地址:POJ 3233 题目大意:给定矩阵A,求A + A^2 + A^3 + - + A^k的结果(两个矩阵相加就是相应位置分别相加).输出的数据mod m. k<=10^9. 这 ...