LoadLibrary和FreeLibrary

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使线程终止而不会再返回。

你可能感兴趣的:(LoadLibrary和FreeLibrary)