Macro per la conversione delle stringhe MFC e ATL
Le macro per la conversione delle stringhe illustrate di seguito sono valide sia per ATL a MFC.Per ulteriori informazioni sulla conversione delle stringhe MFC, vedere TN059: Utilizzando le macro di conversione MFC MBCS/Unicode e macro MFC e Globals.
Classi e macro di conversione di stringhe ATL 7,0
Macro per la conversione delle stringhe ATL 3,0
Classi e macro di conversione di stringhe ATL 7,0
ATL 7,0 sono state introdotte diverse nuove classi e macro di conversione, fornendo i miglioramenti significativi nelle macro esistenti.
I nomi delle nuove classi e macro di conversione di stringhe hanno il formato:
CSourceType2[C]DestinationType[EX]
Dove:
SourceType e DestinationType sono descritti nella tabella riportata di seguito.
[C] è presente quando il tipo di destinazione deve essere costante.
[EX] è il conto quando la dimensione iniziale del buffer deve essere specificata come argomento di modello.
SourceType/DestinationType
Descrizione
A
Stringa di caratteri ANSI.
W
Stringa di caratteri unicode.
T
Stringa di caratteri generica (equivalente a W quando il _UNICODE è definito, equivalente a Un diverso).
OLE
Stringa di caratteri OLE (equivalente a Lav).
Ad esempio, convertire una stringa Unicode a una stringa generica senza modificare la stringa convertita, utilizzare CW2CT.
Se è noto che la stringa convertita è improbabile che sia più di 64 caratteri, la versione EX, come CW2CTEX<64>, può essere utilizzata per risparmiare spazio nello stack.
[!NOTA]
La modalità consigliata della conversione da e in stringhe BSTR è utilizzare la classe CComBSTR.Per convertire un BSTR, passare la stringa esistente al costruttore CComBSTR. Per convertire un BSTR, utilizzare COLE2[C]DestinationType[EX], come COLE2T.
Le nuove classi di conversione che richiedono un utilizzo del buffer (CA2AEX, CA2WEX, CW2AEXe CW2WEX) un buffer statico a dimensione fissa archiviare il risultato della conversione.Se il risultato è troppo grande per inserire nel buffer statico, la classe alloca memoria utilizzando malloc, liberando memoria quando l'oggetto area di validità.In questo modo, a differenza delle macro precedenti di conversione di testo, queste classi siano protetti da utilizzare nei cicli e non superano lo stack.
Le macro di conversione introdotte in ATL 7,0 sono ottimizzate per essere supporto delle stringhe null di input.Queste macro restituiranno NULL se il parametro di input è NULL senza alcuna allocare memoria.
Per impostazione predefinita, le classi di conversione ATL e le macro utilizzeranno la tabella codici ANSI del thread corrente per la conversione.Se si desidera eseguire l'override del comportamento per una specifica conversione utilizzando le macro basate sulle classi CA2WEX o CW2AEX, specificare la tabella codici come secondo parametro al costruttore per la classe.
Nota sulla sicurezza |
---|
Controllare la lunghezza delle stringhe prima di passarli a queste macro per evitare problemi di sovraccarico del buffer potenziali.Gli overflow dello stack sono eccezioni che potrebbero essere rilevate con provare a eccezione di. |
Esistono numerose differenze rilevanti tra macro per la conversione delle stringhe più recenti e le nuove classi di conversione di stringhe:
Macro recenti di conversione ATL 3,0 |
Nuove classi di conversione ATL 7,0 |
---|---|
Alloca memoria sullo stack. |
Memoria dello stack per piccole stringhe.Utilizza l'heap se lo stack non è sufficiente. |
La stringa viene liberata quando la funzione è uscita. |
La stringa viene liberata quando la variabile area di validità. |
Non può essere utilizzato nei gestori di eccezioni. |
Può essere utilizzato nei gestori di eccezioni. |
Non appropriato per l'utilizzo nei cicli.L'utilizzo di memoria si ingrandisce fino a terminare la funzione. |
I contenuti multimediali vengono utilizzati nei cicli.L'ambito del ciclo assicura che la memoria liberata in ogni iterazione. |
Non valida per le stringhe di grandi dimensioni.Lo spazio dello stack è limitato. |
Nessun problema con le stringhe di grandi dimensioni.Le stringhe vengono allocate nell'heap. |
Generalmente richiedono USES_CONVERSION per essere definito. |
Non richiedere mai USES_CONVERSION per essere definito. |
Il significato di OLE dipende dalla definizione di OLE2ANSI. |
OLE è sempre equivalente a. W. |
Esempio
Codice
//Example 1
// Convert LPCWSTR to LPCSTR.
void ExampleFunction1(LPCWSTR pszW)
{
// Create an instance of CW2A, called pszA,
// and initialize it with pszW.
CW2A pszA(pszW);
// pszA works like an LPCSTR, and can be used thus:
ExampleFunctionA(pszA);
// Note: pszA will become invalid when it goes out of scope.
}
// Example 2
// Use a temporary instance of CW2A.
void ExampleFunction2(LPCWSTR pszW)
{
// Create a temporary instance of CW2A,
// and initialize it with pszW.
ExampleFunctionA(CW2A(pszW));
// Note: the temporary instance becomes invalid
// after the execution of the statement above.
}
// Example 3
// Incorrect use of conversion macros.
void ExampleFunction3(LPCWSTR pszW)
{
// Create a temporary instance of CW2A,
// save a pointer to it and then delete
// the temportary instance.
LPCSTR pszA = CW2A(pszW);
// The pszA in the following line is an invalid pointer,
// as the instance of CW2A has gone out of scope.
ExampleFunctionA(pszA);
}
Un avviso riguardo le istanze della classe temporanee
Deve essere sollecitato che l'esempio seguente non costituisce un codice:
LPCTSTR szr = CA2T(szReplaceFile);
Utilizzando le macro ATL 3,0, è accettabile da utilizzare:
LPCTSTR szr = A2T(szReplaceFile);
poiché la memoria allocata da funzioni di conversione non viene liberata fino a terminare la funzione corrente.Lo stesso codice non funziona con le nuove classi.
Questo codice:
LPCTSTR szr = CA2T(szReplaceFile);
equivale al seguente:
LPCTSTR szr;
{
CA2T temp(szReplaceFile);
szr = temp.operator LPTSTR();
}
Quali la memoria allocata dall'oggetto temporaneo e restituita dall'operatore di cast eliminato all'oggetto temporaneo viene eliminato, utilizzando il valore in szr avrà risultati indesiderati.
Invece, utilizzare il codice seguente:
CA2T szr(szReplaceFile);
L'operatore di cast simile all'oggetto di CA2T a LPCTSTR.
Utilizzo avanzato
Le dimensioni del buffer statiche predefinite sono 128 caratteri.Se le dimensioni del buffer devono essere modificate per una specifica conversione, utilizzare il EX versione di una macro e specificare le dimensioni del buffer come argomento di modello.
// Example 4
// Changing the size of the buffer.
void ExampleFunction4(LPCWSTR pszW)
{
// Use a 16-character buffer.
ExampleFunctionA(CW2AEX<16>(pszW));
}
Di seguito è riportato un esempio di specificare la tabella codici come secondo parametro al costruttore per la classe.
// Example 5
// Specifying the code page.
void ExampleFunction5(LPCWSTR pszW)
{
// Convert to the Macintosh code page
ExampleFunctionA(CW2A(pszW, CP_MACCP));
}
Macro per la conversione delle stringhe ATL 3,0
Le macro di conversione del testo di origine sono tuttavia disponibili e vengono elencate nella tabella seguente:
Macro per la conversione delle stringhe ATL 3,0
A2BSTR |
OLE2A |
T2A |
W2A |
A2COLE |
OLE2BSTR |
T2BSTR |
W2BSTR |
A2CT |
OLE2CA |
T2CA (deprecata.Utilizzo T2CA_EX o CT2CA invece.) |
W2CA |
A2CW |
OLE2CT |
T2COLE |
W2COLE |
A2OLE |
OLE2CW |
T2CW |
W2CT |
A2T |
OLE2T |
T2OLE |
W2OLE |
A2W |
OLE2W |
T2W |
W2T |
La sintassi per l'utilizzo di queste macro è la seguente:
MACRONAME( string_address )
Di seguito è riportato un esempio:
A2W(lpa);
I nomi di macro, il tipo della stringa di origine si trova a sinistra, ad esempio A) e il tipo della stringa di destinazione è a destra (ad esempio, Lav).A corrisponde a LPSTR, OLE corrisponde a LPOLESTR, T corrisponde a LPTSTRe ai supporti W per LPWSTR.
Se esiste C il nome della macro, la conversione delle macro in una stringa const.Ad esempio, W2CA converte LPWSTR a LPCSTR.
Pertanto, A2W converte LPSTR a LPWSTR, OLE2T converte LPOLESTR a LPTSTR, e così via.
Il comportamento delle macro per la conversione delle stringhe ATL dipende dalla direttiva del compilatore in effetti, se presente.Se l'origine e i tipi di destinazione sono uguali, nessuna conversione ha luogo.Direttive T di modifica e OLE del compilatore come segue:
Direttiva del compilatore attiva |
Diventa t |
OLE diventa |
---|---|---|
Nessuno |
A |
W |
_UNICODE |
W |
W |
OLE2ANSI |
A |
A |
_UNICODE e OLE2ANSI |
W |
A |
La stringa di destinazione viene creata utilizzare _alloca, salvo quando il tipo di destinazione è BSTR.Utilizzare _alloca alloca memoria dallo stack, in modo che quando i funzione restituisce, viene automaticamente pulito.Per impostazione predefinita questa macro convertirà solo fino a 500KB contemporaneamente.
Quando si utilizza una macro per la conversione delle stringhe ATL, specificare la macro USES_CONVERSION all'inizio della funzione per evitare errori del compilatore.Di seguito è riportato un esempio:
void StringFunc(LPSTR lpsz)
{
USES_CONVERSION;
LPWSTR x = A2W(lpsz);
// Do something with x
wprintf_s(L"x is %s", x);
}
Requisiti
Header file: AtlBase.h, AtlConv.h dichiarato in AtlConv.h)
Vedere anche
Riferimenti
Macro per la conversione delle stringhe di TEXTMETRIC e di DEVMODE