杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2140|回复: 0

INNO 补丁制作技术

[复制链接]
发表于 2016-12-31 13:17:50 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Patch 属于专为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. 脚本如下,功能包含了自动检测以前的安装路径,自动备份原文件。
  1. ; -- Example1.iss --

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

  4. [Setup]
  5. AppName=Test Program
  6. AppVerName=Test Program version 1.5
  7. UsePreviousAppDir=yes
  8. DefaultDirName={pf}\My Program
  9. Uninstallable=false
  10. Compression=lzma
  11. SolidCompression=yes
  12. OutputDir=.

  13. [Files]
  14. Source: "callvpatch.dll"; Flags: dontcopy
  15. Source: "VPatch.dll"; Flags: dontcopy
  16. Source: "MyPatch.dat"; Flags: dontcopy

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

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

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

  37. procedure RestoreFile(FileName: String);
  38. begin
  39.   FileCopy(ExpandConstant('{app}\'+BackupDir+'\'+Filename),ExpandConstant('{app}\'+Filename),False);
  40.   DeleteFile(ExpandConstant('{app}\'+BackupDir+'\'+Filename));
  41. end;

  42. procedure InitializeWizard();
  43. begin
  44.   ExtractTemporaryFile('VPatch.dll');
  45.   ExtractTemporaryFile('MyPatch.dat');
  46. end;

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

  56. procedure CurPageChanged(CurPageID: Integer);
  57. begin
  58.   if CurPageID = wpInstalling then
  59.   begin
  60.     CreateDir(ExpandConstant('{app}\'+BackupDir));
  61.    
  62.     BackupFile('MyProg.exe');
  63.     if PatchFileFunc('MyProg.exe') = 1 then
  64.       RestoreFile('MyProg.exe')
  65.     WizardForm.PROGRESSGAUGE.POSITION := 33;
  66.    
  67.     BackupFile('MyProg.hlp');
  68.     if PatchFileFunc('MyProg.hlp') = 1 then
  69.       RestoreFile('MyProg.hlp')
  70.     WizardForm.PROGRESSGAUGE.POSITION := 66;
  71.    
  72.     BackupFile('Readme.txt');
  73.     if PatchFileFunc('Readme.txt') = 1 then
  74.       RestoreFile('Readme.txt')
  75.     WizardForm.PROGRESSGAUGE.POSITION := 100;
  76.   end;
  77. end;
复制代码








回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-19 21:04 , Processed in 0.112140 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表