Allgemeine Fragen zu COM

Hallo,

ich bin ein Neuling in Sachen COM und habe folgende Fragen:

Woher weiss ich welche REFIID an einen QueryInterface-Aufruf zu übergeben ist, um einen bestimmten Schnittstellenzeiger zu erhalten?

Warum sind zwei COM-Objekte genau dann identisch, wenn ihre IUnkown-Schnittstellenzeiger identisch sind?

Wenn eine COM-Klasse CMyComImpl die Schnittstelle IMyInterface implementiert, dann könnte die Methode QueryInterface wie folgt aussehen:

CMyComImpl::QueryInterface(REFIID iid, void\*\* ppv)
{
 if(ppv == (void\*\*) 0)
 return E\_INVALIDARG;
 
 if(IsEqualIID(iid, IID\_Unknown))
 \*ppv = static\_cast (this);
 else if(IsEqualIID(iid, IID\_IMyInterface))
 \*ppv = static\_cast (this);
 else
 {
 \*ppv = (IUnknown\*) 0;
 return E\_NOINTERFACE;
 }
 
 (reinterpret\_cast (\*ppv))-\>AddRef();
 return S\_OK;
}

Können die Schnittstellenzeiger zweier COM-Onjekte für IMyInterface nicht auch identisch sein?
Oder hat man sich auf IUnknown „geeinigt“ weil jede COM-Klasse dieses Interface unterstützen muss?

Vielen Dank für eine Antwort.
Gruß,
Tom