在SAFEARRAY中访问BSTR

时间:2014-04-03 18:00:24

标签: c++ com safearray

我正在获得SAFEARRAY **,其应包含" GOOG"和" O"

在调试器中看起来不错

enter image description here

但是我无法取出BSTR!

此代码

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

给了我

enter image description here

如果我继续取消引用原始指针

,它会崩溃

我手动完成相同的结果

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

enter image description here

1 个答案:

答案 0 :(得分:2)

经过多次实验,答案似乎是你必须将字符串提取为VARIANTS,然后将它们转换为BSTR,最后转换为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 Passant所建议的那样一举

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