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
  • 前言 微服務架構已經成為搭建高效、可擴展系統的關鍵技術之一,然而,現有許多微服務框架往往過於複雜,使得我們普通開發者難以快速上手並體驗到微服務帶了的便利。為瞭解決這一問題,於是作者精心打造了一款最接地氣的 .NET 微服務框架,幫助我們輕鬆構建和管理微服務應用。 本框架不僅支持 Consul 服務註 ...
  • 先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 前言 大家好,推薦一個.NET 8.0 為核心,結合前端 Vue 框架,實現了前後端完全分離的設計理念。它不僅提供了強大的基礎功能支持,如許可權管理、代碼生成器等,還通過採用主流技術和最佳實踐,顯著降低了開發難度,加快了項目交付速度。 如果你需要一個高效的開發解決方案,本框架能幫助大家輕鬆應對挑戰,實 ...