Visual C ++:插件DLL使用的第三方DLL的位置?

时间:2013-02-09 02:03:39

标签: visual-c++ dll static-libraries zeromq

我正在为第三方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中的一些配置选项?

3 个答案:

答案 0 :(得分:2)

您要做的是延迟DLL加载,直到稍后使用类似的东西:

http://msdn.microsoft.com/en-us/library/151kt790.aspx

Delay Loading DLLs

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!

如所建议的,延迟加载可以解决问题。我能看到的其他选项是:

  • 在插件安装程序中,将插件的路径添加到PATH环境变量中,并将libzmq-v100-mt-gd-3_2_2.dll放在同一位置 - 此方法污染PATH变量,很可能是脆弱
  • 使用动态链接而不是静态链接到您的插件所需的libzmq-v100-mt-gd-3_2_2.dll - 然后您可以使用LoadLibrary直接控制加载dll的位置。此方法的其他优点是,如果您无法找到您的插件所需的库,您可能仍然可以激活插件但功能减少,或者至少提供有意义的错误/日志消息。

答案 2 :(得分:0)

相关问题