main.h 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. namespace Framework
  21. {
  22. // Speichert die dem Programm vom Betriebssystem beim Start übergebenen Parameter
  23. struct Startparam
  24. {
  25. HINSTANCE hinst, hpinst;
  26. LPSTR cmd;
  27. int show;
  28. };
  29. // Überschreibe diese Funktion. Sie wird vom Framework automatisch beim Start des Programmes aufgerufen
  30. // p: Die Parameter, die dem Programm beim Start vom Betriebssystem übergeben wurden
  31. int KSGStart Start( Startparam p );
  32. // Initialisiert das Framework
  33. // Wird in der (WinMain) des Frameworks automatisch aufgerufen
  34. __declspec( dllexport ) void initFramework();
  35. // Gibt den duch (initFramework) benutzten Arbeitsspeicher wieder frei
  36. // Wird in der (WinMain) des Frameworks automatisch aufgerufen
  37. __declspec( dllexport ) void releaseFramework();
  38. }
  39. 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);
  40. void createMinidump(struct _EXCEPTION_POINTERS* apExceptionInfo)
  41. {
  42. HMODULE mhLib = ::LoadLibrary("dbghelp.dll");
  43. MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(mhLib, "MiniDumpWriteDump");
  44. HANDLE hFile = ::CreateFile("error_core_memory_dump.dmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
  45. FILE_ATTRIBUTE_NORMAL, NULL);
  46. _MINIDUMP_EXCEPTION_INFORMATION ExInfo;
  47. ExInfo.ThreadId = ::GetCurrentThreadId();
  48. ExInfo.ExceptionPointers = apExceptionInfo;
  49. ExInfo.ClientPointers = FALSE;
  50. pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);
  51. ::CloseHandle(hFile);
  52. }
  53. LONG WINAPI unhandledHandler(struct _EXCEPTION_POINTERS* apExceptionInfo)
  54. {
  55. createMinidump(apExceptionInfo);
  56. return EXCEPTION_CONTINUE_SEARCH;
  57. }
  58. int WINAPI WinMain( _In_ HINSTANCE hinst, _In_opt_ HINSTANCE hpinst, _In_ LPSTR cmd, int _In_ show )
  59. {
  60. #ifdef _DEBUG
  61. _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  62. #else
  63. SetUnhandledExceptionFilter(unhandledHandler);
  64. #endif
  65. Framework::initFramework();
  66. Framework::Startparam stp;
  67. stp.hinst = hinst;
  68. stp.hpinst = hpinst;
  69. stp.cmd = cmd;
  70. stp.show = show;
  71. int ret = Framework::Start( stp );
  72. Framework::releaseFramework();
  73. return ret;
  74. }
  75. #endif