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.txtnRetry?", 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); } }