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.
Ö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.
Ö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.
Ö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.
Ö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.
Ö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].