Что такое Windows API
Обновлено: 21.11.2024
- WinBase: функции ядра, CreateFile, CreateProcess и т. д.
- WinUser: функции графического интерфейса, CreateWindow, RegisterClass и т. д.
- WinGDI: графические функции, Ellipse, SelectObject и т. д.
- Общие элементы управления: стандартные элементы управления, списки, ползунки и т. д.
Версии
Версии API привязаны к версии операционной системы. В документации MSDN указана минимальная поддерживаемая операционная система для каждой функции API.
Привет, мир
Приложения Microsoft Windows обычно пишутся либо как консольные, либо как оконные приложения (существуют и другие типы, такие как службы и подключаемые модули). Разница для программиста заключается в интерфейсе основной точки входа для источника приложения, предоставленного программистом.
При запуске приложения C или C++ точкой входа исполняемого файла, используемой загрузчиком исполняемого файла, является среда выполнения, предоставляемая компилятором. Загрузчик исполняемого файла считывает исполняемый файл, выполняет любую исправление необходимого образа, а затем вызывает точку входа исполняемого файла, которая для программы C или C++ является средой выполнения, предоставляемой компилятором.
Точка входа исполняемого файла, вызываемая загрузчиком, не является основной точкой входа, предоставленной разработчиком приложения, а вместо этого представляет собой среду выполнения, предоставляемую компилятором и компоновщиком, который создает исполняемый файл. Среда выполнения настраивает среду для приложения, а затем вызывает основную точку входа, предоставленную программистом.
Консольное приложение Windows может иметь несколько слегка различающихся интерфейсов для основной точки входа, предоставленной программистом. Разница между ними заключается в том, является ли основной точкой входа традиционный тип int main (int argc, char *argv[]) или специфичная для Windows версия int _tmain(int argc, _TCHAR* argv[]), которая обеспечивает широкие символов в параметрах приложения. Если вы создаете проект консольного приложения Windows Win32 с помощью Visual Studio, сгенерированный исходный код будет конкретной версией Windows.
Приложение окна Windows (GUI) имеет другой интерфейс для основной точки входа, предоставляемой программистом. Эта основная точка входа, предоставляемая программистом, имеет более сложный интерфейс, поскольку среда выполнения настраивает среду графического интерфейса пользователя и предоставляет дополнительную информацию вместе с параметрами приложения.
В этом примере объясняется интерфейс основной точки входа в окне Windows (GUI). Для изучения этих тем у вас должны быть:
- IDE с компилятором (желательно Visual Studio)
- Знания C
Создайте пустой проект Windows Win32 (графический интерфейс, а не консоль) с помощью IDE. Параметры проекта должны быть установлены для оконного приложения (а не консольного приложения), чтобы компоновщик мог связать его с правильной средой выполнения. Создайте файл main.c, добавив его в проект, а затем введите следующий код:
Это наша программа Win32 "Hello, world". Первым шагом является включение заголовочных файлов Windows. Основной заголовок для всех Windows — это windows.h, но есть и другие.
WinMain отличается от стандартного int main(), используемого с консольным приложением. В интерфейсе используется больше параметров, и, что более важно, основная точка входа для оконного приложения использует соглашение о вызовах, отличное от стандартного C/C++.
Спецификатор APIENTRY указывает соглашение о вызовах, то есть порядок, в котором аргументы помещаются в стек † . По умолчанию соглашением о вызовах является стандартное соглашение C, обозначенное __cdecl . Однако Microsoft использует другой тип соглашения о вызовах, соглашение PASCAL, для функций Windows API, на что указывает квалификатор __stdcall. APIENTRY — это определенное имя для __stdcall в одном из файлов заголовков, включенных в windows.h (см. также Что такое __stdcall?).
Следующие аргументы WinMain следующие:
- hInst: дескриптор экземпляра.
- hInstPrev: дескриптор предыдущего экземпляра. Больше не используется.
- cmdline: аргументы командной строки (см. Передача аргументов WinMain (или wWinMain) в обычный main)
- cmdshow: указывает, должно ли отображаться окно.
Мы пока не используем ни один из этих аргументов.
Внутри WinMain() находится вызов MessageBox(), который отображает простое диалоговое окно с сообщением, окно сообщения. Первый аргумент — это дескриптор окна владельца. Поскольку у нас еще нет собственного окна, передайте NULL. Второй аргумент — основной текст. Третий аргумент — это заголовок, а четвертый аргумент содержит флаги. Когда передается 0, отображается окно сообщения по умолчанию. На приведенной ниже схеме показано диалоговое окно окна сообщения в разрезе.
† Только для 32-разрядных систем. Другие архитектуры имеют другие соглашения о вызовах.
Windows API (интерфейс прикладного программирования) позволяет написанным пользователем программам взаимодействовать с Windows, например отображать объекты на экране и получать ввод с помощью мыши и клавиатуры. Все программы Windows, кроме консольных программ, должны взаимодействовать с Windows API независимо от языка. Самая последняя версия (по состоянию на 2007 год) — Win32 API. Microsoft поддерживает обширную библиотеку справочной информации для разработчиков на сайте msdn, но презентацию часто трудно понять, и я бы сказал, что это не лучшее место для изучения основ.
Это руководство предназначено для людей, достаточно хорошо знакомых с C или C++ в традиционном сценарии консольного ввода/вывода (с использованием таких вещей, как gets и printf), и которые теперь хотят писать приложения для Windows. Рекомендации по стилю и другую информацию о C++ см. здесь.
Впервые я познакомился с WinAPI (не подозревая об этом) через Microsoft Visual C++. Эта среда разработки предоставляет набор кода для начала работы, а также нечто, называемое файлом ресурсов, который является новым для программистов, привыкших к консольному программированию в старом стиле. Эта комбинация создает у пользователя отчетливое впечатление, что вы больше не можете писать свою собственную автономную программу, состоящую исключительно из файлов .h и .cpp и скомпилированную с помощью вашего любимого компилятора. Однако это ложное впечатление. Хотя файл ресурсов полезен, я советую начать работу без него, а затем использовать его, как только вам будет удобно.
Еще одно замечание, которое у меня есть по поводу MSVC++, заключается в том, что очень сложно редактировать ресурсы вручную или вводить их из другого кода. Однако он хорошо поддерживается и превосходен во многих отношениях, поэтому вы можете использовать его, если у вас есть деньги. Я собрал несколько заметок о проблемах, с которыми я столкнулся при использовании Visual C++, в надежде, что они могут кому-то помочь. Я также использовал довольно хорошую бесплатную среду разработки для C++ в Windows под названием Dev-Cpp от программного обеспечения Bloodshed (не беспокойтесь о странном названии: программное обеспечение хорошее). Еще одна хорошо поддерживаемая бесплатная среда разработки — CodeBlocks.
Я нашел руководство TheForger по Win32 API Tutorial (Brook Miles) весьма полезным, особенно полностью работающие примеры кода. Два других отличных сайта — это Reliable Software и Catch22. Чтобы изучить API Win32, я предлагаю вам начать здесь, затем обратиться к Forger за дальнейшими подробностями, а затем, когда у вас будет хорошее общее представление о том, как что-то делать, перейти к учебнику по надежному программному обеспечению и учебникам Catch22. Первый предоставляет, например, классы и методы общего назначения для API, а второй знакомит вас со многими полезными методами, которые непонятны в msdn.
1. WinMain и WndProc
Для начала я предлагаю вам написать самую простую программу и посмотреть, сможете ли вы ее скомпилировать и запустить. Вот программа:
Это все, что вам нужно. Эта программа должна вывести простое сообщение с кнопкой «ОК». Вам решать, какие параметры необходимо предоставить вашему компилятору, чтобы заставить его работать. Например, в среде разработки, которую я использую, мне пришлось сказать, что я хочу создать новое приложение Windows (не «консольное»). Затем я удалил весь исходный код для начала работы, который он мне предложил, и заменил его приведенным выше. Он скомпилировался и заработал нормально. Однако в Microsoft Visual Studio мне пришлось установить параметр проекта: дополнительную информацию см. в примечаниях к Visual C. Чтобы избежать необходимости в настройке этого параметра, вам нужно добавить пару преобразований типов в приведенный выше код следующим образом:
Теперь обратимся к более длинным программам. Типичная программа Windows (на C или C++) начинается со следующего кода:
Сейчас я опишу код функции WinMain. У вас есть две основные функции: функция WinMain (которая заменяет старую "main(.)") и вызываемая ею функция, обычно называемая WndProc или WindowProcedure или что-то в этом роде. Хотя я покажу вам код внутри WinMain, на данный момент вам не нужно его изменять. Ваш основной бизнес связан с WinProc. Вы должны рассматривать WinMain как более или менее системную функцию (позже вы можете внести незначительные изменения), а WndProc — это ваша функция, и вы должны сделать ее своей собственной, написав ее с нуля!
Прежде чем мы перейдем к этому, давайте заполним тело WinMain:
Напоминаю вам, что на данный момент вы не собираетесь изменять этот код, просто включите его в исходный код программы, в файл с именем "myprog_main.cpp" или что-то в этом роде.
Чтобы получить полностью работающую программу, осталось только написать код функции WndProc. Вот пример:
Этот конкретный пример довольно минимален: он почти ничего не делает. Если вы запустите программу, она просто отобразит окно и позволит вам изменить его размер обычным способом и закрыть его, щелкнув крестик.
Обратите внимание, что каждый case в операторе switch заканчивается возвратом. Это практика, которую я призываю вас принять.Вы всегда должны включать регистр по умолчанию для любых сообщений, которые вы не принимаете, и вызывать предоставляемую Windows функцию DefWindowProc. Я не рекомендую иметь дополнительный код после переключателя, потому что этот переключатель будет становиться длиннее по мере того, как мы добавляем что-то, и если вы поместите что-то после переключателя, это начнет затруднять чтение кода. Вместо этого поместите все, что вам нужно, в каждый случай, даже если это означает повторение материала. Затем убедитесь, что каждый case заканчивается оператором return. Очевидно, что когда вы станете экспертом, вы можете проигнорировать этот совет.
2. Привет, мир
Теперь мы будем предоставлять сообщение "hello world" различными способами. Первый и самый простой — изменить строку заголовка главного окна с «Заголовок моего окна» на «hello world». Вернитесь и найдите его в WinMain, выполните модификацию и наблюдайте за результатами. Это работает, но очевидно, что толку от этого мало.
Теперь добавьте в свой код следующую функцию (например, чуть выше WndProc):
Мы добавили две новые функции. Сначала программа отображает «hello world». Во-вторых, если вы щелкнете по окну, появится всплывающее окно с сообщением «привет еще раз». Из приведенного выше кода вы должны догадаться, что щелчок левой кнопкой мыши в окне генерирует сообщение WM_LBUTTONDOWN и заставляет наш код вызывать функцию MessageBox. Функция MessageBox предоставляется окнами с синтаксисом, который вы можете вывести из этого примера. В большой программе вы могли бы, например, инициировать некоторое длительное вычисление в операторе case WM_LBUTTONDOWN:, а затем вызвать MessageBox, когда длительное вычисление завершено.
Наша собственная функция disp вызывается в ответ на сообщение WM_SIZE. Это сообщение генерируется всякий раз, когда изменяется размер окна, в том числе при первом создании окна. Если вы переместите другое окно поверх маленького окна нашей программы, а затем снова отодвинете его, вы увидите, что текст «hello world» исчез. Это связано с тем, что окну не было дано указание перерисовать его. Однако если вы измените размер окна, текст появится снова, потому что отправлено сообщение WM_SIZE.
Обычно то, что нужно отображать, отображается в ответ на сообщение WM_PAINT, но для этого сообщения требуется дополнительный код, поэтому я еще не вызывал его.
2.1 Контекст устройства
Функция disp(. ) вводит важную базовую концепцию программирования Windows API. Это концепция «контекста устройства». Каждое устройство, такое как экран, принтер и т. д., имеет контекст устройства. Когда вы хотите отобразить на устройстве, вы взаимодействуете с контекстом устройства (dc). Это логическая конструкция, и Windows заботится о ее взаимодействии с аппаратным устройством. В результате вы должны пройти следующую последовательность, чтобы отобразить вещи: получить DC, записать в него что-то, освободить DC. В случае с текстом возникает еще один вопрос, какой шрифт следует использовать на устройстве. Вы должны сказать, и вы делаете это вызовом SelectObject. Это говорит контроллеру домена «использовать этот шрифт», и контроллер домена отвечает, говоря: «хорошо, а вот шрифт, который я использовал раньше». Идея состоит в том, что хороший пользователь запомнит этот шрифт и вернет ему DC, когда он закончит, с помощью другого вызова SelectObject. И последний вопрос: откуда нам взять шрифт? Позже вы научитесь создавать его с помощью CreateFont, а пока мы просто получаем стандартный, предоставляемый системой, с помощью GetStockObject.
Типы HWND, HDC, HFONT являются дескрипторами (то есть указателями) на различные объекты: очевидно, что быстрее передавать указатели, чем сами объекты.
По мере накопления опыта программирования для Windows вы обнаружите, что будете меньше использовать TextOut и больше «управлять». Мы подойдем к управлению через минуту. Однако остается верным тот факт, что TextOut — полезная низкоуровневая функция, которая может быть хорошим компаньоном во время отладки.
На данный момент наша функция disp() всегда отображает текст в одной и той же точке экрана. Дальнейший вызов перезапишет все, что уже есть. Чтобы сделать его более мощным, вы можете предоставить ему такие параметры, как (. int x, int y, . ), чтобы пользователь мог указать любую точку на экране. Однако рано или поздно вы, вероятно, захотите прокрутить экран. К счастью, это довольно легко сделать.
Это руководство по Windows API. Этот учебник научит вас основам и более сложным темам программирования в Windows API с помощью языка программирования C. Он не распространяется на МФЦ. (Microsoft Foundation Classes — это широко используемая библиотека C++ для разработки приложений C++ в Windows.) Это руководство было создано и протестировано в Windows 7. Примеры были созданы с использованием компилятора Pelles C. Если вы планируете прочтите этот учебник, вам рекомендуется скачать и установить этот компилятор. (Это бесплатная программа.) Если вы хотите использовать какой-либо другой компилятор, убедитесь, что он поддерживает стандарт C99.
API для Windows
Windows API – это интерфейс прикладного программирования, который используется для создания приложений Windows. Для создания приложений Windows необходимо загрузить Windows SDK. (Ранее известный как Platform SDK.) SDK (Software Development Kit) содержит заголовочные файлы, библиотеки, примеры, документацию и инструменты, использующие Windows API для разработки приложений. Windows API создан для языков программирования C и C++. Это самый прямой способ создания приложений Windows. (Если мы устанавливаем Pelles C, Windows SDK уже включен.)
Windows API можно разделить на несколько областей:
- Базовые услуги
- Безопасность
- Графика
- Пользовательский интерфейс
- Мультимедиа
- Оболочка Windows
- Сеть
Базовые службы обеспечивают доступ к основным ресурсам Windows. К ним относятся файловые системы, устройства, процессы, потоки, реестр или обработка ошибок. В области Безопасность представлены функции, интерфейсы, объекты и другие программные элементы для аутентификации, авторизации, криптографии и других задач, связанных с безопасностью. Подсистема Графика предоставляет функции для вывода графического содержимого на мониторы, принтеры и другие устройства вывода. Пользовательский интерфейс предоставляет функции для создания окон и элементов управления. Компонент Мультимедиа предоставляет инструменты для работы с видео, звуком и устройствами ввода. Функции интерфейса оболочки Windows позволяют приложениям получать доступ к функциям, предоставляемым оболочкой операционной системы. Сетевые службы обеспечивают доступ к сетевым возможностям ОС Windows.
Windows API – это абстрактная спецификация программного интерфейса операционной системы Windows. Он состоит из объявлений функций, объединений, структур, типов данных, макросов, констант и других элементов программирования. Windows API описан в основном в MSDN (Microsoft Developer Network) и находится в заголовках Windows C. Официальная реализация функций Windows API находится в динамических библиотеках (DLL). Например, kernel32.dll, user32.dll, gdi32.dll или shell32.dll в системном каталоге Windows. Существуют сторонние реализации Windows API: прежде всего проект Wine и проект ReactOS.
Windows API – это динамический объект. Количество функций постоянно растет с каждой новой версией ОС Windows и новыми пакетами обновлений. Есть также некоторые важные различия между серверными версиями и настольными версиями операционной системы. Некоторые функции официально не задокументированы.
Пеллес С
Pelles C — отличный компилятор C и интегрированная среда разработки (IDE) для языка программирования C. Он поддерживает как 32-битную Windows (x86), так и 64-битную Windows (x64). Он реализует стандарты C99 и C11. Pelles C имеет встроенный редактор ресурсов, редактор растровых изображений, значков и курсоров, а также редактор шестнадцатеричного дампа. Он разработан шведским разработчиком Pelle Orinius. Он поставляется с Windows SDK, поэтому мы можем сразу приступить к созданию приложений для Windows без дополнительной установки.
Pelles C — это бесплатное программное обеспечение. Мы можем скачать Pelles C по следующей ссылке: скачать Pelles C.
Нет ошибок целевой архитектуры
MSDN (Microsoft Developer Network) — это центральный портал для разработки Windows. Это огромная коллекция материалов, связанных с разработкой приложений Windows с использованием инструментов Microsoft. (Стороннее программное обеспечение, такое как Qt4 или Java Swing, не рассматривается.) Это наиболее полный справочник по Windows API. Следующие две ссылки являются хорошими отправными точками для справочника по Windows API: документация по разработке настольных приложений и список Windows API.
Я копался в Интернете, чтобы попытаться получить четкое представление о том, что такое фреймворк, библиотека и API.
Но я все равно чего-то не понимаю. С какой структурой/библиотекой работает Windows API?
Win32 – это версия Windows API. Я видел: "Основными DLL-библиотеками Win32 являются kernel32.dll, user32.dll и gdi32.dll" на странице API Windows в Википедии (вкладка "версия").
Но какова структура этих .dll? Окна? Но Windows — это ОС, а не фреймворк. Может и то и другое, но я запутался :/.
Кто-нибудь может мне помочь? :Р
Я хотел бы знать, почему я получил плохую оценку за этот вопрос, чтобы я мог улучшить его в следующий раз/найти подходящий раздел, чтобы задать его.
2 ответа 2
Интерфейс прикладного программирования Windows (API) — это интерфейс системного программирования для семейства операционных систем Microsoft Windows.
До появления 64-разрядных версий Windows XP и Windows Server 2003 программный интерфейс для 32-разрядной версии операционных систем Windows назывался Win32 API, что отличало его от оригинальной 16-разрядной версии Windows. API.
Windows API состоит из тысяч задокументированных вызываемых подпрограмм, таких как CreateProcess, CreateFile и GetMessage. Ниже перечислены основные категории функций Windows API:
- Базовые службы: процессы, потоки, управление памятью, файловый ввод-вывод и т. д.
- Службы компонентов: поддержка COM/COM+.
- Пользовательские графические и мультимедийные службы.
- Обмен сообщениями и совместная работа.
- Сеть.
- Веб-службы.
Фреймворк – это общая структура, обеспечивающая основу архитектуры, с помощью которой может быть реализовано конкретное программное обеспечение.
Под библиотекой понимается код, предоставляющий функции, которые вы можете вызывать из собственного кода для решения общих задач.
Начнем с пользовательского интерфейса. Что такое пользовательский интерфейс? Интерфейс, в общем, является средством взаимодействия с программным обеспечением. Таким образом, пользовательский интерфейс — это то, что пользователи могут использовать для взаимодействия с программным обеспечением. Вы привыкли к графическому пользовательскому интерфейсу (GUI), но старые компьютеры и некоторые современные профессиональные программы используют интерфейс командной строки (CLI), где пользователь может вводить текстовые команды и получать результаты в виде текста.
Есть также интерфейсы, которые не являются пользовательскими интерфейсами, т.е. они не предназначены для взаимодействия с людьми. Например, сетевые интерфейсы — это строго определенные средства взаимодействия между двумя или более устройствами по сети. Адаптеры Ethernet и адаптеры Wi-Fi предоставляют сетевые интерфейсы.
Затем, наконец, есть API: интерфейсы прикладного программирования. Это интерфейсы, предоставляемые одной частью программного обеспечения, разработанные таким образом, чтобы другое программное обеспечение могло с ним взаимодействовать. Когда я хочу использовать какую-то библиотеку, я должен изучить ее API, т.е. какую функциональность она предоставляет и как я могу ею воспользоваться. Когда я хочу использовать фреймворк, я должен изучить его API, т.е. как я могу подключить свой собственный код к платформе.
Windows (и любая операционная система) — это платформа для запуска другого программного обеспечения. Программы запускаются Windows определенным образом, они могут загружать библиотеки, взаимодействовать с другими программами, читать и записывать файлы, использовать оборудование, ожидать определенных событий (нажатие клавиши, потеря фокуса окном и т. д.). Много всего, как видите. Все эти вещи более или менее предоставляются Windows, но программы должны знать, как получить к ним доступ. Это Windows API.
Но какова структура этих .dll?
Нет. Вещи не всегда принадлежат какой-то структуре. Первые компьютерные программы не использовали никаких фреймворков или даже библиотек, они были изобретены позже, чтобы часто используемые фрагменты кода можно было использовать повторно, вместо того, чтобы писать их снова и снова.
Читайте также: