Anfragen eines Objekts für eine Schnittstelle

Wie bereits gesehen kann ein Objekt mehr als eine Schnittstelle implementieren. Das Objekt zum Dialogfeld für die gemeinsamen Elemente ist ein reales Beispiel dafür. Um die üblichen Verwendungen zu unterstützen, implementiert das Objekt die IFileOpenDialog-Schnittstelle. Diese Schnittstelle definiert grundlegende Methoden zum Anzeigen des Dialogfelds und zum Abrufen von Informationen zur ausgewählten Datei. Bei der komplexeren Verwendung jedoch implementiert das Objekt auch eine Schnittstelle mit dem Namen IFileDialogCustomize. Ein Programm kann mit dieser Schnittstelle die Darstellung und das Verhalten des Dialogfelds anpassen, indem es neue UI-Steuerelemente hinzufügt.

Beachten Sie, dass jede COM-Schnittstelle direkt oder indirekt von der IUnknown-Schnittstelle erben muss. Das folgende Diagramm zeigt die Vererbung des Objekts zum Dialogfeld der gemeinsamen Elemente an.

Das Diagramm zeigt die Schnittstellen an, die vom Objekt zum Dialogfeld der gemeinsamen Elemente genutzt werden.

Dem Diagramm ist zu entnehmen, dass der direkte Vorgänger von IFileOpenDialog die IFileDialog-Schnittstelle ist, die wiederum IModalWindow erbt. Wenn Sie die Vererbungskette von IFileOpenDialog zu IModalWindow nach oben verfolgen, definieren die Schnittstellen die zunehmend generalisierte Fensterfunktionalität. Schließlich erbt die IModalWindow-Schnittstelle IUnknown. Das Objekt zum Dialogfeld für die gemeinsamen Elemente implementiert auch IFileDialogCustomize, das in einer separaten Vererbungskette vorhanden ist.

Es sei der Fall gegeben, dass Sie über einen Zeiger zur IFileOpenDialog-Schnittstelle verfügen. Wie würden Sie einen Zeiger zur IFileDialogCustomize-Schnittstelle abrufen?

Das Diagramm stellt zwei Schnittstellenzeiger zu Schnittstellen im selben Objekt dar.

Das einfache Umwandeln des IFileOpenDialog-Zeigers in einen IFileDialogCustomize-Zeiger funktioniert nicht. Es gibt keine zuverlässige Möglichkeit, eine „Umwandlung“ über eine Vererbungshierarchie vorzunehmen ohne den Einsatz einer bestimmten Form von Laufzeittypinformationen (RTTI), die eine höchst sprachabhängige Funktion darstellen.

Der COM-Ansatz besteht darin, das Objekt zu bitten, Ihnen einen IFileDialogCustomize-Zeiger zur Verfügung zu stellen, wobei die erste Schnittstelle als eine Art Kanal in das Objekt verwendet werden soll. Dies wird über den Aufruf der IUnknown::QueryInterface-Methode aus dem ersten Schnittstellenzeiger durchgeführt. Sie können sich QueryInterface als eine sprachunabhängige Version des dynamic_cast-Schlüsselworts in C++ vorstellen.

Die QueryInterface-Methode weist die folgende Signatur auf:

HRESULT QueryInterface(REFIID riid, void **ppvObject);

Auf der Grundlage dessen, was Sie bereits über CoCreateInstance wissen, können Sie unter Umständen einschätzen, wie QueryInterface funktioniert.

  • Der riid-Parameter ist die GUID, die die Schnittstelle identifiziert, die Sie anfragen. Der Datentyp REFIID ist ein typedef für const GUID&. Beachten Sie, dass die Klassen-ID (CLSID) nicht erforderlich ist, da das Objekt bereits erstellt wurde. Nur die Schnittstellen-ID ist erforderlich.
  • Der ppvObject-Parameter erhält einen Zeiger zur Schnittstelle. Der Datentyp dieses Parameters ist void**. Dies ist aus dem gleichen Grund der Fall, weswegen CoCreateInstance diesen Datentyp verwendet: QueryInterface kann verwendet werden, um eine beliebige COM-Schnittstelle abzufragen. Daher kann der Parameter nicht stark typisiert sein.

So können Sie QueryInterface aufrufen, um einen IFileDialogCustomize-Zeiger zu erhalten:

hr = pFileOpen->QueryInterface(IID_IFileDialogCustomize, 
    reinterpret_cast<void**>(&pCustom));
if (SUCCEEDED(hr))
{
    // Use the interface. (Not shown.)
    // ...

    pCustom->Release();
}
else
{
    // Handle the error.
}

Überprüfen Sie wie üblich den HRESULT-Rückgabewert, falls die Methode fehlschlägt. Sofern die Methode erfolgreich ist, müssen Sie Release aufrufen, wenn die Verwendung des Zeigers abgeschlossen ist. Weitere Details hierzu sind im Abschnitt zur Verwaltung der Lebensdauer eines Objekts beschrieben.

Weiter

Speicherbelegung in COM

 

 

Anzeigen:
© 2014 Microsoft