mfc - ¿Cuál es la vida útil de un CWnd obtenido de CWnd:: FromHandle?
winapi hwnd (4)
Basado en la misma descripción de MSDN, supondría que esto significa que si no hay CWnd conectado al hWnd proporcionado como un objeto, creará un CWnd temporal que probablemente se destruirá cuando algo salga del alcance, o se llame a un destructor en cualquier otro lugar , o un CWnd se crea explícitamente para el hWnd en cuestión. Entonces, si ya tiene un CWnd creado, debería estar bien, de lo contrario, probablemente tenga que tener mucho cuidado al guardar el puntero que recibe.
De acuerdo con msdn , cuando obtengo un CWnd * con CWnd :: FromHandle,
El puntero puede ser temporal y no debe almacenarse para su uso posterior.
Lo que significa "uso posterior" no está claro para mí. ¿Es solo el alcance del método actual? Por lo que sé, ¡no hay GC en Win32!
FromHandle se usa básicamente para obtener una referencia transitoria a un objeto de ventana ya existente. MFC almacena estas referencias en una estructura interna llamada mapa de asa temporal (un mapa de asa es un mapa de HWND de Windows a objetos MFC CWnd utilizados por MFC para hacer que las llamadas Win32 manipulen la ventana real de Windows a la que corresponde el objeto MFC). Para evitar que el número de objetos en esta estructura crezca más allá de todos los límites, los elementos se eliminan del mapa de asas durante el procesamiento de ciclo inactivo de MFC.
Como habrás adivinado, también hay un mapa de control permanente que no tendrá este comportamiento de limpieza automática. Si necesita obtener un objeto CWnd que no ponga su referencia HWND en el mapa temporal del controlador, puede llamar a FromHandlePermanent ().
-Ron
MFC mantiene una cantidad de mapas de manejo, desde HWND a CWnd, HDC a CDC, etc., que se almacenan en el estado del hilo. Cada mapa de asa contiene un mapa permanente y un mapa temporal: las entradas permanentes se agregan cuando se llama a un método como CWnd :: Create o CDC :: Attach, mientras que las entradas temporales se crean cuando se llama FromHandle en un identificador que no tiene un entrada permanente.
Las entradas temporales se limpian durante el procesamiento inactivo (en CWinApp :: OnIdle), por lo que solo se pueden usar de forma segura mientras se procesa el mensaje actual. Tan pronto como regrese al bucle de mensajes, o ingrese otro bucle modal (por ejemplo, al llamar a DoModal), es posible que se eliminen.
Por lo general, solo quieren que use este controlador en el ámbito de su función. Y no para almacenarlo como un campo de clase donde lo referencia a lo largo de la vida de su objeto.