2009-07-29 19 views
11

¿Alguien puede ayudar en la conversión string a LPWSTRCómo convertir cadena a LPWSTR en C++

string command=obj.getInstallationPath()+"<some string appended>" 

Ahora i Wat para pasarlo como parámetro para CreateProcessW(xx,command,x...)

Pero createProcessW() sólo acepta LPWSTR por eso es necesario para emitir string a LPWSTR

Gracias de antemano

+1

http://stackoverflow.com/questions/27220/how-to-convert-stdstring-to-lpcwstr-in-c-unicode –

+1

@ArsenMkrt: Esta pregunta es más ancho que el que te refieres. – xtofl

Respuesta

12

Si tiene una cadena ANSI, ¿ha considerado llamar a CreateProcessA? Si hay una razón específica por la que necesita llamar al CreateProcessW, deberá convertir la cadena. Pruebe la función MultiByteToWideChar.

1

Se puede almacenar en un CString y llamar al operador LPWSTR en él:

const char* sz = "tadaaa"; 
const CString s(sz); 
LPCWSTR ws = static_cast<LPCWSTR>(s); //calling CString::operator (LPCWSTR)()const; 

Tenga en cuenta que el operador de conversión WSTR sólo está definido para Unicode construye.

+0

por favor no use moldes estilo C en C++ código de ejemplo –

+0

@mmutsz: tiene razón: no deberíamos hacer eso. Sin embargo, el modelo de estilo C sintácticamente se parece al operador de conversión. – xtofl

+0

LPCWSTR! = LPWSTR – Cobaia

5

La forma más fácil de convertir una cadena ansi en una cadena ancha (unicode) es usar string conversion macros.

Para usar esto, coloque USES_CONVERSION en la parte superior de su función, luego puede usar macros como A2W() para realizar la conversión muy fácilmente.

por ejemplo.

char* sz = "tadaaa"; 
CreateProcessW(A2W(sz), ...); 

Las macros asignan espacio en la pila, realizan la conversión y devuelven la cadena convertida.

+0

La documentación a la que hace referencia también dice que no necesita el USES_CONVERSION para ATL7.0 y posteriores. – xtofl

+0

sí, pero lo he estado usando durante tanto tiempo que lo agrego automáticamente :) – gbjbaanb

3

Además, es posible que desee considerar el uso de TCHAR largo ... Si estoy en lo cierto, la idea sería algo como esto:

typedef std::basic_string<TCHAR> tstring 

// Make any methods you control return tstring values. Thus, you could write: 
tstring command = obj.getInstallationPath(); 
CreateProcess(x, command.c_str(), ...); 

en cuenta que utilizamos en lugar de CreateProcessCreateProcessW o CreateProcessA. La idea es que si se define UNICODE, entonces TCHAR es typedef ed a WCHAR y CreateProcess es #define d ser CreateProcessW, que acepta un LPWSTR; pero si UNICODE no está definido, entonces TCHAR se convierte en char, y CreateProcess se convierte en CreateProcessA, que acepta LPSTR. Pero podría no tener los detalles aquí ... esto parece algo innecesariamente complicado :(

+0

De acuerdo, siempre uso tchar para este tipo de cosas. – derpface

+1

Solo use TCHAR para convertir software antiguo de Windows. Los únicos que tienen buenas razones para seguir usándolo son los escritores de documentación de Microsoft, cuando tienen ambas funciones, A y W. – Deduplicator

4

Otra forma:.

mbstowcs_s 

uso con string.c_str(), se pueden encontrar ejemplo here o here

O

USES_CONVERSION_EX; 

std::string text = "text"; 
LPWSTR lp = A2W_EX(text.c_str(), text.length()); 

O

{ 
    std::string str = "String to LPWSTR"; 
    BSTR b = _com_util::ConvertStringToBSTR(str.c_str()); 
    LPWSTR lp = b; 
    Use lp before SysFreeString... 
    SysFreeString(b); 
} 
+0

¿No es lo mismo que en la respuesta de @ gbjbaanb? http://stackoverflow.com/a/1198822/6610 – xtofl

+0

Tuve que cambiarlo un poco para que funcione: CComBSTR bstrDomain (csDomain); LPWSTR pszServerName = bstrDomain; NetWkstaGetInfo (pszServerName, dwLevel, (LPBYTE *) &pBuf); –

+0

'SysFreeString' desasigna la memoria, no se puede usar' lp' después –

1

Aquí hay otra opción.He estado usando esta función para hacer la conversión.

//C++ string to WINDOWS UNICODE string 
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; 
} 

Y envuelva su cadena de esta manera. s2ws (volume.c_str())

+0

Si que tiene una excepción, se creará una pérdida de memoria. – Jonathan

+0

@ Jonathan La pérdida de memoria se puede solucionar usando 'std :: vector buf (len);' en lugar de la línea 'new' –

+0

también hay un problema que si' s.size()> INT_MAX - 1 'you' Obtendré resultados falsos en el mejor de los casos: para hacer que esta función sea robusta, debe verificar eso y lanzar una excepción o tomar alguna otra acción bien definida. –

-1
#include "vcclr.h" //for PtrToStringChars 

// Convert function 
LPWSTR S2W(String^ string) { 
    pin_ptr<const wchar_t> wstr = PtrToStringChars(string); 
    return (LPWSTR)wstr; 
} 

// Example 
String^ s = "10.0.0.1"; 
LPWSTR psz = S2W(s);