三种DLL(Win32DLL,MFC常规DLL和MFC拓展DLL)的简单学习总结

来源:互联网 发布:hbase java api maven 编辑:程序博客网 时间:2024/05/17 05:02

学习了三种动态链接库的基本知识,分别是Win32DLL,MFC常规DLL和MFC拓展DLL。

    Win32DLL使用的是Win32的API实现的,只能导出函数,能被各种应用程序调用,适用范围最广。

    MFC常规DLL是适用MFC创建的,就像MFC程序跟Win32程序的关系一样,MFC常规DLL和Win32DLL的关系也是如此。它使用MFC的机制,只能导出标准C函数。如此,它便可以被大部分Win32程序调用。

    MFC拓展DLL也也使用的是MFC机制创建的,相比于MFC常规DLL,拓展DLL可以导出C++类和MFC派生类,如此扩大了DLL的接口范围。此长彼消,MFC拓展DLL的适用范围较小,只能被MFC程序调用。因为它导出的不只是函数,还有C++类和MFC派生类。

    另外,所有的动态链接库都有两种链接方式:隐式调用和显示调用。隐式链接使用起来比较方便,不过不够灵活;显示链接可以在真正要用DLL的时候才装入,并在适当的时候释放,操作相对复杂一些。



MFC   DLL   有三种形式的MFC   DLL(在该DLL中可以使用和继承已有的MFC类)可供   选择,即Regular   statically   linked   to   MFC   DLL(标准静态链接MFC   DLL)和R   egular   using   the   shared   MFC   DLL(标准动态链接MFC   DLL)以及Extension   MF   C   DLL(扩展MFC   DLL)。第一种DLL的特点是,在编译时把使用的MFC代码加入到   DLL中,因此,在使用该程序时不需要其他MFC动态链接类库的存在,但占用磁盘   空间比较大;第二种DLL的特点是,在运行时,动态链接到MFC类库,因此减少了   空间的占用,但是在运行时却依赖于MFC动态链接类库;这两种DLL既可以被MFC程   序使用也可以被Win32程序使用。第三种DLL的特点类似于第二种,做为MFC类库的   扩展,只能被MFC程序使用。 

Win32   DLL的入口和出口函数都是DLLMain 

BOOL   WINAPI   DllMain(HINSTANCE   hinstDLL,DWORD   fdwReason,   LPVOID   lpvReserved);其中,第一个参数表示DLL的实例句柄;第三个参数系统保留;第二个参数指明了当前调用该动态连接库的状态,它有四个可能的值:DLL_PROCESS_ATTACH(进程载入)、DLL_THREAD_ATTACH(线程载入)、DLL_THREAD_DETACH(线程卸载)、DLL_PROCESS_DETACH(进程卸载)。在DLLMain函数中可以通过对传递进来的这个参数的值进行判别,根据不同的参数值对DLL进行必要的初始化或清理工作。由于在Win32环境下,所有进程的空间都是相互独立的,这减少了应用程序间的相互影响,但大大增加了编程的难度。当进程在动态加载DLL时,系统自动把DLL地址映射到该进程的私有空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间,每个进程所拥有的相同的DLL的全局数据其值却并不一定是相同的。当DLL内存被映射到进程空间中,每个进程都有自己的全局内存拷贝,加载DLL的每一个新的进程都重新初始化这一内存区域,也就是说进程不能再共享DLL。因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。一种方法便是把这些需要共享的数据单独分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享,建立一个内存共享的DLL。

Windows使用DLLs在二进制级共享代码。这也是Windows程序运行的关键——重用kernel32.dll,   user32.dll等。但DLLs是针对C接口而写的,它们只能被C或理解C调用规范的语言使用。由编程语言来负责实现共享代码,而不是由DLLs本身。这样的话DLLs的使用受到限制。 
MFC引入了另外一种MFC扩展DLLs二进制共享机制。但它的使用仍受限制——只能在MFC程序中使用。 


参见1:http://blog.csdn.net/wche1990/article/details/6944647

参见2:http://bbs.csdn.net/topics/340075409