Program Club

win API를 사용하여 HRESULT 값의 문자열 표현을 얻는 방법이 있습니까?

proclub 2021. 1. 7. 08:17
반응형

win API를 사용하여 HRESULT 값의 문자열 표현을 얻는 방법이 있습니까?


HRESULT 값의 문자열 표현을 추출하는 데 사용할 수있는 win API에 함수가 있습니까?

문제는 모든 반환 값이 MSDN에 문서화되어 있지 않다는 것입니다. 예를 들어 ExecuteInDefaultAppDomain () 함수가 "0x80070002-지정한 파일을 찾을 수 없습니다."를 반환하도록 문서화되어 있지 않습니다. 따라서 일반적인 경우에 사용할 기능이 있는지 궁금합니다.


_com_error 사용할 수 있습니다 .

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

_com_error어떤 이유로 든 사용하고 싶지 않은 경우 에도 소스를 살펴보고 어떻게 수행되는지 확인할 수 있습니다.

헤더를 포함하는 것을 잊지 마십시오 comdef.h


이를위한 Windows API는 FormatMessage 입니다. 다음은이를 수행하는 방법을 설명하는 링크입니다 . FormatMessage API를 사용하여 오류 메시지 설명을 얻는 방법 .

Win32 메시지 (0x8007로 시작하는 HRESULT가있는 메시지, FACILITY_WIN32)의 경우 hi 순서 단어를 제거해야합니다. 예를 들어 0x80070002에서 0x0002로 FormatMessage를 호출해야합니다.

그러나 모든 유형의 메시지에 대해 항상 작동하는 것은 아닙니다. 그리고 특정 메시지 (기술, 공급 업체 등 특정)의 경우 해당 리소스 DLL을로드해야합니다.이 DLL을 찾아야하므로 항상 쉬운 작업은 아닙니다.


C ++ 11부터이 기능은 표준 라이브러리에 내장되어 있습니다.

#include <system_error>

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

다음은 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()

ReferenceURL : https://stackoverflow.com/questions/7008047/is-there-a-way-to-get-the-string-representation-of-hresult-value-using-win-api

반응형