我正在使用此代码在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进行比较。
我该怎么做?
答案 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。