【问题标题】:COM Object DLL Load IssueCOM 对象 DLL 加载问题
【发布时间】:2010-11-18 09:28:52
【问题描述】:

我正在开发一个用作大型应用程序插件的 Qt DLL。该 DLL 依赖于其他不位于同一文件夹中的 DLL,因此只有在当前工作目录设置正确时才会加载(大型应用程序在调用 DLL 上的LoadLibrary 之前会这样做)。我无法控制这种行为。

有人要求我向这个插件添加一个简单的 COM 对象,但我现在遇到的问题是,除非当前工作目录设置正确,否则 DLL 无法注册或由 3rd 方应用程序使用 - 因为由于缺少依赖项,对插件的任何 LoadLibrary 调用都会失败。显然我无法控制 3rd-party 应用程序使用的当前工作目录,并且在这个阶段我不允许修改 PATH 以确保可以找到依赖项。

我曾尝试将/DELAYLOAD 用于依赖的 DLL,但失败并出现“由于导入数据符号而无法延迟加载 foo.dll...”错误。同样,我不能轻易改变这些依赖 DLL 的使用方式。

目前我认为唯一的解决方案是将 COM 对象移动到一个独立的 DLL 中,该 DLL 不依赖于其他任何东西,但我面临着找到解决方案并将 COM 对象留在插件 DLL 中的压力。我看不出这是怎么可能的,所以我想看看其他人是否有任何想法。当第 3 方应用在我的插件上调用 LoadLibrary 时,某种形式的系统范围内的 SetDllDirectory 调用会有所帮助,或者一些注册表黑客可以设置工作目录。

【问题讨论】:

    标签: c++ windows com loadlibrary


    【解决方案1】:

    IMO 将 COM 对象分离为单独的 .dll 是最简洁的解决方案 - 任何人都希望使用 regsvr32 注册进程内 COM 服务器,并且在该 COM 服务器中不需要花哨的依赖项。

    【讨论】:

    • FWIW 我完全同意。我只需要把这个想法卖给当权者。
    • @Rob:权力没有看到当前设计造成的痛苦吗?
    【解决方案2】:

    我不知道这是否正是您的问题的解决方案,但也许这可以帮助您:尝试查看清单文件提供的可能性。我希望它会有所帮助。

    【讨论】:

      【解决方案3】:

      您可以使用运行时注册模型。 Dll 可以在自己的初始化代码中将自己注册为 COM 服务器。

      这只要求保证在 dll 用作 COM 服务器之前调用 loadlibrary。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 2014-08-30
        • 1970-01-01
        • 2017-02-15
        • 2010-10-01
        • 1970-01-01
        相关资源
        最近更新 更多