2012-08-23 48 views
1

我有一個COM DLL正在開發中,我遇到了一些問題。我試圖繞過一段代碼,在catch中,我得到了一個例外的_bstr_t。我想要做的是捕獲該異常並將其打印到字符串,但是,當拋出異常時,它會向我拋出一個無效空指針錯誤。我試着看MSDN如何檢查一個空指針,但它似乎並沒有工作。我無法真正地調試錯誤,因爲這是在客戶端機器上,並且在嘗試輸出信息時出現此錯誤。使用_bstr_t時無效的空指針

catch(const _com_error& ex) 
{ 
    ::OutputDebugStringW(ex.Description()); 

    _variant_t ret; 
    std::string str = "#N/A ExcelException: "; 
    _bstr_t desc = ex.Description(); 

    if(!desc || desc.GetBSTR() == L"") 
    { 
     str += ConvertBSTRToMBS(desc); 
    } 

    ret.SetString(str.c_str()); 
    *Result = ret.Detach(); 
} 

std::string ConvertBSTRToMBS(_bstr_t bstr) 
{ 
    std::string converted((char *)bstr); 
    return converted; 
} 

回答

0

由於if條件的錯誤,ConvertBSTRToMBS被稱爲只有當bstr爲空。如下

if(!!desc && desc.length() != 0) 
{ 
    str += ConvertBSTRToMBS(desc); 
} 

奇怪!!desc表達意味着!(desc.operator!()) 糾正它。 _bstr_t::operator!如果BSTR爲空,則返回true,因此您必須否定它來檢查非null。

+0

我看到我犯的錯誤,我想我一直在盯着這段代碼太久了。不過,如果(desc)或if(desc!= NULL),我不能這樣做,因爲這會產生一個錯誤。我需要找到一種方法來查看它是否不是NULL。 – Seb

+0

@Seb:會如果(!! desc)工作? – Andrey

+0

以前從未見過這種語法,但它確實工作正常。謝謝 – Seb