Je recherche une méthode ou un extrait de code pour convertir std :: string en LPCWSTR
Je recherche une méthode ou un extrait de code pour convertir std :: string en LPCWSTR
Réponses:
Merci pour le lien vers l'article MSDN. Ceci est exactement ce que je cherchais.
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;
}
std::wstring stemp = s2ws(myString);
LPCWSTR result = stemp.c_str();
La solution est en fait beaucoup plus simple que n'importe laquelle des autres suggestions:
std::wstring stemp = std::wstring(s.begin(), s.end());
LPCWSTR sw = stemp.c_str();
Mieux encore, il est indépendant de la plateforme. h2h :)
reinterpret_cast
. Ce code ne fonctionne pas. Ne pas utiliser. .
char
est généralement codé en ANSI. Avec le codage ANSI, les valeurs 128 à 255 sont interprétées à l'aide de la page de codes actuellement active. Le fait de pousser ces valeurs dans un wchar_t
(encodage UTF-16 sous Windows) ne produira pas le résultat souhaité. Si vous voulez être précis, cela fonctionne dans exactement 50% des cas. En tenant compte du codage des caractères DBCS, ce pourcentage diminue encore.
Si vous êtes dans un environnement ATL / MFC, vous pouvez utiliser la macro de conversion ATL:
#include <atlbase.h>
#include <atlconv.h>
. . .
string myStr("My string");
CA2W unicodeStr(myStr);
Vous pouvez ensuite utiliser unicodeStr comme LPCWSTR. La mémoire pour la chaîne unicode est créée sur la pile et libérée, puis le destructeur pour unicodeStr s'exécute.
Au lieu d'utiliser une chaîne std :: string, vous pouvez utiliser une chaîne std :: wstring.
EDIT: Désolé, ce n'est pas plus explicatif, mais je dois courir.
Utilisez std :: wstring :: c_str ()
string myMessage="helloworld";
int len;
int slength = (int)myMessage.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, 0, 0);
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, buf, len);
std::wstring r(buf);
std::wstring stemp = r.C_str();
LPCWSTR result = stemp.c_str();
LPCWSTR lpcwName = std :: wstring (strname.begin (), strname.end ()). C_str ()