Ich benutze eine Bibliothek und sendet mir std::wstring
von einer seiner Funktionen, und eine andere Bibliothek, die _TCHAR []
erfordert, um es gesendet werden. Wie kann ich es konvertieren?Wie konvertiere ich aus std :: wstring _TCHAR []?
Antwort
Angenommen, Sie verwenden Unicode-Build, std :: wstring.c_str() ist, was Sie brauchen. Beachten Sie, dass c_str() garantiert, dass die zurückgegebene Zeichenfolge nullterminiert ist.
z.B.
void func(const wchar_t str[])
{
}
std::wstring src;
func(src.c_str());
Wenn Sie Nicht-Unicode verwenden bauen, werden Sie die Unicode-Zeichenfolge nicht Unicode-String über WideCharToMultiByte konvertieren müssen.
Als @Zach Saw gesagt, wenn Sie nur für Unicode bauen Sie mit std::wstring.c_str()
weg, aber conteptually wäre es besser, eine definieren tstring
(a typedef
für std::basic_string<TCHAR>
), so können Sie diese Art von String sicher verwenden einwandfrei mit allen Windows- und Bibliotheksfunktionen, die TCHAR
s erwarten.
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
.
Glücklicherweise wurde diese Arbeit bereits erledigt; siehe here und here.
- Eigentlich kann keine kompilierten Bibliotheksfunktion erwarten wirklich ein
TCHAR *
, daTCHAR
s alschar
s oderwchar_t
s bei der Kompilierung aufgelöst werden, aber du auf die Idee kam.
Eine C++ - Bibliothek konnte ein 'TCHAR *' erwarten. Immerhin hat C++ den Argumenttyp überladen. Es wäre ein ungewöhnlicher Build, aber MSVCs Name Mangling kann damit umgehen. Die meisten Win32-DLLs erwarten auch einen TCHAR, obwohl der Name Mangling über die Suffix-Makros "A/W" eingerichtet wird. – MSalters
Eine kompilierte C++ - Bibliothek kann 'TCHAR *' nicht erwarten, sie wird zwei separate (überladene) Funktionen haben, eine akzeptiert 'char *' und eine akzeptiert 'wchar_t *', sonst könnte sie nicht mit Projekten arbeiten, die mit anderen Einstellungen kompiliert wurden das '_UNICODE' Makro. Das war es, was ich mit meiner Notiz beabsichtigte. –
Verwenden Sie die ATL and MFC String Conversion Macros. Dies funktioniert unabhängig davon, ob Sie in _UNICODE
oder ANSI-Modus kompilieren.
Sie können diese Makros auch verwenden, wenn Sie MFC nicht verwenden. Fügen Sie einfach die zwei ATL-Header ein, die in diesem Beispiel gezeigt werden:
#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;
}
Wird die andere Bibliothek eine ** const ** _TCHAR [] akzeptieren? D. h., Beabsichtigt sie, die Daten zu ändern? Wenn dies der Fall ist, könnte es möglicherweise die Daten ** verlängern? –
Ja, ein const _TCHAR [] ist in Ordnung. Es ist nicht beabsichtigt, die Daten zu ändern. – coolface
Was ist _TCHAR? _TCHAR wird in einem Unicode-Build als wchar_t definiert, aber als Zeichen in einem nicht-Unicode-Build. –