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 目录,输入如下命令:







引用
UnkownUnkown
发表于
[/color]
的内容:

[color=green]     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
发表于
[/color]
的内容:

[color=#000000]; -- Example1.iss --

; 补丁安装程序制作脚本


[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
;

INNO 脚本附件:


http://restools.hanzify.org/inno/vpatch/Inno_VPatch.zip

Windows/Win Servers | 评论(0) | 引用(0) | 阅读(1384)
打開更多相關 INNO 补丁制作技术, 打开 INNO 补丁制作方法的第一页 的信息
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
昵称   密码   游客无需密码
网址   电邮   [注册]
               

验证码 如果无法察看请点击更换图片
请输入上面的字母,不区分大小写