如题,调用一个DLL,如果我当前执行文件在H盘,我用动态调研hMod2 = LoadLibrary(_T("C:\\imobi.dll"));这样就失败,路径绝对没错,而且DLL也就在指定位置,但是我要是hMod2 = LoadLibrary(_T("imobi.dll"));
然后把DLL考到EXE同目录下就成功,所有DLL依赖的DLL是一起拷贝的,用getlasterror报错126,找不到指定模块,求大神帮忙解决下,拜谢

解决方案 »

  1.   

    LoadLibrary(_T("C:\\imobi.dll"));这样时用dumpbin查看下少哪个DLL
      

  2.   

    我用Depends查看的话。导入里面基本所列的DLL我全部拷在imobi.dll的目录下了。我去看看dumpbin怎么用。先谢了
      

  3.   

    还有,我用exeScope打开会这样,不知道是DLL的问题还是exeScope的问题啊???
      

  4.   

    LoadLibrary(_T("C:\\imobi.dll"));这样用的时候你是把所有 imobi.dll 依赖的 dll 都拷贝到 C 盘的? 那样肯定不行撒. imobi.dll 去找它依赖的 dll 的时候又没有加上 C:\\ 路径, 还是只会在标准的路径里面搜索的.
      

  5.   

    有道理。。那如果我想实现的就是把imobi.dll放在C盘,而EXE在H盘,这个怎么实现呢??
      

  6.   

    用 1 楼说的 SetDllDirectory 函数或者用 SetEnvironmentVariable 修改 PATH 变量.
      

  7.   

    inline static HMODULE LoadDynamicModule(LPCWSTR pszModuleName, BOOL bSetDllDirectory = FALSE)
    {
    TTS(pszModuleName && pszModuleName[0],
    TR(L"本地注册加载 %s 模块中……", pszModuleName),
    TR(L"本地注册加载当前模块中……"));
    HMODULE hModule = NULL;
    WCHAR szModulePath[MAX_PATH] = { 0 };
    if (::CreateApplicationBase(szModulePath, ARRAYSIZE(szModulePath), pszModuleName))
    {
    if (bSetDllDirectory)
    {
    WCHAR szDllDirectory[MAX_PATH];
    DWORD nDllDirectory = ::GetDllDirectoryW(ARRAYSIZE(szDllDirectory), szDllDirectory);
    WCHAR szCurrentDirectory[MAX_PATH];
    GetDirectoryFromFileName(szCurrentDirectory, ARRAYSIZE(szCurrentDirectory), szModulePath);
    if (::SetDllDirectoryW(szCurrentDirectory))
    {
    if (szModulePath[0])
    {
    hModule = LoadLibraryW(szModulePath);
    if (!hModule)
    {
    DHR(L"LoadLibrary", GetLastError());
    DR(L"LoadLibray %s.", szModulePath);
    }
    }
    else
    {
    GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)LoadDynamicModule, &hModule);
    if (!hModule)
    {
    DHR(L"GetModuleHandleEx", GetLastError());
    }
    }
    if (nDllDirectory)
    {
    ::SetDllDirectoryW(szDllDirectory);
    }
    else
    {
    ::SetDllDirectoryW(NULL);
    }
    }
    }
    else
    {
    if (szModulePath[0])
    {
    hModule = LoadLibraryW(szModulePath);
    if (!hModule)
    {
    DHR(L"LoadLibrary", GetLastError());
    DR(L"LoadLibray %s.", szModulePath);
    }
    }
    else
    {
    GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)LoadDynamicModule, &hModule);
    if (!hModule)
    {
    DHR(L"GetModuleHandleEx", GetLastError());
    }
    }
    }
    }
    TTS(szModulePath[0],
    TR(L"本地注册加载 %s 模块%s完成。", szModulePath, hModule ? L"成功" : L"失败"),
    TR(L"本地注册加载当前模块%s完成。", hModule ? L"成功" : L"失败"));
    return hModule;
    }
      

  8.   

    这是我的一个注入 DirectX 的代码。
    被注入的DirectX 程序可能在任意位置,而注入代码在我的程序目录。
    此时,需要使用一个不依赖于自己的任何其他 DLL 的 DLL。这个 DLL 使用绝对路径加载。
    然后,在这个 DLL 中设置 DLL 的加载环境,加载其他的 DLL 。
    这些后加载的 DLL 可以说其他人提供的 DLL 。