1

我得到一个 SAFEARRAY ** 应该包含“GOOG”和“O”

在调试器中看起来不错

在此处输入图像描述

但是我不能把 BSTR 拿出来!

这段代码

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

给我

在此处输入图像描述

如果我继续取消引用原始指针,它会崩溃

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

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

在此处输入图像描述

4

1 回答 1

4

经过大量实验,答案似乎是您必须将字符串提取为 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);
于 2014-04-03T18:49:35.933 回答