Mój serwer COM zaimplementowany w Visual C++ wykorzystuje mnóstwo innych kodów C++. Ten inny kod C++ czasami zawija kod w __try
- __except
i tłumaczy uporządkowane wyjątki na niestandardowe wyjątki C++. Tej części nie mogę zmienić.Jak wyświetlić przez COM wyjątek złapany z obsługą strukturalnych wyjątków?
Żadna metoda mojego serwera COM nie powinna zezwalać na te wyjątki propagowane przez granicę COM, więc musi przechwycić i przetłumaczyć je na HRESULT
s. Te niestandardowe wyjątki C++ zawierają oryginalny kod błędu, który został uzyskany podczas tłumaczenia - jest to coś w rodzaju EXCEPTION_ACCESS_VIOLATION
. Pytanie brzmi, jak utworzyć odpowiednią wartość, tak aby klient miał jak najwięcej informacji o tym, co się stało (i może zdecydować o ponownym uruchomieniu serwera (i sam w przypadku inproc) po zobaczeniu naruszenia zasad dostępu).
Załóżmy, że było EXCEPTION_ACCESS_VIOLATION
który jest zdefiniowany w WinBase.h
#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION
i która jest określona w WinNT.h
#define STATUS_ACCESS_VIOLATION ((DWORD)0xC0000005L)
można używać HRESULT_FROM_WIN32()
do przetłumaczenia tego kodu w HRESULT
przy założeniu, że jest to Win32 błąd w pierwszej kolejności.
Czy używam tutaj HRESULT_FROM_WIN32()
lub czy używam innego sposobu tłumaczenia?
Może przydać się tutaj infrastruktura '' IErrorInfo''. '' _com_error'' zawiera wskaźnik do niego. Po stronie odbiorcy, pamiętam, że było coś takiego jak SetErrorInfo ... Używałem wtedy ATL ... * kaszel * Czy to było 10 lat temu? – BitTickler
@ user2225104 Nawet z 'IErrorInfo' jestem odpowiedzialny za tworzenie wartości' HRESULT'. – sharptooth
0xC0000005 jest już prawidłowym kodem HRESULT, który wskazuje na błąd, brak powodu, aby go zmienić. Nie ukrywaj czegoś tak nieprzyjemnego. –