用Delphi编写安装程序
(作者:俞文群 2001年03月16日 10:36)
当你完成一个应用软件的开发后,那么你还需要为该软件做一个规范化的安装程序,
这是程序设计的最后一步,同时也是很重要的一步,因为运行安装程序往往是用户做的第
一步操作。
很多报刊文章介绍了许多如何利用installshield等工具软件来制作安装程序的方法,
这种办法可以很快建立起较常见的安装模式,但用这种办法也有一些不足,如做成的安装
程序一般较大;风格较单一;不能灵活的控制启动方式和快捷方式。其实安装程序的的几
个运行步骤较固定,我们完全可以自己来编写安装程序。下面就详细介绍如何用DELPHI编
写具有自己软件特色的安装程序。
安装程序要达到的几个原则,如配置的一次性等,在有关杂志上已有许多文章介绍,
就不再累述。这里主要介绍安装程序编写中几个主要过程:
1、将需要安装的程序制作成资源文件
Step 1:编写myres.rc资源脚本文件,可用记事本等编写。
MYDBSRC mydbsrcfile c:/resdemo/mynbdb.mdb
MYDBJET mydbjetfile c:/resdemo/mdac_typ.exe
MYDBAPP mydbappfile c:/resdemo/Tnbdemo.exe
7001 Icon c:/resdemo/setup.ico
Step 2:利用BRCC32编译生成资源文件myres.res。
brcc32.exe myres.rc
2、编写安装程序代码
Step 1: 在setup.dpr文件中加入{$R mymyres.RES} 语句,这样在编译文件时包含资源
文件。
Step 2: 编写安装程序背景界面。
//界面色彩渐变效果是通过用渐变的画刷刷绘依次相邻的矩形块实现的。
//也可以实现其它特殊效果的安装界面。
var i,j:Integer;
Dct:TRect;
begin
form1.WindowState:=wsMaximized;
j:=form1.width;
//获得表单高度
for i:=0 to 255do
//此处设置RGB()中一个颜色值
begin
Canvas.Brush.Color:=RGB(0,0,255-i);
//每次画矩形的画刷颜色 (左,上,右,下)
//Dct:=Rect(i*2,0,(i+1)*2,j);
Dct:=Rect(0,i*2,j,(i+1)*3);
//每次刷绘的矩形区域
Canvas.FillRect(Dct);
Form1.Canvas.TextRect(Dct,30,40,'宁波大学课件管理系统 v1.0');
//填充颜色
end;
end;
Step 3:创建主程序工作目录
//设置目录环境及配置文件
if not DirectoryExists(EdtDir.Text) then
// if MessageBox(getfocus,'该目录不存在,是否创建该目录?','询问',1) = idOK then
try
ForceDirectories(EdtDir.Text);
except
MessageBox(getFocus,'创建目录失败!','信息',0);
Exit;
end
// else
Exit;
// ModalResult := mrOK;
Step 4:生成主程序配置文件
变量:
var
setupinfo : TiniFile;
//配置当前数据工作路径,选择与自己系统有关的驱动程序。
setupinfo:= Tinifile.Create( trim(FrmPathSelect.EdtDir.Text)+'/setup.ini');
setupinfo.WriteString('access','workdbpath',trim(FrmPathSelect.EdtDir.Text)+'/mynbdb.mdb';
setupinfo.WriteString('access','backdbpath',trim(FrmPathSelect.EdtDir.Text)+'/mynbdbbak.mdb');
setupinfo.Free;
Step 5:从资源文件中还原有关文件。
变量:
var
res:tresourcestream;
resname,resnewname:string;
RegFile:TRegIniFile;
begin
//从资源文件中还原数据库文件
resnewname:=trim(FrmPathSelect.EdtDir.Text)+'/mynbdb.mdb';
resname:='MYDBSRC';
res:=tresourcestream.Create(hinstance,resname,pchar('mydbsrcfile'));
res.savetofile(resnewname);
res.free;
//从资源文件中还原主程序文件
resnewname:=trim(FrmPathSelect.EdtDir.Text)+'/Tnbdemo.exe';
resname:='MYDBAPP';
res:=tresourcestream.Create(hinstance,resname,pchar('mydbappfile'));
res.savetofile(resnewname);
res.free;
//在注册表中写入主程序路径名及执行文件名的信息,以便在
//升级主程序时用到。
RegFile := TRegIniFile.Create;
RegFile.RootKey := HKEY_LOCAL_MACHINE;
RegFile.WriteString('SOFTWARE/mynb','exepath',trim(resnewname));
RegFile.Free;
end
Step 6:安装数据库驱动(与SETP 4对应)
//安装数据库驱动程序
var
cmdlinepchar:array[0..120] of char;
startupinfo:tstartupinfo;
processinfo:tprocessinformation;
begin
screen.cursor:=crhourglass;
strpcopy(cmdlinepchar,trim(FrmPathSelect.EdtDir.Text)+'/mdac_typ.exe /q');
fillchar(startupinfo,sizeof(startupinfo),#0);
//置0
with startupinfodo
begin
cb:=sizeof(startupinfo);
dwflags:=startf_useshowwindow or startf_usestdhandles;
wshowwindow:=sw_hide;
//隐藏被调用程序窗口
end;
if createprocess(nil,cmdlinepchar,nil,nil,true,0,nil,nil,startupinfo,processinfo) then
//创建进程
begin
waitforsingleobject(processinfo.HProcess,infinite);
//等待进程结束
end
else
begin
exit;
end;
screen.cursor:=crDEFAULT;
DeleteFile(PChar(trim(FrmPathSelect.EdtDir.Text)+'/mdac_typ.exe'));
end;
Step 7:创建程序组
变量:
var
smacro:string;
szmacro:array[0..254] of char;
sgroupdesc,sgroupname:string;
sprogdesc:string;
sprogicon:string;
//创建主程序组
//打开对话通路
if ddeclientconv1.OpenLink then
begin
//建立组群
sgroupdesc:='宁波大学课件管理系统 ';
sgroupname:='宁波大学课件管理系统 v1.0';
//组成宏指令
smacro:='[creategroup('+sgroupdesc+','+sgroupname+')]';
strpcopy(szmacro,smacro); //转成null-term 字串
ddeclientconv1.ExecuteMacro(szmacro,false);
//执行宏指令
//建立ICON图像
sprogicon:=trim(FrmPathSelect.EdtDir.Text)+'/Tnbdemo.exe';;
sprogdesc:='宁波大学课件管理系统';
smacro:='[additem('+sprogicon+','+sprogdesc+')]';
strpcopy(szmacro,smacro);
ddeclientconv1.ExecuteMacro(szmacro,false);
ddeclientconv1.CloseLink;
end;
Step 8:创建桌面快捷方式
//uses shlobj,comobj,activex;
var
tmpObject:IUnknown;
tmpSLink:IShellLink;
tmpPFile:IPersistFile;
PIDL
ItemIDList;
StartupDirectory : array[0..MAX_PATH] of Char;
StartupFilename : String;
LinkFilename : WideString;
c1:THandle;
begin
StartupFilename := ''Tnbdemo.exe'';
tmpObject := CreateComObject(CLSID_ShellLink);
tmpSLink := tmpObject as IShellLink;
tmpPFile := tmpObject as IPersistfile;
tmpSLink.SetPath(pChar(StartupFilename));
tmpSLink.SetWorkingDirectory(pChar(ExtractFilePath(StartupFilename)));
SHGetSpecialFolderLocation(0,CSIDL_DESKTOPDIRECTORY,PIDL);
SHGetPathFromIDList(PIDL,StartupDirectory);
LinkFilename := StartupDirectory + '/mynotepad.lnk';
showmessage(linkfilename);
tmpPFile.Save(pWChar(LinkFilename),FALSE);
c1:=windows.FindWindowEx(windows.FindWindowEx(windows.FindWindow('Progman','Program Manager'),0,'SHELLDLL_DefView',''),0,'SysListView32','');
PostMessage(c1,WM_KEYDOWN,VK_F5,0);
PostMessage(c1,WM_KEYUP,VK_F5,1 shl 31);
end;
Step 9:重新启动机器
begin
ExitWindowsEx(2,0);
end;
以上是程序的主要语句部分,从本人的开发系统中剪出来,用到了一些WIN API的调用。
在安装过程中的一些提示性界面及每一个步骤大家可以根据自己的需要而制作,这样做出
来的安装程序精练,而且风格可以做的很特别。