Здравствуйте, 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 быть не должно.