Partager via


Macros de conversion de chaînes ATL et MFC

Les macros de conversion de chaînes traitées ici sont valides pour ATL et MFC.Pour plus d'informations sur la conversion de chaînes MFC, consultez TN059 : Utilisation des macros de conversion MFC MBCS/Unicode et le macro MFC et Globals.

  • ATL 7,0 classes et macros de conversion de chaînes

  • ATL 3,0 macros de conversion de chaînes

ATL 7,0 classes et macros de conversion de chaînes

ATL 7,0 présente plusieurs nouvelles classes et macros de conversion, apportant des améliorations significatives sur les macros existantes.

Les noms des nouvelles classes et macros de conversion de chaînes prennent la forme :

CSourceType2C[] []EXDestinationType

où :

  • SourceType et DestinationType sont décrits dans le tableau ci-dessous.

  • []Cest le présent lorsque le type de destination doit être constant.

  • []EXest le présent lorsque la taille de la mémoire tampon doit être spécifiée comme argument template.

    SourceType/DestinationType

    Description

    A

    Chaîne de caractères ANSI.

    W

    Chaîne de caractères Unicode.

    T

    Chaîne de caractères génériques (équivalente à W _UNICODE lorsque le est défini, équivalente à sinon).

    OLE

    OLE chaîne de caractères (équivalente à W).

Par exemple, pour convertir d'une chaîne Unicode en une chaîne générique sans modifier la chaîne convertie, utilisez CW2CT.

Si on sait que la chaîne convertie est peu susceptible d'être plus de 64 caractères, la version de EX , telle que CW2CTEX<64>, peut être utilisée pour économiser de l'espace sur la pile.

[!REMARQUE]

La méthode recommandée pour convertir vers et depuis des chaînes BSTR est d'utiliser la classe de CComBSTR .Pour convertir BSTR, passez la chaîne existante au constructeur de CComBSTR. Pour convertir BSTR, utilisez COLE2CDestinationType[] []EX, telles que COLE2T.

Les nouvelles classes de conversion qui requièrent une utilisation de la mémoire tampon (CA2AEX, CA2WEX, CW2AEX, et CW2WEX) un tampon statique de taille fixe d'enregistrer le résultat de la conversion.Si le résultat est trop grand pour s'insérer dans la mémoire tampon statique, la classe alloue de la mémoire à malloc, libération de la mémoire lorsque l'objet est hors de portée.Cela garantit que, contrairement aux macros plus anciennes de conversion de texte, ces classes sont sécurisées pour les utiliser dans les boucles et ne déborderont pas la pile.

Les macros de conversion introduites dans ATL 7,0 sont optimisées pour connaître les chaînes d'entrée de NULL .Ces macros retournent NULL si le paramètre d'entrée est NULL sans allouer toute mémoire.

Par défaut, les classes de conversion ATL et les macros utilisent la page de codes ANSI du thread actuel de la conversion.Si vous souhaitez substituer ce comportement pour une conversion spécifique à l'aide de macros en fonction de les classes CA2WEX ou CW2AEX, spécifiez la page de codes comme second paramètre au constructeur de la classe.

Note de sécuritéNote de sécurité

Vérifiez la longueur des chaînes avant de les passer à ces macros pour éviter les dépassements de mémoire tampon potentiels.Le dépassement de capacité de la pile sont des exceptions qui peuvent également être interceptées au test/exception.

Il existe plusieurs différences importantes entre les macros de conversion de chaînes plus anciennes et nouvelles classes de conversion de chaînes :

ATL ancien 3,0 macros de conversion

Nouvel ATL 7,0 classes de conversion

Alloue de la mémoire sur la pile.

Stockage de pile d'utilisation pour les petites chaînes.Utilise le tas si la pile n'est pas assez grand.

La chaîne est libérée lorsque la fonction est quittée.

La chaîne est libérée lorsque la variable hors de portée.

Ne peut pas être utilisé dans les gestionnaires d'exceptions.

Peut être utilisé dans les gestionnaires d'exceptions.

Non approprié pour une utilisation dans les boucles.L'utilisation de la mémoire se développe jusqu'à ce que la fonction est quittée.

Prend en charge les utilisent des boucles.La portée de la boucle garantit que la mémoire est libérée sur chaque itération.

Non bon pour les grandes chaînes.l'espace de pile est limité.

Aucun problèmes avec de grandes chaînes.Les chaînes sont alloués sur le tas.

Requièrent généralement d'USES_CONVERSION pour être défini.

N'avez besoin jamais d'USES_CONVERSION pour être défini.

La signification d'OLE dépend de la définition d'OLE2ANSI.

OLE est toujours équivalent au W.

Exemple

87zae4a3.collapse_all(fr-fr,VS.110).gifCode

//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(fr-fr,VS.110).gifUn avertissement concernant les instances de classe temporaires

Il doit noter que les éléments suivants n'est pas beaucoup de code :

LPCTSTR szr = CA2T(szReplaceFile);

À l'aide de ATL 3,0 macros, il est acceptable d'utiliser :

LPCTSTR szr = A2T(szReplaceFile);   

lorsque la mémoire allouée par les fonctions de conversion n'est pas libérée jusqu'à ce que la fonction active a été quittée.Le même code ne fonctionne pas avec les nouvelles classes.

Ce code :

LPCTSTR szr = CA2T(szReplaceFile);   

équivaut à ceci :

LPCTSTR szr;
{
   CA2T temp(szReplaceFile);
   szr = temp.operator LPTSTR();
}   

Comme mémoire allouée par l'objet temporaire et retournée par l'opérateur de cast est perdu lorsque l'objet temporaire est détruit, à l'aide de la valeur dans szr aura des résultats indésirables.

À la place, utilisez le code suivant :

CA2T szr(szReplaceFile);   

L'opérateur de cast est le ressembler d'objet de CA2T à LPCTSTR.

87zae4a3.collapse_all(fr-fr,VS.110).gifUtilisation avancée

La taille de mémoire tampon statique par défaut est 128 caractères.Si la taille de la mémoire tampon doit être modifiée pour une conversion spécifique, utilisez la version EX d'une macro, puis spécifiez la taille de mémoire tampon comme argument template.

// Example 4
// Changing the size of the buffer.
void ExampleFunction4(LPCWSTR pszW)
{
   // Use a 16-character buffer.
   ExampleFunctionA(CW2AEX<16>(pszW));
}

Voici un exemple de spécifier la page de codes comme second paramètre au constructeur de la classe.

// Example 5
// Specifying the code page.
void ExampleFunction5(LPCWSTR pszW)
{
   // Convert to the Macintosh code page
   ExampleFunctionA(CW2A(pszW, CP_MACCP));
}

ATL 3,0 macros de conversion de chaînes

Les macros de conversion de texte d'origine sont toujours disponibles et sont répertoriées dans le tableau ci-dessous :

ATL 3,0 macros de conversion de chaînes

A2BSTR

OLE2A

T2A

W2A

A2COLE

OLE2BSTR

T2BSTR

W2BSTR

A2CT

OLE2CA

T2CA (déconseillée.Utilisation T2CA_EX ou CT2CA à la place.)

W2CA

A2CW

OLE2CT

T2COLE

W2COLE

A2OLE

OLE2CW

T2CW

W2CT

A2T

OLE2T

T2OLE

W2OLE

A2W

OLE2W

T2W

W2T

La syntaxe d'utilisation de ces macros est la suivante :

MACRONAME( string_address )

Par exemple :

A2W(lpa);

Dans les noms de macros, le type chaîne source est située à gauche (par exemple, Un) et le type de chaîne de destination est à droite (par exemple, W).A représente LPSTR, OLE représente LPOLESTR, T représente LPTSTR, et en charge par W pour LPWSTR.

S'il existe C dans le nom de la macro, la macro convertit en chaîne const .Par exemple, W2CA convertit LPWSTR à LPCSTR.

Ainsi, A2W convertit LPSTR à LPWSTR, OLE2T convertit LPOLESTR à LPTSTR, et ainsi de suite.

Le comportement des macros de conversion de chaînes ATL en dépend de la directive du compilateur en effet, le cas échéant.Si la source et les types de destination sont identiques, aucune conversion n'a lieu.Modification T et OLE de directives de compilateur comme suit :

Directive du compilateur en effet

T devient

OLE devient

Aucun

A

W

_UNICODE

W

W

OLE2ANSI

A

A

_UNICODE et OLE2ANSI

W

A

La chaîne de destination est créée en utilisant _alloca, sauf lorsque le type de destination est BSTR.Utilisation du _alloca alloue de la mémoire en dehors de la pile, de sorte que lorsque votre fonction, elle soit automatiquement nettoyée.Par défaut cette macro convertira uniquement jusqu'à 500KB en même temps.

Lorsque vous utilisez une macro de conversion de chaînes ATL, spécifiez la macro d' USES_CONVERSION au début de la fonction pour éviter des erreurs du compilateur.Par exemple :

void StringFunc(LPSTR lpsz)
{
   USES_CONVERSION;

   LPWSTR x = A2W(lpsz);
   // Do something with x
   wprintf_s(L"x is %s", x);
}

87zae4a3.collapse_all(fr-fr,VS.110).gifConfiguration requise

Header file: AtlBase.h, AtlConv.h (déclaré dans AtlConv.h)

Voir aussi

Référence

Macros de conversion de chaînes de DEVMODE et de TEXTMETRIC

Autres ressources

Macros ATL