Windows Internals – 1.2 概念与工具之Windows API

转载请注明出处:https://cyc.wiki/index.php/2017/07/11/windows-internals-1-2/


本文表格图片均出自《Windows Internals, Seventh Edition, Part 1》,侵删。
All tables and figures are copyrighted by Windows Internals, Seventh Edition, Part 1. Please contact me to delete if there’s any violation.


Windows API

Windows API是Windows操作系统的用户态系统编程接口。在64位系统诞生以前,32位Windows操作系统的API被称作Win32 API,以区别之前的16位Windows API。现在有了64位的API之后,还沿用了Win32 API的叫法,32位和64位的Windows API都习惯被称为Win32 API

Win32 API是一组C语言的函数,数量多达上千条。Windows API Index列出了Windows API的所有类别,而Windows 8.1 API Sets则列出了Windows 8.1所支持的所有Windows API,以及它所依赖的链接库文件名。这些列出的Windows API(包括一些暴露出接口但没有向外公布的内部API)就涵盖了开发者在用户态所能实现的所有系统功能,其它任何形式的系统编程接口基本上都是基于这一组最底层最基本的Win32 API进行封装而实现的。

COM

正因为C风格的Win32 API过于庞杂,缺乏合适的组织结构,命名风格也不统一,后来出现的COM API取代了Win32 API成为新一代的系统编程接口。

COM(Component Object Model,组件对象模型)基于以下两个设计准则:
1. 对象Client端(调用者)通过一组定义好的接口协议与Server端(实现的dll库)进行通信,这些接口通过类似虚函数表的机制将接口调用映射到一组逻辑相关的方法实现。
2. 实现是通过dll动态加载,而不是静态链接到Client端。

第一点非常关键,它使得方法的调用成为了一种范式,这种范式可以以任何合适的编程语言实现,从而使得组件被COM的接口封装后,可以用C、C++、VB、C#等任何一种.NET平台支持的语言进行调用,大大地增加了系统组件的扩展性。
同时,在调用的范式中可以预先对要调用的方法进行检查其存在性,使得版本兼容性大大提升。举个例子,有一个库A1,客户端C2调用了库A1的新版本A2的一个新加接口,而运行环境中还是库A1的dll。如果使用C++直接链接的方法调用,客户端C2因为在库A1的dll中找不到新加接口的符号而崩溃退出。但如果使用COM封装后的库,客户端C2在调用不存在的接口时,会优雅的抛出Exception,只要接住进行处理,就能继续运行下去。

The Windows Runtime (WinRT)

Windows 8引入了当时称为Metro App的磁贴应用,后来更名为Windows Store App,在Windows 10中就叫做UWP App。支持这种应用的开发而引入的API就被称作WinRT API。Windows Runtime (WinRT)跟Windows RT要区分开,后者是那个命短的ARM操作系统(Surface 3)。

WinRT是基于COM技术开发的,加入了一些新的扩展信息,最主要的是将接口的定义写在了的一种元数据文件.WINMD里。WINMD文件是二进制文件,可以用VS中的对象查看器打开,能看到里面所定义的WinRT接口。

跟COM一样,WinRT接口也可以在各种语言中进行调用,除了C++、VB、C#这.NET三剑客之外,还支持JavaScript,这使得可以用一些前端的技术写UWP App。注意这里面的C++并不是纯C++,而是一种叫做C++/CX的语言,专为WinRT编程设计。如果你看到一个.cpp文件里面出现的不是*而是^,那这就是一个C++/CX的文件。我在微软里的第一个项目就碰上了C++/CX,当时整得一头雾水。后来发现,其实可以先用C#写一遍,然后对应翻译过去就可以了。

 
在Windows 10的系统中,可以存在两种应用,一种是经典桌面应用,也就是我们一直以来熟知的那种应用;另一种是UWP应用,也就是在Windows 8只能全屏显示的磁贴、到了Windows 10基本跟经典应用区分不开的那种应用。
对于这两种应用,经典桌面应用一般使用Win32 API和COM API,但也可以使用一部分WinRT API。而UWP应用一般使用WinRT API,但也可以使用一部分Win32 API和COM API。

The .NET Framework

.NET Framework应该是继MFC之后,编写带界面的Windows应用最常用的框架。它主要由两部分组成:
1. 公共语言运行时(CLR) 这是.NET Framework的引擎部分,负责将抽象的中间语言翻译成在硬件上运行的指令,实现其实是一个COM组件的Server端,里面的功能由底层的Windows API提供。
2. .NET Framework类库(FCL) 这是.NET Framework API的封装部分,向上提供.NET Framework API,向下调用CLR层提供的COM接口。

.NET Framework和WinRT在上层API技术实现上非常相像,但是底层跟Win32 API的对接不一样,因为.NET Framework是面向经典桌面应用,而WinRT是短期面向UWP应用,长期面向OneCore系统。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s