Windows API были разработаны для C, который был и остается наиболее используемым языком для системного программирования; API C являются де-факто стандартом для системных API, и для этого почти во всех других языках есть и есть способ вызывать внешние функции C, поэтому написание C API помогает быть совместимым с другими языками.
API C требуется простой ABI, состоящий почти из определения соглашения о вызовах для использования в функциях (и кое-что о структуре структур). C ++ и другие объектно-ориентированные языки, напротив, требуют сложного ABI, который должен определять, как объекты размещаются в памяти, как обрабатывать наследование, как планировать виртуальную таблицу, как распространять исключения, куда помещать данные RTTI, ... Более того, не все языки являются объектно-ориентированными, и использование API-интерфейсов, предназначенных для C ++, с другими необъектно-ориентированными языками может быть настоящей болью (если вы когда-либо использовали COM из C, вы понимаете, о чем я).
Кроме того, когда изначально Windows разрабатывался, C ++ не был так широко распространен на ПК, а также C не использовался , поэтому много: на самом деле, большая часть Windows 3.11 и многие приложения все еще были написано на ассемблере, так как ограничения памяти и процессора в эпоху были очень жесткими; компиляторы также были менее умными, чем сейчас, особенно C ++. На машинах, где ручная сборка часто была единственным решением, накладные расходы C ++ были действительно неприемлемы.
Что касается указателей: в Windows API почти всегда используются дескрипторы , то есть непрозрачные указатели, чтобы иметь возможность изменять базовый характер каждого ресурса, не затрагивая существующие приложения, и не допускать, чтобы приложения возились с внутренними структур. Не имеет значения, если структура, используемая диспетчером окон для внутреннего представления окна, изменена: все приложения используют просто HWND, который всегда имеет размер указателя. Вы можете думать об этом как о какой-то идиоме PIMPL.
Однако Windows в некотором роде объектно-ориентирована (см., Например, всю концепцию "класса окна" или, на более глубоком уровне, внутреннюю работу ядра NT, которая в значительной степени основана на концепции "объекта"). ), однако его основные API, будучи простыми функциями C, каким-то образом скрывают эту ОО-природу. С другой стороны, оболочка, разработанная много лет спустя, написана в основном на C ++ и предоставляет действительно объектно-ориентированный COM-интерфейс.
Интересно, что в COM вы можете увидеть все компромиссы, с которыми вам придется столкнуться при построении кросс-языкового, но все еще смещенного объектно-ориентированного интерфейса в C ++: результат довольно сложный, в некоторых отношениях уродливый и не очень простой в использовании из любых язык. API-интерфейсы Windows, будучи простыми функциями, обычно легче вызывать.
Если вас интересует система, основанная на C ++ API, вы можете взглянуть на Haiku ; лично это один из аспектов, из-за которого я очень заинтересован в этом проекте.
Кстати, если вы собираетесь заниматься программированием на Win32 только с помощью API, вам лучше получить хорошую книгу, чтобы привыкнуть к этим «особенностям» и другим идиомам Win32. Двумя известными из них являются Ректор-новичок и Петжольд .