2008-10-06 4 views
10

Was bedeutet die Schnittstelle ISupportErrorInfo? Ich bin etwas verloren, um es zu verstehen. Von MSDN:Implementierung von ISupportErrorInfo - was bedeutet das?

Diese Schnittstelle stellt sicher, dass Fehler Informationen, um die Call-Kette richtig propagiert werden können. Automation Objekte, die die Fehlerbehandlung verwenden Schnittstellen müssen ISupportErrorInfo implementieren.

Diese Methode gibt an, ob eine Schnittstelle die IErrorInfo-Schnittstelle unterstützt.

HRESULT InterfaceSupportsErrorInfo(
    REFIID riid 
); 

Was es S_OK in InterfaceSupportsErrorInfo zurückzukehren bedeutet? Soll S_OK für alle Schnittstellen zurückgegeben werden? Nur etwas?

Antwort

17

Mein Verständnis davon (basierend auf einigen verwandten Seiten MSDN) ist, dass ISupportErrorInfo durch die Implementierung, geben Sie an, dass eine oder mehr Schnittstellen auf Ihrer Klasse Fehlerinformationen liefern SetErrorInfo durch den Aufruf, im Gegensatz zu nur einen Fehler HRESULT zurück. nur für die Schnittstellen auf Ihrer Klasse

Zu diesem Zweck sollte die Implementierung von ISuportErrorInfo::InterfaceSupportsErrorInfoS_OK zurück, die SetErrorInfo tatsächlich nutzen Fehlerinformationen an den Aufrufer zurückzukehren, und nur diese Schnittstellen.

Angenommen, Sie haben eine Klasse, die eine Schnittstelle implementiert, die Sie geschrieben haben IFoo, die eine DoSomething Methode hat. Wenn jemand anderes eine Instanz der Klasse erstellt und ruft IFoo::DoSomething sollen sie Folgendes tun, wenn DoSomething einen Fehler zurückgibt HRESULT (aus verschiedenen MSDN-Seiten zu paraphrasieren, aber ich begann von hier: http://msdn.microsoft.com/en-us/library/ms221510.aspx):

  • Anruf QueryInterface auf dem IFoo Zeiger die ISupportErrorInfo Schnittstelle für das Objekt zu erhalten, die IFoo

  • Wenn das aufgerufene Objekt ISupportErrorInfo, nicht implementiert implementiert dann wird der Anruferhat, um den Fehler basierend auf dem HRESULT Wert zu behandeln, oder übergeben Sie den Aufruf-Stack.

  • Wenn das aufgerufene Objekt ISupportErrorInfo tut implementieren, dann sollte der Anrufer ISupportErrorInfo::InterfaceSupportsErrorInfo nennt, in einem REFIID für die Schnittstelle vorbei, die den Fehler zurückgegeben. In diesem Fall hat die DoSomething-Methode der Schnittstelle IFoo einen Fehler zurückgegeben, sodass Sie REFIID_IFoo (vorausgesetzt, es ist definiert) an InterfaceSupportsErrorInfo übergeben haben.

  • Wenn InterfaceSupportsErrorInfo kehrt S_OK, dann der Anrufer an dieser Stelle weiß, dass es Ausführlichere Informationen über den Fehler durch den Aufruf GetErrorInfo abrufen können.Wenn InterfaceSupportsErrorInfoS_FALSE zurückgibt, kann der Aufrufer annehmen, dass die aufgerufene Schnittstelle keine detaillierten Fehlerinformationen liefert, und muss sich auf das zurückgegebene HRESULT verlassen, um herauszufinden, was passiert ist.

Der Grund für diese etwas verwirrend/gewundenen Fehlerbehandlungs API scheint für Flexibilität (so weit ich, als ich sowieso sagen, kann diese ist COM schließlich.) Zu sein. Mit diesem Design kann eine Klasse mehrere Schnittstellen unterstützen, aber nicht jede Schnittstelle muss SetErrorInfo verwenden, um Fehlerinformationen aus ihren Methoden zurückzugeben. Sie können bestimmte, ausgewählte Schnittstellen in Ihrer Klasse haben, die detaillierte Fehlerinformationen über SetErrorInfo zurückgeben, während andere Schnittstellen weiterhin normale HRESULT s verwenden können, um Fehler anzuzeigen.

Zusammenfassend ist die ISupportErrorInfo Schnittstelle ist eine Möglichkeit, die Telefonvorwahl zu informieren, dass mindestens eine der Schnittstellen Ihre Klasse implementiert detaillierte Fehlerinformationen zurückgeben kann, und die InterfaceSupportsErrorInfo Methode teilt den Anrufer, ob eine bestimmte Schnittstelle eine dieser Schnittstellen ist . Wenn dies der Fall ist, kann der Aufrufer die detaillierten Fehlerinformationen abrufen, indem er GetErrorInfo aufruft.

+0

"Wenn das aufgerufene Objekt ISupportErrorInfo implementiert, dann sollte der Aufrufer QueryInterface für ein ISupportErrorInfo" Dies ist wahrscheinlich ein Fehler, weil der Anrufer nur DID, die zuvor aufrufen, um festzustellen, ob diese Schnittstelle überhaupt unterstützt wird? Sollte der Aufrufer dann 'ISupportErrorInfo :: InterfaceSupportsErrorInfo' nicht direkt aufrufen, ohne QI ein zweites Mal aufrufen zu müssen? –

+0

@FelixDombek Ich stimme zu. Ich habe den Beitrag bearbeitet, um den redundanten 'QueryInterface'-Aufruf zu entfernen. –