gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:50:17 24 4
gpt4 key购买 nike

处理错误的正确方法是什么?我的代码如下所示,处理我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com