Visual c++ visualc&x2B+;:插件DLL使用的第三方DLL的位置? 我正在为第三方Windows应用程序编写C++插件DLL。我的插件DLL可以存在于文件系统的任何地方,我指定从第三方应用程序加载它时的位置

Visual c++ visualc&x2B+;:插件DLL使用的第三方DLL的位置? 我正在为第三方Windows应用程序编写C++插件DLL。我的插件DLL可以存在于文件系统的任何地方,我指定从第三方应用程序加载它时的位置,visual-c++,dll,static-libraries,zeromq,Visual C++,Dll,Static Libraries,Zeromq,DLL的部分功能要求我使用第三方库()。我将我的DLL链接到ZeroMQ库,并且它构建正确。但是,在第三方应用程序中加载我的DLL时,我不断得到一个错误,无法找到指定的模块。错误。起初,我不清楚我是否使用了ZeroMQ静态库,是否也需要ZeroMQ DLL(但显然,使用静态库包装对DLL的访问是很常见的:) 我尝试将zero mq dll(在我的例子中是libzmq-v100-mt-gd-3_2_2.dll)与我的插件dll放在同一个文件夹中,但是这不起作用 最后,通过纯粹的实验,我发现我可以将

DLL的部分功能要求我使用第三方库()。我将我的DLL链接到ZeroMQ库,并且它构建正确。但是,在第三方应用程序中加载我的DLL时,我不断得到一个
错误,无法找到指定的模块。
错误。起初,我不清楚我是否使用了ZeroMQ静态库,是否也需要ZeroMQ DLL(但显然,使用静态库包装对DLL的访问是很常见的:)

我尝试将zero mq dll(在我的例子中是libzmq-v100-mt-gd-3_2_2.dll)与我的插件dll放在同一个文件夹中,但是这不起作用


最后,通过纯粹的实验,我发现我可以将zeromq dll直接放在与主第三方应用程序相同的文件夹中,现在我的插件可以工作了。然而,理想情况下我不想那样做。我是否有办法将zeromq dll库与我的插件dll放在同一个文件夹中?如果是,怎么做?在构建我的DLL时,Visual Studio中可能会有一些配置选项?

您要做的是使用如下方式将DLL加载延迟到以后:

然后在加载之前,使用LoadLibrary动态加载DLL,允许您输入DLL的整个路径

当延迟加载发生时,它将意识到您的LoadLibrary调用已经加载了DLL,viola

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


当延迟加载发生时,它将在该目录中查找dll,viola…

您要做的是使用如下方式将dll加载延迟到以后:

然后在加载之前,使用LoadLibrary动态加载DLL,允许您输入DLL的整个路径

当延迟加载发生时,它将意识到您的LoadLibrary调用已经加载了DLL,viola

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


当延迟加载发生时,它将在该目录中查找dll,viola…

问题是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。这种方法的另一个优点是,如果您找不到插件所需的库,您可能仍然会激活插件,但功能会减少,或者至少会提供一条有意义的错误/日志消息

问题在于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。这种方法的另一个优点是,如果您找不到插件所需的库,您可能仍然会激活插件,但功能会减少,或者至少会提供一条有意义的错误/日志消息

我最近在一篇博文中解决了这个问题:

我最近在一篇博文中解决了这个问题:

@thang:touche。我该怎么做?啊,好问题,我应该把它放到帖子里:p@thang:触摸。我该怎么做呢?啊,好问题,应该把它放到帖子里:p