Class for displaying system error messages
Posted
by Gert Rijs
on August 6th, 1998
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);
}
}

Comments
Convert more OS error to string
Posted by Legacy on 02/18/1999 12:00amOriginally posted by: Remon
Reply