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应用都是