HRESULT
What we should know about HRESULT ?
- HRSULT is a kind of Data Type ( Long 32bit) which is used for Windows.
- It is The return codes used by COM interfaces.
- To test an HRESULT value, use the FAILED and SUCCESSED macros.
- This type is declared in WinNT.h as follows:
typedef LONG HRESULT;
Structure of COM Error Codes.
- HRESULT value has 32bits and is divided into 3 fields: a severity code, a facility code, and an error code.
Bit 31 30 29 28 27, 26 25 24 ... 16, 15 14 ... 0
Field S R C N r , Facility , Error
Convert HRSULT retrun codes to error messages.
法(1) We can use AMGetErrorText Function.
- Syntax :
DWORD AMGetErrorText (
HRESULT hr, // HRESULT value.
TCHAR *pBuffer, // Pointer to a character buffer that receives the error message.
DWORD MaxLen // Number of characters in pBuffer.
);
- Requirement:
Header: Errors.h (dshow.h)
Lib : Quarz.lib
- Example:
void ShowError(HRESULT hr)
{
if (FAILED(hr))
{
TCHAR szErr[MAX_ERROR_TEXT_LEN];
DWORD res = AMGetErrorText(hr, szErr, MAX_ERROR_TEXT_LEN);
if (res == 0)
{
StringCchPrintf(szErr, MAX_ERROR_TEXT_LEN, "Unknown Error: 0x%2x", hr);
}
MessageBox(0, szErr, TEXT("Error!"), MB_OK | MB_ICONERROR);
}
}
//But , 我尝试上述,似乎总是找不到AMGetErrorText函数,找不到合适的H文件,可能需要安装额外的SDK.
法 (2)
CString HrToMessage( HRESULT hr )
{
LPVOID lpMsgBuf;
CString strTmp;
::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
hr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,
NULL );
strTmp.Format( _T("%s"), (char *) lpMsgBuf );
::LocalFree( lpMsgBuf );
return strTmp;
}