Class for displaying system error messages

Thursday Aug 6th 1998 by Gert Rijs
Share:

Class for displaying system error messages

The attached zip contains a small class I use regularly. It is an interface to the win32 FormatMessage api for error-reporting.

It's use is very simple: when you detect a win32 error (could not open file for example):

FILE *f = fopen("idontexist.txt", "r");
if(!f)
{
   CErrorMessage em;  // initializes with the current ::GetLastError
   if(em.MessageBox("problem opening file, cause:", "file:idontexist.txt\nRetry?", MB_YESNO)== IDYES)
   {
	...
   }
}

Header file.
// ErrorMessage.h: interface for the CErrorMessage class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_ERRORMESSAGE_H__51CAC9F1_9ECE_11D1_A06C_0000832CDDC7__INCLUDED_)
#define AFX_ERRORMESSAGE_H__51CAC9F1_9ECE_11D1_A06C_0000832CDDC7__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

class CErrorMessage  
{
public:
		// default ctor: calls GetLastError to get the current errorcode
	CErrorMessage();
		// specify your own errorcode
	CErrorMessage(DWORD theError);
	~CErrorMessage();

		//	setup a new error (0=call GetLastError)
	void	setError(DWORD error=0);

	CString	getMessage() const		{return themsg;}
	DWORD	getMessageCode() const	{return dwError;}
		//	AfxMessageBox with the text pfxtext + "\n" + themsg + "\n" + suftext
	int		MessageBox(const char* pfxtext=NULL, const char* suftext=NULL, UINT nType=MB_OK) const;
protected:
	DWORD	dwError;
	CString	themsg;
		//	get the messagestring from the system
	void	getCurrentMessage();

};

#endif // !defined(AFX_ERRORMESSAGE_H__51CAC9F1_9ECE_11D1_A06C_0000832CDDC7__INCLUDED_)

Implementation file.

// ErrorMessage.cpp: implementation of the CErrorMessage class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ErrorMessage.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/*
	default ctor
	gets the current system-error
*/
CErrorMessage::CErrorMessage()
{
	dwError		=	::GetLastError();
	getCurrentMessage();
}
/*
	ctor
	you specify the system-error
*/
CErrorMessage::CErrorMessage(DWORD theError)
{
	dwError		=	theError;
	getCurrentMessage();
}

CErrorMessage::~CErrorMessage()
{
}
/*
	reuse an existing CErrorMessage by setting a new system-error
*/
void	CErrorMessage::setError(DWORD error)
{
	if(dwError==0)
		dwError=::GetLastError();
	else
		dwError=error;
	getCurrentMessage();
}
/*
	show a message-box with the error-message
	you can specify a prefix- and suffix-line to the message
*/
int CErrorMessage::MessageBox(const char* pfxtext, const char* suftext, UINT nType) const
{
	CString	msg	=	"";
	if(pfxtext)	msg	=	CString(pfxtext) + "\n";
	msg	+=	themsg;
	if(suftext)	msg	=	msg + "\n" + suftext;
	return AfxMessageBox(msg, nType);
}
/*
	get the message from the current errorcode in the user's language
*/
void CErrorMessage::getCurrentMessage()
{
	LPTSTR	lpBuf;
	if(::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
						FORMAT_MESSAGE_ALLOCATE_BUFFER
					,	NULL
					,	dwError
					,	MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT)
					,	(LPTSTR)&lpBuf
					,	0
					,	NULL)!=0)
	{
		themsg	=	lpBuf;
		::LocalFree(lpBuf);
	}
	else
	{
		themsg.Format("Error %i occurred (no further info)", dwError);
	}
}

Share:
Home
Mobile Site | Full Site
Copyright 2017 © QuinStreet Inc. All Rights Reserved