Есть ли способ получить строковое представление значения HRESULT, используя win API?
Есть ли в win API функция, которую можно использовать для извлечения строкового представления значения HRESULT?
Проблема заключается в том, что не все возвращаемые значения задокументированы в MSDN, например, функция ExecuteInDefaultAppDomain() не задокументирована для возврата "0x80070002 - система не может найти указанный файл", однако это так! Поэтому мне было интересно, есть ли функция, которая будет использоваться в общем случае.
3 ответа
Вы можете использовать _com_error:
_com_error err(hr);
LPCTSTR errMsg = err.ErrorMessage();
Если вы не хотите использовать _com_error
по какой-то причине вы все еще можете взглянуть на его источник и посмотреть, как это делается.
Не забудьте включить заголовок comdef.h
Начиная с C++11, эта функциональность встроена в стандартную библиотеку:
#include <system_error>
std::string message = std::system_category().message(hr)
Windows API для этого - FormatMessage. Вот ссылка, которая объясняет, как это сделать: Как получить описания сообщений об ошибках с помощью API FormatMessage.
Для сообщений Win32 (сообщений с HRESULT, который начинается с 0x8007, то есть FACILITY_WIN32), вам нужно удалить слово высокого порядка. Например, в 0x80070002 вам нужно вызвать FormatMessage с 0x0002.
Однако, это не всегда работает для любого типа сообщения. А для некоторых конкретных сообщений (специфических для технологии, поставщика и т. Д.) Вам необходимо загрузить соответствующую библиотеку ресурсов, что не всегда является простой задачей, поскольку вам нужно найти эту библиотеку DLL.
Вот пример использования 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()