·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> 工具使用 >> INNO 补丁制作技术, 打开 INNO 补丁制作方法的第一页    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

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

作者: RESTOOLS 来源:RESTOOLS 时间:2005-09-23 点击:12694

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. 脚本如下,功能包含了自动检测以前的安装路径,自动备份原文件。
以下是代码片段:
; -- 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
  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;


PS: 有些人很担心这种技术会加剧某些事情的发生,但是我认为技术上的研究是必要的,“不能因为刀可以用来杀人,就不允许别人用它来下厨做菜。” flowers.gif

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

汉化新世纪 责任编辑: 乾 .:|:. 标签(Tag): INNO 补丁

·上一篇: [公告]有关汉化捆绑的讨论 ·下一篇: 利用WISE做软件的MD5校验

· 版权申明: 本文引自《RESTOOLS》,如有版权疑问请及时联系本站,以便本站处理。

· 转载申明: 本文引自《RESTOOLS》[ 作者: RESTOOLS],如需转载请直接联系原始作者,并请注明原始出处。

相关文章                                                                                发表评论 打印此文 关闭窗口

| 设为首页 | 加入收藏 | 联系我们 | 友情链接
Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎
本站内容,除转载或版权特别申明的内容外,皆遵守 创造共用协议中文版之“署名-非商业性使用-禁止演绎 2.5 中国大陆”条款
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 2.5 China License.
本网站内容源自汉化新世纪论坛的摘录和汉化新世纪成员的原创文章。
凡汉化新世纪论坛的文字皆默认为汉化新世纪与原作者共同拥有并授权发布。
如对本站发布文章有所异议请来信告知,我们将及时删除。
凡商业摘录本站文字请先与我们联系,本站将保留非授权商业发布的追究权利。
凡非商业摘录本站文字请明显注明出处和原作者,并不得改动,凡改动必先征求原作者同意。
苏ICP备05002283号