- commit missed files - new crash reporter support + fixes for "press any key..." function
This commit is contained in:
parent
b6a8312c7b
commit
b9acc5a622
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
@ -48,4 +48,7 @@ extern int _kbhit();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(TARGET_WIN)
|
||||||
|
# include <conio.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue