main.h 2.6 KB

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