繁体   English   中英

COM对象DLL加载问题

[英]COM Object DLL Load Issue

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

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

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

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

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

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

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

这仅要求在将dll用作COM服务器之前,确保可以调用loadlibrary。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM