Windows API基础.docx
- 文档编号:10164929
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:27
- 大小:35.64KB
Windows API基础.docx
《Windows API基础.docx》由会员分享,可在线阅读,更多相关《Windows API基础.docx(27页珍藏版)》请在冰豆网上搜索。
WindowsAPI基础
第1章WindowsAPI基础
微软公司随Windows操作系统发布的应用程序接口(applicationprogrammingInterface),即通常所说的API,是Windows系统为其下运行的各类应用程序提供的重要服务功能。
微软的所有Win32平台都支持统一的API调用,包括函数、结构、消息、宏及接口。
通过Windows系统提供的API服务功能,应用程序可以充分挖掘Windows系统的潜力。
API的核心是一组用C语言编写的供外部应用程序调用的函数过程,这些函数封装在Windows系统的一系列DLL动态库文件中。
通过调用动态库文件中的函数,程序员可以在自己开发的应用中方便地向系统请求或执行更低级的设备访问,利用和控制系统资源,实现与系统相同或相似的功能。
由此可以降低应用系统开发的复杂性,提高开发效率,并且无论是应用供应商还是最终用户都无需支付额外的费用。
1.1API概念
1.1.1API定义及作用
基于多任务的Windows操作系统除了协调应用程序的执行、分配内存、管理系统资源外,同时也是一个服务中心。
调用这个服务中心的各种服务,可以协助应用程序打开窗口、绘制图形、访问网络、实现设备控制等功能。
这些服务大都是通过系统接口(Interface)实现的。
由于服务的对象是系统下运行的各种应用程序(application),所以微软在其开发者技术文档库MSDN中将其称之为ApplicationProgrammingInterface,简称API。
事实上,API的核心是微软公司随Windows操作系统发布的,封装在一系列DLL动态库中的一组供外部应用程序调用的函数过程。
通过这些过程用户可以构建WindowsNT、Windows95/98、Windows2000和WindowsXP下各种Win32应用程序。
用户开发的应用系统可以通过应用程序接口向计算机的操作系统请求或执行更低级的设备访问操作。
当Windows操作系统开始占据主导地位的时候,开发Windows平台下的应用程序成为现实的需要。
而在Windows程序设计领域处于发展的初期,程序员所能使用的编程工具惟有API函数,这些函数是Windows提供给应用程序与操作系统的接口,它们犹如儿童搭积木一样,可以构建出各种界面丰富、功能灵活的应用程序。
所以可以认为它API是构筑整个Windows框架的基石,在它的下面是Windows操作系统的核心,而在它的上面则是所有华丽的Windows应用程序。
在VisualC++、VisualBasic、PowerBuilder(后文简称为PB)、Delphi这些优秀可视化编程工具的诞生之前,程序员想开发Windows下的应用就必须借助API。
由于API固有的复杂性和程序员缺乏对其深刻的了解,令许多人在其面前望而却步。
然而随着软件技术的不断推陈出新,在Windows平台上出现了很多优秀的可视化编程环境,程序员可以采用“即见即所得”的编程方式来开发具有精美用户界面和功能强大的应用程序。
可视化编程工具提供了大量的类库和各种控件,它们替代了API的神秘功能。
事实上这些类库和控件都是构架在Win32API函数基础之上的,是封装了的API函数的集合。
它们把常用的API函数组合在一起成为一个控件或类库,并赋予其方便的使用方法,极大地加速了Windows应用程序开发的过程。
有了这些控件和类库,程序员便可以把主要精力放在企业业务逻辑的实现和应用整体功能的设计上,而不必过于关注界面设计、设备控制、系统资源访问等技术细节。
实际上,如果要开发出更灵活、更实用、更具效率的应用程序,就必然要涉及到直接使用API函数。
虽然类库和控件简化了应用程序的开发,但它们只提供Windows的一般功能,对于比较复杂和特殊的功能,当使用类库和控件难以实现时,就需要借助于API来实现。
需要指出的是,Windows系统的API服务是面向所有用户的,只要用户取得了Windows的使用权,用户也就同时拥有了API的访问权。
VisualBasic、Dephi、PB等各种Windows下的开发语言都可以通过自己特有的方式访问API。
虽然所有在Win32平台上运行的应用程序都有权享受操作系统提供的API服务,但无可置疑的是,在C语言中访问API函数有着得天独厚的便利,这是因为API函数的定义以及在参数的传递上是以C语言为标准的。
但是,只要在PB中按照一定的规则声明API函数,PB开发同样可以享受到这种服务。
操作系统提供的API由函数、消息、数据结构、数据类型以及语句组成,在Windows应用程序的开发和运行中,使用最多的部分是从Windows中调用API函数的代码元素,包括以下3个部分:
(1)函数声明;
(2)用户自定义类型,即数据结构;
(3)传递给函数以及从函数中返回的值常量声明。
1.1.2API与动态链接库
Windows系统提供的API函数存放在多个动态链接库中。
在进一步介绍API函数之前,有必要了解一下静态链接与动态链接的区别。
在DOS时代,程序员使用静态库扩充应用程序的功能。
静态库包含完成一些特定功能的子过程,在程序开发中可以通过链接将它们包含到应用中,它将成为应用不可分割的一部分,在程序运行时,一次性整体装入。
例如,一个由第三方提供的Printer.obj库包含许多关于打印机驱动例程,但用户只有一台HPLaserJet激光打印机,也就是说应用程序仅用到其中的该打印机的驱动。
当链接到应用程序时,所有打印机的驱动将随Printer.obj全部链接到执行文件中,结果是应用程序的可执行代码臃肿和占用系统资源的增加。
PB、VisualBasic、Delphi等众多的开发语言支持使用动态链接,它在应用程序执行期间调用另一个程序中的例程。
之所以称之为动态链接,这是因为在应用程序调用动态链接库中的某个函数时,应用程序并不复制被调用库函数中的代码,而只是从动态库中复制一些指示信息,指出被调用函数属于那个动态链接库。
因此,在应用程序可执行文件中,存放的不是被调用函数的代码,而是DLL中该函数的内存地址。
这样,当多个应用程序调用DLL库中的同一个函数时,不会在内存中产生该函数的多个复制,而是只有一份复制,从而可以节省大量的内存资源,提高系统的运行效率。
同时,由于应用程序与DLL库文件的相互分离,当DLL库更新后,无需修改和重新发布原有的应用的可执行文件。
不同类别的API函数分别位于Windows系统不同的动态链接库中,这些动态链接库名称及能提供的API访问服务见表1-1。
事实上,Windows系统就是构建在众多的DLL库之上的。
表1-1中列出的这些DLL库是Windows系统的核心动态链接库,还有许多动态库没有开放给用户调用。
Windows系统的这种依赖于DLL库的架构,有利于系统的升级与改造。
当系统需要扩展新的功能或更正系统的错误时,只要添加新的动态库或更新原有的动态库文件即可。
表1-1Windows动态库及支持的API服务
动态链接库
描述
Advapi32.dll
高级API服务。
支持大量的接口函数,其中包括许多安全与注册表访问方面的接口函数
Comdlg32.dll
通用对话框API库。
提供与系统对话框相同的函数支持,包括文件打开保存通用对话框、字体选择、颜色选择通用对话框、打印相关对话框等
Comctl32.dll
通用控件API库。
提供与Windows系统一致控件支持,包含Windows系统的通用控件集。
PB提供的可视控件如列表框、文本框、树型控件都属于该控件集
Gdi32.dll
图形设备接口API库。
库中涉及设备输出相关函数,包括大多数绘图、显示环境、图元文件、坐标及字体函数等
Kernel32.dll
Win32位核心的API支持。
用于内存管理、任务管理、文件管理、资源控制及相关操作
Mapi32.dll
电子邮件接口库。
为应用程序提供添加电子邮件功能的一系列接口函数
Mpr.dll
多接口路由器库
Netapi32.dll
32位网络API库。
提供了一系列访问和控制网络的接口函数
ODBC32.dll
ODBC数据源访问接口库。
提供了用于访问不同数据库数据源的标准的接口函数,用于在应用中实现ODBC数据源访问功能
Shell32.dll
32位ShellAPI库。
应用程序可以使用Shell接口函数来增强系统Shell的各方面的功能
User32.dll
用户接口过程库。
包括消息、菜单、光标、插入标记、计时器、通信及其他大多数非显示函数
Version.dll
版本库
Winmm.dll
Windows多媒体库。
提供对系统多媒体功能的访问
Winspool.drv
后台打印接口,包含后台打印API调用
z32.dll
32位压缩过程。
提供对文件的压缩和解压缩函数
1.1.3API构成
通常情况下,API函数只是整个API的一个组成部分。
WindowsAPI除包括函数外,还包括结构、常量、回调函数和消息。
1.函数(functions)
函数是Win32API的核心,它是API处理完成各种任务实际的程序过程代码。
根据函数的作用不同,保存在不同的DLL文件中,Win32应用程序可以以特定的方式访问这些函数。
2.结构(structures)
许多API函数的参数要求一个结构,结构是多个相关变量的集合,其作为函数的参数并没有什么特殊之处。
用户所要做的就是了解结构的定义,然后在PB中创建一个相同的结构,并确保将结构的各个成员正确地从C转换为PB的数据类型。
在PB中,如果需要将整个结构作为一个参数传递,必须以引用的方式传递,不能以传值的方式传递。
在这种情况下,PB将传递结构第一个成员的地址。
和数组一样,在内存中,结构的各个成员是按连续顺序存放的。
结构定义后,在引用之前必须定义一个结构型实例变量,必要时,还需初始化结构成员(给结构成员赋值)。
3.常量(constants)
许多WindowsAPI函数的参数需要传入一个或多个预定义的常量,这些常量在Windows系统的头文件(headfiles)中定义。
常量大多代表Windows系统消息的名称和编号。
在VisualC++要使用这些标识,只要在脚本中使用Include语句包含头文件即可,而在PB中必须将其声明为实例常量才能引用。
对多个常量进行OR逻辑运算,可以将多个常量的作用包含到一个常量中。
4.回调函数(callbackfunctions)
回调函数是程序员在自己的应用程序中定义的,供Windows系统DLL或其他DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。
应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。
回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。
VisualBasic从5.0版本开始,提供了关键词AddressOf用于对回调函数的支持。
但直到PB9.0仍然未提供对回调函数功能的支持,这在一定程度上限制了Win32API函数在PB中的使用。
5.消息(messages)
对诸如PB、VisualBasic和Dephi等大多数可视化程序设计语言来讲,程序设计的核心是对象的事件、属性和方法,但对Windows系统本身而言,却是以消息处理为其控制机制。
Windows系统的消息以常量的方式给出,常量的值事实上为消息的编号。
通过向对象(如窗口)发送消息,通知对象完成指定的操作。
1.1.4从MSDN获取API信息
MSDN是英文MicrosoftDeveloperNetwork的缩写,意为“微软开发者网络”,是使用微软的开发工具或是以Windows或Internet为开发平台的开发人员的基本参考。
在MSDN中包含了1GB以上信息量的编程技巧及技术参考,包括示例代码、开发人员知识库、VisualStudio文档、SDK文档、技术文章、会议及技术讲座的论文、以及技术规范等。
微软定期出版MSDN的光盘,例如2002年4月出版的包含.Net程序设计资料MSDN光盘包含了容量为1.5GB的编程技术信息,此外可通过访问微软的有关网站(如http//
MSDN技术文档库主要包括以下内容:
(1)VisualToolsAndLanguage:
该部分包含MicrosoftVisualStudio的VisualC++、VisualBasic、VisualFoxpro的全部开发文档;
(2)OfficeDeveloperDocuments:
该部分包含Office97、Office2000、OfficeXP以及MicrosoftVisio的开发和使用文档;
(3)PlatformSDKDocuments:
包含了完整的WindowsAPI函数调用的各个方面,所有API函数文档都包含在此部分;
(4)ResourceKits:
包含从Windows95到Windows2000和XP版本的与操作系统相关的信息;
(5)KnowledgeBase:
包含微软提供的技术文章和实例等。
通过索引或搜索页面可以查找到任一API函数的C语言的原始定义,各个参数的具体数据类型和含义,以及一些在VisualC++、VisualBasic或VBA中的调用例程。
当在索引中键入一个API函数名时,下面的列表框中将自动跳转至该函数条目并高亮显示函数条目。
双击所需的函数名,将在左侧列出函数的详细说明。
每个API函数以名称、原型、参数、返回值、备注、系统要求及相关API函数的方式列出。
通过搜索页面可以搜索到指定API函数的技术文档、调用示例。
虽然,这些文档和示例大多是针对VisualC++或VisualBasic的,但仔细研读这些技术文档和示例仍可以给我们很多的帮助和启迪,或将这些示例移植到PB中。
1.2API函数的分类
标准Windows32位API函数可以分为以下几类:
(1)窗口管理(windowmanagement);
(2)窗口通用控件(commoncontrollibrary);
(3)Shell特性(windowsshell);
(4)图形设备接口(graphicsdeviceinterface);
(5)系统服务(baseservices);
(6)国际特性(international);
(7)网络服务(networkservices)。
1.2.1窗口管理函数
窗口管理函数向应用程序提供了创建和管理用户界面的方法。
用户可以使用窗口管理函数创建和使用窗口来显示输出、提示用户进行输入以及完成其他一些与用户进行交互所需的工作。
大多数应用程序都至少要创建一个窗口。
应用程序通过创建窗口类及相应的窗口过程来定义它们所用窗口的外观和行为。
窗口类可标识窗口的默认属性,比如窗口是否接受双击鼠标按钮的操作,或是否带有菜单。
窗口过程中包含的代码用于定义窗口的行为,完成所需的任务,以及处理用户的输入。
应用程序可使用图形设备接口(GDI)函数来产生窗口的输出。
由于所有的窗口都共享显示屏幕,所以应用程序不接受对整个屏幕的访问。
系统管理所有的输出内容,并对它们进行排列和剪裁,使其能够适合相应的窗口。
应用程序可以在处理输入消息时,或为了响应系统的需求而在窗口中绘图。
当窗口的大小或位置发生变化时,系统通常会向应用程序发送一个消息,要求它对该窗口中原来未显露的区域进行重画。
应用程序以消息的形式接受鼠标和键盘输入。
系统将鼠标移动、鼠标按钮操作转换为输入消息,并将这些消息放入该应用程序的消息队列中。
系统为每个应用程序都自动提供一个消息队列。
应用程序使用消息函数从消息队列中获取消息,并将它们分派给适当的窗口过程进行处理。
应用程序可以直接处理鼠标和键盘输入,也可以让系统使用菜单和键盘加速键将这些低级输入转换成命令消息,如可以使用菜单向用户展现一个命令列表。
系统对所有菜单操作所需的动作进行管理,包括让用户选择一个命令,然后再向窗口过程发送一个标识该选择的消息。
键盘快捷键是应用程序定义的按键操作组合,系统可将其转换为消息。
快捷键通常对应于菜单中的某个命令,并与该命令产生相同的消息。
应用程序通过在对话框中向用户提示附加信息来响应命令消息。
对话框实际是一个临时的窗口,用于显示信息或提示输入。
一个对话框通常由一些表示按钮和方框的控件组成,可供用户进行选择或输入信息。
对话框中可包括用于输入正文、滚动正文、从列表中选择列表项等操作的控件。
对话框管理和处理来自这些控件的输入,使应用程序可使用这些信息,来完成所要求的命令操作。
通过使用“资源”可以共享很多有用的数据,比如位图、图标、字体和字符串等,只需将这些数据作为“资源”添加到应用程序或DLL文件中。
应用程序通过使用资源函数,找到资源并将它们加载到内存来获取这些数据。
窗口管理函数还提供了其他一些与窗口有关的特性,比如插入标记(caret)、剪贴板、光标、钩子(hook)、图标以及菜单等函数。
窗口管理函数分类见表1-2。
表1-2窗口类函数及功能
窗口类函数
描述
易用特性函数(accessibilityfeatures)
Win32API提供了一些函数和结构来控制这些特性,这些特性使得有残疾的人也能很容易的使用计算机
按钮函数(button)
按钮就是一种控件,用户可通过单击按钮来向应用程序提供输入信息
插入标记函数(caret)
插入标记通常用于指示文本或图形将插入的位置
组合框函数(combobox)
使用组合框函数可以在组合框中显示或获取不同类型的数据
通用对话框函数(commondialogbox)
通用对话框是在通用对话框库中定义的,其功能是用来完成一些通用的任务,比如打开文件、打印文档等
光标函数(cursor)
应用程序使用Win32光标函数可以创建、加载、显示、移动、限制和删除光标
续表
窗口类函数
描述
对话框函数(dialogbox)
对话框是应用程序创建的一个临时窗口,用于获取用户的输入。
编辑控件函数(editcontrol)
编辑控件是一个矩形窗口,通常用在对话框中,用户可通过键盘向编辑控件中输入和编辑文本
图标函数(icon)
应用程序使用图标函数可以创建、显示、删除和复制图标
键盘加速健函数
(keyboardaccelerator)
键盘快捷键(或简称为快捷键)是一个按键操作或多个按键操作的组合,可向应用程序发送WM_COMMAND或WM_SYSCOMMAND消息
键盘输入函数(keyboardinput)
键盘输入函数提供了接受和处理键盘输入的方法
列表框函数(listBox)
使用列表框函数可以在列表框中显示或获取不同类型的数据。
菜单函数(menu)
菜单函数向Win32应用程序提供了一系列创建、管理和使用菜单的方法,包括对菜单条、菜单项
消息和消息队列函数(messageandmessagequeue)
消息和消息队列函数向Win32应用程序提供了一系列使用消息和消息队列的方法,包括对消息进行传播、发送、获取、转换等操作
鼠标输入函数(mouseinput)
鼠标输入函数提供了接受和处理鼠标输入的方法
多文档接口函数(multipledocumentinterface)
多文档接口(MDI)是应用程序定义用户界面的一种规范,在这种界面下,用户可以同时使用多个文档
资源函数(resource)
一个资源是一些二进制数据如图标、光标、菜单、对话框、位图等,可以添加到Win32应用程序的可执行文件中
滚动条函数(scrollbar)
使用滚动条函数可以创建和管理水平滚动条和垂直滚动条
窗口函数(window)
使用窗口函数可以创建和管理窗口
窗口类函数(windowclass)
一个窗口类是一个属性的集合,系统将该属性集合用作创建窗口的模板。
每个窗口都是某个窗口类的一个成员
1.2.2窗口通用控件
系统Shell提供了一些控件,使用这些控件可以使窗口具有与众不同的外观。
由于这些控件是由DLL支持的,是操作系统的一部分,所以它们对所有的应用程序都可用。
使用通用控件有助于使应用程序的用户界面与系统Shell及其他应用程序保持一致。
由于开发一个控件需要花费一定的时间,所以直接使用通用控件也可以节省大量的开发时间。
通用控件是由通用控件库Comctl32.dll支持的一个控件窗口集。
与其他控件一样,一个通用控件也是应用程序的一个子窗口,它与其他窗口联合使用,完成I/O操作。
通用控件DLL包括一个编程接口,应用程序可使用其中的函数创建和管理控件,以及从控件中接受用户输入。
1.2.3Shell特性
Win32API中包含一些接口和函数,应用程序可使用它们来增强系统Shell的各方面功能。
一个名字空间是一个符号集合,比如文件和目录名,或数据库关键字。
Shell使用一个单层结构的名字空间来组织用户关心的所有对象,包括文件、存储设备、打印机及网络资源。
名字空间类似于文件系统的目录结构,只不过名字空间中包含的是对象,而不是文件和目录。
快捷键(也称为一个Shell连接)是一个数据对象,它包含的信息可用于访问位于Shell名字空间的任何位置的其他对象。
使用快捷键时,应用程序不必知道对象的当前名字和位置就可以访问该对象。
可以通过快捷键访问的对象包括文件、文件夹、磁盘驱动器、打印机及网络资源。
有几种方法可以扩展Shell。
系统使用图标来表示Shell名字空间中的文件。
默认情况下,系统对具有相同文件扩展名的所有文件都显示相同的图标。
可以用一个图标句柄来改变某特殊文件的默认图标。
使用上下文相关菜单句柄可以修改一个上下文相关菜单的内容,这也是一种Shell扩展。
当用户右击或拖动一个对象时,系统会显示一个上下文相关菜单。
该上下文相关菜单中所包含的命令只应用在被右击或拖动的对象上。
大多数上下文相关菜单都包含一个Properties命令,用于显示所选中项目的属性表。
一个属性表由一系列重叠的窗口组成(每个窗口称为一页),用于显示有关某个对象的信息。
属性表句柄是一种Shell扩展,使用它可以向系统定义的属性表中添加页,或替换控制面板的属性表的某些页。
一个复制挂钩(Hook)句柄是一种Shell扩展,可以允许或拒绝对一个文件对象的移动、复制、删除或重命名。
系统Shell包含一个快速查看(quickview)命令,使用户可以直接查看一个文件的内容.而不必运行创建该文件的应用程序。
文件浏览器提供了一个用于查看文件的用户界面。
Shell使用文件扩展名来确定应运行哪个浏览器。
可以为新的文件格式提供文件浏览器,或用具有更强功能的浏览器来替换原来的浏览器。
文件浏览器与文件分析器联合使用,后者的功能是对文件名进行分析,以便确定应生成哪种类型文件的快速查看。
用户还可以提供其他的文件分析器来支持新的文件类型。
1.2.4图形设备接口
图形设备接口(GDI)提供了一系列的函数和相关的结构,应用程序可以使用它们在显示器、打印机或其他设备上生成图形化的输出结果。
使用GDI函数可以绘制直线、曲线、闭合图形、路径、文本以及位图图像。
所绘制的图形的颜色和风格依赖于所创建的绘图对象,即画笔、笔刷和字体。
用户可以使用画笔来绘制直线和曲线,使用笔刷来填充闭合图形的内部,使用字体来书写文本。
应用程序通过创建设备场景(DC),可以直接向指定的设备进行输出。
设备场景是一个GDI管理的结
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows API基础 API 基础