Sdílet prostřednictvím


Programování s CComBSTR

Třídy ATL CComBSTR představuje BSTR datového typu.Při CComBSTR je užitečný nástroj existuje několik situací, které vyžadují upozornění.

  • Problémy při převodu

  • Problémy v oboru

  • Explicitně uvolnění objektu CComBSTR

  • Použití objektů CComBSTR v smyčky

  • Problémy nevracení paměti

Problémy při převodu

Přestože několik CComBSTR metody automaticky převést řetězec argument ANSI do kódování Unicode, metody vždy vrátí řetězec formátu Unicode.Převést ANSI výstupní řetězec, použijte třídu ATL převodu.Další informace o převodu třídy ATL viz ATL a MFC řetězec Převod makra.

bdyd6xz6.collapse_all(cs-cz,VS.110).gifPříklad

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

Pokud používáte řetězcový literál upravit CComBSTR objekt, použijte řetězce znaků.Sníží zbytečné převody.

bdyd6xz6.collapse_all(cs-cz,VS.110).gifPříklad

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

Problémy v oboru

Stejně jako u libovolné třídy, které jsou v pořádku, CComBSTR uvolní prostředky při mimo rozsah.Pokud funkce vrací ukazatel CComBSTR řetězec, to může způsobit problémy, jako ukazatel odkazuje paměti, který již byl uvolněn.V těchto případech použít Copy způsob, jak je uvedeno níže.

bdyd6xz6.collapse_all(cs-cz,VS.110).gifPříklad

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

Explicitně uvolnění objektu CComBSTR

Je možné uvolnit explicitně řetězec obsažený v CComBSTR objektu před objekt zhasne oboru.Pokud řetězec je uvolněno, CComBSTR objekt je neplatný.

bdyd6xz6.collapse_all(cs-cz,VS.110).gifPříklad

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

Použití objektů CComBSTR v smyčky

Jako CComBSTR třídy přiděluje vyrovnávací paměti k provedení určité operace, jako += operátor nebo Připojit metody, není vhodné provádět manipulace řetězce uvnitř smyčky vysoké.V těchto situacích CStringT poskytuje lepší výkon.

bdyd6xz6.collapse_all(cs-cz,VS.110).gifPříklad

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

Problémy nevracení paměti

Předávání adresa inicializována CComBSTR funkce jako [mimo] parametr způsobuje nevracení paměti.

V následujícím příkladu řetězce přiděleno řetězec "Initialized" při úniku funkce MyGoodFunction nahradí řetězec.

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

Aby nedocházelo k nevracení paměti, volání prázdné metodu na stávající CComBSTR objekty před předáním adres jako [mimo] parametr.

Nezapomeňte, že stejný kód by způsobit nevracení Pokud parametr funkce byl [v, out].

Viz také

Referenční dokumentace

Třída CStringT

wstring

Další zdroje

Koncepty ATL

Převod makra řetězec