- commit missed files - new crash reporter support + fixes for "press any key..." function

This commit is contained in:
Dmytro Bogovych 2018-06-08 11:43:03 +03:00
parent b6a8312c7b
commit b9acc5a622
3 changed files with 236 additions and 0 deletions

View File

@ -0,0 +1,169 @@
#include "HL_CrashRpt.h"
#include "HL_String.h"
// Define this if CrashRpt has to be deployed as .dll
// #define CRASHRPT_DYNAMIC
// --- CrashReporer ---
#if defined(TARGET_WIN)
#include "CrashRpt.h"
BOOL WINAPI CrashReporter::Callback(LPVOID arg)
{
return TRUE;
}
typedef int(__stdcall *CrInstallProc)(__in PCR_INSTALL_INFOW pInfo);
static CrInstallProc CrInstall = nullptr;
typedef int(__stdcall *CrUninstallProc)();
static CrUninstallProc CrUninstall = nullptr;
typedef int(__stdcall *CrInstallIntoCurrentThreadProc)(DWORD dwFlags);
static CrInstallIntoCurrentThreadProc CrInstallIntoCurrentThread = nullptr;
typedef int(__stdcall *CrUninstallFromCurrentThreadProc)();
static CrUninstallFromCurrentThreadProc CrUninstallFromCurrentThread = nullptr;
typedef int(__stdcall *CrGetLastErrorMsgProc)(LPWSTR buffer, UINT size);
static CrGetLastErrorMsgProc CrGetLastErrorMsg = nullptr;
static HMODULE CrLibraryHandle = NULL;
#endif
void CrashReporter::init(const std::string& appname, const std::string& version, const std::string& url)
{
#if defined(TARGET_WIN)
#if defined(CRASHRPT_DYNAMIC)
// Check if DLL functions are here
if (CrLibraryHandle)
return; // Library is loaded already - so initialized already
CrLibraryHandle = ::LoadLibrary(TEXT("crashrpt.dll"));
if (!CrLibraryHandle)
return; // No logging here - initialization happens on very first stages, no chance to log anything
CrInstall = (CrInstallProc)::GetProcAddress(CrLibraryHandle, "crInstallW");
CrUninstall = (CrUninstallProc)::GetProcAddress(CrLibraryHandle, "crUninstall");
CrInstallIntoCurrentThread = (CrInstallIntoCurrentThreadProc)::GetProcAddress(CrLibraryHandle, "crInstallToCurrentThread2");
CrUninstallFromCurrentThread = (CrUninstallFromCurrentThreadProc)::GetProcAddress(CrLibraryHandle, "crUninstallFromCurrentThread");
CrGetLastErrorMsg = (CrGetLastErrorMsgProc)::GetProcAddress(CrLibraryHandle, "crGetLastErrorMsgW");
#else
CrInstall = &crInstallW;
CrUninstall = &crUninstall;
CrInstallIntoCurrentThread = &crInstallToCurrentThread2;
CrUninstallFromCurrentThread = &crUninstallFromCurrentThread;
CrGetLastErrorMsg = &crGetLastErrorMsgW;
#endif
if (!isLoaded())
return;
CR_INSTALL_INFO info;
memset(&info, 0, sizeof(CR_INSTALL_INFO));
info.cb = sizeof(CR_INSTALL_INFO);
struct
{
std::wstring appname, version, url;
} unicode;
unicode.appname = StringHelper::makeTstring(appname),
unicode.version = StringHelper::makeTstring(version),
unicode.url = StringHelper::makeTstring(url);
if (unicode.appname.empty())
unicode.appname = L"App";
if (unicode.url.empty())
unicode.url = L"https://voipobjects.com/crashrpt/crashrpt.php";
if (unicode.version.empty())
unicode.version = L"General version";
info.pszAppName = unicode.appname.c_str();
info.pszAppVersion = unicode.version.c_str();
info.pszEmailSubject = TEXT("Crash report");
//info.pszEmailTo = L"amegyeri@minerva-soft.com";
//info.pszUrl = L"http://ftp.minerva-soft.com/crashlog/crashrpt.php";
//info.pszUrl = L"http://sip.crypttalk.com/crashlog/crashrpt.php";
info.pszUrl = unicode.url.c_str();
info.pfnCrashCallback = Callback;
info.uPriorities[CR_HTTP] = 1;
info.uPriorities[CR_SMTP] = CR_NEGATIVE_PRIORITY;
info.uPriorities[CR_SMAPI] = CR_NEGATIVE_PRIORITY;
info.dwFlags = 0;
info.pszCrashSenderPath = TEXT(".");
int nResult = CrInstall(&info);
if (nResult)
{
wchar_t errorMsg[512] = L"";
CrGetLastErrorMsg(errorMsg, 512);
OutputDebugStringW(errorMsg);
//LogCritical("Core", << "Failed to install CrashReporter with code " << nResult << " and message " << errorMsg);
}
#endif
}
void CrashReporter::free()
{
#if defined(TARGET_WIN)
if (isLoaded())
{
CrUninstall();
CrInstall = nullptr;
CrUninstall = nullptr;
CrInstallIntoCurrentThread = nullptr;
CrUninstallFromCurrentThread = nullptr;
CrGetLastErrorMsg = nullptr;
#if defined(CRASHRPT_DYNAMIC)
::FreeLibrary(CrLibraryHandle); CrLibraryHandle = NULL;
#endif
}
#endif
}
bool CrashReporter::isLoaded()
{
#if defined(TARGET_WIN)
return !(!CrInstall || !CrUninstall || !CrGetLastErrorMsg ||
!CrInstallIntoCurrentThread || !CrUninstallFromCurrentThread);
#else
return false;
#endif
}
void CrashReporter::initThread()
{
#if defined(TARGET_WIN)
if (isLoaded())
CrInstallIntoCurrentThread(0);
#endif
}
void CrashReporter::freeThread()
{
#if defined(TARGET_WIN)
if (isLoaded())
CrUninstallFromCurrentThread();
#endif
}
CrashReporterThreadPoint::CrashReporterThreadPoint()
{
CrashReporter::initThread();
}
CrashReporterThreadPoint::~CrashReporterThreadPoint()
{
CrashReporter::freeThread();
}
CrashReporterGuard::CrashReporterGuard()
{
CrashReporter::init("generic");
}
CrashReporterGuard::~CrashReporterGuard()
{
CrashReporter::free();
}

View File

@ -0,0 +1,64 @@
#ifndef __CRASH_RPT_H
#define __CRASH_RPT_H
#include <string>
#if defined(TARGET_WIN)
# include <WinSock2.h>
# include <Windows.h>
#endif
// Helper class to translate SEH exceptions to C++ - sometimes it is needed
#if defined(TARGET_WIN)
class SE_Exception
{
private:
unsigned int nSE;
public:
SE_Exception() {}
SE_Exception(unsigned int n) : nSE(n) {}
~SE_Exception() {}
unsigned int getSeNumber() { return nSE; }
};
extern void SEHToCpp(unsigned int, EXCEPTION_POINTERS*);
// Although better way is to have _set_se_translator set - in our case we do not call it.
// The cause is usage of CrashRpt libraries - it gives better control on exception reporting.
# define SET_SEH_TO_CPP
//_set_se_translator(&SEHToCpp)
#else
# define SET_SEH_TO_CPP
#endif
class CrashReporter
{
public:
static void init(const std::string& appname, const std::string& version = "", const std::string& url = "");
static void free();
static void initThread();
static void freeThread();
static bool isLoaded();
#ifdef TARGET_WIN
static BOOL WINAPI Callback(LPVOID /*lpvState*/);
#endif
};
// RAII class to notify crash reporter about thread start/stop
class CrashReporterThreadPoint
{
public:
CrashReporterThreadPoint();
~CrashReporterThreadPoint();
};
class CrashReporterGuard
{
public:
CrashReporterGuard();
~CrashReporterGuard();
};
#endif

View File

@ -48,4 +48,7 @@ extern int _kbhit();
#endif #endif
#if defined(TARGET_WIN)
# include <conio.h>
#endif
#endif #endif