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

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

  1. 分享一次C#调用Delphi编写Dll程序

    1.前言: 最近接手了一个项目需要和Delphi语言编写的一个系统进行一些接口的对接,数据在传输过程中采用Des加密方式,因为Delphi 平台的加密方式和C#平台的加密方式不互通,所以采用的方式是C ...

  2. delphi下实现控制其它窗体中的控件代码模板(delphi 7安装程序)

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  3. Delphi编写下载程序:UrlDownloadToFile的进度提示

    urlmon.dll中有一个用于下载的API,MSDN中的定义如下: HRESULT URLDownloadToFile(             LPUNKNOWN pCaller,       L ...

  4. 安装程序工具 (Installutil.exe)22

    网址:https://msdn.microsoft.com/zh-cn/library/50614e95(VS.80).aspx  安装程序工具 (Installutil.exe) .NET Fram ...

  5. 安装程序工具 (Installutil.exe)

    网址:https://msdn.microsoft.com/zh-cn/library/50614e95(VS.80).aspx  安装程序工具 (Installutil.exe) .NET Fram ...

  6. 利用Delphi编写Socket通信程序

    一.Delphi与Socket 计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议.TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登 ...

  7. DELPHI编写服务程序总结(在系统服务和桌面程序之间共享内存,在服务中使用COM组件)

    DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...

  8. DELPHI编写服务程序总结

    DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...

  9. python如何编写win程序

    python可以编写win程序.win程序的格式是exe,下面我们就来看一下使用python编写exe程序的方法. 编写好python程序后py2exe模块即可将其打包为exe程序. 实际操作过程: ...

随机推荐

  1. autolayout autoresizing

    WWDC 2012 Session笔记——202, 228, 232 AutoLayout(自动布局)入门 这是博主的WWDC2012笔记系列中的一篇,完整的笔记列表可以参看这里.如果您是首次来到本站 ...

  2. IOS-CoreAnimation

    核心动画 •Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍! •使用它需要先添加QuartzCore.framework和引入对应的框架 ...

  3. js中masonry与infinitescroll结合 形成瀑布流

    后台:(有点问题 page应该从1开始 而不是从0开始)     public function actionExperts()    {        $top=5;        $page=em ...

  4. ArtDialog简单使用示例

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  5. 苹果的软件/系统盘 网站 http://www.panduoduo.net/u/bd-369186934/2

    http://www.panduoduo.net/u/bd-369186934/2

  6. [Android Pro] APK

    svn updatesvn status ls -alsvn log --limit 8 > RELEASE_NOTE.txt cat RELEASE_NOTE.txt chmod a+x gr ...

  7. 1.Windows安装PostgreSQL

    按照下面的步骤,Windows机器上安装PostgreSQL.请确保已开启第三方防病毒,同时安装. 挑选你想要的PostgreSQL的版本号,可以点击以下链接下载 EnterpriseDB Windo ...

  8. sdut 2610:Boring Counting(第四届山东省省赛原题,划分树 + 二分)

    Boring Counting Time Limit: 3000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述     In this problem you a ...

  9. python生成RSS(PyRSS2Gen)

    既然能够用python解析rss,那么也顺带研究下生成rss. 其实很简单,只是生成一个比较特殊点的xml文档而已. 这里我使用了PyRss2Gen,用法很简单,看代码就知道了,如下: import ...

  10. 第二十篇:在SOUI中使用分层窗口

    从Windows 2K开始,MS为UI开发引入了分层窗口这一窗口风格.使用分层窗口,应用程序的主窗口可以是半透明,也可以是逐点半透明(即每一个像素点的透明度可以不同). 可以说,正是因为有了分层窗口, ...