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?
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
)
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é).
Il existe une fonction sur std :: string c_str () . Cependant, je doute que vous ne puissiez pas utiliser std :: string dans votre cas.
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 ().
Exécutez-vous somestringvariablename.c_str()
? Cela devrait fonctionner.
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 ().