1

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

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

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

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

4

3 回答 3

1

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

于 2010-11-18T09:34:15.447 回答
0

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

于 2010-11-18T09:46:49.923 回答
0

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

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

于 2010-11-18T10:10:34.730 回答