第十章 WINDOWS 接口控制

Post on 19-Mar-2016

161 views 0 download

description

第十章 WINDOWS 接口控制. 1 、 Windows 环境下编程的基本知识 2 、 Windows 环境下的端口操作 3 、 Windows 操作系统的 API 调用 4 、 Windows 下 DLL 编程技术及应用 5 、 Windows 下的串行通信接口 6 、线程控制技术. Windows 接口控制的必要性. Windows 操作系统为 PC 机用户提供了标准的用户图形界面。其强大的图形处理能力和简单灵便的操作,使很多即使对计算机不是很了解的人也很容易使用计算机,深受广大用户欢迎。 - PowerPoint PPT Presentation

Transcript of 第十章 WINDOWS 接口控制

第十章 第十章 WINDOWSWINDOWS 接口控制接口控制1 、 Windows 环境下编程的基本知识 2 、 Windows 环境下的端口操作3 、 Windows 操作系统的 API 调用4 、 Windows 下 DLL 编程技术及应用5 、 Windows 下的串行通信接口6 、线程控制技术

Windows Windows 接口控制的必要性接口控制的必要性Windows 操作系统为 PC 机用户提供了标准的用户图形界面。其强大的图形处理能力和简单灵便的操作,使很多即使对计算机不是很了解的人也很容易使用计算机,深受广大用户欢迎。大多数计算机检测、控制等应用程序的开发,都已转向或逐渐转向 Windows 环境下的编程。

在 Windows 环境下实现对计算机硬件资源和内存资源的访问(如端口 I/O 、 DMA 、中断、直接内存访问等),对外设的控制和管理是目前工业控制、数据采集系统开发的重要方面。本书的第一章到第八章,介绍了 DOS 环境下用汇编语言和 TurbO C 语言,利用计算机的硬件资源开发、编写接口控制程序的方法。本章主要介绍在 Windows 环境下如何实现对计算机的各种接口的控制和访问,以便开发在 Wind

ows 环境下的控制应用程序。

WindowsWindows 环境下编程的基本知识环境下编程的基本知识 1 、 处理器的工作模式 80X86 处理器的工作模式有三种:实模式、保护模式和虚拟 86 模式。其中实模式和虚拟 86 模式是为了和早期的 8086处理器兼容而设计的,以保证用户早期设计的软硬件资源得以继续使用。计算机系统在不同的环境和条件下在这三种模式中切换工作。

1 )实模式80386 处理器被复位或加电时,以实模式启动。这时处理器中的各寄存器以实模式的初始化值工作。80386 处理器相当于一个快速的 8086 处理器在工作。虽然 80386 是 32 位机,但在实模式时的存储器寻址方式和 8086 的 16 位机一样,由段寄存器的内容乘以 16 做基地址,加上段内的偏移地址形成最终的物理地址。这时候它的 32 位地址线只使用了低 20 位,最大寻址空间 1MB 。

实模式下的中断处理方式和 8086 处理器一样,也用中断向量表来定位中断服务程序地址。中断向量表的结构也和 8086 处理器一样,每 4 个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址。实模式下 80386 不支持优先级,所有的指令相当于工作在特权级(优先级 0 ),所以所有的特权级的指令都可以执行,包括读写控制寄存器 CR

0 等。

80386 开机时就是在实模式下初始化 32 位的 4 个控制寄存器 CR0 ~ CR3 、 48 位的全局描述符表寄存器 GDTR 、 16 位的局部描述符表寄存器LDTR 、 48 位的中断描述符表寄存器 IDTR 、任务状态段寄存器 TR 等管理寄存器及页表等,然后再通过修改 CR0 寄存器,使其保护模式的使能位 PE (位 0 )置位( =1 )而进入保护模式工作的。

实模式下不支持硬件上的多任务切换。

2 )保护模式当 80386 工作在保护模式下时,它的所有功能都是可用的。它的 32 根地址线都可寻址,物理寻址空间高达 4GB 。在保护模式下,支持内存分页机制,提供了对虚拟内存的良好支持。与 8086 只可寻址 1M 的物理地址空间相比, 80386 可寻址的 4G 物理地址空间确实是够大的了,但是至今,实际的微机系统仍不可能安装如此巨大的物理内存。因此,为了运行大型程序和真正实现多任务,虚拟内存技术就成为必须的了。

在保护模式下 80386 支持多任务,可以依靠硬件,仅在一条指令中实现任务切换。任务环境的保护工作是由处理器自动完成的。在保护模式下, 80386还支持优先级机制,不同的程序可以在不同的优先级上运行。优先级分 0~3共 4 个级别。操作系统运行在最高级 0 上,应用程序则运行在比较低的级别上。配合良好的检查机制后,系统既可以在任务间实现数据的安全共享,也可以很好地隔离各任务。

实现从实模式切换到保护模式,首先要建立保护模式必需的一些数据表,如全局描述符表 GDT 和中断描述符表等,然后通过修改控制寄存器 CR0 的控制位 PE (位 0 )来实现。

DOS 操作系统运行于实模式下,而 Windows 操作系统运行于保护模式下。

3 )虚拟 86 模式虚拟 86 模式是为了操作系统运行在支持多任务的保护模式下,仍能执行 8086 程序而设置的。虽然 80386 处理器已经提供了实模式来兼容 8086程序,但 80386 在实模式下的 8086 程序实际上只是运行得快一些,对 CPU 的管理还是独占的。而且,在保护模式的多任务环境下运行 8086 程序时,程序中的很多指令和保护模式的环境是格格不入的,如段寻址方式、对中断的处理和 I/O 操作的特权问题等。为此, 80386 处理器又设计了一个虚拟 86 模式。

虚拟 86 模式是以任务的形式在保护模式上运行的。在 80386 上可以同时支持由多个真正的 80386 任务和虚拟 86 模式构成的任务。在虚拟 86 模式下, 80386 支持任务切换和内存分页。在 Windows 操作系统中,有一部分程序专门用来管理虚拟 86 模式的任务,称为虚拟 86 管理程序。

为了和 8086 程序的寻址方式兼容,虚拟 86 模式采用和 8086 一样的寻址方式,即用段寄存器乘以 16 做基地址,再配合偏移地址形成线性地址,寻址 1MB 的空间。当多个虚拟 86 任务要运行时, Windows 操作系统利用分页机制将不同虚拟 86 任务的地址空间影射到不同的物理地址上去,使每个虚拟 86 任务看起来都是在使用自己的 1MB 地址空间。

8086代码中,有相当一部分指令在保护模式下属于特权指令,如屏蔽中断的 cli 和中断返回指令 iret 等。这些指令在 8086 程序中是合法的。如果不能让这些指令执行, 8086 程序就无法工作,而要让它执行,操作系统又会出错。为了解决这个问题,虚拟 86 管理程序采用虚拟的方法来执行这些指令。让这些特权指令执行的时候引起保护异常,虚拟 86 管理程序在异常处理程序中检查这些产生异常的指令,如果是中断指令,则从虚拟 86 任务的中断向量表中取出中断处理程序的入口地址,并将控制转移过去;如果是危及操作系统的指令,如 cli 等,则简单地忽略这些指令,在异常处理程序返回的时候直接返回到下一条指令。

通过这些措施,保证了 8086 程序既可以正常运行下去,在执行这些指令时又觉察不到已经被虚拟86 管理程序作了手脚,而操作系统又不会因执行了这些指令受影响。 MS-DOS 应用程序在 Windows 操作系统中就是这样运行的。

处理器的保护机制处理器的保护机制80286之前的处理器只支持单任务,操作系统并没有安全性可言,计算机全部的资源包括操作系统的内部资源都可以任凭程序员调用。对于多任务的 Windows 操作系统,某个程序若随意使用了一些如关中断等影响别的任务执行的指令后,就可能使整个系统陷入瘫痪。所以 80286及以上的处理器引入了优先级的的概念。 80386处理器共设 4 个( 0 ~ 3 )优先级。 0 级是最高级(特权级); 3 级是最低级(用户级); 1 级和 2 级介于它们之间。

特权级代码一般是操作系统的代码,可以访问全部资源;其余级别的代码一般是用户程序,可以访问的资源受到限制。80386 采用保护机制,主要是为了检查和防止低级别代码的越权操作,如访问了不该访问的数据、端口以及调用了高优先级的代码等。保护机制主要由如下几方面组成:

· 段的类型检查——段的类型是由段的描述符指定的,主要属性有是否可执行,是否可读和是否可写等。而 CS , DS ,和 SS 等段选择器是否能装入某种类型的段描述符是有限制的。如果段类型检查通不过,则处理器会产生一般性保护异常或堆栈异常。· 页的类型检查——除了可以在段级别上指定整个段是否可以读写外,在页表中也可以为每个页指定是否可读写。对于特权级下的代码,所有的页都是可以写的。但对于 1 , 2 , 3 级的代码,还要根据页表中的 R/W项决定是否可读写,若企图对只读的页进行写操作会产生页异常。

· 访问数据时的级别检查——优先级低的代码不能访问优先级高的数据段。 80386 的段描述符中有一个 DPL域(描述符优先级),表示这个段可以被访问的最低优先级。而段选择器中含有 RPL域(请求优先级),表示当前执行代码的优先级。只有 DPL 在数值上大于或等于 RPL 值的时候,该段才是可以访问的,否则会产生一般性异常保护。

· 控制转移的检查——在处理器中,有很多指令可以实现控制转移,如 jmp , call , ret , int 和iert 等。但在存在多任务的系统中,优先级低的代码不能随意转移到优先级高的代码中去。所以执行到这些指令时,处理器要检查转移的目的位置是否合法。

· 指令集的检查——有两类指令可以影响保护机制。第一类是能改变全局描述符表 GDT 、局部描述符表 LDT 、中断描述符表 IDT 以及控制寄存器等关键寄存器的指令,称为特权指令;第二类是能操作 I/O 端口的指令以及 cli 和 sti 等能改变中断允许状态的指令,称为敏感指令。显然,如果用户级的程序允许用 cli禁止一切中断(包括系统时钟中断),那此时整个系统将无法正常运行,所以这些指令的运行要受到限制。特权指令只能在优先级 0 上才能运行,而敏感指令取决于 eflags 寄存器中的 IOPL 位。只有该位表示的优先级高于或等于当前代码段的优先级时,指令才可以执行。

·I/O 操作的保护—— I/O 地址也是受保护的对象。因为通过 I/O 的操作可以绕过系统对很多硬件进行控制。 80386 可以单独为 I/O 空间提供保护,每个任务有个任务段 TSS ,用来记录任务切换的信息。 TSS 中有个 I/O允许位图,用来表示对应的 I/O 端口是否可以操作。某个 I/O 地址在位图中对应数据位为 0 时表示可以操作;如果为1则还要看 eflags 中的 IOPL 位,它表示的优先级高于当前代码段的优先级,才允许访问该 I/O端口。

WindowsWindows 的保护机制的保护机制Windows 操作系统是个支持多任务的操作系统。Windows 操作系统的一个重要任务是管理好系统的资源,保证各任务在能正常使用系统资源的同时,又不影响别的任务正常使用系统的资源。

因此,它最首要的宗旨就是“稳定压倒一切”。任何权限的开放可能引发的安全问题都是很严重的,如在 Windows9X 操作系统中,中断描述符是用户可写的, CIH病毒可利用它将自己的权限提高到优先级 0;而 Windows NT 下的中断描述符是用户不可写的, CIH病毒在 Windows NT下也就无法进驻内存了。

因此, Windiws 操作系统干脆设计为尽量为用户程序“安排好一切”。比如对 Win32 汇编程序来说,整个源程序都不用管各种段寄存器,操作系统已为用户程序的代码段、数据段和堆栈段都预定义好了段描述符。这些段的起始地址都为 0 ,限长都为 ffffffff ,即可以直接寻找全部的 4GB 地址空间。程序开始执行时, CS , DS , ES , SS 都已经指向了正确的描述符,在整个程序的生命周期内,程序员不必改动这些段寄存器,也不必关心它们的值究竟是多少。这在 DOS 汇编是不可想象的。

在 Windows 下,操作系统运行于优先级 0 ,应用程序运行于优先级 3 。因为 Alpha 计算机只支持两个优先级,为了便于将应用程序移植到 Alpha 计算机, Windows 操作系统不使用优先级 1 和 2 。Windows 操作系统充分利用了 80386 的保护机制,所有和操作系统密切相关的东西都是受保护的。

运行于优先级 3 上的程序有很多限制。如编 Win32 程序,所有的特权指令都是不可执行的,如 lgdt , lldt , lidt 指令;对 CRx , TRx等寄存器赋值等。代码段是不可写的,数据段只有变量部分的页面是可写的。虽然可以寻找所有的 4GB 空间,但访问了超出权限以外的东西还是会引发保护异常的。在 Windows 98 中,系统硬件用到的 I/O 端口是受保护的,但其余的 I/O则可以操作。如用一块地址是 300h 的插卡,应用程序是可以直接对该端口操作的。但要操作 3F8H (串口)和 1F0H(硬盘端口)等系统已定义的端口就不行了。在 Windows NT 中,任何的端口操作都是禁止的。

如果违反了 Windows 的“保护条例”,处理器会毫不犹豫的把控制权转移到对应的异常处理程序中去。 Windows会在处理程序中产生一个“非法操作”对话框把用户的程序判“死刑”。在 Windows 9x 中,系统有时会用一个蓝屏幕来通知用户程序试图访问一个不存在的内存页。如果程序调用的 DLL 中有错,那麽错误还是会算在应用程序头上,因为 DLL 的地址空间是被影射到应用程序空间中的。

Windows 9x 本身是 16 位和 32 位混合的操作系统,为了兼容 DOS 和 Win16 程序,很多的保护措施做起来往往力不从心。系统内部往往会出现越权操作,以至蓝屏不断,这就已经不是用户程序问题了。

WindowsWindows 环境下的端口操作环境下的端口操作 DOS 环境下编程,需要了解 CPU 的结构、 CPU 的工作方式、各种硬件芯片、电路的工作原理、使用系统的端口资源、设计实现要求的电路功能和编程方法,及 DO

S 系统的工作方式等各方面的知识。应用系统的每一个功能的实现,都要设计者亲历亲为。系统中的所有硬件、软件资源,对设计者而言,也都可以随意使用。在 Windows 环境下, DOS 环境下的这些情况发生了根本的变化。

首先, Windows 环境下的操作系统在给用户提供了强大的图形功能界面的同时,又把计算机的硬件全部封装到其内核中去。由于其保护模式的存在,系统设计者再也不能象在

DOS 环境时那样,直接对计算机中的硬件随意编程操作。这对于计算机应用系统设计者而言,使用系统硬件资源是不可回避的、又必须解决问题。以下通过简单的例子,说明Windows 环境下用户如何使用系统硬件资源、使用系统硬件资源时可能出现的问题及原因。

DelphiDelphi 环境下的端口操作环境下的端口操作Delphi具有功能强大的可视化编程环境,是目前 Win

dows 环境下应用系统开发的主要工具之一。它由美国 Inprise公司提供,经过不断的改进和升级,提供了更加完善的可重用可视化组件库( VCL )和使用更加方便的快速开发工具,众多的功能组件,为编程人员开发各种应用系统提供了很大的方便。Delphi具有运行速度快、功能强、易于学习和使用、开发迅速等特点,只需编写少量的代码就可以快捷地开发出高效的 Windows 应用程序。

为了方便检测结果,用一段汇编程序为例。它是一个通过对 PC 机中的 8253 定时 / 计数器编程,控制 PC 机上的喇叭发出一定频率、一定时间音响的程序。在 DOS 中编译运行后, PC 机上的喇叭可发出一秒左右的固定频率的声音。在 Windows 98 环境下,用 Delphi 6 的开发环境。经 Delphi 6 编译、运行,用鼠标点击 Form1 中的 Button1 , PC 机的喇叭将发出与原来在 DO

S 环境下运行程序时同样频率和时间长度的声音。说明Windows 98 环境下对计算机中的端口读、写操作都是成功的。

而同样是这个程序,同样这一台计算机,当进入Windows XP 环境下的 Delphi 6 时执行这程序时,系统立即产生异常类操作保护,弹出如下图10—1 所示警告窗口信息。

程序停留在开头的out 43H,al处不能继续执行了。因为 Windows 操作系统此时认为,对端口的读写必须是具有特权级的指令,不允许用户级的指令对端口进行读和写。喇叭当然也不会响了。由此可见, Windows 环境下的端口操作成功与否,是有条件的。

用 C++ Builder 6 编译、运行这发声程序的结果与 Delphi 6 时一样,在 Windows 98 环境下可以正常工作, Windows XP 环境下则不能正常工作。其原因是一样的。因为 Windows 操作系统此时同样认为,对端口的读写必须是具有特权级的指令,不允许用户级的指令对端口进行读和写。喇叭当然也不会响了。由此可见, Windows 环境下的端口操作成功与否,尽管开发工具不同,但同样是有条件的,决定权在 Microsoft 的 Windows 操作系统上。

WindowsWindows 操作系统的操作系统的 APIAPI 调用调用 1 、 API 是什么Win32 指的是 32 位的 Windows 操作系统, Wi

n32 API 即为 Microsoft 32 位平台的 Windows 应用程序编程接口( Application Programming Interface )。所有在 Win32平台上运行的应用程序都可以调用这些函数。在 Win32 API 中,包括了大量的函数、结构和消息等,它不仅为应用程序所调用,它也是 Windows自身的一部分, Windows自身的运行也要调用这些 API函数。

在 DOS 下,操作系统的功能是通过各种软中断来实现的。在 Windows 中,操作系统使用动态连接库来代替中断服务程序提供系统功能。Windows 应用程序所调用的 API函数都是在运行时才连接的,而提供这些函数的文件就是动态连接库。Windows 程序中那些调用 API 的语句,在 DOS程序中就是对软中断的调用。

使用 Win32 API ,应用程序可以充分挖掘Windows 的 32 位操作系统的潜力。

Mircrosoft 的所有 32 位平台都支持统一的 API ,包括函数、结构、消息、宏及接口。使用 Win32 API 不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。

在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些函数只能在更强大的平台上实现其功能。例如,安全函数只能在 Windows NT 操作系统下使用。另外一些主要差别就是系统限制,比如值的范围约束,或函数可管理的项目个数等等。

在 Windows 程序设计领域处于发展初期时, Windows 程序员可使用的编程工具唯有 API函数。这些函数在程序员手中犹如“积木块”一样,可搭建出各种界面丰富、功能灵活的应用程序。不过,由于这些函数结构复杂,所以往往难以理解,而且容易误用。随着软件技术的不断发展,在 Windows平台上出现了很多优秀的可视化编程环境,程序员可以采用 " 所见即所得 " 的编程方式来开发具有精美用户界面和功能的应用程序。这些可视化编程环境操作简便、界面友好,比如: Visual C++ , Delphi , Visual Basic 等等。在这些工具中提供了大量的类库和各种控件,它们替代了 API 的神秘功能。

这些类库和控件都是构筑在 Windows API 的基础上的,但它们使用方便,加速了 Windows 应用程序的开发,所以受到程序员的普遍采用。有了这些类库和控件,程序员们便可以把主要精力放在整体功能的设计上,而不必过于关注具体细节。不过,这也导致了非常多的程序员在类库面前 "固步自封 " ,对下层 API函数的强大功能一无所知。

实际上。程序员要想开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用 API函数。类库和控件使应用程序的开发容易得多,但它们只提供 Microsoft Windows 的一般功能。对于一些比较复杂和特殊的功能来说,单使用类库和控件是难以实现的,必须直接使用 API函数来编写。API函数是构筑整个 Windows框架的基石,只有充分理解和利用 API函数,才能深入到 Windo

ws 的内部,充分发挥各种 32 位平台的强大功能和灵活性,才能成功地扩展和突破类库、控件和可视开发环境的限制。

学习调用学习调用 APIAPI

Win 32 API 实际是一种以新的方法代替 DOS 中的软中断的方式。Win 32 的系统功能模块放在 Windows 的动态连接库( DDL )中, DLL 是一种 Windows 的可执行文件,采用的是和 .exe文件同样的 PE格式,在其格式文件头的导出表中,以字符串形式指出了这个 DLL 能提供的函数列表。应用程序要以字符串类型的函数名来指定自己要调用的函数。

Win 32 API 的核心由 3 个 DLL 提供,他们是:·KERNEL32.DLL—— 系统服务功能。包括内存管理、任务管理和动态连接等。·GDI32.DDL—— 图形设备接口。利用 VGA 和 D

RV之类的显示设备驱动程序完成显示文本和矩形等功能。·USER32.DDL—— 用户接口服务。建立窗口和传送消息等。Win32 API还包括许多其他函数,它们也是由 DL

L 提供。

和在 DOS 中用中断方式调用系统功能一样,用 API 方式调用存放在动态连接库 DLL 中的函数也要约定一个规范,来定义函数的调用方法、参数的传递方法和参数的定义。

由于 Windows 系统的规模和复杂程度比 DOS 大得多,所以在使用一个 API 时,带的参数数量多达十几个是常有的事,在 DOS 中靠寄存器来传递参数的方法显然是不可能了。以下通过一个简单的 Win32 汇编程序调用 API 为例说明调用 API函数的具体方法。

.386 .model flat, stdcall

option casemap :none ; case sensitiveinclude windows.incinclude user32.incinclude kernel32.incincludelib user32.libincludelib kernel32.lib

.dataszCaption db 'Win32 汇编程序调用 Windows API 函数例子 ',0szText db ' 本简单程序调用的是 Windows消息窗口的 API函数,要显示的信息在此设定 ',0

.codestart:

invoke MessageBox, NULL,offset szText,offset szCaption,MB_OKinvoke ExitProcess,NULL

end start

WindowsWindows 下下 DLLDLL编程技术及应用编程技术及应用 10 . 4 . 1 DLL 的技术特点DLL(Dynamic Linkable Library)称动态连接库。可以说它是由 C 语言函数库和 Pascal库单元的概念发展起来的。

所有的 C 语言标准库函数都存放在某一个函数库中,同时用户也可以用 LIB 程序创建自己的函数库。在链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数代码,并把这些函数代码添加到可执行文件中。C 语言对应用函数的这种方法,与只把函数存储在已编译的 .OBJ文件中的方式相比,显然更有利于程序代码的复用。

对于 Windows 这样的多任务系统而言, C 语言的调用函数库函数这种方法仍显得过于累赘。因为多个 Windows 任务往往都要实现屏幕输出、消息处理、内存管理、对话框等操作,若每个程序都要拥有这些属于自己的函数,多任务的 Windows 应用程序将出现大量重复的功能代码,整个 Windows 程序也将变得非常庞大。所以, Windows 系统的发展,要求允许同时运行的多个程序能共享一组函数的单一拷贝。

动态连接库就是在这样的情况下出现的。DLL调用不需要重复编译和分别链接库函数,链接器从中拷贝它需要的所有库函数后,只是把确切的函数地址传送给调用这些函数的程序,并不把 DLLs文件链接到程序上。直到程序运行并调用一个 DLLs 中的函数时,该程序才要求Windows从这个 DLLs函数的地址中寻找被调用函数执行。

采用这种方法, DLLs 达到了复用代码的极限。即一旦某一 DLL 被装入内存,这 DLL函数就可以被系统中任何正在运行的应用程序软件共同使用,而不必将这函数的多个拷贝都装入内存。而对于DLLs ,函数储存在一个独立的动态链接库文件中。

在创建Windows 程序时,链接过程 DLL 可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式,从而减少了编程设计上的不便。Windows 系统已经把很多窗口操作程序“标准化”了,编程人员可通过 DLL 很方便地调用它们。

以上就是 DLL技术的第一大优点:尽可能的代码复用。它一方面减轻了编程人员程序开发的工作量,另一方面也大大节省了内存空间,提高了内存的使用效率。

DLL 的第二技术特点,是集成代码。将复杂程序分成相应的代码块。如编写类库,把这些库放在各自的 DLL 中,就是集成代码。它的好处是更新代码时比较方便。在编程中应用程序不可避免地会出现考虑不周、甚至错误之处,当发现 DLL 中的这类问题时,只需修改好这些问题,并制作新的 DLL替换原来的就可以了,而不必重新编译已编写好的整个应用程序,更可以不必重新安装应用系统,就能实现程序性能的改善和提高。

第三个特点是有利于应用程序的国际化。在信息技术高速发展的今天,编写的程序仅仅用本国语言制作菜单、对话框、帮助文件、错误信息等是不够的。必须考虑走国际化的道路,而解决的方法就是多国语言的实现。可以为每一种语言编写相应的 DLL ,或将所有语言字符资源放在同一个 DLL 中,而在运行时加载用户指定的语言版本。

第四个特点是 DLL 的编制与具体的编程语言及编译器无关。只要遵守 DLL 的开发规范和编程策略,并安排正确的调用接口,不管用何种编程语言编制的 DLL都具有通用性。例如在 Visual C++ 编制的 DLL 程序,可用于 BC 、

VC 、 VB 、 Delphi 等多种语言环境中。

第五个特点是计算机接口开发人员所关注的底层接口编程控制问题。在许多用户设计的实际应用系统的编程任务中,常常要实现软件对硬件资源和内存资源的访问,例如端口 I/O 、 DMA 、中断、直接内存访问等等 。若是编制 DOS 程序,这是轻而易举的事情,但要是编制 Windows 程序,尤其是 WindowsNT 环境下的程序,就会显得较困难。

因为 Windows具有“与设备无关”的特性,不提倡与机器底层的东西打交道。如果直接用 Windows 的 API函数或 I/O 读写指令进行访问和操作,程序运行时往往就会产生保护模式错误甚至死机,更严重的情况会导致系统崩溃。在 Windows 下怎样方便地解决上述问题呢?用 D

LL技术就是良好途径之一。

其实, DLL 也是 Windows 最重要的组成要素,Windows 中的许多新功能、新特性都是通过 DLL来实现的。 Windows 本身就是由许多的 DLL 组成的,它最基本的三大组成模块 Kernel 、 GDI 和 User 都是 DLL ,它所有的库模块也都设计成 DLL 。其实凡是以 .DLL 、 .DRV 、 .FON 、 .SYS 和许多以 .EXE 为扩展名的系统文件都是 DLL ,要是打开 Windows\System 目录,就可以看到许多的 DLL 模块。

尽管 DLL 在 Ring3 优先级下运行,仍是实现硬件接口的简便途径。因此掌握它、应用它对编程人员来说是非常重要的。在 Windows 系统中,对于一些不能嵌入汇编语言又没有 I/O函数的语言(如 Visual Basic 、 Vis

ual Foxpro 等),通常可通过动态连接库扩展接口 I/O 控制函数,实现对接口的控制。