bool CPPageFileInfoClip::OnDoubleClickLocation() { CString path = m_location; if (path[path.GetLength() - 1] != _T('\\')) { path += _T('\\'); } path += m_fn; return ExploreToFile(path); }
BOOL CPPageFileInfoClip::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_LBUTTONDBLCLK && pMsg->hwnd == m_location.m_hWnd && !m_location_str.IsEmpty()) { CString path = m_location_str; if (path[path.GetLength() - 1] != '\\') { path += _T("\\"); } path += m_fn; if (path.Find(_T("://")) == -1 && ExploreToFile(path)) { return TRUE; } } return __super::PreTranslateMessage(pMsg); }
LONG WINAPI CMiniDump::UnhandledExceptionFilter(_EXCEPTION_POINTERS* lpTopLevelExceptionFilter) { LONG retval = EXCEPTION_CONTINUE_SEARCH; HMODULE hDll = NULL; TCHAR szResult[800]; szResult[0] = _T('\0'); CString strDumpPath; if (!m_bMiniDumpEnabled) { return retval; } #ifndef DISABLE_MINIDUMP hDll = ::LoadLibrary(_T("dbghelp.dll")); if (hDll != NULL) { MINIDUMPWRITEDUMP pMiniDumpWriteDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll, "MiniDumpWriteDump"); if (pMiniDumpWriteDump != NULL) { if (!AfxGetMyApp()->IsIniValid()) { HRESULT hr = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, strDumpPath.GetBuffer(MAX_PATH)); if (FAILED(hr)) { FreeLibrary(hDll); return retval; } strDumpPath.ReleaseBuffer(); strDumpPath.Append(_T("\\Media Player Classic\\")); strDumpPath.Append(AfxGetApp()->m_pszExeName); strDumpPath.Append(_T(".exe")); } else { strDumpPath = GetProgramPath(true); } strDumpPath.AppendFormat(_T(".%d.%d.%d.%d.dmp"), MPC_VERSION_NUM); // create the file HANDLE hFile = ::CreateFile(strDumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { _MINIDUMP_EXCEPTION_INFORMATION ExInfo; ExInfo.ThreadId = ::GetCurrentThreadId(); ExInfo.ExceptionPointers = lpTopLevelExceptionFilter; ExInfo.ClientPointers = NULL; // write the dump BOOL bOK = pMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL); if (bOK) { _stprintf_s(szResult, _countof(szResult), ResStr(IDS_MPC_CRASH), strDumpPath); retval = EXCEPTION_EXECUTE_HANDLER; } else { _stprintf_s(szResult, _countof(szResult), ResStr(IDS_MPC_MINIDUMP_FAIL), strDumpPath, GetLastError()); } ::CloseHandle(hFile); } else { _stprintf_s(szResult, _countof(szResult), ResStr(IDS_MPC_MINIDUMP_FAIL), strDumpPath, GetLastError()); } } FreeLibrary(hDll); } if (szResult[0]) { switch (MessageBox(NULL, szResult, _T("MPC-HC - Mini Dump"), retval ? MB_YESNO : MB_OK)) { case IDYES: ShellExecute(NULL, _T("open"), BUGS_URL, NULL, NULL, SW_SHOWDEFAULT); ExploreToFile(strDumpPath); break; case IDNO: retval = EXCEPTION_CONTINUE_SEARCH; // rethrow the exception to make easier attaching a debugger break; } } #else if (MessageBox(NULL, ResStr(IDS_MPC_BUG_REPORT), ResStr(IDS_MPC_BUG_REPORT_TITLE), MB_YESNO) == IDYES) { ShellExecute(NULL, _T("open"), DOWNLOAD_URL, NULL, NULL, SW_SHOWDEFAULT); } #endif // DISABLE_MINIDUMP return retval; }
LONG WINAPI CMiniDump::UnhandledExceptionFilter(_EXCEPTION_POINTERS* lpTopLevelExceptionFilter) { LONG retval = EXCEPTION_CONTINUE_SEARCH; BOOL bDumpCreated = FALSE; HMODULE hDll = nullptr; TCHAR szResult[800]; szResult[0] = _T('\0'); CPath dumpPath; #if ENABLE_MINIDUMP hDll = ::LoadLibrary(_T("dbghelp.dll")); if (hDll != nullptr) { MINIDUMPWRITEDUMP pMiniDumpWriteDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll, "MiniDumpWriteDump"); if (pMiniDumpWriteDump != nullptr && AfxGetMyApp()->GetAppSavePath(dumpPath)) { // Check that the folder actually exists if (!FileExists(dumpPath)) { VERIFY(CreateDirectory(dumpPath, nullptr)); } CString strDumpName = AfxGetApp()->m_pszExeName; strDumpName.Append(_T(".exe.") + VersionInfo::GetVersionString() + _T(".dmp")); dumpPath.Append(strDumpName); // create the file HANDLE hFile = ::CreateFile(dumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); if (hFile != INVALID_HANDLE_VALUE) { _MINIDUMP_EXCEPTION_INFORMATION ExInfo; ExInfo.ThreadId = ::GetCurrentThreadId(); ExInfo.ExceptionPointers = lpTopLevelExceptionFilter; ExInfo.ClientPointers = FALSE; // write the dump bDumpCreated = pMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, nullptr, nullptr); if (bDumpCreated) { _stprintf_s(szResult, _countof(szResult), ResStr(IDS_MPC_CRASH), dumpPath); retval = EXCEPTION_EXECUTE_HANDLER; } else { _stprintf_s(szResult, _countof(szResult), ResStr(IDS_MPC_MINIDUMP_FAIL), dumpPath, GetLastError()); } ::CloseHandle(hFile); } else { _stprintf_s(szResult, _countof(szResult), ResStr(IDS_MPC_MINIDUMP_FAIL), dumpPath, GetLastError()); } } FreeLibrary(hDll); } if (szResult[0]) { switch (MessageBox(nullptr, szResult, _T("MPC-HC - Mini Dump"), bDumpCreated ? MB_YESNO : MB_OK)) { case IDYES: ShellExecute(nullptr, _T("open"), BUGS_URL, nullptr, nullptr, SW_SHOWDEFAULT); ExploreToFile(dumpPath); break; case IDNO: retval = EXCEPTION_CONTINUE_SEARCH; // rethrow the exception to make easier attaching a debugger break; } } #else if (MessageBox(nullptr, ResStr(IDS_MPC_BUG_REPORT), ResStr(IDS_MPC_BUG_REPORT_TITLE), MB_YESNO) == IDYES) { ShellExecute(nullptr, _T("open"), DOWNLOAD_URL, nullptr, nullptr, SW_SHOWDEFAULT); } #endif // DISABLE_MINIDUMP return retval; }