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
  • 背景 在瀏覽器中訪問本地靜態資源html網頁時,可能會遇到跨域問題如圖。 是因為瀏覽器預設啟用了同源策略,即只允許載入與當前網頁具有相同源(協議、功能變數名稱和埠)的內容。 WebView2預設情況下啟用了瀏覽器的同源策略,即只允許載入與主機相同源的內容。所以如果我們把靜態資源發佈到iis或者通過node ...
  • 最近看幾個老項目的SQL條件中使用了1=1,想想自己也曾經這樣寫過,略有感觸,特別拿出來說道說道。編寫SQL語句就像炒菜,每一種調料的使用都會影響菜品的最終味道,每一個SQL條件的加入也會影響查詢的執行效率。那麼 1=1 存在什麼樣的問題呢?為什麼又會使用呢? ...
  • 好久不見,我又回來了。 給大家分享一個我最近使用c#代碼操作ftp伺服器的代碼示例: 1 public abstract class FtpOperation 2 { 3 /// <summary> 4 /// FTP伺服器地址 5 /// </summary> 6 private string f ...
  • 一:背景 1. 講故事 過年喝了不少酒,腦子不靈光了,停了將近一個月沒寫博客,今天就當新年開工寫一篇吧。 去年年初有位朋友找到我,說他們的系統會偶發性崩潰,在網上也發了不少帖子求助,沒找到自己滿意的答案,讓我看看有沒有什麼線索,看樣子這是一個牛皮蘚的問題,既然對方有了dump,那就分析起來吧。 二: ...
  • 自己製作的一個基於Entity Framework Core 的資料庫操作攔截器,可以列印資料庫執行sql,方便開發調試,代碼如下: /// <summary> /// EF Core 的資料庫操作攔截器,用於在資料庫操作過程中進行日誌記錄和監視。 /// </summary> /// <remar ...
  • 本文分享自華為雲社區《Go併發範式 流水線和優雅退出 Pipeline 與 Cancellation》,作者:張儉。 介紹 Go 的併發原語可以輕鬆構建流數據管道,從而高效利用 I/O 和多個 CPU。 本文展示了此類pipelines的示例,強調了操作失敗時出現的細微之處,並介紹了乾凈地處理失敗的 ...
  • 在上篇文章中,我們介紹到在多線程環境下,如果編程不當,可能會出現程式運行結果混亂的問題。出現這個原因主要是,JMM 中主記憶體和線程工作記憶體的數據不一致,以及多個線程執行時無序,共同導致的結果。 ...
  • 1、下載安裝包首先、進入官網下載安裝包網址:https://www.python.org/downloads/windows/下載步驟:進入下載地址,根據自己的電腦系統選擇相應的python版本 選擇適配64位操作系統的版本(查看自己的電腦操作系統版本), 點擊下載安裝包 也可以下載我百度雲分享的安 ...
  • 簡介 git-commit-id-maven-plugin 是一個maven 插件,用來在打包的時候將git-commit 信息打進jar中。 這樣做的好處是可以將發佈的某版本和對應的代碼關聯起來,方便查閱和線上項目的維護。至於它的作用,用官方說法,這個功能對於大型分散式項目來說是無價的。 功能 你 ...
  • 序言 在數字時代,圖像生成技術正日益成為人工智慧領域的熱點。 本討論將重點聚焦於兩個備受矚目的模型:DALL-E和其他主流AI繪圖方法。 我們將探討它們的優勢、局限性以及未來的發展方向。通過比較分析,我們期望能夠更全面地瞭解這些技術,為未來的研究和應用提供啟示。 Q: 介紹一下 dall-e Ope ...