Api windows что это такое

Введение в 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 Размер,
байт
Описание
Short 16-ти разрядное целое число
Integer, Long 4 32-х разрядное целое число
Single 4 32-х разрядное вещественное число
Double 8 64-х разрядное вещественное число
String Строка символов

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

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

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

cParamType Размер,
байт
Описание
Integer, Long 4 32-х разрядное целое число
Single 4 32-х разрядное вещественное число
Double 8 64-х разрядное вещественное число
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
Тип в объявлении
функции
Описание
BOOL Long 32-х разрядное целое число. 0 означает false, все остальное означает true.
BOOLEAN Long тоже самое, что и BOOL.
BYTE String 8-ми разрядное целое число
CHAR String 8-ми разрядное целое число
CLSID String 128-разрядное число (16 байт)
COLORREF Long 32-х разрядное целое число
DWORD Long 32-х разрядное целое число
DOUBLE Double 64-х разрядное вещественное число
FLOAT Single 32-х разрядное вещественное число
GUID String 128-разрядное число (16 байт)
HANDLE Long 32-х разрядное целое число без знака
HBITMAP Long 32-х разрядное целое число без знака
HDC Long 32-х разрядное целое число без знака
HICON Long 32-х разрядное целое число без знака
HGLOBAL Long 32-х разрядное целое число без знака
HKL Long 32-х разрядное целое число без знака
HLOCAL Long 32-х разрядное целое число без знака
HINSTANCE Long 32-х разрядное целое число без знака
HRESULT Long 32-х разрядное целое число без знака
HWND Long 32-х разрядное целое число без знака
LONG Long 32-х разрядное целое число
LPARAM Long 32-х разрядное целое число без знака
SHORT Integer 16-ти разрядное целое число
SIZE_T Long 32-х разрядное целое число без знака
TCHAR String Соответствует типу CHAR для строк формата ANSI и WCHAR для строк формата Unicode
UCHAR String Символ в ANSI кодировке
UINT Long 32-х разрядное целое число без знака
ULONG Long 32-х разрядное целое число без знака
USHORT Integer 16-ти разрядное целое число без знака
UUID String 128-разрядное число (16 байт)
VOID нет Не имеет значения
WCHAR String UNICODE character
WNDPROC Long 32-х разрядное целое число без знака
WORD Integer 16-ти разрядное целое число без знака
WPARAM Long 32-х разрядное целое число без знака

Указатели

Указатели на числовые данные при объявлении 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:

Вот как, например, описана в 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:

Источник

Читайте также:  Power windows output 25s перевод
Поделиться с друзьями
Советы экспертов и специалистов
Adblock
detector