最近需要進行程序打包,發現setup factory是個比較好用的軟件,有詳細的API文檔可以查閱,整理了一下在打包過程中用到的基本操作跟大家分享:
1、註冊表基本操作(讀、寫),爲了解決程序重複安裝的問題
在action的on startup中寫入代碼(如何寫入註冊表在文章下邊):
--這裏是對註冊表進行檢查,檢查是否有該註冊表
--檢查註冊表:
local Key = Registry.DoesKeyExist(HKEY_LOCAL_MACHINE, "software\\隨便起個名字\\XX軟件(用英文最好)");
local productName = SessionVar.Expand("%ProductName%");
if (Key == true) then
local diaInfo = Dialog.Message(ProductName, String.Concat("檢測到已安裝","如需重新安裝,請先卸載軟件"), MB_OKCANCEL, MB_ICONQUESTION, MB_DEFBUTTON1);
--無論選擇確定還是取消,都退出程序
Application.Exit();
end
2、在安裝過程中安裝軟件需要的環境,比如VS2010,13等等
首先需要導入環境文件,
//添加環境文件
點擊上邊菜單欄的Resources,然後選擇Primer Files,然後添加你的文件就好。
在on pre install中寫入代碼
--安裝過程中,安裝環境
--此處的vcredist_x64.exe就是上邊剛剛添加的文件的文件名,不要寫錯了,不然就報錯了
Shell.Execute(_TempLaunchFolder.."vcredist_x64.exe");
3、寫入註冊表
--過程中寫入註冊表
--寫入的註冊表名字,和檢測的註冊表名字一致就行了
Registry.CreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\自己起的名字\自己起的名字");
4、創建卸載文件,因爲setup factory的uninstall是要給參數的,所以需要自己生成一個卸載快捷方式,這一步比較cao淡,有很多坑,網上的教程大多都埋了坑
--在on Post Install中寫入代碼
--創建卸載
--注意下邊的斜槓還有反斜槓以及單引號包着雙引號
Shell.CreateShortcut(SessionVar.Expand("%AppFolder%"),
SessionVar.Expand("卸載%ProductName"),
SessionVar.Expand("%AppFolder%\\uninstall.exe"),
SessionVar.Expand('"/U:%AppFolder%\\Uninstall\\uninstall.xml"'),
SessionVar.Expand("%AppFolder%"),
SessionVar.Expand("%AppFolder%\\uninstall.exe"),
0,
SW_SHOWNORMAL,
nil,
"");
5、卸載軟件時需要刪除註冊表
--卸載時:
--在uninstall的actions的on Post Uninstall中寫
--刪除註冊表
Registry.DeleteKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\註冊表名字\\註冊表名字");
6、防止程序運行過程中被刪除
--寫個函數,好看一些
function CheckProcessStatus(process_name)
--獲取當前所有進程的列表
local processes_list = Window.EnumerateProcesses(false);
--判斷是否找到該進程名稱
local process_find = false;
--進程句柄,如果需要關閉進程,需要獲取,如果不需要不獲取也可以
local process_handle = nil;
local productName = SessionVar.Expand("%ProductName%");
if Table.Count(tblProcesses) > 0 then
local process_name_tem;
local handle_tem;
for handle_tem,process_name_tem in pairs(processes_list) do
if(String.Find(process_name_tem,process_name,1,false) ~= -1) then
process_handle = handle_tem;
process_find = true;
end
end
end
if(process_find and process_handle)then
--關閉進程
Window.Close(process_handle,CLOSEWND_TERMINATE);
--或者進行彈框提示
--local diaInfo = Dialog.Message(ProductName, String.Concat("程序正在運行中","如請先退出程序在進行卸載"), MB_OKCANCEL, MB_ICONQUESTION, MB_DEFBUTTON1);
--Application.Exit();
end
end
--使用該函數進行檢測即可
CheckProcessStatus("XXX.exe");