分享

Windows系统下的动态链接库浅谈

 幸福的落叶@ing 2010-09-09

Windows系统下的动态链接库浅谈





                                                                                               Windows系统下的动态链接库浅谈
                                                                                                                                                曾宇知
                                                                                                                            西南科技大学计算机科学与技术学院计科0502班 学号:20051447
摘要:
动态链接库(DLL,即Dynamic-Link-Library)是可执行的模块,是Windows的一种极其重要的技术。它使得开发人员可以通过编写动态链接库,方便灵活的实现大型程序的开发,按自己的意愿对操作系统进行扩展。API是Application Programming Interface 应用程序编写接口的缩写,极大意义上方便了用户在某一平台下的编程。
关键字:动态链接,DLL,API
动态链接库是操作系统中的一种极其重要的技术。它使得开发人员可以通过编写动态链接库,方便灵活的实现大型程序的开发,按自己的意愿对操作系统进行扩展。API是Application Programming Interface 应用程序编写接口的缩写,极大意义上方便了用户在某一平台下的编程。(本论文以Windows平台为基准展开讨论。)
动态链接库是可执行的模块,但它没有自己的堆栈,必须在调用动态链接库函数的程序环境下运行。动态链接库不仅可以作为一个运行模块,包括函数代码,而且可以包含程序以外的任何数据或资源(位图、图标等等)。动态链接库就是给应用程序提供函数或者资源。
动态链接与静态链接是相对立的。静态链接的时候,可执行程序内包含了所访问的函数的代码,可执行程序占用的空间较大;但运行时,不需要其他模块支持,从而速度相对较快。动态链接的可执行程序中不包含动态访问的函数代码,仅仅包含对它的参考,运行时需要其他模块(DLL)的支持,速度相对较慢。
它也可以看作是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件的扩展名一般是dll, 也有可能是drv、sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用 程序直接或间接调用。
动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件 的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数 的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信 息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调 用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。
一般情况下,如果一个应用程序使 用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到 调用这个DLL的进程地址空间。在Win32系统中,每个进程拥有自己的32位线性地址空间,如果一个DLL被多个进程调用,每个进程都会收到该DLL的 一份映像。与16位Windows不同,在Win32中DLL可以看作是每个进程自己的代码
下面我们可以通过一具体的例子来进一部认清动态链接库。作者实验平台:Windows XP+sp2/Visual C++ 6.0
下面通过例子介绍如何在动态链接库中定义函数、资源、和类以及如何在工程中使用动态链接库中已定义的函数、资源、类。
函数的定义和使用方法:
第一步:
运行AppWizard,定义项目名为mydll,选择MFC AppWizard(dll),而不是MFC AppWizards(exe)。
第二步:
在这个例子中,只有一个AppWizard屏幕出现,选择MFC扩展DLL(MFC Extension DLL (using shared MFC DLL),点击FINISH生成工程。
第三步:
点击File中的New,选择C/C++ Header File,File Name中输入dll,点击OK,创建dll.h。输入extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3); ,保存。
第四步:
点击File中的New,选择C++ Source File,File Name中输入dll,点击OK,创建dll.cpp。输入

#include "stdafx.h"
#include "dll.h"
extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3)
{
return x1+x2+x3;
}
编译生成mydll.dll和mydll.lib。
第五步:
选择Project 中Add To Project 中的New , 重新生成一个工程,选择MFC AppWizards(exe),项目名为mydlltest , 选择Single Document ,点击FINISH,生成一个新的工程。选择菜单中的Project àSet Active Project àmydlltest ,将mydlltest设为当前活动工程。
第六步:
拷贝...\mydll\debug\mydll.dll 到 ..\mydlltest\debug\下,拷贝...\mydll\debug\mydll.lib到...\mydlltest\目录下。
第七步:
在mydlltestView.cpp中的#endif下添加
extern "C" __declspec(dllimport) int fun(int x1,int x2,int x3);
在void CMydlltestView::OnDraw(CDC* pDC)中添加代码如下:
void CMydlltestView::OnDraw(CDC* pDC)
{
CMydlltestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int x=fun(1,2,3);
CString str;
str.Format("%d",str);
pDC->TextOut(10,10,x);
}
第八步:
在WorkSpace中的mydlltest files上点击右键,选择Add files to Project ,将mydll.dll添加到工程。好了,我们的工作做完了,运行一下看看吧!
二、 类的添加和使用步骤:
在mydll中生成一个新类,类的声明处改为class AFX_EXT_CLASS CMyClass ,在此类中和其他类一样添加自己需要的变量和函数,编译生成新的dll和lib,重复上面的第六步,在mydlltest中利用上面的方法生成一个myclass.h文件,拷贝mydll中myclass.h的所有代码到新生成的myclass.h中。在需要使用dll中CmyClass类的文件中包含myclass.h,然后我们就可以向其他类一样使用该类了。三、 字符串的定义和使用:
在mydll中定义字符串资源,编译生成新的dll和lib,重复上面的第六步,在mydlltest中的myclass.h中添加 #define IDS_MYSTR 1(假设我们定义的字符串资源的ID号为IDS_MYSTR),在需要是要该字符串的地方添加#include "myclass.h",即可使用该字符串了。
CString str2;
str2.LoadString(IDS_MYSTR);
四、 对话框的定义和使用
在mydll中定义对话框资源,生成一个新类CDlg,类的声明处改为class AFX_EXT_CLASS CDlg : public CDialog ,像其他对话框一样定义对话框的属性和功能,编译生成新的dll和lib,重复上面的第六步,在mydlltest中利用上面的方法生成一个dlg.h文件,拷贝mydll中dlg.h的所有代码到新生成的dlg.h中。在需要使用dll中此对话框资源的文件中包含dlg.h,然后我们就可以向其他对话框一样使用此对话框了。
CDlg dlg;
dlg.DoModal();
好了,到这里我们所有的功能就都实现了。
最后再谈谈API。(Advanced Programmers Interface)高级程序员接口)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以Windows告诉发生了什么。
这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VC在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法。
这也就是说,你用VC写出的每行代码都会被VC转换为API函数传递给Windows.例如,Form1.Print...VC 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数。
通过动态链接库和API函数,Windows这个操作系统以生动的图形化界面呈现在了千千万万用户面前。给今后的编程和系统扩展提供了广泛而又简易的空间。
参考文献:
《Programming Windows ,Fifth Edition》Charles Petzold
《Windows API》Microsoft Library Platform SDK
《Windows MSDN》Microsoft Library Platform
VC中的动态链接库应用-科技论文网
电脑技术》 - windows动态链接库应用
经典教程:深入学习Windows动态链接库 - 21CN.COM

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多