Win32 Errors: How to Format GetLastError() Output into Readable Strings
I’ve been doing a moderate amount of native Win32 C++ programming over the past few weeks, and occasionally I’ve needed to set up some debug points to print errors that occur during file and memory I/O.
When something goes wrong inside the Win32 API, some methods will return a system error code directly (such as all of the registry methods) and others will simple return a NULL pointer or a 0-length DWORD and require you to poll the GetLastError method yourself.
Unfortunately, these error codes are just long integers (DWORDs) and don’t contain any of that human-friendly information that I’m used to for .NET exceptions.
I created a Gist on Github that shows how we do it and have also included the code below:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DWORD dLastError = GetLastError(); | |
LPCTSTR strErrorMessage = NULL; | |
FormatMessage( | |
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_ALLOCATE_BUFFER, | |
NULL, | |
dLastError, | |
0, | |
(LPWSTR) &strErrorMessage, | |
0, | |
NULL); | |
//Prints debug output to the console | |
OutputDebugString(strErrorMessage); |