给老客户端做自动更新,最省事的路是直接复用原厂更新链——前提是搞清它的补丁包格式。幸运的是格式有现成参考:原厂的打包器(MakePatch)和升级器(DTUpdate)的文档实现就在工程树里,格式全部可读。
12 字节头
offset 0 magic[4] 磁盘上是 'ZBTD'(内存里 'DTBZ',bzip2 流)
或 'DTUD'(LZO1X)
offset 4 payload[8] 版本/长度信息
头之后是 UpdateSec 段,逐条描述变更:
ADDF—— 整文件新增/替换,把解压后的完整文件写下去;MODI—— 差分修改,skip-size 描述跳过区与重写区的交替序列,比整文件替换省一个数量级的流量。
用官方真包做格式对拍
格式理解对不对,拿官方历史包验证:37 个官方真包(2.0.25~2.0.62)逐包解析通过,每一条 MODI 的 skip-size 都能精确落位。这一步做完,自产补丁和官方补丁就共用同一条升级链。
给升级器动手术
原版 DTUpdate 有两个时代包袱,手术方案:
- 动态链接
libbz2.dll→ bzip2 1.0.8 源码静态化成libsbz2.lib,少带一个 DLL; - MFC + WinInet 的 HTTP 层 → 裸 winsock 重写下载模块(旧 WinInet 层与宿主进程相互拖累)。
最后一条铁律:补丁永不含 DTUpdate.exe 自身——升级器直启后写自己所在目录,文件被锁,自锁死循环。
更新链的云端接线其实非常薄:一个文本列表 + 若干 .dt 文件。客户端启动时比对版本号,提示后下载应用,全程无需人工。