es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Liberar un puntero a un objeto COM de Direct2D Factory en C [d2d1.h]

El problema

Estoy siguiendo una guía de la Documentación de Microsoft y los ejemplos que se presentan allí están en C++. Podría haber utilizado los ejemplos predeterminados en C++, pero quería entender mejor cómo funciona la API, así que decidí reescribir el ejemplo predeterminado en C.

El problema que encontré es que puedo llamar fácilmente a D2D1CreateFactory y crear una ID2D1Factory, aunque cuando estaba leyendo la documentación anteriormente, se indicaba que siempre hay que liberar el objeto COM después de haberlo utilizado y no necesitarlo más. El hecho es que en C++ hay un método heredado llamado Release de IUnknown. Sin embargo, en C no hay ni siquiera un lpVtbl, que según entiendo, generalmente se necesita para ese propósito. El ID2D1Factory se proporciona simplemente como un typedef y es un tipo incompleto.

Y ahora estoy atascado, porque no sé cómo liberar el puntero. He pasado un par de horas buscando formas de hacerlo en C.
¿Es siquiera posible?

El archivo de encabezado: d2d1.h

El código

Procedimiento de ventana simplificado:

switch (uMessage)
{
    case WM_CREATE:
    {
        HRESULT hResult = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory, NULL, &pFactory);
        if (FAILED(hResult))
        {
            return -1;
        }
        return 0;
    }
...
}

Obviamente, pFactory es de tipo ID2D1Factory* en el ámbito global. Por defecto, se inicializa a cero (si eso ayuda).

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución

    Para liberar un objeto COM en C, es necesario llamar manualmente a IUnknown_Release en el puntero del objeto.

    Aquí tienes un ejemplo:

    if (pFactory != NULL)
    {
        IUnknown_Release((IUnknown*)pFactory);
        pFactory = NULL;
    }
    

    Ten en cuenta que primero hacemos una conversión de tipo del puntero ID2D1Factory a IUnknown* y luego llamamos al método IUnknown_Release en él.

    Esto liberará correctamente el objeto COM y liberará los recursos asociados.

    Recuerda siempre liberar cualquier objeto COM que crees, para evitar pérdidas de memoria y otros problemas.

    Además, asegúrate de verificar los punteros NULL antes de liberarlos, como se muestra en el ejemplo anterior.

Comments are closed.