1、DLL基本理论

    在Windows操作系统中,几乎所有的内容都是以DLL的形式存在的。

1、DLL基本概念

    语言程序要从目标代码(.obj)外部引用函数,可以通过俩种途径实现——静态链接和动态链接。

1.1、静态链接

    该种方式下,链接程序首先对库文件(.lib)进行搜索,直到在某个库中,找到包含函数的对象模块为止。然后,链接程序把这个对象模块复制到可执行文件(.exe)中。链接程序负责维护对该函数的所有引用。

1.2、动态链接

    该种方式下,链接程序同样先对库文件(.lib)进行搜索,直到在某个库中,找到所引用函数的输入记录为止。注意,不同于静态链接的对象模块,这里查找的是输入记录,它不直接包含函数的代码或者数据,而是指定一个动态链接库(.dll)。该动态链接库包含函数的函数名(或函数序号)和代码。然后,链接程序把输入记录复制到可执行文件中,产生一次对该函数的动态链接。

2、DLL的分类

    微软的Visual C++支持3种DLL,它们分别是Non-MFC DLL、Regular DLL和Extension DLL。

2.1、Non-MFC DLL

    这种动态链接库没有采用MFC的类库结构,而是直接用C语言写的DLL。它的导出函数是标准的C接口,能被MFC和非MFC编写的应用程序调用。相比采用MFC类库编写的DLL,它占用很少的磁盘和内存空间。

2.2、Regular DLL

    这种动态链接库和下面的Extension DLL一样,是MFC类库编写的。它的一个显著地特点是,在源文件里有一个继承自CWinApp的类,导出的对象可以是C函数、C++函数或者C++成员函数。只要应用程序能调用C函数,它就可以调用常规DLL。

2.3、Extension DLL

    这种动态链接库是由MFC的动态链接版本创建,且只能被使用MFC类库编写的应用程序调用。(程序员必须在DLL的DllMain函数中添加初始化代码和结束代码)

3、DLL的工作原理

    应用程序打开动态链接库时,把动态链接库的执行代码映射到进程的地址空间中。而动态链接库中的数据,应用程序则不是通过映射方式获取,而是做了一个备份。

3.1、文件映射

    当应用程序调用动态链接库时,系统首先要为这个动态链接库建立一个文件映射视图,然后搜寻调用者的地址空间,将文件视图映射到进程的地址空间中。如果同时又有另外一个应用程序使用这个动态链接库,那么只是简单地将这个动态链接库的另一个文件视图映射到这个进程的地址空间。使用这个动态链接库的每一个进程,都是这个动态链接库的一个映射视图。

3.2、引用表

    将文件映射到位后,系统要检查调用者和动态链接库的引用表,并把每个DLL函数新分配的虚地址插入调用者的输入库中。如果系统需要调整动态链接库中的引用表,需要复制被修改过的内存页面。由于多个进程调用相同的动态链接库时,这个动态链接库会被映射到不同的虚地址,所以不同进程对这个动态链接库模块进行了不同的地址修改。

3.3、内存分配

    在默认情况下,动态链接库为变量分配的所有内存空间,都是由调用这个动态链接库的进程的堆分配的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值