转 : 用Delphi编写安装程序

http://www.okbase.net/doc/details/931  还没有亲自验证过,仅收藏

当你完成一个应用软件的开发后,那么你还需要为该软件做一个规范化的安装程序,这是程序设计的最后一步,同时也是很重要的一步,因为运行安装程序往往是用户做的第一步操作。
很多报刊文章介绍了许多如何利用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的调用。在安装过程中的一些提示性界面及每一个步骤大家可以根据自己的需要而制作,这样做出来的安装程序精练,而且风格可以做的很特别。

时间: 2024-10-08 01:07:03

转 : 用Delphi编写安装程序的相关文章

用 .Net Framework 4.0 制作的安装程序来安装 .Net Framework 4.0 编写的程序

文章题目看起来有点绕,解释一下,假如你基于框架写了一个程序,想装到客户机上,但是客户机上可能并没有安装框架,因此你的程序需要预先将框架安装在目标机上,然后再执行一些安装程序的标准功能,如创建快捷方式.创建程序组.写入卸载信息以便让Windows能够对程序进行卸载管理等,实现这个功能的方法有很多,例如使用InstallShield.Wix Toolset等均可实现此功能. 不过本文并不是介绍使用这些工具的方法,而是要使用框架来编写一个安装程序,实现一般安装程序的复制文件.创建快捷方式.创建程序组.

Eclipse+python的安装与使用(详细阐述了eclipse编写Python程序的基本功能及技巧)

安装环境说明: 操作系统:win7 JDK:jdk1.7.0_11 下载网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html Eclipse:eclipse-jee-kepler-SR2-win32-x86_64 下载网址: http://www.eclipse.org/downloads/ http://www.eclipse.org/downloads/download.php?file=/technolo

Qtcreator编写ros程序:无法启动进程"catkin_make" -DCMAKE_BUILD_TYPE=Debug

利用Qtcreator编写ROS程序,你必须先进行相应的配置:在启动qtcreator环境时先把ros环境添加进.(即~/.bashrc文件) 1 版本问题 QT4 与 QT5 sudo    gedit ~/.local/share/applications/DigiaQtOpenSource-qtcreator.desktop     (qt5       默认安装的路径下) 当打开文件是空时,关闭.按照路径打开文件 cd ~/.local/share/applications/ gedit

用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控

写在前面 前文:用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试 为了方便,这篇文章里的例子均为伪分布式运行,一般来说只要集群配置得当,在伪分布式下能够运行的程序,在真实集群上也不会有什么问题. 为了更好地模拟集群环境,我们可以在mapred-site.xml中增设reducer和mapper的最大数目(默认为2,实际可用数目大约是CPU核数-1). 假设你为Hadoop安装路径添加的环境变量叫$HADOOP_HOME(如果是$HAD

linux中VI编写C程序。。。

在linux中编写C程序时不像编写shell那样开头要#!/bin/bash,但是在C程序中要指定头文件(头文件是只输入输出,宏等,而且要首先声明,也是必须要开始就声明的) 写好C代码后要给C文件赋予可执行权限(chmod  755  xx.c) 然后用gcc编译(方法和shell类似,shell是bash xx.sh   ,    而C是gcc xx.c ,C的程序文件名都是以 .c 结尾 , shell是都是以 .sh 结尾) 以下上实例: [[email protected] ~]# vi

delphi编写与调用DLL(delphi7下测试通过)

http://blog.sina.com.cn/s/blog_4dbbf76f01000anz.html 1 delphi编写DLL 2 下面在delphi中编写一个简单的dll,在该dll中只有一个max函数,返回2个数中的大数(Delphi 5.0) 3 1.New->DLL;取名为DLL_0001,编写代码: 4 library dll_0001; 5 uses 6 SysUtils, 7 Classes; 8 {$R *.RES} 9 function max(x,y:integer):

Linux安装程序Anaconda分析

1.概述 Anaconda是RedHat.CentOS.Fedora等Linux的安装管理程序.它能够提供文本.图形等安装管理方式,并支持Kickstart等脚本提供自己主动安装的功能.此外,其还支持很多启动參数,熟悉这些參数可为安装带来非常多方便.该程序的功能是把位于光盘或其它源上的数据包,依据设置安装到主机上.为实现该定制安装,它提供一个定制界面,能够实现交互式界面供用户选择配置(如选择语言,键盘,时区等信息).Anaconda的大部分模块用Python编写,有少许的加载模块用C编写. An

Delphi编写DLL(以及静态和动态方式调用)

Delphi编写DLL(以及静态和动态方式调用) 作者/cadenza7 什么是DLL? DLL是Dynamic Link Library(动态链接库)的缩写形式.DLL 是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件,动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数,函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译.链接并与使用它们的进程分开存储的函数.DLL 还有助于共享数据和资源,多个应用程序可同时访问内存中单个DLL 副本的内容

重温delphi之控制台程序:Hello World!

原文:重温delphi之控制台程序:Hello World! 这二天用c#开发ActiveX时,发现不管怎么弄,c#就是没办法生成ocx的纯正activeX控件,而且还要强迫用户安装巨大的.net framework(我只是想做一个简单截屏功能的activeX整合到silverlight聊天室中),于是想起了曾经用过一年的delphi,虽然时过境迁,现在早以是.net的天下,但是不可否认,delphi仍是win32原生程序最佳的开发工具之一. 关于Delphi的语法学习,可以参见这个chm文档,