Compartir a través de


Programación con CComBSTR

La clase CComBSTR ATL proporciona un contenedor alrededor del tipo de datos de BSTR .Mientras CComBSTR es una herramienta útil, hay varias situaciones que requieren precaución.

  • problemas de conversión

  • Problemas de ámbito

  • Liberar explícitamente el objeto CComBSTR

  • Utilizar objetos CComBSTR en bucles

  • Problemas de pérdida de memoria

problemas de conversión

Aunque varios métodos de CComBSTR automáticamente convierten un argumento de cadena ANSI en Unicode, los métodos devolverán siempre las cadenas de formato Unicode.Para convertir la cadena de resultados a ANSI, utilice una clase de conversión de ATL.Para obtener más información sobre los tipos de conversión ATL, vea Macros de conversión de cadena ATL y MFC.

bdyd6xz6.collapse_all(es-es,VS.110).gifEjemplo

// 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);   

Si está utilizando un literal de cadena para modificar un objeto de CComBSTR , utilice cadenas de caracteres anchos.esto reducirá conversiones innecesarias.

bdyd6xz6.collapse_all(es-es,VS.110).gifEjemplo

// 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 ámbito

Como con cualquier buena clase, CComBSTR libere los recursos cuando sale del ámbito.Si una función devuelve un puntero a la cadena de CComBSTR , pueden producirse problemas, como el puntero hará referencia a memoria que ya se ha liberado.En estos casos, utilice el método de Copiar , como se muestra a continuación.

bdyd6xz6.collapse_all(es-es,VS.110).gifEjemplo

// 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 explícitamente el objeto CComBSTR

Es posible liberar explícitamente la cadena contenida en el objeto de CComBSTR antes de que el objeto ámbito.Si se libera la cadena, el objeto de CComBSTR no es válido.

bdyd6xz6.collapse_all(es-es,VS.110).gifEjemplo

// 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.   

Utilizar objetos CComBSTR en bucles

Como la clase de CComBSTR asigna un búfer para realizar ciertas operaciones, como el operador de += o el método de Anexar , no se recomienda realiza la manipulación de cadenas dentro de un bucle ajustado.en estas situaciones, CStringT proporciona mejor rendimiento.

bdyd6xz6.collapse_all(es-es,VS.110).gifEjemplo

// 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 pérdida de memoria

Pasar a la dirección de CComBSTR inicializarse con una función como parámetro de [out] provoca una pérdida de memoria.

En el ejemplo siguiente, la cadena asignada para contener la cadena "Initialized" se bloquee cuando la función MyGoodFunction reemplaza la cadena.

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

Para evitar la pérdida, llame al método de Vacío en los objetos existentes de CComBSTR antes de pasar la dirección como parámetro de [out] .

Observe que el mismo código no produciría un escape si el parámetro de la función es [in, out].

Vea también

Referencia

Clase de CStringT

wstring

Otros recursos

Conceptos de ATL

Macros de conversión de cadena