Objetos de usuario
Los objetos de interfaz de usuario solo admiten un identificador por objeto. Los procesos no pueden heredar ni duplicar identificadores para objetos de usuario. Los procesos de una sesión no pueden hacer referencia a un identificador de usuario en otra sesión.
Hay un límite teórico de 65 536 identificadores de usuario por sesión. Sin embargo, el número máximo de identificadores de usuario que se pueden abrir por sesión suele ser inferior, ya que se ve afectado por la memoria disponible. También hay un límite predeterminado por proceso de identificadores de usuario. Para cambiar este límite, establezca el siguiente valor del Registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Currentversion\Windows\USERProcessHandleQuota
Este valor se puede establecer en un número comprendido entre 200 y 18 000.
Identificadores de objetos de usuario
Los identificadores de los objetos de usuario son públicos para todos los procesos. Es decir, cualquier proceso puede usar el identificador de objeto de usuario, siempre que el proceso tenga acceso de seguridad al objeto.
En la ilustración siguiente, una aplicación crea un objeto window. La función CreateWindow crea el objeto window y devuelve un identificador de objeto.
Una vez creado el objeto window, la aplicación puede usar el identificador de ventana para mostrar o cambiar la ventana. El identificador permanece válido hasta que se destruye el objeto de ventana.
En la siguiente ilustración, la aplicación destruye el objeto window. La función DestroyWindow quita el objeto de ventana de la memoria, que invalida el identificador de la ventana.
Administración de objetos de usuario
En la tabla siguiente se enumeran los objetos de usuario, junto con las funciones creador y destructor de cada objeto. Las funciones creator crean el objeto y un identificador de objeto o simplemente devuelven el identificador de objeto existente. Las funciones de destructor quitan el objeto de la memoria, que invalida el identificador de objeto.
Objeto de usuario | Función Creator | Función Destroyer |
---|---|---|
Tabla aceleradora | CreateAcceleratorTable | DestroyAcceleratorTable |
Símbolo de intercalación | CreateCaret | DestroyCaret |
Cursor | CreateCursor, LoadCursor, LoadImage | DestroyCursor |
Conversación de DDE | DdeConnect, DdeConnectList | DdeDisconnect, DdeDisconnectList |
Enlace | SetWindowsHookEx | UnhookWindowsHookEx |
Icono | CreateIconIndirect, LoadIcon, LoadImage | Destroyicon |
Menú | CreateMenu, CreatePopupMenu, LoadMenu, LoadMenuIndirect | DestroyMenu |
Periodo | CreateWindow, CreateWindowEx, CreateDialogParam, CreateDialogIndirectParam, CreateMDIWindow | DestroyWindow |
Posición de la ventana | BeginDeferWindowPos | EndDeferWindowPos |