Come si converte da std :: wstring _TCHAR []?
-
09-10-2019 - |
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?
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 TCHAR
s 1 .
Per il divertimento aggiuntivo che si dovrebbe definire anche tutte le altre strutture a corda C-correlato ++ per TCHAR
s, 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 .
- In realtà no compilato funzione di libreria può davvero aspettarsi un
TCHAR *
, dal momento cheTCHAR
s sono risolti comechar
s owchar_t
s 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;
}