DLL_PROCESS_ATTACH 的值来调用DLL 的DllMain()函数。
当处理DLL_PROCESS_ATTACH 时,DLL 应该执行DLL 中的函数要求的任何与进程相
关的初始化。例如,DLL 可能包含需要使用它们自己的堆栈(在进程的地址空间中创建)的
函数。通过在处理DLL_PROCESS_ATTACH通知时调用HeapCreate()函数,该DLL的DllMain()
函数就能够创建这个堆栈。已经创建的堆栈的句柄可以保存在DLL 函数有权访问的一个全局
变量中。
当DllMain()函数处理一个DLL_PROCESS_ATTACH 通知时,DllMain()的返回值能够指
明DLL 的初始化是否已经取得成功。如果对HeapCreate()函数的调用取得了成功,DllMain()
应该返回TRUE。如果堆栈不能创建,它应该返回FALSE。如果fdwReason 使用的是其他的
值,即DLL_PROCESS_DETACH、DLL_HREAD_ATTACH 和DLL_THREAD_DETACH,那
么系统将忽略DllMain()返回的值。
当然,系统中的有些线程必须负责执行DllMain()函数中的代码。当一个新线程创建时,
系统将分配进程的地址空间,将EXE 文件映像和所有需要的DLL 文件映像映shè到进程的地
址空间中。然后开始创建进程的主线程,并使用该线程调用每个DLL 的带有DLL_PROCES
S_ATTACH 值的DllMain()函数。当已经映shè的所有DLL 都对通知信息作出响应后,系统将
使进程的主线程开始执行可执行模块的C/C++运行期启动代码,然后执行可执行模块的进入
点函数(main、wmain、WinMain 或wWinMain)。如果DLL 的任何一个DllMain()函数返回
FALSE,则表明初始化没有取得成功,系统便终止整个进程的运行,从它的地址空间中删除
所有文件映像,给用户显示一个消息框,说明进程无法启动运行。
2.DLL_PROCESS_DETACH 通知
当DLL从进程的地址空间中被卸载时,系统将调用DLL的DllMain()函数,给它传递fdwR
eason 的值DLL_PROCESS_DETACH。当DLL 处理这个值时,它可以执行任何与进程相关的
清除cāo作。例如,DLL 可以调用HeapDestroy()函数来撤消它在DLL_PROCESS_DETACH 通
知期间创建的堆栈。需要注意的是,如果DllMain()函数接收到DLL_PROCESS_DETACH 通
知时返回FALSE,那么DllMain()就不是用DLL_PROCESS_DETACH 通知调用的。如果因为
进程终止运行而使DLL 被卸载,那么调用ExitProcess()函数的线程将负责执行DllMain()函数
枫叶文学网www.fywxw.com
第10 章 动态链接库
·255·
的代码。在正常情况下,这是应用程序的主线程。当进入点函数返回到C/C++运行期库的启
动代码时,该启动