2010-10-11 16 views
17

Dato che non posso passare LPCSTR da una funzione a un'altra (i dati vengono modificati) ho provato a passarlo come una stringa.non può convertire da "std :: string" a "LPSTR"

Ma dopo ho bisogno di riconvertire nuovamente in LPSTR. Mentre provo la conversione ricevo l'errore sopra riportato:

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

Come posso risolvere questo?

+0

Come stanno provando la conversione? –

risposta

23

Questo è solo perché è necessario utilizzare il metodo std::string::c_str().

Ma ciò comporta const_cast nel caso specifico perché const char * restituito da c_str() non può essere assegnato ad un non costante LPSTR.

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

Ma si deve essere sicuri che il corso della vita di str sarà più lungo di quello di LPTSTR variabile.

Un'altra menzione, se il codice viene compilato come conforme Unicode, quindi i tipi LPTSTR e std::string non sono compatibili. Dovresti usare invece std::wstring.

Nota importante: Se si passa il puntatore risultante s dall'alto ad una funzione che tenta di modificare i dati che punta a questo si tradurrà in un comportamento indefinito. L'unico modo per gestirlo correttamente è duplicare la stringa in un buffer non const (ad esempio tramite strdup)

+0

@Keynslug, Eventualmente risolto il mio problema.Ma perché è questo (const_cast :) orribile – Simsons

+1

Anche l'ultimo paragrafo è sbagliato, LPSTR è * sempre * char *, anche in una build Unicode. Stai parlando di LPTSTR. –

+0

@ereOn Citato su 'const_cast' durante la scrittura della risposta, ma rimosso la menzione in modo anomalo. Ma perché 'const_cast (str.c_str())' è un comportamento indefinito? È giusto perché non possiamo garantire che la durata di 'str' sarà più lunga di quella della variabile' LPTSTR'? – Keynslug

0

Stai correndo somestringvariablename.c_str()? Questo dovrebbe funzionare.

1

C'è una funzione su std::string c_str(). Comunque dubito che non potresti usare una std :: string nel tuo caso.

+0

Se l'OP chiama un'API Win32, non può usare direttamente 'std :: string'. –

+0

L'ho letto come due funzioni che ha scritto. Dal momento che non è possibile passare una std :: string in nessuna funzione di windows api senza conversione. – rerun

0

Un LPSTR può essere sostituito con un TCHAR (che si trova in tchar.h). Quindi se hai una std :: string, puoi usare il metodo std :: string :: c_str().

0

Se la funzione, che si sta chiamando, non scrive in stringa, ma la legge solo, è possibile utilizzare semplicemente il metodo string :: c_str. Se scriverà qualcosa, probabilmente dovresti assicurarti che la stringa abbia abbastanza spazio chiamando string :: reserve().

5

Se è necessario un LPSTR, significa che la stringa verrà/potrebbe essere modificata. std::string::c_str() restituisce un puntatore const e non si può semplicemente spingerlo via const_cast e sperare che tutto sia buono nel mondo, perché non lo è. La stringa può essere cambiata in tutti i tipi di modi cattivi, e il tuo originale std::string sarà ignaro di tutti loro.

Prova a modificare:

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

Avvolgere la stringa in un puntatore intelligente e di sbarazzarsi del try...catch per i punti bonus (non dimenticate il deleter personalizzato).

Problemi correlati