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
  • 最近做項目過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的C#庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發 ...
  • 前言 MediatR 是 .NET 下的一個實現消息傳遞的庫,輕量級、簡潔高效,用於實現進程內的消息傳遞機制。它基於中介者設計模式,支持請求/響應、命令、查詢、通知和事件等多種消息傳遞模式。通過泛型支持,MediatR 可以智能地調度不同類型的消息,非常適合用於領域事件處理。 在本文中,將通過一個簡 ...
  • 前言 今天給大家推薦一個超實用的開源項目《.NET 7 + Vue 許可權管理系統 小白快速上手》,DncZeus的願景就是做一個.NET 領域小白也能上手的簡易、通用的後臺許可權管理模板系統基礎框架。 不管你是技術小白還是技術大佬或者是不懂前端Vue 的新手,這個項目可以快速上手讓我們從0到1,搭建自 ...
  • 第1章:WPF概述 本章目標 瞭解Windows圖形演化 瞭解WPF高級API 瞭解解析度無關性概念 瞭解WPF體繫結構 瞭解WPF 4.5 WPF概述 ​ 歡迎使用 Windows Presentation Foundation (WPF) 桌面指南,這是一個與解析度無關的 UI 框架,使用基於矢 ...
  • 在日常開發中,並不是所有的功能都是用戶可見的,還在一些背後默默支持的程式,這些程式通常以服務的形式出現,統稱為輔助角色服務。今天以一個簡單的小例子,簡述基於.NET開發輔助角色服務的相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 第3章:佈局 本章目標 理解佈局的原則 理解佈局的過程 理解佈局的容器 掌握各類佈局容器的運用 理解 WPF 中的佈局 WPF 佈局原則 ​ WPF 視窗只能包含單個元素。為在WPF 視窗中放置多個元素並創建更貼近實用的用戶男面,需要在視窗上放置一個容器,然後在這個容器中添加其他元素。造成這一限制的 ...
  • 前言 在平時項目開發中,定時任務調度是一項重要的功能,廣泛應用於後臺作業、計劃任務和自動化腳本等模塊。 FreeScheduler 是一款輕量級且功能強大的定時任務調度庫,它支持臨時的延時任務和重覆迴圈任務(可持久化),能夠按秒、每天/每周/每月固定時間或自定義間隔執行(CRON 表達式)。 此外 ...
  • 目錄Blazor 組件基礎路由導航參數組件參數路由參數生命周期事件狀態更改組件事件 Blazor 組件 基礎 新建一個項目命名為 MyComponents ,項目模板的交互類型選 Auto ,其它保持預設選項: 客戶端組件 (Auto/WebAssembly): 最終解決方案裡面會有兩個項目:伺服器 ...
  • 先看一下效果吧: isChecked = false 的時候的效果 isChecked = true 的時候的效果 然後我們來實現一下這個效果吧 第一步:創建一個空的wpf項目; 第二步:在項目裡面添加一個checkbox <Grid> <CheckBox HorizontalAlignment=" ...
  • 在編寫上位機軟體時,需要經常處理命令拼接與其他設備進行通信,通常對不同的命令封裝成不同的方法,擴展稍許麻煩。 本次擬以特性方式實現,以兼顧維護性與擴展性。 思想: 一種命令對應一個類,其類中的各個屬性對應各個命令段,通過特性的方式,實現其在這包數據命令中的位置、大端或小端及其轉換為對應的目標類型; ...