Compartilhar via


Macros de conversão de cadeia de caracteres de ATL e de MFC

Macros de conversão de cadeia de caracteres discutidos aqui são válidos para ATL e MFC.Para obter mais informações sobre a conversão de cadeia de caracteres MFC, consulte TN059: Usando macros de conversão MFC MBCS/Unicode e Macros MFC e Globais.

  • Classes e macros de conversão de cadeia de caracteres de ATL 7,0

  • Macros de conversão de cadeia de caracteres de ATL 3,0

Classes e macros de conversão de cadeia de caracteres de ATL 7,0

ATL 7,0 apresenta diversas novas classes e macros de conversão, fornecendo aprimoramentos significativos nas macros existentes.

Os nomes das novas classes e macros de conversão de cadeia de caracteres assume a forma:

CSourceType2[C]DestinationType[EX]

onde:

  • SourceType e DestinationType são descritos na tabela abaixo.

  • [C] está presente quando o tipo de destino deve ser constante.

  • [EX] está presente quando o tamanho inicial do buffer deve ser especificado como um argumento de modelo.

    SourceType/DestinationType

    Descrição

    A

    Cadeia de caracteres ANSI.

    W

    Cadeia de caracteres Unicode.

    T

    Cadeia de caracteres genérico (equivalente ao _UNICODE W quando é definido, equivalente ao contrário.)

    O OLE

    Cadeia de caracteres OLE (equivalente a W).

Por exemplo, para converter de uma cadeia de caracteres Unicode para uma cadeia de caracteres genérico sem alterar a cadeia de caracteres convertida, use CW2CT.

Se souber que a cadeia de caracteres convertida é improvável de ser mais de 64 caracteres, a versão de EX , como CW2CTEX<64>, pode ser usada para economizar espaço na pilha.

ObservaçãoObservação

A maneira recomendada para converter e de cadeias de caracteres de BSTR é usar a classe de CComBSTR .Para converter um BSTR, passe a cadeia de caracteres existente para o construtor de CComBSTR. Para converter de um BSTR, use COLE2[C]DestinationType[EX], como COLE2T.

As novas classes de conversão que exigem um uso do buffer (CA2AEX, CA2WEX, CW2AEX, e) CW2WEXum buffer estático de tamanho fixo armazenar o resultado da conversão.Se o resultado é muito grande caber no buffer estático, a classe aloca memória usando malloc, liberando memória quando o objeto sai do escopo.Isso garante que, ao invés de macros mais antigos de conversão de texto, essas classes são seguras de usar em loop e não transbordem a pilha.

Macros de conversão introduzidos em ATL 7,0 são otimizados para estar cientes de cadeias de caracteres de NULO de entrada.Esses NULO macros retornará se o parâmetro de entrada é NULO sem atribuir qualquer memória.

Por padrão, as classes de conversão de ATL e macros usarão a página de código ANSI atual da thread para a conversão.Se você deseja sobrescrever o comportamento de uma conversão específica usando as macros baseados em classes CA2WEX ou CW2AEX, especifica a página de código como o segundo parâmetro para o construtor para a classe.

Observação de segurançaObservação de segurança

Verifique o comprimento de cadeias de caracteres antes de transmitir a esses macros para evitar problemas potenciais de estouro de buffer.Os estouros de pilha são as exceções que podem também ser detectadas com try/catch para exceto.

Há várias diferenças importantes entre as macros mais antigos de conversão de cadeia de caracteres e as novas classes de conversão de cadeia de caracteres:

Macros antigos de conversão de ATL 3,0

Novas classes de conversão de ATL 7,0

Aloca memória na pilha.

Memória de pilha usos para cadeias de caracteres pequenas.Usa o heap se a pilha não é grande o suficiente.

a cadeia de caracteres é liberada quando a função é saída.

A cadeia de caracteres é liberada quando a variável sai do escopo.

Não pode ser usado em manipuladores de exceção.

Pode ser usado em manipuladores de exceção.

Não é adequado para uso em loop.O uso de memória cresce até que a função está saída.

Suporta usam em loop.O escopo do loop garante que a memória é liberada em cada iteração.

Não bom para grandes cadeias de caracteres.O espaço de pilha é limitado.

Quaisquer problemas com grandes cadeias de caracteres.As cadeias de caracteres atribuídas serão no heap.

Geralmente requer USES_CONVERSION para ser definido.

Nunca requer USES_CONVERSION para ser definido.

O significado do OLE depende da definição de OLE2ANSI.

O OLE sempre é equivalente a. W

Exemplo

87zae4a3.collapse_all(pt-br,VS.110).gifCódigo

//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(pt-br,VS.110).gifUm aviso sobre as instâncias de classe temporários

Deve-se forçar que não é um bom o seguinte código:

LPCTSTR szr = CA2T(szReplaceFile);

Usando macros de ATL 3,0, era aceitável usar:

LPCTSTR szr = A2T(szReplaceFile);   

porque a memória alocada as funções de conversão não será liberada até que a função atual é saída.O mesmo código não funciona com as novas classes.

Esse código:

LPCTSTR szr = CA2T(szReplaceFile);   

é equivalente a isso:

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

Como a memória alocada pelo objeto temporário e retornada do operador cast seja destruída quando o objeto temporário é destruído, usar o valor em szr terá resultados indesejados.

Em vez de isso, use esse código:

CA2T szr(szReplaceFile);   

O operador cast faz o objeto de CA2T parecer com LPCTSTR.

87zae4a3.collapse_all(pt-br,VS.110).gifUso avançado

O tamanho do buffer estático padrão é 128 caracteres.Se o tamanho do buffer deve ser alterado para uma conversão específica, use a versão EX de uma macro, e especificar o tamanho do buffer como um argumento de modelo.

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

Aqui está um exemplo de especificar a página de código como o segundo parâmetro para o construtor para a classe.

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

Macros de conversão de cadeia de caracteres de ATL 3,0

Macros de conversão do texto original ainda estão disponíveis e são listados na tabela abaixo:

Macros de conversão de cadeia de caracteres de ATL 3,0

A2BSTR

OLE2A

T2A

W2A

A2COLE

OLE2BSTR

T2BSTR

W2BSTR

A2CT

OLE2CA

T2CA (substituído.Use T2CA_EX ou CT2CA em vez de isso.)

W2CA

A2CW

OLE2CT

T2COLE

W2COLE

A2OLE

OLE2CW

T2CW

W2CT

A2T

OLE2T

T2OLE

W2OLE

A2W

OLE2W

T2W

W2T

A sintaxe para usar esses macros é o seguinte:

MACRONAME( string_address )

Por exemplo:

A2W(lpa);

Em nomes macros, o tipo cadeia de caracteres de origem é à esquerda (por exemplo, A) e o tipo cadeia de caracteres de destino estiverem à direita (por exemplo, W).A representa LPSTR, OLE representa LPOLESTR, T representa LPTSTR, e suporte de W para LPWSTR.

Se houver C no nome macros, a macro converte a const uma cadeia de caracteres.Por exemplo, W2CA converte LPWSTR a LPCSTR.

Assim, A2W converte LPSTR a LPWSTR, OLE2T converte LPOLESTR a LPTSTR, e assim por diante.

O comportamento de macros de conversão de cadeia de caracteres de ATL depende da diretiva de compilador aplicado, se houver.Se os tipos de origem e de destino são os mesmos, nenhuma conversão ocorre.Alteração T e OLE das diretivas de compilador como segue:

Diretiva de compilador aplicado

Se torna t

Se torna o OLE

Nenhum

A

W

_UNICODE

W

W

OLE2ANSI

A

A

_UNICODE e OLE2ANSI

W

A

A cadeia de caracteres de destino é criada usando oalloca_, exceto quando o tipo de destino é BSTR.Usar o _alloca aloca memória para fora da pilha, de modo que quando a função retorna, é removida automaticamente.Por padrão converter-se-&z este macro até 500KB ao mesmo tempo.

A o usar uma macro de conversão de cadeia de caracteres de ATL, especifique a macro de USES_CONVERSION no início da função para evitar erros de compilador.Por exemplo:

void StringFunc(LPSTR lpsz)
{
   USES_CONVERSION;

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

87zae4a3.collapse_all(pt-br,VS.110).gifRequisitos

Header file: AtlBase.h, AtlConv.h (declarada em AtlConv.h)

Consulte também

Referência

Macros de conversão de cadeia de caracteres de DEVMODE e de TEXTMETRIC

Outros recursos

Macros de ATL