프로그래밍
- vs6.0 프로젝트 여러개 열기 (더블 클릭으로 새로운 VS로 열기) 2011.09.20
- Charset and CodePage 정리표 2011.08.28 1
- 유니코드, 와이드, 멀티 바이트 문자열 변경 함수 2011.08.28 2
- 메모리 릭( Memory Leak ) 2011.08.17 1
- 자동 포멧 페이크! 2011.07.20
- GetModuleFileName & PathRemoveFileSpec를 이용한 자신의 경로 얻기 자르기 2011.07.15
- 함수 뒤에 _s붙이는 경고 안 띄우기 2011.07.08 1
- winnt.h C4430 "PVOID64" 컴파일에러 2011.07.08 1
- _CLSID_DxDiagProvider, _IID_IDxDiagProvider 2011.07.08
- svn 잔류 파일 삭제, svn 필요없는 파일 삭제, 자주사용하는 command 팝업메뉴에 추가하기 2011.07.07 1
vs6.0 프로젝트 여러개 열기 (더블 클릭으로 새로운 VS로 열기)
Charset and CodePage 정리표
Charset and CodePage 정리표
구분 |
Charset | CodePage |
한국어 | ks_c_5601-1987 | 949 |
IBM EBCDIC(미국-캐나다) | IBM037 | 37 |
OEM 미국 | IBM437 | 437 |
IBM EBCDIC(국제) | IBM500 | 500 |
아랍어(ASMO 708) | ASMO-708 | 708 |
아랍어(DOS) | DOS-720 | 720 |
그리스어(DOS) | ibm737 | 737 |
발트어(DOS) | ibm775 | 775 |
서유럽어(DOS) | ibm850 | 850 |
중앙 유럽어(DOS) | ibm852 | 852 |
OEM 키릴 자모 | IBM855 | 855 |
터키어(DOS) | ibm857 | 857 |
OEM 다국 라틴 문자 I | IBM00858 | 858 |
포르투갈어(DOS) | IBM860 | 860 |
아이슬란드어(DOS) | ibm861 | 861 |
히브리어(DOS) | DOS-862 | 862 |
프랑스어(캐나다)(DOS) | IBM863 | 863 |
아랍어(864) | IBM864 | 864 |
북유럽어(DOS) | IBM865 | 865 |
키릴 자모(DOS) | cp866 | 866 |
현대 그리스어(DOS) | ibm869 | 869 |
IBM EBCDIC(다국 라틴 문자-2) | IBM870 | 870 |
태국어(Windows) | windows-874 | 874 |
IBM EBCDIC(현대 그리스어) | cp875 | 875 |
일본어(Shift-JIS) | iso-2022-jp | 932 |
중국어 간체(GB2312) | gb2312 | 936 |
한국어 | ks_c_5601-1987 | 949 |
중국어 번체(Big5) | big5 | 950 |
IBM EBCDIC(터키어 라틴 문자-5) | IBM1026 | 1026 |
IBM 라틴어-1 | IBM01047 | 1047 |
IBM EBCDIC(미국-캐나다-유럽) | IBM01140 | 1140 |
IBM EBCDIC(독일-유럽) | IBM01141 | 1141 |
IBM EBCDIC(덴마크-노르웨이-유럽) | IBM01142 | 1142 |
IBM EBCDIC(핀란드-스웨덴-유럽) | IBM01143 | 1143 |
IBM EBCDIC(이탈리아-유럽) | IBM01144 | 1144 |
IBM EBCDIC(스페인-유럽) | IBM01145 | 1145 |
IBM EBCDIC(영국-유럽) | IBM01146 | 1146 |
IBM EBCDIC(프랑스-유럽) | IBM01147 | 1147 |
IBM EBCDIC(국제-유럽) | IBM01148 | 1148 |
IBM EBCDIC(아이슬란드어-유럽) | IBM01149 | 1149 |
유니코드 | utf-16 | 1200 |
유니코드(Big-Endian) | unicodeFFFE | 1201 |
중앙 유럽어(Windows) | windows-1250 | 1250 |
키릴 자모(Windows) | windows-1251 | 1251 |
서유럽어(Windows) | Windows-1252 | 1252 |
그리스어(Windows) | windows-1253 | 1253 |
터키어(Windows) | windows-1254 | 1254 |
히브리어(Windows) | windows-1255 | 1255 |
아랍어(Windows) | windows-1256 | 1256 |
발트어(Windows) | windows-1257 | 1257 |
베트남어(Windows) | windows-1258 | 1258 |
한국어(조합) | Johab | 1361 |
서유럽어(Mac) | macintosh | 10000 |
일본어(Mac) | x-mac-japanese | 10001 |
중국어 번체(Mac) | x-mac-chinesetrad | 10002 |
한국어(Mac) | x-mac-korean | 10003 |
아랍어(Mac) | x-mac-arabic | 10004 |
히브리어(Mac) | x-mac-hebrew | 10005 |
그리스어(Mac) | x-mac-greek | 10006 |
키릴 자모(Mac) | x-mac-cyrillic | 10007 |
중국어 간체(Mac) | x-mac-chinesesimp | 10008 |
루마니아어(Mac) | x-mac-romanian | 10010 |
우크라이나어(Mac) | x-mac-ukrainian | 10017 |
태국어(Mac) | x-mac-thai | 10021 |
중앙 유럽어(Mac) | x-mac-ce | 10029 |
아이슬란드어(Mac) | x-mac-icelandic | 10079 |
터키어(Mac) | x-mac-turkish | 10081 |
크로아티아어(Mac) | x-mac-croatian | 10082 |
중국어 번체(CNS) | x-Chinese-CNS | 20000 |
TCA 대만 | x-cp20001 | 20001 |
중국어 번체(Eten) | x-Chinese-Eten | 20002 |
IBM5550 대만 | x-cp20003 | 20003 |
TeleText 대만 | x-cp20004 | 20004 |
Wang 대만 | x-cp20005 | 20005 |
서유럽어(IA5) | x-IA5 | 20105 |
독일어(IA5) | x-IA5-German | 20106 |
스웨덴어(IA5) | x-IA5-Swedish | 20107 |
노르웨이어(IA5) | x-IA5-Norwegian | 20108 |
US-ASCII | us-ascii | 20127 |
T.61 | x-cp20261 | 20261 |
ISO-6937 | x-cp20269 | 20269 |
IBM EBCDIC(독일) | IBM273 | 20273 |
IBM EBCDIC(덴마크-노르웨이) | IBM277 | 20277 |
IBM EBCDIC(핀란드-스웨덴) | IBM278 | 20278 |
IBM EBCDIC(이탈리아) | IBM280 | 20280 |
IBM EBCDIC(스페인) | IBM284 | 20284 |
IBM EBCDIC(일본어 가타카나) | IBM290 | 20290 |
IBM EBCDIC(프랑스) | IBM297 | 20297 |
IBM EBCDIC(아랍어) | IBM420 | 20420 |
IBM EBCDIC(그리스어) | IBM423 | 20423 |
IBM EBCDIC(히브리어) | IBM424 | 20424 |
IBM EBCDIC(한국어 확장) | x-EBCDIC-KoreanExtended | 20833 |
IBM EBCDIC(태국어) | IBM-Thai | 20838 |
키릴 자모(KOI8-R) | koi8-r | 20866 |
IBM EBCDIC(아이슬란드어) | IBM871 | 20871 |
IBM EBCDIC(키릴 자모 러시아어) | IBM880 | 20880 |
IBM EBCDIC(터키어) | IBM905 | 20905 |
IBM 라틴어-1 | IBM00924 | 20924 |
일본어(JIS 0208-1990 및 0212-1990) | EUC-JP | 20932 |
중국어 간체(GB2312-80) | x-cp20936 | 20936 |
한국어(완성) | x-cp20949 | 20949 |
IBM EBCDIC(키릴 자모 세르비아어-불가리아어) | cp1025 | 21025 |
Ext Alpha 소문자 | x-cp21027 | 21027 |
키릴 자모(KOI8-U) | koi8-u | 21866 |
서유럽어(ISO) | iso-8859-1 | 28591 |
중앙 유럽어(ISO) | iso-8859-2 | 28592 |
라틴어 3(ISO) | iso-8859-3 | 28593 |
발트어(ISO) | iso-8859-4 | 28594 |
키릴 자모(ISO) | iso-8859-5 | 28595 |
아랍어(ISO) | iso-8859-6 | 28596 |
그리스어(ISO) | iso-8859-7 | 28597 |
히브리어(ISO-Visual) | iso-8859-8 | 28598 |
터키어(ISO) | iso-8859-9 | 28599 |
에스토니아어(ISO) | iso-8859-13 | 28603 |
라틴어 9(ISO) | iso-8859-15 | 28605 |
히브리어(ISO-Logical) | iso-8859-8-i | 38598 |
일본어(JIS) | iso-2022-jp | 50220 |
일본어(JIS-Allow 1 byte Kana) | iso-2022-jp | 50221 |
일본어(JIS-Allow 1 byte Kana - SO/SI) | iso-2022-jp | 50222 |
한국어(ISO) | euc-kr | 50225 |
중국어 간체(ISO-2022) | x-cp50227 | 50227 |
일본어(EUC) | euc-jp | 51932 |
중국어 간체(EUC) | EUC-CN | 51936 |
한국어(EUC) | euc-kr | 51949 |
중국어 간체(HZ) | hz-gb-2312 | 52936 |
중국어 간체(GB18030) | GB18030 | 54936 |
유니코드(UTF-7) | utf-7 | 65000 |
유니코드(UTF-8) | utf-8 | 65001 |
유니코드, 와이드, 멀티 바이트 문자열 변경 함수
Generic-text | SBCS (_UNICODE & | _MBCS | _UNICODE defined |
routine name | MBCS not defined) | defined | |
_cgetts | _cgets | _cgets | _cgetws |
_cgetts_s | _cgets_s | _cgets_s | _cgetws_s |
_cputts | _cputs | _cputs | _cputws |
_fgettc | fgetc | fgetc | fgetwc |
_fgettchar | _fgetchar | _fgetchar | _fgetwchar |
_fgetts | fgets | fgets | fgetws |
_fputtc | fputc | fputc | fputwc |
_fputtchar | _fputchar | _fputchar | _fputwchar |
_fputts | fputs | fputs | fputws |
_ftprintf | fprintf | fprintf | fwprintf |
_ftprintf_s | fprintf_s | fprintf_s | fwprintf_s |
_ftscanf | fscanf | fscanf | fwscanf |
_ftscanf_s | fscanf_s | fscanf_s | fwscanf_s |
_gettc | getc | getc | getwc |
_gettch | _getch | _getch | _getwch |
_gettchar | getchar | getchar | getwchar |
_gettche | _getche | _getche | _getwche |
_getts | gets | gets | getws |
_getts_s | gets_s | gets_s | getws_s |
_istalnum | isalnum | _ismbcalnum | iswalnum |
_istalpha | isalpha | _ismbcalpha | iswalpha |
_istascii | isascii | isascii | iswascii |
_istcntrl | iscntrl | iscntrl | iswcntrl |
_istdigit | isdigit | _ismbcdigit | iswdigit |
_istgraph | isgraph | _ismbcgraph | iswgraph |
_istlead | Always returns false | _ismbblead | Always returns false |
_istleadbyte | Always returns false | isleadbyte | Always returns false |
_istlegal | Always returns true | _ismbclegal | Always returns true |
_istlower | islower | _ismbclower | iswlower |
_istprint | isprint | _ismbcprint | iswprint |
_istpunct | ispunct | _ismbcpunct | iswpunct |
_istspace | isspace | _ismbcspace | iswspace |
_istupper | isupper | _ismbcupper | iswupper |
_istxdigit | isxdigit | isxdigit | iswxdigit |
_itot | _itoa | _itoa | _itow |
_itot_s | _itoa_s | _itoa_s | _itow_s |
_ltot | _ltoa | _ltoa | _ltow |
_ltot_s | _ltoa_s | _ltoa_s | _ltow_s |
_puttc | putc | putc | putwc |
_puttch | _putch | _putch | _putwch |
_puttchar | putchar | putchar | putwchar |
_putts | puts | puts | _putws |
_sctprintf | _scprintf | _scprintf | _scwprintf |
_sntprintf | _snprintf | _snprintf | _snwprintf |
_sntprintf_s | _snprintf_s | _snprintf_s | _snwprintf_s |
_sntscanf | _snscanf | _snscanf | _snwscanf |
_sntscanf_s | _snscanf_s | _snscanf_s | _snwscanf_s |
_stprintf | sprintf | sprintf | swprintf |
_stprintf_s | sprintf_s | sprintf_s | swprintf_s |
_stscanf | sscanf | sscanf | swscanf |
_stscanf_s | sscanf_s | sscanf_s | swscanf_s |
_taccess | _access | _access | _waccess |
_taccess_s | _access_s | _access_s | _waccess_s |
_tasctime | asctime | asctime | _wasctime |
_tasctime_s | asctime_s | asctime_s | _wasctime_s |
_tccmp | Maps to macro or inline function | _mbsncmp | Maps to macro or inline function |
_tccpy | Maps to macro or inline function | _mbccpy | Maps to macro or inline function |
_tccpy_s | strcpy_s | _mbccpy_s | wcscpy_s |
_tchdir | _chdir | _chdir | _wchdir |
_tclen | Maps to macro or inline function | _mbclen | Maps to macro or inline function |
_tchmod | _chmod | _chmod | _wchmod |
_tcprintf | _cprintf | _cprintf | _cwprintf |
_tcprintf_s | _cprintf_s | _cprintf_s | _cwprintf_s |
_tcreat | _creat | _creat | _wcreat |
_tcscanf | _cscanf | _cscanf | _cwscanf |
_tcscanf_s | _cscanf_s | _cscanf_s | _cwscanf_s |
_tcscat | strcat | _mbscat | wcscat |
_tcscat_s | strcat_s | _mbscat_s | wcscat_s |
_tcschr | strchr | _mbschr | wcschr |
_tcsclen | strlen | _mbslen | wcslen |
_tcsclen_s | strlen_s | _mbslen_s | wcslen_s |
_tcscmp | strcmp | _mbscmp | wcscmp |
_tcscoll | strcoll | _mbscoll | wcscoll |
_tcscpy | strcpy | _mbscpy | wcscpy |
_tcscpy_s | strcpy_s | _mbscpy_s | wcscpy_s |
_tcscspn | strcspn | _mbscspn | wcscspn |
_tcsdec | _strdec | _mbsdec | _wcsdec |
_tcsdup | _strdup | _mbsdup | _wcsdup |
_tcserror | strerror | strerror | _wcserror |
_tcserror_s | strerror_s | strerror_s | _wcserror_s |
_tcsftime | strftime | strftime | wcsftime |
_tcsicmp | _stricmp | _mbsicmp | _wcsicmp |
_tcsicoll | _stricoll | _mbsicoll | _wcsicoll |
_tcsinc | _strinc | _mbsinc | _wcsinc |
_tcslen | strlen | strlen | wcslen |
_tcslen_s | strlen_s | strlen_s | wcslen_s |
_tcslwr | _strlwr | _mbslwr | _wcslwr |
_tcslwr_s | _strlwr_s | _mbslwr_s | _wcslwr_s |
_tcsnbcnt | _strncnt | _mbsnbcnt | _wcsncnt |
_tcsncat | strncat | _mbsnbcat | wcsncat |
_tcsncat_s | strncat_s | _mbsnbcat_s | wcsncat_s |
_tcsnccat | strncat | _mbsncat | wcsncat |
_tcsnccmp | strncmp | _mbsncmp | wcsncmp |
_tcsnccmp_s | strncmp_s | _mbsncmp_s | wcsncmp_s |
_tcsnccoll | _strncoll | _mbsncoll | _wcsncoll |
_tcsncmp | strncmp | _mbsnbcmp | wcsncmp |
_tcsnccnt | _strncnt | _mbsnccnt | _wcsncnt |
_tcsnccpy | strncpy | _mbsncpy | wcsncpy |
_tcsnccpy_s | strncpy_s | _mbsncpy_s | wcsncpy_s |
_tcsncicmp | _strnicmp | _mbsnicmp | _wcsnicmp |
_tcsncicoll | _strnicoll | _mbsnicoll | _wcsnicoll |
_tcsncpy | strncpy | _mbsnbcpy | wcsncpy |
_tcsncpy_s | strncpy_s | _mbsnbcpy_s | wcsncpy_s |
_tcsncset | _strnset | _mbsnset | _wcsnset |
_tcsnextc | _strnextc | _mbsnextc | _wcsnextc |
_tcsnicmp | _strnicmp | _mbsnbicmp | _wcsnicmp |
_tcsnicoll | _strnicoll | _mbsnbicoll | _wcsnicoll |
_tcsninc | _strninc | _mbsninc | _wcsninc |
_tcsnccnt | _strncnt | _mbsnccnt | _wcsncnt |
_tcsnset | _strnset | _mbsnbset | _wcsnset |
_tcspbrk | strpbrk | _mbspbrk | wcspbrk |
_tcsspnp | _strspnp | _mbsspnp | _wcsspnp |
_tcsrchr | strrchr | _mbsrchr | wcsrchr |
_tcsrev | _strrev | _mbsrev | _wcsrev |
_tcsset | _strset | _mbsset | _wcsset |
_tcsspn | strspn | _mbsspn | wcsspn |
_tcsstr | strstr | _mbsstr | wcsstr |
_tcstod | strtod | strtod | wcstod |
_tcstoi64 | _strtoi64 | _strtoi64 | _wcstoi64 |
_tcstok | strtok | _mbstok | wcstok |
_tcstok_s | strtok_s | _mbstok_s | wcstok_s |
_tcstol | strtol | strtol | wcstol |
_tcstoui64 | _strtoui64 | _strtoui64 | _wcstoui64 |
_tcstoul | strtoul | strtoul | wcstoul |
_tcsupr | _strupr | _mbsupr | _wcsupr |
_tcsupr_s | _strupr_s | _mbsupr_s | _wcsupr_s |
_tcsxfrm | strxfrm | strxfrm | wcsxfrm |
_tctime | ctime | ctime | _wctime |
_tctime_s | ctime_s | ctime_s | _wctime_s |
_tctime32 | _ctime32 | _ctime32 | _wctime32 |
_tctime32_s | _ctime32_s | _ctime32_s | _wctime32_s |
_tctime64 | _ctime64 | _ctime64 | _wctime64 |
_tctime64_s | _ctime64_s | _ctime64_s | _wctime64_s |
_texecl | _execl | _execl | _wexecl |
_texecle | _execle | _execle | _wexecle |
_texeclp | _execlp | _execlp | _wexeclp |
_texeclpe | _execlpe | _execlpe | _wexeclpe |
_texecv | _execv | _execv | _wexecv |
_texecve | _execve | _execve | _wexecve |
_texecvp | _execvp | _execvp | _wexecvp |
_texecvpe | _execvpe | _execvpe | _wexecvpe |
_tfdopen | _fdopen | _fdopen | _wfdopen |
_tfindfirst | _findfirst | _findfirst | _wfindfirst |
_tfindnext | _findnext | _findnext | _wfindnext |
_tfindnext32 | _findnext32 | _findnext32 | _wfindnext32 |
_tfindnext64 | _findnext64 | _findnext64 | _wfindnext64 |
_tfindnexti64 | _findnexti64 | _findnexti64 | _wfindnexti64 |
_tfindnexti6432 | _findnexti6432 | _findnexti6432 | _wfindnexti6432 |
_tfindnext32i64 | _findnext32i64 | _findnext32i64 | _wfindnext32i64 |
_tfopen | fopen | fopen | _wfopen |
_tfopen_s | fopen_s | fopen_s | _wfopen_s |
_tfreopen | freopen | freopen | _wfreopen |
_tfreopen_s | freopen_s | freopen_s | _wfreopen_s |
_tfsopen | _fsopen | _fsopen | _wfsopen |
_tfullpath | _fullpath | _fullpath | _wfullpath |
_tgetcwd | _getcwd | _getcwd | _wgetcwd |
_tgetdcwd | _getdcwd | _getdcwd | _wgetdcwd |
_tgetenv | getenv | getenv | _wgetenv |
_tgetenv_s | getenv_s | getenv_s | _wgetenv_s |
_tmain | main | main | wmain |
_tmakepath | _makepath | _makepath | _wmakepath |
_tmakepath_s | _makepath_s | _makepath_s | _wmakepath_s |
_tmkdir | _mkdir | _mkdir | _wmkdir |
_tmktemp | _mktemp | _mktemp | _wmktemp |
_tmktemp_s | _mktemp_s | _mktemp_s | _wmktemp_s |
_topen | _open | _open | _wopen |
_topen_s | _open_s | _open_s | _wopen_s |
_totlower | tolower | _mbctolower | towlower |
_totupper | toupper | _mbctoupper | towupper |
_tperror | perror | perror | _wperror |
_tpopen | _popen | _popen | _wpopen |
_tprintf | printf | printf | wprintf |
_tprintf_s | printf_s | printf_s | wprintf_s |
_tputenv | _putenv | _putenv | _wputenv |
_tputenv_s | _putenv_s | _putenv_s | _wputenv_s |
_tremove | remove | remove | _wremove |
_trename | rename | rename | _wrename |
_trmdir | _rmdir | _rmdir | _wrmdir |
_tsearchenv | _searchenv | _searchenv | _wsearchenv |
_tsearchenv_s | _searchenv_s | _searchenv_s | _wsearchenv_s |
_tscanf | scanf | scanf | wscanf |
_tscanf_s | scanf_s | scanf_s | wscanf_s |
_tsetlocale | setlocale | setlocale | _wsetlocale |
_tsopen | _sopen | _sopen | _wsopen |
_tsopen_s | _sopen_s | _sopen_s | _wsopen_s |
_tspawnl | _spawnl | _spawnl | _wspawnl |
_tspawnle | _spawnle | _spawnle | _wspawnle |
_tspawnlp | _spawnlp | _spawnlp | _wspawnlp |
_tspawnlpe | _spawnlpe | _spawnlpe | _wspawnlpe |
_tspawnv | _spawnv | _spawnv | _wspawnv |
_tspawnve | _spawnve | _spawnve | _wspawnve |
_tspawnvp | _spawnvp | _spawnvp | _wspawnvp |
_tspawnvpe | _spawnvpe | _spawnvpe | _wspawnvpe |
_tsplitpath | _splitpath | _splitpath | _wsplitpath |
_tstat | _stat | _stat | _wstat |
_tstat32 | _stat32 | _stat32 | _wstat32 |
_tstati32 | _stati32 | _stati32 | _wstati32 |
_tstat64 | _stat64 | _stat64 | _wstat64 |
_tstati64 | _stati64 | _stati64 | _wstati64 |
_tstof | atof | atof | _wtof |
_tstoi | atoi | atoi | _wtoi |
_tstoi64 | _atoi64 | _atoi64 | _wtoi64 |
_tstol | atol | atol | _wtol |
_tstrdate | _strdate | _strdate | _wstrdate |
_tstrdate_s | _strdate_s | _strdate_s | _wstrdate_s |
_tstrtime | _strtime | _strtime | _wstrtime |
_tstrtime_s | _strtime_s | _strtime_s | _wstrtime_s |
_tsystem | system | system | _wsystem |
_ttempnam | _tempnam | _tempnam | _wtempnam |
_ttmpnam | tmpnam | tmpnam | _wtmpnam |
_ttmpnam_s | tmpnam_s | tmpnam_s | _wtmpnam_s |
_ttoi | atoi | atoi | _wtoi |
_ttoi64 | _atoi64 | _atoi64 | _wtoi64 |
_ttol | atol | atol | _wtol |
_tunlink | _unlink | _unlink | _wunlink |
_tutime | _utime | _utime | _wutime |
_tutime32 | _utime32 | _utime32 | _wutime32 |
_tutime64 | _utime64 | _utime64 | _wutime64 |
_tWinMain | WinMain | WinMain | wWinMain |
_ui64tot | _ui64toa | _ui64toa | _ui64tow |
_ui64tot_s | _ui64toa_s | _ui64toa_s | _ui64tow_s |
_ultot | _ultoa | _ultoa | _ultow |
_ultot_s | _ultoa_s | _ultoa_s | _ultow_s |
_ungettc | ungetc | ungetc | ungetwc |
_ungettch | _ungetch | _ungetch | _ungetwch |
_vftprintf | vfprintf | vfprintf | vfwprintf |
_vftprintf_s | vfprintf_s | vfprintf_s | vfwprintf_S |
_vsctprintf | _vscprintf | _vscprintf | _vscwprintf |
_vsctprintf_s | _vscprintf_s | _vscprintf_s | _vscwprintf_S |
_vsntprintf | _vsnprintf | _vsnprintf | _vsnwprintf |
_vsntprintf_s | _vsnprintf_s | _vsnprintf_s | _vsnwprintf_s |
_vstprintf | vsprintf | vsprintf | vswprintf |
_vstprintf_s | vsprintf_s | vsprintf_s | vswprintf_s |
_vtprintf | vprintf | vprintf | vwprintf |
_vtprintf_s | vprintf_s | vprintf_s | vwprintf_s |
메모리 릭( Memory Leak )
펌글
CRT( C Runtime library )를 사용합시다.
아래의 코드를 사용하면 메모리 릭( 메모리 누수, Memory Leak )에 효과적으로 대처할 수 있다.
주의할 점은 사용법을 명확히 숙지하고서 사용할 것.
Introduce.
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
{
// Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif
다이렉트 X예제를 살펴보면 wWinMain시작 부분에 위와 같은 코드를 만날 수 있다.
이 코드는 디버그 시에 메모리릭이 발생하면 출력창에 몇 번지에서 얼마 크기의 메모리가 해제되지 않았는지를 표시 해 준다.
또한 메모리릭을 체크하기 위해서 <crtdbg.h>를 인클루드 해 줘야 하는데 DXUT.H를 인클루드 했다면 내부에서 <crtdbg.h>를
인클루드 해 주므로 따로 해 줄 필요가 없다.
아래에서 #define new 부분만 처리 해 주자.
아래에서 사용하는 코드들은
#if defined(DEBUG) | defined(_DEBUG)
로 감싸져 있기 때문에 릴리즈 모드에서는 동작하지 않는다. 또한 릴리즈 모드에서는 인클루드 자체가 제외 되기 때문에 효율을 걱정할
필요가 없다.
Step 1.
#if defined(DEBUG) || defined(_DEBUG)
#include <crtdbg.h>
#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif
필요한 헤더를 인클루드 해 주고
#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
new자체를 새로 정의 해 버렸다. 메모리 릭 보고를 해 줄 때 릭을 발생시킨 녀석의 파일 이름과 라인을 출력 해 주어서 디버깅 시에 출력창에서 바로 찾아볼 수 있다. __FILE__과 __LINE__는 미리 정의된 매크로로 가끔 사용해 주면 유용하다.
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
이 녀석이 실제적으로 출력창에 메모리 릭 보고를 해 준다. 5가지의 Flag가 있다.
_CRTDBG_ALLOC_MEM_DF
디폴트로 켜져 있으며, 디버그 버전에서 모든 메모리 할당이 일어날 때마다 추적 가능하도록 특별한 기능을 추가해 둔다. 이 플랙이 켜져 있어야 메모리 누수를 안전하게 검사 할 수 있다.
_CRTDBG_DELAY_FREE_MEM_DF
delete, free등으로 삭제되어도 바로 삭제되지 않고, CRT의 메모리 관리소에 남아 있다가 프로그램 종료시에 완전히 삭제된다.
_CRTDBG_CHECK_ALWAYS_DF
모든 메모리관련 연산에서 _CrtCheckMemory를 호출한다.
_CRTDBG_CHECK_CRT_DF
CRT가 내부적으로 할당한 블록도 메모리를 체크할 때 포함한다. 일반적으로는 CRT가 할당한 블록은 메모리 체크에서 제외된다. 일반적으로 사용하지 않는다
_CRTDBG_LEAK_CHECK_DF
프로그램이 완전히 종료되기 직전에 아직 해제되지 않은 메모리가 있는지 검사한다. 프로그램의 종료 포인트가 여러군데 있는 경우에 사용하면 일일이 _CrtDumpMemoryLeaks 메소드를 호출하지 않아도 자동적으로 메모리 누수를 검사할 수 있게된다.
Step 2.
메모리 할당이 시작되기 이전에 최상위에 만들어 두자.
Step 3.
Detected memory leaks!
Dumping objects ->
{840} normal block at 0x0109E460, 320 bytes long.
Data: < _ > 9C 07 5F 00 CD CD CD CD CD CD CD CD CD CD CD CD
{838} normal block at 0x0109E398, 46 bytes long.
Data: <1 m B o x A > 31 00 6D 00 20 00 42 00 6F 00 78 00 20 00 41 00
{837} normal block at 0x0109E258, 260 bytes long.
Data: <testAlpha.tga > 74 65 73 74 41 6C 70 68 61 2E 74 67 61 00 CD CD
{836} normal block at 0x0109E218, 4 bytes long.
Data: < e > C0 65 1C 00
{835} normal block at 0x0109E198, 68 bytes long.
Data: < ? ? ? ?> 00 00 80 3F 00 00 80 3F 00 00 80 3F 00 00 80 3F
{834} normal block at 0x0109E128, 48 bytes long.
Data: < _ SA `W > A8 09 5F 00 98 E3 09 01 18 53 41 01 60 57 1C 00
Object dump complete.
D3DX: MEMORY LEAKS DETECTED: 3 allocations unfreed (708 bytes)
D3DX: Set HKLM\Software\Microsoft\Direct3D\D3DXBreakOnAllocId=0x21b to debug
고의적인 릭 발생이다.
#define로 new를 매크로로 씌워 놓은 것은 다이렉트에서 사용하는 메모리 체크 기능때문인지 제대로 안먹히는것 같아 보인다.
메모리릭은 첫번째 할당된 순서 그리고 주소 크기를 보여주고
메모리 안에 위치한 데이터를 보여준다.
DXUT를 사용하지 않은 프로젝트에서는 new를 매크로로 씌워 놓았을 때 출력창에서 릭이 발생한 파일과 줄 번호가 표시되어 이를 더블 클릭하면 그 위치를 직접 보여준다.
Step 4.
_CrtSetBreakAlloc( Number );
할당된 순서를 알 수 있다면 다음을 추가 시켜주자. 지정된 메모리가 할당될 때 디버깅을 중지하고 제어권을 디버거에게 넘긴다. 즉 어떤 놈이 할당을 시도하고 무책임하게 떠났는지 알 수 있다.
_CrtCheckMemory()
이 함수가 호출된 시점에서 지금까지 동적 할당된 모든 메모리를 체크해서 문제가 발생한 녀석이 있으면 0을 리턴한다.
0xFD : 메모리 블록 양 끝의 버퍼에 생성된다
0xCD : 새로 생성된 버퍼에 저장되는 기본값이다
0xCC : 스택에 변수가 생성되면 우선 이값으로 채워진다
0xDD : 삭제된 메모리 블록은 이 값으로 채워진다
P.S.
DirectX프로그래밍이 아닐때도 위 내용은 유용하게 사용할 수 있지만 만약 DirectX프로그래밍을 하고 있다면 추가적인 팁이 있다.
DirectX의 경우에는 COM기반의 프로그래밍 언어인데 인터페이스를 얻어온 후 Release를 하지 않았거나 혹은 AddRef()로 늘어난 래퍼런스 카운터에 맞게 Release()가 호출이 되지 않았다면 릭이 발생할 수 있다.
간혹 이런 경우 위의 함수들이 메모리릭을 일으킨 정확한 시점을 감지하지 못하는 경우가 생긴다. 그 때에는 D3DX에서 출력창에 띄워준 정보를 바탕으로 메모리릭을 찾을 수 있다.
D3DX: MEMORY LEAKS DETECTED: 3 allocations unfreed (708 bytes)
D3DX: Set HKLM\Software\Microsoft\Direct3D\D3DXBreakOnAllocId=0x21b to debug
위에서 봤던 출력창 메시지의 제일 마지막 2줄이다.
아래와 같은 순서로 메모리릭을 일으킨 인터페이스가 생성되는 시점을 찾을 수 있다.
1. 시작프로그램의 실행에서 REGEDIT를 실행해서 레지스트리 편집기를 실행하자.
2. HKEY_LOCAL_MACHINE -> SOFTWARE -> Microsoft -> Direct3D 의 위치로 이동
( 설명된 위치 이외의 키들을 건드릴 경우 시스템에 치명적인 손상을 줄 수 있음 )
3. D3DXBreakOnAllocId 라는 키가 존재하는 지 확인 하고 없을 경우에는
새로만들기 -> DWORD값 으로 새 키를 만들어 주고 이름을 위와 같이 설정 해 주자.
( 비슷한 이름의 키가 존재할 수 있으니 이름이 정확히 맞는지 확인할 것 ! )
4. 값에 16진수로 0x21b값을 적어주자.
( 이 값은 출력창에 표시된 위의 값이다. 0x는 빼고 적어주자. )
5. 이제 디버그 모드로 실행을 시키면 메모리릭을 일으킨 범인이 할당되는 순간
브레이크 포인트를 걸고 제어권을 사용자에게 넘겨준다.
자동 포멧 페이크!
GetModuleFileName & PathRemoveFileSpec를 이용한 자신의 경로 얻기 자르기
#include <Shlwapi.h>
#pragma comment( lib, "shlwapi.lib" )
<코드>
const int N_BUF_SIZE = 1024;
TCHAR tcPath[N_BUF_SIZE] = {0, };
GetModuleFileName( NULL, tcPath, N_BUF_SIZE );
-> tcPath == E:\KOW\branches\Release\ErrorController.exe
PathRemoveFileSpec( tcPath );
-> tcPath == E:\KOW\branches\Release
PathRemoveFileSpec( tcPath );
-> tcPath == E:\KOW\branches
함수 뒤에 _s붙이는 경고 안 띄우기
보안상 좋지 않지만 현실과 타협...!
경고가 나타나지 않도록 하기 위해서는
프로젝트 속성-> C/C++ -> 전처리기 정의-> "_CRT_SECURE_NO_WARNINGS" 디파인 추가
winnt.h C4430 "PVOID64" 컴파일에러
나의 해결책
#ifndef POINTER_64
#define POINTER_64
#endif
typedef void *PVOID;
typedef void * POINTER_64 PVOID64;
------------- 스크랩 1 -------------
POINTER_64가 정의되지 않아서 생기는 에러인 듯하다.
winnt.h에 다음 한 줄을 추가하면 해결된다.
#define POINTER_64 __ptr64 // 추가
typedef void *PVOID;
typedef void * POINTER_64 PVOID64;
그 외 잡다한 변수선언 관련 컴파일에러들은 Microsoft가 지키지 않던 C++ scope 관련 표준들을 최근에 와서 지킴으로써 발생하는 것들이 많아보인다.
무조건 선언해주도록 하자. -_-
몇 번 씩 당했던 문제들이지만 그 솔루션을 외우고 있지는 않고... 다행인 것은 다시 구글에서 찾는 시간이 매번 조금씩 짧아져간다는 것이다. ㅜㅜ
결국 DirectShow 관련 일은 개발환경 세팅이 반이라는 결론에 다다른다 (뭐 다른 일들도 크게 다르지 않지만).
위 에러의 원인은...
------------- 스크랩 3 -------------
vs 2005에서 나오는 문제임.
문제 :
winnt.h 에서
typedef void * POINTER_64 PVOID64; 을 컴파일할때
error C2146: 구문 오류 : ';'이(가) 'PVOID64' 식별자 앞에 없습니다.
에러가 뜸.
원인 :
POINTER_64 가 basestd.h 에서 정의되지 못하는 문제.
해결책 :
주의. 64bit 환경일때는 테스트 못해 봄
1. winnt.h 를 수정하는 방법
#define POINTER_64 // 추가
typedef void *PVOID;
typedef void * POINTER_64 PVOID64;
2. stdafx.h 에서 다른 파일을 include 하기 전에 define 을 추가
#define POINTER_64 // 추가
#include ...
_CLSID_DxDiagProvider, _IID_IDxDiagProvider
svn 잔류 파일 삭제, svn 필요없는 파일 삭제, 자주사용하는 command 팝업메뉴에 추가하기
FOR /R %1 %%1 IN (.svn) DO RMDIR /S /Q "%%1"
bat 파일 만들고 원하는 폴더 드래그해서 넣으면 됨
2. 마우스 우 클릭하기
다음과 같은 .reg파일을 만들어 레지스트리에 등록하면 .svn폴더를 지워주는 메뉴가 우클릭 팝업에 추가됨.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \"