COM对象DLL加载问题

时间:2010-11-18 09:28:52

标签: c++ windows com loadlibrary

我正在研究一个用作大型应用程序插件的Qt DLL。此DLL依赖于其他难以置于同一文件夹中的DLL,因此仅在正确设置当前工作目录时才会加载(大型应用程序在调用DLL上的LoadLibrary之前执行此操作)。我无法控制这种行为。

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

我已尝试将/DELAYLOAD用于依赖DLL,但由于导入数据符号错误导致'无法延迟加载foo.dll'失败。同样,我无法轻易改变这些依赖DLL的使用方式。

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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