Frage

Ich verwende eine Bibliothek und schickt mir von einem seiner Funktionen std::wstring, und eine andere Bibliothek, die _TCHAR [] erfordert, um es zu senden. Wie kann ich es umwandeln?

War es hilfreich?

Lösung

Angenommen, Sie sind mit Unicode-Build, std :: wstring.c_str () ist das, was Sie brauchen. Beachten Sie, dass c_str () garantiert, dass die Zeichenkette, die es zurückgibt, ist nullterminierte.

z.

void func(const wchar_t str[])
{
}

std::wstring src;
func(src.c_str());

Wenn Sie Nicht-Unicode-Build verwenden, müssen Sie die Unicode-Zeichenfolge nicht Unicode-String über WideCharToMultiByte .

Andere Tipps

Wie @Zach Saw sagte, wenn Sie nur für Unicode bauen Sie mit std::wstring.c_str() weg, aber conteptually wäre es besser, eine tstring (eine typedef für std::basic_string<TCHAR>) zu definieren, so können Sie sicher nutzen diese Art von String einwandfrei mit allen Windows- und Bibliotheksfunktionen, die TCHARs 1 .

erwarten

Für zusätzlichen Spaß sollten Sie definieren auch alle anderen String bezogene C ++ Einrichtungen für TCHARs und Konvertierungsfunktionen erstellen std::string / std::wstring <=> tstring.

Zum Glück hat diese Arbeit bereits getan worden; finden Sie unter hier und < a href = "http://smartwin.cvs.sourceforge.net/viewvc/smartwin/SmartWin/SmartUtil/StringConversion.h?view=markup" rel = "nofollow"> hier .


  1. Eigentlich nicht kompilierten Bibliotheksfunktion wirklich TCHAR * erwarten kann, da TCHARs als chars oder wchar_ts bei der Kompilierung aufgelöst werden, aber Sie haben die Idee.

Mit dem ATL und MFC String Conversion Makros . Dies funktioniert unabhängig davon, ob Sie in _UNICODE oder ANSI-Modus kompilieren.

Sie können diese Makros verwenden, auch wenn Sie nicht MFC verwenden. Gerade sind die beiden ATL-Headern in diesem Beispiel gezeigt:

#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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top