Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Операционная система Microsoft Windows 3.1 для программиста

© Александр Фролов, Григорий Фролов
Том 11 М.: Диалог-МИФИ, 1993, 269 стр.

[Назад] [Содеожание] [Дальше]

8.2. Типы данных

Для разработки приложений Windows используется большое количество типов данных и констант, определенных в таких файлах, как windows.h, commdlg.h и других. Эти типы данных как бы замещают собой стандартные типы данных языка Си.

Такая замена позволяет отделить программный интерфейс Windows от самой операционной системы Windows, с одной стороны, и от конкретных реализаций компиляторов языка Си, с другой. Например, система разработки программ Borland C++ версии 3.1 трактует тип unsigned int как беззнаковое целое размером 16 бит. В файле windows.h определен тип UNIT, который для указанной выше системы разработки отображается на тип unsigned int :

typedef unsigned int UINT;

Однако при разработке 32-разрядных приложений (таких, как Windows NT) для 32-разрядных процессоров тип UINT должен иметь размер 32 бит. Если вы будете думать о типе UINT как о типе, который используется для представления беззнакового целого естественной для данного процессора длины, вы можете избежать ошибок, связанных с неправильным определением размера целого числа без знака.

Другой пример - дальний указатель на строку символов char _far *. Для разработки приложений Windows версии 3.1 в среде разработки Borland C++ вместо этого типа данных используется тип LPSTR, определенный следующим образом:

typedef char FAR* LPSTR;

Ключевое слово FAR определено так:

#define FAR _far

В 16-разрядной среде тип LPSTR отображается на дальний указатель, состоящий из селектора и смещения. В 32-разрядной среде при использовании сплошной (FLAT) модели памяти содержимое сегментных регистров устанавливается один раз при запуске приложения и в дальнейшем не изменяется (самим приложением). Для адресации в этом случае используется только 32-разрядная компонента смещения.

Если ваша программа использует тип LPSTR, при ее переносе в среду Windows NT вам не придется изменять исходные тексты, достаточно выполнить новую трансляцию. Для этой операционной системы ключевое слово FAR определено как пустое место:

#define FAR

Поэтому все дальние указатели, определенные с использованием этого ключевого слова, автоматически превратятся в ближние (что и требовалось).

Если бы вы определяли дальний указатель на строку символов как char _far *, вам бы пришлось удалять или переопределять ключевое слово _far.

Типы данных в файле windows.h

Файл windows.h должен включаться во все исходные файлы приложений Windows. Он содержит определение типов данных, символических имен констант и прототипы функций программного интерфейса Windows.

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

Этот файл содержит описание базовых типов и производных, созданных из базовых. Имена типов (как правило, это указатели) могут начинаться с префикса. Префикс LP означает дальний указатель (Long Pointer), префикс NP - ближний указатель (Near Pointer), и префикс P - указатель без определения типа. Для константных типов данных (определенных с ключевым словом const) после префикса добавляется буква "C", например, LPCSTR.

Приведем список базовых типов данных, определенных в файле windows.h.

Тип данных Определение типа в файле windows.h Описание
BOOL int Булевый (двоичный)
BYTE unsigned char Байт
WORD unsigned short Беззнаковое целое размером 16 бит
DWORD unsigned long Беззнаковое целое размером 32 бит
UINT unsigned int Беззнаковое целое естественного для данной системы размера

Заметим, что в Windows версии 3.1 изменилось определение типа данных WORD по сравнению с версией 3.0. В файле windows.h, предназначенном для разработки приложений Windows версии 3.0, тип данных WORD был определен следующим образом:

typedef unsigned int WORD; // Для Windows версии 3.0!

В обоих случаях (и для версии 3.0, и для версии 3.1) тип данных отображается на беззнаковое целое длиной 16 бит. Но для Windows NT типы данных unsigned int и unsigned short уже не эквивалентны. Использование вместо них типа данных WORD упростит задачу переноса исходных текстов приложений в 32-разрядную среду.

На основе приведенного выше набора базовых типов в файле windows.h определены производные типы, которые являются указателями:

Тип данных Определение типа в файле windows.h Описание
PSTR char NEAR * Ближний указатель на символ типа char
NPSTR char NEAR * Ближний указатель на символ типа char
LPSTR char FAR * Дальний указатель на символ типа char
LPCSTR const char FAR * Константный дальний указатель на символ типа char
PBYTE BYTE NEAR * Ближний указатель на байт
LPBYTE BYTE FAR * Дальний указатель на байт
PINT int NEAR * Ближний указатель на int
LPINT int FAR * Дальний указатель на int
PWORD WORD NEAR * Ближний указатель на беззнаковое целое размером 16 бит
LPWORD WORD FAR * Дальний указатель на беззнаковое целое размером 16 бит
PLONG long NEAR * Ближний указатель на знаковое целое размером 32 бит
LPLONG long FAR * Дальний указатель на знаковое целое размером 32 бит
PDWORD DWORD NEAR * Ближний указатель на беззнаковое целое размером 32 бит
LPDWORD DWORD FAR * Дальний указатель на беззнаковое целое размером 32 бит
LPVOID void FAR * Дальний указатель, для которого не определен тип данных

Файл windows.h содержит определения для многочисленных структур данных, таких, как POINT, RECT, TEXTMETRICS и т. п. Для всех структур данных определены указатели, например:

typedef struct tagPOINT
{
  int x;
  int y;
} POINT;
typedef POINT*       PPOINT;
typedef POINT NEAR* NPPOINT;
typedef POINT FAR*  LPPOINT;

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

Мы не будем перечислять все структуры данных, описанные в файле windows.h, так как их очень много. Вы можете посмотреть определения нужных вам структур непосредственно в файле windows.h, который всегда находится в каталоге с именем include.

Еще один важный тип данных, определенный в файле windows.h, - это различные идентификаторы (handle).

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

HDC hdc;
hdc = GetDC(hwnd);

Само по себе полученное значение идентификатора не имеет для вас никакого смысла. Идентификатор должен использоваться только для ссылки на ресурс, например:

DrawText(hdc, (LPSTR)szBuf, nBufSize, &rc,
  DT_CENTER | DT_VCENTER | DT_NOCLIP | DT_SINGLELINE);

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

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

ReleaseDC(hwnd, hdc);

Приведем список некоторых типов идентификаторов ресурсов:

Тип идентификатора Описание
GLOBALHANDLE Идентификатор блока глобальной памяти
HACCEL Акселератор
HBITMAP Изображение в виде битового образа (bitmap)
HBRUSH Кисть
HCURSOR Курсор
HDC Контекст устройства
HDRVR Драйвер устройства
HFONT Шрифт
HGDIOBJ Объект графического интерфейса GDI
HGLOBAL Идентификатор блока глобальной памяти
HICON Пиктограмма
HLOCAL Идентификатор блока локальной памяти
HMENU Меню
HMETAFILE Метафайл
HPALETTE Палитра
HPEN Перо
HRGN Область
HRSRC Ресурс
HSTR Строка символов
HTASK Задача
HWND Окно
LOCALHANDLE Идентификатор блока локальной памяти

С некоторыми перечисленными выше идентификаторами вы уже знакомы, с некоторыми вам еще только предстоит познакомиться в следующих томах "Библиотеки системного программиста".

Имена констант в файле windows.h

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

Символические имена большинства констант, определенные в файле windows.h и других файлах, включаемых в исходные тексты приложений Windows, начинаются с префиксов, таких, как WM или WS. Имена некоторых констант не имеют таких префиксов, например OPAQUE, TRANSPARENT и т. п.

Приведем список некоторых префиксов имен констант, определенных в файле windows.h.

Префикс символического имени константы Описание
BI Компрессия изображений bitmap
BN Коды сообщений от кнопок
BS Стили логических кистей
CB Стили органа управления Combo Box
CBN Коды сообщений от органа управления Combo Box
CBS Стили при создании органа управления Combo Box
CE Коды ошибок при передаче данных
CF Форматы универсального буфера обмена данными Clipboard
COLOR Системные цвета отдельных элементов пользовательского интерфейса Windows
CS Стили класса окна
DRIVE Тип диска
DS Стили при создании диалоговых панелей
DT Технология, использованная при создании устройства ввода/вывода
DT Режимы форматирования при выводе текста функцией DrawText
HT Коды, возвращаемые функцией DefWindowProc при обработке сообщения WM_NCHITTEST
ID Идентификаторы команд диалоговой панели
IDC Идентификаторы встроенных курсоров
IDI Идентификаторы встроенных пиктограмм
MB Флаги для функции MessageBox
META Коды для метафайлов
MM Режимы отображения
СС Способность устройства рисовать различные кривые
OF Константы для работы с файлами
PS Стили пера
RT Типы ресурсов
SB Команды и константы для полосы просмотра (Scroll Bar)
SBS Стили полосы просмотра
SC Значения системных команд, передаваемых вместе с сообщением WM_SYSCOMMAND
SIZE Константы для описания способа изменения размера окна
SM Константы для определения системных метрик
SW Константы для функции ShowWindow
TA Константы для выбора способа выравнивания текста при его выводе с помощью функций TextOut и ExtTextOut.
VK Коды виртуальных клавиш
WM Сообщения Windows
WS Стили окна
WS_EX Расширенные стили окна

Имена параметров функций

Изобилие типов в приложениях Windows создает определенные трудности для программиста. Ему приходится постоянно думать о соответствии имен переменных типам переменных. Для облегчения работы программистов рекомендуется для всех имен параметров функций и других переменных использовать префиксы. Эти префиксы должны быть заданы маленькими буквами. Приведем список некоторых префиксов, рекомендуемых для различных типов данных:

Префикс Тип данных
atm ATOM
f BOOL
b BYTE
lpb BYTE FAR*
lpch char FAR*
dlgprc DLGPROC
dw DWORD
lpdw DWORD FAR*
haccl HACCEL
hbm HBITMAP
hbr HBRUSH
hcur HCURSOR
hdc HDC
hdrvr HDRVR
hdwp HDWP
hf HFILE
hfont HFONT
hgdiobj HGDIOBJ
hglb HGLOBAL
hhook HHOOK
hicon HICON
hinst HINSTANCE
hloc HLOCAL
hmenu HMENU
hmf HMETAFILE
hmod HMODULE
hkprc HOOKPROC
hpal HPALETTE
hpen HPEN
hrgn HRGN
hrsrc HRSRC
hstr HSTR
htask HTASK
hwnd HWND
n int
l LONG
lParam LPARAM
lpb LPBYTE
lpsz LPCSTR
lpn LPINT
lpl LPLONG
lpsz LPSTR
lpv LPVOID
lpw LPWORD
lResult LRESULT
npsz NPSTR
npb PBYTE
lppt POINT FAR*
lprc RECT FAR*
tmprc TIMERPROC
u UINT
wndenmprc WNDENUMPROC
wndprc WNDPROC
u или w WORD
wParam WPARAM

[Назад] [Содеожание] [Дальше]