В COM-условия ошибки расширений оболочки Windows Explorer выражаются с помощью HRESULT
возвращаемые значения возвращается из методов интерфейса COM.
Но если внутри тела метода интерфейса COM (или внутри метода некоторого объекта C ++, вызываемого прямо или косвенно в методе COM), исключение C ++ (например, std::runtime_error
, std::bad_alloc
, std::invalid_argument
и т.д.) выбрасывается, что именно происходит?
Это просто неопределенное поведение?
Или это C ++ исключение как-то переоборудованный к Win32 структурированное исключение (SEH) ?
Если да, то какова механика процесса конверсии?
Разрешение исключений для пересечения границы COM Verboten и поведение не определено. Что произойдет, зависит от используемого вами компилятора C ++. Если вы используете MSVC ++, то да, C ++ исключений в дополнение к SEH. MinGW популярен для GCC, это не так.
Что делает это технически для клиентской программы возможно поймать исключение. Например, .NET CLR превращает неуправляемое исключение в управляемое исключение SEHException. Это, однако, исключительно по диагностическим причинам, позволяя программе завершать работу контролируемым образом с приличным сообщением об ошибке и трассировкой стека. На самом деле ловля исключения вряд ли приведет к хорошему концу. Вы по определению не можете обработать исключение, у вас нет надежды на восстановление состояния COM-сервера. Исключение, конечно, обошло код на COM-сервере, который обычно должен выполняться. Утечка памяти была бы типичным результатом. Блокировка, которая не была снята, — хороший способ повредить программу без диагноза. Повторные исключения возможны, если вы просто продолжаете пытаться использовать сервер. Разумным подходом является только отключение программы.
Других решений пока нет …