目录

前言

一、动态链接库

1.1 概述

1.1.1 动态链接库的概念

1.1.2 动态链接库和静态链接库的区别

1.1.3 使用动态链接库的优点

1.1.4 DLL文件的存放位置

1.2 创建MFC DLL

1.2.1 使用DEF文件

1.2.2 使用关键字_declspec(dllexport)

1.3 使用MFC DLL

1.3.1 使用隐式链接

1.3.2 使用显式链接

1.4 MFC拓展DLL

1.4.1 创建MFC扩展 DLL

总结


前言

本篇文章介绍动态链接库


一、动态链接库

1.1 概述

在多任务环境中,为了提高系统资源的利用率和系统的整体性能,应该使每一个应用程序尽量少占用系统内存等资源。

    动态链接库便是这一设想的体现,允许多个应用程序同时共享动态链接库在内存中的同一份拷贝。

1.1.1 动态链接库的概念

动态链接库(DLL):一种用来为其它可执行文件(包括EXE文件和其它DLL)提供共享的函数库。   

DLL中一般定义有两种类型的函数:导出函数和内部函数。导出函数是可以被外部程序调用的函数,内部函数只能在DLL内部使用。

1.1.2 动态链接库和静态链接库的区别

动态链接库和静态链接库的主要区别是与应用程序的链接方式不同,前者进行的是动态链接,后者进行的是静态链接。

1.1.3 使用动态链接库的优点

(1) 实现多个应用程序共享数据和代码的方式。

(2) 提高应用程序的执行效率和运行速度。

(3) 方便应用程序的升级和售后支持。

(4)把应用程序所使用的资源,如图标、位图、字符串和对话框等,独立出来做成DLL,为多个应用程序所共享。

(5) 动态链接库便于建立多语言的应用程序。

1.1.4 DLL文件的存放位置

程序所需的DLL文件必须位于下面4个目录之一中:

(1) 当前目录

(2) Windows的系统的目录,如Windows\system

(3) Windows所在的目录,如WINNT

(4) 环境变量PATH中所指定的目录

1.1.5 动态链接库的分类

Visual C++ 6.0支持多种DLL,包括:

  • MFC DLL

一般来说,非MFC DLL的内部不使用MFC,非MFC DLL的导出函数都使用标准的C接口,因此无论应用程序是否使用了MFC,都可以调用非MFC DLL

  • MFC扩展DLL

    MFC扩展DLL一般用来提供派生于MFC的可重用的类,以扩展已有的MFC类库的功能。MFC扩展DLL使用MFC的动态链接版本。只有使用MFC生成的可执行程序(无论是EXE还是DLL)才能访问MFC扩展DLL

1.2 创建MFC DLL

利用MFC AppWizard[dll]向导可以创建MFC DLL DLL文件与可执行文件非常相似,不同点在于DLL包含有导出表。导出表包含DLL中每个导出函数的名字,这些函数是进入DLL的入口点。只有导出表中的函数可以被外部程序调用。

    从MFC DLL中导出函数常用以下两种方法:使用模块定义文件(.def)和使用关键字_declspec(dllexport)

1.2.1 使用DEF文件

DEF文件是一个包含EXE文件或DLL文件声明的文本文件。每个DEF文件至少必须包含LIBRARY语句和EXPORTS 语句,其他语句可以省略。

DEF文件常用的模块语句如下:

  1. 第一个语句必须是LIBRARY语句,这个语句指出DLL的名字,链接器将这个名字放到DLL导入库中,DLL导入库包含了指向外部DLL的函数索引指针。
  2. EXPORTS 语句列出被导出函数的名字, 以及导出函数的数值(由@号与数字构成)。序数值可以省略,编译器会为每个导出函数指定一个,但这样指定的值不如自己指定的明确。
  3. 使用DESCRIPTION语句描述DLL的用途,这个语句可以省略。
  4. 使用开头的注释语句。

1.2.2 使用关键字_declspec(dllexport)

MFC DLL中导出函数的另一种方法是在定义函数时使用关键字_declspec(dllexport)。这种情况下,不需要DEF文件。导出函数的形式为:

declspec(dllexport) <返回类型> <导出函数名>(<函数参数>)

1.2.3 两种导出函数方法的比较

  • 如果需要使用导出顺序值,那么应该使用DEF文件来导出函数。
  • 使用DEF文件来导出函数,可以创建具有NONAME属性的DLL
  • 使用declspec(dllexport)关键字导出函数不需要编写DEF文件,因此,如果编写的DLL只供自己使用,使用__declspec(dllexport)较为简单。

1.3 使用MFC DLL

应用程序与DLL链接后,DLL才能通过应用程序调用运行。应用程序与DLL链接的方式主要有如下两种:隐式链接和显式链接。

    隐式链接又称为静态加载,指的是使用DLL的应用程序先链接到编译DLL时生成的导入库LIB文件,执行应用程序的同时操作系统自动加载所需的DLL在应用程序退出之前,DLL一直存在于该程序运行进程的地址空间中。

    显式链接又称为动态加载,使用显式链接DLL的应用程序必须在代码中动态地加载所使用的DLL,并使用指针调用DLL中的导出函数,在使用完毕后,应用程序必须卸载所使用的DLL

1.3.1 使用隐式链接

使用隐式链接除了需要相应的DLL文件外,还必须具备以下2个文件:

  • 包含导出函数以及类声明的头文件
  • DLL的导入库LIB文件

编译时将DLL的LIB文件加入应用程序中,主要有如下3种方法。

  1. 在主菜单project中,选择菜单项【Add To Project| Files】菜单项,在弹出的Insert Files Into Project对话框中选择所需的LIB文件。
  2. 在程序的StdAfx.h头文件中加入下列语句:#pragma comment (lib,"指定的LIB文件名")
  3. 在主菜单project中,选择【Settings】菜单项,弹出Project Settings对话框,如下图所示。选择Link选项卡,在Object/library modules文本框中输入指定的LIB文件名,多个库文件之间用空格分开。

1.3.2 使用显式链接

使用显式链接时,需要知道导出函数返回值的类型和所传递的参数个数、类型和顺序等。应用程序在调用DLL中的导出函数前,必须首先调用LoadLibrary()函数加载DLL并得到一个模块句柄,然后使用得到的模块句柄调用GetProcAddress()函数获取导出函数的指针,并使用该指针调用DLL中的导出函数。DLL使用完毕后,调用FreeLibrary()函数释放加载的DLL

    若DLLMFC扩展DLL,则应用程序应该分别使用AfxLoadLibrary()AfxFreeLibrary()函数来加载和释放DLL

1.4 MFC拓展DLL

MFC扩展DLL的含义在于它是MFC的扩展,其主要功能是实现从现有MFC类库中派生出可重用的类。

1.4.1 创建MFC扩展 DLL

对于MFC扩展DLL,系统会自动在项目中添加如下表所示的宏,这些宏为DLL和应用程序的编写提供了方便。   例如MFC扩展DLL除了可使用关键字_declspec(dllexport) 导出类外,还可以使用宏AFX_EXT_CLASS来导出类,而链接到MFC扩展DLL的可执行文件同样使用这个宏来导入类。


总结

机会就像坐公交车,有人上车早,有人上车晚,有人直达车,有人要转车。只要你有决心去目的地,一定可以找到自己的路线!

VC++程序设计与应用--动态链接库相关推荐

  1. 南京工程学院C++/VC程序设计大作业

    南京工程学院C++/VC程序设计大作业 源码下载 链接:源码下载链接 提取码:1111 学生成绩输入及统计分析 模拟自动取款机 C++/VC程序设计大作业任务书 一.课外大作业要求: 1.每人从附件1 ...

  2. VC++程序设计与应用--开发环境

    目录 前言 一.使用步骤 1.1 集成开发环境窗口 1.2 AppWizard与ClassWizard 1.2.1 AppWizard 1.2.2 ClassWizard 1.3 项目与项目工作区 1 ...

  3. VC++程序设计与应用--对话框

    目录 前言 一.对话框 1.1 对话框概述 1.1.1  对话框的类型 1.1.2  对话框的CDialog类 1.1.3  对话框的组成 1.2 模态对话框 1.2.1 设计对话框模板资源 1.2. ...

  4. VC++程序设计与应用--图形和文本输出

    目录 前言 一.图形与文本 1.1 图形设备接口和设备环境 1.1.1 图形设备接口 1.1.2 设备环境 1.1.3 设备环境类 1.1.4  颜色的设置 1.1.5  获取设备环境 1.2 GDI ...

  5. c 语言 多进程,VC++中进程与多进程管理的方法详解

    本文实例讲述了VC++中进程与多进程管理的方法,分享给大家供大家参考.具体方法分析如下: 摘要: 本文主要介绍了多任务管理中的多进程管理技术,对进程的互斥运行.子进程的创建与结束等作了较详细的阐述. ...

  6. Win32程序设计(Windows程序设计机理)

    Win32程序设计,又常常被叫做SDK/API编程,现在使用Win32的程序员确实已经很少了,主要是因为用win32写代码比用vc写起来还累,但是Win32编程常常又是非常有效率的,现在用的比较多的就 ...

  7. VC++ 自定义消息学习总结

    VC添加自定义消息 http://blog.csdn.net/jinnee_cumtb/article/details/4524375     VC的ClassWizard不允许增加用户自定义消息,所 ...

  8. VC小技巧汇总之对话框技巧

    这篇文章主要介绍了VC小技巧汇总之对话框技巧,非常实用!对于进行VC开发有一定的参考借鉴价值,需要的朋友可以参考下 本文搜集汇总了VC中关于对话框常用的一些技巧,对于进行VC开发由于一定的参考借鉴价值 ...

  9. createprocess重启程序_C++_VC程序设计中CreateProcess用法注意事项,对于windows程序设计来说,启动 - phpStudy...

    VC程序设计中CreateProcess用法注意事项 对于windows程序设计来说,启动一个进程有三种方法:WinExec,ShellExecute,CreateProcess.这里仅对Create ...

最新文章

  1. CodeIgniter2.0中sqlserver驱动返回受影响行数问题解决
  2. js 中声明变量 “提前”
  3. c语言如何一直变换颜色,【图片】(原创)用纯C变了个变色输出字符的程序。。。【c语言吧】_百度贴吧...
  4. 实现CStack类遇到的问题
  5. 安卓开发之android使用webview时按后退会退出而不是回退的问题
  6. Spring MVC过滤器-委派过滤器代理(DelegatingFilterProxy)
  7. cdh官方文档看后小结(含优化项)001
  8. VirtualBox配置
  9. 活动目录中组的类型和可用范围
  10. 电大计算机阅读英语作文,(2017年电大)电大英语作文整理20篇.doc
  11. OpenGL可编程管线
  12. java计算机毕业设计高校墨香文学社管理系统源码+mysql数据库+系统+lw文档+部署
  13. android 电视 vob格式转换,佳佳Android视频格式转换器
  14. 笔记本电脑禁用集显会变卡?
  15. java组件叠加显示,如何让上层的组件一直在上层显示
  16. Jetson TX2 apt换源
  17. 编译、汇编、翻译原理知识概括
  18. 火星编年史_雷.布拉德伯里
  19. 准备离开:致消散的梦想
  20. linux zsh 终端,linux安装zsh终端

热门文章

  1. 模糊神经网络+c代码
  2. 如何评价亚马逊AI新开源自动机器学习项目AutoGluon?
  3. 教你用TensorFlow搭建AlexNet
  4. 【译】如何提出好的Code Review反馈
  5. R语言绘图 | 折线图画法,如何画出你满意的图?
  6. JQuery基础-》带有案例-隔行换色-全选-QQ表情-下拉框左右移动
  7. 2022-2-18 两地调度
  8. 简易vue2.0双向数据绑定
  9. 如何写出更加契合浙大MBA项目提面申请资料?
  10. 微信找不到nfc功能_手机中的NFC功能不会用?试试微信“通用”中开启,网友:很实用...