Win32动态链接库和MFC 动态链接库

 

通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。

此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您可能具有一个工资计算程序,而税率每年都会更改。当这些更改被隔离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。

Windows操作系统中的一些作为 DLL 实现的文件

·ActiveX 控件 (.ocx) 文件

ActiveX控件的一个示例是日历控件,它使您可以从日历中选择日期。

·控制面板 (.cpl) 文件

.cpl 文件的一个示例是位于控制面板中的项。每个项都是一个专用 DLL。

·设备驱动程序(.drv) 文件

设备驱动程序的一个示例是控制打印到打印机的打印机驱动程序。

dll在程序中用 loadlibrary ,实际管理用rundll32.exe

Rundll32.exe与Rundll.exe的区别就在于前者是用于32位的链结库,后者是用于16位的链结库。rundll32.exe是专门用来调用dll文件的程序

当您在应用程序中加载 DLL 时,可以使用两种链接方法来调用导出的 DLL 函数。这两种链接方法是加载时动态链接和运行时动态链接。


运行时


在运行时动态链接中,应用程序调用 LoadLibrary 函数或 LoadLibraryEx 函数以在运行时加载 DLL。成功加载 DLL 后,可以使用 GetProcAddress 函数获得要调用的导出的 DLL

 函数的地址。在使用运行时动态链接时,无需使用导入库文件。


Win32 DLL的特点


Win32 DLL与 Win16 DLL有很大的区别,这主要是由操作系统的设计思想决定的。一方面,在Win16 DLL中程序入口点函数和出口点函数(LibMain和WEP)是分别实现的;

而在Win32 DLL中却由同一函数DLLMain来实现。无论何时,当一个进程或线程载入和卸载DLL时,都要调用该函数,它的原型是


BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved);


DLL:

         Win32在任何程序中都可以使用的API库;

         1、 规则DLL     MFC扩展DLL   (在一般DLL上扩展MFC库的DLL)

          MFC扩展的DLL正确叫法是扩展MFC库的DLL ,MFC建工程会生成def模块定义文件,WIN32中建要手动建def文件也可以用_declspec声名。

#include <afxwin.h>
#include <afxdllx.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

static AFX_EXTENSION_MODULE HJ89xAPIDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)


 

         2、 MFC规则的DLL (使用MFC时可以在共享的DLL中也可以使用静态的lib库)

这类DLL使用的是MFC规则,

          MFC规则的类不是C++标准类,而是统一使用VC++类规则

          有 来连接句柄

           BEGIN_MESSAGE_MAP(CHJx89APIMApp, CWinApp)
           END_MESSAGE_MAP()      

            这些宏定义被转换成C++代码,被编译器编译    

           MFC规则的DLL是MFC规则给外部暴露的接口都是Cwinapp ,MFC应用都是

原文地址:https://www.cnblogs.com/javawebsoa/p/3243930.html