问题描述:
假定EXE调用DLL,DLL内部又调用DLL1。
DLL和DLL1与EXE不在同一目录下,而是位于一个单独的目录DLLDIR下。
现象:
LoadLibrary(L"DLL"); 加载失败①。
LoadLibrary(L"DLL绝对路径"); 加载失败②。
失败原因:
失败①好理解,失败②是因为虽然指定了DLL绝对路径作为LoadLibrary的参数,但是该参数却无法对DLL内部调用的DLL1起作用(如果把DLL1扔到EXE同级目录下,则可以成功加载),因此无法加载的实际上是DLL1。
解决方案:
①LoadLibraryEx:
LoadLibraryEx("DLL绝对路径", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通过指定LOAD_WITH_ALTERED_SEARCH_PATH,让系统DLL搜索顺序从DLL所在目录开始。
②设置当前目录:
wchar_t szCurrentDir[MAX_PATH] = {0};
::GetCurrentDirectory(MAX_PATH, szCurrentDir);
::SetCurrentDirectory(strModulePath);
HMODULE hConvertor = LoadLibrary(L"DLL绝对路径");
::SetCurrentDirectory(szCurrentDir);
③SetDllDirectory:
SetDllDirectory(L"DLL绝对路径");
LoadLibray(L"DLL绝对路径");
SetDllDirectory(NULL); //recover
注:这个API与系统版本有很大依赖,不推荐使用。