2015-04-23 4 views
5

Mein COM-Server, der in Visual C++ implementiert wird, verwendet eine Tonne anderer C++ - Code. Dieser andere C++ Code umschließt manchmal Code in __try - __except und übersetzt strukturierte Ausnahmen in benutzerdefinierten C++ - Ausnahmen. Dieser Teil kann ich nicht ändern.Wie stelle ich über COM eine Ausnahme bereit, die mit der strukturierten Ausnahmenbehandlung abgefangen wird?

Keine Methode meines COM-Servers sollte diese Ausnahmen durch die COM-Grenze übertragen, so dass es fangen und übersetzen sie in HRESULT s. Diese benutzerdefinierten C++ - Ausnahmen enthalten den ursprünglichen Fehlercode, der während der Übersetzung erhalten wurde - so etwas wie EXCEPTION_ACCESS_VIOLATION. Die Frage ist, wie ich einen passenden HRESULT Wert erstellen, so dass der Client so viele Informationen wie möglich darüber hat, was passiert ist (und vielleicht beschließen, den Server (und sich selbst im Falle von inproc) neu zu starten, nachdem er eine Zugriffsverletzung gesehen hat).

Angenommen es EXCEPTION_ACCESS_VIOLATION war, die in WinBase.h

#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION 

definiert ist und letztere in WinNT.h

#define STATUS_ACCESS_VIOLATION ((DWORD)0xC0000005L) 

I definiert ist HRESULT_FROM_WIN32() verwenden könnte diesen Code in HRESULT unter der Annahme zu übersetzen, die es war a Win32 Fehler an erster Stelle.

Benutze ich HRESULT_FROM_WIN32() hier oder verwende ich eine andere Möglichkeit, um die Übersetzung zu machen?

+0

Vielleicht kann die '' IErrorInfo''-Infrastruktur hier nützlich sein. '_com_error'' enthält einen Zeiger darauf. Auf der Angerufenen Seite, denke ich, erinnere ich mich, dass es etwas wie SetErrorInfo gab ... Ich habe damals ATL benutzt ... * hust * War es vor 10 Jahren? – BitTickler

+0

@ user2225104 Auch mit 'IErrorInfo' bin ich verantwortlich für die Erstellung eines' HRESULT' Wertes. – sharptooth

+0

0xC0000005 ist bereits ein gültiger HRESULT-Code, der einen Fehler anzeigt, kein Grund, ihn zu ändern. Verbirg etwas nicht so ekelhaft. –

Antwort

4

Sie sollen HRESULT Code zurückgeben, wo Sie den entsprechenden Code wählen, um den Status der Operation anzuzeigen. Es muss kein Fehlercode sein, aber Sie möchten normalerweise etwas zeigen, das FAILED(...) Makro erfüllt, z. E_FAIL oder DISP_E_EXCEPTION oder HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION).

Es ist sehr unwahrscheinlich, dass Anrufer mit spezifischen Ausnahme-bezogene HRESULT vergleichen, so dass spezifische Fehlercode eher für die Diagnose sinnvoll ist. Wenn Sie die Behandlung der Ausnahme vor dem Beenden der COM-Methode abgeschlossen haben, müssen Sie auch keinen spezifischen Code HRESULT zurückgeben, da keine zusätzlichen Aktionen erforderlich oder erforderlich sind.

Um zusätzliche Informationen bereitzustellen, ist es möglich, ISupportErrorInfo, IErrorInfo and friends zu verwenden. Anrufer können die Freitextbeschreibung und viele beliebte Umgebungen automatisch abrufen, so dass zum Beispiel der .NET-Anrufer diese zusätzliche Information über die Ausnahmebedingungsnachricht anstelle der Standardnachricht erhält, die aus dem Code HRESULT generiert wird.

ATL bietet AtlReportErrorSetErrorInfo API zu setzen, das HRESULT Code schlägt auch auf die Generierung von:

... Wenn hRes Null ist, dann werden die ersten vier Versionen von AtlReportError Rückkehr DISP_E_EXCEPTION. Die letzten beiden Versionen geben das Ergebnis des Makros MAKE_HRESULT(1, FACILITY_ITF, nID) zurück.

+0

Ich denke, das OP ist unsicher, ob das HRESULT, das über die Schnittstelle weitergegeben wird, die Ursache darstellen sollte. Vielleicht könnte man betonen, dass es im Allgemeinen nicht notwendig ist, diese spezifische Information über Schnittstellengrenzen hinaus zu tragen. In den ersten beiden Absätzen wird dies bereits erwähnt, aber es kann helfen, dies explizit zu formulieren. – IInspectable

+1

@IInspectable Die Ursache kann für den Aufrufer von großem Interesse sein - wenn es eine strukturierte Ausnahme gab, könnte der Server Toast erhalten und der Client den Server besser neu starten (und sich selbst, wenn es sich um einen In-Process-Server handelte). – sharptooth

+0

@Intspectable: Es gibt keine Unsicherheit über das Übergeben von Ausnahmen über Grenzen hinweg. Es geht vielmehr darum, was mit COM-Strategien standardmäßig zurückgegeben werden kann/soll. COM ist jedoch nur dazu verpflichtet, die Ausnahmen zu behandeln und HRESULT-Codes zurückzugeben, so dass Clients/Server serverspezifischen Code definieren, um einen schwerwiegenden Fehler anzuzeigen. –

Verwandte Themen