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 sicurezzaNota 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

87zae4a3.collapse_all(it-it,VS.110).gifCodice

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

87zae4a3.collapse_all(it-it,VS.110).gifUn 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.

87zae4a3.collapse_all(it-it,VS.110).gifUtilizzo 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);
}

87zae4a3.collapse_all(it-it,VS.110).gifRequisiti

Header file: AtlBase.h, AtlConv.h dichiarato in AtlConv.h)

Vedere anche

Riferimenti

Macro per la conversione delle stringhe di TEXTMETRIC e di DEVMODE

Altre risorse

Macro ATL