2010-10-05 57 views
0

我使用这个代码下沉C IN上的一个IWebBrowser2的网页浏览器事件++:VARIANT *串抛出未知异常

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); 
} 

致电时(无效)的DocumentComplete我得到这个错误:

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

如果在DocumentComplete上注释该行,则不会显示任何错误。也try..catch块doens't赶上例外。

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

我该怎么做?

回答

0

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

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

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

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

+0

谢谢,你的回答真的帮了我。 – jarkam 2010-10-05 02:31:34

0

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

+0

有关如何将变体指针与std :: string进行比较的任何提示? – jarkam 2010-10-05 01:15:12

+0

@jarkam:与任何其他指针一样,您可以通过用一元运算符'*'解引用,从'VARIANT *'到'VARIANT',即您的代码应为:_bstr_t(* url)'。你可以使用'_bstr_t(s.c_str())'从'std :: string s'创建'_bstr_t'。然后像往常一样使用'=='比较两个'_bstr_t'对象。另外,如果你使用VARIANT和BSTR(通常是Win32和COM),使用'std :: wstring'会更好,所以你可以正确支持完整的Unicode并避免代价高昂的转换。 – 2010-10-05 01:24:03

+0

刚刚发现VARIANT * url为空,看起来像我没什么可比较的。 – jarkam 2010-10-05 02:17:16

0

YeenFei给出了一半的答案。另一半是在你得到你的bstr之后,它将指向一个Unicode字符串而不是ANSI字符串。如果你想获得一个ANSI字符串,你必须通过将字符串从Unicode转换为ANSI来完成,而不是通过转换指针。

+0

'_bstr_t'有一个重载的'operator char *()',它将进行正确的转换。 – 2010-10-05 01:07:35