65.9K
CodeProject 正在变化。 阅读更多。
Home

UnPatcher:一个用于修补文件的 COM 对象

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (2投票s)

2000年6月8日

viewsIcon

58033

downloadIcon

1164

一篇关于文件补丁的文章。

  • 下载演示项目 - 30 Kb
  • 下载源文件 - 20 Kb
  • 引言

    最近,我遇到一个我认为在开发者中非常常见的问题:软件发布补丁

    有很多工具可以做到这一点,甚至包括免费软件,但我想要一些类似于某个知名软件的 LiveUpdate 功能的东西。

    由于我找到的所有补丁软件都不是开源的,我开始编写自己的补丁算法,但结果不佳:生成的补丁文件的大小几乎与原始文件一样。

    我开始四处寻求帮助,但没有人能帮我解决问题。然后,Blake Miller 告诉我查看 Platform SDK。我查看了,发现了一组文档很少的 API,用于创建和应用补丁。


    问题与解决方案

    这些 API 的唯一文档在一个名为 PatchApi.h 的文件中。这组函数不是很复杂,所以我很容易理解每个函数的作用(除了标志位,如果有人知道更多信息,请告诉我)。

    问题是,只有补丁创建例程(CreatePatchCreatePatchEx)的导入库,而没有用于补丁应用函数的导入库。所以我尝试创建它,但没有成功。

    我找到的唯一解决方案是动态加载实现 API 的 DLL。这并不是什么坏事:你可以将补丁程序与补丁创建 DLL 一起发布。

    你可能注意到我写的是 DLL(复数)。这是真的:有两个 DLL 实现此 API:mspatchc.dll(创建)和 mspatcha.dll(应用)。我没有将这些 DLL 包含在压缩包中(我不知道我是否可以重新分发它们)。你可以在 Platform SDK 中找到创建 DLL,而应用 DLL 随 MSIE 5.01 一起提供(可能也随其他 MS 产品一起提供,我在 MSDN 上查找时只发现 IE 携带此 DLL)。


    最后一步

    我最终让它工作了,所以我编写了一个简单的 COM DLL,实现了补丁逻辑。该对象非常简单:它有 3 个属性、4 个方法和 1 个事件。

    属性

    • SourceFile:旧文件名或要打补丁的文件。
    • DestinationFile:新文件名或要生成的已打补丁的文件。
    • PatchFile:要创建或应用的补丁文件名。

    方法

    • CreatePatch:创建补丁文件。
    • TestPatch:测试补丁文件
    • ApplyPatch:应用补丁文件
    • GetFileSignature:返回一个唯一的(?)文件签名

    事件

    • OnProgress:在处理过程中调用。

    最后说明

    它可以在 UNICODE 下编译,但测试不够充分。

    包含的演示是用 Visual Basic 编写的。要使其工作,首先需要通过以下方式注册 UnPatcher DLL

    regsvr32 UnPatcher.dll
    


    © . All rights reserved.