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).
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:
Ten en cuenta que primero hacemos una conversión de tipo del puntero
ID2D1Factory
aIUnknown*
y luego llamamos al métodoIUnknown_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.