Конвертировать wstringstream в 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 ответ

Решение

LPCWSTR myWindowOutput = ws.str().c_str() создает временное значение (возвращаемое значение вызова str()), которое исчезает, как только завершается полный оператор. Так как вам нужен временный, вам нужно перенести его на вызов, который в конечном итоге потребляет его:

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

Опять же, временные жизни, пока не закончится полное утверждение. На этот раз этого достаточно, чтобы API-вызов использовал его.

В качестве альтернативы, вы можете связать возвращаемое значение str() к константной ссылке 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) Почему эта работа объяснена в разделе № 88: Кандидат на получение "Наиболее важного констант".

Другие вопросы по тегам