视窗操作系统应用程序接口(Windows API),有非正式的简称法为WinAPI,是微软对于Windows操作系统中可用的内核应用程序编程接口的称法。它设计为由C/C++程序调用,而且它也是应用软件与Windows系统最直接的交互方式。而大多数驱动程序所需要的对Windows系统的更底层次访问接口,由所用版本的Windows的Native API来提供接口。 Windows有一个软件开发包(SDK, software development kit)提供相应的文档和工具,以使程序员开发使用Windows API的软件和利用Windows技术。
历史
Windows API总会为程序员提供大量的构建不同Windows的底层结构,这有助于为Windows程序员开发应用程序提供大量的灵活性和功能。但是,它同样使Windows applications要负责处理大量底层且有时是繁琐的与图形用户界面(GUI)相关的操作。 Charles Petzold, 许多有关Windows API的畅销书的作者曾经说过: <blockquote class="toccolours" style="float:none; padding: 10px 15px 10px 15px; display:table;"> The original hello-world program in the Windows 1.0 SDK was a bit of a scandal. HELLO.C was about 150 lines long, and the HELLO.RC resource s cript had another 20 or so more lines. (...) Veteran C programmers often curled up in horror or laughter when encountering the Windows hello-world program. – <cite style="font-style:normal;">Charles Petzold, Programming Microsoft Windows with C#</cite> </blockquote> 常用的例子程序Hello world program,通常是用来演示一个系统上最简单的程序(即打印一行"Hello World")。 这些年来,Windows操作系统已经今非昔比,而Windows API也随之改变和成长并反映出这种变化。Windows API的 Windows 1.0 版本只提供不到450个函数调用(Subroutine),而现在的版本提供了上千个。然而,整体而言,Windows接口保持了相当好的一致性,古老的Windows 1.0程序对习惯于现在版本Windows API的程序员也并不陌生。 Microsoft特别强调维持软件的向后兼容性。为了实现此一目标,有时微软甚至不惜支持使用了非官方乃至(编程上)非法的API的软件。Raymond Chen,一位致力于Windows API的Windows开发者,曾提及他: <blockquote class="toccolours" style="float:none; padding: 10px 15px 10px 15px; display:table;"> could probably write for months solely about bad things apps do and what we had to do to get them to work again (often in spite of themselves). Which is why I get particularly furious when people accuse Microsoft of maliciously breaking applications during OS upgrades. If any application failed to run on Windows 95, I took it as a personal failure. – <cite style="font-style:normal;">Raymond Chen, What about BOZOSLIVEHERE and TABTHETEXTOUTFORWIMPS?</cite> </blockquote>
程序通信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的软件,编译器必须能处理和导入微软相关的DLLs和COM对象。编译器必须接受一种C或C++方言,并处理揭示了内部API函数名称的接口定义语言(Interface des cription language)文件和头文件。概括而言,这些预备条件(编译器、开发工具、库和头文件)被统称为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中的实现示例(这个简化的例子使得用户可以让命令按钮在窗体上四处移动):
<code> 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 </code>
<code> If Command1.MousePointer = 14 Then Call ReleaseCapture Call SendMessage(Command1.hWnd, WM_NCLBUTTONDOWN, ByVal HTCAPTION, ByVal 0&) End If </code>