mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
79 lines
2.4 KiB
C++
79 lines
2.4 KiB
C++
#include "stdafx.h"
|
|
#include "World.h"
|
|
#include "usefull.h"
|
|
|
|
#pragma warning (disable: 4091)
|
|
#include <dbghelp.h>
|
|
|
|
LONG CALLBACK unhandled_handler(::EXCEPTION_POINTERS* e)
|
|
{
|
|
auto hDbgHelp = ::LoadLibraryA("dbghelp");
|
|
if (hDbgHelp == nullptr)
|
|
return EXCEPTION_CONTINUE_SEARCH;
|
|
auto pMiniDumpWriteDump = (decltype(&MiniDumpWriteDump))::GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
|
|
if (pMiniDumpWriteDump == nullptr)
|
|
return EXCEPTION_CONTINUE_SEARCH;
|
|
|
|
char name[MAX_PATH];
|
|
{
|
|
auto nameEnd = name + ::GetModuleFileNameA(::GetModuleHandleA(0), name, MAX_PATH);
|
|
::SYSTEMTIME t;
|
|
::GetLocalTime(&t);
|
|
wsprintfA(nameEnd - strlen(".exe"),
|
|
"_crashdump_%4d%02d%02d_%02d%02d%02d.dmp",
|
|
t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond);
|
|
}
|
|
|
|
auto hFile = ::CreateFileA(name, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
return EXCEPTION_CONTINUE_SEARCH;
|
|
|
|
::MINIDUMP_EXCEPTION_INFORMATION exceptionInfo;
|
|
exceptionInfo.ThreadId = ::GetCurrentThreadId();
|
|
exceptionInfo.ExceptionPointers = e;
|
|
exceptionInfo.ClientPointers = FALSE;
|
|
|
|
auto dumped = pMiniDumpWriteDump(
|
|
::GetCurrentProcess(),
|
|
::GetCurrentProcessId(),
|
|
hFile,
|
|
::MINIDUMP_TYPE(::MiniDumpWithIndirectlyReferencedMemory | ::MiniDumpScanMemory),
|
|
e ? &exceptionInfo : nullptr,
|
|
nullptr,
|
|
nullptr);
|
|
|
|
::CloseHandle(hFile);
|
|
|
|
return EXCEPTION_CONTINUE_SEARCH;
|
|
}
|
|
|
|
HWND Hwnd;
|
|
WNDPROC BaseWindowProc;
|
|
PCOPYDATASTRUCT pDane;
|
|
extern TWorld World;
|
|
|
|
LRESULT APIENTRY WndProc( HWND hWnd, // handle for this window
|
|
UINT uMsg, // message for this window
|
|
WPARAM wParam, // additional message information
|
|
LPARAM lParam) // additional message information
|
|
{
|
|
switch( uMsg ) // check for windows messages
|
|
{
|
|
case WM_COPYDATA: {
|
|
// obsługa danych przesłanych przez program sterujący
|
|
pDane = (PCOPYDATASTRUCT)lParam;
|
|
if( pDane->dwData == MAKE_ID4('E', 'U', '0', '7')) // sygnatura danych
|
|
World.OnCommandGet( (DaneRozkaz *)( pDane->lpData ) );
|
|
break;
|
|
}
|
|
case WM_KEYDOWN:
|
|
case WM_KEYUP: {
|
|
lParam &= ~0x1ff0000;
|
|
lParam |= MapVirtualKey(MAPVK_VK_TO_VSC, wParam) << 16;
|
|
break;
|
|
}
|
|
}
|
|
// pass all unhandled messages to DefWindowProc
|
|
return CallWindowProc( BaseWindowProc, Hwnd, uMsg, wParam, lParam );
|
|
};
|