用Inno Setup制作WEB程序安装包
>
最近做了一个WEB程序的安装包,我把制作的过程做个介绍,贴出源码给大家做个参考
看看inno 的脚本
1
[Setup]
2
AppCopyright=test
3
AppName=test
4
AppVerName=test v2.0
5
SolidCompression=true
6
OutputDir=Output\
7
OutputBaseFilename=test_setup
8
DefaultDirName={pf}\Lms
9
DefaultGroupName=Lms
10
;安装程序的基本信息
11
[_ISTool]
12
UseAbsolutePaths=false
13![]()
14
[UninstallDelete]
15
Type: files; Name: {app}\init_test.log
16
Type: dirifempty; Name: {app}\database
17
;需要提示卸载程序额外删除的目录
18
[Run]
19
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
20
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
21
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
22
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
23
Filename: {tmp}\init_test.exe; Parameters: """{app}"" 2.0"; Description: Configure SQLServer; StatusMsg: Configuring Database
; Flags: postinstall skipifdoesntexist
24
;uncomment this line to use for dotnet 1.1
25
;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
26
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
27
;安装过程需要运行的程序,SetACL.EXE是一个第三方组件使用方法大家可以google一下,init_test.exe为附加数据库和数据还有设置asp.net版本的程序
28![]()
29
[Dirs]
30
Name: {app}\database
31
Name: {app}\course
32
;产生目录
33
[Types]
34
Name: Custom; Description: Custom installation; Flags: iscustom
35![]()
36
[Files]
37
Source: 3rdParty\SetACL.exe; DestDir: {tmp}; flags: deleteafterinstall
38
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
39
Source: test_table.sql; DestDir: {tmp}; Flags: deleteafterinstall
40
Source: test_Data.sql; DestDir: {tmp}; Flags: deleteafterinstall
41
Source: init_test.exe; DestDir: {tmp}; flags: deleteafterinstall
42
;需要随安装包一起打包的文件
43
[Code]
44
const
45
VDirName = 'test';
46
Vwebctrl = 'webctrl_client';
47
IISServerNumber = '1';
48
49
function SafeCreateOleObject(ProgId:String;ExceptionMsg:String):Variant;
50
var
51
retobj:Variant;
52
begin
53
try
54
retobj := CreateOleObject(ProgId);
55
except
56
RaiseException(ExceptionMsg+''#13#13'(Error ''' + GetExceptionMessage + ''' occurred)');
57
end;
58
Result:=retobj;
59
end;
60![]()
61
{
62
create virtual directory, pointing to installation directory
63
}
64![]()
65
procedure SetupIIS;
66
var
67
IIS, WebSite, WebServer, WebRoot, VDir: Variant;
68
begin
69
{ Create the main IIS COM Automation object }
70
IIS:=SafeCreateOleObject('IISNamespace','Please install Microsoft IIS first.');
71
{ Connect to the IIS server }
72![]()
73
WebSite := IIS.GetObject('IIsWebService', GetComputerNameString() + '/w3svc');
74
WebServer := WebSite.GetObject('IIsWebServer', IISServerNumber);
75
WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');
76![]()
77
{ (Re)create a virtual dir }
78![]()
79
try
80
WebRoot.Delete('IIsWebVirtualDir', VDirName);
81
except
82
end;
83
try
84
WebRoot.Delete('IIsWebVirtualDir', Vwebctrl);
85
except
86
end;
87![]()
88
If DirExists(ExpandConstant('{app}')) then
89
begin
90
VDir := WebRoot.Create('IIsWebVirtualDir', VDirName);
91
VDir.AccessRead := True;
92
VDir.AccessFlags:=529;
93
VDir.AppFriendlyName := 'LMS Website';
94
VDir.Path := ExpandConstant('{app}\');
95
VDir.EnableDirBrowsing:=False;
96
VDir.EnableDefaultDoc:=True;
97
VDir.DefaultDoc :='Default.aspx';
98
VDir.AppCreate(True);
99
VDir.SetInfo();
100
end;
101![]()
102
If DirExists(ExpandConstant('{app}\IEWebControl\'+Vwebctrl)) then
103
begin
104
VDir := WebRoot.Create('IIsWebVirtualDir', Vwebctrl);
105
VDir.AccessRead := True;
106
VDir.AccessFlags:=529;
107
VDir.AppFriendlyName := 'visual web ctral';
108
VDir.Path := ExpandConstant('{app}\IEWebControl\'+Vwebctrl);
109
VDir.EnableDirBrowsing:=False;
110
VDir.EnableDefaultDoc:=True;
111
VDir.DefaultDoc :='default.htm';
112
VDir.AppCreate(True);
113
VDir.SetInfo();
114
end;
115
end;
116
procedure ControlIIS(bState:boolean);
117
var
118
resultcode:integer;
119
param:string;
120
begin
121
if bState then
122
param:='START'
123
else param:='STOP';
124![]()
125
Exec('NET.EXE',param+' "IIS ADMIN"',
126
ExpandConstant('{sys}'),SW_SHOW,ewWaitUntilTerminated,resultcode
127
);
128
end;
129
;在IIS默认站点下添加虚拟目录
130
procedure CurStepChanged(CurStep: TSetupStep);
131
begin
132
case CurStep of
133
ssPostInstall:
134
begin
135
SetupIIS();
136
//ControlIIS(true);
137
end;
138
ssInstall:
139
//ControlIIS(false);
140
else
141
;
142
end;
143
end;

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23


24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

再来看一下init_lms.exe的主要方法:
1
private void CreateDatabase()
2
{
3
string sql = " CREATE DATABASE "
4
+ dbName;
5
6
if (IsLocalInstall())
7
{
8
sql += " ON PRIMARY (NAME = " + dbDataName + ", "
9
+ " FILENAME = '" + getDir("database\\" + dbDataName + ".mdf") + "', "
10
+ " SIZE = 5MB,"
11
+ " FILEGROWTH =1) "
12
+ " LOG ON (NAME =" + dbLogName + ", "
13
+ " FILENAME = '" + getDir("database\\" + dbLogName + ".ldf") + "', "
14
+ " SIZE = 1MB, "
15
+ " FILEGROWTH =1) ";
16
}
17
sql += " COLLATE Chinese_PRC_CI_AS";
18
try
19
{
20
this.Cursor = Cursors.WaitCursor;
21
frmProg.StepText("drop database");
22
if (chkCreateDB.Checked)
23
{
24
try
25
{
26
execSQL("master", "DROP DATABASE " + dbName);
27
writeLog("old database dropped");
28
}
29
catch (Exception)
30
{
31
writeLog("database not found or unable to be dropped");
32
}
33![]()
34
}
35
frmProg.StepText("creating database
");
36
if (chkCreateDB.Checked)
37
{
38
try
39
{
40
execSQL("master", sql);
41
writeLog("DB CREATED:" + sql);
42
}
43
catch (Exception e)
44
{
45
writeLog("DB CREATING ERROR:" + e.Message);
46
}
47
}
48
49
frmProg.StepText("creating tables
");
50
51
if (chkTables.Checked)
52
{
53
writeLog("exec lmsdb_table.sql");
54
dmoExecSQL(sqlb_t.ToString());//dbName, sqlb);
55
}
56
57
frmProg.StepText("initialize base data
");
58
59
if (chkDatas.Checked)
60
{
61
//writeLog(sqlb.ToString());
62
writeLog("exec lmsbasedata.sql");
63
dmoExecSQL(sqlb_d.ToString());//execSQL(dbName, sqlb);
64
}
65
frmProg.StepText("database initialization is done
");
66
}
67
finally
68
{
69
this.Cursor = Cursors.Default;
70
}
71
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35


36

37

38

39

40

41

42

43

44

45

46

47

48

49


50

51

52

53

54

55

56

57


58

59

60

61

62

63

64

65


66

67

68

69

70

71

这个方法主要是创建数据库文件
1
private void setAspNetVersion(string m,string i)
2
{
3
string dotnetdir=addBackSlash(Environment.GetEnvironmentVariable("windir"))+"Microsoft.Net";
4
string[] dirs = Directory.GetDirectories(dotnetdir+"\\Framework\\");
5
foreach (string d in dirs)
6
{
7
int p = d.LastIndexOf("\\v");
8
if (p >= 0)
9
{
10
string v = d.Substring(p + 2);
11
aspver = v;
12
string[] mi = v.Split(new char[] { '.' });
13
if (mi[0].CompareTo(m)==0 && mi[1].CompareTo(i)>=0)
14
{
15
//found the directory
16
string regiis = d + "\\aspnet_regiis.exe";
17
if (File.Exists(regiis)){
18
Process proc=new Process();
19
try{
20
proc.StartInfo.FileName=regiis;
21
proc.StartInfo.Arguments = "-s W3SVC/1/ROOT/Lms";
22
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
23
proc.StartInfo.CreateNoWindow=true;
24
proc.Start();
25
proc.WaitForExit(10000);
26
}catch (Win32Exception e){
27
28
if(e.NativeErrorCode == ERROR_FILE_NOT_FOUND)
29
{
30
Console.WriteLine(e.Message + ". Check the path.");
31
} else if (e.NativeErrorCode == ERROR_ACCESS_DENIED)
32
{
33
Console.WriteLine(e.Message +
34
". You do not have permission to run.");
35
}
36
} //catch
37
}//if file.exists
38
}//if compare version
39
}//if pos>=0
40
}//for each
41![]()
42
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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