SFX的妙用——如何在不安裝軟體的情況下打開自定義格式文件?

来源:https://www.cnblogs.com/czwy/archive/2023/12/06/17880475.html
-Advertisement-
Play Games

家中有閑置的小新,是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.sfx7zCon.sfx在7-Zip的安裝目錄中能找到,這兩個基本上沒什麼用,僅僅是完成雙擊自解壓功能,解壓完成之後沒有任何操作,即便是在Installer_Config配置文件中指定了需要執行的程式也沒作用。以下兩個圖分別是7z.sfx7zCon.sfx製作的自解壓文件解壓過程。
image
image

7zS.sfx7zSD.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,但是自解壓文件的圖標、文件說明、公司信息等文件屬性不是我們想要的,並且解壓過程的對話框樣式和內容也不符合預期。接下來需要美化自解壓文件。
image

美化自解壓文件

7z自帶的sfx以及幫助文檔提供的信息有限,可以通過7z SFX Builder實現更多的自定義操作。下載安裝後可以用圖形界面的方式自定義解壓過程對話框的樣式,並生成相應的Installer_Config信息。首先設置解壓文件覆蓋模式和對話框樣式。
image

然後根據實際情況選擇對話框具體的樣式信息。
image

接下來就是設置對話框的標題、解壓進度窗體、錯誤窗體、警告窗體的標題信息。
image

設置完標題信息後就是設置對話框內的各種信息內容。
image

再然後就是配置解壓後執行文件以及參數信息。
image

配置完這些信息之後,可以在“output”下看到Installer_Config信息,我們可以複製保存下來以備後用。需要註意的是,Installer_Config配置文件以;!@InstallEnd@!結束,從“output”中複製信息時,;!@InstallEnd@!後邊還有內容就不要複製了。
image

7z SFX Builder也提供了更多的sfx模塊供選擇,這些模塊保存在C:\Program Files (x86)\7z SFX Builder\3rdParty\Modules目錄下,
image

選擇了sfx模塊後可以設置文件說明、公司信息等屬性。這也決定了最終製作的自解壓文件的文件屬性。
image

到了這裡,我們離大功告成只剩下修改圖標這一步了。這時需要藉助Resource Hacker來修改圖標信息,如果上一步中沒有編輯sfx模塊的信息,也可以在這裡通過Resource Hacker修改。我們只需準備好ico文件,然後在Resource Hacker打開sfx模塊,並替換圖標文件或編輯版本信息,完成後保存sfx模塊文件。至此就完成了自解壓文件的美化工作。
image

小結

文中只介紹了7z SFX Builder的基本用法,它的幫助文檔提供了更多的操作說明以及示例。
自解壓文件在某些特定的場景給我們提供了便利,但也容易被殺毒軟體當成病毒處理。我在實現開篇提到的“需求”時,也飽受殺毒軟體困擾。最後分享幾點經驗:

  1. 對自解壓文件中的可執行程式及依賴文件進行code review,刪除所有未使用過的變數和屬性;
  2. 避免在系統目錄寫文件和修改系統文件,避免寫註冊表等操作
  3. 對可執行程式以及所有依賴的類庫進行強簽名;
  4. 提交常用殺毒軟體白名單;
  5. 最後一點,也是最重要的一點。前邊幾點只能緩解殺毒軟體誤報,要想徹底解決,就不要在生產環境使用自解壓文件。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上篇文章講述了C#多線程知識點,本文將介紹C#處理文件的知識點。在.NET開發領域,文件系統I/O是一個至關重要的主題,尤其是在處理文件、目錄和數據存儲方面。C#作為.NET平臺的主要編程語言,提供了豐富而強大的文件系統I/O功能,為開發人員提供了靈活的工具,使其能夠高效地處理文件操作。本文將介紹C ...
  • CPF 是開源的C#跨平臺UI框架,支持使用OpenGL來渲染,可以用來硬體加速播放視頻或者顯示3D模型 實現原理其實就是Skia用OpenGL後端,Skia里綁定GLView的OpenGL紋理,將紋理作為Skia的圖像混合繪製。 在CPF里使用OpenGL,不能選擇NetCore3.0和Net4, ...
  • .net平臺使用SDK快速對接各大語言模型 1.項目介紹 最近,在做GPT項目時,發現各個平臺的介面規範和參數不同,需要根據不同平臺和模型寫多種介面,比較麻煩,不想Python那樣有豐富和方便的AI環境, 如果c#有一個SDK可以方便調用各種平臺模型就好了,這是AllInAI.Sharp.API萌芽 ...
  • WPF應用中,控制項本身也可以通過實現事件代碼實現拖動的處理,不過如果我們使用GongSolutions.WPF.DragDrop來處理,事情會變得更加簡單輕鬆,它支持很多控制項的拖動處理,如ListBox, ListView, TreeView, DataGrid等源自ItemsControl的控制項,... ...
  • 一、條件 1、windows server主機一臺,我是windows server 2019(當然windows10或者10月份5日更新的windows11也是可以行的)。 2、SQL Sever,我用的是SQL Server2019。 3、Power BI Report Server預設位置安裝 ...
  • Parallel.ForEach Parallel.ForEach 是一個用於在集合上並行執行迭代操作的強大工具。它通過有效地利用多核處理器的能力來提高性能。Parallel.ForEach 不僅能夠簡化並行編程,而且它在執行簡單迴圈時可以提供比傳統迭代更好的性能。 下麵是一個簡單的示例,演示瞭如何 ...
  • 版本 Linux 6.5 背景 在學習cgroupv2的時候,想給子cgroup開啟cpu控制器結果失敗了: # 查看可以開啟哪些控制器 root@ubuntu-vm:/sys/fs/cgroup# cat cgroup.controllers cpuset cpu io memory hugetl ...
  • 使用 ssh-keygen 生成密鑰 參考資料 https://learn.microsoft.com/zh-cn/azure/virtual-machines/linux/create-ssh-keys-detailed 快速開始 以下 ssh-keygen 命令預設在 ~/.ssh 目錄中生成 ...
一周排行
    -Advertisement-
    Play Games
  • 下麵是一個標準的IDistributedCache用例: public class SomeService(IDistributedCache cache) { public async Task<SomeInformation> GetSomeInformationAsync (string na ...
  • 這個庫提供了在啟動期間實例化已註冊的單例,而不是在首次使用它時實例化。 單例通常在首次使用時創建,這可能會導致響應傳入請求的延遲高於平時。在註冊時創建實例有助於防止第一次Request請求的SLA 以往我們要在註冊的時候實例單例可能會這樣寫: //註冊: services.AddSingleton< ...
  • 最近公司的很多項目都要改單點登錄了,不過大部分都還沒敲定,目前立刻要做的就只有一個比較老的項目 先改一個試試手,主要目標就是最短最快實現功能 首先因為要保留原登錄方式,所以頁面上的改動就是在原來登錄頁面下加一個SSO登錄入口 用超鏈接寫的入口,頁面改造後如下圖: 其中超鏈接的 href="Staff ...
  • Like運算符很好用,特別是它所提供的其中*、?這兩種通配符,在Windows文件系統和各類項目中運用非常廣泛。 但Like運算符僅在VB中支持,在C#中,如何實現呢? 以下是關於LikeString的四種實現方式,其中第四種為Regex正則表達式實現,且在.NET Standard 2.0及以上平... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他們的程式記憶體會偶發性暴漲,自己分析了下是非托管記憶體問題,讓我幫忙看下怎麼回事?哈哈,看到這個dump我還是非常有興趣的,居然還有這種游戲幣自助機類型的程式,下次去大玩家看看他們出幣的機器後端是不是C#寫的?由於dump是linux上的程式,剛好win ...
  • 前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
  • 上一次的介紹,主要圍繞如何統一去捕獲異常,以及為每一種異常添加自己的Mapper實現,並且我們知道,當在ExceptionMapper中返回非200的Response,不支持application/json的響應類型,而是寫死的text/plain類型。 Filter為二方包異常手動捕獲 參考:ht ...
  • 大家好,我是R哥。 今天分享一個爽飛了的面試輔導 case: 這個杭州兄弟空窗期 1 個月+,面試了 6 家公司 0 Offer,不知道問題出在哪,難道是杭州的 IT 崩盤了麽? 報名面試輔導後,經過一個多月的輔導打磨,現在成功入職某上市公司,漲薪 30%+,955 工作制,不咋加班,還不捲。 其他 ...
  • 引入依賴 <!--Freemarker wls--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency> ...
  • 你應如何運行程式 互動式命令模式 開始一個互動式會話 一般是在操作系統命令行下輸入python,且不帶任何參數 系統路徑 如果沒有設置系統的PATH環境變數來包括Python的安裝路徑,可能需要機器上Python可執行文件的完整路徑來代替python 運行的位置:代碼位置 不要輸入的內容:提示符和註 ...