Aracılığıyla paylaş


CComBSTR ile programlama

atl sınıfı CComBSTR etrafında sarıcı sağlar BSTR veri türü.Sırada CComBSTR yararlı bir araçtır, dikkat gerektiren çeşitli durumlar vardır.

  • Dönüştürme sorunları

  • Kapsam sorunları

  • CComBSTR nesnesi açıkça boşaltma

  • İn döngüleri CComBSTR nesnelerini kullanma

  • Bellek sızıntı sorunlarını

Dönüştürme sorunları

Ancak birkaç CComBSTR yöntemleri tarafından otomatik olarak dönüştürülür ANSI dizesi bağımsız değişken Unicode, yöntemleri her zaman Unicode biçim dizeleri döndürecektir.ANSI-çıkış dizesi dönüştürmek için atl dönüştürme sınıfını kullanın.atl dönüştürme sınıfları hakkında daha fazla bilgi için bkz: atl ve mfc dönüştürme Macros dizesi.

bdyd6xz6.collapse_all(tr-tr,VS.110).gifÖ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);   

Dize değişmezi değiştirmek için kullanıyorsanız, bir CComBSTR nesne, geniş karakter dizeleri kullanır.Bu gereksiz dönüşümleri azaltır.

bdyd6xz6.collapse_all(tr-tr,VS.110).gifÖrnek

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

Herhangi bir sure sınıf gibi CComBSTR kapsam dışına çıktığında kaynaklarını boşaltır.Bir işlev için bir işaretçi döndürüyor ise CComBSTR dizesi, bu sorunlara neden olabilir, işaretçiyi zaten serbest bellek başvuracağı gibi.Bu gibi durumlarda kullanmak Copy yöntem aaıda gösterildii gibi.

bdyd6xz6.collapse_all(tr-tr,VS.110).gifÖ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 nesnesi açıkça boşaltma

Açıkça içerdiği dize serbest mümkündür CComBSTR Nesne kapsamı geçmeden önce nesne.Dize serbest bırakırsanız, CComBSTR nesnesi geçersiz.

bdyd6xz6.collapse_all(tr-tr,VS.110).gifÖ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.   

İn döngüleri CComBSTR nesnelerini kullanma

Olarak CComBSTR sınıfı gibi belirli işlemleri gerçekleştirmek için bir arabellek ayırır += işleç veya ekleme yöntemi, bu önerilmez sıkı bir döngü içinde dize işlemleri gerçekleştirebilirsiniz.Bu gibi durumlarda CStringT daha iyi performans sağlar.

bdyd6xz6.collapse_all(tr-tr,VS.110).gifÖ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ı sorunlarını

Başlatılmış bir adresi geçirerek CComBSTR bir işlev için bir [Çıkış] parametresi bir bellek sızıntısına neden olur.

Aşağıdaki örnek dize dizgisini tutmak için ayrılan "Initialized" ne zaman sızmasına işlev MyGoodFunction dizesini değiştirir.

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

Sızıntı önlemek için arama boş yöntemi var olan CComBSTR adresi olarak geçirmeden önce nesne bir [Çıkış] parametresi.

İşlevin parametresi varsa aynı kodu bir sızıntı neden olmaz olduğunu Not ['ta, out].

Ayrıca bkz.

Başvuru

CStringT sınıfı

wstring

Diğer Kaynaklar

atl kavramları

Dize dönüştürme makrolar