Подтвердить что ты не робот

Есть ли способ получить строковое представление значения HRESULT с помощью win API?

Есть ли функция в win API, которая может использоваться для извлечения строкового представления значения HRESULT?

Проблема заключается в том, что не все возвращаемые значения документируются в MSDN, например Функция ExecuteInDefaultAppDomain() не документирована для возврата "0x80070002 - Система не может найти файл указано.", однако, это так! Поэтому мне было интересно, есть ли функция, которая будет использоваться в общем случае.

4b9b3361

Ответ 1

Вы можете использовать _ com_error:

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

Если вы не хотите использовать _com_error по какой-либо причине, вы все равно можете взглянуть на его источник и посмотреть, как это делается.

Не забудьте включить заголовок comdef.h

Ответ 2

API Windows для этого FormatMessage. Вот ссылка, которая объясняет, как это сделать: Как получить описания сообщений об ошибках с помощью API FormatMessage.

Для сообщений Win32 (сообщения с HRESULT, которые начинаются с 0x8007, что FACILITY_WIN32), вам нужно удалить приветственное слово. Например, в 0x80070002 вам нужно вызвать FormatMessage с 0x0002.

Однако он не всегда работает для сообщений любого типа. И для некоторых конкретных сообщений (специфичных для технологии, поставщика и т.д.) Вам нужно загрузить соответствующую DLL ресурсов, что не всегда легко, потому что вам нужно найти эту DLL.

Ответ 3

Здесь пример с использованием 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()

Ответ 4

Начиная с С++ 11, эта функциональность встроена в стандартную библиотеку:

#include <system_error>

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