web-dev-qa-db-fra.com

ne peut pas convertir de 'std :: string' en 'LPSTR'

Comme je ne passe pas LPCSTR d’une fonction à une autre (les données sont modifiées), j’ai essayé de le transmettre sous forme de chaîne.

Mais plus tard, je dois le reconvertir en LPSTR. En essayant la conversion, j'obtiens l'erreur ci-dessus:

ne peut pas convertir de 'std :: string' en 'LPSTR'

Comment puis-je résoudre ça?

19
Simsons

C'est juste parce que vous devriez utiliser std::string::c_str() method.

Mais cela implique const_cast dans un cas donné car const char * renvoyé par c_str() ne peut pas être affecté à une variable LPSTR non constante.

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

Mais vous devez être sûr que la durée de vie de str sera plus longue que celle de la variable LPTSTR.

Une autre mention, si le code est compilé en conformité avec Unicode, les types LPTSTR et std::string sont incompatibles. Vous devriez utiliser std::wstring à la place.

Remarque importante: Si vous passez le pointeur résultant s d'en haut à une fonction qui tente de modifier les données pointées, le comportement sera indéfini. Le seul moyen de le gérer correctement est de dupliquer la chaîne dans un tampon non-const (par exemple, via strdup)

25
Keynslug

Si vous avez besoin d'une LPSTR, cela signifie que la chaîne sera/peut être modifiée. std::string::c_str() renvoie un pointeur const et vous ne pouvez pas simplement le remplacer par const_cast et espérez que tout va bien dans le monde, car ce n'est pas le cas. La chaîne peut être changée de toutes sortes de manières, et votre std::string original sera inconscient pour chacun d'eux.

Essayez ceci à la place:

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

Enroulez la chaîne dans un pointeur intelligent et débarrassez-vous du try...catch pour obtenir des points bonus (n'oubliez pas le deleter personnalisé).

7
Pedro d'Aquino

Il existe une fonction sur std :: string c_str () . Cependant, je doute que vous ne puissiez pas utiliser std :: string dans votre cas. 

1
rerun

Si la fonction que vous appelez n'écrit pas dans chaîne, mais la lit seulement, vous pouvez simplement utiliser la méthode string :: c_str. S'il doit écrire quelque chose, vous devriez probablement vous assurer que votre chaîne a suffisamment d'espace en appelant string :: reserve ().

0
ironic

Exécutez-vous somestringvariablename.c_str()? Cela devrait fonctionner.

0
Prof. Falken

Un LPSTR peut être remplacé par en utilisant un TCHAR (c'est-à-dire trouvé dans tchar.h). Donc si vous avez un std :: string, vous pouvez utiliser la méthode std :: string :: c_str ().

0
C Johnson