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?
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
@ user2225104 Auch mit 'IErrorInfo' bin ich verantwortlich für die Erstellung eines' HRESULT' Wertes. – sharptooth
0xC0000005 ist bereits ein gültiger HRESULT-Code, der einen Fehler anzeigt, kein Grund, ihn zu ändern. Verbirg etwas nicht so ekelhaft. –