2014-04-03 33 views
1

我得到一個SAFEARRAY訪問BSTR **它應該包含「GOOG」和「O」在SAFEARRAY

它看起來不錯的調試器

enter image description here

但是我不能讓BSTRs出來!

此代碼

 BSTR * raw; 
     HRESULT hr = SafeArrayAccessData(*Strings, (void **)&raw); 

給我

enter image description here

如果我繼續取消引用原始指針出故障

我得到完全相同的結果用手

BSTR* t2 = (BSTR*)(*Strings)->pvData; 

enter image description here

回答

2

多次試驗後,答案似乎是,你必須提取的字符串作爲變體,後來把它們轉換成BSTRs,最後到wstrings。

像這樣的事情

// access data as an array of variants 
     VARIANT * raw; 
     SafeArrayAccessData(*Strings, (void **)&raw); 

// convert to a BSTR wrapper 
     const _bstr_t wrapper(raw[0]); 

// convert to a wstring 
     std::wstring wstrVal((const wchar_t*)wrapper); 

或者,一舉由Hans帕桑特

// access data 
    VARIANT * raw; 
    SafeArrayAccessData(*Strings, (void **)&raw); 
    std::wstring wstrVal((const wchar_t*)raw[0].bstrVal); 
+2

燁的建議,調試器顯示您VARIANT.vt的價值。 8表示「包含VT_BSTR的變體」。點燃週期和堆_bstr_t,只需直接使用raw [0] .bstrVal。 –