Re: Про двойной перехват исключений в DLL (оформление кода)
От: PM  
Дата: 17.11.20 07:34
Оценка: 6 (1) +2
Здравствуйте, acDev, Вы писали:


...

D>В этом варианте на каждую экспортную функцию нужно создавать ещё одну дополнительную функцию, т.к. нельзя в одной функции обрабатывать два разных типа исключений.

D>И уж как то совсем напряжно становится от мысли о дублировании 20 раз этого кода.

D>Примечание: Внутри set_exception_info планируется заюзать StackWalker (поэтому то и юзается __except).


Это какая-то древня библиотека с codeproject для печати stacktrace? Если я ничего не путаю, в ней вроде были утечки памяти. Может стоит глянуть на что-то поновее, типа boost::backtrace, которую даже двигают в стандарт.

D>Но вот как то не очень прикольно сколько дублирующего кода писать.

D>Неужели только макросы помогут?

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

Начиная C++11 есть лямбды, для передачи блока кода в другую функцию, так что можно написать функцию которая будет обрабатывать исключения:
template<typename F>
int catch_cpp_exceptions(F&& f)
{
    try
    {
        return f();
    }
    catch (...)
    {
        g_dll.init_exception(std::exception_ptr());
        throw;
    }
}

template<typename F>
int catch_seh_exceptions(F&& f)
{
    __try
    {
        catch_cpp_exceptions(std::forward<F>(f));
    }
    __catch(...)
    {
        g.show_exception();
    }
    return -1;
}

int WINAPI DllFunc1(int arg1, int arg2)
{
    #pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
    return catch_seh_exceptions([&]{ g_dll.func1(arg1, arg2); });
}


D>DLL-ку переписываю на MSVC 2015.


Староват компилятор, но C+11 и частично 14 поддерживает. Можно попробовать версию поновее, Visual C++ 2019. Она совместима на уровне ABI с 2015-й, так что проблем с C++ runtime быть не должно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.