·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> 工具使用 >> Setup Factory 7 制作补丁初探    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

Setup Factory 7 制作补丁初探

作者: ddstrg 来源:汉化新世纪论坛 时间:2007-03-05 点击:16105

一直都想想试试用 Setup Factory 7 做补丁,但是人懒了不想动,直到昨天才开始仔细地看了看,小有成果,与大家分享。

一开始想用阿信的 callvpatch.dll 来调用 NSIS 的插件 vpatch.dll,但老是不成功,放弃。

不过还是要用到 VPatch:在 VPatch 主页下载 VPatch v3.1,安装好之后运行 VPatch GUI,比较两个(或多个)文件,使用 “Create EXE” 生成 exe 文件,默认文件名为 VPatch.exe,此文件内就包含了补丁的数据。
使用格式为:VPatch.exe (sourcefile) (outputfile)
例如: VPatch.exe oldver.exe newver.exe

我整了半天,发现 VPatch.exe 与待补丁的文件和补丁后的文件必须在同一目录,而且新老版本文件的文件名不能相同,否则会有错误。不知道我的判断对不对,帮助文件也写得不是很清楚,熟悉它的朋友请告诉我一声。

好了,该主角出场了,我搞了半天,终于用 Setup Factory 7 成功地实现了补丁功能。
首先,将前面得到的 VPatch.exe 加入初始文件,下面的语句就看着办了:


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

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

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

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

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

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

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

-- 开始补丁
if FileExistInUse("app.exe") then
-- 开始补丁前备份文件
BackupFile("app.exe");
if PatchFile("app.exe") == 0 then
Dialog.Message("成功", "补丁成功。", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
DeleTempFile("app.exe");
-- 进入下一个屏幕
Screen.Next();
else
Dialog.Message("错误", "错误的文件或路径,请检查。", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
RestoreFile("app.exe");
end
else
Dialog.Message("错误", "文件不存在或正在使用。", MB_OK, MB_ICONSTOP, MB_DEFBUTTON1);
end;

-- 删除 VPatch.exe
File.Delete(SessionVar.Expand("%AppFolder%\\VPatch.exe"), false, false, false, nil);



我的算法可能还不太完善,稍显繁琐,希望有朋友继续加以改进。
刚才添加了一个 FileExistInUse 函数,用来判断文件是否存在以及是否正在使用。

VPatch下载地址:http://www.hanzify.org/?Go=Show::List&ID=11472

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

·上一篇: Funmobile公司游戏汉化浅谈——图片字库的汉化 ·下一篇: 如何用 Passolo 快速进行简繁汉化转换

· 版权申明: 本文引自《汉化新世纪论坛》,如有版权疑问请及时联系本站,以便本站处理。

· 转载申明: 本文引自《汉化新世纪论坛》[ 作者: ddstrg],如需转载请直接联系原始作者,并请注明原始出处。

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

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