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?

¿Fue útil?

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 TCHARs 1 .

Para la diversión adicional que debe definir también todas las demás instalaciones de cadena C ++ relacionada para TCHARs, 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í .


  1. función de biblioteca En realidad hay compilado realmente puede esperar una TCHAR *, ya TCHARs se resuelven como chars o wchar_ts 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top