Click here to Skip to main content
15,890,123 members
Articles / Desktop Programming / MFC
Tip/Trick

Get Windows Win32 Error Text - Simplified

Rate me:
Please Sign up or sign in to vote.
5.00/5 (2 votes)
31 Jul 2013CPOL 19.7K   7   8
Getting the text of Win32 Error codes for 99% of cases.

This code gets Win32 error text. It is written to be read and understood on the first pass. Its arbitrary use of a static buffer is simply to not force one to remember to free the text it returns. It does sacrifice thread safety. It is also written to be a candidate for wrapping in __try/__except as well as try/catch exception handing. The use of objects such as CString would inhibit __try/__except vis-a-vis stack unwinding. Hopefully it's hard to break and easy to change. 

C++
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <conio.h>

// In Visual Studio, in Project > Properties > General > Character Set: use 'Not Set' or 'Multi-Byte'
char *GetErrorText(DWORD dwCode)
{
    static char buff[2000]        // Longest is 403 bytes, but memory is cheap.
    memset(buff,0,sizeof(buff));
    char *pmsg;
    SetLastError(0);
    int nbytes = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM,		// formatting options flag
            NULL,                		// not a source DLL or format string
            dwCode,                		// returned by GetLastError()
            MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
            (LPTSTR)&pmsg,       	     	// var to recv alloc'd buffer address

            sizeof(buff)-2,NULL);
    DWORD dw = GetLastError();
    if (dw==0)	// NO_ERROR, originally defined as ERROR_SUCCESS
    {        	// usually ERROR_INVALID_PARAMETER (87L) ' The parameter is incorrect.'
        strcpy_s(buff,pmsg);    
        LocalFree((HLOCAL)pmsg); // Free pmsg after copying to buff[]  
    }
    return buff;
}
int main()
{
    for (int code=0; code<2000000; code++)
    {
        - 
        if (strlen(msg))
        {
            printf("Win32 Code %3d: %s", code, msg);  // Already has <CR><LF> on end
//            Sleep(20);    // uncomment to see it scroll past
        }
    }
    // Will keep the console up until you press a key.
    puts("\nPress any key to continue....");
    while (!_kbhit()) Sleep(10);    
}	 

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



Comments and Discussions

 
GeneralMy vote of 5 Pin
yafan5-Aug-13 2:50
yafan5-Aug-13 2:50 
SuggestionA Few Details Pin
Rick York1-Aug-13 9:29
mveRick York1-Aug-13 9:29 
GeneralRe: A Few Details Pin
Thomas B Dignan1-Aug-13 11:10
Thomas B Dignan1-Aug-13 11:10 
SuggestionMy vote of 2 Pin
Klaus-Werner Konrad31-Jul-13 22:20
Klaus-Werner Konrad31-Jul-13 22:20 
GeneralRe: My vote of 2 Pin
Thomas B Dignan1-Aug-13 4:43
Thomas B Dignan1-Aug-13 4:43 
GeneralRe: My vote of 2 Pin
Klaus-Werner Konrad1-Aug-13 8:22
Klaus-Werner Konrad1-Aug-13 8:22 
GeneralMy vote of 5 Pin
Michael Haephrati31-Jul-13 9:47
professionalMichael Haephrati31-Jul-13 9:47 
GeneralRe: My vote of 5 Pin
Richard Andrew x6431-Jul-13 11:13
professionalRichard Andrew x6431-Jul-13 11:13 
He's calling LocalFree on p, not buff. It looks as if the FormatMessage function allocates a buffer dynamically and places its address in the pointer p.

It is this buffer that he is freeing.



The difficult we do right away...
...the impossible takes slightly longer.

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.