Comment puis-je convertir de _TCHAR std :: wstring []?
-
09-10-2019 - |
Question
J'utilise une bibliothèque et me envoie std::wstring
d'une de ses fonctions, et une autre bibliothèque qui nécessite _TCHAR []
à être envoyée. Comment puis-je convertir?
La solution
En supposant que vous utilisez build Unicode, std :: wstring.c_str () est ce que vous avez besoin. Notez que c_str () garantit que la chaîne retourne est terminée par NULL.
par exemple.
void func(const wchar_t str[])
{
}
std::wstring src;
func(src.c_str());
Si vous utilisez la construction non-Unicode, vous devez convertir la chaîne Unicode en chaîne non Unicode via WideCharToMultiByte .
Autres conseils
@Zach Saw dit, si vous construisez seulement pour Unicode, vous pouvez sortir avec std::wstring.c_str()
, mais conteptually il serait préférable de définir un tstring
(un typedef
pour std::basic_string<TCHAR>
) afin que vous puissiez utiliser en toute sécurité ce genre de chaîne parfaitement avec toutes les fonctions de Windows et de bibliothèque qui attendent TCHAR
s 1 .
Pour le plaisir supplémentaire vous devez définir également toutes les autres installations C ++ liées à la chaîne pour TCHAR
s et créer des fonctions de conversion std::string
/ std::wstring
tstring
<=>.
Heureusement, ce travail a déjà été fait; voir ici et < a href = "http://smartwin.cvs.sourceforge.net/viewvc/smartwin/SmartWin/SmartUtil/StringConversion.h?view=markup" rel = "nofollow"> .
- peut vraiment attendre En fait aucune fonction bibliothèque compilé une
TCHAR *
, puisqueTCHAR
s sont résolus commechar
s ouwchar_t
s au moment de la compilation, mais vous eu l'idée.
Utilisez le ATL et macros MFC chaîne de conversion . Cela fonctionne indépendamment du fait que vous compilez en mode _UNICODE
ou ANSI.
Vous pouvez utiliser ces macros même si vous n'utilisez pas MFC. Il suffit d'inclure les deux têtes ATL représentés dans cet exemple:
#include <string>
#include <Windows.h>
#include <AtlBase.h>
#include <AtlConv.h>
int main()
{
std::wstring myString = L"Hello, World!";
// Here is an ATL string conversion macro:
CW2T pszT(myString.c_str());
// pszT is now an object which can be used anywhere a `const TCHAR*`
// is required. For example:
::MessageBox(NULL, pszT, _T("Test MessageBox"), MB_OK);
return 0;
}