0

我正在使用此代码在 C++ 上的 IWebBrowser2 网络浏览器中接收事件:

STDMETHODIMP AdviseSink::Invoke(DISPID dispIdMember,
                                    REFIID riid,
                                    LCID lcid,
                                    WORD wFlags,
                                    DISPPARAMS* pDispParams,
                                    VARIANT* pVarResult,
                                    EXCEPINFO* pExcepInfo,
                                    UINT* puArgErr)
{

    if (!pDispParams)
        return DISP_E_PARAMNOTOPTIONAL;

    switch (dispIdMember)
    {
        case DISPID_DOCUMENTCOMPLETE:
        {
            DocumentComplete(pVarResult);
            return S_OK;
        }

        case DISPID_NAVIGATECOMPLETE2:
            return S_OK;

        default:
            return DISP_E_MEMBERNOTFOUND;
    }

    return S_OK;
}


void DocumentComplete(VARIANT *url)
{
    std::string strValue = (char*)_bstr_t(url);
}

调用 (void)DocumentComplete 时出现此错误:

* webhost.exe 中 0x7c812afb 处未处理的异常:Microsoft C++ 异常:_com_error 在内存位置 0x0012ed50。*

如果在 DocumentComplete 上注释该行,则不会显示任何错误。也 try..catch 块不会捕获异常。

我想做的是使用 Variant * url 将其与 std::string 进行比较。

我怎样才能做到这一点?

4

3 回答 3

0

http://msdn.microsoft.com/en-us/library/9k3ebasf(v=VS.100).aspx
构造函数只接受 VARIANT 的_bstr_t引用,而不是指向它的指针。

于 2010-10-05T01:01:10.523 回答
0

叶飞回答了一半。另一半是在你得到你的 bstr 之后,它将指向一个 Unicode 字符串而不是一个 ANSI 字符串。如果要获取 ANSI 字符串,则必须通过将字符串从 Unicode 转换为 ANSI 来完成,而不是通过转换指针。

于 2010-10-05T01:03:19.007 回答
0

您正在使用返回值(一个 [out] 参数)作为事件参数之一。这将导致 bstr_t 抛出 com_error 异常,因为 VARIANT 不包含 BSTR。

有关正确的 DocumentComplete 签名,请参阅MSDN 文档

事件参数可从 pDispParams而非pVarResult 获得。假设它不是用命名参数调用的(并且这个事件不应该是),url 将在 pDispParams->rgvarg[0] 和 pDispParams->rgvarg[1] 的窗口/框架中可用。参数在 rgvarg 数组中的顺序与在 idl 中声明的顺序相反。

如果可以,我建议改用 ATL 的IDispEventSimpleImpl在 C++ 中实现 COM 事件接口,而不是自己实现 IDispatch。

于 2010-10-05T02:08:30.680 回答