2008-08-26 22 views

Respuesta

96

Gracias por el enlace al artículo de MSDN. Esto es exactamente lo que estaba buscando.

std::wstring s2ws(const std::string& s) 
{ 
    int len; 
    int slength = (int)s.length() + 1; 
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len]; 
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len); 
    std::wstring r(buf); 
    delete[] buf; 
    return r; 
} 

std::wstring stemp = s2ws(myString); 
LPCWSTR result = stemp.c_str(); 
+3

(Encontré esta pregunta navegando al azar, ha pasado mucho tiempo desde que hice C++.) ¿Entonces la biblioteca estándar no tiene la conversión std :: string -> std :: wstring? Eso parece extraño; ¿Hay una buena razón? – Domenic

+4

Si usa std :: vector para crear almacenamiento para buf, entonces si algo arroja una excepción, se liberará su buffer temporal. –

+51

razón # 233 en cuanto a por qué C++ me molesta mucho ... 10 líneas de código para una simple conversión de cadena =/ –

2

En lugar de utilizar un std :: string, podrías usar std :: wstring.

EDIT: Lo siento, esto no es más explicativo, pero tengo que ejecutar.

uso std :: :: wstring c_str()

+6

* P: "Necesito convertir de X a Y". * - * A: "Busque un trabajo, donde están usando A en lugar de X". * Esto es inútil. – IInspectable

7

Si se encuentra en un entorno ATL/MFC, puede utilizar la macro de conversión de ATL:

#include <atlbase.h> 
#include <atlconv.h> 

. . . 

string myStr("My string"); 
CA2W unicodeStr(myStr); 

entonces usted puede utilizar como un unicodeStr LPCWSTR. La memoria para la cadena Unicode se crea en la pila y se libera, luego se ejecuta el destructor para UnicodeStr.

88

La solución es realmente mucho más fácil que cualquiera de las otras sugerencias:

std::wstring stemp = std::wstring(s.begin(), s.end()); 
LPCWSTR sw = stemp.c_str(); 

Lo mejor de todo, es independiente de la plataforma. h2h :)

+2

Lo siento Benny, pero eso no me funciona, la propia solución de Toran parece funcionar bien (pero ... ¡lástima!). –

+0

Trabajando bien. Gracias. – Durgesh

+24

Esto solo funciona si todos los caracteres son de un solo byte, es decir, ASCII o [ISO-8859-1] (http: //en.wikipedia.org/wiki/ISO-8859-1). Cualquier cosa de varios bytes fallará miserablemente, incluido UTF-8. –

-2
string s = "Hello World"; 
std::wstring stemp = std::wstring(s.begin(), s.end()); 
LPCWSTR title =(LPCWSTR) stemp.c_str(); 

LPCWSTR wname =(LPCWSTR) "Window"; 


HINSTANCE hInst = GetModuleHandle(0); 
WNDCLASS cls = { CS_HREDRAW|CS_VREDRAW, WndProc, 0, 0, hInst, LoadIcon(hInst,MAKEINTRESOURCE(IDI_APPLICATION)), 
    LoadCursor(hInst,MAKEINTRESOURCE(IDC_ARROW)), GetSysColorBrush(COLOR_WINDOW),0,wname }; 
RegisterClass(&cls); 
HWND window = CreateWindow(wname,title,WS_OVERLAPPEDWINDOW|WS_VISIBLE,64,64,640,480,0,0,hInst,0); 

MSG Msg; 
while(GetMessage(&Msg,0,0,0)) 
{ 
    TranslateMessage(&Msg); 
    DispatchMessage(&Msg); 
} 
return Msg.wParam; 
0

Puede utilizar CString como producto intermedio:

std::string example = "example"; 
CString cStrText = example.c_str(); 
LPTSTR exampleText = cStrText.GetBuffer(0);