2010-10-05 54 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