我正在尝试从另一个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
  • exe加载MY_DLL_N1.dll ...很好。
  • MY_DLL_N1.dll尝试加载(在代码下面)MY_DLL_N2.dll(相同的目录)...这是我的问题!

  • int LoadMyDLL()
    {
        // ...
    
        // same path of the MY_DLL_N1.dll ... right?
        handle = LoadLibraryA ("MY_DLL_N2.dll");
    
        // ...
    }
    

    仅此而已....欢迎任何帮助!

    最佳答案

    handle = LoadLibraryA ("MY_DLL_N2.dll");
    

    因为不提供路径,所以使用DLL search order。这将在可执行文件的目录中查找,但不会在已加载的任何DLLS的目录中搜索。因此无法找到DLL。

    您有多种选择:
  • 将所有DLLS放在与可执行文件相同的目录中。
  • 在调用LoadLibrary时将完整路径传递给DLL。
  • 调用SetDllDirectory将DLL目录添加到搜索路径。在加载第一个DLL之前从可执行文件进行此调用。完成此操作后,在加载第一个DLL时无需使用完整路径。

  • 除非您需要在不同应用程序之间共享DLLS,否则始终首选选项1。这使您很容易确定所加载的DLL是正确的。那是因为总是首先搜索可执行目录。

    09-11 20:49