Windows API , неофициально WinAPI , является основным интерфейсом прикладного программирования (API) , который позволяет компьютерной программе получать доступ к функциям операционной системы Microsoft Windows , в которой она работает.
Каждая основная версия Windows API имеет другое имя, которое определяет аспект совместимости этой версии. Например, Win32 — это основная версия Windows API, работающая в 32-битных системах. Название Windows API в совокупности относится ко всем версиям этой возможности Windows.
Microsoft предоставляет поддержку разработчикам через комплект разработки программного обеспечения Microsoft Windows SDK , который включает в себя документацию и инструменты для создания программного обеспечения на основе Windows API.
Функции, предоставляемые Windows API, можно сгруппировать в восемь категорий: [1]
win32k.sys
которая напрямую взаимодействует с графическим драйвером. [3] [4]Windows API определен на языке программирования C. [12] Его функции и структуры данных определены в синтаксисе C (см. windows.h ). Однако API можно использовать с помощью любого языка программирования, который может взаимодействовать со структурами данных API и соглашениями о вызовах для вызовов функций и обратных вызовов .
Следует отметить, что внутренняя реализация функций API была разработана на нескольких языках, кроме C. [a]
Несмотря на то, что C не является языком объектно-ориентированного программирования (ООП), Windows API в некоторой степени объектно-ориентирован из-за использования дескрипторов. Различные другие технологии Microsoft и других компаний делают этот объектно-ориентированный аспект более очевидным за счет использования языка ООП, такого как C++ — см. Библиотеку классов Microsoft Foundation (MFC), Библиотеку визуальных компонентов (VCL), GDI+ . Следует отметить, что Windows 8 предоставляет Windows API и WinRT API, которые реализованы на C++ [13] и являются объектно-ориентированными по своей конструкции. [13]
Windows.pas — это модуль Pascal / Delphi , который предоставляет функции Windows API. Это эквивалент языка C windows.h в языке Паскаль . [14]
Windows API по большей части предназначен для доступа программы к функциям операционной системы . Для связи между различными приложениями Windows Microsoft разработала ряд технологий наряду с Windows API. Это началось с динамического обмена данными (DDE), который был заменен связыванием и внедрением объектов (OLE), а затем моделью компонентных объектов (COM), объектами автоматизации , элементами управления ActiveX и .NET Framework . Между этими технологиями не всегда существует четкое различие, и они во многом совпадают.
Разнообразие терминов в основном является результатом группировки программных механизмов, которые относятся к данному аспекту разработки программного обеспечения. Автоматизация, в частности, относится к экспорту функции приложения или компонента (в виде интерфейса прикладного программирования (API)), чтобы ею могли управлять другие приложения, а не только пользователи-люди. .NET — это автономная общая методология и технология для разрабатывайте настольные и веб-приложения, написанные на различных языках JIT-компиляции .
Многие технологии Microsoft используют Windows API, как и большинство программ, работающих в Windows. Будучи промежуточным программным обеспечением между Windows API и приложением, эти технологии обеспечивают некоторый доступ к Windows API. Некоторые технологии описываются как оболочка Windows API, но это спорно, поскольку ни одна другая технология не предоставляет и не раскрывает все возможности Windows API.
Хотя почти все программы Windows используют Windows API, в линейке операционных систем Windows NT программы, которые запускаются на ранних этапах процесса запуска Windows , вместо этого используют Native API . [15]
Windows API всегда открывал программистам большую часть базовой структуры систем Windows. Это имело то преимущество, что давало им большую гибкость и власть над своими приложениями, но также налагало большую ответственность за то, как приложения обрабатывают различные низкоуровневые, иногда утомительные операции, связанные с графическим пользовательским интерфейсом .
Например, начинающий программист на языке C часто пишет простое «привет, мир» в качестве своего первого задания. Рабочая часть программы — это всего лишь одна строка printf внутри основной подпрограммы. Накладные расходы на подключение к стандартной библиотеке ввода-вывода также составляют всего одну строку:
#include <stdio.h> int main ( void ) { printf ( «Привет, мир! \n » ); }
Версия для Windows по-прежнему представляла собой всего лишь одну рабочую строку кода, но требовала еще много-много дополнительных строк. Чарльз Петцольд , написавший несколько книг о программировании для Windows API, сказал: «Первоначальная программа hello world в Windows 1.0 SDK вызвала небольшой скандал. HELLO.C имел длину около 150 строк, а сценарий ресурса HELLO.RC было еще около 20 строк. (...) Программисты-ветераны часто сворачивались калачиком от ужаса или смеха, встречая программу Windows hello-world». [16]
За прошедшие годы в системы Windows были внесены различные изменения и дополнения, и Windows API менялся и расширялся, чтобы отразить это. [17] Windows API для Windows 1.0 поддерживал менее 450 вызовов функций , тогда как современные версии Windows API поддерживают тысячи. Однако в целом интерфейс остался достаточно последовательным, и старое приложение Windows 1.0 по-прежнему будет выглядеть знакомым программисту, привыкшему к современному Windows API. [18]
Microsoft приложила усилия для обеспечения обратной совместимости . Чтобы добиться этого, при разработке новых версий Windows Microsoft иногда применяла обходные пути [19] , обеспечивающие совместимость со сторонним программным обеспечением, которое использовало предыдущую версию недокументированным или даже нецелесообразным способом. Рэймонд Чен , разработчик Microsoft, работающий над Windows API, сказал: «Я, наверное, мог бы месяцами писать исключительно о плохих вещах, которые делают приложения, и о том, что нам нужно сделать, чтобы они снова заработали (часто вопреки самим себе). Вот почему я особенно злюсь, когда люди обвиняют Microsoft в злонамеренном взломе приложений во время обновлений ОС. Если какое-либо приложение не запускалось в Windows 95, я воспринимал это как личную неудачу». [20]
Одним из крупнейших изменений в Windows API стал переход с Win16 (поставлявшегося в Windows 3.1 и более ранних версиях) на Win32 (Windows NT и Windows 95 и более поздних версий). Хотя Win32 изначально был представлен в Windows NT 3.1, а Win32 позволяла использовать подмножество Win32 до Windows 95, только в Windows 95 началось широкое перенесение приложений на Win32. Чтобы облегчить переход в Windows 95 для разработчиков за пределами и внутри Microsoft, использовалась сложная схема API- интерфейсов , которая могла позволить 32-битному коду вызывать 16-битный код (для большинства API Win16) и наоборот. Плоские преобразователи позволяли 32-битному коду вызывать 16-битные библиотеки, и эта схема широко использовалась внутри библиотек Windows 95, чтобы избежать портирования всей ОС на Win32 за один раз. В Windows NT операционная система была чистой 32-битной, за исключением частей, обеспечивающих совместимость с 16-битными приложениями, и для перехода от Win16 к Win32 были доступны только общие преобразователи, как и в Windows 95. Platform SDK поставлялся с компилятором, который мог создавать код, необходимый для этих переходов. Версии 64-битной Windows также могут запускать 32-битные приложения через WoW64 . Папка SysWOW64, расположенная в папке Windows на диске с ОС, содержит несколько инструментов для поддержки 32-битных приложений. [21]
Каждая версия Microsoft Windows содержит версию Windows API, и почти каждая новая версия Microsoft Windows содержит дополнения и изменения в Windows API. [22]
Название Windows API относится, по сути, к одной и той же возможности в каждой версии Windows, но у этой возможности есть другое название, основанное на основных архитектурных аспектах версии Windows, в которой она содержится. Когда была только одна версия, она называлась просто Windows API. Затем, когда было сделано первое крупное обновление, Microsoft дала ему имя Win32, а первой версии — Win16. Термин Windows API относится к обеим версиям и ко всем впоследствии разработанным основным версиям. [1]
Проект Wine обеспечивает уровень совместимости Win32 API для Unix-подобных платформ между API ядра Linux и программами, написанными для Windows API. ReactOS идет еще дальше и стремится реализовать полную операционную систему Windows, тесно сотрудничая с проектом Wine для содействия повторному использованию кода и совместимости. DosWin32 и HX DOS Extender — это другие проекты, которые эмулируют Windows API, позволяя выполнять простые программы Windows из командной строки DOS . Odin — это проект эмуляции Win32 в OS/2 , заменяющий исходную эмуляцию Win-OS/2, основанную на коде Microsoft. Другие второстепенные реализации включают библиотеки MEWEL и Zinc , которые были предназначены для реализации подмножества Win16 API в DOS (см. Список платформо-независимых библиотек графического интерфейса ).
Windows Interface Source Environment (WISE) — это программа лицензирования Microsoft, которая позволяла разработчикам перекомпилировать и запускать приложения для Windows на платформах Unix и Macintosh . WISE SDK были основаны на эмуляторе Windows API, который мог работать на этих платформах. [26]
Усилия по стандартизации включали общедоступный интерфейс Windows Windows (PWI) для Win16 (см. также: Двоичный интерфейс приложения Sun Windows ( Wabi )), интерфейс программирования приложений Willows Software для Windows (APIW) для Win16 и Win32 (см. также: Willows TWIN ) и ECMA-234 , который пытался стандартизировать Windows API.
Для разработки программного обеспечения, использующего Windows API, компилятор должен иметь возможность использовать перечисленные выше библиотеки DLL, специфичные для Microsoft (COM-объекты находятся за пределами Win32 и предполагают определенный макет виртуальной таблицы). Компилятор должен либо обрабатывать файлы заголовков, которые предоставляют имена внутренних функций API, либо предоставлять такие файлы.
Для языка C++ компании Zortech (позже Symantec , затем Digital Mars ), Watcom и Borland выпустили хорошо известные коммерческие компиляторы, которые часто использовались с Win16, Win32 и Win32. Некоторые из них поставляли расширители памяти , позволяющие программам Win32 запускаться на Win16 с помощью распространяемой Microsoft Win32s DLL. Компилятор Zortech был, вероятно, одним из первых стабильных и удобных в использовании компиляторов C++ для программирования под Windows, до того как у Microsoft появился компилятор C++.
Для определенных классов приложений система компилятора также должна иметь возможность обрабатывать файлы языка описания интерфейса (IDL). В совокупности эти необходимые компоненты (компиляторы, инструменты, библиотеки и заголовки) известны как Microsoft Platform SDK . Какое-то время Microsoft Visual Studio и интегрированная система разработки Borland были единственными интегрированными средами разработки (IDE), которые могли это обеспечить (хотя SDK можно бесплатно загрузить отдельно от всего пакета IDE из Microsoft Windows SDK для Windows). 7 и .NET Framework 4).
По состоянию на 2016 год проекты [обновлять]MinGW и Cygwin также предоставляют такую среду на основе коллекции компиляторов GNU (GCC) с использованием автономного набора заголовочных файлов, чтобы упростить связывание с DLL, специфичными для Win32 . LCC-Win32 — это компилятор C, поддерживаемый Jacob Navia, бесплатная программа для некоммерческого использования. Pelles C — это бесплатный компилятор C, поддерживаемый Pelle Orinius. Free Pascal — это бесплатный программный компилятор Object Pascal , поддерживающий Windows API. Пакет MASM32 — это зрелый проект, обеспечивающий поддержку Windows API в рамках Microsoft Macro Assembler (MASM) с использованием специально созданных или преобразованных заголовков и библиотек из Platform SDK. Плоский ассемблер FASM позволяет создавать программы для Windows без использования внешнего компоновщика, даже при работе в Linux.
Для структурированной обработки исключений (SEH) также необходима поддержка компилятора Windows . Эта система служит двум целям: она обеспечивает основу, на которой может быть реализована обработка исключений , специфичная для языка , и то, как ядро уведомляет приложения об исключительных ситуациях, таких как разыменование недопустимого указателя или переполнение стека. Компиляторы Microsoft/Borland C++ имели возможность использовать эту систему, как только она была представлена в Windows 95 и NT, однако фактическая реализация не была документирована, и ее пришлось реконструировать для проекта Wine и свободных компиляторов. SEH основан на помещении кадров обработчика исключений в стек, а затем добавлении их в связанный список, хранящийся в локальном хранилище потока (первое поле блока среды потока). При возникновении исключения ядро и базовые библиотеки разворачивают стек, запуская обработчики и фильтры по мере их возникновения. В конце концов, каждое исключение, не обработанное приложением, будет обработано обработчиком блокировки по умолчанию, который выводит на экран общее диалоговое окно сбоя Windows.