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?

Était-ce utile?

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

Pour le plaisir supplémentaire vous devez définir également toutes les autres installations C ++ liées à la chaîne pour TCHARs 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"> .


  1. peut vraiment attendre En fait aucune fonction bibliothèque compilé une TCHAR *, puisque TCHARs sont résolus comme chars ou wchar_ts 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top