zoukankan      html  css  js  c++  java
  • 转 : 用Delphi编写安装程序

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

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

  • 相关阅读:
    rman备份,恢复
    异步事件回调机制原理探索 (转)
    stock
    将知识变成你的技能点
    Tomcat的URL中文乱码解决以及传输优化
    李洪强iOS开发之-入门指南
    WebSocket 和 Socket 的区别
    李洪强iOS开发之-修改状态栏的字体的颜色
    关于UDID和UUID的区别
    李洪强iOS开发之
  • 原文地址:https://www.cnblogs.com/rogge7/p/4829499.html
Copyright © 2011-2022 走看看