diff options
Diffstat (limited to 'Src/Plugins/General/gen_crasher/crashDlg.cpp')
-rw-r--r-- | Src/Plugins/General/gen_crasher/crashDlg.cpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/Src/Plugins/General/gen_crasher/crashDlg.cpp b/Src/Plugins/General/gen_crasher/crashDlg.cpp new file mode 100644 index 00000000..d74bee75 --- /dev/null +++ b/Src/Plugins/General/gen_crasher/crashDlg.cpp @@ -0,0 +1,101 @@ +#include ".\crashdlg.h" +#include ".\configdlg.h" +#include ".\resource.h" +#include ".\settings.h" +#include "exceptionhandler.h" +#include <strsafe.h> + +extern Settings settings; +extern PEXCEPTION_POINTERS gExceptionInfo; + +BOOL CALLBACK CrashDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + UNREFERENCED_PARAMETER(lParam); + switch (uMsg) + { + case WM_INITDIALOG: + { + // as we're loading things, make sure we've got a decent icon size to use in the second usage + HICON hIcon = (HICON)LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(102),IMAGE_ICON,48,48,LR_SHARED); + SetClassLongPtr(hwndDlg, GCLP_HICON, (LONG_PTR)hIcon); + + HWND hwndPrg = GetDlgItem(hwndDlg, IDC_PRG_COLLECT); + SendMessage(hwndPrg, PBM_SETRANGE, 0, MAKELPARAM(0,100)); + SendMessage(hwndPrg, PBM_SETPOS, 0, 0); + + // this will make sure that we've got the logo shown even when using a localised version + SendDlgItemMessage(hwndDlg,IDC_BMP_LOGO,STM_SETIMAGE,IMAGE_ICON,(LPARAM)hIcon); + + SetDlgItemText(hwndDlg, IDC_LBL_STEP, L"Analyzing settings..."); + settings.ClearTempData(); + + wchar_t waPath[2*_MAX_PATH] = {0}; + if (GetModuleFileName( NULL, waPath, 2*_MAX_PATH )) + { + settings.WriteWinamp(waPath); + } + + SetTimer(hwndDlg, 123, 1000, NULL); + break; + } + case WM_TIMER: + if (wParam == 123) + { + KillTimer(hwndDlg,wParam); + HWND hwndPrg = GetDlgItem(hwndDlg, IDC_PRG_COLLECT); + SetDlgItemText(hwndDlg, IDC_LBL_STEP, L"Generating log file..."); + SendMessage(hwndPrg, PBM_SETPOS, 30, 0); + UpdateWindow(hwndDlg); + if (settings.createLOG) settings.WriteLogCollectResult(CreateLog(gExceptionInfo, L"Winamp")); + SetDlgItemText(hwndDlg, IDC_LBL_STEP, L"Generating dump file..."); + SendMessage(hwndPrg, PBM_SETPOS, 50, 0); + UpdateWindow(hwndDlg); + if (settings.createDMP) settings.WriteDmpCollectResult(CreateDump(gExceptionInfo)); + SetDlgItemText(hwndDlg, IDC_LBL_STEP, L"Starting error reporter..."); + SendMessage(hwndPrg, PBM_SETPOS, 90, 0); + UpdateWindow(hwndDlg); + STARTUPINFO si = {0}; + si.cb = sizeof(si); + si.dwFlags = STARTF_USESHOWWINDOW; + si.wShowWindow = SW_SHOW; + + PROCESS_INFORMATION pi = {0}; + wchar_t reporter[512] = {0}, waPlugPath[MAX_PATH] = {0}, cmd[512] = {0}, *waPath = 0; + GetModuleFileName( NULL, waPlugPath, MAX_PATH); + CreatePathFromFullName(&waPath, waPlugPath); + StringCchPrintf(reporter, 512, L"%s\\reporter.exe", waPath); + StringCchPrintf(cmd, 512, L" \"%s\"", settings.GetPath()); + + if (CreateProcess( + reporter, // name of executable module + cmd, // command line string + NULL, // process attributes + NULL, // thread attributes + FALSE, // handle inheritance option + 0, // creation flags + NULL, // new environment block + NULL, // current directory name + &si, // startup information + &pi)) // process information + { + SetDlgItemText(hwndDlg, IDC_LBL_STEP, L"Done."); + SetTimer(hwndDlg, 126, 200, NULL); + } + else + { + SetDlgItemText(hwndDlg, IDC_LBL_STEP, L"Error. Unable to run reporter."); + SetTimer(hwndDlg, 126, 3000, NULL); + } + + SendMessage(hwndPrg, PBM_SETPOS, 100, 0); + UpdateWindow(hwndDlg); + } + else if (wParam == 126) + { + KillTimer(hwndDlg,wParam); + DestroyWindow(hwndDlg); + } + break; + } + return FALSE; +}
\ No newline at end of file |