CComBSTR (ATL) ile programlama

Uyarı

Etkin Şablon Kitaplığı (ATL) desteklenmeye devam eder. Ancak artık özellik eklemeyeceğiz veya belgeleri güncelleştirmeyeceğiz.

ATL sınıfı CComBSTR , BSTR veri türü çevresinde bir sarmalayıcı sağlar. Kullanışlı bir araç olsa CComBSTR da, dikkatli olunması gereken birkaç durum vardır.

Dönüştürme Sorunları

Birkaç CComBSTR yöntem bir ANSI dize bağımsız değişkenini otomatik olarak Unicode'a dönüştürse de, yöntemler her zaman Unicode biçim dizeleri döndürür. Çıkış dizesini ANSI'ye geri dönüştürmek için bir ATL dönüştürme sınıfı kullanın. ATL dönüştürme sınıfları hakkında daha fazla bilgi için bkz . ATL ve MFC Dize Dönüştürme Makroları.

Örnek

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

CComBSTR nesnesini değiştirmek için dize yordamı kullanıyorsanız, gereksiz dönüştürmeleri azaltmak için geniş karakter dizeleri kullanın.

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

Kapsam Sorunları

İyi davranan tüm sınıflarda olduğu gibi, CComBSTR kapsam dışına çıktığında kaynaklarını serbest bırakır. bir işlev dizeye CComBSTR bir işaretçi döndürürse, işaretçi zaten serbest bırakılmış belleğe başvuracağından bu sorunlara neden olabilir. Bu gibi durumlarda, aşağıda gösterildiği gibi yöntemini kullanın Copy .

Örnek

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

CComBSTR Nesnesini Açıkça Boşaltma

Nesne kapsamı dışına çıkmadan önce nesnede yer alan dizeyi CComBSTR açıkça serbest hale getirmek mümkündür. Dize serbest kalırsa, CComBSTR nesne geçersizdir.

Örnek

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

Döngülerde CComBSTR Nesnelerini Kullanma

CComBSTR sınıfı += işleci veya Append yöntemi gibi belirli işlemleri gerçekleştirmek için bir arabellek ayırdığından, yoğun bir döngü içinde dize işleme gerçekleştirmeniz önerilmez. Bu gibi durumlarda CStringT daha iyi performans sağlar.

Örnek

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

Bellek Sızıntısı Sorunları

Başlatılmış CComBSTR adresini bir işlevin [out] parametresi olarak geçirmek bellek sızıntısına neden olur.

Aşağıdaki örnekte, işlev MyGoodFunction dizenin yerini aldığında, "Initialized" dizisini tutmak için ayrılan bellek sızdırılır.

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

Sızıntıyı önlemek için, adresi bir [çıkış] parametresi olarak geçirmeden önce, mevcut CComBSTR nesnelerindeki Empty yöntemini çağırın.

İşlevin parametresi [in, out] ise aynı kodun sızıntıya neden olmadığını unutmayın.

Ayrıca bkz.

Kavramlar
CStringT Sınıfı
wstring
Dize Dönüşüm Makroları