IWebBrowser2 :: Navigate2错误处理

时间:2012-12-19 16:01:49

标签: c++ com error-handling iwebbrowser2

处理错误的正确方法是什么?我的代码如下,处理我在MSDN上找到的所有错误代码,有时候,我收到错误“未知”。

HRESULT hr = pwb->Navigate2(&URL, &Flag, &TargetFrameName, &PostData, &Headers);
if(FAILED(hr))
{
    std::string message("Navigate2 failed with reason: ");
    switch(hr)
    {
        // The operation was successful.
        case S_OK:
            message.append("S_OK");
            break;
        // One or more parameters are invalid.
        case E_INVALIDARG:
            message.append("E_INVALIDARG");
            break;
        // Out of memory.
        case E_OUTOFMEMORY:
            message.append("E_OUTOFMEMORY");
            break;
        // The operation failed.
        case E_FAIL:
            message.append("E_FAIL");
            break;
        case E_ACCESSDENIED:
            message.append("E_ACCESSDENIED");
            break;
        case E_POINTER:
            message.append("E_POINTER");
            break;
        case E_UNEXPECTED:
            message.append("E_UNEXPECTED");
            break;
        default:
            message.append("Unknown");
    }
}

2 个答案:

答案 0 :(得分:1)

如何处理COM错误有很多变化。策略包括使用级联if SUCCEEDED()或使用goto on FAILED()等集中式功能错误处理。 MSDN上有一些很好的信息。

至于解释错误代码,FormatMessage()通常会让您的工作更轻松 - 以下是MSDN的示例(为清晰起见,请在下方提供)

[来源:http://msdn.microsoft.com/en-us/library/windows/desktop/ms687061(v=vs.85).aspx]

    #include <stdio.h>
    #include <windows.h>
    #include <tchar.h>

    void ErrorDescription(HRESULT hr) 
    { 
         if(FACILITY_WINDOWS == HRESULT_FACILITY(hr)) 
             hr = HRESULT_CODE(hr); 
         TCHAR* szErrMsg; 

         if(FormatMessage( 
           FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, 
           NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
           (LPTSTR)&szErrMsg, 0, NULL) != 0) 
         { 
             _tprintf(TEXT("%s"), szErrMsg); 
             LocalFree(szErrMsg); 
         } else 
             _tprintf( TEXT("[Could not find a description for error # %#x.]\n"), hr); 
    }

在上面的调用中,标志指示窗口将为错误消息分配内存(您必须自由使用LocalFree())并且它将在系统消息表中查找错误消息({{1 }})。有时,(或通常取决于您使用的库类型) - 系统消息表中不会找到相应的错误描述。

在这些情况下,您可以自己处理错误描述(正如您在示例中所做的那样)或尝试直接加载库的消息表。为此,请使用FORMAT_MESSAGE_FROM_SYSTEM并提供模块句柄作为FORMAT_MESSAGE_FROM_HMODULE函数的lpSource参数。

以下是一个例子:

FormatMessage()

答案 1 :(得分:0)

HRESULT错误代码实际上是LONG类型,其中的位块具有单独的含义。也就是说,处理switch语句中的每个错误都是不现实的。

如果您对特定错误代码进行了特定处理,则可以执行此操作。否则,通常使用SUCCEEDEDFAILED宏检查返回的成功/失败:

if(FAILED(nResult))
{
  // TODO: Handle the failed operation here
}

另请参阅:Error Codes in COM

  

要检查COM方法是否成功,请检查高位   返回的HRESULT。 Windows SDK标头提供了两个宏   使这更容易:SUCCEEDED宏和FAILED宏。该   如果HRESULT是成功代码并且为FALSE,则SUCCEEDED宏返回TRUE   如果是错误代码。