CComBSTR 사용한 프로그래밍
ATL 클래스 CComBSTR 는 래퍼를 제공 된 BSTR 데이터 형식.하지만 CComBSTR 는 유용한 도구입니다 주의 필요로 하는 여러 가지 상황.
변환 문제
범위 문제
CComBSTR 개체를 명시적으로 해제
루프에서 CComBSTR 개체 사용
메모리 누수 문제
변환 문제
하지만 몇 가지 CComBSTR 메서드는 ANSI 문자열 인수 유니코드로 변환 자동으로 됩니다, 메서드는 항상 유니코드 형식 문자열을 반환 합니다.출력 문자열을 ANSI로 다시 변환 하려면 ATL 변환 클래스를 사용 합니다.ATL 변환 클래스에 대 한 자세한 내용은 ATL 및 MFC 문자열 변환 매크로.
예제
// 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 개체, 와이드 문자 문자열을 사용 합니다.이 불필요 한 변환을 줄일 수 있습니다.
예제
// The following converts the ANSI string to Unicode
CComBSTR bstr1("Test");
// The following uses a Unicode string at compile time
CComBSTR bstr2(L"Test");
범위 문제
제대로 작동 클래스에 있는 CComBSTR 범위를 벗어날 때 해당 리소스를 해제 합니다.함수 포인터를 반환 하는 경우는 CComBSTR 문자열을이 발생할 수 있습니다 문제를 이미 해제 된 메모리 포인터를 참조 하는.이러한 경우에 사용 하는 복사 메서드를 아래와 같이 합니다.
예제
// 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 개체를 명시적으로 해제
포함 된 문자열을 명시적으로 해제할 수는 CComBSTR 범위 개체를 이동 하기 전에 개체.문자열을 해제 하는 경우는 CComBSTR 개체가 잘못 되었습니다.
예제
// 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.
루프에서 CComBSTR 개체 사용
으로 CComBSTR 클래스와 같은 특정 작업을 수행 하는 버퍼를 할당의 += 연산자 또는 추가 메서드는 권장 되지 않습니다 반복 되는 루프 내의 문자열 조작을 수행 하는 것입니다.이러한 상황에서 CStringT 더 나은 성능을 제공 합니다.
예제
// This is not an efficient way to use a CComBSTR object.
CComBSTR bstrMyString;
HRESULT hr;
while (bstrMyString.Length() < 1000)
hr = bstrMyString.Append(L"*");
메모리 누수 문제
전달 주소는 초기화의 CComBSTR 서 함수는 [out] 매개 변수는 메모리 누수가 발생 합니다.
아래 예제는 문자열 할당 된 문자열을 저장할 수 "Initialized" 때 누수 함수 MyGoodFunction 문자열을 바꿉니다.
CComBSTR bstrLeak(L"Initialized");
HRESULT hr = MyGoodFunction(&bstrLeak);
메모리 누수를 방지 하려면 호출을 빈 메서드를 기존 CComBSTR 개체의 주소를 전달 하기 전에 [out] 매개 변수.
참고 동일한 코드는 함수 매개 변수 이면 누수가 칠해지지 않는 [in, out].