我正在为第三方Windows应用程序编写C ++插件DLL。我的插件DLL可以存在于文件系统的任何地方,我指定从第三方应用程序加载它时的位置。
我的DLL的部分功能要求我使用第三方库(ZeroMQ)。我将我的DLL链接到ZeroMQ库并且它正确构建。但是,在第三方应用程序中加载我的DLL后,我一直收到The specified module could not be found.
错误。最初我不清楚我是否使用了ZeroMQ静态库,如果我还需要zeromq DLL(但显然有一个静态库包含对DLL的访问:Using .dll in Visual Studio 2010 C++)。 / p>
我尝试将零mq dll(在我的情况下为libzmq-v100-mt-gd-3_2_2.dll)放在与我的插件DLL相同的文件夹中,但是这不起作用。
最后通过纯粹的实验,我发现我可以将zeromq dll直接放在与主要第三方应用程序相同的文件夹中,现在我的插件正常工作。但是,理想情况下我宁愿不这样做。有没有办法让我以某种方式将zeromq dll库放在与我的插件DLL相同的文件夹中?如果是这样,怎么样?在构建我的DLL时,可能是Visual Studio中的一些配置选项?
答案 0 :(得分:2)
您要做的是延迟DLL加载,直到稍后使用类似的东西:
http://msdn.microsoft.com/en-us/library/151kt790.aspx
http://www.codeproject.com/Articles/9428/Delay-Loading-a-DLL
Prevent .lib from loading DLL at runtime
然后在加载发生之前,使用LoadLibrary动态加载DLL,允许您输入dll的整个路径。
当延迟加载发生时,它会意识到你的LoadLibrary调用已经加载了DLL,并且中提...
或者,您也可以使用以下命令将目录添加到dll搜索路径,而不是使用LoadLibrary加载:
http://msdn.microsoft.com/en-us/library/ms686203.aspx
当延迟加载发生时,它将在该目录中查找dll和中提...
答案 1 :(得分:2)
问题是Windows在查找dll时使用的搜索路径包括应用程序的路径,但不包括插件dll的路径(除非您可以说服应用程序供应商添加此功能!)。加载插件DLL时,加载程序会发现它需要从libzmq-v100-mt-gd-3_2_2.dll导出的函数,并尝试找到它。您发现的是预期的 - 应用程序目录位于dll搜索路径中,因此如果您将libzmq-v100-mt-gd-3_2_2.dll放置在那里,加载程序将正确找到它,并继续加载您的插件DLL。有一些方法可以将插件的路径添加到搜索路径中,但不幸的是这些不能在你的dll中使用,因为你的代码只有在正确加载dll时才能运行 - 如果libzmq-v100-它将不会运行找不到mt-gd-3_2_2.dll!
如所建议的,延迟加载可以解决问题。我能看到的其他选项是:
答案 2 :(得分:0)