VC++ loadlibrary() dll 失败 错误码:126
原创
©著作权归作者所有:来自51CTO博客作者jacklicto的原创作品,请联系作者获取转载授权,否则将追究法律责任
有一个项目,第一个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