我得到一个 SAFEARRAY ** 应该包含“GOOG”和“O”
在调试器中看起来不错
但是我不能把 BSTR 拿出来!
这段代码
BSTR * raw;
HRESULT hr = SafeArrayAccessData(*Strings, (void **)&raw);
给我
如果我继续取消引用原始指针,它会崩溃
我用手得到完全相同的结果
BSTR* t2 = (BSTR*)(*Strings)->pvData;
经过大量实验,答案似乎是您必须将字符串提取为 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);