Что такое windows api

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

Microsoft Windows API

Содержание

Общие сведения

Работа через Windows API — это наиболее близкий к операционной системе способ взаимодействия с ней из прикладных программ. Более низкий уровень доступа, необходимый только для драйверов устройств, в текущих версиях Windows предоставляется через Windows Driver Model.

Windows API представляет собой множество функций, структур данных и числовых констант, следующих соглашениям языка Си. Все языки программирования, способные вызывать такие функции и оперировать такими типами данных в программах, исполняемых в среде Windows, могут пользоваться этим API. В частности, это языки C++, Pascal, Visual Basic и многие другие. Эти функции в свою очередь могут быть разбиты на следующие основные категории:

История Microsoft API

Microsoft прилагает усилия, чтобы сохранить обратную совместимость. Для достижения этой цели при разработке новых версий Windows, Microsoft иногда реализует обходные пути, чтобы обеспечить совместимость с программным обеспечением сторонних производителей, которые использовали предыдущую версию незарегистрированным или даже нецелесообразным способом.

Обзор

Функции, предоставляемые Windows API, могут быть представлены следующим образом:

Взаимодействие программ

Версии Windows API

Почти каждая новая версия Microsoft Windows представила свои собственные дополнения и изменения в Windows API.

Мультимедиа

Microsoft также предоставляет несколько интерфейсов API для кодирования медиа и воспроизведения:

Источник

Что такое Windows API

Интерфейс прикладного программирования WindowsAPI (applicationprogramminginterface) является интерфейсом системного программирования в пользовательском режиме для семейства операционных систем Windows. До выхода 64-разрядных версий Windows программный интерфейс для 32-разрядных версий операционных систем Windows назывался Win32 API, чтобы его можно было отличить от исходной 16-разрядной версии Windows API (которая служила интерфейсом программирования для начальных 16-разрядных версий Windows).

Windows API состоит из нескольких тысяч вызываемых функций, которые разбиты на следующие основные категории:

Описание WindowsAPI можно найти в документации по набору инструментальных средств разработки программного обеспечения — WindowsSoftwareDevelopmentKit (SDK). Эта документация доступна на веб-сайте www.msdn.microsoft.com. Она также включена со всеми уровнями подписки в сеть MicrosoftDeveloperNetwork (MSDN), предназначенную для разработчиков.

Что такое windows api. Смотреть фото Что такое windows api. Смотреть картинку Что такое windows api. Картинка про Что такое windows api. Фото Что такое windows api

Службы, функции и стандартные программы.

Некоторые термины в пользовательской и программной документации Windows в разных контекстах имеют разные значения. Например, слово служба может относиться к вызываемой в операционной системе стандартной подпрограмме, драйверу устройства или к обслуживающему процессу. Что именно означают те или иные термины, показано в следующем списке:

История Win32 API.

Интересно, что Win32 не планировался в качестве исходного интерфейса программирования для той системы, которая в ту пору называлась Windows NT. Поскольку проект Windows NT запускался в качестве замены для OS/2 версии 2, первоначальным интерфейсом программирования был 32-разрядный OS/2 PresentationManagerAPI. Но через год после запуска проекта произошел взлет поступившей в продажу Microsoft Windows 3.0. В результате этого Microsoft сменила направление и сделала Windows NT будущей заменой семейства продуктов Windows, а не заменой OS/2. В связи с этим и возникла необходимость выработать спецификацию Windows API — до этого, в Windows 3.0, API существовал только в виде 16-разрядного интерфейса.

Хотя в Windows API намечалось введение множества новых функций, недоступных в Windows 3.1, Microsoft решила сделать новый API, по возможности, максимально совместимым по именам, семантике и используемым типам данных с 16-разрядным Windows API, чтобы облегчить бремя переноса существующих 16-разрядных Windows-приложений в Windows NT. Этим, собственно, и объясняется тот факт, что многие имена функций и интерфейсов могут показаться непоследовательными: так нужно было для обеспечения совместимости нового Windows API со старым 16-разрядным Windows API.

Источник

WinAPI из C#

Что такое windows api. Смотреть фото Что такое windows api. Смотреть картинку Что такое windows api. Картинка про Что такое windows api. Фото Что такое windows api

Язык программирования C# был создан как язык, который можно использовать для простого программирования в ОС Windows. Позже этот язык получил возможность создавать приложения и на других операционных системах, но в этой статье мы будем говорить только об ОС Windows.

managed и unmanaged код

В первом случае это среда выполнения программ, где есть жествие правила взаимодействия с ресурсами и операционной системой. Тоесть там сущесутвуют механизмы, которые отлавливают ошибки, неверное образение к памяти и помогают программисту сосредоточиться именно на написании алгоритма.

Второй же пример включает в себя традиционное окружение, которое присуще языкам программирования вроде Assembly, C, C++. Там все операции с данными и алгоритмы должны быть четко определены программистом и все неверные действия он должен предусмотреть самостоятельно.

Пример использования PInvoke

Для того чтобы создать приложение, которое будет использовать P/Invoke, создадим новый проект в Visual Studio. Для этого выберем консольное приложение для платформы Windows:

Что такое windows api. Смотреть фото Что такое windows api. Смотреть картинку Что такое windows api. Картинка про Что такое windows api. Фото Что такое windows api

Для работы с P/Invoke нужно добавить using System.Runtime.InteropServices.

Что такое windows api. Смотреть фото Что такое windows api. Смотреть картинку Что такое windows api. Картинка про Что такое windows api. Фото Что такое windows api

И результат выполнения:

Что такое windows api. Смотреть фото Что такое windows api. Смотреть картинку Что такое windows api. Картинка про Что такое windows api. Фото Что такое windows api

Вроде бы ничего сложного, описание метода->сопоставление типов данных->profit. Но это в маленьком проекте, а что делать, если таких функции десятки и больше? Постоянно совмещать типы данных может стать нетривиальной задачей. Специально для этого, ну и для того чтобы помочь комьюнити MS сделали проект, который должен помочь реализовывать все описанные выше действия намного проще.

win32metadata

Уже сейчас существует пререлизная версия проекта, который позволяет в автоматическом режиме генерировать код, который будет создавать определения для функций WinAPI и транслировать типы данных. Этот проект можно найти здесь. Проект официально поддерживается MS и призван упростить использование WinAPI для С#. Вообще проект имеет еще несколько параллельных версий, которые для языков отличных от C# так же предоставляют возможность с помощью нативным методов и типов данных для яхыка программирования использовать WinAPI.

Для того чтобы использовать проект, нужно выполнить ряд рекомендаций:

Visual Studio не ниже 2019

Заходим в директорию проекта и добавляем package:

Что такое windows api. Смотреть фото Что такое windows api. Смотреть картинку Что такое windows api. Картинка про Что такое windows api. Фото Что такое windows api

После этого пишем код, который будет его использовать. Несмотря на официальный Readme, нужно использовать namespace Microsoft.Windows.Sdk. Кстати, с новым типом проекта это будет выглядеть вот так:

Что такое windows api. Смотреть фото Что такое windows api. Смотреть картинку Что такое windows api. Картинка про Что такое windows api. Фото Что такое windows api

Что такое windows api. Смотреть фото Что такое windows api. Смотреть картинку Что такое windows api. Картинка про Что такое windows api. Фото Что такое windows api

Таким образом можно упростить использование WinAPI функций в своем проекте. Это позволит не записывать функции вручную и долго мучаться над транслированием типов данных и сосредоточиться на алгоритме приложения. Кстати, проект обещают развивать и дальше, чтобы можно было пистать более сложные приложения.

В последние рабочие дни хотим анонсировать запуск нового потока курса C# Developer. Professional, который стартует уже в январе.

Источник

Введение в Windows API

Операционная система Windows предоставляет большой набор функций, позволяющих различным приложениям, в том числе и приложениям Visual FoxPro, обмениваться информацией с Windows на достаточно низком уровне. Эти функции принято называть Windows API. Использование Windows API в приложениях Visual FoxPro позволяет реализовать возможности, недостижимые стандартными средствами языка.

Объявление Windows API функций в Visual FoxPro

Функции Windows API скомпонованы в динамически связанные библиотеки (Dynamic Link Library, DLL). Как правило, файлы таких библиотек имеют расширение dll. Перед тем, как использовать Windows API функцию в вашем приложении, вы должны её объявить. Для объявления функции применяется команда DECLARE..DLL:

cFunctionType
необязательный параметр, указывает тип данных, возвращаемых функцией:

cFunctionTypeРазмер,
байт
Описание
Short16-ти разрядное целое число
Integer, Long432-х разрядное целое число
Single432-х разрядное вещественное число
Double864-х разрядное вещественное число
StringСтрока символов

LibraryName
наименование DLL-библиотеки, в которой находится функция. Для библиотек Kernel32.dll, Gdi32.dll, User32.dll, Mpr.dll и Advapi32.dll можно использовать синоним WIN32API.

AliasName
необязательный параметр, позволяет вместо имени функции использовать придуманный вами псевдоним. Написание псевдонима, в отличие от имени функции, не чувствительно к регистру символов. Как правило, псевдоним используется, когда имя API функции совпадает с именем встроенной (или вашей) функции Visual FoxPro.

cParamType
указывает тип данных передаваемого функции значения:

cParamTypeРазмер,
байт
Описание
Integer, Long432-х разрядное целое число
Single432-х разрядное вещественное число
Double864-х разрядное вещественное число
StringСтрока символов

Параметр может передаваться как по значению, так и по ссылке. Для указания того, что параметр передаётся по ссылке, используется символ «@».

ParamName
необязательный параметр, носит чисто описательный характер и, как правило, игнорируется.

Все функции Windows API, как, впрочем, и сама Windows, написаны на языке программирования Си. Поэтому для того, чтобы понять, как правильно использовать API функции в Visual FoxPro (который, кстати, так же написан на Си, по крайней мере, его ядро), познакомимся, какие типы данных применяются в Си и Windows, и, что не менее важно, разберёмся с такими типами данных, как перечисления, структуры и указатели. Кроме того, вы узнаете, что такое прототипы функций в Си, и как, основываясь на описании прототипа функции в MSDN, правильно объявить её в команде DECLARE..DLL.

Базовые типы данных Си

Если вы знакомы с языком программирования Си, то знаете, как легко в нём можно создавать различные типы данных. Достаточно написать следующий код:

и вот у вас новый тип INT32, который полностью соответствует типу int. Но, с точки зрения Си, это совершенно разные типы, и попытка присвоить переменной типа INT32 значение переменной типа int приведёт к ошибке!

Изобилие типов данных заставляет многих разработчиков думать, что программирование с использованием API является трудным. Но это не так! В Си в основном используются следующие типы данных:

тип void используется для обозначения величин, имеющих нулевую длину и не имеющих значения.

Как ни странно, строковый тип в Си отсутствует. На самом деле все строки представлены в Си как массивы символов.

Некоторые типы могут объявляться как беззнаковые. Модификатор unsigned (без знака) используется со следующими типами данных: char, short, int и long.

Например, следующее объявление переменной в Си:

Модификатор const указывает, что переменная указанного типа является константой, то есть её значение не может быть изменено.

Перечисляемый тип enum связывает с переменной набор именованных констант, называемых перечисляемыми константами. Объявление перечисляемого типа выглядит так:

Если поле_тега опускается, то после закрывающей фигурной скобки необходимо указать переменную. Если поле_тега указано, то не указывается переменная.

В этом перечислении константа CombineModeReplace имеет значение 0, константа CombineModeIntersect имеет значение 1, и так далее; константа CombineModeComplement имеет значение 5.

Значения перечисляемых констант могут быть указаны явно, как, например, в следующем примере:

Типы данных Windows

Определение того, какой из базовых типов Си действительно представляет тип данных, используемый в API функции, является одной из тяжелейших задач в программировании API. Используйте следующее правило: если вы не можете найти слово float, double, char или str где-либо в имени функции или параметра, тогда это обычно 32-разрядное целое. Потребуется некоторое время для понимания и выработки навыков, но потом вы будете запросто преобразовывать типы данных. В следующей таблице приведены основные типы данных Windows и соответствующие им типы, используемые при объявлении функции в Visual FoxPro:

Тип данных
Windows
Тип в объявлении
функции
Описание
BOOLLong32-х разрядное целое число. 0 означает false, все остальное означает true.
BOOLEANLongтоже самое, что и BOOL.
BYTEString8-ми разрядное целое число
CHARString8-ми разрядное целое число
CLSIDString128-разрядное число (16 байт)
COLORREFLong32-х разрядное целое число
DWORDLong32-х разрядное целое число
DOUBLEDouble64-х разрядное вещественное число
FLOATSingle32-х разрядное вещественное число
GUIDString128-разрядное число (16 байт)
HANDLELong32-х разрядное целое число без знака
HBITMAPLong32-х разрядное целое число без знака
HDCLong32-х разрядное целое число без знака
HICONLong32-х разрядное целое число без знака
HGLOBALLong32-х разрядное целое число без знака
HKLLong32-х разрядное целое число без знака
HLOCALLong32-х разрядное целое число без знака
HINSTANCELong32-х разрядное целое число без знака
HRESULTLong32-х разрядное целое число без знака
HWNDLong32-х разрядное целое число без знака
LONGLong32-х разрядное целое число
LPARAMLong32-х разрядное целое число без знака
SHORTInteger16-ти разрядное целое число
SIZE_TLong32-х разрядное целое число без знака
TCHARStringСоответствует типу CHAR для строк формата ANSI и WCHAR для строк формата Unicode
UCHARStringСимвол в ANSI кодировке
UINTLong32-х разрядное целое число без знака
ULONGLong32-х разрядное целое число без знака
USHORTInteger16-ти разрядное целое число без знака
UUIDString128-разрядное число (16 байт)
VOIDнетНе имеет значения
WCHARStringUNICODE character
WNDPROCLong32-х разрядное целое число без знака
WORDInteger16-ти разрядное целое число без знака
WPARAMLong32-х разрядное целое число без знака

Указатели

Указатели на числовые данные при объявлении Windows API функции передаются по ссылке. Как пример рассмотрим функцию GetFileSize. Вот её прототип (подробнее о прототипах функций буде рассказано ниже):

Объявление этой функции в Visual FoxPro:

Тип указателя
на строку
Описание
LPSTRУказатель на модифицируемую нуль-терминированную строку ANSI-формата. Передаётся по ссылке
LPCSTRУказатель на немодифицируемую нуль-терминированную строку ANSI-формата. Передаётся по значению
LPTSTRСоответствует типу LPSTR для строк формата ANSI и типу LPWSTR для строк формата UNICODE. Передаётся по ссылке.
LPCTSTRСоответствует типу LPSTR для строк формата ANSI и типу LPWSTR для строк формата UNICODE. Передаётся по значению.
LPWSTRУказатель на модифицируемую нуль-терминированную строку UNICODE. Передаётся по ссылке
LPCWSTRУказатель на немодифицируемую нуль-терминированную строку UNICODE. Передаётся по значению

Структуры

Структуру можно рассматривать как набор переменных различных типов, образующих единое целое. В Си структура создаётся при помощи ключевого слова struct, за которым следует необязательное поле тега (tag) и список элементов структуры:

Возможно и такое объявление структуры:

В этом объявлении отсутствует поле тега и создаётся так называемый анонимный структурный тип; такой синтаксис позволяет связать с этим структурным типом одну или несколько переменных, как, например, в следующем примере:

Структуры очень похожи на записи таблиц Visual FoxPro. Так, если запись таблицы personal содержит поля fio, address, tlfnumber и email, то для обращения к полю tlfnumber используется следующий синтаксис:

Так же выглядит и обращение к полю структуры:

При программировании Windows API на Си описание указателя на структуру начинается с символов LP (Long Pointer), за которыми следует наименование структуры. Так, указатель нас структуру SYSTEMTIME будет иметь тип LPSYSTEMTIME, указатель на структуру POINT будет иметь тип LPPOINT, и так далее. Как видите, ничего сложного, но, благодаря этой концепции, существует чрезвычайно большое количество типов указателей на структуры.

Если данные в передаваемой структуре не должны изменяться, то указатель на такую структуру объявляется так:

Здесь модификатор CONST означает, что данные в структуре не должны меняться, а символ (*) после имени структуры означает, что вся эта строка есть описание указателя на структуру. В следующем примере показан прототип функции CopyRect, которая копирует одну структуру в другую:

Описание прототипов функций в MSDN

Теперь, когда с типами данных всё стало более-менее понятно, познакомимся подробнее с таким понятием Си, как прототипы функций.

Согласно стандарта ANSI, все функции в Си должны иметь прототипы. Прототип функции достаточно прост:

Если в прототипе указан тип VOID как возвращаемый_тип, то это означает, что функция не возвращает никаких значений. Если тип VOID указан как тип_параметра, то это означает, что функция не имеет параметров.

Информацию о прототипах Windows API функций, включенных в библиотеки Kernel32.dll, Gdi32.dll, User32.dll, Mpr.dll и Advapi32.dll, в MSDN для Visual Studio.NET вы можете найти, последовательно открывая следующие разделы оглавления (Contents) справки:

В разделе Reference вы можете посмотреть описания функций, открыв один из следующих подразделов:

Наименование раздела MSDNЧто можно посмотреть
Windows Data TypesЗдесь находится информация о типах данных Windows
Functions By CategoryЗдесь приводится список Win32 API функций по категориям
Function In Alphabetical OrderЗдесь приводится список Win32 API функций в алфавитном порядке

Вот ещё один адрес в MSDN, по которому так же имеется информация об API функциях:

На следующем рисунке показан фрагмент окна справочной системы MSDN:

Что такое windows api. Смотреть фото Что такое windows api. Смотреть картинку Что такое windows api. Картинка про Что такое windows api. Фото Что такое windows api

Вот как, например, описана в MSDN функция CopyRect:

The CopyRect function copies the coordinates of one rectangle to another.

BOOL CopyRect(
LPRECT lprcDst, // destination rectangle
CONST RECT* lprcSrc // source rectangle
);

lprcDst
[out] Pointer to the RECT structure that receives the logical coordinates of the source rectangle.
lprcSrc
[in] Pointer to the RECT structure whose coordinates are to be copied in logical units.

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
Windows NT/2000/XP: To get extended error information, call GetLastError.

Because applications can use rectangles for different purposes, the rectangle functions do not use an explicit unit of measure. Instead, all rectangle coordinates and dimensions are given in signed, logical values. The mapping mode and the function in which the rectangle is used determine the units of measure.

Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Winuser.h; include Windows.h.
Library: Use User32.lib.

Но это ещё не всё! Так как функция работает со структурами, то в её описании присутствует гиперссылка на структуру RECT. Щёлкните мышью по этой гиперссылке, и на экране появится подробное описание структуры.

Формирование структур в Visual FoxPro

Синтаксис функции BINTOC:

nExpressionпреобразуемое числовое значение
eFlagтип преобразования

Из всех возможных значений, которые может принимать параметр eFlag, нас интересуют следующие:

eFlagОписание
«2RS»Преобразует 16-ти разрядное целое число в двухбайтовую строку
«4RS»Преобразует 32-х разрядное целое число в четырёхбайтовую строку
«F»Преобразует 32-х разрядное вещественное число в четырёхбайтовую строку
«B»Преобразует 64-х разрядное вещественное число в восьмибайтовую строку

Синтаксис функции CTOBIN:

cExpressionпреобразуемая строка символов
eFlagтип преобразования

Возможные значения параметра eFlag:

eFlagОписание
«2RS»Преобразует двухбайтовую строку в 16-ти разрядное целое число
«4RS»Преобразует четырёхбайтовую строку в 32-х разрядное целое число
«4N»Преобразует четырёхбайтовую строку в 32-х разрядное вещественное число
«8N»Преобразует восьмибайтовую строку в 64-х разрядное вещественное число

Ниже показаны примеры использования этих функций:

В качестве примера запишем в переменную Visual FoxPro структуру RECT. Эта структура используется в рассмотренной ранее функции CopyRect для описания координат прямоугольной области. Вот как эта структура описывается в MSDN:

Как видите, структура RECT содержит четыре поля, в каждом из которых хранится значение типа LONG. Для её формирования в Visual FoxPro понадобится строка длиной 16 байт.

Ниже показан код, в котором объявляется функция CopyRect, формируются структуры Dst и Src для передачи их как параметров функции, и затем выполняется копирование одной структуры в другую. В примере используется функция BINTOC для преобразования числа в строку:

В следующем примере показано, как, используя функцию CTOBIN, можно «разобрать» структуру, получив числовые значения её полей:

Структуры, содержащие указатели

Достаточно часто встречается ситуация, когда передаваемая Windows API функции структура содержит указатели. В качестве примера рассмотрим функцию StartDoc, создающую документ для печати на принтере. Вот её прототип:

Есть несколько возможностей получить блок памяти. Можно взять «кусочек» как из общей памяти Windows, так и из памяти, выделенной процессу (то есть вашему приложению). Второй способ имеет более высокое быстродействие, тем не менее здесь мы рассмотрим способ работы с памятью Windows как более простой.

Функция GlobalAlloc получает у Windows блок памяти указанного размера и возвращает указатель на него. Вот прототип этой функции:

Параметр uFlags определяет, как будет распределяться память. В MSDN написано, что он может принимать одно из следующих значений:

uFlagОписание
GHNDКомбинация значений GMEM_MOVEABLE и GMEM_ZEROINIT
GMEM_FIXEDРаспределяется фиксированная (неперемещаемая) область памяти
GMEM_MOVEABLEРаспределяется перемещаемая память
GMEM_ZEROINITВыделенный блок памяти заполняется нулями
GPTRКомбинация значений GMEM_FIXED и GMEM_ZEROINIT

Из таблицы следует, что для параметра uFlags следует использовать значение GPTR. Но как узнать, какое это значение? Найдите в MSDN описание функции GlobalAlloc и в разделе Requirements посмотрите, в каком include-файле находится её прототип. Это файл Winbase.h. Именно в нём и следует искать описание значений констант. Вот фрагмент этого файла, в котором определяются перечисленные в таблице константы:

Следовательно, GPTR = GMEM_FIXED + GMEM_ZEROINIT = 0x0000 + 0x0040 = 0x0040.

Какой размер должен иметь выделяемый блок памяти? Конечно, равный длине строки, в которой хранится наименование документа. В следующем примере показаны действия, начиная с объявления API функции и заканчивая выделением блока памяти:

Функция ведёт себя по разному в зависимости от того, указан параметр cNewString или нет.

Если параметр cNewString указан, то функция копирует nLenght байт из переменной cNewString в память по адресу, указанному в dwAddress.

Если параметр cNewString не указан, то функция возвращает nLenght байт из памяти по адресу, указанному в dwAddress.

Запишем содержимое строки cDocumentName в выделенную функцией GlobalAlloc память:

Вот полный код формирования структуры DOCINFO:

Особенности использования памяти

Вот прототип функции GlobalFree:

Передача в функцию массивов

Массив Visual FoxPro имеет совершенно другую организацию, которая позволяет хранить в его элементах совершенно разные типы данных. Поэтому невозможно передать массив из Visual FoxPro в Windows API функцию, просто указав его имя как параметр. Более того, в команде DECLARE..DLL нет такого типа данных, как массивы.

Функция работает как с одномерными, так и с двумерными массивами.

Кодировка символьных данных: форматы ANSI и UNICODE

В кодировке ANSI (применяемой в Visual FoxPro) каждый символ определяется одним байтом, то есть максимальное количество символов равно 256, что, конечно, очень мало. Например, при русификации часть стандартных символов ANSI заменяется на символы кириллицы. А в некоторых алфавитах, например, японской кане, столько символов, что одного байта для их кодировки просто недостаточно. Для поддержки таких языков, и, что более важно, для облегчения «перевода» программ на другие языки, была разработана кодировка Unicode. Каждый символ в Unicode состоит из двух байтов, что позволило расширить набор допустимых символов до 65536.

Достаточно большое количество функций Windows API используют при работе с символьными строками формат Unicode. Для работы с такими функциями необходимо выполнять конвертирование символьных данных из одного формата в другой.

Встроенная функция Visual FoxPro STRCONV выполняет конвертирование строк как из формата ANSI в UNICODE, так и обратно. Вот её синтаксис:

Необязательные параметры nRegionalIdentifier и nRegionalIDType определяют дополнительные региональные настройки и могут быть безболезненно проигнорированы.

Ниже показаны примеры использования функции STRCONV:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *