家中有閑置的小新,是A卡正好合適裝linux 安裝前 關閉安全引導 通過關機鍵旁邊的重置口重新開機 OR 在開機界面按F2(開啟Hotkey 模式的要按Fn+F2) 進入BIOS 設置界面,關閉Secure Boot,這樣方便安裝linux 系統刻錄 linux有很多發行版 大家可以自行選擇,推薦U ...
前段時間看到群友討論壓縮包能不能運行,想起了n年前用自解壓文件SFX實現的一個“需求”:在沒有安裝任何應用軟體的Windows(當時還要支持XP)上能雙擊打開自定義格式的文件。當時第一反應是這“需求”太奇葩了,簡直是不可能。但思考後認為這個“需求”存在一定的合理性,因為當時的目標用戶群體並不能熟練使用電腦,可能不知道打開一個文件需要安裝對應的軟體。
這裡“需求”之所以打上引號,是因為我覺得這不是真正的需求,而是一個解決方案,真正的需求是如何讓不熟悉電腦操作的用戶方便的使用我們自定義格式的文件。
實施方案
Windows系統的註冊表中會記錄文件格式與對應軟體的關聯關係,雙擊文件時會找到關聯的軟體運行並載入文件。而這個文件與軟體的關聯信息是在安裝應用程式時寫進註冊表的。正因如此,一開始覺得“需求”簡直是不可能的。經過一番思考,嘗試把自定義格式的文件和應用程式打包到一起形成一個exe,雙擊exe時釋放應用程式和文件,並運行應用程式載入文件。具體到實施上有兩種選擇:用NSIS或者MSI打包工具生成安裝包,用壓縮軟體製作SFX自解壓文件。考慮到第一種方式依賴項較多且代碼調用不方便,最後選擇了自解壓文件的方式。
自解壓文件
自解壓SFX(self extracting)文件是壓縮文件的一種,其尾碼名是exe。它可以不藉助任何壓縮工具,只需雙擊該文件就可以自動執行解壓,並根據配置執行解壓後的可執行程式(EXE)。WinRAR和7-Zip都可以製作自解壓文件。這裡以7-Zip為例介紹如何製作自解壓文件。自解壓安裝包必須包含三個文件:7z_Archive,SFX_Module, Installer_Config。
- 7z_Archive:用7z打包歸檔好的文件(希望放到自解壓文件中的程式和文件)
- SFX_Module:自解壓文件的核心模塊,必須與7z.exe放在同一目錄,主要包含四種類型:
SFX_Module | 說明 |
---|---|
7z.sfx | 帶有GUI的自解壓模塊 |
7zCon.sfx | 提供Console視窗交互的自解壓模塊 |
7zS.sfx | 允許創建安裝程式的帶GUI的自解壓模塊 |
7zSD.sfx | 允許創建安裝程式的帶GUI的自解壓模塊(使用MSVCRT.dll) |
7z.sfx
和7zCon.sfx
在7-Zip的安裝目錄中能找到,這兩個基本上沒什麼用,僅僅是完成雙擊自解壓功能,解壓完成之後沒有任何操作,即便是在Installer_Config
配置文件中指定了需要執行的程式也沒作用。以下兩個圖分別是7z.sfx
和7zCon.sfx
製作的自解壓文件解壓過程。
7zS.sfx
和7zSD.sfx
則需要從官網下載 LZMA SDK
包獲取。這兩個製作的自解壓文件會把打包的文件釋放到用戶的臨時目錄,然後根據Installer_Config
配置文件執行指定程式,程式結束後會刪除臨時文件。製作自解壓文件的命令如下:
copy /b 7zS.sfx + config.txt + archive.7z archive.exe
- Installer_Config:這個配置文件包含了自解壓文件對話框的標題,信息,解壓完成後執行的文件和參數等信息。文件以
;!@Install@!UTF-8!
開始,並以;!@InstallEnd@!
結束,且必須是用UTF-8編碼。具體包含的配置信息內容參見7-Zip的幫助文檔,以下是配置文件的示例:
;!@Install@!UTF-8!
Title="7-Zip 4.00"
BeginPrompt="自解壓文件測試,是否繼續?"
RunProgram="7zFM.exe"
;!@InstallEnd@!
下圖是7zS.sfx
配置了製作的自解壓文件解壓過程。雖然實現了雙擊自解壓後運行指定的7zFM.exe
,但是自解壓文件的圖標、文件說明、公司信息等文件屬性不是我們想要的,並且解壓過程的對話框樣式和內容也不符合預期。接下來需要美化自解壓文件。
美化自解壓文件
7z自帶的sfx以及幫助文檔提供的信息有限,可以通過7z SFX Builder實現更多的自定義操作。下載安裝後可以用圖形界面的方式自定義解壓過程對話框的樣式,並生成相應的Installer_Config
信息。首先設置解壓文件覆蓋模式和對話框樣式。
然後根據實際情況選擇對話框具體的樣式信息。
接下來就是設置對話框的標題、解壓進度窗體、錯誤窗體、警告窗體的標題信息。
設置完標題信息後就是設置對話框內的各種信息內容。
再然後就是配置解壓後執行文件以及參數信息。
配置完這些信息之後,可以在“output”下看到Installer_Config
信息,我們可以複製保存下來以備後用。需要註意的是,Installer_Config
配置文件以;!@InstallEnd@!
結束,從“output”中複製信息時,;!@InstallEnd@!
後邊還有內容就不要複製了。
7z SFX Builder也提供了更多的sfx模塊供選擇,這些模塊保存在C:\Program Files (x86)\7z SFX Builder\3rdParty\Modules
目錄下,
選擇了sfx模塊後可以設置文件說明、公司信息等屬性。這也決定了最終製作的自解壓文件的文件屬性。
到了這裡,我們離大功告成只剩下修改圖標這一步了。這時需要藉助Resource Hacker來修改圖標信息,如果上一步中沒有編輯sfx模塊的信息,也可以在這裡通過Resource Hacker
修改。我們只需準備好ico文件,然後在Resource Hacker
打開sfx模塊,並替換圖標文件或編輯版本信息,完成後保存sfx模塊文件。至此就完成了自解壓文件的美化工作。
小結
文中只介紹了7z SFX Builder的基本用法,它的幫助文檔提供了更多的操作說明以及示例。
自解壓文件在某些特定的場景給我們提供了便利,但也容易被殺毒軟體當成病毒處理。我在實現開篇提到的“需求”時,也飽受殺毒軟體困擾。最後分享幾點經驗:
- 對自解壓文件中的可執行程式及依賴文件進行code review,刪除所有未使用過的變數和屬性;
- 避免在系統目錄寫文件和修改系統文件,避免寫註冊表等操作
- 對可執行程式以及所有依賴的類庫進行強簽名;
- 提交常用殺毒軟體白名單;
- 最後一點,也是最重要的一點。前邊幾點只能緩解殺毒軟體誤報,要想徹底解決,就不要在生產環境使用自解壓文件。