О чём не пишут в книгах по Delphi - страница 5
Рис. 1.2. Старая (на основе hlp-файлов) справка по Windows API (показана функция >DeleteObject
)
Начиная с BDS 2006, Borland/CodeGear реализовала новую справочную систему Borland Help (рис. 1.3). По интерфейсу она очень напоминает offline версию MSDN, а также использует файлы в том же формате, поэтому технологических проблем интеграции справочных систем по Delphi и по Windows API больше не существует. В справку BDS 2006 интегрирована справка по Windows API от 2002–2003 годов (разные разделы имеют разную дату) Справка Delphi 2007 содержит сведения по Windows API от 2006 года, т.е. совсем новые. Таким образом, при работе с Delphi 2007 наконец-то можно полностью отказаться от offline-версии MSDN, а к online-версии обращаться лишь изредка, когда требуется информация о самых последних изменениях в Windows API (например, о тех, которые появились в Windows Vista).
Несмотря на очень высокое качество разделов MSDN, относящихся к Window API, ошибки иногда бывают и там. Со временем их исправляют. Поэтому, если вы столкнулись с ситуацией, когда есть подозрение, что какая-либо функция Windows API ведёт себя не так, как это описано в вашей offline-справке, есть смысл заглянуть в online-справку — возможно, там уже появились дополнительные сведения по данной функции.
Рис. 1.3. Окно справки Delphi 2007 (функция >DeleteObject
)
Система Windows написана на C++, поэтому все описания функций Windows API, а также примеры их использования приведены на этом языке (это касается как MSDN, так и справки, поставляемой с Delphi). При этом, прежде всего, необходимо разобраться с типами данных. Большинство типов, имеющихся в Windows API. определены в Delphi. Соответствие между ними показано в табл. 1.1.
Таблица 1.1. Соответствие типов Delphi системным типам
Тип Windows API | Тип Delphi |
---|---|
>INT | >INT |
>UINT | >LongWord |
>WORD | >Word |
>SHORT | >SmallInt |
>USHORT | >Word |
>CHAR | Чаще всего соответствует типу >Char , но может трактоваться также как >ShortInt , т.к. в C++ нет разницы между символьным и целочисленным типами |
>UCHAR | Чаще всего соответствует типу >Byte , но может трактоваться также как >Char |
>DWORD | >LongWord |
>BYTE | >Byte |
>WCHAR | >WideChar |
>BOOL | >LongBool |
>int | >Integer |
>long | >LongInt |
>short | >SmallInt |
>unsigned int | >Cardinal |
Название типов указателей имеет префикс P или LP (Pointer или Long Pointer, в 16-разрядных версиях Windows были короткие и длинные указатели. В 32-разрядных все указатели длинные, поэтому оба префикса имеют одинаковый смысл). Например, >LPDWORD
эквивалентен типу >^DWORD
, >PUCHAR
— >^Byte
. Иногда после префикса P или LP стоит еще префикс C — он означает, что это указатель на константу. В C++ возможно объявление таких указателей, которые указывают на константное содержимое, т.е. компилятор разрешает это содержимое читать, но не модифицировать. В Delphi такие указатели отсутствуют, и при портировании эти типы заменяются обычными указателями, т.е. префикс C игнорируется.
Типы >PVOID
и >LPVOID
соответствуют нетипизированным указателям (>Pointer
).
Для передачи символов чаще всего используется тип >TCHAR
. Windows поддерживает две кодировки: ANSI (1 байт на символ) и Unicode (2 байта на символ; о поддержке Unicode в Windows мы будем говорить далее). Тип >CHAR
соответствует символу в кодировке ANSI, >WCHAR
— Unicode. Для программ, которые используют ANSI, тип