본문 바로가기

old drawer/C, C++, MFC

[MFC] Type Casting Source

CString -> char (포인터 값으로 저장)

CString str = "Hello";
char * ch = NULL;

ch = (LPSTR)(LPCSTR)str; 또는 ch = str.GetBuffer(str.GetLength());

// str의 포인터 값을 ch에 저장한다.

 

CString -> char (배열에 복사)

CString str = "Hello";
char ch[100] = {0,};
strcpy(ch, (LPSTR)(LPCSTR)str, str.GetLength());

// NULL을 만나기 전까지의 문자를 str에서 ch로 복사한다.

 

char -> CString (복사)

char ch[] = "Hello";
CString str;

str = ch;

// operator =  연산자 오버로딩이 되어 있어 내부적으로 메모리 복사가 이루어 진다.

 

MFC가 아닌 프로젝트에서 CString 클래스 사용방법

VC 2003 이하 버전

CString 클래스는 MFC에 포함된 클래스이다. 이를 사용하기 위해서는 해당 프로젝트의 Setting에서 General 탭의 Microsoft Foundation Classes의 콤보박스를 Not Using MFC에서 Use MFC in a Shared DLL 로 바꿔준다.

그후 StdAfx.h 같은 곳에서 사용하는 #include <windows.h> 대신 #include <afxwin.h> 로 바꿔주면 CString 클래스를 사용할수 있게 된다.

VC 2003 이상 버전

2003부터 MFC에서 CString 클래스를 분리하여  #include "atlstr.h" 만해주면 CString 클래스를 사용할 수 있다.

 

 //======================================================================================================================//

#include "stdafx.h"
#include "TypeCastFuncs.h"


//CString to char*
char* CTypeCastUtil::CStringToChar(CString str)
{
 char* pszStr;
 int sLen = WideCharToMultiByte(CP_ACP,0,str,-1,NULL,0,NULL,NULL);
 pszStr = new char[sLen+1];
 WideCharToMultiByte(CP_ACP,0,str,-1,pszStr,sLen,NULL,NULL);

 return pszStr;
}
/*=========== CString to char* other ways ==========*/
/*
char* CTypeCastUtil::CStringToChar(CString str){
 return (LPSTR)(LPCSTR)str;
}

char* CTypeCastUtil::CStringToChar(CString str){
  char *pszStr=NULL;

     pszStr = malloc(strTemp.GetLength()+1);
     strcpy(pszStr, strTemp.GetBuffer(strTemp.GetLength());

     retrun pszStr;
}
*/


//char* to CString
CString CTypeCastUtil::CharToCString(char* pszStr)
{
 //CString str = pszStr; //오류가 날 수 있음
 CString str;
 str = pszStr;
 return str;
}

//CString to Double
double CTypeCastUtil::CStringToDouble(CString strNumber)
{
 return wcstod(strNumber, NULL);
}

//Double to CString
CString CTypeCastUtil::DoubleToCString(double dNumber)
{
 CString strNumber;

 strNumber.Format(_T("%f"), dNumber);

 return strNumber;
}

//CString to int
int CTypeCastUtil::CStringToInt(CString strNumber)
{
 return _ttoi(strNumber);
}

//int to CString
CString CTypeCastUtil::IntToCString(int nNumber)
{
 CString strNumber;

 strNumber.Format(_T("%d"), nNumber);

 return strNumber;
}


LPWSTR CTypeCastUtil::LPCSTRToLPWSTR (char* pCstring)
{
 LPWSTR pszOut = NULL;
 if (pCstring != NULL)
 {
  int nInputStrLen = strlen (pCstring);
  // Double NULL Termination
  int nOutputStrLen = MultiByteToWideChar(CP_ACP, 0, pCstring, nInputStrLen, NULL, 0) + 2;
  pszOut = new WCHAR [nOutputStrLen];

  if (pszOut)
  {
   memset (pszOut, 0x00, sizeof (WCHAR)*nOutputStrLen);
   MultiByteToWideChar (CP_ACP, 0, pCstring, nInputStrLen, pszOut, nInputStrLen);
  }

 }

 return pszOut;
}

 

'old drawer > C, C++, MFC' 카테고리의 다른 글

[C/C++] INI 함수 클래스  (0) 2013.08.06
[MFC] File Operations Source  (0) 2013.08.06
[MFC] Tab Control 사용법  (2) 2013.08.01
[C++] 자료형 크기  (0) 2013.06.10
[MFC] CString에서 line by line으로 읽기  (1) 2013.05.14