Domanda

Io sto usando una biblioteca e mi manda std::wstring da una delle sue funzioni, e un'altra libreria che richiede _TCHAR [] da inviare ad esso. Come posso convertire?

È stato utile?

Soluzione

Supponendo che si sta utilizzando Unicode accumulo, std :: wstring.c_str () è quello che ti serve. Si noti che c_str () garantisce che la stringa restituisce è terminata da null.

per es.

void func(const wchar_t str[])
{
}

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

Se si utilizza accumulo non Unicode, è necessario convertire la stringa Unicode per stringa non Unicode tramite WideCharToMultiByte .

Altri suggerimenti

@Zach Sega Detto questo, se si costruisce solo per Unicode si può ottenere via con std::wstring.c_str(), ma conteptually sarebbe meglio definire un tstring (un typedef per std::basic_string<TCHAR>) in modo da poter utilizzare in sicurezza questo tipo di corda perfettamente con tutte le funzioni di Windows e la biblioteca, che si aspettano TCHARs 1 .

Per il divertimento aggiuntivo che si dovrebbe definire anche tutte le altre strutture a corda C-correlato ++ per TCHARs, e creare funzioni di conversione std::string / std::wstring <=> tstring.

Per fortuna, questo lavoro è già stato fatto; vedi qui e < a href = "http://smartwin.cvs.sourceforge.net/viewvc/smartwin/SmartWin/SmartUtil/StringConversion.h?view=markup" rel = "nofollow"> qui .


  1. In realtà no compilato funzione di libreria può davvero aspettarsi un TCHAR *, dal momento che TCHARs sono risolti come chars o wchar_ts in fase di compilazione, ma è venuta l'idea.

Utilizza la ATL e MFC String conversione macro . Questo funziona indipendentemente dal fatto che si sta compilando in modalità _UNICODE o ANSI.

È possibile utilizzare queste macro, anche se non si sta utilizzando MFC. Basta inserire le due intestazioni ATL mostrati in questo esempio:

#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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top