์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

๋ฐฑํƒ (bektekk@yahoo.co.kr)
ํ™ˆํŽ˜์ด์ง€ : http://bektekk.wo.to

๋ฌธ์ž์—ด(์ŠคํŠธ๋ง) ์ „๊ฒฉ ๋ถ„์„ 2๊ฐ•

๋ณธ๊ฐ•์ขŒ๋Š” ์ฝ”๋“œ ํ”„๋กœ์ ํŠธ์— ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์ธ Michael Dunn์˜ ๊ฐ•์ขŒ
The Complete Guide to C++ Strings, Part I ๊ณผ II ๋ฅผ ๋ฒˆ์—ญํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.
์ตœ๋Œ€ํ•œ ์˜์—ญ์„ ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์ง€๋งŒ, ์ด๋Ÿฐ์ชฝ์˜ ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•˜๋‹ค ๋ณด๋‹ˆ ๋งŽ์ด ๋ชจ์ž๋ž€
๊ฐ•์ขŒ๊ฐ€ ๋˜๊ฒ ์ง€๋งŒ, ๋งŽ์€ ๋„์›€์ด ๋˜์…จ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐํƒ€ ๋ฌธ์˜ ์‚ฌํ•ญ์ด๋‚˜ ์งˆ๋ฌธ์€ ์ชฝ์ง€๋‚˜ ๋ฉ”์ผ์„ ์ด์šฉํ•ด ์ฃผ์…จ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.
๋ณธ๊ฐ•์ขŒ๋Š” ์ œ ํ™ˆํŽ˜์ด์ง€(์œ„์˜ ๋งํฌ)๋ฅผ ํ†ตํ•ด์„œ๋„ ๋ณด์‹ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฒˆ๊ฐ• ๊นŒ์ง€๊ฐ€ ์ข€ ์ง€๋ฃจํ•˜๊ฒ ๋„ค์š”.
๋‹ค์Œ๊ฐ• ๋ถ€ํ„ฐ๋Š” ์‹ค์ œ ํด๋ž˜์Šค๋“ค์„ ๋‹ค๋ฃจ์–ด์„œ ์กฐ๊ธˆ์€ ๋œ ์ง€๋ฃจํ• ๊ฑฐ๋ผ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค.

์ŠคํŠธ๋ง์„ ์กฐ์ž‘ํ•˜๊ธฐ^^

์šฐ๋ฆฌ๋Š” ์ฒ˜์Œ C๋ฅผ ๋ฐฐ์šธ๋•Œ ๋ถ€ํ„ฐ SBCS ์ŠคํŠธ๋ง์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ต์ˆ™ํ•ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. strlen() ๊ฐ™์€ ํ•จ์ˆ˜๋Š” ์•„๋งˆ ์ฒ˜์Œ C๊ณต๋ถ€ํ•˜์‹ค๋•Œ ๋ˆ„๊ตฌ๋‚˜ ์จ๋ณด์…จ์„ ๊ฒƒ์ด๊ณ  ์•„์ง๋„ ์“ฐ์‹œ๊ณ  ๊ณ„์‹ค๊ฒ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ดˆ๋ณดํ‹ฐ๋ฅผ ๋ง‰ ๋ฒ—์„๋•Œ char* ํƒ€์ž…์„ ์ด์šฉํ•ด ++, -- ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ๊ฐ€๋ฉด์„œ ๋ฌธ์ž์—ด ์กฐ์ž‘๋“ค์„ ํ•ด๋ดค์„๊ฒ๋‹ˆ๋‹ค. ๋˜ํ•œ [] ์‹์˜ ๋ฐฐ์—ดํ‘œํ˜„๋ฒ•์œผ๋กœ ์บ๋ฆญํ„ฐ ํ•˜๋‚˜์”ฉ ๊ฐ’์„ ์–ป์–ด์˜ค๋Š” ๊ฒƒ์—๋„ ์ด๋ฏธ ์ต์ˆ™ํ•˜์‹ค ๊ฒ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ผ๋ จ์˜ ์ž‘์—…๋“ค์€ SBCS ๋‚˜ Unicode ์ŠคํŠธ๋ง์—์„œ๋Š” ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ชจ๋“ ์บ๋ฆญํ„ฐ๋Š” ๊ฐ™์€ ๊ธธ์ด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. SBCS์—์„œ๋Š” 1๋ฐ”์ดํŠธ ์œ ๋‹ˆ์ฝ”๋“œ์—์„œ๋Š” 2๋ฐ”์ดํŠธ ์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

ํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” DBCS ์ฆ‰, 2๋ฐ”์ดํŠธ์ด์ƒ์˜ ์บ๋ฆญํ„ฐ๋“ค์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ด๋Ÿฐ ์Šต๊ด€๋“ค์„ ๋ฐ˜๋“œ์‹œ ๋ฒ„๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ DBCS ์ŠคํŠธ๋ง์„ ์“ธ๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์•ผ ํ•  ๋‘๊ฐ€์ง€์˜ ๋ฃฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฃฐ์„ ์–ด๊ธฐ๋ฉด ์•ผ๊ทผ์ด ๋ฒ„๊ทธ ์žก๋А๋ผ ์ข‹์•„ํ•˜๋Š” ๋“œ๋ผ๋งˆ๋„ ๋ชป๋ณด์‹œ๊ณ , ์•ผ๊ทผ ํ•˜๋žด, ๋จธ๋ฆฌ ๋น ์ง€๋žด ๊ณ ์ƒ๋“ค์ด ๋งŽ์œผ์‹ค ๊ฒ๋‹ˆ๋‹ค. ^^ (๋„ˆ๋ฌด ์žฅํ™ฉํ•˜๊ฒŒ ๋Š˜์–ด๋†“์•˜๋„ค์š”)

์ฒซ์งธ, Lead Byte๋ฅผ ์ฑ„ํฌํ•ด์ง€ ์•Š์„๊ฑฐ๋ฉด ์ ˆ๋Œ€ ++ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์„ ํ•˜์ง€๋ง๊ฒƒ

๋‘˜์งธ. ์ ˆ๋Œ€ ์ ˆ๋Œ€ -- ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์„ ํ•˜์ง€ ๋ง๊ฒƒ

๋จผ์ € ๋‘๋ฒˆ์งธ ๋ฃฐ์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์„ค๋ช…ํ•˜๊ธฐ ์‰ฝ๊ธฐ๋•Œ๋ฌธ์—^^. ์—ฌ๋Ÿฌ๋ถ„์ด ์„ค์ •ํ™”์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค. ์‹คํ–‰ํ•˜๋ฉด ๊ทธ ํ”„๋กœ๊ทธ๋žจ์€ ๊ทธ ์„ค์ •ํŒŒ์ผ์„ ์ฝ์–ด์„œ ์ž‘์—…ํ•˜๊ฒŸ์ฃ ? ๋งŒ์•ฝ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ๋กœ๊ฐ€ C:\Program Files\MyCoolApp์ด๊ณ , ์„ค์ •ํŒŒ์ผ์€ C:\Program Files\MyCoolApp\config.bin ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์„ค์ •ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์–ป์–ด์˜ค๋Š” ํ•จ์ˆ˜๋ฅผ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

bool GetConfigFileName ( char* pszName, size_t nBuffSize )
{
char szConfigFilename[MAX_PATH];
 
    // ์ธ์Šคํ†จ๋œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์–ป์–ด์˜จ๋‹ค.
    // .....

    // ๋งŒ์•ฝ ๋งˆ์ง€๋ง‰ ์บ๋ฆญํ„ฐ๊ฐ€ ๋ฐฑ์Šฌ๋ž˜์‹œ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.
    // ์šฐ์„  ๋งˆ์ง€๋ง‰ ์บ๋ฆญํ„ฐ๋ฅผ ๊ตฌํ•œ๋‹ค.
    char* pLastChar = strchr ( szConfigFilename, '\0' );
 
    // *** ์ž ํ•œ์นธ ์•ž์œผ๋กœ ๊ฐ€์ž ***
    pLastChar--;  
 
    // ๋ฐฑ ์Šฌ๋ž˜์‹œ ์ถ”๊ฐ€
    if ( *pLastChar != '\\' )
        strcat ( szConfigFilename, "\\" );
 
    // ์„ค์ •ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ ๋์— ํ™”์ผ๋ช… ์ถ”๊ฐ€
    strcat ( szConfigFilename, "config.bin" );
 
    // ๋ฆฌํ„ด
    if ( strlen ( szConfigFilename ) >= nBuffSize )
        return false;
    else
        {
        strcpy ( pszName, szConfigFilename );
        return true;
        }
}

์ด ๋ฃจํ‹ด์€ ์ž˜์งœ์—ฌ์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠน์ •ํ•œ DBCS์บ๋ฆญํ„ฐ์—์„œ๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์ด "C:\๋””๋ ‰ํ† ๋ฆฌ" ์™€ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๋ฉด. ๊ทธ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. :

43
3A
5C
83 88
83 45
83 52
83 5C
00

LB TB
LB TB
LB TB
LB TB

C
:
\

๋””

๋ ‰

ํ† 

๋ฆฌ

EOS

GetConfigFileName() ํ•จ์ˆ˜๊ฐ€ ๋งˆ์ง€๋ง‰ ๋ฐฑ์Šฌ๋ž˜์‹œ๋ฅผ ํ™•์ธํ• ๋•Œ ๋งˆ์ง€๋ง‰ 0์ด ์•„๋‹Œ ๋ฐ”์ดํŠธ๋ฅผ ํ™•์ธํ•˜๋Š”๊ฑธ ๋ณผ์ˆ˜๊ฐ€ ์žˆ์œผ์‹ค ๊ฒ๋‹ˆ๋‹ค. (--ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์œผ๋กœ) ๊ทธ๋ฆฌ๊ณ  ๊ฐ™์ด '\\' ์ธ์ง€ == ์—ฐ์‚ฐ์ž๋กœ ํ™•์ธํ–ˆ์ง€๋งŒ ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ์ด ๋ฃจํ‹ด์€ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋ฌด์—‡์ด ์ž˜๋ชป ๋˜์—ˆ์„๊ฐ€์š”? ์œ„์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์—์„œ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•œ ๋‘ ๋ฐ”์ดํŠธ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋ฐฑ์Šฌ๋ž˜์‹œ์˜ ๊ฐ’์€ 0x5C์ด๊ณ  '๋ฆฌ'์˜ ๊ฐ’์€ 83 5C ์ž…๋‹ˆ๋‹ค. (๋ฌด์–ธ๊ฐ€ ๋ˆˆ์น˜ ์ฑ„์…จ๊ฒ ์ฃ ?.. ^^) ์œ„์˜ ๋ฃจํ‹ด์€ '๋ฆฌ'์˜ TB์ฆ‰ Trail Byte๋งŒ์„ ์ฝ๊ณ  '\\'์™€ ๊ฐ™์€ ๊ฐ™์œผ๋กœ ๊ฐ„์ฃผํ•ด ๋ฒ„๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด --ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ทธ์— ์ƒ์‘ํ•˜๋Š” DBCS๋ฅผ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋Œ€์ฒด ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜์ •ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. :

bool FixedGetConfigFileName ( char* pszName, size_t nBuffSize )
{
    char szConfigFilename[MAX_PATH];
 
    char* pLastChar = _mbschr ( szConfigFilename, '\0' );
 
    // ์ž ์ด์ œ ์ œ๋Œ€๋กœ ๋œ๋‹ค.
    // ์ด์ „ ์บ๋ฆญํ„ฐ๋กœ ์ด๋™ํ•œ๋‹ค. ์ด๊ฒƒ์€ 1๋ฐ”์ดํŠธ ์ผ์ˆ˜๋„ ์žˆ๊ณ 
    // 2๋ฐ”์ดํŠธ ์ผ์ˆ˜๋„ ์žˆ๋‹ค.
    pLastChar = CharPrev ( szConfigFilename, pLastChar );
 
    if ( *pLastChar != '\\' )
        _mbscat ( szConfigFilename, "\\" );
 
    _mbscat ( szConfigFilename, "config.bin" );

    if ( _mbslen ( szInstallDir ) >= nBuffSize )
        return false;
    else
        {
        _mbscpy ( pszName, szConfigFilename );
        return true;
        }
}

์œ„์˜ ์ˆ˜์ •๋œ ๋ฃจํ‹ด์€ ํ•œ ์บ๋ฆญํ„ฐ ์ „์œผ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•ด CharPrev() API ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ•œ ์บ๋ฆญํ„ฐ๋Š” ์œ„์˜ ์˜ˆ์—์„œ์™€ ๊ฐ™์ด 2๋ฐ”์ดํŠธ๋ฅผ ์ฐจ์ง€ํ•  ์ˆ˜๋„ ์žˆ๊ณ , 1๋ฐ”์ดํŠธ ์ผ์ˆ˜๋„ ์žˆ์œผ๋‚˜, CharPrev() ํ•จ์ˆ˜๋Š” ์ด๋ฅผ ์Šค์Šค๋กœ ํ™•์ธํ•˜๊ณ  ์ œ๋Œ€๋กœ ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ํ•จ์ˆ˜๋Š” ์ œ๋Œ€๋กœ๋œ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฆฌํ„ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค..

์ด์ œ, ์—ฌ๋Ÿฌ๋ถ„์€ ์œ„์˜ 1๋ฒˆ ๊ทœ์น™์„ ๊นจ๊ฒŒ ๋ ๋•Œ ์ผ์–ด๋‚˜๋Š” ๋ถ€์ž‘์šฉ๋„ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜์‹ค์ˆ˜ ์žˆ์œผ์‹ค ๊ฒ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ๋ถ„์ด ์œ ์ €๊ฐ€ ์ž…๋ ฅํ•œ ํŒŒ์ผ๊ฒฝ๋กœ์—์„œ ์บ๋ฆญํ„ฐ ':' ๊ฐ€ ์ค‘๋ณต๋˜์„œ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ์•„๋‹Œ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฃจํ‹ด์„ ์ง ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฃจํ‹ด์—์„œ ๋งŒ์•ฝ CharNext() API ํ•จ์ˆ˜ ๋Œ€์‹ ์— ++ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์…จ๋‹ค๋ฉด ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ 2๋ฐ”์ดํŠธ๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ํ•œ๊ธ€ ํ•œ ๊ธ€์ž์˜ Trail Byte๊ฐ€ ':' ์™€ ๊ฐ™๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๋Š” 100% ์ž˜๋ชป๋œ ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ ๋ ๊ฒ๋‹ˆ๋‹ค.

์œ„์—์„œ ๋งํ•œ 2๋ฒˆ ๊ทœ์น™์— ํ•˜๋‚˜๋ฅผ ๋”ํ•˜์ž๋ฉด:

2a. ์ ˆ๋Œ€๋กœ ๋ฐฐ์—ด ์ธ๋ฑ์Šค์— ๋งˆ์ด๋„ˆ์Šค ์—ฐ์‚ฐ์„ ํ•˜์ง€ ๋ง์ž.

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” 2๋ฒˆ ๊ทœ์น™์˜ ์˜ˆ์™€ ๊ต‰์žฅํžˆ ํก์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋กœ, pLastChar ๊ฐ’์ด ์ด๋Ÿฐ์‹์œผ๋กœ ํ• ๋‹น๋˜์—ˆ๋‹ค๋ฉด :

char* pLastChar = &szConfigFilename [strlen(szConfigFilename) - 1];

์ด ๋ฃจํ‹ด์˜ ๊ฒฐ๊ณผ๋Š” ์œ„์˜ ์„ค๋ช…๋“œ๋ฆฐ --ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์˜ ๋ถ€์ž‘์šฉ์˜ˆ์™€ ๋˜‘๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฒŒ์–ด์ง‘๋‹ˆ๋‹ค. ์™œ๋ƒ ์‚ฌ์‹ค ๋ฐฐ์—ด ์ธ๋ฑ์Šค์˜ ์—ฐ์‚ฐ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .. ํ—ฅํ—ฅ, ๊ฝค๋‚˜ ์žฅํ™ฉํ•˜๊ฒŒ ์„ค๋ช…๋œ ํŒŒํŠธ์ง€๋งŒ ์‹ค์ง€ ๋‚ด์šฉ์€ ๊ฐ„๋‹จํ•˜์ฃ ?

๋‹ค์‹œ strxxx() ์™€ _mbsxxx() ํ•จ์ˆ˜๋กœ ๋Œ์•„๊ฐ€์„œ

์ด์ œ๋Š” ์™œ _mbsxxx() ํ•จ์ˆ˜์‹œ๋ฆฌ์ฆˆ๊ฐ€ ํ•„์š”ํ•œ์ง€ ๋А๋ผ์‹ค ๊ฒ๋‹ˆ๋‹ค. strxxx() ๊ณ„์—ด์˜ ํ•จ์ˆ˜๋Š” _mbsxxx() ํ•จ์ˆ˜์‹œ๋ฆฌ์ฆˆ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ DBCS์— ๋Œ€ํ•ด ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ strrchr("C:\\๋””๋ ‰ํ† ๋ฆฌ", '\\') ์ด๋Ÿฐ์‹์œผ๋กœ ํ˜ธ์ถœ์„ ํ•˜์…จ๋‹ค๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ™์€ ์ž˜๋ชป๋œ ๊ฐ’์ผ๊ฒ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด _mbsrchr() ํ•จ์ˆ˜๋Š” ๋งˆ์ง€๋ง‰์˜ 2๋ฐ”์ดํŠธ ์บ๋ฆญํ„ฐ๋ฅผ ์ œ๋Œ€๋กœ ์ธ์‹ํ•˜๊ณ  ์ œ๋Œ€๋กœ๋œ ๋ฆฌํ„ด๊ฐ’์„ ๋„˜๊ฒจ์ค„๊ฒ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ํ•œ๊ฐ€์ง€ ์ถ”๊ฐ€ํ•˜์ž๋ฉด ๋ฌธ์ž์—ด ๊ธธ์ด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ฑฐ๋‚˜ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋“ค์—๋Š” ์ฃผ์˜ ํ•˜์‹ค ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. strlen("์ŠคํŠธ๋ง") ์˜ ํ•จ์ˆ˜๋Š” 6์„ ๋ฆฌํ„ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ ๋‹ˆ์ฝ”๋“œ ํ•จ์ˆ˜ wcslen(L"์ŠคํŠธ๋ง") ์ด๊ฑด 3์„ ๋ฆฌํ„ดํ•  ๊ฒ๋‹ˆ๋‹ค. ์ฃผ์˜ํ•˜๊ฒŒ์š”^^.

Win32 API์—์„œ์˜ MBCS ์™€ Unicode

๋‘ ์ข…๋ฅ˜์˜ API๋“ค

์•„๋งˆ ๋ˆˆ์น˜ ์ฑ„์…จ์„์ง€๋„ ๋ชจ๋ฅด๊ณ , ์•„๋‹์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ, ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š” API๋“ค์€ ๋‘ ์ข…๋ฅ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ๊ฐ€์ง€ ๋ฒ„์ ผ์€ MBCS๋ฅผ ๋‹ค๋ฃจ๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์˜ˆ๋กœ, ์‹ค์ œ๋กœ๋Š” SetWindowText() ๋ผ๋Š” ํ•จ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  SetWindowTextA() ์™€ SetWindowTextW() ๋ผ๋Š” ๋‘์ข…๋ฅ˜์˜ API๊ฐ€ ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์˜ A๋Š” (ANSI์˜ ์•ฝ์–ด์ฏค)์€ MBCS๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋œปํ•˜๊ณ , W๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ๋ฒ„์ ผ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด ํ”„๋กœ๊ทธ๋žจ์„ ๋นŒ๋“œ ํ•˜์‹ค๋•Œ ์—ฌ๋Ÿฌ๋ถ„์€ MBCS๋ƒ ํ˜น์€ ์œ ๋‹ˆ์ฝ”๋“œ๋ƒ๋ฅผ ์„ ํƒํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ VC์—์„œ ์…‹ํŒ…์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์œผ์…จ๋‹ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” MBCS๋ฐฉ์‹์œผ๋กœ ๋นŒ๋“œ๋ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ์ •์˜๋˜์ง€๋„ ์•Š์€ SetWindowText() ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์“ธ์ˆ˜ ์žˆ๋А๋ƒ ๊ถ๊ธˆํ•˜์‹œ๊ฒ ์ฃ ? winuser.h ํ—ค๋”ํŒŒ์ผ์„ ์‚ดํŽด๋ณด์‹œ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ จ์˜ #define๋ฌธ๋“ค์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์œผ์‹ค ๊ฒ๋‹ˆ๋‹ค.:

BOOL WINAPI SetWindowTextA ( HWND hWnd, LPCSTR lpString );
BOOL WINAPI SetWindowTextW ( HWND hWnd, LPCWSTR lpString );
 
#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif

MBCS๋กœ ๋นŒ๋“œ ํ• ๋•Œ์—๋Š” UNICODE ๊ฐ€ ์ •์˜๋˜ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „์ฒ˜๋ฆฌ๊ธฐ๋Š” ๋‹ค์Œ์œผ๋กœ ํ•ด์„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.:

#define SetWindowText  SetWindowTextA

๋”ฐ๋ผ์„œ ์ „์ฒ˜๋ฆฌ๊ธฐ๋Š” ๋ชจ๋“  SetWindowText() ๋ผ๋Š” ๋ฌธ์ž๋ฅผ SetWindowTextA() ๋ผ๊ณ  ๋ฐ”๊พธ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ SetWindowText() ๋ผ๋Š” ๋งคํฌ๋กœ๋กœ ์ •์˜๋œ ๋‹ค๋ฅธ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋Œ€์‹  SetWindowTextA ํ˜น์€ W ๋กœ ๋๋‚˜๋Š” ํ•จ์ˆ˜๋ฅผ ์“ฐ์‹ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋Ÿด์ผ์€ ๊ฑฐ์˜ ์—†๊ฒ ์ง€๋งŒ์š”..

๊ทธ๋Ÿผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์‹ธ๊ทธ๋ฆฌ ๋ฐ”๊พธ๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด, VC์„ค์ •์˜ preprocessor settings์—์„œ _MBCS ๊ฐ’์„ list of predefined symbols์—์„œ ์ œ๊ฑฐํ•ด ์ฃผ์‹œ๊ณ  UNICODE ์™€ _UNICODE๋ฅผ ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋๋‚ฉ๋‹ˆ๋‹ค. ์ฃผ์˜ํ•˜์‹ค ๊ฒƒ์€ ๋‘๊ฐœ์˜ ๊ฐ’์„ ๋ชจ๋‘ ์ ์–ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–คํ•ด๋”๋Š” UNICODE๋ผ๋Š” ๊ฒƒ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์–ด๋–ค๊ฑด _UNICODE๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ, ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ค๋•Œ ์ฃผ์˜ ํ•˜์‹ค๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ฃ :

HWND hwnd = GetSomeWindowHandle();
char szNewText[] = "we love Bob!";
 
    SetWindowText ( hwnd, szNewText );

์œ„ ์ฝ”๋“œ๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ "SetWindowText"๋ฅผ "SetWindowTextW"๋กœ ๋ฐ”๊พผํ›„์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.:

HWND hwnd = GetSomeWindowHandle();
char szNewText[] = "we love Bob!";
 
    SetWindowTextW ( hwnd, szNewText );

๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ์•„์‹œ๊ฒ ๋‚˜์š”? ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์ทจํ•˜๋Š” ํ•จ์ˆ˜์— SBCS ์ฆ‰ 1๋ฐ”์ดํŠธ ์ผ€๋ฆญํ„ฐ๋ฅผ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์ œ๋Œ€๋กœ๋œ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ• ์ˆ˜ ์—†๊ฒ ์ฃ ? ๊ทธ ์ฒซ๋ฒˆ์งธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ์ŠคํŠธ๋ง์— #define๋ฌธ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ ํ•˜๋Š”๊ฒƒ์ž…๋‹ˆ๋‹ค.:

HWND hwnd = GetSomeWindowHandle();
#ifdef UNICODE
wchar_t szNewText[] = L"we love Bob!";
#else
char szNewText[] = "we love Bob!";
#endif
 
    SetWindowText ( hwnd, szNewText );

์•„๋งˆ ๋ชจ๋“  ์ŠคํŠธ๋ง์„ ์ด๋Ÿฐ์‹์œผ๋กœ ์ •์˜ํ•˜๋‹ค๊ฐ€๋Š” ๋ฏธ์ณ ๋ฒ„๋ฆด๊ฒ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ง์ข…์„ ์•Œ์•„๋ณด์‹œ๊ฒ ์ฃ ? ์—ฌ๊ธฐ์— ๋Œ€ํ•œ ์ง„์ •ํ•œ ํ•ด๊ฒฐ์ฑ…์€ TCHAR ์ž…๋‹ˆ๋‹ค.

๊ณ ๋ง™๋‹ค TCHAR!

TCHAR MBCS์—์„œ๊ฑด ์œ ๋‹ˆ์ฝ”๋“œ์—์„œ๊ฑด ๋˜‘๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ์บ๋ฆญํ„ฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์œ„์—์„œ ๋ณธ #define ๋ฌธ๋“ค์˜ ํ•ด๊ฒฐ๋ฐฉ์‹์„ ์ด๋ฏธ MS์—์„œ๋Š” ์ •์˜ํ•ด TCHAR ๋ผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •์˜ํ•ด ๋†“์•˜์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.:

#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

๋”ฐ๋ผ์„œ TCHAR ๋Š” MBCS๋กœ ๋นŒ๋“œํ• ๋•Œ๋Š” char ์ด๊ณ , ์œ ๋‹ˆ์ฝ”๋“œ๋กœ ๋นŒ๋“œํ• ๋•Œ๋Š” wchar_t ํƒ€์ž…์ด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์œ ๋‹ˆ์ฝ”๋“œ ์ŠคํŠธ๋ง์•ž์— ์ถ”๊ฐ€ํ•ด ์ฃผ๋Š” L์ด๋ผ๋Š” ๋ฌธ์ž๋ฅผ ์œ„ํ•ด _T() ๋ผ๋Š” ๋งˆํฌ๋กœ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.:

#ifdef UNICODE
#define _T(x) L##x
#else
#define _T(x) x
#endif

## ๋Š” ๋‘๊ฐœ์˜ ๋ฌธ์ž์—ด๋“ค์„ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ์—ฐ์‚ฐ์ž ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ์ด ๊ธ€์„ ๋ณด๊ณ  ๋‚˜๋ฉด ์ด์ œ ์ŠคํŠธ๋ง์„ ์„ ์–ธ ํ• ๋•Œ๋ฉด ์–ธ์ œ๋“ ์ง€ _T ๋งˆํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋งˆํฌ๋กœ๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž์—ด ์•ž์—๋Š” L๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค.

TCHAR szNewText[] = _T("we love Bob!");

SetWindowTextA/W ๋ฅผ ํŽธํ•˜๊ฒŒ ์™”๋‹ค๊ฐ”๋‹ค ํ• ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ •์˜๋“ค์ด ์žˆ๋Š”๊ฒƒ ์ฒ˜๋Ÿผ, strxxx() ๊ณผ _mbsxxx() ๋ฅ˜์˜ ์ŠคํŠธ๋ง ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋“ค ์‚ฌ์ด๋ฅผ ํŽธํ•˜๊ฒŒ ๋ณ€๊ฒฝ์‹œํ‚ฌ์ˆ˜ ์žˆ๋Š” ์ •์˜ ๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ _tcsrchr ๋งˆํฌ๋กœ๋ฅผ strrchr() ์ด๋‚˜ _mbsrchr() ํ˜น์€ wcsrchr()๋ฅผ ์“ฐ๋Š” ๋Œ€์‹  ์“ฐ์‹ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. _tcsrchr ํ•จ์ˆ˜๋Š” SetWindowText ํ•จ์ˆ˜๊ฐ€ ๊ทธ๋Ÿฌํ•˜๋“ฏ MBCSํ™˜๊ฒฝ์ด๋ƒ ํ˜น์€ ์œ ๋‹ˆ์ฝ”๋“œ ํ™˜๊ฒฝ์ด๋ƒ์— ๋”ฐ๋ผ์„œ ์ ์ ˆํžˆ ์น˜ํ™˜๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TCHAR ๋ฅผ ์ทจํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋น„๋‹จ strxxx() ๊ณ„์—ด์˜ ํ•จ์ˆ˜๋งŒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด _stprintf (sprintf() ์™€ swprintf()๋ฅผ ์น˜ํ™˜) ์ด๋‚˜ _tfopen (fopen() ๊ณผ _wfopen()๋ฅผ ์น˜ํ™˜)๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ด€๋ จ๋œ ํ•จ์ˆ˜๋“ค์˜ ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋Š” MSDN์˜ "Generic-Text Routine Mappings" ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ๊ทธ๋ฆฌ๊ณ  TCHAR ํƒ€์ž…๋“ค

ํƒ€์ž…
MBCSํ™˜๊ฒฝ์—์„œ
์œ ๋‹ˆ์ฝ”๋“œ ํ™˜๊ฒฝ์—์„œ

WCHAR
wchar_t
wchar_t

LPSTR
0์œผ๋กœ ๋๋‚˜๋Š” charํ˜•์˜ ๋ฌธ์ž์—ด(char*)
0์œผ๋กœ ๋๋‚˜๋Š” charํ˜•์˜ ๋ฌธ์ž์—ด (char*)

LPCSTR
0์œผ๋กœ ๋๋‚˜๋Š” const charํ˜•์˜ ๋ฌธ์ž์—ด (const char*)
0์œผ๋กœ ๋๋‚˜๋Š” const charํ˜•์˜ ๋ฌธ์ž์—ด (const char*)

LPWSTR
0์œผ๋กœ ๋๋‚˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œํ˜•์˜ ๋ฌธ์ž์—ด (wchar_t*)
0์œผ๋กœ ๋๋‚˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œํ˜•์˜ ๋ฌธ์ž์—ด (wchar_t*)

LPCWSTR
0์œผ๋กœ ๋๋‚˜๋Š” const ์œ ๋‹ˆ์ฝ”๋“œํ˜•์˜ ๋ฌธ์ž์—ด (const wchar_t*)
0์œผ๋กœ ๋๋‚˜๋Š” const ์œ ๋‹ˆ์ฝ”๋“œํ˜•์˜ ๋ฌธ์ž์—ด (const wchar_t*

TCHAR
char
wchar_t

LPTSTR
0์œผ๋กœ ๋๋‚˜๋Š” TCHARํ˜•์˜ ๋ฌธ์ž์—ด (TCHAR* -> char*
0์œผ๋กœ ๋๋‚˜๋Š” TCHARํ˜•์˜ ๋ฌธ์ž์—ด (TCHAR*->wchar_t*)

LPCTSTR
0์œผ๋กœ ๋๋‚˜๋Š” const TCHARํ˜•์˜ ๋ฌธ์ž์—ด (const TCHAR*)
0์œผ๋กœ ๋๋‚˜๋Š” const TCHARํ˜•์˜ ๋ฌธ์ž์—ด (const TCHAR*)

์–ธ์ œ TCHAR ์™€ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ์œ ๋‹ˆ์ฝ”๋“œ ์—†์ด๋„ ์ž˜ ์‚ด์•„ ์™”๋Š”๋ฐ ์™œ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•˜๋Š”๊ฐ€ ์˜๋ฌธ์ด ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ๋‹ˆ์ฝ”๋“œ ๋ฐฉ์‹์„ ์“ฐ๋ฉด ๋“์ด ๋  ๊ฒฝ์šฐ๋Š” ์„ธ๊ฐ€์ง€๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.:

  1. ํ”„๋กœ๊ทธ๋žจ์ด ์˜ค์ง Windows NT ํ™˜๊ฒฝ์—์„œ๋งŒ ๋Œ์•„๊ฐ„๋‹ค.
  2. ํ”„๋กœ๊ทธ๋žจ์ด MAX_PATH ๋ณด๋‹ค ๊ธด ํŒŒ์ผ๋ช…์˜ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค.
  3. ํ”„๋กœ๊ทธ๋žจ์ด Window XP๋“ฑ์—์„œ ์†Œ๊ฐœ๋œ ์˜ค์ง ์œ ๋‹ˆ์ฝ”๋“œ๋งŒ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์œ ๋‹ˆ์ฝ”๋“œํ•จ์ˆ˜๋Š” Windows 9x์‹œ๋ฆฌ์ฆˆ์—๋Š” ๊ตฌํ˜„๋˜ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด 9x์‹œ๋ฆฌ์ฆˆ์—์„œ๋„ ๋Œ์•„๊ฐ€์•ผ ํ•œ๋‹ค๋ฉด ์œ ๋‹ˆ์ฝ”๋“œ๋Š” ์ข‹์€ ์„ ํƒ์ด ์•„๋‹๊ฒ๋‹ˆ๋‹ค. (Microsoft Layer for Unicode ๋ผ๋Š” 9x์—์„œ๋„ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค.) ๊ทธ๋ ‡์ง€๋งŒ, NT๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋ชจ๋‘ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ๋‹ˆ์ฝ”๋“œ API๊ฐ€ ์•„๋งˆ ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅํ–ฅ์ƒ์— ๋„์›€์ด ๋ ๊ฒƒ์ž…๋‹ˆ๋‹ค. MBCS๋ฐฉ์‹์˜ ์ŠคํŠธ๋ง์„ NTํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์šด์˜์ฒด์ œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๊ทธ ์ŠคํŠธ๋ง์„ ์œ ๋‹ˆ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ๊ทธ์— ์ƒ์‘ํ•˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ๋ฆฌํ„ด๋˜๋ฉด ๋‹ค์‹œ MBCS๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ•œ ๋‹ค์Œ ๋ฆฌํ„ดํ•ด ์ค„๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ ˆ์ฐจ๋Š” ์ƒ๋‹นํžˆ ์ตœ์ ํ™” ๋˜์žˆ๊ฒ ์ง€๋งŒ, ์•„๋งˆ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์ง์ ‘์“ธ๋•Œ๋ณด๋‹ค๋Š” ์„ฑ๋Šฅ์˜ ์•„์ฃผ ์•ฝ๊ฐ„์ผ์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ ๊ฐ์†Œ๋Š” ํ”ผํ• ์ˆ˜ ์—†์„ ๊ฒ๋‹ˆ๋‹ค.

NT๋Š” ๋˜ํ•œ ์•„์ฃผ ๊ธด ํŒŒ์ผ๋ช…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. (MAX_PATH ๋ณด๋‹ค ๊ธด ํŒŒ์ผ๋ช…) ๊ทธ๋Ÿฌ๋‚˜ ์œ ๋‹ˆ์ฝ”๋“œ๊ฐ€ ์“ฐ์ผ ๋•Œ๋งŒ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌด์—‡๋ณด๋‹ค๋„ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๋ชจ๋“  ์–ธ์–ด ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ค‘๊ตญ์–ด, ์˜์–ด , ์ผ์–ด, ํ•œ๊ตญ์–ด ๋ฅผ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ค„์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ผ ๊ฒ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, Windows 9x ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ MS๋Š” MBCS API๋ฐฉ์‹์„ ๋ฉ€๋ฆฌํ•˜๊ณ  ์œ ๋‹ˆ์ฝ”๋“œ ๋ฐฉ์‹์œผ๋กœ ์ „ํ–ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.  ์˜ˆ๋ฅผ๋“ค๋ฉด, SetWindowTheme() ์ด๋ผ๋Š” API ํ•จ์ˆ˜๋Š” ์˜ค์ง ์œ ๋‹ˆ์ฝ”๋“œ ์ŠคํŠธ๋ง ๋งŒ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ƒ์‘ํ•˜๋Š” MBCS๋ฒ„์ ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ์œ ๋‹ˆ์ฝ”๋“œ๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ด์ œ ์œ ๋‹ˆ์ฝ”๋“œ์™€ MBCS์‚ฌ์ด์˜ ์™”๋‹ค๊ฐ”๋‹ค ํ•ด์•ผํ•˜๋Š” ๊ท€์ฐฎ์Œ์„ ์–ป์— ์ค„๊ฒ๋‹ˆ๋‹ค.^^

๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ ๋‹น์žฅ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ์‹ค ์ง€๋ผ๊ณ , ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฐ˜๋“œ์‹œ TCHAR ์™€ ๊ทธ์™€ ๊ด€๋ จ๋œ ํ•จ์ˆ˜๋“ค์„ ์จ์ฃผ์…”์•ผ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด ์ข‹์œผ์‹ค ๊ฒ๋‹ˆ๋‹ค. DBCS๋ฅผ ๋ณด๋‹ค ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ ๋ชป์ง€์•Š๊ฒŒ ๋‚˜์ค‘์— ์œ ๋‹ˆ์ฝ”๋“œ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฐ”๊พธ์‹ค๋•Œ ๋‹จ์ง€ ์…‹ํŒ…ํ•˜๋‚˜ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋งŒ์‚ฌ ์˜ค์ผ€์ด ์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ ^^

๋ฐ˜์‘ํ˜•

+ Recent posts