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

最新文章

  1. Dapper.Contrib:GetAsync&lt;T&gt; only supports an entity with a [Key] or an [ExplicitKey] property
  2. android应用内存占用测试(每隔一秒打印procrank的信息)
  3. Spring SpringMVC和Mybatis整合
  4. 实现十进制无符号整数m到十六进制数的转换功能
  5. C与CPP 在线手册查找
  6. 为什么mysql设置了密码之后,本地还可以直接访问,不需要输入密码就可以登录数据库了?
  7. javascript关键字和保留字
  8. android 拉伸图片
  9. FileStream文件流的读取和写入(为以后聊天工具的设计基础)
  10. iOS 静态类库项目的建立与使用
  11. POJ 1006 Biorhythms(中国剩余定理)
  12. 读取webconfig里面的appSetting和connectionString
  13. PAT 1006. Sign In and Sign Out
  14. RVM: instsallation
  15. MySQL管理命令
  16. 201521123107 《Java程序设计》第9周学习总结
  17. Java——重写
  18. Javascript高级编程学习笔记(36)—— DOM(2)Document
  19. System.Data.SqlClient.SqlException: 数据类型 text 和 varchar 在 equal to 运算符中不兼容。
  20. SQL性能优化前期准备-清除缓存、开启IO统计

热门文章

  1. E - 食物链
  2. object-c 数学计算公式
  3. The Smallest Difference
  4. Mysql导入脚本失败,提示需要SUPER权限
  5. Windows caffe VGG人脸识别
  6. wpf 用户自定义事件传参
  7. Win7建立FTP站点
  8. Python3安装turtle提示错误:Command &quot;python setup.py egg_info&quot; failed with error code 1
  9. springmvc防止重复提交拦截器
  10. ip后面带端口号如何做域名解析