;参考了许多脚本例子,这个脚本包含了大部分可能用到设置。我的这个安装程序中用到了安装数据库、写INI、定制安装等
; 脚本用 Inno Setup 脚本向导生成。
; 查阅文档获取创建 INNO SETUP 脚本文件详细资料!
[Setup]
AppName=天翔纤维检验管理系统
AppVerName=天翔纤维检验管理系统 V2008
AppPublisher=青岛天翔软件有限公司
AppPublisherURL=http://www.tinsoft.cn
AppSupportURL=http://www.tinsoft.cn
AppUpdatesURL=http://www.tinsoft.cn
DefaultDirName={pf}\天翔纤维检验管理系统
DefaultGroupName=天翔纤维检验管理系统
LicenseFile=D:\安装程序\FiberTest\Lisence.txt
OutputDir=D:\安装程序\FiberTest\Out
OutputBaseFilename=Setup
Compression=lzma
SolidCompression=yes
[Languages]
Name: chi; MessagesFile: compiler:Default.isl
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
[Types]
Name: full; Description: 完全安装
Name: Client; Description: 客户端安装
Name: Server; Description: 服务器端安装
Name: Custom; Description: 定制安装; Flags: iscustom
[Components]
Name: main; Description: 必须组件; Types: full Client Server Custom; Flags: fixed
Name: Server; Description: 服务器组件; Types: full Server
Name: Client; Description: 客户端组件; Types: full Client
Name: Custom; Description: 定制组件; Types: Custom
[Files]
Source: 安装文件\FiberTest.exe; DestDir: {app}; Flags: ignoreversion; Components: Client
Source: 安装文件\Data\*; DestDir: {app}\Data; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Server
Source: 安装文件\Report\*; DestDir: {app}\Report; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Client; Tasks:
Source: 安装文件\UPower.ini; DestDir: {app}; Components: Client
Source: D:\安装程序\FiberTest\安装文件\background.bmp; DestDir: {app}; Flags: ignoreversion; Components: Client
Source: D:\安装程序\FiberTest\安装文件\FiberTest.chm; DestDir: {app}; Flags: ignoreversion; Components: Client
Source: 安装文件\FiberTest.ini; DestDir: {app}; Components: Client
Source: D:\安装程序\FiberTest\安装文件\PY.dll; DestDir: {app}; Flags: ignoreversion; Components: Client
Source: D:\安装程序\FiberTest\安装文件\PY.exe; DestDir: {app}; Flags: ignoreversion; Components: Client
Source: D:\安装程序\FiberTest\安装文件\TinsZip.dll; DestDir: {app}; Flags: ignoreversion; Components: Client
Source: 安装文件\UPower.exe; DestDir: {app}; Flags: ignoreversion; Components: Client
; 注意: 不要在任何共享系统文件中使用“Flags: ignoreversion”
[Icons]
Name: {group}\天翔纤维检验管理系统; Filename: {app}\FiberTest.exe
Name: {group}\使用手册; Filename: {app}\FiberTest.chm; IconFilename: {app}\FiberTest.chm; Tasks: ; Languages:
Name: {group}\{cm:UninstallProgram,天翔纤维检验管理系统}; Filename: {uninstallexe}
Name: {userdesktop}\天翔纤维检验管理系统; Filename: {app}\FiberTest.exe; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\天翔纤维检验管理系统; Filename: {app}\FiberTest.exe; Tasks: quicklaunchicon
[Run]
Filename: {app}\FiberTest.exe; Description: {cm:LaunchProgram,天翔纤维检验管理系统}; Flags: nowait postinstall skipifsilent unchecked; Components: ; Tasks: ; Languages:
Filename: {app}\UPower.exe; Flags: nowait postinstall unchecked skipifsilent
[INI]
Filename: D:\安装程序\FiberTest\安装文件\UPower.ini; Section: UPower; Key: ConnectString; String: "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=FiberTest;Data Source={code:GetServer}"
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: ApplicationTitle; String: 天翔管理系统
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: ConnString; String: "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=FiberTest;Data Source={code:GetServer}"; Components: ; Tasks: ; Languages:
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: SocketServer; String: localhost
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: SocketPort; String: 211
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: ServerName; String: UPower.UserPower
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: BillNOLen; String: 10
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: BillPrintPreview; String: 1
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: BillPrint; String: 0
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: COMConnection; String: 1
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: DatabaseType; String: MSSQL
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: DepartmentID; String: Tins
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: Department; String: Tins
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: WebNav; String:
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 单位名称; String: TINS
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 输入法; String: 中文 (简体) - 微软拼音
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 任务单号自动生成; String: 1
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 打印预览; String: 1
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 条码打印机; String: Microsoft Office Document Image Writer
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 普通打印机; String: EPSON ME 1
Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 打印机选择; String: 0
[Code]
{
关于数据库操作
}
//http://hi.baidu.com/can2786/blog/item/e8c296cefeacdf0692457ef0.html
//说明一下:这块程序的前半部分在INNO SETUP的实例里面就有,而后面如果对数据库进行备份和还原在实例里面没有,在网上也不好找,是本人费了好大劲一句一句试出来的,请大家转摘时注明,以表示对个人劳动的尊重。谢谢!
{--- SQLDMO ---} //关于SQLDMO的相关知识大家可以去网上搜
const
//SQL服务器名称,这个名称在安装SQL时会要求有个服务器名称的输入,所有每台机器上打开SQL服务器时看到的名称都不一样,如我如下图,但这里我们可以用一个通用的名称,就是(local),表示这个服务器是本地的。这样就可以了。
//SQLServerName = '(LOCAL)';
SQLDMOGrowth_MB = 0;
var
UserPage: TInputQueryWizardPage;
UsagePage: TInputOptionWizardPage;
LightMsgPage: TOutputMsgWizardPage;
KeyPage: TInputQueryWizardPage;
ProgressPage: TOutputProgressWizardPage;
DataDirPage: TInputDirWizardPage;
SQLServerName:String;
//数据库的创建与还原事件写完了,但是它不会智能的知道什么时候去执行,所以我们要告诉它什么时候执行。下面是在程序安装完,在结束页面上建立了一个BUTTON按钮,当按下这个按钮时,会执行数据库的事件响应。
{---}
//创建一个button
procedure CreateButton(ALeft, ATop: Integer; ACaption: String; ANotifyEvent: TNotifyEvent);
begin
with TButton.Create(WizardForm) do //button对象的创建
begin
Left := ALeft; //button的位置与宽高
Top := ATop;
Width := WizardForm.CancelButton.Width;
Height := WizardForm.CancelButton.Height;
Caption := ACaption; //button的名称
OnClick := ANotifyEvent;
//这个是给创建的button指定一个父窗口,也就是说让它在哪个页面上边显示出来
Parent := WizardForm.FinishedPage; //这里指定的是窗体的结束页
end;
end;
//这是创建一个按钮按下的事件,这个按钮就是在安装向导中页面中建立的一个“配置数据库”的按钮
procedure SQLDMOButtonOnClick(Sender: TObject);
var
//用到的一些变量
SQLServer, Database, DBFile, LogFile: Variant;
IDColumn, NameColumn, Table,oBackup,oRestore: Variant;
db_path:string;
//这个变量用来保存读取注册表的键值
ResultStr: String;
begin
{ Create the main SQLDMO COM Automation object }
//检查是否已安装SQL
try
SQLServer := CreateOleObject('SQLDMO.SQLServer');
except
RaiseException('您还没有安装SQL数据库.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)');
end;
{ Connect to the Microsoft SQL Server }
//连接SQL
SQLServer.LoginSecure := True;
SQLServer.Connect(SQLServerName);
//SQLServer.Connect(SQLServerName,'sa','');
//MsgBox('连接到SQL服务器 ''' + SQLServerName + '''.', mbInformation, mb_Ok);
{ Setup a database }
try
MsgBox(ExpandConstant('{app}')+'\data\FiberTest_Data.MDF;'+ExpandConstant('{app}')+'\data\FiberTest_Log.LDF', mbInformation, mb_Ok);
//SQLServer.AttachDB('FiberTest',ExpandConstant('{app}')+'\data\FiberTest_Data.MDF;'+ExpandConstant('{app}')+'\data\FiberTest_Log.LDF');
SQLServer.AttachDBWithSingleFile('FiberTest',ExpandConstant('{app}')+'\data\FiberTest_Data.MDF');
MsgBox('数据库安装成功!', mbInformation, mb_Ok);
except
MsgBox('数据库安装失败!', mbInformation, mb_Ok);
end;
{
//创建SQL数据库文件
Database := CreateOleObject('SQLDMO.Database');
Database.Name := 'FiberTest'; //要创建的数据库名称
DBFile := CreateOleObject('SQLDMO.DBFile');
DBFile.Name := 'FiberTestData1';
//数据库记录
DBFile.PhysicalName := 'c:\program files\microsoft sql server\mssql\data\FiberTest_Data.MDF';
DBFile.PrimaryFile := True;
DBFile.FileGrowthType := SQLDMOGrowth_MB;
DBFile.FileGrowth := 1;
Database.FileGroups.Item('PRIMARY').DBFiles.Add(DBFile);
LogFile := CreateOleObject('SQLDMO.LogFile');
LogFile.Name := 'FiberTestLog1';
//数据库日记
LogFile.PhysicalName := 'c:\program files\microsoft sql server\mssql\data\FiberTest_Log.LDF';
Database.TransactionLog.LogFiles.Add(LogFile);
// Add the database
//添加数据库
SQLServer.Databases.Add(Database);
}
//MsgBox('Added database ''' + Database.Name + '''.', mbInformation, mb_Ok);
{
//数据备份
oBackup := CreateOleObject('SQLDMO.Backup'); //创建一个备份对象
oBackup.Database := 'louyu'; //要备份的数据库名称
oBackup.Files := 'f:\louyu3.bak'; //备份到什么地方
oBackup.BackupSetName := 'louyu3.bak'; //备份的名称
oBackup.BackupSetDescription := 'bakDescription';
oBackup.Initialize := true;
oBackup.SQLBackup(sqlServer); //执行SQL备份操作
//数据还原
//重点说明:
//数据库的备份文件在打好的包中的某个位置,要还原数据库首先要找到备份的文件,找备份的文件的话在这之前还要知道软件安装到了什么地方,也就是安装路径。在程序安装时我们在注册表中建立了相关信息,其中有软件安装路径的记录,关于注册表请查阅前面写的“INNO SETUP注册表的添加与读取”。
//为什么还原数据库时用这种方法呢,好像是绕了个圈子一样,其实我也认为这可能不是一种好方法,但是在这我不知道还有什么别的方法来获得安装包中的数据(文件)或软件要安装的路径。app、pf等在这都无法直接使用,所以才用了这种笨方法。
//如果哪位朋友有好方法,请告知我。
//从注册表中获得程序安装的路径,根据路径找到还原数据库的备份文件。
if RegQueryStringValue(HKLM, 'SOFTWARE\*******', 'Server', ResultStr) then
begin
ResultStr := RemoveQuotes(ResultStr);
msgbox(resultstr,mbinformation,mb_ok);
try
oRestore := CreateOleObject('SQLDMO.Restore'); //创建还原对象
oRestore.Database := 'dbase'; //还原的数据库名称
db_path:=resultstr + '\数据库文件\dbase.bak'; //备份文件的路径
MsgBox(db_path,mbinformation,mb_ok); //测试一下看路径对不对
oRestore.files :=db_path; //指定备份文件
oRestore.replacedatabase := true;
oRestore.sqlrestore(sqlserver); //执行还原操作
MsgBox('数据库还原成功!',mbinformation,mb_ok);
except
MsgBox('数据库还原失败!,请重试或查阅帮助文档进行手动配置!',mbinformation,mb_ok);
end;
end;
}
end;
procedure InitializeWizard;
var
Left, Top, TopInc: Integer;
begin
//Left := WizardForm.WelcomeLabel2.Left;
//TopInc := WizardForm.CancelButton.Height + 8;
//Top := WizardForm.WelcomeLabel2.Top + WizardForm.WelcomeLabel2.Height - 4*TopInc;
//CreateButton(Left, Top, '安装数据库(&S)', @SQLDMOButtonOnClick);
{ 创建页面 }
UserPage := CreateInputQueryPage(wpWelcome,
'服务器信息', '请填写服务器的名称,该服务器为安装了SQL Server的计算机。',
'请指定你的名字和公司,然后单击“下一步”。');
UserPage.Add('服务器名称:', False);
UsagePage := CreateInputOptionPage(UserPage.ID,'安装选择', '进行客户端还是服务器端安装?','请指定你想安装的方式,然后单击“下一步”。',
True, False);
UsagePage.Add('安装数据库');
UsagePage.Add('不安装数据');
{设置默认值,如果可能,使用这些设置最后一次贮存}
UserPage.Values[0] := GetPreviousData('Name', ExpandConstant('{computername}'));
case GetPreviousData('UsageMode', '') of
'Server': UsagePage.SelectedValueIndex := 0;
'Client': UsagePage.SelectedValueIndex := 1;
else
UsagePage.SelectedValueIndex := 1;
end;
end;
procedure RegisterPreviousData(PreviousDataKey: Integer);
var
UsageMode: String;
begin
{ 贮存你可以下次进行恢复的设置 }
SetPreviousData(PreviousDataKey, 'Name', UserPage.Values[0]);
case UsagePage.SelectedValueIndex of
0: UsageMode := 'Server';
1: UsageMode := 'Client';
end;
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
{ 跳过不显示的页面 }
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var
I: Integer;
begin
{ 在用户继续前进行验证 }
if CurPageID = UserPage.ID then
begin
if UserPage.Values[0] = '' then
begin
MsgBox('你必须输入服务器的名字。', mbError, MB_OK);
Result := False;
end
else
begin
SQLServerName:=UserPage.Values[0];
Result := True;
end;
end
else
Result :=True;
end;
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
var
S: String;
Left, Top, TopInc: Integer;
begin
{ 填写带普通设置和自定义设置的“准备演示” }
S := '';
S := S + '服务器名称:' + NewLine;
S := S + Space + UserPage.Values[0] + NewLine;
S := S + NewLine;
S := S + '使用模式:' + NewLine + Space;
case UsagePage.SelectedValueIndex of
0: S := S + '服务器端';
1: S := S + '客户端';
end;
S := S + NewLine + NewLine;
S := S + MemoDirInfo + NewLine;
Result := S;
Left := WizardForm.WelcomeLabel2.Left;
TopInc := WizardForm.CancelButton.Height + 8;
Top := WizardForm.WelcomeLabel2.Top + WizardForm.WelcomeLabel2.Height - 4*TopInc;
if UsagePage.SelectedValueIndex = 0 then
CreateButton(Left, Top, '安装数据库(&S)', @SQLDMOButtonOnClick);
end;
function GetServer(Param: String): String;
begin
Result := UserPage.Values[0];
end;
function GetUser(Param: String): String;
begin
{ Return a user value }
{ Could also be split into separate GetUserName and GetUserCompany functions }
if Param = 'Name' then
Result := UserPage.Values[0];
end;