我在 OLE 对象上的 IDispatch::Invoke() 调用的 EXCEPINFO 结构中有一个 HRESULT 代码 (0x800A0034),并且我正在尝试获取与此错误关联的文本(“错误的文件名或编号”)。
将通常的 FormatMessage() 函数与 FORMAT_MESSAGE_FROM_SYSTEM 结合使用不会返回任何文本。 例如
int main()
{
HRESULT hr = 0x800A0034;
LPWSTR lpMsgBuf = nullptr;
DWORD dwChars = FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr,
hr,
MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
reinterpret_cast<LPWSTR>( &lpMsgBuf ),
0,
nullptr );
if ( dwChars > 0 )
{
std::wcout << L"Error message: " << lpMsgBuf << std::endl;
}
else
{
std::cerr << "Failed to get error message for HRESULT " << hr << std::endl;
}
LocalFree( lpMsgBuf );
return 0;
}
进一步查看 HRESULT,它与 FACILITY_CONTROL 设施相关,错误代码为 52,如 OleCtl.h (CTL_E_BADFILENAMEORNUMBER) 中定义。
那么,有谁知道在运行时从 Windows 获取 FACILITY_CONTROL 错误消息文本的 API 吗?
COM 在方法调用中使用
HRESULT
返回类型进行了标准化。 HRESULT
是与语言无关的返回错误的方式,其他语言可能会通过 Exception 返回给调用者。
但是COM也允许“异常抛出者”传回丰富的错误信息。
IErrorInfo
对象,该对象提供 Description 属性:
HRESULT GetDescription([out] BSTR *pBstrDescription);
然后他们使用 SetErrorInfo 存储此错误信息。
然后调用 GetErrorInfo 来检索该
IErrorInfo
对象,并阅读描述:
String GetErrorInfoDescription
{
IErrorInfo errorInfo;
GetErrorInfo(0, out errorInfo);
BSTR description;
errorInfo.GetDescription(out description);
return description;
}