COM对象DLL负载问题

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

我被要求添加一个简单的COM对象到我已经完成的这个插件,但是现在我的问题是DLL不能被第三方应用程序注册或使用,除非当前的工作目录设置正确 – 因为任何LoadLibrary调用在插件失败,由于缺less依赖关系。 很显然,我无法控制第三方应用程序使用的当前工作目录,在这个阶段,我不允许修改PATH以确保可以find依赖关系。

我已经尝试使用/DELAYLOAD为依赖的DLL,但是由于导入数据符号…'错误无法延迟加载foo.dll。 再次,我不能轻易改变这些依赖DLL的使用方式。

目前我认为唯一的解决scheme是将COM对象移动到一个独立的DLL,它不依赖于任何东西,但我有压力find解决scheme,并将COM对象留在插件DLL中。 我不明白这是怎么可能的,所以我想我会看看其他人是否有任何想法。 某种forms的系统范围的SetDllDirectory调用会帮助或某些registry破解,当第三方应用程序在我的插件上调用LoadLibrary时,可能会设置工作目录。

IMO将COM对象分隔成一个单独的.dll是最简洁的解决方案 – 任何人都希望使用regsvr32来注册一个进程内COM服务器,并且不需要该COM服务器上的花哨依赖。

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

您可以使用运行时注册模式。 该DLL可以注册自己作为一个COM服务器在自己的初始化代码。

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