======================
언어 언어(국가) ANSI OEM
======================
Afrikaans   Afrikaans      1252  850
Albanian   Albanian      1250  852
Arabic    Arabic (Algeria)    1256  720
Arabic    Arabic (Bahrain)    1256  720
Arabic    Arabic (Egypt)     1256  720
Arabic    Arabic (Iraq)     1256  720
Arabic    Arabic (Jordan)     1256  720
Arabic    Arabic (Kuwait)     1256  720
Arabic    Arabic (Lebanon)    1256  720
Arabic    Arabic (Libya)     1256  720
Arabic    Arabic (Morocco)    1256  720
Arabic    Arabic (Oman)     1256  720
Arabic    Arabic (Qatar)     1256  720
Arabic    Arabic (Saudi Arabia)   1256  720
Arabic    Arabic (Syria)     1256  720
Arabic    Arabic (Tunisia)    1256  720
Arabic    Arabic (U.A.E.)     1256  720
Arabic    Arabic (Yemen)     1256  720
Armenian   Armenian      0   1
Azeri (Cyrillic) Azeri (Cyrillic)    1251  866
Azeri (Latin)  Azeri (Latin)     1254  857
Basque    Basque       1252  850
Belarusian   Belarusian      1251  866
Bulgarian   Bulgarian      1251  866
Catalan    Catalan       1252  850
Chinese    Chinese (Hong Kong S.A.R.)  950   950
Chinese    Chinese (Macau S.A.R.)   950   950
Chinese    Chinese (PRC)     936   936
Chinese    Chinese (Singapore)    936   936
Chinese    Chinese (Taiwan)    950   950
Croatian   Croatian      1250  852
Czech    Czech       1250  852
Danish    Danish       1252  850
Divehi    Divehi       0   1
Dutch    Dutch (Belgium)     1252  850
Dutch    Dutch (Netherlands)    1252  850
English    English (Australia)    1252  850
English    English (Belize)    1252  850
English    English (Canada)    1252  850
English    English (Caribbean)    1252  850
English    English (Ireland)    1252  850
English    English (Jamaica)    1252  850
English    English (New Zealand)   1252  850
English    English (Philippines)   1252  437
English    English (South Africa)   1252  437
English    English (Trinidad)    1252  850
English    English (United Kingdom)  1252  850
English    English (United States)   1252  437
English    English (Zimbabwe)    1252  437
Estonian   Estonian      1257  775
Faroese    Faroese       1252  850
Farsi    Farsi       1256  720
Finnish    Finnish       1252  850
French    French (Belgium)    1252  850
French    French (Canada)     1252  850
French    French (France)     1252  850
French    French (Luxembourg)    1252  850
French    French (Monaco)     1252  850
French    French (Switzerland)   1252  850
FYRO    Macedonian FYRO Macedonian  1251  866
Galician   Galician      1252  850
Georgian   Georgian      0   1
German    German (Austria)    1252  850
German    German (Germany)    1252  850
German    German (Liechtenstein)   1252  850
German    German (Luxembourg)    1252  850
German    German (Switzerland)   1252  850
Greek    Greek       1253  737
Gujarati   Gujarati      0   1
Hebrew    Hebrew       1255  862
Hindi    Hindi       0   1
Hungarian   Hungarian      1250  852
Icelandic   Icelandic      1252  850
Indonesian   Indonesian      1252  850
Italian    Italian (Italy)     1252  850
Italian    Italian (Switzerland)   1252  850
Japanese   Japanese      932   932
Kannada    Kannada       0   1
Kazakh    Kazakh       1251  866
Konkani    Konkani       0   1
Korean    Korean       949   949
Kyrgyz    Kyrgyz (Cyrillic)    1251  866
Latvian    Latvian       1257  775
Lithuanian   Lithuanian      1257  775
Malay    Malay (Brunei Darussalam)  1252  850
Malay    Malay (Malaysia)    1252  850
Marathi    Marathi       0   1
Mongolian   Mongolian (Cyrillic)   1251  866
Norwegian(Bokmal) Norwegian (Bokmal)    1252  850
Norwegian(Nynorsk) Norwegian (Nynorsk)    1252  850
Polish    Polish       1250  852
Portuguese   Portuguese (Brazil)    1252  850
Portuguese   Portuguese (Portugal)   1252  850
Punjabi    Punjabi       0   1
Romanian   Romanian      1250  852
Russian    Russian       1251  866
Sanskrit   Sanskrit      0   1
Serbian (Cyrillic) Serbian (Cyrillic)    1251  855
Serbian (Latin)  Serbian (Latin)     1250  852
Slovak    Slovak       1250  852
Slovenian   Slovenian      1250  852
Spanish    Spanish (Argentina)    1252  850
Spanish    Spanish (Bolivia)    1252  850
Spanish    Spanish (Chile)     1252  850
Spanish    Spanish (Colombia)    1252  850
Spanish    Spanish (Costa Rica)   1252  850
Spanish    Spanish (Dominican Republic) 1252  850
Spanish    Spanish (Ecuador)    1252  850
Spanish    Spanish (El Salvador)   1252  850
Spanish    Spanish (Guatemala)    1252  850
Spanish    Spanish (Honduras)    1252  850
Spanish    Spanish (International Sort) 1252  850
Spanish    Spanish (Mexico)    1252  850
Spanish    Spanish (Nicaragua)    1252  850
Spanish    Spanish (Panama)    1252  850
Spanish    Spanish (Paraguay)    1252  850
Spanish    Spanish (Peru)     1252  850
Spanish    Spanish (Puerto Rico)   1252  850
Spanish    Spanish (Traditional Sort)  1252  850
Spanish    Spanish (Uruguay)    1252  850
Spanish    Spanish (Venezuela)    1252  850
Swahili    Swahili       1252  437
Swedish    Swedish       1252  850
Swedish    Swedish (Finland)    1252  850
Syriac    Syriac       0   1
Tamil    Tamil       0   1
Tatar    Tatar       1251  866
Telugu    Telugu       0   1
Thai    Thai       874   874
Turkish    Turkish       1254  857
Ukrainian   Ukrainian      1251  866
Urdu    Urdu       1256  720
Uzbek (Cyrillic) Uzbek (Cyrillic)    1251  866
Uzbek (Latin)  Uzbek (Latin)     1254  857
Vietnamese   Vietnamese      1258  1258
1.  http://sourceforge.net/projects/stlport/ 에서 STLport-5.2.1.tar.bz2 를 받는다.
2. 적당한 위치에 압축을 풀고 커맨드 창을 연다. (설명을 위해
 c:\stlport 에 푼 것으로 가정함)
3. Visual C++ 6.0 이 설치된 디렉토리 (C:\Program Files\Microsoft Visual Studio\VC98\Bin) 에서 VCVARS32.BAT 를 입력해서 환경설정을 해준다.

C:\Program Files\Microsoft Visual Studio\VC98\Bin>VCVARS32.BAT

4. c:\stlport\로 이동한다.

C:\Program Files\Microsoft Visual Studio\VC98\Bin>cd c:\stlport

5. configure를 실행한다. (configure --help 를 입력해보면 도움말이 나오니 참고)

C:\stlport>configure --help
C:\stlport>configure msvc6

6. c:\stlport\build\lib 로 이동하여 nmake clean install 을 입력한다.

C:\stlport>cd build\lib
C:\stlport\build\lib>nmake clean install

7. c:\stlport\build\test\unit 으로  이동하여 nmake clean install 을 입력한다. 

C:\stlport\build\lib>cd ..\test\unit
C:\stlport\build\test\unit>nmake clean install

8. 7번 과정에서 에러가 발생하는데 해당 위치의 테스트 코드가 잘못되어 있다.
 - test\unit\ctype_facets_test.cpp 파일의 430 라인을 다음과 같이 변경한 후 다시 7을 수행한다.

CPPUNIT_ASSERT( ct.is(ctype_base::mask(ctype_base::print | ctype_base::lower | ctype_base::alpha), '?) );

CPPUNIT_ASSERT( ct.is(ctype_base::mask(ctype_base::print | ctype_base::lower | ctype_base::alpha), '?') );

9. Visual C++ 의 Options -> Directories 에서 Include files의 최상단에  c:\stlport\stlport 경로를 추가하고, Library files에 c:\stlport\lib 경로를 추가한다.

참고 자료
STLport의 빠른 설치 가이드
- Visual Studio 6.0에 STLport 5.2.1 설치
- STLport 설치 및 사용 For VC6
- STLport와 boost를 VS.NET 2005에서 사용하기
- Visual C++ 2005에서 STLport 5.1.0 빌드
윈도우에서 컨트롤의 크기 조절은 살짝 복잡하다.
내가 계속 MFC를 만지는 것이라면 항상 기억하겠지만 거의 만질일이 없다보니 계속 까먹어서...
정리해둬야지.

크기를 조절하는 데에는 4개의 함수가 쓰인다.

GetWindowRect() : 전제 화면을 기준으로 하는 위치. 즉 모니터의 좌측 상단이 (0,0) 이 된다.
GetClientRect() : 해당 윈도우의 그릴 수 있는 영역(클라이언트 영역이라고 함). 메모장이라면 텍스트를 입력하는 하얀 부분이 되겠다. 하얀 부분의 좌측 상단이 (0,0) 이 된다.
ScreenToClient() : WindowRect를 ClientRect로 바꿔주는 함수
MoveWindow() : 클라이언트 영역 내에서 윈도우(컨트롤)의 위치와 크기를 변경한다.

이 4가지를 이용하여 다음과 같이 컨트롤의 위치와 크기를 변경할 수 있다. 다음은 에디트 박스를 클라이언트 영역의 오른쪽에서 15, 아래에서 15만큼 떨어진 크기를 갖도록 하는 부분으로 OnSize에서 구현된 내용이다.

void CMyFormView::OnSize(UINT nType, int cx, int cy)
{
  CFormView::OnSize(nType, cx, cy);

  // TODO: 여기에 메시지 처리기 코드를 추가합니다.
  if(m_editLog.GetSafeHwnd() != NULL)
  {
    CRect editLogRect; // 에디트 박스의 영역
    m_editLog.GetWindowRect(editLogRect); // 에디트 박스의 스크린 영역을 구함

    // 에디트 박스의 스크린 영역을 CMyFormView 객체의 클라이언트 영역을 기준으로 변경
    ScreenToClient(editLogRect);

    CRect clientRect;
    GetClientRect(clientRect); // CMyFormView 객체의 클라이언트 영역을 구함

    editLogRect.right = clientRect.right - 15; // 클라이언트 영역의 오른쪽에 15픽셀의 공간을 둔다.
    editLogRect.bottom = clientRect.bottom - 15; // 클라이언트 영역의 하단에 15픽셀의 공간을 둔다.

    m_editLog.MoveWindow(editLogRect); // 에디트 박스의 수정된 위치를 적용함
  }
}

이거 보고 이해가 안된다면 별 수 없다.
그림까지 넣어서 설명하면 훨씬 이해가 잘 되겠지만, 지금은 회사라... ㅡ_ㅡ;;

 "CSIDL_DESKTOP                  {desktop}"

 "CSIDL_INTERNET                 Internet Explorer (icon on desktop)"

 "CSIDL_PROGRAMS                 Start Menu\Programs"

 "CSIDL_CONTROLS                 My Computer\Control Panel"

 "CSIDL_PRINTERS                 My Computer\Printers"

 "CSIDL_PERSONAL                 My Documents"

 "CSIDL_FAVORITES                {user name}\Favorites"

 "CSIDL_STARTUP                  Start Menu\Programs\Startup"

 "CSIDL_RECENT                   {user name}\Recent"

 "CSIDL_SENDTO                   {user name}\SendTo"

 "CSIDL_BITBUCKET                {desktop}\Recycle Bin"

 "CSIDL_STARTMENU                {user name}\Start Menu"

 "CSIDL_DESKTOPDIRECTORY         {user name}\Desktop"

 "CSIDL_DRIVES                   My Computer"

 "CSIDL_NETWORK                  Network Neighborhood"

 "CSIDL_NETHOOD                  {user name}\nethood"

 "CSIDL_FONTS                    windows\fonts"

 "CSIDL_TEMPLATES"

 "CSIDL_COMMON_STARTMENU         All Users\Start Menu"

 "CSIDL_COMMON_PROGRAMS          All Users\Programs"

 "CSIDL_COMMON_STARTUP           All Users\Startup"

 "CSIDL_COMMON_DESKTOPDIRECTORY  All Users\Desktop"

 "CSIDL_APPDATA                  {user name}\Application Data"

 "CSIDL_PRINTHOOD                {user name}\PrintHood"

 "CSIDL_LOCAL_APPDATA            {user name}\Local Settings\Application Data (non roaming)"

 "CSIDL_ALTSTARTUP               non localized startup"

 "CSIDL_COMMON_ALTSTARTUP        non localized common startup"

 "CSIDL_COMMON_FAVORITES"

 "CSIDL_INTERNET_CACHE"

 "CSIDL_COOKIES"

 "CSIDL_HISTORY"

 "CSIDL_COMMON_APPDATA           All Users\Application Data"

 "CSIDL_WINDOWS                  GetWindowsDirectory()"

 "CSIDL_SYSTEM                   GetSystemDirectory()"

 "CSIDL_PROGRAM_FILES            C:\Program Files"

 "CSIDL_MYPICTURES               C:\Program Files\My Pictures"

 "CSIDL_PROFILE                  USERPROFILE"

 "CSIDL_SYSTEMX86                x86 system directory on RISC"

 "CSIDL_PROGRAM_FILESX86         x86 C:\Program Files on RISC"

 "CSIDL_PROGRAM_FILES_COMMON     C:\Program Files\Common"

 "CSIDL_PROGRAM_FILES_COMMONX86  x86 Program Files\Common on RISC"

 "CSIDL_COMMON_TEMPLATES         All Users\Templates"

 "CSIDL_COMMON_DOCUMENTS         All Users\Documents"

 "CSIDL_COMMON_ADMINTOOLS        All Users\Start Menu\Programs\Administrative Tools"

 "CSIDL_ADMINTOOLS               {user name}\Start Menu\Programs\Administrative Tools"


기본적인 파일 관리함수

 

int _access( const char *path, int mode );

 

파일을 엑세스 하기 전에 파일이 실제로 존재하는지 확인하는 함수입니다.

 

path : 조사할 파일의 경로

 

mode: 조사할 상태 지정 ( 0 은 존재, 2 는 쓰기, 4 는 읽기 )

 

return : 요청한 허가 상태를 가지면 0을 리턴, 그렇지 않으면 -1을 리턴

 

 

 

int remove( const char *path );

int _unlink( const char *filename );

 

위의 두 함수는 파일을 삭제 합니다.

 

path : 삭제하고자 하는 파일의 경로만 지정

 

 

 

int rename( const char *oldname, const char *newname );

 

이 함수는 파일의 이름을 변경합니다.

 

oldname : 변경하고자 하는 파일의 이름

 

newname : 새로 설정할 파일의 이름

 

 

 

int _chmod( const char *filename, int pmode );

 

파일의 속성을 변경 합니다.

 

pmode : _S_IWRITE  ,  _S_IREAD  둘중 하나를 주거나 둘다 줄수도 있음

 

 

파일검색 함수

 

long _findfirst( char *filespec, struct _finddata_t *fileinfo );

 

위의 함수로 첫번째 파일 검색 합니다.

 

int _findnext( long handle, struct _finddata_t *fileinfo );

 

위의 함수로 조건이 일치하는 다음 파일을 찾을수 있습니다.

 

int _findclose( long handle );

 

위의 함수로 모든 검색이 완료된 후 검색 핸들을 닫아 줍니다.

 

 

 

디렉토리 관리 함수

 

int _chdir( const char *dirname );

 

현제 작업중인 디렉토리의 경로 변경

 

char *_getcwd( char *buffer, int maxlen );

 

현재 작업 디렉토리를 조사

 

int _mkdir( const char *dirname );

 

디렉토리 생성

 

int _rmdir( const char *dirname );

 

디렉토리 제거

 

void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext );

 

경로 관리 함수로서  4개의 구분자로 분리한다.

 

void _makepath( char *path, const char *drive, const char *dir, const char *fname

                              , const char *ext );

 

경로 관리 함수로서 분리되어 있는 구분자를 합친다.

 

 

 

 

디스크 관리 함수

 

int _getdrive( void );

 

int _chdrive( int drive );

 

위의 두 함수는 작업 드라이브를 조사하거나 변경한다.


출처 : http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10104&eid=4nUPmPpSlArMwqppck/df6nNQlKLaqFi&qb=tfC3usXkuK4gu+jBpiDH1Lz2&pid=fg9d8doi5ThssvOkpoZsss--248289&sid=ST9Q0woyP0kAAEgIOOk


C++ 을 하다보면 절대(순수?) 가상함수를 사용하게 되는 경우가 많다.
그런데 절대 가상함수를 상위에 선언은 해놓고 하위에서는 사용하지 않게 되는 인자가 생길 수 있는데, 이 때 컴파일러에서 뿌려주는 warning을 어떻게 처리해야 될까?

먼저 Visual C++에서는 #pragma warning를 통해 처리할 수 있다. (C4100이 사용되지 않은 인자 warning)


#pragma warning(disable:4100)
// warning 생기는 코드
#pragma warning(default:4100)

이것은 상당히 괜찮은 방법이다. 적어도 Visual C++에서 만큼은 이 warning이 생기지 않도록 해준다.
이건 많은 사람들이 잘 알고 있는 방법이고, 검색해도 이것이 주로 나온다.

그런데 구글 C++ 코딩 스타일 가이드를 보니 이 절대 가상함수 인자에 대해 나온 부분이 있었는데, 내가 왜 이런걸 몰랐나 싶은 생각이 들었다 ㅋㅋ

음... 내가 잘못봤나...?
지금 찾아보니까 또 안 보이네... 다른데서 봤나?

여튼 그 내용은 이랬다.(이랬던것 같다... ㅡㅡ;)


"절대 가상함수를 구현한 함수에서 해당 인자가 사용되지 않을 경우 변수 이름을 쓰지 않는다."

변수 이름을 쓰지 않는 이유는 첫째로 떠오르는 게 함수에서 참조되지 않는다는 것을 명시적으로 표현하는 것이다. 인자의 이름이 없으니 쓸 수가 없지!

그리고 확실하지 않은 두번째 이유는 바로 warning!

난 저런 경우에 warning 잡기 위한 노가다를 많이 해봐서 그런지 딱 보니 이게 제일 궁금했다.

"변수 이름이 없으면 warning을 어떻게 출력하지? 출력 안하지 않을까? 구글도 그런것을 고려해서 결정한 내용이 아닐까?"

훗~ 역시 해보니 warning이 뜨지 않는다.

물론 컴파일러마다 다를수도 있겠지만, 적어도 #pragma보다는 더 범용적이고 라인낭비를 줄이는 일일테지.

하나 배웠다.
다른 것 검색하다가 얻어걸린 것인데... 누가 친절히 번역해놓으셨다. ^^;
다 읽어보진 않았지만 정말 좋은 내용들이다.
나도 나만의 코딩 스타일이 있지만 얘들에 비하면 새발의 피로구나~

단순히 다른 기업의 코딩 스타일일 뿐인데 뭐가 그리 중요하다고 그러느냐는 사람들도 있겠다.
그런데 코딩 스타일을 보면 스타일은 물론이고 그 사람의 실력까지도 대충 짐작할 수 있다는 건 아는지?

코딩 스타일의 목적은 소스를 공유하는 사람들 사이의 가독성이 가장 크다고 하겠지만,
그 가독성을 위한 스타일을 정하기 전에 어떤 이유로 그 스타일을 정할 것인가?
스타일을 정하려면 타당한 이유가 있어야 하지 않겠어?
그런 것들에 관한 지식과 경험이 코딩 스타일에 그대로 녹아들어있다.

번역한 분이 쓰신 것처럼 Effective C++에 언급된 내용들을 고려한 흔적이 많이 보인다.
팀장님에게 이 중 몇가지만 추려서 우리 팀 코딩 스타일로 쓰자고 건의할까? ㅎㅎ
아직 팀에 코딩 스타일이 없다는 것은 문제라면 문제인데...
지금까지는 어차피 개인이 일하는 것이었으니까...

그래도 업무 인수인계할때라도 필요하지 않겠어?
그리고 SVN에 기능별로 쪼개서 자주 커밋한다면 업무인수인계할 때 정말 빠르게 습득할 수 있는데...
리비전별로 달라진 점과 무엇을 구현한건지 로그만 보면 금방인데 ㅋ

그러고보니 난 아직도 앞 사람이 했던 것을 모른다. (같이 근무한 적이 없다)
뭐 정보가 있어야지. 소스만 주면 단가?
STB 소스를 본다면 적어도 그 사람이 작성한 부분에 대해서 표시라도 해 놓던가... ㅡ_ㅡ;

팀내에 SVN의 활용이나 Beyond Compare 같은 소스 비교 툴을 전파시키고 싶은데 생각대로 되지 않는다.
SVN은 그냥 네트워크 폴더일 뿐이고, Beyond Compare는 나만 쓰는 프로그램.

단순히 글 하나 링크하는 것인데 말이 길어졌다. 맨날 이 꼬라지...
만약 링크한 글의 내용이 잘 이해되지 않는다면 스캇 마이어스의 [Effective C++]를 한번 읽어 본 후에
다시 읽어보기 바란다.

#include <io.h> 
 
// "C:\\SourceFolder\\*.*" 같은 형식의 pchFind
functionA(char* pchFind)
{
   struct _finddata_t findData;
   long find_seek = (long)_findfirst(pchFind, &findData );
   while(-1 != find_seek)
   {
      if(strcmp(findData.name, ".") != 0 && strcmp(findData.name, "..") != 0)
      {
         // findData.name 에 파일이름으로 데이터 처리
      }
   }while(_findnext(find_seek, &findData) != -1);
   _findclose(find_seek);
}


싸이 블로그 백업 [하zi 2008.10.17 11:32]

정리 차원에서 쓴다.
MAC Address 가져오는 방법.
이것을 사용해서 Ethernet인 경우의 MAC address만 출력하는 소스.
급조한것이긴 하지만 개발중인 소스를 올릴수는 없지 않은가? ㅡㅡ;;
PrintToHex은 당연히 데이터를 HEX 로 찍는 함수다.


#include <IPHlpApi.h>
#pragma comment(lib, "iphlpapi.lib")

IP_ADAPTER_INFO
*
GetNetworkAdaptersInfo()
{
   DWORD dwBufLen = 0;
   DWORD dwStatus = GetAdaptersInfo(NULL, &dwBufLen);
   ASSERT(dwStatus == ERROR_BUFFER_OVERFLOW);
   IP_ADAPTER_INFO* pAdapterInfo = (IP_ADAPTER_INFO*)malloc(dwBufLen);
   dwStatus = GetAdaptersInfo(pAdapterInfo, &dwBufLen);
   assert(dwStatus == ERROR_SUCCESS);
   if(dwStatus != ERROR_SUCCESS)
   {
      free(pAdapterInfo);
      return NULL;
   }
   return pAdapterInfo;
}
 
void main()
{
   IP_ADAPTER_INFO* pAdaptersInfoList = GetNetworkAdaptersInfo();
   IP_ADAPTER_INFO* pAdapterInfo = pAdaptersInfoList;
   while(NULL != pAdapterInfo)
   {
      if(MIB_IF_TYPE_ETHERNET == pAdapterInfo->Type) // Ethernet == 6
      {
         PrintToHex(pAdapterInfo->Address, pAdapterInfo->AddressLength);
      }
      pAdapterInfo = pAdapterInfo->Next;
   }
   free(pAdaptersInfoList);
}
 
수정을 여기서 직접 해서 돌려보진 못했는데... 돌아가겠지? ㅡㅡ;


싸이 블로그 백업 [하zi 2008.09.18 14:20]

C에서 동적할당은 다음과 같은 방법을 사용한다.
SMyStruct* pObject = (SMyStruct*) malloc(sizeof(SMyStruct));
if(pObject == NULL)
   return;

그리고 C에서 C++로 옮긴 프로그래머들은 자연스럽게 다음과 같은 코드를 쓰는 사람이 많다.
CMyClass* pObject = new CMyClass();
if(pObject == NULL)
   return;
 
나도 C를 하다가 C++를 배웠다. 물론 그 전에도 C++를 보긴 했었지만 내가 배우겠다는 의지를 갖고 본 것은 적어도 2년은 C프로그래머였던 때 이후다.

그래서 나 또한 위 코드에 대해 이상하다는 생각은 전혀 하지 못했다.

C++로 시작한 사람들은 왜 위의 코드가 잘못된 것인지 알까?


싸이 블로그 백업 [2008.06.16 13:21]

+ Recent posts