Windows API 是为 C 语言设计的,C 语言曾经并且仍然是最常用的系统编程语言; C API 是系统 API 的事实上的标准,为此,几乎所有其他语言都拥有并且有某种方法来调用外部 C 函数,因此编写 C API 有助于与其他语言兼容。
C API 只需要一个简单的 ABI,它几乎只包含用于函数的调用约定的定义(以及有关结构布局的内容)。相反,C++ 和其他面向对象的语言需要复杂的 ABI,必须定义对象如何在内存中布局、如何处理继承、如何布局 vtable、如何传播异常、在哪里放置 RTTI 数据、 ...此外,并非所有语言都是面向对象的,并且将 C++ 的 API 与其他非面向对象的语言一起使用可能会很痛苦(如果您曾经使用过 C 中的 COM,您就知道我的意思)。
顺便说一句,当 Windows 最初设计时,C++ 在 PC 上还没有那么普及,而且 C 也没有被使用somuch:实际上,Windows 3.11的很大一部分和很多应用程序仍然是用汇编语言编写的,因为当时的内存和CPU限制非常严格;编译器也没有现在聪明,尤其是 C++ 编译器。在手工锻造组装通常是唯一解决方案的机器上,C++ 开销确实令人无法接受。
对于指针的事情:Windows API 几乎总是使用handles,即不透明指针,能够在不影响现有应用程序的情况下更改每个资源的底层性质,并阻止应用程序弄乱内部结构。窗口管理器用于在内部表示窗口的结构是否发生更改并不重要:所有应用程序都仅使用 HWND,它始终具有指针的大小。您可能认为这是某种 PIMPL 习惯用法。
然而,Windows 在某种程度上是面向对象的(例如,参见整个“窗口类”概念,或者,在更深层次上,NT 内核的内部工作,它很大程度上基于“对象”概念),但是它最基本的 API,即简单的 C 函数,以某种方式隐藏了这种面向对象的本质。另一方面,shell 是在多年后设计的,主要是用 C++ 编写的,它提供了一个真正面向对象的 COM 接口。
有趣的是,您可以在 COM 中看到在构建跨语言但仍然偏向 C++ 的面向对象接口时必须面对的所有权衡:结果相当复杂,在某些方面很难看,并且从任何语言使用都不是很简单。相反,Windows API 是简单的函数,通常更容易调用。
如果您对基于 C++ API 的系统感兴趣,您可以看看Haiku http://www.haiku-os.org/;就我个人而言,这是我对该项目非常感兴趣的方面之一。
顺便说一句,如果您打算仅使用 API 进行 Win32 编程,您最好读一本好书来习惯这些“特殊性”和其他 Win32 习惯用法。两个比较出名的就是新任校长 https://rads.stackoverflow.com/amzn/click/com/0201634929和Petzhold http://www.charlespetzold.com/pw5/.