c++ - IWebBrowser2::Navigate2 错误处理

标签 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");
    }
}

最佳答案

关于如何处理 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); 
    }

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

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

这是一个例子:

std::wstring StackExample::getLastError( HRESULT hr ) 
{
    LPWSTR lpMsgBuf;
    DWORD ret;
    std::wstring def(L"(UNKNOWN)");
    ret = FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_HMODULE,
        GetModuleHandle(TEXT("imapi2.dll")),
        hr,
        0,
        (LPWSTR) &lpMsgBuf,
        0, NULL );

    if(ret)
    {
        std::wstring last(lpMsgBuf);
        LocalFree(lpMsgBuf);
        return last;
    }
    return def;
}

关于c++ - IWebBrowser2::Navigate2 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13956307/

相关文章:

c++ - 记录多线程服务器组件

vba - 可以使用 IDTExtensibility2 为 VBA IDE 创建 64 位插件吗?

java - 如何将错误重定向到 Apache Camel 中的路由

error-handling - Redux-全局错误处理程序

c++ - 从 vector 的 vector 中删除重复的 vector

c++ - Xcode 无法识别析构函数

c++ - 无法读取串行输入

node.js - 从node.js调用COM模块

c++ - IDispatch::调用返回 E_INVALIDARG

c++ - 我应该如何处理 libpq for postgresql 中的错误