高速公路系统dll技术探析

时间:2022-07-01 11:41:12

高速公路系统dll技术探析

摘要:开发高速公路系统目的在于建立空间型的信息系统代替传统的手工信息处理方法以提高高速公路运营管理的水平,由于系统所牵涉的面非常的宽广,开发的难度很多,必须使用dll技术。该文即结合实际探讨该系统的dll技术。

关键词:dll技术;导出和导入函数;高速公路系统

中图分类号:TP302文献标识码:A文章编号:1009-3044(2010)02-453-02

Highway System dll Technical Analysis

LIN Xue-yun

(Fuqing Branch of Fujian Normal University Mathematics and Computer Science Department, Fuqing 350300, China)

Abstract: The development of highway system, the aim of building space-based information system to replace the traditional manual information processing method to improve the highway operation and management level, because the system involved a very broad face, the difficulty of developing many techniques to use dll. This paper is to explore the light of the actual technology of the system dll.

Key words: dll technology; export and import functions; highway system

1 DLL技术的产生

比较大应用程序如高速公路系统都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。其中可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Libary了)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。Microsoft Windows自己就将一些主要的系统功能以DLL模块的形式实现。例如IE中的一些基本功能就是由DLL文件实现的,它可以被其它应用程序调用和集成。

2 dll的定义

一般来说,DLL是一种磁盘文件(通常带有DLL扩展名),它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含各种导出函数,用于向外界提供服务。Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。

在Win32环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。DLL现在越来越容易编写。Win32已经大大简化了其编程模式,并有许多来自Appwizard和MFC类库的支持。

3 DLL编程技术

3.1 导出和导入函数的匹配

DLL文件中包含一个导出函数表。这些导出函数由它们的符号名和称为标识号的整数与外界联系起来。函数表中还包含了DLL中函数的地址。当应用程序加载DLL模块时时,它并不知道调用函数的实际地址,但它知道函数的符号名和标识号。动态链接过程在加载的 DLL模块时动态建立一个函数调用与函数地址的对应表。如果重新编译和重建DLL文件,并不需要修改应用程序,除非你改变了导出函数的符号名和参数序列。

简单的DLL文件只为应用程序提供导出函数,比较复杂的DLL文件除了提供导出函数以外,还调用其它DLL文件中的函数。这样,一个特殊的DLL可以既有导入函数,又有导入函数。这并不是一个问题,因为动态链接过程可以处理交叉相关的情况。

但也可以在模块定义(DEF)文件中列出导出函数,不过这样做常常引起更多的麻烦。

仅有导入和导出声明并不能使应用程序内部的函数调用链接到相应的DLL文件上。应用程序的项目必须为链接程序指定所需的输入库(LIB文件)。而且应用程序事实上必须至少包含一个对DLL函数的调用。

3.2 与DLL模块建立链接

应用程序导入函数与DLL文件中的导出函数进行链接有两种方式:隐式链接和显式链接。所谓的隐式链接是指在应用程序中不需指明DLL文件的实际存储路径,程序员不需关心DLL文件的实际装载。而显式链接与此相反。

采用隐式链接方式,程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。

当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。

当应用程序运行过程中需要加载DLL文件。根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。

显式链接方式对于集成化的开发语言(例如VB)比较适合。有了显式链接,程序员就不必再使用导入文件,而是直接调用LoadLibary函数,并指定DLL的路径作为参数。应用程序在调用GetProcAddress函数时使用这一参数。GetProcAddress函数将符号名或标识号转换为DLL内部的地址。

假设有一个导出如下函数的DLL文件:

在隐式链接方式中,所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载在到内存中;但如果采用显式链接方式,程序员可以决定DLL文件何时加载或不加载。显式链接在运行时决定加载哪个DLL文件。例如,可以将一个带有字符串资源的DLL模块以英语加载,而另一个以西班牙语加载。应用程序在用户选择了合适的语种后再加载与之对应的DLL文件。

使用符号名链接与标识号链接

在Winl6环境中,符号名链接效率较低,所以标识号链接是主要的链接方式。在Win32环境中,符号名链接的效率得到了改善。Microsoft现在推荐使用符号名链接。但在MFC库中的DLL版本仍然采用的是标识号链接。一个典型的MFC程序可能会链接到数百个MFC DLL函数上。采用标识号链接的应用程序的EXE文件体相对较小,因为它不必包含导入函数的长字符串符号名。

3.3 编写DUMain函数

DllMain函数是DLL模块的默认入口点。当Windows加载DLL模块时调用这一函数。系统首先调用全局对象的构造函数,然后调用全局函数DLLMain。DLLMain函数不仅在将DLL链接加载到进程时被调用,在DLL模块与进程分离时(以及其它时候)也被调用。

如果程序员没有为DLL模块编写一个DLLMain函数,系统会从其它运行库中引入一个不做任何操作的缺省DLLMain函数版本。在单个线程启动和终止时,DLLMain函数也被调用。

4 小结

本文是结合开发高速公路系统的各个模块来探析dll技术的具体应用。由于系统规模庞大,所牵涉的面很广,这只是其中的一个部分,作一个鸟瞰似的介绍。

参考文献:

[1] 林康红,唐海峰,奉玲,等.动态链接库DLL在虚拟仪器中的应用[J].自动化与仪表,2002(5).

[2] 罗锦,孟晨,苏振中.动态链接库技术在虚拟仪器系统构建中的应用[J].电子技术,2002(9).

[3] 刘宝祥.谈谈动态链接与动态链接库[J].科技信息:学术版,2006,(7).

[4] 孙滨,周杨,郭晓东.动态链接库技术及其应用[J].电脑编程技巧与维护,2009(15).

上一篇:谈计算机基础教学改革 下一篇:PowerPoint中插入声音方法的研究