接上一篇 繼續使用上一篇的project 。將archive裏無用的文件刪除 添加咱們須要的文件進來。 c++
config是一個文本文件。 注意全部文件的 destination都是 %appfolder% ,這表明程序 安裝目錄 setupfactory有不少這樣的 全局變量 用起來很是方便 ,獲取系統環境桌面目錄 %desktop% 。 這相似 win批處理命令的%windir% 咱們把目錄改一下 %appfolder%\tools,這樣安裝時就可再建立子文件夾tools。app
咱們確確實實 想定義一個咱們本身獨有的 用戶體驗好的 安裝包 ,咱們不想千篇一概。框架
在screens ->before installing 選項卡:函數
把welcome to setup 刪掉,而後在license agreement編寫咱們本身的 安裝許可文本: 工具
咱們須要自定義一個對話框界面 用來讓用戶在安裝過程當中進行配置。在安裝時也將針對用戶的配置進行相應的處理。
添加一個咱們自定義的安裝配置界面:加密
User information ,Select shortcut folder 兩屏也一併刪掉。 lua
在建立custom Screen的時候 「下一步」按鈕的 腳本(單擊 screens ->before installing -> 選中custom ->ecit->actions- >On Next 選項卡):spa
1 -- These actions are performed when the Next button is clicked. 2 -- advance to the next screen 3 --採集數據 並放到全局變量裏 4 --端口 5 port = DlgEditField.GetProperties(CTRL_EDIT_01).Text; 6 --啓動菜單加快捷方式 7 startup = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_01).Checked; 8 --桌面快捷方式 9 desktop = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_02).Checked; 10 --%StartupFolder% 11 runnow = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_03).Checked; 12 --是否有加密狗 13 softkey=DlgCheckBox.GetProperties(CTRL_CHECK_BOX_04).Checked; 14 --Dialog.Message("title ddf",txport.Text); 15 Screen.Next();
這個很簡單 就是獲取幾個控件的值 並賦給變量,以便在稍後的過程當中使用。.net
而後就是安裝過程當中針對用戶的選項進行處理 ,安裝過程不就是 他自動生成的 拷文件麼 。要咱們管毛線啊。我這裏只是一個示範 咱們根據用戶選項追加配置文件 也就是config.ini 。首先執行此代碼時 文件已經複製完畢 ,配置文件的目錄在 %appfolder% 寫文本文件 這樣便可。設計
仍是 screens-> after installing ->ecit->actions->onPreLoad:
1 -- These actions are performed before the screen is shown. 2 --安裝完成 進行初始化全局變量裏面的配置 3 --端口,追加配置文件 4 TextFile.WriteFromString(SessionVar.Expand("%AppFolder%\\config.ini"), "\r\nport="..port, true); 5 --有無加密狗 6 if softkey then 7 TextFile.WriteFromString(SessionVar.Expand("%AppFolder%\\config.ini"), "\r\nhardwareIdType=softkey", true); 8 end 9 10 if startup then 11 Shell.CreateShortcut("%StartupFolder%", "DcmPrintSCP", SessionVar.Expand("%AppFolder%\\NewScp.exe"), "", "%AppFolder%", "", 0, SW_SHOWNORMAL, nil, "shortcut for dcmprintscp"); 12 end 13 --根據複選框選項建立快捷方式 的代碼 這樣就能夠了。 14 if desktop then 15 Shell.CreateShortcut("%DesktopFolder%", "DcmPrintSCP", SessionVar.Expand("%AppFolder%\\NewScp.exe"), "", "%AppFolder%", "", 0, SW_SHOWNORMAL, nil, "shortcut for dcmprintscp"); 16 end 17 18 --卸載程序有問題 必須得新建一個快捷方式 19 Shell.CreateShortcut("%AppFolder%", "shortcut_uninstall", SessionVar.Expand("%AppFolder%\\uninstall.exe"), SessionVar.Expand("\"/U:%AppFolder%\\Uninstall\\uninstall.xml\"" ), "", "", 0, SW_SHOWNORMAL, nil, "shortcut for uninstall");
須要注意的:
字符串鏈接 是 ..這種方式 ,並非C++裏尋常的+號 也不是 VB裏的& 連字符。
還有些須要注意的是 類vb 語法 並不是徹底跟vb同樣 ,好比這段
if startup then
xxx
End
最後咱們須要 本身搞一個banner 我已經搞好了 ,既然作東西就要注重細節。
程序啓動時顯示安裝許可 ,而後是用戶自定義配置選項 而後是選擇安裝目錄。而後安裝程序釋放咱們打包的文件到指定目錄。 而後咱們的腳步根據用戶定義的配置選項追加配置文件 和建立桌面快捷方式 ,而且用戶沒有.netFramework框架 自動安裝。就這樣一個安裝包就作好了。像我這種需求 基本上 大部分功能我都用不完 只是冰山一角。
我在這bilibili的半天 你都不厭其煩的看完了 你再 根據本身的實際需求 , 再啃啃幫助文檔 就差很少了。
2016.8.24 時至今日 應公司業務需求 沒想到我又在倒騰這玩意 。有看到了之前沒注意到的東西 ,就像書樣 從新讀一遍又是一番滋味。
我說這腳本怎麼這麼靈活 這麼強大呢,原來這腳本名叫LUA 是一種開源的通過成熟發展的東東,而且能夠與C++寫的dll造成互操做調用。
只是這玩意寫起來 找了半天 沒什麼工具 既沒提示又沒啥的 純記事本的方式寫 太tm蛋疼了。
你看博客的代碼插入選項裏都有Lua 是我兩年前沒發現他麼
之前一直 打包系統必備項 打包系統必備項進安裝包裏 ,而後怎麼怎麼實現自動安裝系統必備項。如今重要找到方式了 ,根本用不着倒騰dependencies
直接resources菜單 primer files 把.net安裝文件加進去 ,界面上說了 執行的時候會自定釋放到臨時目錄。
用註冊表功能 檢測.net是否安裝:
1 --.net版本檢測 2 3 dotnetVers=Registry.GetKeyNames(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\"); 4 if (dotnetVers~= nil) then 5 for j,k in pairs(dotnetVers) do 6 if (String.Find(k,"4.0",1,false)~= -1) then 7 dotnetVer="4.0" 8 elseif (String.Find(k,"4.5",1,false)~= -1) then 9 dotnetVer="4.5" 10 end 11 end 12 end
還有須要值得注意的是,在這個設計界面隨意插入控件:
按鈕的事件在這裏: ,先點到action去
而後on ctr message 便是按鈕事件代碼:
找到附加文件的釋放目錄並進行自動安裝,之前不知道這玩意執行時還能夠帶參數進行靜默安裝:
1 Shell.Execute(SessionVar.Expand("%TempLaunchFolder%\\NetFramework4.0.exe"), "open", " /passive", "", SW_SHOWNORMAL, true)
經過SetProperties函數更改控件的值 顯示隱藏等 ,經過GetProperties 獲取值。
DlgEditField.SetProperties
記住 lua 還能夠調用c++擴展。
基本上經過以上手段 加上lua強大的腳本控制邏輯 還有c++擴展的配合,你要製做什麼樣的安裝包程序應該均可以倒騰出來 。
兩個字 倒騰