将wstringstream转换为LPCWSTR

时间:2016-12-19 16:39:53

标签: winapi stringstream lpcwstr

我是Winapi的初学者,我正在尝试将wstringstream转换为LPCWSTR(在WM_PAINT内):

wstringstream ws; 
ws << "my text" << endl; 
LPCWSTR myWindowOutput = ws.str().c_str();
hdc = BeginPaint(hWnd, &ps); 
TextOut(hdc, 150, 305, myWindowOutput, 10);

它只生产垃圾,有人可以帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:5)

LPCWSTR myWindowOutput = ws.str().c_str()产生一个临时(str()调用的返回值),一旦完整语句结束就会消失。由于您需要临时,您需要将其移至调用,最终消耗它:

TextOutW(hdc, 150, 305, ws.str().c_str(), static_cast<int>(ws.str().length()));

同样,临时生活直到完整陈述结束。这一次,这足以让API调用使用它。

作为替代方法,您可以将str()的返回值绑定到 const 引用 1),然后使用它。这可能更合适,因为您需要使用两次返回值(以获取指向缓​​冲区的指针,并确定其大小):

wstringstream ws;
ws << "my text" << endl;
hdc = BeginPaint(hWnd, &ps);
const wstring& s = ws.str();
TextOutW(hdc, 150, 305, s.c_str(), static_cast<int>(s.length()));

<小时/> 1) 为什么这项工作在GotW #88: A Candidate For the “Most Important const”下解释。