LoadLibraryA和相对路径

时间:2014-02-01 08:32:26

标签: c++ windows winapi dll

我正在尝试从另一个dll加载一个dll(通过LoadLibraryA)。 这就是问题所在:

c:\**EXE_DIR**\myExe.exe             // this exe load the MY_DLL_N1.dll
c:\**DLLS_DIR**\MY_DLL_N1.dll    // this dll load the MY_DLL_N2.dll
c:\**DLLS_DIR**\MY_DLL_N2.dll
  1. exe加载MY_DLL_N1.dll ......很好。
  2. MY_DLL_N1.dll尝试加载(在代码下面)MY_DLL_N2.dll(相同的目录)......这是我的问题!
  3. int LoadMyDLL()
    {
        // ...
    
        // same path of the MY_DLL_N1.dll ... right?
        handle = LoadLibraryA ("MY_DLL_N2.dll");
    
        // ...
    }
    

    这就是所有......欢迎任何帮助!

2 个答案:

答案 0 :(得分:4)

您需要知道的所有内容都位于此处:Dynamic-Link Library Search Order

考虑使用SetDllDirectory将DLL路径添加到LoadLibrary搜索路径。

答案 1 :(得分:1)

handle = LoadLibraryA ("MY_DLL_N2.dll");

由于您未提供路径,因此使用DLL search order。这将查看可执行文件的目录,但不会搜索任何已加载的DLLS的目录。因此无法找到DLL。

您有多种选择:

  1. 将所有DLLS放在与可执行文件相同的目录中。
  2. 调用LoadLibrary时,将完整路径传递给DLL。
  3. 调用SetDllDirectory将DLL目录添加到搜索路径。在加载第一个DLL之前,从可执行文件中进行此调用。完成此操作后,加载第一个DLL时无需使用完整路径。
  4. 除非您需要在不同应用程序之间共享DLLS,否则始终首选选项1。这使您可以轻松确保加载的DLL是正确的。那是因为始终首先搜索可执行目录。