2018-07-21 15:40:16 -07:00
|
|
|
#include "mainwindow.h"
|
2018-11-25 21:40:19 -05:00
|
|
|
#include "misc.h"
|
2018-09-01 15:31:18 -04:00
|
|
|
#include <sstream>
|
2018-07-21 15:40:16 -07:00
|
|
|
#include <QApplication>
|
|
|
|
|
2018-11-25 16:45:43 -05: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-25 19:06:38 -05:00
|
|
|
thread_local std::wstring lastError = L"Unknown error";
|
|
|
|
|
|
|
|
LONG WINAPI ExceptionLogger(EXCEPTION_POINTERS* exception)
|
2018-11-25 16:45:43 -05:00
|
|
|
{
|
|
|
|
MEMORY_BASIC_INFORMATION info = {};
|
|
|
|
VirtualQuery(exception->ExceptionRecord->ExceptionAddress, &info, sizeof(info));
|
|
|
|
wchar_t moduleName[MAX_PATH] = {};
|
|
|
|
GetModuleFileNameW((HMODULE)info.AllocationBase, moduleName, MAX_PATH);
|
|
|
|
|
|
|
|
std::wstringstream errorMsg;
|
|
|
|
errorMsg << std::uppercase << std::hex <<
|
|
|
|
L"Error code: " << exception->ExceptionRecord->ExceptionCode << std::endl <<
|
|
|
|
L"Error address: " << (uint64_t)exception->ExceptionRecord->ExceptionAddress << std::endl <<
|
|
|
|
L"Error in module: " << moduleName << std::endl;
|
|
|
|
|
|
|
|
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-25 19:06:38 -05:00
|
|
|
lastError = errorMsg.str();
|
2018-11-25 16:45:43 -05:00
|
|
|
return EXCEPTION_CONTINUE_SEARCH;
|
|
|
|
}
|
2018-11-25 19:06:38 -05:00
|
|
|
|
|
|
|
void Terminate()
|
|
|
|
{
|
|
|
|
MessageBoxW(NULL, lastError.c_str(), L"Textractor ERROR", MB_ICONERROR);
|
|
|
|
std::abort();
|
|
|
|
}
|
|
|
|
|
|
|
|
thread_local auto _ = [] { return std::set_terminate(Terminate); }();
|
2018-11-25 16:45:43 -05:00
|
|
|
}
|
|
|
|
|
2018-07-21 15:40:16 -07:00
|
|
|
int main(int argc, char *argv[])
|
|
|
|
{
|
2018-11-25 19:06:38 -05:00
|
|
|
AddVectoredExceptionHandler(FALSE, ExceptionLogger);
|
|
|
|
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)Terminate);
|
2018-11-25 21:40:19 -05:00
|
|
|
QString exe = GetFullModuleName(GetCurrentProcessId());
|
|
|
|
SetCurrentDirectoryW(exe.left(exe.lastIndexOf("\\")).toStdWString().c_str());
|
2018-08-22 12:44:16 -04:00
|
|
|
QApplication a(argc, argv);
|
|
|
|
MainWindow w;
|
|
|
|
w.show();
|
2018-08-22 12:44:53 -04:00
|
|
|
return a.exec();
|
2018-07-21 15:40:16 -07:00
|
|
|
}
|