首页 文章

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

提问于
浏览
1

我正在为第三方Windows应用程序编写C插件DLL . 我的插件DLL可以存在于文件系统的任何地方,我指定从第三方应用程序加载它时的位置 .

我的DLL的部分功能要求我使用第三方库(ZeroMQ) . 我将我的DLL链接到ZeroMQ库并且它正确构建 . 但是,在第三方应用程序中加载我的DLL时,我一直收到 The specified module could not be found. 错误 . 最初,有一个包含访问DLL的静态库是常见的_233558,这是常见的:Using .dll in Visual Studio 2010 C++) .

我尝试将零mq dll(在我的情况下为libzmq-v100-mt-gd-3_2_2.dll)放在与我的插件DLL相同的文件夹中,但是这不起作用 .

最后通过纯粹的实验,我发现我可以将zeromq dll直接放在与主要第三方应用程序相同的文件夹中,现在我的插件正常工作 . 但是,理想情况下我宁愿不这样做 . 有没有办法让我以某种方式将zeromq dll库放在与我的插件DLL相同的文件夹中?如果是这样,怎么样?在构建我的DLL时,Visual Studio中可能有一些配置选项?

3 回答

  • 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的位置 . 此方法的其他优点是,如果您无法找到您的插件所需的库,您可能仍然可以激活插件但功能减少,或者至少提供有意义的错误/日志消息 .

  • 0

    你想要做的是延迟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的整个路径 .

    当延迟加载发生时,它将意识到DLL已经被LoadLibrary调用加载,并且中提...

    或者,您也可以使用以下命令将目录添加到dll搜索路径,而不是使用LoadLibrary加载:

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

    当延迟加载发生时,它将在该目录中查找dll,并且中提...

  • 2

相关问题