【问题标题】:How can I update an in-use COM DLL?如何更新正在使用的 COM DLL?
【发布时间】:2010-12-29 23:18:08
【问题描述】:

我编写的一些软件的一部分是 COM dll。 其他软件使用此 COM dll。

我的软件有更新功能,它会下载更新版本的dll,但如果dll正在使用中,更新会失败,因为文件无法删除或写入。

问题是,如何更新正在使用的 COM dll?

我考虑过弹出一条消息,要求用户关闭任何正在使用该 DLL 的应用程序(如果它正在使用),如果这是最好的解决方案,我将如何在弹出之前检测 COM dll 是否正在使用消息?

提前致谢。

【问题讨论】:

  • 您是否考虑过编写一个引导应用程序来在程序运行之前检查应用程序更新?这样您就不必担心您的 COM 或其他对象会被锁定。
  • 执行更新的程序不是锁定 dll 的程序 - 其他程序正在这样做。

标签: c++ com


【解决方案1】:

您无法为现有应用程序就地更新它,但一种方法是使用不同的文件名或不同的文件夹保存它,并在 DLL 上调用 DllRegisterServer 以将其注册为新名称。开始使用您的对象的新应用程序现在应该使用新版本。

【讨论】:

    【解决方案2】:

    如果这只是检测是否可以替换文件的问题,那很容易。只需尝试使用拒绝阅读的共享标志打开它。如果 DLL 在另一个进程中加载​​,那将会失败。使用 _fsopen() 或 CreateFile()。注意竞争条件。

    检测哪些进程加载了文件是一个更难的问题,CreateToolhelp32Snapshot() 和 Process32First/Next 加上 Module32First/Next 来枚举进程和它们已加载的 DLL。仍然很难为用户生成一个好的诊断,进程名称没有那么有用。

    【讨论】:

      【解决方案3】:

      下载更新后,您必须启动第三个程序(由您编写),该程序不依赖于您的 COM 组件或任何其他要更新的部分。此启动器或引导程序必须关闭所有部件,卸载它们并安装更新。安装更新后,您可以重新启动您的应用程序。

      如果您还需要下载更新程序本身的更新,您的主程序可以这样做。

      【讨论】:

      • 这可能行得通,但在我的情况下我发现它存在一些问题。从技术上讲,任何能够使用 COM 对象的程序都可以锁定 dll - 例如 Internet Explorer。所以我需要一种方法来确定哪些程序正在使用它。
      • 是的,“关闭所有部分”部分可能很棘手。但我认为,这是一个完全独立的问题。
      【解决方案4】:

      这里有一个简单的解决方案。创建一个包装 DLL,供其他进程使用。在该 DLL 中,您显式加载/卸载您的 DLL,该 DLL 可能会更新。当然,当更新过程开始时,您必须暂停所有调用者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-18
        • 1970-01-01
        • 1970-01-01
        • 2015-02-22
        • 2011-05-31
        • 2011-05-05
        • 2014-10-05
        • 2014-09-13
        相关资源
        最近更新 更多