Administración de la duración de los objetos

Advertencia

UMDF 2 es la versión más reciente de UMDF y sustituye a UMDF 1. Todos los controladores UMDF nuevos deben escribirse con UMDF 2. No se agregan nuevas características a UMDF 1 y hay compatibilidad limitada con UMDF 1 en versiones más recientes de Windows 10. Los controladores universales de Windows deben usar UMDF 2.

Los ejemplos de UMDF 1 archivados se pueden encontrar en la Windows 11, versión 22H2 : actualización de ejemplos de controladores de mayo de 2022.

Para obtener más información, consulta Introducción con UMDF.

UMDF usa un esquema de recuento de referencias para administrar la duración de los objetos de devolución de llamada y los objetos de marco.

Administrar referencias a objetos de devolución de llamada de Driver-Supplied

En la mayoría de los casos, no se requiere un controlador para mantener una referencia a un objeto de devolución de llamada. Si el marco llama solo a los métodos de la interfaz de objeto de devolución de llamada y a los objetos cuya duración depende del objeto de devolución de llamada y del objeto de marco emparejado del objeto de devolución de llamada, el controlador no tiene que mantener una referencia. En otras palabras, el controlador o marco puede llamar de forma segura a métodos de interfaces de objeto que están más arriba en la jerarquía de objetos.

Administración de referencias a objetos framework

En UMDF, los principios generales de duración COM y el modelo de duración específico de WDF determinan la duración de los objetos de marco. El controlador debe cumplir los criterios de ambos modelos para que los objetos de marco se liberen de la memoria en momentos adecuados.

Administración de duración COM

En COM, un llamador normalmente mantiene una referencia al objeto mientras el objeto está en uso y, a continuación, el autor de la llamada libera la referencia cuando ya no requiere el objeto . Sin embargo, un controlador UMDF no necesita mantener una referencia a un objeto de marco. De hecho, el controlador puede liberar una referencia de objeto de marco inmediatamente después de que el controlador cree el objeto de marco.

Por ejemplo, los ejemplos de UMDF liberan el objeto de dispositivo después de llamar a IWDFDriver::CreateDevice. Aunque la referencia se publica temprano, el objeto de dispositivo continúa existiendo hasta que se quita el dispositivo porque el árbol de objetos WDF mantiene una referencia a él.

Dado que UMDF realiza un seguimiento de todos los objetos de marco de un árbol de objetos, el controlador no necesita mantener una referencia a los objetos de marco.

Sin embargo, si el controlador mantiene una referencia a un objeto de marco, el controlador debe liberar la referencia cuando ya no necesite el objeto . Una referencia circular permanece en su lugar hasta que el controlador libera su referencia. Para evitar referencias circulares, el controlador normalmente no debe mantener una referencia explícita a un objeto de marco.

Si el controlador debe mantener una referencia a un objeto de marco, el objeto de devolución de llamada del controlador también debe implementar la interfaz IObjectCleanup . Cuando el controlador llama a IWDFObject::D eleteWdfObject en el objeto framework, el objeto framework llama al método IObjectCleanup::OnCleanup del objeto de devolución de llamada correspondiente. La implementación de IObjectCleanup::OnCleanup debe liberar la referencia al objeto framework para permitir que el marco se complete desmontar el objeto de marco.

Administración de duración de WDF

Si va a crear un objeto de un tipo que le permita invalidar el elemento primario predeterminado, debe seleccionar un elemento primario con una duración que coincida con la duración del objeto. Para obtener más información sobre los objetos primarios predeterminados y si el controlador puede invalidar el elemento primario predeterminado, vea la tabla en Objetos framework.

Si coincide con la duración del objeto, el marco elimina el objeto cuando se elimina el objeto primario. Si no coincide con la duración del objeto y desea que el objeto se elimine antes de eliminar el elemento primario predeterminado, puede eliminar explícitamente el objeto llamando a DeleteWdfObject cuando el objeto ya no sea necesario.

Por ejemplo, si crea un nuevo objeto de solicitud y, a continuación, llama a IWDFDriver::CreateWdfMemory para crear un objeto de memoria para esta solicitud, puede especificar el objeto de solicitud como elemento primario del nuevo objeto de memoria. Dado que WDF elimina objetos secundarios cuando se elimina el objeto primario, el controlador no necesita llamar a DeleteWdfObject para eliminar el objeto de memoria.

Sin embargo, si no hay ningún elemento primario cuya duración coincida estrechamente con la duración del objeto y si desea que se elimine el objeto antes de eliminar el elemento primario predeterminado, debe usar la eliminación explícita. Por ejemplo, un controlador podría crear varios objetos de solicitud que se usan durante un breve período de tiempo. En este caso, el controlador puede conservar memoria eliminando explícitamente las solicitudes cuando ya no son necesarias.

Del mismo modo, si va a crear un objeto que no le permite invalidar el elemento primario predeterminado y si desea que se elimine el objeto antes de eliminar el elemento primario predeterminado, el controlador debe eliminar explícitamente el objeto.