C # DLL исключение не пойман в неуправляемом C ++ - PullRequest
0 голосов
/ 03 мая 2019

В рамках этого упражнения по ознакомлению с использованием C # DLL в неуправляемом C ++ через COM я пытаюсь понять, как работает обработка исключений.Я написал крошечную C # dll, которая просто содержит функцию, которая выдает исключение, и функцию C ++, которая вызывает эту функцию и пытается перехватить исключение.

Вот библиотека DLL, написанная на C # с использованием Visual Studio 2012:

namespace ExceptionThrowingLib
{
    public interface IExceptionThrower
    {
        void ThrowException();
    }

    public class ExceptionThrower : IExceptionThrower
    {
        public ExceptionThrower() { }
        public void ThrowException()
        {
            using (StreamWriter writer = new StreamWriter("c:/misc/exceptionthrower.txt", true))
            {
                writer.WriteLine("Exception generation request received at " + DateTime.Now.ToString());
            }
            throw new Exception("This is a requested exception.");
            using (StreamWriter writer = new StreamWriter("c:/misc/exceptionthrower.txt", true))
            {
                writer.WriteLine("This should never appear in the output file.");
            }
        }
    }
}

А вот функция, которая пытается ее использовать, написанная на C ++ с использованием Visual Studio 2008:

void HandleException()
{   
    IExceptionThrowerPtr pThrower(__uuidof(ExceptionThrower));
    try
    {
        pThrower->ThrowException();
        AfxMessageBox(_T("No exception caught."));
    }
    catch (...)
    {
        AfxMessageBox(_T("I caught an exception!"));
    }
}

Когда я вызываю эту функцию, появляется сообщение «Нет исключения поймано».

Я ожидал, что клиентская (C ++) сторона сможет перехватить объект _com_error и соответствующим образом обработать его, чтобы узнать, что произошло, но, похоже, ничего не перехватывается.Почему бы и нет?Я что-то не так делаю?

Спасибо.

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Использовали ли вы # import для генерации _com_ptr реализации?

Если это так, позаботьтесь о том, чтобы опустить директиву raw_interfaces_only , поскольку она подавляет создание функций-оболочек для обработки ошибок.

0 голосов
/ 04 мая 2019

Вы на самом деле ничего не делаете неправильно, но у вас неправильное понимание.

Код C ++ не перехватывает исключение, потому что в код C ++ не выдается исключение.Уровень CLR / взаимодействия в среде выполнения .NET перехватывает исключение перед его передачей.Весь хороший код COM никогда не выдает исключение из метода или свойства COM, но возвращает код ошибки.

Что такое код возврата (HRESULT) из ThrowException ().Это должен быть не S_OK, а, возможно, E_FAIL или какая-либо другая описательная ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...