winapi - 将 wstringstream 转换为 LPCWSTR

标签 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);

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

最佳答案

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

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

同样,临时变量将一直存在,直到完整语句结束为止。这一次,这个长度足以让 API 调用使用它。

作为替代方案,您可以将 str() 的返回值绑定(bind)到 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” 下解释。 .

关于winapi - 将 wstringstream 转换为 LPCWSTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41227214/

相关文章:

c++ - 使用 C++ Win32 GUI 在窗口中显示文本

c++ - 将stringstream内容写入ofstream

c++ - cout <<字符串流

c++ - FileCopyExW 将最后一个错误报告为 ERROR_NOT_SUPPORTED - 这对于 FileCopyExW 意味着什么

c++ - 如何禁止任何应用程序的所有线程在特定 CPU 核心上运行,除非我指定的线程?

winapi - 在 Win32 上使用 GNU gettext

c++ - 指向函数的指针和指向 WINAPI 函数的指针有什么区别?

c++ - getline() 在多次调用后跳过

go - CGO:在 LPCWSTR 和字符串之间转换

c++ - LPCWSTR 不会在 TextOut() 方法上正确转换