Comment convertir std :: wstring en LPCTSTR en C ++?
J'ai Windows valeur de clé de registre dans wstring
format. Maintenant, je veux passer à ce code (premier argument de chemin de javaw.exe):
std::wstring somePath(L"....\\bin\\javaw.exe");
if (!CreateProcess("C:\\Program Files\\Java\\jre7\\bin\\javaw.exe", <--- here should be LPCTSTR, but I have a somePath in wstring format..
cmdline, //Command line.
NULL, //Process handle not inheritable.
NULL, //Thread handle not inheritable.
0, //Set handle inheritance to FALSE.
CREATE_NO_WINDOW, //ON VISTA/WIN7, THIS CREATES NO WINDOW
NULL, //Use parent's environment block.
NULL, //Use parent's starting directory.
&si, //Pointer to STARTUPINFO structure.
&pi)) //Pointer to PROCESS_INFORMATION structure.
{
printf("CreateProcess failed\n");
return 0;
}
Comment puis-je le faire?
source d'informationauteur Ernestas Gruodis
Vous devez vous connecter pour publier un commentaire.
Simplement utiliser le
c_str
fonction destd::w/string
.Voir ici:
http://www.cplusplus.com/reference/string/string/c_str/
LPCTSTR
est une ancienne relique. C'est un hybride typedef que soit définitchar*
si vous utilisez multi-chaînes d'octets ouwchar_t*
si vous utilisez le format Unicode. Dans Visual Studio, cela peut être modifié dans le projet général de l'paramètres sous "Jeu de Caractères".Si vous êtes en utilisant Unicode, alors:
Si vous utilisez multi-octets, puis utiliser ce helper:
c'est à dire
std::wstring
àstd::string
qui contiendra multi-octets chaîne, puis àchar*
:Enfin décidé à utiliser CreateProcessW comme paulm mentionné avec un peu de corrections de valeurs doivent être coulé (sinon, j'obtiens le message d'erreur):
Le moyen le plus sûr lors de l'interaction de stdlib classes avec
TCHAR
s est d'utiliserstd::basic_string<TCHAR>
et surround premières cordes avec laTEXT()
macro (depuisTCHAR
peut être étroite ou large selon les paramètres du projet).Puisque vous ne gagnerez pas de style concours de ... une autre bonne méthode est d'utiliser explicitement le large ou étroit version d'un WinAPI fonction. E. g. dans ce cas particulier:
std::string
utilisationCreateProcessA
(qui utiliseLPCSTR
qui est une définition de type dechar*
)std::u16string
oustd::wstring
utilisationCreateProcessW
(qui utiliseLPCWSTR
qui est une définition de type dewchar_t*
qui est de 16 bits dans Windows)En C++17, vous pouvez faire: