《温油轻远程开发日志》第四章:Windows客户端使用的单文件技术
我们如果想要最终用户方便下载和使用,一般是从可执行程序的尺寸和数量入手。
最好是单文件(绿色版)且足够小。
我们使用较少的三方库就可以实现小的尺寸(不使用如QT/CEF等重型框架),但毕竟不好做到不引用其他dll,如何做到单文件呢?
一般可以使用SFX(自解压)来实现。
一般的自解压是这样实现的(以7z为例):
先将我们的exe/dll压缩为一个7z
然后使用copy /b将7zS2.sfx与archive.7z拼接起来
(7zS2.sfx来自于lzma SDK)
然后使用Resource Hacker将exe的版本信息删除,并替换图标
这里我把其中几个重点技术细节给大家讲解一下,首先copy /b它不特殊,就只是把多个文件的二进制连接到一起而已。
7zS2.sfx是一个exe,只是后缀改了。那么当操作系统从文件头开始解析时,依然可以执行。
7zS2.sfx开始执行后,会查找自身文件是否包含7z(7z格式也具有固定文件头,查找过程能够跳过前部数据)。如果找到,则把7z解压到临时文件夹,并开始执行其中的exe/bat/msi等。
(当然,不是执行所有的exe/bat等,而是以setup.bat/install.bat~start.cmd/install.cmd优先来查找,如果找不到,则是第一个bat/cmd或exe,具体的可以看lzma SDK的源码)
上文的这种自解压方式有一些问题,一是操作复杂,不便于发布版本。二是在windows下会误报病毒。
因此我改进了一下自解压的方式。
首先仍是需要先压缩(为了减小尺寸,压缩是必要的),但只压缩dll。
然后我们把这个7z和一个解压程序作为资源文件打包到exe中(因为懒得写代码……所以直接使用官方sdk的exe了)
最后我们在程序启动之初,仍是把dll解压到临时目录。
并设置为工作目录。这样我们后续就可以使用LoadLibray和GetProcAddress来引入dll的函数了。
(LoadLibrary之前别忘了SetCurrentDirectory哦)
当然,这个办法只适合C格式导出的函数。如果是c++的类引入,则不行了
最后修改时间 2022-12-09 22:59:47
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具