有一个经过尝试和测试的答案这里如何转换
BSTR
->std::wstring
。但我想将 BSTR 包含在我正在构建的 wstringstream
中。
显然我可以做到(作为 MRE 有点做作):
std::wstring proc(BSTR bStr)
{
std::wstringstream ss;
std::wstring ws(bStr, SysStringLen(bStr));
ss << "The string is: " << ws;
return ss.str();
}
但是有没有办法避免创建临时
ws
对象并直接管道 bStr
?
BSTR
只是 wchar_t*
的 typedef(它在运行时的分配 与普通 wchar_t
C 字符串不同)。
根据定义,非空
BSTR
始终以 null 结尾(即使它也是有长度前缀的)。
因此,除非您的字符串中嵌入了 nul 字符(这是可能的),否则您可以仅使用普通的
operator<<
来表示宽字符串。只需注意 BSTR
为空指针的情况,这将为运算符表现出 未定义的行为。
试试这个:
std::wstring proc(BSTR bStr)
{
std::wstringstream ss;
ss << L"The string is: ";
if (bStr) ss << bStr;
return ss.str();
}