Mutiplex DLL Call

发布时间:2010-2-12 09:51
分类名称:Private


Method One :

Mutiplex DLL Call - Dsliu - Dspace

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依然存在,直到应用程序退 出时才被系统释放。

Method Two :


Mutiplex DLL Call - Dsliu - Dspace


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()调用完成。