我有一个自己的DLL使用第三方DLL,通过其lib文件包含 . 如果第三方dll在工作目录中,编译工作正常并且运行时也可以工作 .
但是现在我想将第三方dll移动到另一个文件夹然后我的dll无法加载,因为第三方dll无法加载,因为它无法找到 .
哪里(VS2010)或如何定义在运行期间应该使用的第三方DLL的文件夹?
首先,我们应该区分两种情况:
1)Load-Time Dynamic Linking - 当您将代码链接到存根库以在链接时解析对DLL函数的引用,然后系统尝试在程序启动时加载DLL(如果找不到DLL则终止程序) )你基本上没有控制权 . 从您所说的内容来看,您正在使用此选项 .
2)Run-Time Dynamic Linking - 当您自己加载DLL时 LoadLibrary / LoadLibraryEx 并在运行时解析所需的符号 . 在这里,你可以更好地控制正在发生的事情(在其他方面你可以指定什么以及从哪里加载) . 如果您需要自定义布局,可能切换到此机制是有意义的吗?
LoadLibrary
LoadLibraryEx
那么两个场景的工作需要发生什么:
1)系统基本上在一组预定义的搜索路径中搜索您要加载的DLL以及它可能依赖的任何DLL . 所以,正如m.s.所提到的那样 . 您可以将包含DLL的路径追加到 PATH 变量,然后系统将能够找到它 . 但这只是系统查找DLL的地方之一.Here是完整的描述 . 简而言之,搜索顺序中最重要的地方是:
PATH
加载应用程序的目录 .
系统目录 .
Windows目录 .
当前目录 .
PATH环境变量中列出的目录 .
所以这解释了为什么添加到 PATH 工作并且也被认为是一种常规方法,因为使用当前目录(你可以做)调整可以做坏事 .
2)在这种情况下,你是独立的 . 通过使用SetDefaultDllDirectories或 LOAD_WITH_ALTERED_SEARCH_PATH 加载DLL和任何依赖项,LoadLibraryEx可以更改搜索路径 .
LOAD_WITH_ALTERED_SEARCH_PATH
将包含DLL的文件夹添加到 PATH 环境变量中 .
2 回答
首先,我们应该区分两种情况:
1)Load-Time Dynamic Linking - 当您将代码链接到存根库以在链接时解析对DLL函数的引用,然后系统尝试在程序启动时加载DLL(如果找不到DLL则终止程序) )你基本上没有控制权 . 从您所说的内容来看,您正在使用此选项 .
2)Run-Time Dynamic Linking - 当您自己加载DLL时
LoadLibrary
/LoadLibraryEx
并在运行时解析所需的符号 . 在这里,你可以更好地控制正在发生的事情(在其他方面你可以指定什么以及从哪里加载) . 如果您需要自定义布局,可能切换到此机制是有意义的吗?那么两个场景的工作需要发生什么:
1)系统基本上在一组预定义的搜索路径中搜索您要加载的DLL以及它可能依赖的任何DLL . 所以,正如m.s.所提到的那样 . 您可以将包含DLL的路径追加到
PATH
变量,然后系统将能够找到它 . 但这只是系统查找DLL的地方之一.Here是完整的描述 . 简而言之,搜索顺序中最重要的地方是:加载应用程序的目录 .
系统目录 .
Windows目录 .
当前目录 .
PATH环境变量中列出的目录 .
所以这解释了为什么添加到
PATH
工作并且也被认为是一种常规方法,因为使用当前目录(你可以做)调整可以做坏事 .2)在这种情况下,你是独立的 . 通过使用SetDefaultDllDirectories或
LOAD_WITH_ALTERED_SEARCH_PATH
加载DLL和任何依赖项,LoadLibraryEx可以更改搜索路径 .将包含DLL的文件夹添加到
PATH
环境变量中 .