LoadLibrary 和LoadLibraryEx
HMODULE LoadLibrary(PCTSTR pazDllPathName);
-HMODULE等价于HINSTANCE,两者可以换用。
HMODULE LoadLibraryEx(
PCTSTR pszDllPathName,
HANDLE hFile,
DWORD dwFlags);
-hFile是为将来扩充所保留的,必须设为NULL。
-dwFlags可以设为:
--0
--DONT_RESOLVE_DLL_REFERENCES告诉系统只需将DLL映射到调用进程的地址空间,不调用DllMain。
--LOAD_LIBRARY_AS_DATAFILE将DLL作为数据文件映射到进程的地址空间中。
--
FreeLibrary和FreeLibraryAndExitThread
VOID FreeLibrary(HMODULE hInstDll);
-调用该函数只是把调用LoadLibrary时递增的使用计数递减,减至0时撤销。
-如果分别调用FreeLibrary和ExitThread,会导致:FreeLibrary立即从进程的地址空间中撤销对DLL的映射,当FreeLibrary调用返回时,调用ExitThread的代码已经不存在的,线程试图执行的是不存在的代码,这将会引发访问违规,导致整个进程被终止。
VOID FreeLibraryAndExitThread(
HMODULE hInstDll,
DWORD dwExitCode)
{
FreeLibrary(hInstDll);
ExitThread(dwCode);
}
-该函数在Kernel31.dll中实现。
-这个函数会调用FreeLibrary,对DLL的映射被立即撤销,而要执行的下一条指令仍在Kernel32.dll中,而不是在被撤销的dll映射中,即可以继续执行并调用ExitThread。
-ExitThtread使线程终止而不会再返回。