补丁:用于创建补丁和打补丁文件的 WTL 应用程序






3.75/5 (4投票s)
2002年3月6日
3分钟阅读

84804

936
用于创建补丁和打补丁文件的 WTL 应用程序。
引言
我读了 Alessandro Vergani 在这里发表的一篇文章,UnPatcher:用于修补文件的 COM 对象。 他创建了一个 COM 对象,该对象使用了一种鲜为人知的功能(前提是您拥有所需的 MS DLL),可以创建并将增量补丁应用于文件。(请参阅 Alessandro 的文章,了解所需补丁创建和应用 DLL 的可用性)。
我决定创建一个 WTL 应用程序来使用他的组件,但后来决定放弃使用该组件,而改用直接类包装器,以避免需要分发和注册单独的 DLL,并使我的实用程序可以轻松地作为单个 .exe 分发。 因此,这个 WTL 应用程序只有区区 108K,并且运行时要求极低。
该应用程序可以创建、测试和应用补丁文件,如果您不知道,补丁文件是表示两个文件之间的差异的文件,因此可以通过“修补”或应用(希望!)比新版本小得多的文件,将原始文件更改为较新版本。 鉴于两个 DLL,mspatcha.dll(应用)和 mspatchc.dll(创建)由 MS 提供,很明显它们在 Windows 安装程序中使用修补技术。
程序概述
该应用程序是一个使用 WTL 向导创建的 WTL 对话框应用程序。 显然,您需要安装 WTL SDK 才能构建该应用程序,但我很好心地在 zip 文件中包含了一个 release exe。
在 patcher.cpp/h 中有一个可重用的类 CPatch
,它执行所有需要的 DLL 加载/卸载和补丁功能。 这很容易解释。 再次感谢 Alessandro,因为我从他的 COM 组件中粘贴了代码,并从那里进行了转换。
有一个异常类,CPatchError()
,它在任何补丁失败的情况下都会被抛出。 它负责解码错误并选择性地显示 MessageBox
。 显然,您需要将对该类的调用包装在 try
..catch
中。
APP 的其余部分大部分是 WTL 样板代码,除了 maindlg.h 之外,它包含所有 UI 代码。 CMainDlg
派生自 CPatch
。 实际的补丁操作在单独的线程中运行,以便允许“取消”按钮中断该过程。 您会注意到,我使用了 .ptx 作为补丁文件的默认扩展名,这是任意的。 我不知道 ptx 是否是当前常见的扩展类型。 仅供参考,蓝色三角形图标是希腊语中 delta 的符号,意思是更改。
我包含了一些文件,jabberwocky.txt 和 jabberwocky.ptx,以便可以尝试应用补丁功能。 运行补丁后,jabberwocky 的全文将被修补到,而不仅仅是第一节!
UI 状态会持久保存到注册表中,以便在应用程序关闭时 UI 设置会在应用程序重新启动时重新加载。 一点点镀金 :-)
我的下一个目标是制作一个可以在两个目录的内容上运行的补丁程序,类似于其他商业补丁程序,例如 RTP。 我可能会做的另一件事是,向该应用程序添加命令行处理,和/或制作一个控制台应用程序补丁程序。
正如 Alessandro 在他的文章中所述,mspatchc.dll(创建补丁)可能目前不在您的 PC 上,但可以作为 Windows installer SDK 的一部分免费下载。 如果您安装了 IE 5,mspatcha.dll(应用补丁)应该在您的 PC 上。
希望您觉得这很有趣并且有用,就像我在这个非常酷的网站上的所有精彩帖子一样!