Типы данных в Win32 API

В WINAPI определено множество типов данных, так же, как и в C/С++ (int, char, float и т.д.). Учить их определения не обязательно. Достаточно  помнить, что они существуют, а когда они появятся или потребуются где-нибудь в программе, посмотреть их определения. В дальнейшем мы будем использовать их все. Условно их можно разделить на несколько видов: основные, дескрипторные, строковые и вспомогательные.

Основные типы

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

BOOL – этот тип данных аналогичен bool. Он также имеет два значения – 0 или 1. Только при использовании WINAPI принято использовать вместо 0 спецификатор NULL. О нём ниже.

BYTE – байт, ну или восьмибитное беззнаковое целое число. Аналог – unsigned char.

DWORD — 32-битное беззнаковое целое. Аналоги: unsigned long int, UINT.

INT – 32-битное целое. Аналог – long int.

LONG – 32-битное целое – аналог всё также long int.

NULL – нулевой указатель. Вот его объявление:

void *NULL=0;

UINT – 32-битное беззнаковое целое. Аналоги: unsigned long int, DWORD.

Дескрипторные типы данных

Про дескрипторные типы немного рассказывалось на вводном уроке в WINAPI. Дескриптор, как говорилось ранее, — это идентификатор какого-либо объекта. Для разных типов объектов существуют разные дескрипторы. Дескриптор объекта можно описать так:

HANDLE h;

Есть также дескрипторы кисти, курсора мыши, шрифта и т.д. С их помощью мы можем при инициализации или в процессе работы приложения поменять какие-нибудь настройки, чего, например, мы не могли сделать в консольном приложении. Используются они в описательных функциях, управляющих типа: CreateProcess(), ShowWindow() и т.д. или как возвращаемое значение некоторых функций :

// получает дескриптор для устройства ввода или вывода:
HANDLE h = GetStdHandle(DWORD nStdHandle);

В этой функции мы получили дескриптор считывания потоков std_in и std_out. И можем, например, его использовать в каком-нибудь условии.

Не будем вдаваться в физику создания дескрипторов. Разве что, при необходимости или для большего понимания процессов.

Примечание: для удобства в WINAPI предусмотрены сокращения для типов данных. Первая буква H – означает, что это дескриптор, от слова handle.

HANDLE – дескриптор объекта.

HBITMAP – дескриптор растрового изображения. От фразы handle bitmap.

HBRUSH – дескриптор кисти. От фразы handle brush.

HCURSOR – дескриптор курсора. От фразы handle cursor.

HDC – дескриптор контекста устройства. От фразы handle device context.

HFONT – дескриптор шрифта. От фразы handle font.

HICONS – дескриптор криптограммы. От фразы handle icons.

HINSTANCE – дескриптор экземпляра приложения. От фразы handle instance.

HMENU – дескриптор меню. От фразы handle menu.

HPEN – дескриптор пера. От фразы handle pen.

HWND – дескриптор окна. От фразы handle window.

Строковые типы данных

Для начала начнём, с того, какие кодировки существуют в Windows ОС.

Есть два вида кодировок символов: ANSI и UNICODE. Однобайтные символы относятся к ANSI, двухбайтные —  к кодировке UNICODE. Мы можем с лёгкостью подключить UNICODE кодировку в свойствах проекта. И тогда в коде создать переменную типа char можно будет так:

// создаём строку из 10 элементов:
wchar_t str[10];

Если же мы хотим использовать кодировку ANSI, то мы традиционно напишем:

// тоже создаём строку из 10 элементов:
char str[10];

В WINAPI, в зависимости от того, подключён юникод или нет, используются два вида строк UNICODE-ные или TCHAR-ные. Ниже описаны строковые типы данных.

Всё также для удобства, первые две буквы LP – от фразы long pointer сигнализируют о том, что это указатель.

LPCSTR – указатель на константную строку, заканчивающуюся нуль-терминатором. От фразы long pointer constant string.

LPCTSTR – указатель на константную строку, без UNICODE.  От фразы long pointer constant TCHAR string. Это надстройка функции LPCSTR.

LPCWSTR – указатель на константную UNICODE строку. От фразы фразы long pointer constant wide character string. Это надстройка функции LPCSTR.

LPSTR – указатель на строку, заканчивающуюся нуль-терминатором. От фразы long pointer string.

LPTSTR – указатель на строку, без UNICODE. От фразы long pointer TCHAR string.  Это надстройка функции LPSTR.

LPWSTR – указатель на UNICODE строку. От фразы long pointer wide character string. Это надстройка функции LPSTR.

TCHAR – символьный тип — аналог char и wchar_t.

Вспомогательные типы

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

LRESULT CALLBACK ИмяФункции(HWND hWnd, UINT uMSg, 
                            WPARAM wParam, LPARAM lParam);

Работа с данной функцией будет в следующих разделах.

LPARAM – тип для описания lParam (long parameter). Используются вместе с wparam в некоторых функциях.

LRESULT – значение, возвращаемое оконной процедурой имеет тип long.

WPARAM – тип для описания wParam (word parameter). Используются вместе с lParam в некоторых функциях.

На этом типы данных не закончены. В дальнейшем мы обязательно будем обращаться к данной статье.

Автор: Marienko L.
Дата: 11.02.2014
Поделиться:

Комментарии

  1. npavelFax

    Работа в интернете официальная работа.

  2. Gosha

    >В WINAPI, в зависимости от того, подключён юникод или нет, используются два вида строк UNICODE-ные или TCHAR-ные. Ниже описаны строковые типы данных.
    Это не так.
    Если объявлен UNICODE, то TCHAR двухбайтовый символ, если нет, то TCHAR это однобайтовый символ.
    Он нужен для того чтобы написать универсальную программу, которую без переделки кода можно было бы компилировать как с использование UNICODE, так и без. И больше не для чего. А так без него можно обойтись, как в UNICODE, так и в ANSI программах.
    Поэтому если используете TCHAR, то имеет смысл и весь код делать в стиле работы с TCHAR. Не надо делать так, если объявлен UNICODE:
    TCHAR mainMessage[] = L»Какой то-текст!»;
    И не надо делать так, если не объявлен UNICODE:
    TCHAR mainMessage[] = «Какой то-текст!»;
    Надо всегда делать так:
    TCHAR mainMessage[] = TEXT(«Какой то-текст!»);//Эта строка без переделки будет компилирваться как с UNICODE, так и без.
    Также и когда напрямую подставлются значения в функцию:
    MessageBox(hwndDlg, TEXT(«Это сообщение»), TEXT(«Ошибка»), MB_OK);

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.