Если в DLL используется структурированная система обработки исключений Win32, любые исключения, выданные DLL, будут преобразованы в OutOfMemoryException
, AccessViolationException
, NullReferenceException
(редко) или SEHException
.
RuntimeWrappedException
используется только тогда, когда managed C ++ генерирует объект, не являющийся Exception
. Он не используется для неуправляемых библиотек DLL. Если у вас была управляемая C ++ DLL, которая выполняла throw 1
, то вы могли бы поймать RuntimeWrappedException
.
SEHException
действует как универсальное средство для не отображаемых типов исключений SEH из неуправляемых DLL. Это может включать любой класс C ++ или пример throw 1
. AFAIK, нет способа вытащить информацию об исключениях, специфичных для C ++, из SEHException
, хотя я уверен, что это можно взломать, если вы попытаетесь достаточно усердно.
Обратите внимание, что есть несколько библиотек DLL, которые не используют систему обработки структурированных исключений Win32. В частности, библиотеки Cygwin. В этом случае любое исключение C ++ может привести к сбою процесса или, по крайней мере, вашего потока. Естественно, все библиотеки DLL Windows (включая определяющую CopyFileEx
) используют структурированную обработку исключений Win32, как и любые неуправляемые библиотеки DLL, созданные компилятором Microsoft C ++.
Также обратите внимание, что Win32 API (включая CopyFileEx
) обычно не сообщает об ошибках, используя структурированные исключения Win32; они сообщают о них через GetLastError
. Единственный способ заставить большинство функций Win32 выдать структурированное исключение Win32 - передать ему недопустимые аргументы (например, попросить записать его в середине ntdll.dll
).