Textractor_test/GUI/main.cpp

63 lines
2.0 KiB
C++
Raw Normal View History

2018-07-22 06:40:16 +08:00
#include "mainwindow.h"
#include "misc.h"
#include "host/util.h"
2018-09-02 03:31:18 +08:00
#include <sstream>
2018-07-22 06:40:16 +08:00
#include <QApplication>
#include <QDir>
2018-07-22 06:40:16 +08:00
namespace
{
char* GetCppExceptionInfo(EXCEPTION_POINTERS* exception)
{
// See https://blogs.msdn.microsoft.com/oldnewthing/20100730-00/?p=13273
// Not very reliable so use __try
__try { return ((char****)exception->ExceptionRecord->ExceptionInformation[2])[3][1][1] + 8; }
__except (EXCEPTION_EXECUTE_HANDLER) { return "Could not find"; }
}
2018-11-26 08:06:38 +08:00
thread_local std::wstring lastError = L"Unknown error";
__declspec(noreturn) void Terminate()
{
MessageBoxW(NULL, lastError.c_str(), L"Textractor ERROR", MB_ICONERROR);
std::abort();
}
2018-11-26 08:06:38 +08:00
LONG WINAPI ExceptionLogger(EXCEPTION_POINTERS* exception)
{
thread_local static auto terminateSetter = std::invoke(std::set_terminate, Terminate);
MEMORY_BASIC_INFORMATION info = {};
VirtualQuery(exception->ExceptionRecord->ExceptionAddress, &info, sizeof(info));
std::wstringstream errorMsg;
errorMsg << std::uppercase << std::hex <<
L"Error code: " << exception->ExceptionRecord->ExceptionCode << std::endl <<
L"Error address: " << exception->ExceptionRecord->ExceptionAddress << std::endl <<
L"Error in module: " << Util::GetModuleFileName((HMODULE)info.AllocationBase).value_or(L"Could not find") << std::endl <<
L"Additional info: " << info.AllocationBase << std::endl;
2018-11-28 10:29:09 +08:00
if (exception->ExceptionRecord->ExceptionCode == 0xE06D7363)
errorMsg << L"Additional info: " << GetCppExceptionInfo(exception) << std::endl;
for (int i = 0; i < exception->ExceptionRecord->NumberParameters; ++i)
errorMsg << L"Additional info: " << exception->ExceptionRecord->ExceptionInformation[i] << std::endl;
2018-11-26 08:06:38 +08:00
lastError = errorMsg.str();
return EXCEPTION_CONTINUE_SEARCH;
}
}
2018-07-22 06:40:16 +08:00
int main(int argc, char *argv[])
{
2018-11-26 08:06:38 +08:00
AddVectoredExceptionHandler(FALSE, ExceptionLogger);
SetUnhandledExceptionFilter([](auto) -> LONG { Terminate(); });
QDir::setCurrent(QFileInfo(S(Util::GetModuleFileName().value())).absolutePath());
2018-08-23 00:44:16 +08:00
QApplication a(argc, argv);
MainWindow w;
w.show();
2018-08-23 00:44:53 +08:00
return a.exec();
2018-07-22 06:40:16 +08:00
}