获取 OLE 对象异常的 HRESULT 错误文本

问题描述 投票:0回答:1

我在 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 吗?

windows com ole formatmessage
1个回答
0
投票

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.