<windows核心编程>动态链接库(一)

来源:互联网 发布:mac无损音乐播放器 编辑:程序博客网 时间:2024/06/17 09:59

自出版Windows操作系统以来,动态链接库(DLL)一直是这个操作系统的基础。Windows API中所有的函数都包含在DLL中,3个最重要的DLL是

Kernel32.dll:它包含用于管理内存、进程和线程的各个函数;

User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;

GDI32.dll, 它包含用于画图和显示文本的各个函数。

DLL :dynamic  linking library 即动态链接库。DLL被广泛的应用在各种系统中,深入了解它,是作为计算机开发人员的必要功课!

使用DLL的一些原因:

   他们扩展了应用程序的特性。        DLL能够动态地装入进程的地址空间,因此应用程序可以根据需要装入相应的代                                                             码, 然后根据需要执行操作。

  他们可以用许多种编程语言来编写。 你可以应用各种语言来编写DLL

  他们简化了软件项目的管理。        软件开发可以分组,并且各自工作在不同的模块上,比较容易管理。比如产品附                                                                带100DLL,就可以每个程序员分N个来做。

  他们有助于节省内存。                    如果两个或者多个应用程序使用同一个DLL,那个这个DLL的页面只要放入RAM一                                                            次,所有应用程序都可以共享他的各个页面

  他们有助于资源的共享。                 DLL可以包含对话框模板、字符串、图标和位图等资源,多个应用程序可以使用                                                            DLL共享这些资源。

  他们有助于解决平台的差异。     无论什么平台操作,只要DLL存在,就可以使用里面的代码,运行里面的函数。

  他们可以用于一些特殊的目的。 比如最简单的插件,可以直接挂接,如Web浏览器加载的、用于创建内容丰富的                                                           Web页面的ActiveX控件,传说的网络插件。

DLL的应用:

在应用DLL之前,必须 先把DLL载入进应用程序地址空间内,通过两种方法来实现一种是通过显示运行时链接,一种是通过隐式载入时链接。

先熟悉一下模块之间是如何隐含地相互链接的。隐含链接是最常用的链接类型。

创造DLL:首先建立一个带有输出原型/结构/符号的头文件,构建dll时所有的源文件都必须包含该头文件,另外可执行文件也需要该头文件

创建源文件来实现DLL模块中想要导出的函数和变量。该源文件在构造可执行文件时并不需要该源文件。     

        编译器为每个 C/C++源文件生成.obj模块。链接生成的.obj模块,生成独立的DLL模块,该文件在构造可执行文件时可直接应用。如果至少输出一个函数或者变量,那么链接程序也生成lib文件。

因此构建可执行文件时一定要处理好lib文件,一个是包含这个lib文件,一个是在编译器中找到指定目录。

对应vc来说主要就是Property 的linker选项,General里面的Additional Library Directories 加入lib所在目录。

在Input选项中加入.lib这样就可以连接lib库。

创造exe文件:

建立带有输入原型/结构/符号的头文件,建立引用输入函数/变量的C/C++源文件。编译器编译每一个源文件

然后生成对应的.obj源文件。连接程序会把各个.obj模块连接起来,产生一个.exe文件,(他包含了所需要的DLL模块的名字和输入符号的列表)。

运行应用程序:

加载程序为.exe创建地址空间。

加载程序将需要的DLL加载到地址空间中进程的主线程开始执行,应用程序启动运行。

当然不是所有的电脑程序都包含你需要的DLL文件,如此,两种方法,一种是把需要的DLL文件都包含到应用程序文件中,另一个就是使用静态运行时库,在C/C++编译选项里,Runtime library选项,可以选择是用动态运行时库,还是用静态运行时库。

对程序员来说,可能应用DLL时,我们还是想要调试,看看数据运行路线,内部操作是否按照我们的意愿来运行,这是要主要的一个文件就是.pdb文件。个人操作习惯,如果需要可自行增加。

程序代码:暂时未加


由于导入段不包含路径只包含名称,所以程序必须按照特定的目录搜索DLL文件

加载程序的搜索顺序:

1、可执行文件目录。

2、windows系统目录。

3、windows目录的System目录。

4、windows目录。

5、进程当前目录。

6、PATH环境变量所列出的目录。

为了防止DLL伪造,windows进行了设定,使对windows目录的搜索先于应用程序的当前目录,此设置可以通过改变注册表进行改变。


                 

0 0