Variant * to string抛出未知异常

时间:2010-10-05 00:51:47

标签: c++ string visual-studio-2010 visual-c++ variant

我正在使用此代码在c ++上的IWebBrowser2 webbrowser中接收事件:

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 ++异常:内存位置为0x0012ed50的_com_error。*

如果对DocumentComplete上的行进行注释,则不会显示任何错误。另外try..catch块也不会捕获异常。

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

我该怎么做?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

YeenFei给出了一半答案。另一半是在获得bstr之后,它将指向不是ANSI字符串的Unicode字符串。如果要获取ANSI字符串,则必须通过将字符串从Unicode转换为ANSI来实现,而不是通过转换指针。

答案 2 :(得分:0)

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

请参阅MSDN documentation以获取正确的DocumentComplete签名。

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

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