INNO 补丁制作技术, 打开 INNO 补丁制作方法的第一页

作者:xin 日期:2005-09-23

字体大小:   
 
VPatch 在 INNO 中的应用。

VPatch 属于专为NSIS开发的补丁插件,通过本人开发的调用插件 callvpatch.dll 进行调用。在 INNO 中得到很好的应用。(注意:你可以在 VPatch 的官方网站“http://www.tibed.net/vpatch/”得到源代码,从而编译成一个适合在 INNO 中直接利用的 DLL,这里我为了通用性跟方便性,使用了NSIS通用调用插件,方便以后随时在NSIS的安装包中得到 VPatch 的已编译的 DLL)

以下是在本例子中的练习步骤,通过这个练习,你将会领略到 VPatch 在补丁安装程序方面的巨大作用。

测试包中的文件分布

 引用内容
VPatch(DIR)
  |   |-- EnglishAppSetup(DIR)            
  |   |   |---- Example1.iss            --英文版软件安装脚本
  |   |   |---- MyProg.exe            --英文版软件主程序
  |   |   |---- MyProg.hlp                --英文版软件帮助
  |   |   |---- Readme.txt            --英文版软件自读文件
  |   |   |---- English.isl                --英文版软件安装程序英文界面语言文件
  |   |
  |   |
  |   |-- ChineseApp(DIR)
  |   |   |---- MyProg.exe            --汉化版软件中文主程序
  |   |   |---- MyProg.hlp                --汉化版软件中文帮助
  |   |   |---- Readme.txt            --汉化版软件中文自读文件
  |   |
  |   |
  |   |-- PatchSetup(DIR)
  |         |---- callvpatch.dll            --我编写的调用 vpatch.dll 的中间插件
  |         |---- Patch.iss            --补丁安装程序脚本
  |         |---- VPatch.dll            --NSIS 补丁插件
  |
  |
  |---- GenPat.exe                      --补丁文件生成工具
  |---- Readme.txt                      --你正在看的本文件
  |---- VPatch.html                      --VPatch 概述

1. 目录下的 EnglishAppSetup 里面是一个英文版例子的安装程序,你需要自己编译成安装程序进行安装。

2. 接着我们安装第一步产生的英文版安装程序,……,好了,现在我们已经安装了一个英文版程序在你的电脑中了。

3. 目录下的 ChineseApp 里面是汉化好的文件,这里的汉化版软件不会直接打包进安装程序的,这只是用来生成补丁文件时用的。

4. 好,现在看看补丁的生成。VPatch 有一个生成补丁的程序,GenPat.exe (可在 NSIS\Bin 目录下找到)
   关于 GenPat.exe 的详细使用方法请看 VPatch.html 文档。

命令行生成补丁:
   进入 VPatch 目录,输入如下命令:

 引用内容
     GenPat "EnglishAppSetup\MyProg.exe" "ChineseApp\MyProg_cn.exe" "PatchSetup\MyPatch.dat"
     GenPat "EnglishAppSetup\MyProg.hlp" "ChineseApp\MyProg_cn.hlp" "PatchSetup\MyPatch.dat"
     GenPat "EnglishAppSetup\Readme.txt" "ChineseApp\Readme_cn.txt" "PatchSetup\MyPatch.dat"

注意:以上全部命令连续执行,GenPat 会自动把所有这些文件的补丁合成在 MyPatch.dat 中。

5. 如无意外 MyPatch.dat 会在 PatchSetup 目录中产生,补丁生成后,进行下一步的补丁程序安装制作了。

6. 脚本如下,功能包含了自动检测以前的安装路径,自动备份原文件。

 引用来自 Patch.iss,2007-5-25 21:54:03
; -- Example1.iss --

; 补丁安装程序制作脚本
; 脚本编写:restools (http://restools.yeah.net

[Setup]
AppName=Test Program
AppVerName=Test Program version 1.5
UsePreviousAppDir=yes
DefaultDirName={pf}\My Program
Uninstallable=false
Compression=lzma
SolidCompression=yes
OutputDir=.

[Files]
Source: "callvpatch.dll"; Flags: dontcopy
Source: "VPatch.dll"; Flags: dontcopy
Source: "MyPatch.dat"; Flags: dontcopy

[code]
const
  BackupDir = 'PatchBackup';
  PatchFile = 'MyPatch.dat';
  
function vpatch(parentwnd: Integer; pluginname,funcname,param1,param2,param3: PChar): Integer;
external 'vpatch@files:callvpatch.dll stdcall';

function PatchFileFunc(FileName: String): Integer;
begin        
  Result := vpatch(0,ExpandConstant('{tmp}\VPatch.dll'),'vpatchfile',ExpandConstant('{tmp}\'+PatchFile),
       ExpandConstant('{app}\'+BackupDir+'\'+FileName),ExpandConstant('{app}\'+FileName));
  // Result :
  // 0 = 成功
  // 1 = 失败
end;

procedure BackupFile(FileName: String);
begin
  if not FileExists(ExpandConstant('{app}\'+BackupDir+'\'+Filename)) then
    FileCopy(ExpandConstant('{app}\'+Filename),ExpandConstant('{app}\'+BackupDir+'\'+Filename),True);
end;

procedure RestoreFile(FileName: String);
begin
  FileCopy(ExpandConstant('{app}\'+BackupDir+'\'+Filename),ExpandConstant('{app}\'+Filename),False);
  DeleteFile(ExpandConstant('{app}\'+BackupDir+'\'+Filename));
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('VPatch.dll');
  ExtractTemporaryFile('MyPatch.dat');
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  if CurPageID = wpSelectDir then
    Result := FileExists(ExpandConstant('{app}\MyProg.exe'))
  else
    Result := True;
  if not Result then
    MsgBox('你选择的目录没有需要补丁的程序,请选择正确的目录!', mbInformation, MB_OK);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpInstalling then
  begin
    CreateDir(ExpandConstant('{app}\'+BackupDir));
    
    BackupFile('MyProg.exe');
    if PatchFileFunc('MyProg.exe') = 1 then
      RestoreFile('MyProg.exe')
    WizardForm.PROGRESSGAUGE.POSITION := 33;
    
    BackupFile('MyProg.hlp');
    if PatchFileFunc('MyProg.hlp') = 1 then
      RestoreFile('MyProg.hlp')
    WizardForm.PROGRESSGAUGE.POSITION := 66;
    
    BackupFile('Readme.txt');
    if PatchFileFunc('Readme.txt') = 1 then
      RestoreFile('Readme.txt')
    WizardForm.PROGRESSGAUGE.POSITION := 100;
  end;
end;

INNO 脚本附件: 
http://restools.hanzify.org/inno/vpatch/Inno_VPatch.zip 

INNO 补丁制作技术, 打开 INNO 补丁制作方法的第一页的更多相关文章

  1. 【分享】GEARS of DRAGOON 1+2【日文硬盘版】[带全CG存档&攻略+SSG改动+打开存档补丁]

    冒险者们哟.寻找龙秘玉吧--! ninetail的最新作,是使用丰富多彩的技能·道具探索迷宫的3D迷宫RPG! 存在着骑士和神官的架空世界常见的职业为首的13种职业.超过数百种的道具的登场! 和伙伴一 ...

  2. 合金装备V 幻痛 制作技术特辑

    合金装备V:幻痛 制作特辑 资料原文出自日版CGWORLD2015年10月号   在[合金装备4(Metal Gear Solid IV)]7年后,序章作品[合金装备5 :原爆点 (Metal Gea ...

  3. U+V2深度隐藏PE制作技术初探

    所谓U+,习惯上是指用UltraISO软件把ISO文件写入U盘来制作启动盘的一种技术.第一代U+兼容性不太好,不推荐使用.目前,兼容性比较好的是第二代U+启动技术(USB-HDD+ V2/USB-ZI ...

  4. [Mugeda HTML5技术教程之12]制作跨屏互动应用

    mugeda动画平台还可以用来制作跨屏互动的动画应用,比如在PC端的大屏幕上显示动画的主界面,同时会显示出供手机扫描的二维码,手机扫描后会在手机上显示手机端动画界面.通过手机就可以和PC端的显示界面跨 ...

  5. 使用 FreeCAD 打开 KiCad 用于制作外壳

    使用 FreeCAD 打开 KiCad 用于制作外壳 先看导入后的结果. 步骤: 安装 FreeCAD 安装 KiCad StepUp Mod Addon 重启 FreeCAD(非常重要,不重启不生效 ...

  6. Web app制作细节:web app互动制作技巧

    Google .微软.苹果三大巨头紧锣密鼓地在web app的研发产品领域圈地设岗,并试图建立以自己为中心的”云“服务平台,企图在web app时代到来的时候充当霸主.本文将围绕web app的制作, ...

  7. 【203】利用UltraISO制作和刻录光盘映像的方法

    参考:利用UltraISO制作和刻录光盘映像的方法 软件:UltraISO注册版(制作镜像).rar 目录: 1.利用UltraISO制作光盘映像2.利用UltraISO刻录光盘映像文件 1.利用Ul ...

  8. SWF在线绘本批量制作高质量PDF的新方法(重点在批量制作)

    SWF在线绘本批量制作高质量PDF的新方法(重点在批量制作) 2012-12-21  未来决定...       http://www.ebama.net/thread-107643-1-1.html ...

  9. PageAdmin CMS网站制作教程实例:如何制作一个报名表?

    PageAdmin CMS网站建设实例:如何制作一个报名表? 有时我们根据需求需要制作一些自定义表,该如何去制作呢? 我们以制作一个报名表为例: 登录后台地址,进入后台, 2.在顶部导航中找到系统,并 ...

随机推荐

  1. git: No refs in common and none specified; doing no

    用gitolite新建项目,clone后首次push,可能会出现:     $ git push No refs in common and none specified; doing nothing ...

  2. springmvc自定义日期编辑器

    1.控制器 @Controller public class MyController { // 处理器方法 @RequestMapping(value = "/first.do" ...

  3. OC语言构造方法

    OC语言构造方法 一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法 ...

  4. Oracle中建立表

    -- Create table create table STUDENT( sno VARCHAR2(3) not null, sname VARCHAR2(8) not null, ssex VAR ...

  5. 转: jdbc连接数据库需要注意和出错的地方

    * 1.数据库登录模式不能只使用windows登录模式,要采取混合模式登录, * 并记住相应的密码和账户: * 2.连接数据库后一定要记得关闭资源,否则就会造成资源浪费. * 关闭的时候也要注意顺序, ...

  6. Android M新特性之APP Link

    The Android M Developer Preview introduces support for App Links, which improves upon existing link ...

  7. 关于javascript中的===和==

    =是赋值符号,==是等于,===是严格等于. 对于等号两边的数值,如果类型不相同会先转换类型再比较,===则不会转换类型. 例如3和“3”在==比较下true,在===下是false, null和un ...

  8. Winform基础知识

    1.关于登陆部分 this.DialogResult = DialogResult.OK; this.Close(); FrmLogin login = new FrmLogin(m_CurUser) ...

  9. cortex-a8硬件基础练习

    实验要求:定时通过串口打印adc,时间和温度,开关量检测和通过串口接收命令控制led小灯的动作 下面是整理的代码: #include "s5pc100.h"#include &qu ...

  10. 避免每次输入bundler Exec命令

    bundle在ruby的世界里是个好东西,它可以用来管理应用程序的依赖库.它能自动的下载和安装指定的gem,也可以随时更新指定的gem. rvm则是一个命令行工具,能帮助你轻松的安装,管理多个ruby ...