字体
第(3/4)页
关灯
   存书签 书架管理 返回目录

    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++运行期库的启

    动代码时,该启动
上一页 目录 下一页