Is there a way to get the string representation of HRESULT value using win API?

C++WindowsWinapiClrHresult

C++ Problem Overview


Is there a function in win API which can be used to extract the string representation of HRESULT value?

The problem is that not all return values are documented in MSDN, for example ExecuteInDefaultAppDomain() function is not documented to return "0x80070002 - The system cannot find the file specified.", however, it does! Therefore, I was wondering whether there is a function to be used in common case.

C++ Solutions


Solution 1 - C++

You can use _com_error:

_com_error err(hr);
LPCTSTR errMsg = err.ErrorMessage();

If you don't want to use _com_error for whatever reason, you can still take a look at its source, and see how it's done.

Don't forget to include the header comdef.h

Solution 2 - C++

Since c++11, this functionality is built into the standard library:

#include <system_error>

std::string message = std::system_category().message(hr)

Solution 3 - C++

The Windows API for this is FormatMessage. Here is a link that explains how to do it: Retrieving Error Messages.

For Win32 messages (messages with an HRESULT that begins with 0x8007, which is FACILITY_WIN32), you need to remove the hi order word. For example in the 0x80070002, you need to call FormatMessage with 0x0002.

However, it does not always work for any type of message. And for some specific messages (specific to a technology, a vendor, etc.), you need to load the corresponding resource DLL, which is not always an easy task, because you need to find this DLL.

Solution 4 - C++

Here's a sample using FormatMessage()

LPTSTR SRUTIL_WinErrorMsg(int nErrorCode, LPTSTR pStr, WORD wLength )
{
	try
	{
		LPTSTR	szBuffer = pStr;
		int	nBufferSize = wLength;
		
		//
		// prime buffer with error code
		//
		wsprintf( szBuffer, _T("Error code %u"), nErrorCode);
		
		//
		// if we have a message, replace default with msg.
		//
		FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
				NULL, nErrorCode,
				MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
				(LPTSTR) szBuffer,   
				nBufferSize,    
				NULL );
	}
	catch(...)
	{
	}
	return pStr;
} // End of SRUTIL_WinErrorMsg()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionkhkarensView Question on Stackoverflow
Solution 1 - C++eranView Answer on Stackoverflow
Solution 2 - C++ChronialView Answer on Stackoverflow
Solution 3 - C++Simon MourierView Answer on Stackoverflow
Solution 4 - C++WebDriveView Answer on Stackoverflow