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::InterfaceSupportsErrorInfo
S_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 InterfaceSupportsErrorInfo
S_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.
"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? –
@FelixDombek Ich stimme zu. Ich habe den Beitrag bearbeitet, um den redundanten 'QueryInterface'-Aufruf zu entfernen. –