当你完成一个应用软件的开发后,那么你还需要为该软件做一个规范化的安装程序,这是程序设计的最后一步,同时也是很重要的一步,因为运行安装程序往往是用户做的第一步操作。

很多报刊文章介绍了许多如何利用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 255 do

//此处设置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 startupinfo do

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:PItemIDList;

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的调用。在安装过程中的一些提示性界面及每一个步骤大家可以根据自己的需要而制作,这样做出来的安装程序精练,而且风格可以做的很特别。