환경 설정 파일(ini)의 특정 값을 읽는 GetPrivateProfileString 사용 샘플입니다.

MFC 함수로 만들어서 사용한 예입니다.

 

BOOL CUtility::ReadOptionString(CString section, CString key, CString& value)         
                                                                                                            
     // 환경설정 파일이 ini .포멧 파일 형태                                                         
     CString strPath = GetAppDataPath() + L"\\option.dat";                                 
     WCHAR optValue[MAX_NAME] = {0};                                                          
     BOOL bSuccess = GetPrivateProfileString(section, key, NULL, optValue,  MAX_NAME, strPath);
     value = optValue;       
     return bSuccess; 
}

 

 

환경설정의 특정 섹션에 키와 값을 저장하는 샘플입니다.

 

BOOL CUtility::WriteOptionString(CString section, CString key, CString value)
{
 CString strPath = GetAppDataPath() + L"\\option.dat";
 BOOL bSuccess = WritePrivateProfileString(section, key, value, strPath);
 return bSuccess;
}

 


 

// 전체 경로로 하위 폴더까지 폴더를 생성하는 팁입니다.

 

void CUtility::MakeFolder(LPCTSTR path)
{
 if(!SetCurrentDirectory(path)){
  TCHAR tmpPath[MAX_PATH_EX];
  memset(tmpPath,0,MAX_PATH_EX);
  _tcscpy(tmpPath,path);

  LPTSTR rPt = _tcsrchr(tmpPath,'\\');

  if(rPt){   
   *rPt = 0;
   MakeFolder(tmpPath);
  }
  ::CreateDirectory(path,NULL);
 }
}

 

클립보드에 문자열을 저장하는 팁입니다.

 

OpenClipboard 로 클립보드를 오픈하고 SetClipboardData 함수로 클립보드에 문자열을 저장합니다.

 

BOOL CUtility::SetClipBoardString(CString data)

{

 

           if ( !OpenClipboard(NULL) )

           {

                     m_errMessage = L"Cannot open the Clipboard";

                     return FALSE;

           }

          

           if( !EmptyClipboard() )

           {

                     m_errMessage = _T("Cannot empty the Clipboard");

                     return FALSE;

           }

          

           wchar_t *wcBuffer = 0;

           HGLOBAL hglbCopy = GlobalAlloc( GMEM_MOVEABLE, ( data.GetLength() + 1 ) * sizeof (wchar_t) );

           wcBuffer = ( wchar_t* )GlobalLock( hglbCopy );

           wcscpy( wcBuffer,  data );

 

           GlobalUnlock( hglbCopy ); 

          

           if ( ::SetClipboardData( CF_UNICODETEXT, hglbCopy ) == NULL )

           {

                     m_errMessage.Format(L"Unable to set Clipboard data, error: %d", GetLastError());

                     CloseClipboard();           

                     return FALSE;

           }

           CloseClipboard();

           return TRUE;

 

 

 

dll 파일의 경로로  해당 파일의 버전을 가져오는 팁입다.

 

CString CUtility::GetDllVersion()

{

           TCHAR  path[MAX_PATH] = {0};

           GetModuleFileName(AfxGetStaticModuleState()->m_hCurrentInstanceHandle, path, MAX_PATH);

          

           DWORD infoSize = 0;

           CString ver;

 

     // 파일로부터 버전정보데이터의 크기가 얼마인지를 구합니다.

            infoSize = GetFileVersionInfoSize(path, 0);

            if(infoSize==0) return L"";

          

           // 버퍼할당

           char* buffer = NULL;

    buffer = new char[infoSize];

    if(buffer)

    {

          // 버전정보데이터를 가져옵니다.

          if(GetFileVersionInfo(path,0,infoSize, buffer)!=0)

          {

                VS_FIXEDFILEINFO* pFineInfo = NULL;

                UINT bufLen = 0;

               // buffer로 부터 VS_FIXEDFILEINFO 정보를 가져옵니다.

               if(VerQueryValue(buffer, L"\\",(LPVOID*)&pFineInfo, &bufLen) !=0)

               {   

                    WORD majorVer, minorVer, buildNum, revisionNum;

                    majorVer = HIWORD(pFineInfo->dwFileVersionMS);

                    minorVer = LOWORD(pFineInfo->dwFileVersionMS);

                    buildNum = HIWORD(pFineInfo->dwFileVersionLS);

                    revisionNum = LOWORD(pFineInfo->dwFileVersionLS);

 

                    // 파일버전 출력

                                                     ver.Format(L"%d.%d.%d.%d", majorVer, minorVer, buildNum, revisionNum);

                    //printf("version : %d,%d,%d,%d\n",majorVer, minorVer, buildNum, revisionNum);

                }

           }

          delete[] buffer;

      } 

           return ver;

}

 

자바스크립트의 Split 함수와 동일한 역할을 하는 MFC의 CString을 CStringArray을 변환하는 팁입니다.

 

 

CString str = L"AAA*??*BBB*??*CCCC";

CStringArray itemInfors;
 m_Utility.SpliteArray(str,  L"*??*", itemInfors);

 

void CUtility::SpliteArray(CString strData, CString Seperator, CStringArray& arr)

{

           CStringArray datas;

           CString Sep = Seperator;

           CString data = strData;

           int Position = 0;

           CString Token;

                    

           Token = data.Tokenize(Seperator, Position);

           if( Token != L"") arr.Add(Token);

 

           while(!Token.IsEmpty())

           {

                     // Get next token.

                     Token = data.Tokenize(Seperator, Position);

                     if(Token != L"")

                     {

                                arr.Add(Token);

                     }                                         

           }

}

 

 

PC내의 유선 또는 무선 네트워크 어댑터로부터 모든 Mac Address를 가져오는 샘플입니다.

 

간단하게 MFC의 CStringArray에 어드레스를 할당하는데, 적당히 활용하면 될 것으로 보입니다.

void CUtility::GetMacAddress(CStringArray& addresss)

{

           IP_ADAPTER_INFO AdapterInfo[16];        

           DWORD dwBufLen = sizeof (AdapterInfo); 

 

           DWORD dwStatus = GetAdaptersInfo(AdapterInfo, &dwBufLen);             

          if (dwStatus == NO_ERROR)

           {

                     PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; 

                    while (pAdapterInfo)

                     {

                                CStringA strMacAddress;

                                strMacAddress.Format("%02X:%02X:%02X:%02X:%02X:%02X",

                pAdapterInfo->Address[0],

                pAdapterInfo->Address[1],

                pAdapterInfo->Address[2],

                pAdapterInfo->Address[3],

                                    pAdapterInfo->Address[4],

                pAdapterInfo->Address[5]); 

                                addresss.Add(CA2T(strMacAddress));

                                pAdapterInfo = pAdapterInfo->Next;    // 다으 링크

                     }                           

           }

}

 

리스트 컨트롤의 SetExtendedStyle 함수에 LVS_EX_FULLROWSELECT 옵션만 주면 됩니다.

 

CListCtrl m_ctlList;

......

m_ctlList.SetExtendedStyle(LVS_EX_FULLROWSELECT);

 

 

 

 

 

 

 

 

 

 

 

 

GetLastError()  함수로 리턴된 에러코드로 실제 에러 메시지를 가져오는 샘플입니다.

MFC 함수로 만든건데 걍 C++ 코드는 적당히 수정해서 ㅋㅋ

 

CString CUtility::ConvertGetLastError(DWORD dwError)

{         

           CString errMsg;

           DWORD result = ::GetLastError();

           WCHAR buf[256] = {0};

           FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 256, NULL);

           errMsg = buf;

           return errMsg;

}

 

 

 

 

 1. 멀티 바이트를 유니코드(Wide Char)로 변환

 

// MBCS을 와이트 케릭터(UTF-8)으로  변경한다.
STDAPI_(WCHAR*) gf_ConvertWBCS(char* mbcs, ULONG size);

 

STDAPI_(WCHAR*) gf_ConvertWBCS(char* mbcs, ULONG size)

{

           long lSize=MultiByteToWideChar( CP_UTF8, 0, (LPSTR)mbcs, -1, NULL, 0);

           LPTSTR lpBuffer = (LPTSTR)new WCHAR[size + 1];

           wmemset(lpBuffer, 0, size + 1);

           MultiByteToWideChar(CP_UTF8, 0, (LPSTR)mbcs, -1, lpBuffer, size);

           return lpBuffer; 

}

 

char* mbcs = NULL;
WCHAR* wbcs = NULL;

mbcs = (char*)malloc(length+1);  
ZeroMemory(mbcs, length+1);

sprintf(mbcs, "%.*s", length, (char*)xml3);
wbcs = gf_ConvertWBCS(mbcs, length); 


if( wbcs != NULL)
{
    free(wbcs);
}

 

2.유니코드를 멀티바이트로 변환

 

// 와이드 문자열을 멀티바이트로 변환한다.
STDAPI_(char*) gf_ConvertMBWS(WCHAR* wbcs, ULONG type);

 

STDAPI_(char*) gf_ConvertMBWS(WCHAR* wbcs, ULONG type )

{

           //유니코드에서 멀티바이트로 변환 방법

   // newVal이란 BSTR 타입에 있는 유니코드 문자열을 sTime이라는 ANSI 문자열로 변환        

           char* pTemp = NULL;

           int iLen = ::WideCharToMultiByte(type, 0, wbcs, -1, pTemp, 0, NULL, NULL);

           pTemp = new char[iLen+1];

           memset(pTemp, 0, iLen+1);         

           ::WideCharToMultiByte(type, 0, wbcs, -1, pTemp, iLen, NULL, NULL);

           return pTemp;  

}

 

WCHAR pszStr1[MAX_PATH_EX] = {0};

 StringCchCopy(pszStr1, MAX_PATH_EX, str1);

 

char* pStr1 =gf_ConvertMBWS(pszStr1, CP_ACP);

if(pStr1!=NULL) delete pStr1;

 

 

 

 

 

 

 

64 bit Winodws OS Check

[Native] C/C++/ATL/[C/C++, ATL] Dev Tips 2015.01.14 11:06 Posted by Sudean(수딘)

WINDOWS OS가 x64 인지 아닌지 체크하는 방법입니다.

 

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); 

 

BOOL CSPDocLibProgressDlg::IsWow64() 

{

           SYSTEM_INFO sysInfo;

           ZeroMemory( &Info, sizeof(SYSTEM_INFO) );

           PGNSI pGetNativeSystemInfo = (PGNSI)GetProcAddress(GetModuleHandle( _T("kernel32.dll") ), "GetNativeSystemInfo");

           if( pGetNativeSystemInfo != NULL )

           {

                     pGetNativeSystemInfo( & sysInfo);

           }

           else

           {

                     GetSystemInfo( & sysInfo);

           }

           if(sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 )

           {                    

                     return TRUE;

           }

           else if(sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL )

           {          

                     return FALSE;

           }

           //ASSERT( FALSE ); // something went majorly wrong

           return FALSE;

}