DLL中加载其它DLL使用LoadLibrary加载动态库失败的解决办法

方式一 采用LoadLibraryEx

若DLL不在调用方的同一目录下,可以用LoadLibrary(L"DLL绝对路径")加载。但若调用的DLL内部又调用另外一个DLL,此时调用仍会失败。解决办法是用LoadLibraryEx:
eg: LoadLibraryEx("DLL绝对路径", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通过指定LOAD_WITH_ALTERED_SEARCH_PATH,让系统DLL搜索顺序从DLL所在目录开始。


方式二 采用SetCurrentDir

跨目录调用dll,你应该这样
1 用GetCurrentDir保存当前的工作目录
2 用SetCurrentDir将当前的工作目录,设置为你的DLL所在的路径,需要使用绝对路径
3 用LoadLibrary你的DLL
4 使用SetCurrentDir恢复到原来的工作路径

eg:

TCHAR chCurDir[MAX_PATH] = {0};
GetCurrentDirectory(MAX_PATH, chCurDir);
SetCurrentDirectory(_T("c:\\test\\"));
m_hDLL = LoadLibrary(_T("demo.dll"));
SetCurrentDirectory(chCurDir);

 

防止DLL劫持,来之百度百科

四  DLL安全编程,避免产生DLL挟持问题
(1) 调用LoadLibrary, LoadLibraryEx, CreateProcess的,或者 的ShellExecute 等涉及到模块加载的函数的时候,指定DLL加载的完整路径,貌似应该有API可以获取当前程序运行的目录的
(2)考虑使用 的DLL重定向 或 Manifests文件 ,以确保您的应用程序使用正确的DLL。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
(3)确保DLL安全搜索模式被激活。未使用安全搜索设置的话,第二加载项就是 当前目录。
HKLM\System\CurrentControlSet\Control\Session Manager \ SafeDllSearchMode
(4)从搜索列表中取消 当前目录,可以通过调用SetDllDirectory 参数设置为一个 空字符串

 

你可能感兴趣的:(C++,lib,dll)