Дескрипторы
Одним из важнейших понятий в Windows-программировании является понятие объектного дескриптора (handle). В Windows все объекты — кисти, перья, растры, указатели мыши, контексты устройств, окна, экземпляры программ— идентифицируются 32-разрядным (в Winl6 — 16-разрядным) целым числом, которое называется дескриптором (иногда манипулятором). С каждым дескриптором связывается идентификатор типа, начинающийся с буквы "Н" (в языке Си — с "h" нижнего регистра. В отличие от Pascal, регистр в Си имеет значение). Например, hwnd— это дескриптор окна. Дескрипторы ссылаются на объекты, находящиеся под управлением системы Windows. Работающая операционная система отслеживает все дескрипторы которые служат связующими звеньями между загруженными объектами вызвавшими их приложениями.
Когда мы создаем некоторый объект в Windows, ему присваивается уникальный 32-разрядный дескриптор, который в последующем передается каждой функции, при работе с этим объектом. Это главное различие между функциями Widows API и стандартными методами класса Object Pascal. Вторые связаны с тем экземпляром класса, через который они вызываются, и поэтому не требуют явного указания на объект. Первым необходимо такое указание (что и делается с помощью дескриптора), т. к. они сами по себе никак не связаны ни с одним объектом.
В Delphi для хранения дескриптора объектов определен тип THandle:
type THandle : LongInt;
Кроме типа THandle в Delphi поддерживаются также имена типов, пришедшие из С++, а именно: hwnd, hmenu, hkey и другие имена, начинающиеся с префикса. Н (Handle).
При использовании функций Windows API к объектам Object Pascal следует понимать, что данные функции "не знают" о внутренних механизмах работы Delphi.
Поясним на примере: если скрыть окно не с помощью метода Delphi Hide, а с помощью функции WinAPI showWindow(Handle, sw_Hide), то в Delphi не возникнет событие onHide, потому что оно генерируется упомянутыми внутренними механизмами. Следует об этом помнить.
Но случается такое только когда функциями Windows API дублируется то, что можно сделать с помощью Delphi. Для вызова функций Windows API для объекта, созданного с помощью Delphi, используйте свойство объекта Handle, — в нем хранится дескриптор.
Комментарии (0)