Not Work in worker thread in simple GUI application with visual studio 2010

61 views
Skip to first unread message

liang leon

unread,
Oct 29, 2011, 11:20:45 PM10/29/11
to Crashrpt
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;
}

liang leon

unread,
Oct 30, 2011, 2:55:56 AM10/30/11
to Crashrpt
I found some hints. For doc/view application , or for simple GUI win32
application (without mfc), you must put the install rt code after main
windows created. or ,you will not get ReportRpt work in worker
thread. these code not work int APIENTRY _tWinMain(HINSTANCE
hInstance,                      HINSTANCE hPrevInstance,              
       LPTSTR    lpCmdLine,                      int      
nCmdShow) {         UNREFERENCED_PARAMETER(hPrevInstance);        
UNREFERENCED_PARAMETER(lpCmdLine);         CR_INSTALL_INFO ii;        
memset(&ii, 0, sizeof(CR_INSTALL_INFO));         ii.cb =
sizeof(CR_INSTALL_INFO);         ii.dwFlags =
CR_INST_ALL_POSSIBLE_HANDLERS;         ii.pszAppName =
_T("MfcTest");         ii.pszAppVersion = _T("1.0.0");         int
nResult = crInstall(&ii);         TCHAR szError[256];        
crGetLastErrorMsg(szError, 256);         // 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));         //
Create the worker thread         HANDLE hWorkingThread
= ::CreateThread(NULL, 0,                 ThreadProc, (LPVOID)NULL, 0,
NULL);         // Main message loop:         //int* p = NULL;      
  //*p = 13; // This results in Access Violation         while
(GetMessage(&msg, NULL, 0, 0))         {                 if (!
TranslateAccelerator(msg.hwnd, hAccelTable, &msg))                 {  
                      TranslateMessage(&msg);                        
DispatchMessage(&msg);                 }         }        
crUninstall();         return (int) msg.wParam; } 
that code will work int APIENTRY _tWinMain(HINSTANCE hInstance,      
               HINSTANCE hPrevInstance,                      LPTSTR  
 lpCmdLine,                      int       nCmdShow) {        
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;      
  }         CR_INSTALL_INFO ii;         memset(&ii, 0,
sizeof(CR_INSTALL_INFO));         ii.cb = sizeof(CR_INSTALL_INFO);    
    ii.dwFlags = CR_INST_ALL_POSSIBLE_HANDLERS;         ii.pszAppName
= _T("MfcTest");         ii.pszAppVersion = _T("1.0.0");         int
nResult = crInstall(&ii);         TCHAR szError[256];        
crGetLastErrorMsg(szError, 256);         hAccelTable =
LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CRASHWIN));         //
Create the worker thread         HANDLE hWorkingThread
= ::CreateThread(NULL, 0,                 ThreadProc, (LPVOID)NULL, 0,
NULL);         // Main message loop:         //int* p = NULL;      
  //*p = 13; // This results in Access Violation         while
(GetMessage(&msg, NULL, 0, 0))         {                 if (!
TranslateAccelerator(msg.hwnd, hAccelTable, &msg))                 {  
                      TranslateMessage(&msg);                        
DispatchMessage(&msg);                 }         }        
crUninstall();         return (int) msg.wParam; 
Reply all
Reply to author
Forward
0 new messages