Il mio server COM implementato in Visual C++ utilizza una tonnellata di altro codice C++. L'altro codice C++ a volte esegue il wrapping del codice in __try
- __except
e converte le eccezioni strutturate in eccezioni C++ personalizzate. Questa parte non posso cambiare.Come esporre tramite COM un'eccezione rilevata con la gestione delle eccezioni strutturate?
Nessun metodo del mio server COM deve consentire la propagazione di tali eccezioni attraverso il limite COM in modo che debba intercettarle e convertirle in HRESULT
s. Quelle eccezioni C++ personalizzate contengono il codice di errore originale che è stato ottenuto durante la traduzione - è qualcosa come EXCEPTION_ACCESS_VIOLATION
. La domanda è come modifico un valore appropriato HRESULT
in modo che il client abbia quante più informazioni possibili su quanto accaduto (e forse decide di riavviare il server (e se stesso in caso di inproc) dopo aver visto una violazione di accesso).
Supponiamo che sia EXCEPTION_ACCESS_VIOLATION
che è definito in WinBase.h
#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION
e quest'ultimo è definita WinNT.h
#define STATUS_ACCESS_VIOLATION ((DWORD)0xC0000005L)
ho potuto utilizzare HRESULT_FROM_WIN32()
per tradurre il codice in HRESULT
supponendo che era un Errore Win32 in primo luogo.
Devo utilizzare HRESULT_FROM_WIN32()
qui o devo utilizzare in altro modo per eseguire la traduzione?
Forse l'utilizzo dell'infrastruttura '' IErrorInfo'' può tornare utile qui. '' _com_error'' contiene un puntatore. Dal lato del callee, penso di ricordare che c'era qualcosa come SetErrorInfo ... Ho usato ATL allora ... * cough * Era 10 anni fa? – BitTickler
@ user2225104 Anche con 'IErrorInfo' sono responsabile della creazione di un valore' HRESULT'. – sharptooth
0xC0000005 è già un codice HRESULT valido che indica un errore, nessun motivo per modificarlo. Non nascondere qualcosa di così brutto. –