main.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #ifndef main_H
  2. #define main_H
  3. #ifdef _DEBUG
  4. #ifndef _LTMDB
  5. #define _CRTDBG_MAP_ALLOC
  6. #include <stdlib.h>
  7. #include <crtdbg.h>
  8. #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
  9. #define new DEBUG_CLIENTBLOCK
  10. #define _LTMDB
  11. #endif
  12. #endif
  13. #define WIN32_LEAN_AND_MEAN
  14. #include <Windows.h>
  15. #pragma warning( push )
  16. #pragma warning( disable : 4091 )
  17. #include <DbgHelp.h>
  18. #pragma warning( pop )
  19. #define KSGStart __stdcall
  20. #include "Globals.h"
  21. namespace Framework
  22. {
  23. // Speichert die dem Programm vom Betriebssystem beim Start übergebenen Parameter
  24. struct Startparam
  25. {
  26. HINSTANCE hinst, hpinst;
  27. LPSTR cmd;
  28. int show;
  29. };
  30. // Überschreibe diese Funktion. Sie wird vom Framework automatisch beim Start des Programmes aufgerufen
  31. // p: Die Parameter, die dem Programm beim Start vom Betriebssystem übergeben wurden
  32. int KSGStart Start( Startparam p );
  33. // Initialisiert das Framework
  34. // Wird in der (WinMain) des Frameworks automatisch aufgerufen
  35. __declspec( dllexport ) void initFramework();
  36. // Gibt den duch (initFramework) benutzten Arbeitsspeicher wieder frei
  37. // Wird in der (WinMain) des Frameworks automatisch aufgerufen
  38. __declspec( dllexport ) void releaseFramework();
  39. }
  40. typedef BOOL(WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
  41. void createMinidump(struct _EXCEPTION_POINTERS* apExceptionInfo)
  42. {
  43. HMODULE mhLib = ::LoadLibrary("dbghelp.dll");
  44. MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(mhLib, "MiniDumpWriteDump");
  45. HANDLE hFile = ::CreateFile("error_core_memory_dump.dmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
  46. FILE_ATTRIBUTE_NORMAL, NULL);
  47. _MINIDUMP_EXCEPTION_INFORMATION ExInfo;
  48. ExInfo.ThreadId = ::GetCurrentThreadId();
  49. ExInfo.ExceptionPointers = apExceptionInfo;
  50. ExInfo.ClientPointers = FALSE;
  51. pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);
  52. ::CloseHandle(hFile);
  53. }
  54. LONG WINAPI unhandledHandler(struct _EXCEPTION_POINTERS* apExceptionInfo)
  55. {
  56. createMinidump(apExceptionInfo);
  57. return EXCEPTION_CONTINUE_SEARCH;
  58. }
  59. int WINAPI WinMain( _In_ HINSTANCE hinst, _In_opt_ HINSTANCE hpinst, _In_ LPSTR cmd, int _In_ show )
  60. {
  61. #ifdef _DEBUG
  62. _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  63. #else
  64. SetUnhandledExceptionFilter(unhandledHandler);
  65. #endif
  66. Framework::initFramework( hinst );
  67. Framework::Startparam stp;
  68. stp.hinst = hinst;
  69. stp.hpinst = hpinst;
  70. stp.cmd = cmd;
  71. stp.show = show;
  72. int ret = Framework::Start( stp );
  73. Framework::releaseFramework();
  74. return ret;
  75. }
  76. #endif