2010-12-07 9 views
0

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 []?

+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? –

+0

Ja, ein const _TCHAR [] ist in Ordnung. Es ist nicht beabsichtigt, die Daten zu ändern. – coolface

+1

Was ist _TCHAR? _TCHAR wird in einem Unicode-Build als wchar_t definiert, aber als Zeichen in einem nicht-Unicode-Build. –

Antwort

2

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.

0

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.


  1. Eigentlich kann keine kompilierten Bibliotheksfunktion erwarten wirklich ein TCHAR *, da TCHAR s als char s oder wchar_t s bei der Kompilierung aufgelöst werden, aber du auf die Idee kam.
+0

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

+0

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. –

0

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; 
}