Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ COM对象DLL加载问题_C++_Windows_Com_Loadlibrary - Fatal编程技术网

C++ COM对象DLL加载问题

C++ COM对象DLL加载问题,c++,windows,com,loadlibrary,C++,Windows,Com,Loadlibrary,我正在开发一个QtDLL,它被用作一个大型应用程序的插件。此DLL依赖于不在同一文件夹中的其他DLL,因此只有在正确设置了当前工作目录(大型应用程序在调用DLL上的LoadLibrary之前会执行此操作)时才会加载。我无法控制这种行为 我被要求向这个插件添加一个简单的COM对象,我已经这样做了,但是我现在的问题是,除非当前工作目录设置正确,否则第三方应用程序无法注册或使用DLL,因为插件上的任何LoadLibrary调用都会由于缺少依赖项而失败。显然,我无法控制第三方应用程序使用的当前工作目录,

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

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

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


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

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

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

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

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

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


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

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


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

FWIW我完全同意。我只需要把这个想法卖给当权者。@Rob:当权者难道看不到当前设计所带来的痛苦吗?FWIW我完全同意。我只需要把这个想法卖给当权者。@Rob:当权者难道看不到当前设计所带来的痛苦吗?