什么是WinAPI
当前位置:以往代写 > C/C++ 教程 >什么是WinAPI
2019-06-13

什么是WinAPI

什么是WinAPI

副标题#e#

视窗操纵系统应用措施接口(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的脱销书的作者曾经说过:[1]

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 script had another 20 or so more lines. (…) Veteran C programmers often curled up in horror or laughter when encountering the Windows hello-world program.
—Charles Petzold, Programming Microsoft Windows with C#

常用的例子措施Hello world措施,凡是是用来演示一个系统上最简朴的措施(即打印一行"Hello World")。

这些年来,Windows操纵系统已经今是昨非,而Windows API也随之改变和生长并反应出这种变革。Windows API的 Windows 1.0 版本只提供不到450个函数挪用(Subroutine),而此刻的版本提供了上千个。然而,整体而言,Windows接口保持了相当好的一致性,陈腐的Windows 1.0措施对习惯于此刻版本Windows API的措施员也并不生疏。[2]

Microsoft出格强调维持软件的向后兼容性。为了实现此一方针,有时微软甚至不吝支持利用了非官方以致(编程上)犯科的API的软件。Raymond Chen,一位致力于Windows API的Windows开拓者,曾提及他:[3]

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.
—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中。

图形设备接口(GDI)[6],提供成果为:输出图形内容到显示器、打印机以及其他外部输出设备。它位于16位Windows下的gdi.exe;以及32位Windows下的gdi32.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之下。

Windows外壳(Windows Shell)[10][11],作为Windows API的构成部门,不只答允应用措施会见操纵系统shell提供的成果,还对之有所改造和加强。它位于16位Windows下的shell.dll中,以及32位Windows下的shell32.dll中(Windows 95则在 shlwapi.dll中)。 它被归类为User Interface API之下。

网络处事(Network Services)[12],为会见操纵系统提供的多种网络 成果提供接口。它包罗NetBIOS、Winsock、NetDDE及RPC等。


#p#副标题#e#

Web相关API

Internet Explorer网页欣赏器也提供很多措施接口 [13],它将不会在Windows Vista中集成,出格提供以下接口:

可嵌入的网页欣赏器控件,位于shdocvw.dll和mshtml.dll之中。

urlmon.dll中的定名处事(URL moniters service),操作COM工具为应用措施提供理会URL处事。应用措施也可觉得其他措施提供本身的URL处理惩罚措施。

一个支持多种语言文本的链接库(mlang.dll)。

DirectX Transforms,一组图像过滤组件。

XML支持(MSXML组件)。

会见Windows Address Book。

多媒体相关API

自从Windows 95 OSR2以来,Microsoft把DirectX API 作为Windows安装的一部门。DirectX提供一组松散相关的多媒体和游戏处事,包罗:

Direct3D可以作为OpenGL的替代,来会见3D加快硬件。

#p#分页标题#e#

DirectDraw提供硬件加快2D framebuffer(帧缓冲)会见接口。自DirectX 9以来,对比Direct3D更倾向于后者,因为Direct3D提供更全面的高机能图形成果(究竟2D渲染只是3D渲染的子集)。

DirectSound提供底条理的硬件加快声卡会见。

DirectInput用来与输入设备(摇杆和gamepad)举办通信。

DirectPlay提供一个多人游戏的架构(multiplayer gaming infrastructure)。它已经被DirectX 9所替代,Microsoft不发起用它举办游戏开拓。

DirectShow可以建设和运行一般的多媒体管道(generic multimedia pipelines)。它可以与GStreamer框架相媲美,而且常常被用来渲染游戏视频和建设media players(Windows Media Player正是基于此)。DirectShow不被发起举办游戏开拓。

DirectMusic

措施通信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措施。

#p#副标题#e#

编译器支持

为了开拓利用 Windows API的软件,编译器必需能处理惩罚和导入微软相关的DLLs和COM工具。编译器必需接管一种C或C++方言,并处理惩罚展现了内部API函数名称的接口界说语言(Interface description 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。

#p#分页标题#e#

微软相关的编译器支持也是异常处理惩罚(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

    关键字:

在线提交作业