ATL e MFC string conversão macros
As macros de conversão de seqüência de caracteres discutidas aqui são válidas para o ATL e MFC.Para obter mais informações sobre a conversão de seqüência de caracteres MFC, consulte TN059: Usando macros MFC Unicode/MBCS conversão e Macros do MFC e globais.
ATL 7.0 string classes de conversão e macros
ATL 3.0 macros de conversão de cadeias de caracteres
ATL 7.0 string classes de conversão e macros
ATL 7.0 apresenta várias novas classes de conversão e macros, oferecendo melhorias significativas sobre macros existentes.
Os nomes das novas classes de conversão de seqüência de caracteres e as macros assumem a forma:
CSourceType2[C]DestinationType[EX]
Onde:
SourceType and DestinationType são descritos na tabela a seguir.
[C está presente quando o tipo de destino deve ser constante.
[POR EXEMPLO está presente quando o dimensionar inicial do buffer deve ser especificado sistema autônomo um argumento de modelo.
SourceType/DestinationType
Descrição
A
Seqüência de caractere ANSI.
W
Seqüência de caractere Unicode.
T
Seqüência de caractere genéricas (equivalente ao W quando _UNICODE estiver definido, equivalente a uma outra forma).
OLE
Seqüência de caractere OLE (equivalente a L).
Por exemplo, para converter de uma seqüência de caracteres Unicode em uma seqüência de caracteres genérica sem alterar a seqüência de caracteres convertida, use CW2CT.
Se ele for conhecido que a seqüência de caracteres convertida é improvável que ter mais de 64 caracteres, a POR EXEMPLO versão, sistema autônomo, por exemplo, CW2CTEX <64>, pode ser usado para economizar espaço na pilha.
Observação: |
---|
A maneira recomendada de converter para e de seqüências de caracteres BSTR é usar o CComBSTR classe.Para converter um BSTR, passar a seqüência de caracteres existente para o construtor de CComBSTR. To convert from a BSTR, use COLE2[C]DestinationType[EX], such as COLE2T. |
As novas classes de conversão que requer um buffer (CA2AEX, CA2WEX, CW2AEX, e CW2WEX) usam um buffer de dimensionar fixo estático para armazenar o resultado da conversão. Se o resultado é muito grande ajuste no buffer estático, a classe aloca memória usando malloc, liberar a memória quando o objeto fica fora do escopo. Isso garante que, ao contrário das macros de conversão de texto mais antigas, essas classes são seguros usar em loops e não estouram a pilha.
As macros de conversão introduzidas no ATL 7.0 são otimizadas para estar ciente de entrada NULO seqüências.Essas macros retornará NULO se o parâmetro de entrada é NULO sem alocar qualquer memória.
Por padrão, as classes de conversão do ATL e as macros serão usam página de código ANSI corrente do segmento para a conversão.Se você desejar substituir esse comportamento para alguma conversão específica usando macros com base na classes CA2WEX ou CW2AEX, especificar a página de código sistema autônomo o segundo parâmetro para o construtor da classe.
Observação de segurança: |
---|
Verifica o comprimento das seqüências de caracteres antes de passá-los para essas macros para evitar possíveis problemas de saturação de buffer.Estouros de pilha são exceções também podem ser detectadas com try / exceto. |
Há várias diferenças importantes entre as macros de conversão de seqüência de caracteres mais antigas e as novas classes de conversão de seqüência de caracteres:
Antigo ATL 3.0 macros de conversão |
Novo ATL 7.0 classes de conversão |
---|---|
Aloca memória na pilha. |
Usa a pilha memória para cadeias de caracteres pequenas.Usa o heap se a pilha não é grande o suficiente. |
A seqüência de caracteres é liberada quando a função é finalizada. |
A seqüência 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 loops.Uso da memória aumenta até que a função será finalizada. |
Oferece suporte para usar em loops.Escopo de loop assegura que a memória liberada em cada iteração. |
Não é mercadoria para grandes seqüências de caracteres.Espaço de pilha é limitado. |
Há problemas com seqüências de caracteres grandes.Seqüências de caracteres serão alocadas no heap. |
Geralmente exigem USES_CONVERSION seja definido. |
Nunca exigir USES_CONVERSION seja definido. |
Significado do OLE depende da definição de OLE2ANSI. |
OLE sempre é equivalente a w. |
Exemplo
Có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);
}
Um aviso sobre instâncias de classe temporários
Estresse que este não é mercadoria código:
LPCTSTR szr = CA2T(szReplaceFile);
Usando macros ATL 3.0, era aceitável o uso de:
LPCTSTR szr = A2T(szReplaceFile);
sistema autônomo a memória alocada pelas funções de conversão não poderia ser liberada até que a função corrente foi encerrada.O mesmo código não funciona com as novas classes.
Este código:
LPCTSTR szr = CA2T(szReplaceFile);
é equivalente a esta:
LPCTSTR szr;
{
CA2T temp(szReplaceFile);
szr = temp.operator LPTSTR();
}
sistema autônomo a memória alocada pelo objeto temporário e retornado pelo operador de lançamento é destruída quando o objeto temporário é destruído, usando o valor em szr terá resultados indesejados.
Em vez disso, use este código:
CA2T szr(szReplaceFile);
O operador de conversão torna o objeto CA2T parecer um LPCTSTR.
Uso avançado
O padrão estático dimensionar do buffer é 128 caracteres.Se o dimensionar do buffer deve ser alterado de alguma conversão específica, usar a versão de EX de uma macro e especificar o dimensionar do buffer sistema autônomo 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));
}
Eis um exemplo de especificar a página de código sistema autônomo o segundo parâmetro para o construtor da 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 conversão de cadeias de caracteres
As macros de conversão de texto original ainda estão disponível e são listadas na tabela a seguir:
ATL 3.0 macros de conversão de cadeias de caracteres
A2BSTR |
OLE2A |
T2A |
W2A |
A2COLE |
OLE2BSTR |
T2BSTR |
W2BSTR |
A2CT |
OLE2CA |
T2CA (Preterido.Use T2CA_EX ou CT2CA em vez disso.) |
W2CA |
A2CW |
OLE2CT |
T2COLE |
W2COLE |
A2OLE |
OLE2CW |
T2CW |
W2CT |
A2T |
OLE2T |
T2OLE |
W2OLE |
A2W |
OLE2W |
T2W |
W2T |
A sintaxe para usar essas macros é o seguinte:
MACRONAME( string_address )
Por exemplo:
A2W(lpa);
Nos nomes de macro, o tipo de seqüência de caracteres de fonte está à esquerda (por exemplo, UM) e o tipo de seqüência de caracteres de destino é à direita (por exemplo, W).UM significaLPSTR, OLE significaLPOLESTR, T significaLPTSTR, e W significaLPWSTR.
Se houver um C nome da macro, a macro converte um Constseqüência de caracteres .Por exemplo, W2CA converte um LPWSTR para um LPCSTR.
Assim, A2W converte um LPSTR to an LPWSTR, OLE2T converte um LPOLESTR para um LPTSTR, e assim por diante.
O comportamento das macros ATL seqüência conversão depende a diretiva de compilador em vigor, se houver.Se os tipos de fonte e destino forem iguais, nenhuma conversão é feita.Diretivas de compilador alterar T and OLE da seguinte maneira:
Diretiva de compilador em vigor |
T torna-se |
Torna-se de OLE |
---|---|---|
Nenhum |
A |
W |
_UNICODE |
W |
W |
OLE2ANSI |
A |
A |
_UNICODE and OLE2ANSI |
W |
A |
A seqüência de caracteres de destino é criada usando _ alloca, exceto quando o tipo de destino é BSTR. Usando _ alloca aloca memória na pilha, para que quando a função retorna, ele automaticamente é limpa.Por padrão desta macro apenas converterá até 500 KB ao mesmo time.
Ao usar uma macro de conversão de seqüência de caracteres ATL, especifique o USES_CONVERSION macro no início de sua função para evitar erros do compilador.Por exemplo:
void StringFunc(LPSTR lpsz)
{
USES_CONVERSION;
LPWSTR x = A2W(lpsz);
// Do something with x
wprintf_s(L"x is %s", x);
}
Requisitos
Arquivo de cabeçalho: AtlBase.h, AtlConv.h (declarado no AtlConv.h)
Consulte também
Referência
DEVMODE e macros de conversão de string TEXTMETRIC