<var id="9nznz"></var>
<del id="9nznz"></del>
<ins id="9nznz"></ins>
<cite id="9nznz"><span id="9nznz"></span></cite>
<ins id="9nznz"><noframes id="9nznz">
<ins id="9nznz"><noframes id="9nznz"><ins id="9nznz"></ins>
登錄賬號    免費注冊    關于我們    操作指南    常用工具     設為首頁    加入收藏    聯系我們
    網站首頁  ▲官方微信    ▲官方博客    ▲官方微博

 綜合搜索

 站內搜索
    當前位置:計算機教程 > 工具軟件 > 正文閱讀


Setup Factory 7 制作補丁初探


媒體:原創  作者:佚名
專業號:真逗  2010/1/12 7:06:19 發布


一直都想想試試用 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

媒體:原創  作者:佚名
專業號:真逗  2010/1/12 7:06:19 發布
0

我也說兩句
E-File帳號:用戶名: 密碼: [注冊]
評論:(內容不能超過500字,如果您不填寫用戶名和密碼只能以游客的身份發表評論。)

*評論內容將在30分鐘以后顯示!
版權聲明:
1.依據《服務條款》,本網頁發布的原創作品,版權歸發布者(即注冊用戶)所有;本網頁發布的轉載作品,由發布者按照互聯網精神進行分享,遵守相關法律法規,無商業獲利行為,無版權糾紛。
2.本網頁是第三方信息存儲空間,阿酷公司是網絡服務提供者,服務對象為注冊用戶。該項服務免費,阿酷公司不向注冊用戶收取任何費用。
  名稱:阿酷(北京)科技發展有限公司
  聯系人:李女士,QQ468780427
  網絡地址:www.arkoo.com
3.本網頁參與各方的所有行為,完全遵守《信息網絡傳播權保護條例》。如有侵權行為,請權利人通知阿酷公司,阿酷公司將根據本條例第二十二條規定刪除侵權作品。

 

  
宇翔微機外語學校

學員的成績是廣告

    熱點文章
專業號:真逗


真逗的最新文章:
Copyright (C) 1998-2024 版權所有 宇翔微機外語學校 All rights reserved  2014年12月1日改版  后臺管理
總校地址:黑龍江省鐵力市火車站前林業局團結路 122 號 2 樓(宇翔大街南、松濤道口路西)(原火車站前停車場北老管開發樓2樓遷此)
電話:0458-2387012  13504572966  E-mail:  yxwjwyxx@163.com    QQ:394035028    QQ:710002157
技術支持:北京宇翔盛文國際科貿有限公司技術部    QQ:767876168    E-Mail:  hljtlyx@163.com
          基于 E-file 技術構建 黑ICP備08003350號
WWW.1068X.COM