winapi — Что происходит с исключениями C ++, пересекающими границы COM-методов?

В COM-условия ошибки расширений оболочки Windows Explorer выражаются с помощью HRESULT возвращаемые значения возвращается из методов интерфейса COM.

Но если внутри тела метода интерфейса COM (или внутри метода некоторого объекта C ++, вызываемого прямо или косвенно в методе COM), исключение C ++ (например, std::runtime_error, std::bad_alloc, std::invalid_argumentи т.д.) выбрасывается, что именно происходит?

Это просто неопределенное поведение?

Или это C ++ исключение как-то переоборудованный к Win32 структурированное исключение (SEH) ?
Если да, то какова механика процесса конверсии?

2

Решение

Разрешение исключений для пересечения границы COM Verboten и поведение не определено. Что произойдет, зависит от используемого вами компилятора C ++. Если вы используете MSVC ++, то да, C ++ исключений в дополнение к SEH. MinGW популярен для GCC, это не так.

Что делает это технически для клиентской программы возможно поймать исключение. Например, .NET CLR превращает неуправляемое исключение в управляемое исключение SEHException. Это, однако, исключительно по диагностическим причинам, позволяя программе завершать работу контролируемым образом с приличным сообщением об ошибке и трассировкой стека. На самом деле ловля исключения вряд ли приведет к хорошему концу. Вы по определению не можете обработать исключение, у вас нет надежды на восстановление состояния COM-сервера. Исключение, конечно, обошло код на COM-сервере, который обычно должен выполняться. Утечка памяти была бы типичным результатом. Блокировка, которая не была снята, — хороший способ повредить программу без диагноза. Повторные исключения возможны, если вы просто продолжаете пытаться использовать сервер. Разумным подходом является только отключение программы.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]