Compartilhar via


Programação com CComBSTR

A classe ATL CComBSTR fornece um wrapper em torno de BSTR tipo de dados. Ao mesmo tempo em que CComBSTR é uma ferramenta útil, existem várias situações que exigem cuidado.

  • Problemas de conversão

  • Problemas de escopo

  • Liberar explicitamente o objeto CComBSTR

  • Usando objetos CComBSTR em loops

  • Problemas de perda de memória

Problemas de conversão

Embora vários CComBSTR métodos converterá automaticamente um argumento de seqüência de caracteres ANSI em Unicode, os métodos sempre retornarão seqüências de caracteres de formato Unicode. Para converter a cadeia de saída para ANSI, use uma classe de conversão ATL.Para obter mais informações nas classes ATL conversão, consulte ATL e MFC string conversão macros.

Exemplo

// Declare a CComBSTR object. Although the argument is ANSI,
// the constructor converts it into UNICODE.
CComBSTR bstrMyString("Hello World");
// Convert the string into an ANSI string
CW2A szMyString(bstrMyString);
// Display the ANSI string
MessageBoxA(NULL, szMyString, "String Test", MB_OK);   

Se você estiver usando uma seqüência de caractere literal para modificar um CComBSTR objeto, usar seqüências de caractere largos. Isso reduzirá conversões desnecessárias.

Exemplo

// The following converts the ANSI string to Unicode
CComBSTR bstr1("Test");
// The following uses a Unicode string at compile time 
CComBSTR bstr2(L"Test");   

Problemas de escopo

sistema autônomo ocorre com qualquer classe bem comportado, CComBSTR será disponível seus recursos quando ele sai do escopo. Se uma função retorna um ponteiro para o CComBSTR seqüência de caracteres, isso pode causar problemas, conforme o ponteiro fizer referência a memória já foi liberada. Nesses casos, use o Cópia método, sistema autônomo mostrado abaixo.

Exemplo

// The wrong way to do it
BSTR * MyBadFunction()
{
   // Create the CComBSTR object
   CComBSTR bstrString(L"Hello World");
   // Convert the string to uppercase
   HRESULT hr;
   hr = bstrString.ToUpper();

   // Return a pointer to the BSTR. ** Bad thing to do **
   return &bstrString;
}
// The correct way to do it
HRESULT MyGoodFunction(/*[out]*/ BSTR* bstrStringPtr)
{
   // Create the CComBSTR object
   CComBSTR bstrString(L"Hello World");
   // Convert the string to uppercase
   HRESULT hr;
   hr = bstrString.ToUpper();
   if (hr != S_OK)
       return hr;
   // Return a copy of the string.
   return bstrString.CopyTo(bstrStringPtr);
}

Liberar explicitamente o objeto CComBSTR

É possível liberar explicitamente a seqüência de caracteres contida no CComBSTR objeto antes do objeto fica fora do escopo. Se a seqüência de caracteres é liberada, a CComBSTR o objeto é inválido.

Exemplo

// Declare a CComBSTR object
CComBSTR bstrMyString(L"Hello World");
// Free the string explicitly
::SysFreeString(bstrMyString);
// The string will be freed a second time
// when the CComBSTR object goes out of scope,
// which is invalid.   

Usando objetos CComBSTR em loops

sistema autônomo a CComBSTR classe aloca um buffer e executar certas operações, sistema autônomo o += operador ou Acrescentar método, não é recomendável que você realize a manipulação de seqüência de caracteres dentro de um loop apertado.Nessas situações, CStringT Fornece um melhor desempenho.

Exemplo

// This is not an efficient way to use a CComBSTR object.
CComBSTR bstrMyString;
HRESULT hr;
while (bstrMyString.Length() < 1000)
   hr = bstrMyString.Append(L"*");   

Problemas de perda de memória

Passar o endereço de um inicializado CComBSTR para uma função sistema autônomo um [out] parâmetro faz com que um perda de memória.

No exemplo abaixo, a seqüência de caracteres alocada para armazenar a seqüência de caracteres "Initialized" é perdido quando a função MyGoodFunction substitui a seqüência de caracteres.

CComBSTR bstrLeak(L"Initialized");
HRESULT hr = MyGoodFunction(&bstrLeak);   

Para evitar o vazamento telefonar o Vazio método existente CComBSTR objetos antes de passar o endereço sistema autônomo um [out] parâmetro.

Observe que o mesmo código não poderia causar um vazamento de se o parâmetro da função foi [in, out].

Consulte também

Referência

Classe CStringT

wstring

Outros recursos

Conceitos atl

Macros de conversão de seqüência de caracteres