用Delphi编写安装程序
当你完成一个应用软件的开发后,那么你还需要为该软件做一个规范化的安装程序,这是程序设计的最后一步,同时也是很重要的一步,因为运行安装程序往往是用户做的第一步操作。
很多报刊文章介绍了许多如何利用installshield等工具软件来制作安装程序的方法,这种办法可以很快建立起较常见的安装模式,但用这种办法也有一些不足,如做成的安装程序一般较大;风格较单一;不能灵活的控制启动方式和快捷方式。其实安装程序的的几个运行步骤较固定,我们完全可以自己来编写安装程序。下面就详细介绍如何用DELPHI编写具有自己软件特色的安装程序。
安装程序要达到的几个原则,如配置的一次性等,在有关杂志上已有许多文章介绍,就不再累述。这里主要介绍安装程序编写中几个主要过程:
1、将需要安装的程序制作成资源文件
Step 1:编写myres.rc资源脚本文件,可用记事本等编写。
MYDBSRC mydbsrcfile c:esdemomynbdb.mdb
MYDBJET mydbjetfile c:esdemomdac_typ.exe
MYDBAPP mydbappfile c:esdemoTnbdemo.exe
7001 Icon c:esdemosetup.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(SOFTWAREmynb,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(ExtractFi
补充:软件开发 , Delphi ,
- 更多Delphi疑问解答:
- 用delphi做这个功能怎么做?
- 问delphi 中将Tquery控件查找到的记录数值写入某一edit中代码如何写?
- 有谁知道怎样在Delphi 7中显示代码的行数啊?或者有什么方法能够快速找到已知某一行数的代码啊!
- 关于delphi 操作EXcel的问题
- delphi ,sql,, 数据库 ,求助~~~~ 急~~~~~
- delphi变体记录问题
- delphi能实现反射吗?
- 谁会安装delphi 7 控件啊!会的话,请帮我在线安装一下? QQ785799795
- 在Delphi的Image控件上画移动的图片
- delphi 月份递增的循环查询
- 宝兰公司的开发工具delphi和c++builder现在的年代还流行吗?
- 我是沈阳做delphi开发的,想要集成短信功能到客户管理系统中,麻烦各位达人?
- 我是南昌做delphi开发的,想要集成短信功能到PMS中,分享下吧!
- delphi 取消窗体的最小化怎么弄
- 我是深圳做delphi开发的,想要集成短信功能到知识管理系统中,求达人指点!