Re[2]: Проблемы с _purecall и _set_purecall_handler
От: Аноним  
Дата: 02.11.12 10:53
Оценка:
Написал простенькое приложение на MFC. Что бы проверить можно ли поймать исключение. Ничего к сожалению не работает. Исключение вызова абстрактной функции проскакивает мимо обработчика и вываливается в окно ошибки CRT.
Вот код:

// CrashMFC1.cpp 


#include "stdafx.h"
#include "CrashMFC1.h"
#include "CrashMFC1Dlg.h"
#include <Windows.h>
#include <Dbghelp.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CCrashMFC1App

BEGIN_MESSAGE_MAP(CCrashMFC1App, CWinApp)
    ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()


void myPurecallHandler(void)
{
   throw; // Данный метод не вызывается, исключение пролетает мимо него, и выскакивает окошко CRT ошибки 
}


void make_minidump(EXCEPTION_POINTERS* e)
{
   ... // здесь пишется крашдамп, но до выполнения этого метода к сожалению не доходит
}

LONG CALLBACK unhandled_handler(EXCEPTION_POINTERS* e)
{
    make_minidump(e);
    return EXCEPTION_CONTINUE_SEARCH;
}

CCrashMFC1App::CCrashMFC1App()
{
  ...
}
CCrashMFC1App theApp;

BOOL CCrashMFC1App::InitInstance()
{
        ...
    //Видимо не самое удачное место для этих методов
        _set_purecall_handler(myPurecallHandler);
    SetUnhandledExceptionFilter(unhandled_handler);
    return FALSE;
}



// CrashMFC1Dlg.cpp 

#include "stdafx.h"
#include "CrashMFC1.h"
#include "CrashMFC1Dlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

class CAboutDlg : public CDialogEx
{
  ...
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


CCrashMFC1Dlg::CCrashMFC1Dlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CCrashMFC1Dlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCrashMFC1Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CCrashMFC1Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON1, &CCrashMFC1Dlg::OnBnClickedButton1)
END_MESSAGE_MAP()

BOOL CCrashMFC1Dlg::OnInitDialog()
{
   ...
}

void CCrashMFC1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
  ...
}

void CCrashMFC1Dlg::OnPaint()
{
   ...
}
HCURSOR CCrashMFC1Dlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

class CDerived;
class CBase
{
public:
   CBase(CDerived *derived): m_pDerived(derived) {};
   ~CBase();
   virtual void function(void) = 0;
   CDerived * m_pDerived;
};
class CDerived : public CBase
{
public:
   CDerived() : CBase(this) {};   
   virtual void function(void) { };
};
CBase::~CBase()
{
   m_pDerived -> function(); // Вызов абстрактного метода
}

void CCrashMFC1Dlg::OnBnClickedButton1()
{
    CDerived myDerived; 
}


К сожалению, не имею ни малейшего представления почему обработчик исключения не вызывается. И вообще должен ли он вызываться.

Буду очень благодарен за любую подсказку!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.