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

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 引用来自 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


评论: 16 | 引用: 0 | 查看次数: 17784
1111 [2011-02-18 09:35 AM]
刚刚试着用vpatch的GUI工具制作补丁,把生成的补丁改成.dat类型,就可以用了,呵呵,以后好好研究一下这个插件
1111 [2011-02-18 09:06 AM]
好的,谢谢!
xin [2011-02-17 10:39 PM]
你如此问, 我也没办法回答你.

你去论坛上完整脚本, 或许还能了解一二.
1111 [2011-02-17 04:37 PM]
我想问下,vpatch生成的是.pat文件,与命令行工具行成的.dat文件不同,怎么在更新程序中使用呢,.pat文件替换.dat文件使用的方式试过,更新了没效果
xin [2008-09-07 01:39 AM]
Email 中已回复,例子已经相当详细,我已经无法提供更进一步的解释了。
hgls [2008-09-04 11:15 PM]
非常感谢你帮助!
我是个菜鸟 我想问下
MyPatch.dat 3.2版生成的PatchData.pat 数据文件呢!
river [2007-06-23 09:39 PM]
@小强
可以见小文件大小,减少传输的信息量,让人觉得你很专业~老实的说
http://www(dot)NeedDo(dot)com
xin [2007-05-27 02:32 PM]
引用来自 江波 引用来自 江波
我记得以前HM NISEdit中有个制作补丁的向导,为什么现在的HM NISEdit中没有了呢?
再有就是我用那个向导从来没有正常制作出一个可用的补丁。

能不能老大详细的介绍怎样使用HM NISEdit通过Patch向导制作出补丁。

我发布的这个没有那个向导的插件,你下载蓝色网际汉化的 NSIS 2.14,里面就有这个插件了。在菜单工具那里可以开启这个向导。
江波 [2007-05-27 07:58 AM]
我记得以前HM NISEdit中有个制作补丁的向导,为什么现在的HM NISEdit中没有了呢?
再有就是我用那个向导从来没有正常制作出一个可用的补丁。

能不能老大详细的介绍怎样使用HM NISEdit通过Patch向导制作出补丁。
xin [2007-05-25 09:39 PM]
引用来自 六指书生 引用来自 六指书生
用命令行方式生成补丁太不方便了,要是文件比较多怎么办?不知道哪里有GUI的下载。

VPatch 的官方网页有下载。具体看 VPatch 的说明文件。
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码: 验证码
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 5000 字 | UBB代码 开启 | [img]标签 关闭