Здесь следует отметить некоторую путаницу в терминах. В англоязычной справке есть слово module, служащее для обозначения файла, отображенного в адресное пространство процесса, т. е., в первую очередь, exe-файла, породившего процесс, и загруженных им DLL. И есть слово unit, которое обозначает модуль в Delphi и которое также переводится как модуль. Ранее мы говорили о модулях как об отображаемых в адресное пространство файлах — это они имеют дескрипторы. Модули Delphi не являются системными объектами и дескрипторов не имеют.
Дескриптор модуля, загруженного в память, можно получить с помощью функции GetModuleHandle
. Функция LoadLibrary
в случае успешного завершения также возвращает дескриптор загруженной DLL. Кроме того, Delphi предоставляет две переменные: MainInstance
из модуля System
и HInstance
из модуля SysInit
(оба этих модуля подключаются к программе автоматически, без явного указания в списке uses
). MainInstance
содержит дескриптор exe-файла, породившего процесс, HInstance
— текущего модуля. В исполняемом файле MainInstance
и HInstance
равны между собой, в DLL HInstance
содержит дескриптор самой библиотеки, а MainIstance
— загрузившего ее главного модуля.
Каждое окно в Windows привязывается к какому-либо модулю (в Windows 9х/МЕ необходимо явно указать дескриптор этого модуля. NT 2000 ХР определяет модуль, из которого вызвана функция создания окна, автоматически). Соответственно, оконные классы делятся наTWndClassEx
при регистрации класса.
Оконный класс, к которому принадлежит окно, указывается при его создании
. Это может быть зарегистрированный ранее класс или один из'BUTTON'
, 'COMBOBOX'
, 'EDIT'
, 'LISTBOX'
, 'MDICLIENT'
, 'SCROLLBAR'
и 'STATIC'
. Назначение этих классов понятно из их названий (класс 'STATIC'
реализует статические текстовые или графические элементы, т. е. не реагирующие на мышь и клавиатуру, но имеющие дескриптор). Кроме этих классов существуют также классы из библиотеки ComCtl32.dll, они тоже доступны всем приложениям без предварительной регистрации (подробнее об этих классах можно узнать в MSDN в разделе Common Controls Reference).
Для окон в обычном понимании этого слова готовых классов не существует, их приходится регистрировать самостоятельно. В частности, VCL для форм регистрирует оконные классы, имена которых совпадают с именами соответствующих классов VCL.
Кроме имени, класс включает в себя другие параметры, такие как стиль, кисть и т. д. Они подробно перечислены в справке.
Для создания окна служат функции CreateWindow
и CreateWindowEx
. При создании окна в числе других параметров задается модуль, к которому оно привязано, имя оконного класса,