Studiando DirectX9 e 10 mi è capitato di dover imparare un po di COM, ma sinceramente ho ancora profondi dubbi su questa "piattaforma di programmazione".
Ho notato che molti oggetti (dato che derivano da IUnknown) hanno QueryInterface, Release e AddRef
Ora Release è chiaro, rilascia la memoria, AddRef aumenta il conteggio delle referenze (e quindi? cosa devo farci io con questo metodo? Il conteggio non lo porta in automatico?)
QueryInterface
Questo qui a quanto vedo permette di avere delle interfacce da determinati metodi, passandogli l'uuid e un puntatore a void*
4 Domande:
1) Perchè per alcune interfacce posso fare dev->CreateOggetto(Parametri,parametri);
e per altri invece sono costretto a usare QueryInterface? Non è la stessa cosa? (QueryInterface non può ricevere altri parametri, vero, ma perchè usare 2 sistemi)
E CoCreateInstance invece, a cosa serve?
2) Se ho 2 classi posso chiedere a entrambe lo stesso oggetto?
codice:
dev->QueryInterface(__uuidof(Classe),&ptr);
cls->QueryInterface(__uuidof(Classe),&ptr);
Funzionerà lo stesso o solo alcune classi possono cacciare determinati oggetti?
3) Se volessi effettuare un approccio molto simile...come devono essere implementate Release, QueryInterface e AddRef? e i guid? come li creo?
4) Perchè alcune funzioni chiedono dei puntatori e parametri inutilmente?
codice:
HRESULT CoInitialize(
LPVOID pvReserved
);
Dalla documentazione
pvReserved
[in] Reserved; must be NULL
Se è riservato e già sanno che è NULL, perchè chiedono questo parametro? E questo è solo un esempio, in D3D10 ci sono delle funzioni (tipo Apply(0) di ID3D10EFFECT) che nella documetnazione dice NotUsed, set 0
Perchè?