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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容