2010-10-11 35 views
17

Como no clould paso LPCSTR de una función a otra (Los datos se cambian) Traté de pasarlo como una cadena.no se puede convertir de 'std :: string' a 'LPSTR'

Pero después necesito volver a convertirlo a LPSTR. Al intentar la conversión recibo el error anterior:

cannot convert from 'std::string' to 'LPSTR'

¿Cómo puedo resolver esto?

+0

¿Cómo están intentando la conversión? –

Respuesta

23

eso es sólo porque se debe utilizar std::string::c_str() método.

Pero esto implica const_cast en caso dado, porque const char * devuelto por c_str() no se puede asignar a un no constante LPSTR.

std::string str = "something"; 
LPSTR s = const_cast<char *>(str.c_str()); 

Pero usted debe estar seguro de que toda la vida de str será más larga que la de LPTSTR variable.

Otra mención, si el código se compila como compatible con Unicode, entonces los tipos LPTSTR y std::string son incompatibles. Debería usar std::wstring en su lugar.

Nota importante: Si pasa el puntero resultante s desde arriba a una función que intenta modificar los datos que apunta a este dará lugar a un comportamiento indefinido. La única forma de tratarlo adecuadamente es duplicar la cadena en un búfer no const (por ejemplo, a través de strdup)

+0

@Keynslug, finalmente resolvió mi problema.Pero por qué esto (const_cast :) horrible – Simsons

+1

El último párrafo es incorrecto también, LPSTR es * siempre * char *, incluso en una compilación Unicode. Estás hablando de LPTSTR. –

+0

@ereOn Mencionó sobre 'const_cast' mientras escribía la respuesta, pero se eliminó la mención de por qué. Pero ¿por qué 'const_cast (str.c_str())' es un comportamiento indefinido? ¿Es correcto porque no podemos garantizar que la duración de 'str' será más larga que la de la variable' LPTSTR'? – Keynslug

0

¿Está ejecutando somestringvariablename.c_str()? Eso debería funcionar.

1

Hay una función en std::string c_str(). Sin embargo, dudo que no puedas usar std :: string en tu caso.

+0

Si el OP está llamando a una API de Win32, no puede usar 'std :: string' directamente. –

+0

Lo leí como dos funciones que escribió. Dado que no se puede pasar una std :: cadena en cualquier función API de Windows sin conversión de todos modos. – rerun

0

Un LPSTR puede estar sustituido con utilizando un TCHAR (es decir, que se encuentra en tchar.h). Entonces, si tiene std :: string, puede usar el método std :: string :: c_str().

0

Si la función, que está llamando no escribe en la secuencia, pero sólo lo lee, a continuación, puede simplemente usar método de cadena :: c_str. Si va a escribir algo, entonces probablemente debería asegurarse de que su cadena tenga suficiente espacio llamando a string :: reserve().

5

Si necesita un LPSTR, eso significa que la cadena se podrá/puede modificar. std::string::c_str() devuelve un puntero const, y no puede simplemente const_cast alejarse y esperar que todo esté bien en el mundo, porque no lo es. La cadena se puede cambiar en todo tipo de formas desagradables, y su std::string original será ajeno a todos ellos.

probar este lugar:

// myFunction takes an LPSTR 
std::string cppString = "something"; 
LPSTR cString = strdup(cppString.c_str()); 
try { 
    myFunction(cString); 
    cppString = cString; 
} catch(...) { 
    free(cString); 
} 

Envuelva la cadena en un puntero inteligente y deshacerse de la try...catch de puntos de bonificación (no se olvide el Deleter personalizado).

Cuestiones relacionadas