ACG狂人

其实我更爱姐汁...

DLL的共享测试

今天稍微实验了一下DLL的数据共享问题,做了两种情况下的测试,第一种是两个进程同时调用一个DLL的实验,另一种是一个进程调用一个两个DLL,然后这两个DLL有依赖关系,记录一下得到的测试结果。

当一个进程调用LoadLibrary、LoadLibraryEx以及FreeLibrary时,DllMain会被调用,从DllMain的入口函数的第二个参数可以得知是加载还是释放。LoadLibraryEx的flag参数传入DONT_RESOLVE_DLL_REFERENCES可以跳过DllMain的调用,这在很多时候是有用的。
当一个进程在调用LoadLibrary后又启动了线程,则每启动一个线程,就会调用一次DllMain,同样可以从DllMain的第二个参数的值来区分调用时由进程引起的还是由线程引起的。第二个参数的值一般有4种,如下:
 DLL_PROCESS_ATTACH
 DLL_PROCESS_DETACH
 DLL_THREAD_ATTACH
 DLL_THREAD_DETACH
不用解释也能看得出来分别是表示什么意义了,通过这个可以选择性的对DLL中的数据进行初始化。
如果是两个进程同时调用一个DLL的话,数据是不会共享的,除非你设置了seg项为共享,具体不同的编译器会有不同的设置方法。两个进程对同一个DLL的调用计数也是分开的,这让我很放心了,之前一直害怕的冲突问题释然。


当一个进程去调用一个DLL甲,而甲又在初始化的时候调用了DLL乙,进程通过甲的函数来访问了DLL乙,同时自己也亲自调用了DLL乙并取出和更改了数据。这样的情况下,DLL乙的引用计数是共享的,数据也是共享的,加载和释放都很安全,之前担心DLL乙中的单件会被重复调用的情况也不可能存在了。

posted on 2009-06-27 23:04 酿妹汁 阅读(550) 评论(0)  编辑 收藏 引用 所属分类: 备忘


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理