杉宫竹苑工作室

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

Setup Factory 7 制作补丁初探(兼软件注册表检测功能)

[复制链接]
发表于 2015-1-23 14:30:57 | 显示全部楼层 |阅读模式

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

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

x
  VPatch 原为 NSIS 的一个插件,能够创建一个补丁文件用于安装时升级用户系统中的文件。包括两个工具:GenPat 工具能够生成补丁数据文件,VPatch 插件能够应用补丁数据文件来升级目标文件。使用补丁数据文件,你能降低你的软件的升级下载量,因为只有两个文件间不同的地方被包含在补丁数据文件中。
      从 VPatch v3.0 开始,增加了用户图形界面 (GUI),并能创建可独立运行的 Exe 或 Dll 文件(分别使用「运行库」Vpatch.bin 和 VPatchDLL.bin)。
      VPatch v3.2 又增加了两个命令行工具,其中 ListPat.exe 可列出一个补丁数据文件中的所有补丁数据的主要内容。vpatchprompt.exe 可作为补丁应用程序,也可当作「运行库」捆绑补丁数据后生成可独立运行的 Exe 文件(需人工干预)。

原版下载:
https://www.tibed.net/files/vpatch31.exe
http://www.tibed.net/files/vpatch32.exe

汉化
VPatch31 HH.exe (963.74 KB, 下载次数: 0)
VPatch32 HH.exe (87.53 KB, 下载次数: 0)

首先,将前面得到的 VPatch.exe 加入初始文件,下面的语句就看着办了:

  1. -- 在注册表内获得原版程序的安装目录,并写入变量 %AppFolder%
  2. InstallFolder = Registry.GetValue(HKEY_CURRENT_USER, "Software\\您的产品", "安装目录", false);
  3. SessionVar.Set("%AppFolder%", InstallFolder);

  4. -- 将 VPatch.exe 复制到安装目录
  5. File.Copy(SessionVar.Expand("%TempLaunchFolder%\\VPatch.exe"), SessionVar.Expand("%AppFolder%"), true, true, false, true, nil);

  6. -- 备份文件
  7. function BackupFile(filename)
  8. Folder.Create(SessionVar.Expand("%AppFolder%\\backup"));
  9. File.Copy(SessionVar.Expand("%AppFolder%\")..filename, SessionVar.Expand("%AppFolder%\\backup"), true, true, false, true, nil);
  10. File.Rename(SessionVar.Expand("%AppFolder%\")..filename, SessionVar.Expand("%AppFolder%\")..filename..".tmp");
  11. end

  12. -- 补丁失败时恢复文件
  13. function RestoreFile(filename)
  14. File.Copy(SessionVar.Expand("%AppFolder%\\backup\")..filename, SessionVar.Expand("%AppFolder%"), true, true, false, true, nil);
  15. File.Delete(SessionVar.Expand("%AppFolder%\\backup\")..filename, false, false, false, nil);
  16. File.Delete(SessionVar.Expand("%AppFolder%\")..filename..".tmp", false, false, false, nil);
  17. end

  18. -- 补丁成功后删除临时文件
  19. function DeleTempFile(filename)
  20. File.Delete(SessionVar.Expand("%AppFolder%\")..filename..".tmp", false, false, false, nil);
  21. end

  22. -- 补丁之前判断文件是否存在以及是否正在使用
  23. function FileExistInUse(filename)
  24. result1 = File.DoesExist(SessionVar.Expand("%AppFolder%\")..filename);
  25. result2 = not File.IsInUse(SessionVar.Expand("%AppFolder%\")..filename);
  26. local result = result1 and result2;
  27. return result;
  28. -- result:
  29. -- true = 文件存在且没有在使用
  30. -- false = 文件不存在或正在使用
  31. end

  32. -- 调用 VPatch.exe 进行补丁
  33. function PatchFile(filename)
  34. local oldver = filename..".tmp";
  35. result = File.Run("VPatch.exe", oldver.." "..filename, SessionVar.Expand("%AppFolder%"), SW_SHOWNORMAL, true);
  36. return result;
  37. -- result:
  38. -- 0 = 成功
  39. -- 非0 = 失败
  40. end

  41. -- 开始补丁
  42. if FileExistInUse("app.exe") then
  43. -- 开始补丁前备份文件
  44. BackupFile("app.exe");
  45. if PatchFile("app.exe") == 0 then
  46. Dialog.Message("成功", "补丁成功。", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
  47. DeleTempFile("app.exe");
  48. -- 进入下一个屏幕
  49. Screen.Next();
  50. else
  51. Dialog.Message("错误", "错误的文件或路径,请检查。", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
  52. RestoreFile("app.exe");
  53. end
  54. else
  55. Dialog.Message("错误", "文件不存在或正在使用。", MB_OK, MB_ICONSTOP, MB_DEFBUTTON1);
  56. end;

  57. -- 删除 VPatch.exe
  58. File.Delete(SessionVar.Expand("%AppFolder%\\VPatch.exe"), false, false, false, nil);
复制代码


添加了一个 FileExistInUse 函数,用来判断文件是否存在以及是否正在使用。


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 23:42 , Processed in 0.121993 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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