有一个项目,第一个dll 中再调用第二个 dll, exe在一个目录, dll在同一个目录,现象。

第一个dll,不能调用第二个dll,返回值 126,给全路径也不可以。


HMODULE hInst = ::LoadLibraryA("D://sss.dll");


printf("Load sss.dll Fail %d\n", GetLastError());


 

  解决方案:

第一  获取dll 当前路径:得到dll 全路径

第二  使用 LoadLibraryEx

  LoadLibraryEx(“DLL绝对路径”, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
  通过指定LOAD_WITH_ALTERED_SEARCH_PATH,让系统DLL搜索顺序从DLL所在目录开始。

HMODULE GetSelfModuleHandle()
{
MEMORY_BASIC_INFORMATION mbi;
return ((::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) != 0) ? (HMODULE)mbi.AllocationBase : NULL);
}

#if defined(WIN32) || defined(_WIN32) || defined(WINDOWS)


#ifdef UNICODE
WCHAR szFileName[256] = { 0 };
//获取 dll 当前路径
GetModuleFileName(GetSelfModuleHandle(), szFileName, 256);
*wcsrchr(szFileName, '\\') = '\0';
wcscat(szFileName, L"\\ss.dll");
m_hdll = LoadLibraryEx(szFileName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
#else
char strAppPath[256] = { 0 };
//获取 dll 当前路径
GetModuleFileName(GetSelfModuleHandle(), strAppPath, 256);
// WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)szFileName, -1, strAppPath, 256, 0, 0);
*strrchr(strAppPath, '\\') = '\0';
strcat(strAppPath, "\\ss.dll");
m_hdll = LoadLibraryEx(strAppPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
#endif

#else
m_hdll = DLOPEN(DLFILE);
#endif