Podczas implementacji kilku interfejsów COM na raz, jak mogę przekazać do IUnknown?
Załóżmy, że mój obiekt COM implementuje dwa lub więcej interfejsów COM:
class CMyClass : public IPersistFile, public IPersistStream {
};
podczas implementacji QueryInterface () muszę mieć możliwość zwrócenia wskaźnika IUnknown *. Ponieważ oba interfejsy bazowe wywodzą się z IUnknown, nie mogę tego ukryć w sposób dorozumiany - takie zmiany byłyby niejednoznaczne. Aby wyraźnie wyrazić zgodę, muszę użyć jednego z dwóch sposobów:
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IPersistFile*>( this );
static_cast<IPersistFile*>( this )->AddRef();
return S_OK;
}
lub
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IPersistStream*>( this );
static_cast<IPersistStream*>( this )->AddRef();
return S_OK;
}
Wygląda na to, że jedynym wymaganiem jest to, że ilekroć QI () jest wywoływane na obiekcie, zwraca ten sam wskaźnik za każdym razem i spełniam ten warunek, jeśli wybiorę dowolny z rzutów i po prostu go trzymam.
Jaki powinienem wybrać i dlaczego?