본문 바로가기
Visual C++/General

tstring 클래스의 사용

by hyperhand 2009. 4. 23.
tstring 클래스의 사용
by Kyung-dong Song
 
 
MFC를 사용하다가 ATL을 배우기 시작할 때 곤란한 부분 중 하나가 ATL에는 MFC의 CString 같은 편리한 클래스가 존재하지 않는다는 것이다. CComBSTR이라는 클래스를 제공하기는 하지만 CString 클래스가 제공하는 풍부한 기능에 비하면 초라한 수준이다.
 
이 글에서는 이런 불편함을 해결하기 위하여 STL에서 제공하는 basic_string<> 템플리트를 이용하는 방법을 제시할 것이다. STL로 프로그램할 때 일반적으로 사용하는 문자열 클래스는 string 클래스이다. 이 string클래스가 어떻게 정의 내용을 살펴보자.
 
 
 
 

typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;

 
위 정의에서 string은 char를 기반으로 하고, wstring은 유니코드 문자인 wchar_t를 기반으로 구현되어 있음을 알 수 있는데, 문제는 Windows 플랫폼에서 개발할 때 사용하게 되는 많은 API가 이들 문자보다는 TCHAR를 기반으로 구현되어 있다는 것이다.
 
TCHAR는 컴파일 옵션에 따라서 char가 되기도 하고 wchar_t가 된다. 코드에서는 TCHAR를 사용하고 컴파일 옵션만 바꾸면 컴파일러가 알아서 처리되므로 코딩 작업은 TCHAR를 기반으로 하는 것이 좋다.
 
이 글에서는 TCHAR를 기반으로 하는 문자열 처리 클래스를 정의하고 이를 사용하는 방법에 대해서 알아볼 것이다. STL의 basic_string<>을 이용하여 TCHAR를 기반으로 하는 문자열 클래스를 다음과 같이 정의하자. 복잡한 문자열 작업을 할 때에는 이 클래스를 이용하면 된다. 
 

typedef basic_string<TCHAR> tstring;

 
 
 
 
ATL에서 멤버변수를 선언할 때에도 CComBSTR이나 CString이랑 차이없이 바로 사용하면 된다.

    CComBSTR    m_bstrTitle;
    tstring     m_tstrTitle;

 
 
CComBSTR에 tstring이 가지고 있는 문자열을 넘겨줄 때에는 다음과 같이 처리한다. 다음 코드가 문제없이 동작하는 이유는 basic_string<>의 c_str 함수는 element type의 포인터를 넘겨주므로 m_tstrTitle 변수에서는 TCHAR*를 넘겨주게 되는 것이다. 
 
CComBSTR의 = 연산자는 LPCSTR과 LPCOLESTR을 모두 받아들이는데 LPCSTR은 char*로 정의되어 있고, LPCOLESTR은 wchar_t의 포인터로 정의되어 있으므로 어떤 경우에도 상관없이 받아들이는 것이다.
 

    m_bstrTitle = m_tstrTitle.c_str();

 
 
tstring은 basic_string<>이 제공하는 모든 기능을 사용할 수 있는데 아래 코드가 그 간단한 예이다.
 

    tstring t = _T("Hello");
    tstring s = t.append(_T(" ")).append(_T("world"));
    m_bstrTitle = s.c_str();

 

 

 

 

 
wsprintf 함수를 이용할 수도 있다. sprintf 함수는 char기반이고, swprintf 함수는  wchar_t 기반의 함수이므로 공통으로 사용할 수 없는데 wsprintf는 Platform SDK에서 제공하는 문자열 처리 함수로서 간편하게 사용할 수 있다.
 

    tstring t = _T("Hello");
    tstring s = t.append(_T(" ")).append(_T("world"));

    TCHAR szTemp[BUFSIZ];   // #define BUFSIZ  512 or 4096 #if defined(_M_MPPC)
    wsprintf(szTemp, _T("%s"), s.c_str());

    m_bstrTitle = szTemp;

 
 
문자열의 일부분도 얻어낼 수 있다.
 

    tstring t = _T("1234567890");
    tstring s(t, 0, 5);

    m_bstrTitle = s.c_str();

 
 
 
 
참고문헌
 
[1] Sing Li, Panos Econopoulos, "Professional COM Applications with ATL", Wrox, 1998, pp.308.
[2] MSDN, Platfrom SDK: Windows User Interface, String Functions.
[3] Brent Rector, Chris Sells, "ATL Internals", Addison-Wesley, 1999, pp.33~43.
반응형