SFX的妙用——如何在不安装软件的情况下打开自定义格式文件?

前段时间看到群友讨论压缩包能不能运行,想起了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放在同一目录,主要包含四种类型:

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,删除所有未使用过的变量和属性;

  1. 避免在系统目录写文件和修改系统文件,避免写注册表等操作

  1. 对可执行程序以及所有依赖的类库进行强签名;

  1. 提交常用杀毒软件白名单;

  1. 最后一点,也是最重要的一点。前边几点只能缓解杀毒软件误报,要想彻底解决,就不要在生产环境使用自解压文件。

文章转载自:czwy

原文链接:https://www.cnblogs.com/czwy/p/17880475.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/255255.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】JS——Map数据类型

【JavaScript】JS——Map数据类型 什么是Map?特性Map与Object的比较 map的创建map的属性map相关方法map的遍历 什么是Map? 存储键值对的对象。 能够记住键的原始插入顺序任何值(对象或原始值)都可以作为键或值。 特性 Map中的一个键只能出现一次&am…

PAT乙级—1002 写出这个数(C语言)

读入一个正整数 n&#xff0c;计算其各位数字之和&#xff0c;用汉语拼音写出和的每一位数字。 输入样例&#xff1a; 1234567890987654321123456789 输出样例&#xff1a; yi san wu #include <stdio.h>int main() {char number[100] { \0 };int i 0, sum 0, n[8] {…

应用现代化加速企业数字化转型

目录 一、数字化转型的必要性 二、应用现代化的推动力 数字化时代&#xff0c;企业正面临着前所未有的挑战和机遇。为了保持竞争力&#xff0c;许多企业正在寻求数字化转型&#xff0c;以提升运营效率、优化客户体验、创新商业模式。本文将探讨如何通过应用现代化加速企业数字化…

c++11计时器chrono库

去实现一下开始说的高精度计时器&#xff1a; #ifndef _TimerClock_hpp_ #define _TimerClock_hpp_#include <iostream> #include <chrono>using namespace std; using namespace std::chrono;class TimerClock { public:TimerClock(){update();}~TimerClock(){}v…

MySQL和MongoDB简介以及它们之间的区别

本文主要介绍MySQL和MongoDB的简介以及它们之间的区别。 目录 MySQL简介MySQL的优缺点MySQL的应用场景MongoDB简介MongoDB的优缺点MongoDB的应用场景MySQL和MongoDB的区别 MySQL简介 MySQL是一种开源的关系型数据库管理系统&#xff0c;是世界上最流行的数据库之一。它支持多用…

如何选择合适水下应用的集成电缆传感器?

来源&#xff1a;宏集科技 工业物联网丨宏集干货 | 如何选择合适水下应用的集成电缆传感器&#xff1f; 原文链接&#xff1a;https://mp.weixin.qq.com/s/wbN40niOgpUHy1iSH9Ad3Q 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 前言 许多工业过程都要求将传感器浸…

使用高防IP防护有哪些优势

高防IP是针对互联网服务器在遭受大流量的DDoS攻击后导致服务不可用的情况下&#xff0c;推出的付费增值服务&#xff0c;用户可以通过配置高防IP&#xff0c;将攻击流量引流到高防IP&#xff0c;确保源站的稳定可靠。高防IP相当于搭建完转发的服务器。 高防IP有两种接入方式&a…

项目管理:为什么项目计划必不可少

项目管理计划定义了如何执行、监督和控制项目。项目计划让我们准确地知道在项目的每个阶段应该做什么&#xff0c;在哪里分配资源和时间&#xff0c;以及在事情超出计划或超出预算时要注意什么。 为了项目中获得成功&#xff0c;管理者需要在前期创建一个项目计划&#xff0c…

高速风筒解决方案,基于高性价比的普冉单片机开发

高速风筒也就是高速吹风机&#xff0c;与传统的吹风机相比&#xff0c;高速吹风机具有更强大的风力和更快的干燥速度&#xff0c;可以更快地干燥头发或其他物体表面的水分。它通常由一个电动机驱动&#xff0c;并通过旋转的叶片来产生气流。高速风筒广泛应用于个人护理、美容、…

【华为数据之道学习笔记】3-2 基础数据治理

基础数据用于对其他数据进行分类&#xff0c;在业界也称作参考数据。基础数据通常是静态的&#xff08;如国家、币种&#xff09;&#xff0c;一般在业务事件发生之前就已经预先定义。它的可选值数量有限&#xff0c;可以用作业务或IT的开关和判断条件。当基础数据的取值发生变…

antdesign前端一直加载不出来

antdesign前端一直加载不出来 报错&#xff1a;Module “./querystring” does not exist in container. while loading “./querystring” from webpack/container/reference/mf at mf-va_remoteEntry.js:751:11 解决方案&#xff1a;Error: Module “xxx“ does not exist …

网络层之IP组播

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…