发布时间:2010-2-12 09:51
分类名称:Private
A和B的实现是一样的,都是在DLL_PROCESS_ATTACH中使用LoadLibrary()加载C。而且 都调用了DisableThreadLibraryCalls()函数禁止了DLL_THREAD_XXXX的通 知。
在C中有一个字符串指针的全局变量,在DLL_PROCESS_ATTACH时分配内存,在DLL_PROCESS_DETACH时 释放相应内存。
A和B在DLL_PROCESS_DETACH时会访问C的一个导出函数,该导出函数返回其全局变量指针。访问这个导出函数之后,A、 B都会调用FreeLibrary()卸载C。
执行结果表明了这些DLL的加载和卸载过程:
加载:
1.A被加载,A::DllMain(DLL_PROCESS_ATTACH)被调用。
2.C被加载,C::DllMain(DLL_PROCESS_ATTACH)被调用。
3.C的全局变量被初始化,分配内存,赋值。
4.C::DllMain()调用完成。
5.A::DllMain()调用完成。
6.B被加载,B::DllMain(DLL_PROCESS_ATTACH)被调用。
7.此时,B加载C,但是C的DllMain()不会被调用!C的引用计数(由系统维护的)会增加。
卸载:
1.A被卸载,A::DllMain(DLL_PROCESS_DETACH)被调用。
2.此时,调用FreeLibrary(C)并不会引起C::DllMain()被调用,因为目前C的引用计数值不 为1。
3.A::DllMain()调用完成。
4.B被卸载,B::DllMain(DLL_PROCESS_DETACH)被调用。
5.此时,调用FreeLibrary(C)没有什么作用,C::DllMain()不会被调用。(我还不知道为什 么会这样子!)
6.B::DllMain()调用完成。
7.B::DllMain()调用结束后,C::DllMain(DLL_PROCESS_DETACH)被调用。
8.此时,C作释放资源等工作,没有任何问题。
9.C::DllMain()调用完成。
注意:如果在卸载过程中A或者B没有显式地调用FreeLibrary()卸载C,那么A、B都被卸载后,C依然存在,直到应用程序退 出时才被系统释放。
A在DLL_PROCESS_ATTACH时调用LoadLibrary(),先后加载B和C。在DLL_PROCESS_DETACH时 调用FreeLibrary()先后释放B和C。
B在DLL_PROCESS_ATTACH时加载C,在DLL_PROCESS_DETACH时卸载C。
执行结果表明了这些DLL的加载和卸载过程:
加载:
1.A被加载,A::DllMain(DLL_PROCESS_ATTACH)被调用。
2.B被加载,B::DllMain(DLL_PROCESS_ATTACH)被调用。
3.C被加载,C::DllMain(DLL_PROCESS_ATTACH)被调用。
4.C的全局变量被初始化,分配内存,赋值。
5.C::DllMain()调用完成。
6.B加载C完成,B::DllMain()调用完成。
7.A加载B完成,准备加载C。
8.A加载C,C:DllMain()不会被调用。
9.A::DllMain()调用完成。
卸载:
1.A被卸载,A::DllMain(DLL_PROCESS_DETACH)被调用。
2.此时,调用FreeLibrary(B)并不会引起B::DllMain()被调用。
3.A此时仍然可以访问C的函数和数据。
4.A调用FreeLibrary(C)来卸载C,C::DllMain()不会被立即调用。
5.A::DllMain()调用完成。
6.立刻,B::DllMain(DLL_PROCESS_DETACH)被调用。
7.此时,B仍然可以正常访问C的函数和数据。
8.B也会调用FreeLibrary(C)来卸载C,但是C::DllMain()不会被立即调用。
9.B::DllMain()调用完成。
10.B::DllMain()调用结束后,C::DllMain(DLL_PROCESS_DETACH)立刻被 调用。
11.此时,C作释放资源等工作,没有任何问题。
12.C::DllMain()调用完成。