In my last post "Not Work in worker thread in MFC application with
visual studio 2010" .
In fact , It does not work even in a simple windows gui application .
// CrashWin.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "CrashWin.h"
#include "CrashRpt.h"
#define MAX_LOADSTRING 100
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
BOOL WINAPI CrashCallback(LPVOID lpvState)
{
UNREFERENCED_PARAMETER(lpvState);
// Crash happened!
return TRUE;
}
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
// There is a hidden error somewhere inside of the loop...
int* p = NULL;
*p = 13; // This results in Access Violation
return 0;
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
CR_INSTALL_INFO info;
memset(&info, 0, sizeof(CR_INSTALL_INFO));
info.cb = sizeof(CR_INSTALL_INFO);
info.pszAppName = _T("CrashRpt Tests"); // Define application name.
info.pszAppVersion = _T("1.2.7"); // Define application version.
info.pszEmailSubject = _T("Error from CrashRptTests"); // Define
subject for email.
info.pszEmailTo = _T("
te...@hotmail.com"); // Define E-mail
recipient address.
info.pszUrl = _T("
http://localhost:80/crashrpt.php"); // URL for
sending reports over HTTP.
info.pfnCrashCallback = CrashCallback; // Define crash callback
function.
// Define delivery transport priorities.
info.uPriorities[CR_HTTP] = 3; // Use HTTP the first.
info.uPriorities[CR_SMTP] = 2; // Use SMTP the second.
info.uPriorities[CR_SMAPI] = 1; // Use Simple MAPI the last.
info.dwFlags = 0;
info.dwFlags |= CR_INST_ALL_POSSIBLE_HANDLERS; // Install all
available exception handlers.
info.dwFlags |= CR_INST_HTTP_BINARY_ENCODING; // Use binary
encoding for HTTP uploads (recommended).
info.dwFlags |= CR_INST_APP_RESTART; // Restart the
application on crash.
info.dwFlags |= CR_INST_NO_MINIDUMP; // Do not include
minidump.
//info.dwFlags |= CR_INST_NO_GUI; // Don't display GUI.
//info.dwFlags |= CR_INST_DONT_SEND_REPORT; // Don't send report
immediately, just queue for later delivery.
//info.dwFlags |= CR_INST_STORE_ZIP_ARCHIVES; / Store ZIP archives
along with uncompressed files (to be used with
CR_INST_DONT_SEND_REPORT)
info.dwFlags |= CR_INST_SEND_QUEUED_REPORTS; // Send reports that
were failed to send recently.
info.pszDebugHelpDLL = NULL; // Search for
dbghelp.dll using default search sequence.
info.uMiniDumpType = MiniDumpNormal; // Define minidump
size.
// Define privacy policy URL.
info.pszPrivacyPolicyURL = _T("
http://code.google.com/p/crashrpt/wiki/
PrivacyPolicyTemplate");
info.pszErrorReportSaveDir = NULL; // Save error reports to the
default location.
info.pszRestartCmdLine = _T("/restart"); // Command line for
automatic app restart.
//info.pszLangFilePath = _T("D:\\"); // Specify custom dir or
filename for language file.
//info.pszSmtpProxy = _T("
127.0.0.1:2525"); // Use SMTP proxy.
//info.pszCustomSenderIcon = sCustomSenderIcon.GetBuffer(0);
// Install crash handlers.
CrAutoInstallHelper cr_install_helper(&info);
if(cr_install_helper.m_nInstallStatus!=0)
{
TCHAR buff[256];
crGetLastErrorMsg(buff, 256);
MessageBox(NULL, buff, _T("crInstall error"), MB_OK);
return FALSE;
}
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_CRASHWIN, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance,
MAKEINTRESOURCE(IDC_CRASHWIN));
HANDLE hWorkingThread = ::CreateThread(NULL, 0,
ThreadProc, (LPVOID)NULL, 0, NULL);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage are only necessary if you want this
code
// to be compatible with Win32 systems prior to the
'RegisterClassEx'
// function that was added to Windows 95. It is important to call
this function
// so that the application will get 'well formed' small icons
associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CRASHWIN));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CRASHWIN);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
//
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global
variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance,
NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}