Wie konvertiere ich aus std :: wstring _TCHAR []?
-
09-10-2019 - |
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?
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 TCHAR
s 1 .
Für zusätzlichen Spaß sollten Sie definieren auch alle anderen String bezogene C ++ Einrichtungen für TCHAR
s 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 .
- Eigentlich nicht kompilierten Bibliotheksfunktion wirklich
TCHAR *
erwarten kann, daTCHAR
s alschar
s oderwchar_t
s 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;
}