Пользовательские объекты
Объекты пользовательского интерфейса поддерживают только один дескриптор для каждого объекта. Процессы не могут наследовать или дублировать дескриптора для пользовательских объектов. Процессы в одном сеансе не могут ссылаться на дескриптор пользователя в другом сеансе.
Существует теоретический предел в 65 536 пользовательских дескрипторов на сеанс. Однако максимальное количество пользовательских дескрипторов, которые могут быть открыты на сеанс, обычно ниже, так как это влияет на доступную память. Существует также ограничение по умолчанию для каждого процесса дескрипторов пользователей. Чтобы изменить это ограничение, задайте следующее значение реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERProcessHandleQuota
Это значение можно задать в диапазоне от 200 до 18 000.
Обработка пользовательских объектов
Дескриптор пользовательских объектов является общедоступным для всех процессов. То есть любой процесс может использовать дескриптор пользовательского объекта, если процесс имеет доступ к объекту безопасности.
На следующем рисунке приложение создает объект окна. Функция CreateWindowсоздает объект окна и возвращает дескриптор объекта.
После создания объекта окна приложение может использовать дескриптор окна для отображения или изменения окна. Дескриптор остается допустимым до тех пор, пока объект окна не будет уничтожен.
На следующем рисунке приложение уничтожает объект окна. Функция DestroyWindow удаляет объект окна из памяти, который запрещает дескриптор окна.
Управление пользовательскими объектами
В следующей таблице перечислены пользовательские объекты, а также функции создателя и уничтожения каждого объекта. Создатель функций либо создает объект, либо дескриптор объекта или просто возвращает существующий дескриптор объекта. Функции разрушителя удаляют объект из памяти, который запрещает дескриптор объекта.
Объект User | Функция Creator | Функция разрушителя |
---|---|---|
Таблица акселератора | CreateAcceleratorTable | DestroyAcceleratorTable |
Знак вставки | CreateCaret | DestroyCaret |
Курсор | CreateCursor, LoadCursor, LoadImage | DestroyCursor |
Беседа DDE | DdeConnect, DdeConnectList | DdeDisconnect, DdeDisconnectList |
Крюк | SetWindowsHookEx | UnhookWindowsHookEx |
Икона | CreateIconIndirect, LoadIcon, LoadImage | DestroyIcon |
Меню | CreateMenu, CreatePopupMenu, LoadMenu, LoadMenuIndirect | DestroyMenu |
Окно | CreateWindow, CreateWindowEx, CreateDialogParam, CreateDialogIndirectParam, CreateMDIWindow | DestroyWindow |
Положение окна | BeginDeferWindowPos | EndDeferWindowPos |