代码之家  ›  专栏  ›  技术社区  ›  Rob

COM对象dll加载问题

  •  1
  • Rob  · 技术社区  · 14 年前

    我正在开发一个qt dll,它被用作一个大型应用程序的插件。此DLL依赖于其他不在同一文件夹中的DLL,因此只有正确设置了当前工作目录(大型应用程序在调用 LoadLibrary 在DLL上)。我无法控制这种行为。

    我被要求向这个插件添加一个简单的COM对象,我已经做了,但我现在的问题是,除非当前的工作目录设置正确,否则第三方应用程序无法注册或使用该DLL-因为 加载 由于缺少依赖项,对插件的调用失败。显然,我无法控制第三方应用程序使用的当前工作目录,在此阶段不允许修改路径以确保可以找到依赖项。

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

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

    3 回复  |  直到 14 年前
        1
  •  1
  •   sharptooth    14 年前

    IMO将COM对象分隔成单独的.dll是最干净的解决方案-任何人都希望通过使用 regsvr32 这就不需要在那个COM服务器中有特殊的依赖关系。

        2
  •  0
  •   pagra    14 年前

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

        3
  •  0
  •   morechilli    14 年前

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

    这只要求确保在将dll用作COM服务器之前调用LoadLibrary。