Macros de conversion de chaînes ATL et MFC
Les macros de conversion de chaînes présentées ici sont valides à la fois pour ATL et pour MFC. Pour plus d'informations sur la conversion des chaînes de MFC, consultez TN059 : Using MFC MBCS/Unicode Conversion Macros et MFC Macros and Globals.
Classes et macros de conversion de chaînes ATL 7.0
Macros de conversion de chaînes ATL 3.0
Classes et macros de conversion de chaînes ATL 7.0
ATL 7.0 introduit plusieurs nouvelles classes et macros de conversion, fournissant ainsi des améliorations significatives par rapport aux macros existantes.
Les noms des nouvelles classes et macros de conversion de chaînes ont la forme suivante :
CType_source2[C]Type_de_destination[EX]
où :
Type_source et Type_de_destination sont décrits dans le tableau ci-dessous.
[C] est présent quand le type de destination doit être constant.
[EX] est présent quand la taille initiale de la mémoire tampon doit être spécifiée comme argument de modèle.
Type_source/Type_de_destination
Description
A
Chaîne de caractères ANSI.
W
Chaîne de caractères Unicode.
T
Chaîne de caractères générique (équivalente à W quand _UNICODE est défini, sinon équivalente à A).
OLE
Chaîne de caractères OLE (équivalente à W).
Par exemple, pour convertir une chaîne Unicode en une chaîne générique sans changer la chaîne convertie, utilisez CW2CT.
Avertissement
Certaines des permutations du modèle répertoriées plus haut ne sont pas prises en charge.CA2CW et CW2CA (et CA2CWEX et CW2CAEX) ne sont pas pris en charge.Pour les conversions de chaînes de caractères OLE, seuls COLE2T et CT2OLE (et COLE2CT, COLE2TEX, COLE2CTEX, CT2COLE, CT2OLEEX et CT2COLEEX) sont pris en charge.Pour des détails, consultez atlconv.h.
S'il est peu probable que la chaîne convertie dépasse 64 caractères, la version de EX, comme CW2CTEX<64>, peut être utilisée pour gagner de l'espace sur la pile.
Notes
Le moyen recommandé de convertir vers et depuis des chaînes BSTR est d'utiliser la classe CComBSTR.Pour convertir vers une chaîne BSTR, passez la chaîne existante au constructeur de CComBSTR.Pour convertir depuis une chaîne BSTR, utilisez COLE2[C]DestinationType[EX], comme COLE2T.
Les nouvelles classes de conversion qui nécessitent une mémoire tampon (CA2AEX, CA2WEX, CW2AEX et CW2WEX) utilisent une mémoire tampon statique de taille fixe pour stocker le résultat de la conversion. Si le résultat est trop grand pour tenir dans la mémoire tampon statique, la classe alloue de la mémoire avec malloc et libère la mémoire quand l'objet passe en dehors de l'étendue. Ceci garantit que, au contraire des anciennes macros de conversion de texte, l'utilisation de ces classes dans des boucles est sécurisée et ne provoquera pas un dépassement de capacité de la pile.
Les macros de conversion introduites dans ATL 7.0 sont optimisées pour la prise en compte de l'entrée de chaînes NULL. Ces macros retournent NULL si le paramètre d'entrée est NULL sans allouer de mémoire.
Par défaut, les classes et macros de conversion ATL utilisent la page de codes ANSI du thread actif pour la conversion. Si vous voulez remplacer ce comportement pour une conversion spécifique en utilisant des macros basées sur les classes CA2WEX ou CW2AEX, spécifiez la page de codes comme second paramètre du constructeur pour la classe.
Note de sécurité |
---|
Vérifiez la longueur des chaînes avant de les passer à ces macros, pour éviter des problèmes potentiels de dépassement de capacité de la mémoire tampon.Les dépassements de capacité de la pile sont des exceptions qui peuvent aussi être interceptées avec try/except. |
Il existe plusieurs différences importantes entre les anciennes macros de conversion de chaînes et les nouvelles classes de conversion de chaînes :
Anciennes macros de conversion ATL 3.0 |
Nouvelles classes de conversion ATL 7.0 |
---|---|
Alloue de la mémoire sur la pile. |
Utilise la mémoire de la pile pour les petites chaînes. Utilise le tas si la pile n'est pas assez grande. |
La chaîne est libérée quand la fonction se termine. |
La chaîne est libérée quand la variable passe en dehors de l'étendue. |
Ne peut pas être utilisée dans des gestionnaires d'exceptions. |
Peut être utilisée dans les gestionnaires d'exceptions. |
Ne convient pas à une utilisation dans des boucles. L'utilisation de la mémoire croît jusqu'à ce que la fonction se termine. |
Prend en charge une utilisation dans des boucles. L'étendue des boucles garantit que la mémoire est libérée à chaque itération. |
Ne convient pas pour les chaînes de grande taille. L'espace de la pile est limité. |
Pas de problèmes avec les chaînes de grande taille. Les chaînes feront l'objet d'une allocation sur le tas. |
Requiert généralement USES_CONVERSION pour être définie. |
Ne requiert jamais USES_CONVERSION pour être définie. |
La signification d'OLE dépend de sa définition d'OLE2ANSI. |
OLE est toujours équivalent à W. |
Exemple
Code
//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);
}
Avertissement concernant les instances des classes temporaires
Nous voulons insister sur le fait que le code suivant n'est pas du bon code :
LPCTSTR szr = CA2T(szReplaceFile);
Avec les macros ATL 3.0, il était acceptable d'utiliser :
LPCTSTR szr = A2T(szReplaceFile);
car la mémoire allouée par les fonctions de conversion n'étaient pas libérées jusqu'à ce que la fonction se termine. Le même code ne fonctionne pas avec les nouvelles classes.
Ce code :
LPCTSTR szr = CA2T(szReplaceFile);
équivaut au code :
LPCTSTR szr;
{
CA2T temp(szReplaceFile);
szr = temp.operator LPTSTR();
}
Comme la mémoire allouée par l'objet temporaire et retournée depuis l'opérateur de cast est détruite quand l'objet temporaire est détruit, l'utilisation de la valeur dans szr produira des résultats indésirables.
Utilisez ce code à la place :
CA2T szr(szReplaceFile);
L'opérateur de cast fait que l'objet CA2T ressemble à un type LPCTSTR.
Utilisation avancée
La taille par défaut de la mémoire tampon statique est de 128 caractères. Si la taille de la mémoire tampon doit être changée pour une conversion spécifique, utilisez la version EX d'une macro et spécifiez la taille de la mémoire tampon comme argument du modèle.
// 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écification de la page de codes comme second paramètre pour un 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));
}
Macros de conversion de chaînes ATL 3.0
Les macros de conversion de texte d'origine sont toujours disponibles et sont répertoriées dans le tableau ci-dessous :
Macros de conversion de chaînes ATL 3.0
A2BSTR |
OLE2A |
T2A |
W2A |
A2COLE |
OLE2BSTR |
T2BSTR |
W2BSTR |
A2CT |
OLE2CA |
T2CA (Obsolète. Utilisez à la place T2CA_EX ou CT2CA.) |
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 des macros, le type de la chaîne source se trouve à gauche (par exemple A) et le type de la chaîne de destination se trouve à droite (par exemple W). A représente LPSTR, OLE représente LPOLESTR, T représente LPTSTR et W représente LPWSTR.
S'il existe un C dans le nom de la macro, cela signifie que la macro convertit en une chaîne const. Par exemple, W2CA convertit un type LPWSTR en un type LPCSTR.
Ainsi, A2W convertit un type LPSTR en un type LPWSTR, OLE2T convertit un type LPOLESTR en un type LPTSTR, etc.
Le comportement des macros de conversion de chaînes ATL dépend de la directive du compilateur qui est appliquée, le cas échéant. Si les types source et de destination sont les mêmes, aucune conversion n'est effectuée. Les directives du compilateur changent T et OLE comme suit :
Directive du compilateur appliquée |
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 avec _alloca, sauf quand le type de destination est BSTR. L'utilisation de _alloca alloue de la mémoire en dehors de la pile. Ainsi, quand votre fonction se termine, elle est automatiquement nettoyée. Par défaut, cette macro convertit jusqu'à 500 Ko en une fois.
Quand vous utilisez une macro de conversion de chaînes ATL, spécifiez la macro USES_CONVERSION au début de votre fonction pour éviter les erreurs de compilation. Par exemple :
void StringFunc(LPSTR lpsz)
{
USES_CONVERSION;
LPWSTR x = A2W(lpsz);
// Do something with x
wprintf_s(L"x is %s", x);
}
Spécifications
Fichier d'en-tête : 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