《温油轻远程开发日志》第四章: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

posted @   云中双月  阅读(81)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示