《WINDOWS程序设计》(005)1.2 Windows编程选项-1.2.1 API及内存管理模式
1.2Windows编程选项为了展示Windows编程的各种技术,本书提供了大量的范例程序。这些程序都是用C写成的,并调用基本Windows API。我个人认为这是Windows编程最经典的方式。从1985年时的Windows 1.0就是这样,时至今日这种方式依然有效。
1.2.1API及内存管理模式
对于程序员来说,操作系统的功能完全由API来定义。API涵盖了应用程序所能调用的全部操作系统函数,以及相关的数据类型和结构。在Windows中,API还隐含了一种特殊的程序结构,我们在后续章节中将详细探讨这种程序结构。
一般来说,Windows API自Windows 1.0起就一直保持着很好的一致性。有Windows 98编程经验的程序员会发现Windows 1.0的程序代码看上去非常眼熟。要说API的演变也就是不断地扩充,当初的Windows 1.0只能支持不到450个函数,而今天的Windows则支持数千个。
大约是在当体系结构从16位变到32位的时候,Windows API及其语法发生了最大改变。从1.0版到3.0版,Windows一直采用16位的英特尔8086、8088及286微处理器的所谓分段内存管理模式(Segmented Memory Model,SMM)。为了保证兼容性,英特尔386之后的32位微处理器也都支持这一模式。在这种模式下,微处理器的寄存器(Register)宽度为16位,因此,C的int数据类型也是16位宽。在分段内存管理模式下,内存地址由两部分组成:一个16位的段(Segment)指针和一个16位的位移(Offset)指针。从程序员角度来看,这种方式相当繁杂,需要区分长、短指针。长指针包括一个段地址和一个位移地址,而短指针则仅仅包括在约定的段地址下的一个位移地址。
从Windows NT及Windows 95开始,利用32位英特尔386、486以及奔腾处理器,Windows开始支持32位的平面内存管理模式(平坦模式,flat模式)。C的int数据类型也因此扩展成32位宽。为32位Windows编写的程序可以直接用32位的指针访问整个平面线性内存空间。
现在我们把16位的Windows(1.0版到3.1版)的API称为Win16,而把32位的Windows(95,98以及所有NT版)的API称为Win32。从Win16到Win32转化过程中大部分函数保持不变,但也有一些需要扩展,比如图形坐标点数值从Win16的16位变成了Win32的32位。此外,Win16中有些函数调用返回的二维坐标点被压缩到一个32位的整数里,这在Win32中就行不通了。为解决这些问题,Win32增加了一些新的函数。
所有32位版本的Windows既支持Win16API以保证和原先的程序兼容,也支持Win32API以运行新的应用程序。有意思的是,Windows NT与Windows 95和Windows 98的工作方式有所不同。在Windows NT中,Win16的函数调用通过一个翻译层先被转换成32位的函数调用,然后再由操作系统来处理。而在Windows 95和Windows 98中则正好相反,Win32的函数调用通过一个翻译层先被转换成Win16的函数调用,然后再由操作系统来处理。
曾经有一段时间还有另外两组Windows API(至少在叫法上如此)。作为让程序员缩写在Windows 3.1上运行的32位应用程序的API,Win32s(s代表子集)只支持Win16所提供的函数的32位版本。另外,Windows 95的API曾经也被叫做Win32c(c代表兼容性),不过这个名称已经没人再用了。
目前可以认为Windows NT和Windows 98都支持Win32 API。但是这两个操作系统都有一些另一系统并不支持的功能。但不管怎样,由于两个系统的共性相当大,因此写一个在两个系统中都能运行的程序并非难事。并且,大家都认为这两个系统迟早有一天会合二为一。
页:
[1]