Wie kann ich bei der gleichzeitigen Implementierung mehrerer COM-Schnittstellen ein Upcast an IUnknown durchführen?
Angenommen, mein COM-Objekt implementiert zwei oder mehr COM-Schnittstellen:
class CMyClass : public IPersistFile, public IPersistStream {
};
Wenn ich QueryInterface () implementiere, muss ich in der Lage sein, einen IUnknown * -Zeiger zurückzugeben. Da beide Basisschnittstellen von IUnknown abgeleitet sind, kann ich nicht implizit upcasten - ein solcher Upcast wäre mehrdeutig. Um explizit zu upcasten, muss ich eine der beiden Möglichkeiten nutzen:
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IPersistFile*>( this );
static_cast<IPersistFile*>( this )->AddRef();
return S_OK;
}
oder
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IPersistStream*>( this );
static_cast<IPersistStream*>( this )->AddRef();
return S_OK;
}
Es sieht so aus, als ob die einzige Anforderung darin besteht, dass jedes Mal, wenn QI () für ein Objekt aufgerufen wird, derselbe Zeiger zurückgegeben wird. Diese Anforderung erfülle ich, wenn ich einen der Casts auswähle und mich einfach daran halte.
Welchen Upcast soll ich wählen und warum?