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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一对多聊天

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

两种做法——判断是否是二叉搜索树

https://leetcode.cn/problems/validate-binary-search-tree/description/?envTypestudy-plan-v2&envIdtop-interview-150 方法一&#xff1a;中序遍历 考虑只有两个节点和一个结点的情况&#xff0c;可以头尾各加一个最大最小值&#xff0c;不用特判了&#xff0c;也可…

流量分析1--菜刀666

1&#xff1a;菜刀666&#xff1a; 题目描述 分析流量包&#xff0c;过滤http数据流 追踪TCP数据流 对比第5个流和第7个流发现&#xff0c;同样的目录下 多出了6666.jpg。猜测是由攻击者上传&#xff0c;直接在请求包里搜索FFD8--FFD9 保存为1.jpg 利用foremost工具对1.jpg进…

Vis.js教程(四):给关系图的节点设置Image背景

1、引言 在Vis.js教程三中我们介绍了如何给关系图设置关系指向以及关系标签。 本节我们计划给关系图节点设置背景&#xff0c;拿菲尼克斯太阳队关系图的例子来说&#xff0c;如果给每一个球员节点都加上图片&#xff0c;这样看起来远远比名称更直观。 2、添加节点背景图片 …

phpStudy本地快速搭建网站,实现无公网IP固定地址远程访问

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

【无线网络技术】——无线局域网(学习笔记)

&#x1f4d6; 前言&#xff1a;本章首先介绍无线局域网的基本概念&#xff0c;然后详细介绍IEEE 802.11的基本工作原理&#xff0c;侧重于媒体访问控制和一跳范围内的通信技术。 目录 &#x1f552; 1. 概述&#x1f558; 1.1 覆盖范围&#x1f558; 1.2 特点&#x1f558; 1.…

设计新手利器!10款Windows免费设计软件推荐

1.即时设计 即时设计是国内首款协作式 UI 设计工具&#xff0c;更是同类产品中首先实现百万用户的设计软件。作为国产软件&#xff0c;即时设计的全中文操作系统和多设备平台的使用支持让它更加符合国内设计师的使用习惯。同时&#xff0c;即时设计也为用户提供了强大的功能支…

HarmonyOS开发(十):通知和提醒

1、通知概述 1.1、简介 应用可以通过通知接口发送通知消息&#xff0c;终端用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用。 通知使用的的常见场景&#xff1a; 显示接收到的短消息、即使消息...显示应用推送消息显示当前正在进行的事件&#xff0c…

Apache+mod_jk模块代理Tomcat容器

一、背景介绍 最近在看Tomcat运行架构原理, 正好遇到了AJP协议(Apache JServ Protocol). 顺道来研究下这个AJP协议和具体使用方法. 百度百科是这么描述AJP协议的: AJP&#xff08;Apache JServ Protocol&#xff09;是定向包协议。因为性能原因&#xff0c;使用二进制格式来传输…

剧本杀小程序搭建:打造线上剧本杀新体验

剧本杀是一款以角色扮演为主的游戏&#xff0c;一度成为了年轻人的最喜爱的社交游戏。在剧本杀市场需求下&#xff0c;剧本杀规模也迅速上升。今年第一季度&#xff0c;剧本杀市场规模环比增长47%&#xff0c;市场整体消费水平逐渐呈上升趋势。 随着剧本杀的不断发展&#xff…

通用plantuml 时序图(Sequence Diagram)模板头

通用plantuml文件 startuml participant Admin order 0 #87CEFA // 参与者、顺序、颜色 participant Student order 1 #87CEFA participant Teacher order 2 #87CEFA participant TestPlayer order 3 #87CEFA participant Class order 4 #87CEFA participant Subject order …

Google官方推广工具及其用法

Google的官方推广工具是一系列强大的在线广告工具&#xff0c;也就是说在帮助企业主通过Google搜索引擎和其他合作伙伴网站上展示他们的广告&#xff0c;吸引更多的潜在客户。本文小编讲一些常用的Google官方推广工具及其用法。 1、Google Ads Google Ads是最受欢迎和广泛使用的…

一次显著的性能提升,从8s到0.7s

前言 最近我在公司优化了一些慢查询SQL&#xff0c;积累了一些SOL调优的实战经验。 这篇文章从实战的角度出发&#xff0c;给大家分享一下如何做SQL调优。 经过两次优化之后&#xff0c;慢SQL的性能显著提升了&#xff0c;耗时从8s优化到了0.7s。 现在拿出来给大家分享一下…

数据结构与算法编程题50

假设不带权有向图采用邻接矩阵G存储&#xff0c;设计实现以下功能的算法。 &#xff08;1&#xff09;求出图中每个顶点的出度。 &#xff08;2&#xff09;求出图中出度为0的顶点数。 &#xff08;3&#xff09;求出图中每个顶点的入度。 //参考博客&#xff1a;https://blog.…

Java程序员,你掌握了多线程吗?

文章目录 01 多线程对于Java的意义02 为什么Java工程师必须掌握多线程03 Java多线程使用方式04 如何学好Java多线程写作末尾 摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#xff0c;还是在线视频平台的流…

想转行IT,有前途嘛?30个详细理由中会得到你想要的答案

目录 前言&#xff1a; 一、转行IT的前景 二、IT行业的情况 三、技能需求 四、如何准备转行IT 如果你想转行IT&#xff0c;以下是一些建议&#xff1a; 前言&#xff1a; 转行IT是一个颇具吸引力的选择&#xff0c;尤其在当前社会&#xff0c;IT行业的需求非常广泛。然而…

自动化测试中几种常见验证码的处理方式及如何实现?

UI自动化测试时&#xff0c;需要对验证码进行识别处理&#xff0c;有很多方式&#xff0c;每种方式都有自己的特点&#xff0c;以下是一些常用处理方法&#xff0c;仅供参考。 1 去掉验证码 从自动化的本质上来讲&#xff0c;主要是提升测试效率等&#xff0c;但是为了去研究验…

Pytorch线性回归教程

import torch import numpy as np import torch.nn as nn import matplotlib.pyplot as plt生成测试数据 # 长期趋势 def trend(time, slope0):return slope * time# 季节趋势 def seasonal_pattern(season_time):return np.where(season_time < 0.4,np.cos(season_time * …

视频监控管理平台/智能监测/检测系统EasyCVR智能地铁监控方案,助力地铁高效运营

近日&#xff0c;关于全国44座城市开通地铁&#xff0c;却只有5座城市赚钱的新闻冲上热搜。地铁作为城市交通的重要枢纽&#xff0c;是人们出行必不可少的一种方式&#xff0c;但随着此篇新闻的爆出&#xff0c;大家也逐渐了解到城市运营的不易&#xff0c;那么&#xff0c;如何…

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

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