Windows API
Windows操作系统应用程序接口(),有非正式的简称法为WinAPI,是微软对于Windows操作系统中可用的核心应用程序编程接口的称法。它被设计为各种语言的程序调用,也是应用软件与Windows系统最直接的交互方式。大多数驱动程序需要对Windows系统更底层次访问接口,由所用版本的Windows的Native API来提供接口。
Windows有一个软件开发套件(SDK, software development kit)提供相应的文档和工具,以使程序员开发使用Windows API的软件和利用Windows技术。
歷史
Windows API總會為程式設計師提供大量的構建不同 Windows的底層結構,這有助於為 Windows 程式設計師開發應用程序提供大量的靈活性和功能。但是,它同樣使Windows应用程式要負責處理大量底層且有時是繁瑣的與图形用户界面(GUI)相關的操作。
常用的例子程式Hello world程式,通常是用來示範一個系統上最簡單的程序(即在螢幕上印出一行"Hello World")。
許多有關Windows API的暢銷書的作者查尔斯·佩佐德(Charles Petzold)曾經說過:[1]
Windows 1.0 SDK中的最初的Hello world程式或多或少沾了些丑闻。HELLO.C大约有150行,而HELLO.RC资源脚本还多加了大约20多行……在接触到Windows 的Hello world程式时,资深的C程式员通常会惊恐或大笑起来。 | ||
—— 查尔斯·佩佐德(Charles Petzold), Programming Microsoft Windows with C# |
這些年來,Windows作業系統已經今非昔比,而Windows API也隨之改變和成長並反映出這種變化。Windows API的Windows 1.0版本只提供不到450個函數調用(Subroutine),而現在的版本提供上千個。然而,整體而言,Windows接口保持了相當好的一致性,古老的Windows 1.0程序對習慣於現在版本Windows API的程式設計師也並不陌生。[2]
微软特别強調維持軟件的向後兼容性。為了實現此一目標,有時微軟甚至不惜支持使用了非官方乃至(編程上)非法的API的軟件。一位致力於Windows API的Windows開發者雷蒙德·陈(Raymond Chen)曾提及:[3]
仅仅是关于应用程序所做出的坏事以及我们让应用程序重新运作所必须(通常是在不由自主的情况下)采用的方法,我可能会写上几个月。这就是在人们指责微软在操作系统升级期间恶意破坏应用程序时,我会特别愤怒的原因。如果有任何无法在Windows95上运行的应用程序,我会将这些应用程序视为个人故障。 | ||
—— Raymond Chen, What about BOZOSLIVEHERE and TABTHETEXTOUTFORWIMPS? |
Windows API分类
Windows API所提供的功能可以归为七类:[4]
- 基础服务(Base Services)[5],提供对Windows系统可用的基础资源的访问接口。比如象:文件系统(file system)、外部设备(device)、,进程(process)、线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling)。这些功能接口位于,16位元Windows下的kernel.exe、krnl286.exe或krnl386.exe系统文件中;以及32位元Windows下的kernel32.dll和advapi32.dll中。
- 图形化用户界面(GUI)[7],提供的功能有创建和管理屏幕和大多数基本控件(control),比如按钮和滚动条。接收鼠标和键盘输入,以及其他与GUI有关的功能。这些调用接口位于:16位元Windows下的user.exe,以及32位元Windows下的user32.dll。从Windows XP版本之后,基本控件和通用对话框控件(Common Control Library)的调用接口放在comctl32.dll中。
- 通用对话框链接库(Common Dialog Box Library)[8],为应用程序提供标准对话框,比如打开/保存文件对话框、颜色对话框和字体对话框等等。这个链接库位于:16位元Windows下的commdlg.dll中,以及32位元Windows下comdlg32.dll中。它被归类为User Interface API之下。
- 通用控件链接库(Common Control Library)[9],为应用程序提供接口来访问操作系统提供的一些高级控件。比如像:状态栏(status bar)、进度条(progress bars)、工具栏(toolbar)和标签(tab)。这个链接库位于:16位元Windows下的commctrl.dll中,以及32位元Windows下comctl32.dll中。它被归类为User Interface API之下。使用API函数InitCommonControls或InitCommonControlsEx初始化(即注册)相应的窗口类。InitCommonControlsEx实际注册指定的通用控件的窗口类。注意ICC_WIN95_CLASSES代表12个控件类的集合。InitCommonControls是个空函数,但会使应用程序加载comctl32.dll;在comctl32.dll加载到进程时会在DLL的入口点调用InitCommonControlsEx注册ICC_WIN95_CLASSES控件类。
- Windows外壳(Windows Shell)[10][11],作为Windows API的组成部分,不仅允许应用程序访问Windows外壳提供的功能,还对之有所改进和增强。它位于16位元Windows下的shell.dll中,以及32位元Windows下的shell32.dll中(Windows 95则在shlwapi.dll中)。它被归类为User Interface API之下。
Web相关API
Internet Explorer网页浏览器也提供许多程序接口[13],提供以下接口:
- 可嵌入的网页浏览器控件(以及 Trident / MSHTML 引擎),位于shdocvw.dll和mshtml.dll之中。
- urlmon.dll中的命名服务(URL moniters service),利用COM对象为应用程序提供解析URL服务。应用程序也可以为其他程序提供自己的URL处理程序。
- WinInet IE的网络层,支持HTTP和HTTPS等协议。
- 一个支持多种语言文本的链接库(mlang.dll)。
- DirectX Transforms,一组图像过滤组件。
- XML支持(MSXML组件)。
和Windows的邮件功能相关的API,例如地址本和邮件API,在Windows 7取消邮件功能之后也随之从Windows API中去除。由于Windows Mail在Windows Vista上取代了Outlook Express,对应的API也随之变化。
多媒体相关API
自从Windows 95 OSR2以来,Microsoft把DirectX API作为Windows安装的一部分。DirectX提供一组松散相关的多媒体和游戏服务,包括:
- Direct3D可以作为OpenGL的替代,来访问3D加速硬件。
- DirectDraw提供硬件加速2D framebuffer(帧缓冲)访问接口。自DirectX 9以来,相比Direct3D更倾向于后者,因为Direct3D提供更全面的高性能图形功能(毕竟2D渲染只是3D渲染的(不严格)子集)。已被Direct2D替代。
- DirectSound提供底层次的硬件加速声卡访问。被XAudio替代。
- DirectInput用来与输入设备(搖桿和gamepad)进行通信。已被DirectX 9中引入的XInput所替代。
- DirectPlay提供一个多人游戏的架构(multiplayer gaming infrastructure)。它已经被DirectX 9所替代,Microsoft不建议用它开发游戏。
- DirectShow可以创建和运行通用的多媒体管道(generic multimedia pipelines)。它可以与GStreamer框架相媲美,并且经常被用来渲染游戏视频和创建媒体播放器(Windows Media Player及诸如FFDShow之类的编解码器正是基于此;但在Windows Vista及更高版本中,DirectShow被Media Foundation替代)。不建议用DirectShow开发游戏。
- DirectMusic提供类似MIDI的功能。与DirectSound一起被XAudio替代。
程序通信API
Windows API的功能主要通过使作業系統和应用程序之间的交互来实现。为了实现不同Windows应用程序的通信,微軟随着主要Windows API,推出一系列的技术。最初的DDE(Dynamic Data Exchange)升级为物件連結與嵌入(Object Linking and Embedding),再后来是组件对象模型(COM)。
封装库
微軟利用许多更底层的Windows API函数,开发出许多封装库(wrapper),让应用程序以更抽象的方式与Windows API进行交互。MFC(Microsoft Foundation Class Library)用C++ 類別来封装Windows API的功能,因而允许用更為物件導向的方式与API进行交互。ATL(Active Template Library)是对COM的面向模板(template oriented)的封装。WTL(Windows Template Library)作为ATL的增强,被用来作为MFC的轻型的替代物。
其他著名的封装库是Borland公司的产品,为了与MFC竞争而推出的OWL(Object Windows Library)提供了类似的物件導向封装。不久Borland又推出VCL(Visual Component Library)来取而代之。
大多數的Windows 程序框架(application framework)是对Windows API的封装,因而.NET Framework、Java以及其他在Windows下的程序语言,都是(或者包含)封装库。
其它实现
尽管微软的Windows API实现有版权保护,但被普遍认可的是,根据美国的法律先例,其他厂商仍然可以通过提供一致的API来模拟Windows,而不会侵犯版权。
Wine是为Unix类平台提供Win32 API相容層的尝试。ReactOS走得更远,提供了整个Windows操作系统的模拟,与Wine项目紧密结合,以便促进代码重用和兼容。HX DOS-Extender是另一个模拟Windows API的项目,允许通过DOS命令行来运行简单的Windows程序。
编译器支持
为了开发使用Windows API的软件,编译器必须能处理和导入微软相关的DLLs或者COM对象。编译器必须接受一种C或C++方言,或者能够处理揭示了内部API函数名称的接口定义语言(Interface description language)文件和头文件及生成的类型库(Type Library)。概括而言,这些预备条件(编译器、开发工具、库和头文件)被统称为Microsoft Platform SDK。很长时间以来,包含了编译器和开发工具的专利产品如Microsoft Visual Studio系列和Borland编译器(尽管至少在Windows下,SDK是可以从整个IDE环境中剥离出来单独免费下载的,据Microsoft Platform SDK Update),是仅有的能提供整套开发环境的选择。如今MinGW和Cygwin也能提供一套这样的开发环境——是基于采用一种独立头文件集合来保证能与微软DLL连接的GCC。LCC-Win32是由Jacob Navia维护的一种“非商业用途免费”的C编译器。Pellesc是由Pelle Orinius维护的一种免费C编译器。MASM32是一个成熟的项目,它通过自制或由SDK平台转换的头文件和库,并利用32位微软汇编器来实现支持Windows API。
微软相关的编译器支持也是异常处理(Structured Exception Handling)特性所需要的。这个体制有双重目的:它提供了语言相关的异常处理赖以实现的基础,同时也是内核藉以通知程序发生诸如解除一个非法指针的引用或堆栈溢出之类异常状况的渠道。甫一被引入Windows 95和NT,微软/Borland C++编译器就有使用这种体制的能力,然而实际实现未被公开,而且必须经过反向工程方可用于Wine项目和免费编译器。SEH的运行机制是先把异常的句柄推入堆栈,继而将它们添加到存储于线程本地资源(即线程环境块的首字段)的一个链表里。事实上,每一个未有程序本身处理的异常,都将由会弹出常规Windows崩溃对话框的默认backstop处理器处理。
API在Visual Basic中的实现示例(这个简化的例子使得用户可以让命令按钮在窗体上四处移动):
Private Const WM_NCLBUTTONDOWN As Long = &HA1&
Private Const HTCAPTION As Long = 2&
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, wParam As Any, lParam As Any) As Long
If Command1.MousePointer = 14 Then
Call ReleaseCapture
Call SendMessage(Command1.hWnd, WM_NCLBUTTONDOWN, ByVal HTCAPTION, ByVal 0&)
End If
注释
- Charles Petzold (December 2001). Programming Microsoft Windows with C#. Microsoft Press. Beyond the Console, page 47.
- Charles Petzold(November 11, 1998). Programming Windows, Fifth Edition. Microsoft Press. APIs and Memory Models, page 9.
- Raymond Chen(October 15, 2003). What about BOZOSLIVEHERE and TABTHETEXTOUTFORWIMPS? 页面存档备份,存于 Retrieved August 27, 2005.
- Microsoft Developer Network(July 2005). Overview of the Windows API. 页面存档备份,存于 Retrieved August 28, 2005.
- Microsoft Developer Network(July 2005). Base Services. Retrieved August 28, 2005.
- Microsoft Developer Network(July 2005). Graphics Device Interface. Retrieved August 28, 2005.
- Microsoft Developer Network(July 2005). User Interface. Retrieved August 28, 2005.
- Microsoft Developer Network(2005). Common Dialog Box Library. Retrieved September 22, 2005.
- Microsoft Developer Network(July 2005). Common Control Library. Retrieved August 28, 2005.
- Microsoft Developer Network(July 2005). Windows Shell. Retrieved August 28, 2005.
- Microsoft Developer Network(2005). Shell Programmer's Guide. Retrieved August 28, 2005.
- Microsoft Developer Network(July 2005). Network Services. Retrieved August 28, 2005.
- Microsoft Developer Network(January 2006). Programming and reusing the browser 页面存档备份,存于 Retrieved January 22, 2006.
参考资料
- Diomidis Spinellis。A critique of the Windows application programming interface. Computer Standards & Interfaces, 20(1):1–8, November 1998. doi:10.1016/S0920-5489(98)00012-9。
外部链接
- Microsoft Developer Network Windows API development guide
- The Old New Thing Weblog by Microsoft developer Raymond Chen,who works on the Windows API and posts extensively about it.
- Localization in Win32
- pinvoke.net: the interop wiki! PINVOKE.NET attempts to address the difficulty of calling Win32 or other unmanaged APIs in managed code (languages such as C# and VB .NET).
- Windows API Notes
- WinapiZone Free tutorials and extensions for Winapi
- Stromcode's Win32/C++ tutorial (formerly Glowdot) an extensive, 20-part tutorial.
- Catch22 Tutorials Well documented Win32 API tutorials for developing small, nifty, and efficient programs in Windows.
- theForger's Win32 API Tutorial
- Using Win32 API in Visual FoxPro 页面存档备份,存于 online reference