Post List

2016년 1월 28일 목요일

모든 MFC (C++) 문자열 타입간의 변환 모음 (CString, std::string, LPCTSTR 등...)

MFC (C++) 에서 여러가지 라이브러리를 사용하다보면 함수의 문자열을 받는 인자의 형식이 Unicode/Ansi , std::string, char*, LPCTSTR 등... 각각 제멋대로입니다.
그래서 늘 해당 작업을 할때마다... 구글링...
몇주 뒤에 또 이런 일이 있으면 또 구글링...
그래서 귀찮아서 정리해 봤습니다.
왠만한 조합은 다 있는듯 합니다.
혹시 더 필요한 조합이나 아래 Code에 Error가 있으면 feedback 부탁드리겠습니다.
(모든 조합을 다 Test해보진 않았습니다. ;;;)
처음엔 문제 많은 code였는데 feedback 주신분들이 친절히 가르쳐 주셔서 조금씩 보완하고 있는 중입니다.
감사드립니다. ^_^

CString (CStringA, CStringW) to std::string

std::string S2(CString& CS)
{
#ifdef _UNICODE
    USES_CONVERSION;
    std::string S = W2A(CS.GetBuffer());
#else
    std::string S = CS.GetBuffer();
#endif
    return S;
}

std::string to CString (CStringA, CStringW)

CString S2(std::string& S)
{
#ifdef _UNICODE
    USES_CONVERSION;
    CString CS = A2W(S.c_str());
#else
    CString CS = S.c_str();
#endif
    return CS;
}

std::wstring to CString (CStringA, CStringW)

CString S2(std::wstring& WS)
{
#ifdef _UNICODE
    CString CS = WS.c_str();
#else
    USES_CONVERSION;
    CString CS = W2A(WS.c_str());
#endif
    return CS;
}

std::string to/from std::wstring

std::string S3(std::wstring& WS)
{
    USES_CONVERSION;
    return std::string(WA2(WS.c_str()));
}

std::wstring S3(std::string& S)
{
    USES_CONVERSION;
    return std::wstring(A2W(S.c_str()));
}

CStringA to/from CStringW

CStringA CA
CStringW CS(CA);
CStringA _CA(CS);

TCHAR* (char*, wchat_t*) to LPSTR, LPTSTR, LPCSTR, LPCTSTR

LPSTR S4_LPSTR(TCHAR * pChar)
{
#ifdef _UNICODE
    return (LPSTR)S3(std::wstring(pChar)).c_str();
#else
    return (LPSTR)pChar;
#endif
}

LPTSTR S4_LPTSTR(char * pChar)
{
    return (LPTSTR)S3(std::string(pChar)).c_str();
}

LPTSTR S4_LPTSTR(wchar_t * pChar)
{
    return (LPTSTR)pChar;
}

LPCSTR S4_LPCSTR(TCHAR * pChar)
{
    return (LPCSTR)S4_LPSTR(pChar);
}

LPCTSTR S4_LPCTSTR(TCHAR * pChar)
{
#ifdef _UNICODE
    return (LPCTSTR)pChar;
#else
    return (LPCTSTR)S4_LPTSTR(pChar);
#endif
}

CString to char* buffer

void SMEMCPY(char* destBuf, CString & strSrc, int nSize)
{
    std::string str = CWVString::S2(strSrc);
    ZeroMemory(destBuf, nSize);
    memcpy(destBuf, &str[0], min(str.size(), (size_t)(nSize - 1))); 
전체 Code

댓글 없음:

댓글 쓰기