【问题标题】:windows C++ DLL dynamic loadwindows C++ DLL 动态加载
【发布时间】:2013-09-25 05:07:24
【问题描述】:

我需要在我的程序中使用 libcurl.dll(我的程序中依赖 libcurl.dll 的二进制文件是“A.exe”),libcurl.dll 依赖于 zlib1.dll、libeay32.dll、ssleay32.dll。 但是在 A.exe 的文件夹中已经存在另一个版本 libeay32.dll。 所以我打算新建一个“CURL”文件夹,放上我这次介绍的新的4个DLL,然后用动态DLL加载来调用libcurl.dll。

======================

主文件夹 | A.exe, libeay32.dll(旧的), 文件夹“卷曲” ----- | | libcurl.dll、zlib1.dll、libeay32.dll、ssleay32.dll =====================

问题是如何控制我的程序在文件夹“CURL”中加载 DLL。 我可以通过调用来控制“A.exe”加载 CURL\libcurl.dll

HMODULE hModule = LoadLibrary(_T("Curl\libcurl.dll")); 但是如何控制zlib1.dll、libeay32.dll、ssleay32.dll的路径。 好像windows默认在A.exe本地的文件夹中搜索DLL。

【问题讨论】:

  • 我找到了一个可以在高版本操作系统上运行的解决方案。通过使用加载 DLL: LoadLibraryEx("FullPathofA.exe" , NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_DEFAULT_DIRS);是否有适用于低版本操作系统的方法。 Windows 7、Windows Server 2008 R2、Windows Vista 和 Windows Server 2008:此值需要安装 KB2533623。 Windows Server 2003 和 Windows XP:不支持此值。
  • 我认为这个方案行不通:libeay32.dll 已经加载,因此不会再次加载——即使版本不同!
  • @MSalters 但是如果他在加载 libcurl.dll 之前加载正确版本的 libeay32.dll 怎么办?
  • @SamuelVimes:如果它向上兼容,它将起作用。这不是给定的。

标签: c++ curl dll


【解决方案1】:

使用编译器的包含目录设置。或 / 并利用 windows 逻辑来查找依赖的 dll。 (您可以使用 filemon 或 process monitor 等工具来查看正在查找的目录)

使用windows的搜索路径。顺序是:

  1. 当前进程的可执行模块所在目录。

  2. 当前目录。

  3. Windows 系统目录。 GetSystemDirectory 函数检索此目录的路径。

  4. Windows 目录。 GetWindowsDirectory 函数检索此目录的路径。

  5. PATH 环境变量中列出的目录。

【讨论】:

  • 我想你误解了我的问题,我知道 Windows 搜索 DLL 的顺序。我想将我的文件夹“CURL”添加到搜索列表中,并使其成为 Windows 搜索 DLL 的第一个文件夹。
【解决方案2】:

如果您在调用中指定 dll 的完整路径而不是相对路径,您应该能够使用 LoadLibrary 加载它。仅使用文件名或相对路径时,搜索顺序如 lordKain 所述(除非您对其进行修改,例如通过调用 SetDllDirectory),但使用完整路径时,它应该只在指定的位置进行搜索。这样你可以先加载你需要的libeay32.dll版本,这样在你加载libcurl.dll的时候,你想要的libeay32.dll版本就已经加载好了。还要注意没有 dll 重定向清单。

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 2019-05-31
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2022-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多