2016-12-19 3 views
3

Я новичок в WinAPI, и я пытаюсь преобразовать wstringstream в LPCWSTR, как это (в WM_PAINT):Преобразовать wstringstream к LPCWSTR

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

Он производит только мусор, хотя, может кто-нибудь помочь? Спасибо.

+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() к сопзЬ ссылке 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”.

Смежные вопросы