¿Cómo convierto de std :: wstring _TCHAR []?
-
09-10-2019 - |
Pregunta
Estoy usando una biblioteca y me envía std::wstring
de una de sus funciones, y la otra biblioteca que requiere _TCHAR []
que se enviará a ella. ¿Cómo puedo convertir él?
Solución
Si se asume que está utilizando Unicode acumulación, std :: wstring.c_str () es lo que necesita. Tenga en cuenta que c_str () garantiza que la cadena que devuelve es terminada en nulo.
por ejemplo.
void func(const wchar_t str[])
{
}
std::wstring src;
func(src.c_str());
Si está utilizando no Unicode de construcción, que necesita para convertir la cadena Unicode no es la cadena Unicode a través de WideCharToMultiByte .
Otros consejos
@Zach Saw Dicho esto, si usted construye sólo para Unicode puede salirse con la std::wstring.c_str()
, pero conteptually sería mejor definir un tstring
(un typedef
para std::basic_string<TCHAR>
) por lo que puede de manera segura el uso este tipo de cadena sin problemas con todas las funciones de Windows y una biblioteca que esperan TCHAR
s 1 .
Para la diversión adicional que debe definir también todas las demás instalaciones de cadena C ++ relacionada para TCHAR
s, y crear funciones de conversión std::string
/ std::wstring
<=> tstring
.
Afortunadamente, este trabajo ya está hecho; ver aquí y < a href = "http://smartwin.cvs.sourceforge.net/viewvc/smartwin/SmartWin/SmartUtil/StringConversion.h?view=markup" rel = "nofollow"> aquí .
- función de biblioteca En realidad hay compilado realmente puede esperar una
TCHAR *
, yaTCHAR
s se resuelven comochar
s owchar_t
s en tiempo de compilación, pero tuvo la idea.
Utilice el ATL y MFC cadena de conversión de macros . Esto funciona independientemente de si se está compilando en modo _UNICODE
o ANSI.
Puede utilizar estas macros, incluso si no está utilizando MFC. Sólo incluir los dos encabezados ATL que se muestran en este ejemplo:
#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;
}