将 BSTR 通过管道传输到 wstringstream?

问题描述 投票:0回答:1

有一个经过尝试和测试的答案这里如何转换

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

c++ winapi com bstr
1个回答
0
投票
就编译器而言,

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.