没有合适的资源?快使用搜索试试~ 我知道了~
VC++动态链接库编程[整理].pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 88 浏览量
2021-10-12
01:17:33
上传
评论
收藏 2.33MB PDF 举报
温馨提示
试读
50页
VC++动态链接库编程[整理].pdf
资源推荐
资源详情
资源评论
VC++ 动态链接库编程之基础慨念
http://soft.yesky .com/lesson/318/2166818.shtml
1.概论
先来阐述一下 DLL(Dynamic Linkable Library) 的概念,你可以简单的把 DLL
看成一种仓库, 它提供给你一些可以直接拿来用的变量、 函数或类。 在仓库的发
展史上经历了 “无库-静态链接库-动态链接库 ”的时代。静态链接库与动态链接
库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意, lib 中的指
令都被直接包含在最终生成的 EXE 文件中了。 但是若使用 DLL,该 DLL 不必被
包含在最终 EXE 文件中, EXE 文件执行时可以 “动态 ”地引用和卸载这个与 EXE
独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中
不能再包含其他的动态链接库或者静态库, 而在动态链接库中还可以再包含其他
的动态或静态链接库。
对动态链接库,我们还需建立如下概念:
(1)DLL 的编制与具体的编程语言及编译器无关
只要遵循约定的 DLL 接口规范和调用方式,用各种语言编写的 DLL 都可以
相互调用。 譬如 Windows 提供的系统 DLL(其中包括了 Windows 的 API),在
任何开发环境中都能被调用, 不在乎其是 Visual Basic 、Visual C++ 还是 Delphi 。
(2)动态链接库随处可见
我们在 Windows 目录下的 system32 文件夹中会看到 kernel32.dll 、
user32.dll 和 gdi32.dll ,windows 的大多数 API 都包含在这些 DLL 中。kernel32.dll
中的函数主要处理内存管理和进程调度; user32.dll 中的函数主要控制用户界面;
gdi32.dll 中的函数则负责图形方面的操作。
一般的程序员都用过类似 MessageBox 的函数,其实它就包含在 user32.dll
这个动态链接库中。由此可见 DLL 对我们来说其实并不陌生。
(3)VC 动态链接库的分类
Visual C++ 支持三种 DLL ,它们分别是 Non-MFC DLL (非 MFC 动态库)、
MFC Regular DLL (MFC 规则 DLL )、MFC Extension DLL (MFC 扩展 DLL )。
非 MFC 动态库不采用 MFC 类库结构,其导出函数为标准的 C 接口,能被
非 MFC 或 MFC 编写的应用程序所调用; MFC 规则 DLL 包含一个继承自
CWinApp 的类,但其无消息循环; MFC 扩展 DLL 采用 MFC 的动态链接版本创
建,它只能被用 MFC 类库所编写的应用程序所调用。
由于本文篇幅较长, 内容较多,势必需要先对阅读本文的有关事项进行说明,
下面以问答形式给出。
问:本文主要讲解什么内容?
答:本文详细介绍了 DLL 编程的方方面面,努力学完本文应可以对 DLL 有
较全面的掌握,并能编写大多数 DLL 程序。
问:如何看本文?
答:本文每一个主题的讲解都附带了源代码例程, 可以随文下载 (每个工程
都经 WINRAR 压缩)。所有这些例程都由笔者编写并在 VC++6.0 中调试通过。
当然看懂本文不是读者的最终目的, 读者应亲自动手实践才能真正掌握 DLL
的奥妙。
问:学习本文需要什么样的基础知识?
答:如果你掌握了 C,并大致掌握了 C++ ,了解一点 MFC 的知识,就可以
轻松地看懂本文。
2.静态链接库
对静态链接库的讲解不是本文的重点,但是在具体讲解 DLL 之前,通过一
个静态链接库的例子可以快速地帮助我们建立 “库”的概念。
图 1 建立一个静态链接库
如图 1,在 VC++6.0 中 new 一个名称为 libTest 的 static library 工程(单击
此处下载本工程),并新建 lib.h 和 lib.cpp 两个文件, lib.h 和 lib.cpp 的源代码
如下:
//文件: lib.h
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y); //声明为 C 编译、连接方式的外部函
数
#endif
//文件: lib.cpp
#include "lib.h"
int add(int x,int y)
{
return x + y;
}
编译这个工程就得到了一个 .lib 文件,这个文件就是一个函数库,它提供了
add 的功能。将头文件和 .lib 文件提交给用户后, 用户就可以直接使用其中的 add
函数了。
标准 Turbo C2.0 中的 C 库函数(我们用来的 scanf 、printf 、memcpy 、strcpy
等)就来自这种静态库。
下面来看看怎么使用这个库,在 libTest 工程所在的工作区内 new 一个
libCall 工程。 libCall 工程仅包含一个 main.cpp 文件,它演示了静态链接库的调
用方法,其源代码如下:
#include <stdio.h>
#include "..\lib.h"
#pragma comment( lib, "..\\debug\\libTest.lib" ) //指定与静态库一起
连接
int main(int argc, char* argv[])
{
printf( "2 + 3 = %d", add( 2, 3 ) );
}
静态链接库的调用就是这么简单, 或许我们每天都在用, 可是我们没有明白
这个概念。代码中 #pragma comment( lib , "..\\debug\\libTest.lib" ) 的意思是指本
文件生成的 .obj 文件应与 libTest.lib 一起连接。如果不用 #pragma comment 指
定,则可以直接在 VC++ 中设置, 如图 2,依次选择 tools、options 、directories 、
library files 菜单或选项,填入库文件路径。图 2 中加红圈的部分为我们添加的
libTest.lib 文件的路径。
图 2 在 VC 中设置库文件路径
这个静态链接库的例子至少让我们明白了库函数是怎么回事,它们是哪来
的。我们现在有下列模糊认识了:
(1)库不是个怪物,编写库的程序和编写一般的程序区别不大,只是库不
能单独执行;
(2)库提供一些可以给别的程序调用的东东,别的程序要调用它必须以某
种方式指明它要调用之。
以上从静态链接库分析而得到的对库的懵懂概念可以直接引申到动态链接
库中,动态链接库与静态链接库在编写和调用上的不同体现在库的外部接口定义
及调用方式略有差异。
3.库的调试与查看
在具体进入各类 DLL 的详细阐述之前,有必要对库文件的调试与查看方法
进行一下介绍,因为从下一节开始我们将面对大量的例子工程。
由于库文件不能单独执行,因而在按下 F5(开始 debug 模式执行)或
CTRL+F5 (运行)执行时,其弹出如图 3 所示的对话框,要求用户输入可执行
文件的路径来启动库函数的执行。这个时候我们输入要调用该库的 EXE 文件的
路径就可以对库进行调试了,其调试技巧与一般应用工程的调试一样。
图 3 库的调试与 “运行 ”
通常有比上述做法更好的调试途径, 那就是将库工程和应用工程 (调用库的
工程)放置在同一 VC 工作区,只对应用工程进行调试,在应用工程调用库中函
数的语句处设置断点,执行后按下 F11 ,这样就单步进入了库中的函数。第 2
节中的 libTest 和 libCall 工程就放在了同一工作区,其工程结构如图 4 所示。
图 4 把库工程和调用库的工程放入同一工作区进行调试
上述调试方法对静态链接库和动态链接库而言是一致的。 所以本文提供下载
的所有源代码中都包含了库工程和调用库的工程, 这二者都被包含在一个工作区
内,这是笔者提供这种打包下载的用意所在。
动态链接库中的导出接口可以使用 Visual C++ 的 Depends 工具进行查看,
让我们用 Depends 打开系统目录中的 user32.dll ,看到了吧?红圈内的就是几个
版本的 MessageBox 了!原来它真的在这里啊,原来它就在这里啊!
剩余49页未读,继续阅读
资源评论
czq131452007
- 粉丝: 2
- 资源: 12万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功