Получение разумной информации из исключений CLR-to-SEH в проекте C ++ в смешанном режиме - PullRequest
4 голосов
/ 05 ноября 2011

Смешанный режим C ++ проекта. Собственный код вызывает управляемый код. Управляемый код может вызвать исключение. Я могу поймать указанное исключение в собственном режиме, используя векторный обработчик исключений; Я вижу его PEXCEPTION_POINTERS. Код 0xE0434F4D, означающий, что это исключение CLR, есть.

Вопрос: есть ли способ получить какую-либо разумную информацию (класс исключения, сообщение, трассировка стека и т. Д.) Из данных оператора? В ExceptionInformation есть один параметр, и он выглядит как указатель на что-то ...

Ответы [ 2 ]

1 голос
/ 07 ноября 2012

На этот вопрос есть аналогичный ответ:
Перехват исключения CLR с помощью неуправляемого кода

Это было решено следующим образом:

#import <mscorlib.tlb> raw_interfaces_only no_smart_pointers named_guids no_implementation

ATL::CComPtr< IErrorInfo > spErrorInfo;
ATL::CComPtr< mscorlib::_Exception > spCLRException;
ATL::CComPtr< mscorlib::_Exception > spCLRInnerException;

ATL::CComBSTR bstrCLRStackTrace;
ATL::CComBSTR bstrCLRMessage;

GetErrorInfo(0, &spErrorInfo)
spErrorInfo.QueryInterface(&spCLRException)
spCLRException->get_InnerException(&spCLRInnerException)
spCLRInnerException->get_StackTrace(&bstrCLRStackTrace)
spCLRInnerException->get_Message(&bstrCLRMessage)
1 голос
/ 30 мая 2012

Нет, уже слишком поздно.Все, что вы получили, это код исключения.Вы можете получить что-то в ExceptionInformation, если исходное управляемое исключение было вызвано ошибкой процессора.Как NullReference или AccessViolation.Это не поможет, так как вы больше не знаете оригинальное исключение SEH.Использование COM дает вам лучшую ловушку мыши, CLR реализует IErrorInfo.Но управляемый код, который вы пытаетесь запустить, вероятно, не [ComVisible].Вызов кода через управляемую заглушку, которая перехватывает исключение, может быть лучше.

...