转 : 用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的调用。在安装过程中的一些提示性界面及每一个步骤大家可以根据自己的需要而制作,这样做出来的安装程序精练,而且风格可以做的很特别。
转 : 用Delphi编写安装程序的更多相关文章
- 分享一次C#调用Delphi编写Dll程序
1.前言: 最近接手了一个项目需要和Delphi语言编写的一个系统进行一些接口的对接,数据在传输过程中采用Des加密方式,因为Delphi 平台的加密方式和C#平台的加密方式不互通,所以采用的方式是C ...
- delphi下实现控制其它窗体中的控件代码模板(delphi 7安装程序)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Delphi编写下载程序:UrlDownloadToFile的进度提示
urlmon.dll中有一个用于下载的API,MSDN中的定义如下: HRESULT URLDownloadToFile( LPUNKNOWN pCaller, L ...
- 安装程序工具 (Installutil.exe)22
网址:https://msdn.microsoft.com/zh-cn/library/50614e95(VS.80).aspx 安装程序工具 (Installutil.exe) .NET Fram ...
- 安装程序工具 (Installutil.exe)
网址:https://msdn.microsoft.com/zh-cn/library/50614e95(VS.80).aspx 安装程序工具 (Installutil.exe) .NET Fram ...
- 利用Delphi编写Socket通信程序
一.Delphi与Socket 计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议.TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登 ...
- DELPHI编写服务程序总结(在系统服务和桌面程序之间共享内存,在服务中使用COM组件)
DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...
- DELPHI编写服务程序总结
DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...
- python如何编写win程序
python可以编写win程序.win程序的格式是exe,下面我们就来看一下使用python编写exe程序的方法. 编写好python程序后py2exe模块即可将其打包为exe程序. 实际操作过程: ...
随机推荐
- php数据访问(批量删除)
批量删除: 首先给每一行加上复选框,也就是在自增长列内加入checkbox.因为这里可以多选,也可以单选,所以在传值的时候需要传一个数组来进行处理,所以复选框name的值设定一个数组.传值都是传的va ...
- osgconv 批量转换
@echo offfor /f "delims=" %%i in ('dir/b *.osg') do ( "osgconv.exe" "%%~ni. ...
- 多次快速点击相同button导致重复响应的问题
Button在开发中经常用到,但是如果在瞬间点击多次时会出现多次响应事件的问题,今天给大家分享一下解决方法. 方法一:在Button响应事件中禁止Button允许点击, -(void)buttonAc ...
- javaWeb四大域对象
servletContext Request HttpSession pageContext 详细参考:http://www.tuicool.com/articles/NJfyMrn
- ASCII 非打印字符
项目出了问题,因为AscII非打印字符的原因,后来找了一下啊ASCII的非打印字符,总共有31个,然后我们直接全部替换成问号了. 解决方式为先找到非打印字符,这是我从网上找的非打印字符表: 进制 十六 ...
- NYOJ之奇偶数分离
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAscAAAJ8CAIAAACdmZvPAAAgAElEQVR4nO3dPVLjStsG4G8T5CyEFC
- Spring学习笔记—最小化Spring XML配置
自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bean的依赖关系. 自动 ...
- 使用 Laravel 框架:成为微信公众平台开发者
转: http://ninghao.net/blog/1441 作者:王皓发布于:2014-05-30 13:16更新于:2014-05-31 12:05 我们可以使用Laravel 框架为微信公众平 ...
- Shell编程基础教程3--Shell输入与输出
3.Shell输入与输出 3.1.echo echo命令可以显示文本行或变量,或者把字符串输出到文件 echo [option] string ...
- at org.apache.jsp.index_jsp._jspInit(index_jsp.java:22) 报空指针
原来发布到weblogic 的项目,想改动发布到tomcat上.启动发布一切都正常.出入项目请求路径却包错: java.lang.NullPointerException at org.apache. ...