TN059: MBCS/À¯´ÏÄÚµå MFC º¯È¯ ¸ÅÅ©·Î »ç¿ë

ÀÌ ³ëÆ®¿¡¼­´Â AFXPRIV¿¡ Á¤ÀÇ µÇ´Â MBCS/À¯´ÏÄÚµå º¯È¯¿¡ ´ë ÇÑ ¸ÅÅ©·Î »ç¿ë ÇÏ´Â ¹æ¹ýÀ» ¼³¸í ÇÕ´Ï´Ù.H. ÀÌ·¯ÇÑ ¸ÅÅ©·Î ÀÀ¿ë ÇÁ·Î±×·¥ °Å·¡ Á÷Á¢ OLE API ¶Ç´Â ¾î¶² ÀÌÀ¯·Î ÀÚÁÖ ÇØ¾ß ÇÏ´Â °æ¿ì À¯´ÏÄÚµå¿Í MBCS °£ÀÇ º¯È¯¿¡ °¡Àå À¯¿ë¡£

°³¿ä

MFC 3.x¿¡¼­´Â Ưº° ÇÑ DLL »ç¿ë (MFCANS32.DLL) ÀÚµ¿À¸·Î º¯È¯ À¯´ÏÄÚµå¿Í MBCS °£ÀÇ OLE ÀÎÅÍÆäÀ̽º È£Ãâ Çß´Ù. ÀÌ DLLÀº ¾µ ¸¶Ä¡ OLE Api ¹× ÀÎÅÍÆäÀ̽º MBCS, ºñ·Ï ±×µéÀº Ç×»ó À¯´ÏÄÚµå OLE ÀÀ¿ë ÇÁ·Î±×·¥ Çã¿ë °ÅÀÇ Åõ¸í ·¹À̾î (macintoshÀÇ °æ¿ì Á¦¿Ü). ÀÌ ·¹À̾î´Â Æí¸® ÇÏ °Ô ÇÏ´Â µ¿¾È ÀÀ¿ë ÇÁ·Î±×·¥À» Win32 win16¿¡¼­ ½Å¼Ó ÇÏ °Ô Æ÷Æà ¼ö Çã¿ë (MFC, Microsoft Word, Microsoft Excel ¹× VBA´ÂÀÌ ±â¼úÀ» »ç¿ë ÇÏ´Â Microsoft ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÀϺΠ´ÜÁö), ¶§·Î´Â »ó´çÇÑ ¼º´É Çß´Ù Çß´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î MFC 4.xÀÌÀÌ DLLÀ» »ç¿ë ÇÏÁö ¾Ê´Â ÇÏ °í ´ë½Å À¯´ÏÄÚµå OLE ÀÎÅÍÆäÀ̽º¿¡ Á÷Á¢ ȸ´ã. ÀÌ·¸°Ô ÇÏ·Á¸é MFC OLE ÀÎÅÍÆäÀ̽º¸¦ È£Ãâ ÇÏ´Â °æ¿ì MBCS À¯´ÏÄÚµå º¯È¯ ÇØ¾ß ÇÏ °í ÀÚÁÖ OLE ÀÎÅÍÆäÀ̽º¸¦ ±¸Çö ÇÏ´Â °æ¿ì À¯´ÏÄڵ忡¼­ MBCS¸¦ º¯È¯ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. È¿À²ÀûÀÌ °í ½±°ÔÀÌ Ã³¸® Çϱâ À§ÇØ ¸ÅÅ©·Î ¼ö°¡ÀÌ º¯È¯À» ½±°Ô ¸¸µé¾îÁ³½À´Ï´Ù.

¸ÅÅ©·ÎÀÇ ÁýÇÕÀ» ¸¸µå´Â °¡Àå Å« Àå¾Ö¹° Áß Çϳª´Â ¸Þ¸ð¸® ÇÒ´çÀÔ´Ï´Ù. Àå¼Ò¿¡¼­ ¹®ÀÚ¿­À» º¯È¯ÇÒ ¼ö ¾ø½À´Ï´Ù, ¶§¹®¿¡ º¯È¯µÈ °á°ú ÀúÀåÇÒ »õ ¸Þ¸ð¸®¸¦ ÇÒ´ç ÇÕ´Ï´Ù. ÀÌ ÄÚµå´Â ´ÙÀ½°ú À¯»ç ÇÏ °Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù.:

/ / ¿ì¸® Lpsza¿¡¼­ MBCS ¹®ÀÚ¿­À» º¯È¯ ÇÏ·Á¸é
int nLen = MultiByteToWideChar (CP_ACP, 0, lpszA,-1, NULL, NULL);
LPWSTR lpszW = »õ·Î¿î WCHAR [nLen];
MultiByteToWideChar (CP_ACP, 0, lpszA,-1, lpszW, nLen);
/ / ¿©±â OLE È£ÃâÀ» »ç¿ë ÇÏ´Â
pI-gt;SomeFunctionThatNeedsUnicode(lpszW);
/ / ¹®ÀÚ¿­À» ¹«·á
lpszW »èÁ¦(&G)

ÀÌ ¹æ¹ýÀº ¹®Á¦ ¼ö·Î. ÁÖ¿ä ¹®Á¦´Â ±×°ÍÀÇ ÄÚµå ÀÛ¼º, Å×½ºÆ® ¹× µð¹ö±×¸¦ ¸¹ÀºÀÔ´Ï´Ù. ¹º°¡ °£´ÜÇÑ ÇÔ¼ö È£ÃâÀº Áö±Ý ÈξÀ ´õ º¹Àâ ÇÕ´Ï´Ù. ¶ÇÇÑ, ¿À¹ö Çìµå°¡ ÀÌ·¸°Ô¿¡¼­ Áß¿ä ÇÑ ·±Å¸ÀÓÀÌÀÔ´Ï´Ù. ¸Þ¸ð¸® Èü¿¡ ÇÒ´ç ÇÏ °í ÇØÁ¦ µÉ ¶§¸¶´Ù º¯È¯À» ¼öÇà ÇÑ´Ù. ¸¶Áö¸·À¸·Î, À§ÀÇ ÄÚµå´Â ÇÊ¿ä ÀûÀý ÇÑ #ifdefs (¾î¶²ÀÌ º¯È¯ÀÌ ¼öÇà ÇÏÁö ¾Ê¾Æµµ) À¯´ÏÄÚµå ¹× Macintosh ºôµå¿¡ ´ë ÇÑ Ãß°¡¡£

¿ì¸®¿Í ÇÔ²² ¿Â ¼Ö·ç¼Ç ÀϺΠ¸ÅÅ©·Î 1) ¸¶½ºÅ© ´Ù¾ç ÇÑ Ç÷§Æû ¹× 2) »ç¿ë ÇÏ ¿© È¿À²ÀûÀÎ ¸Þ¸ð¸® ÇÒ´ç ±¸¼ºÇ¥ÀÇ Â÷ÀÌ ¹× 3)Àº ±âÁ¸¿¡ »ðÀÔ ½±°Ô ¼Ò½º Äڵ带 ¸¸µå´Â °ÍÀÔ´Ï´Ù. ¿©±â ÇϳªÀÇ Á¤ÀÇÀÇ ¿¹°¡ÀÔ´Ï´Ù.:

# define A2W(lpa) (\
 nbsp;? ((LPCSTR) lpa = = NULL)? NULL: (\
 ??      ? _convert (strlen (lpa) + 1) = \
 ?????? AfxA2WHelper((LPWSTR) alloca(_convert*2), lpa, _convert) \
 ?? )\
)(&N)

ÈξÀ °£´Ü ÇÏ °Ô´ÂÀÌ À§ÀÇ ÄÚµå ´ë½Å ¸ÅÅ©·Î µîÀ» »ç¿ë ÇÏ ¿©:

/ / ¿©±â OLE È£ÃâÀ» »ç¿ë ÇÏ´Â
USES_CONVERSION;
pI-gt;SomeFunctionThatNeedsUnicode(T2OLE(lpszA))(&G)

°Å±â¿¡ ¿©ºÐÀÇ ÅëÈ­ º¯È¯ ÀÛ¾÷ÀÌ ÇÊ¿ä ÇÏÁö¸¸ ¸ÅÅ©·Î »ç¿ë ÇÏ´Â °£´Ü ÇÏ °í È¿°úÀûÀΡ£

_Alloca() ÇÔ¼ö¸¦ »ç¿ë ÇÏ ¿© Èü ´ë½Å ½ºÅÿ¡¼­ ¸Þ¸ð¸®¸¦ ÇÒ´ç ÇÏ´Â °¢ ¸ÅÅ©·ÎÀÇ ±¸Çö. ½ºÅÿ¡¼­ ¸Þ¸ð¸®¸¦ ÇÒ´ç ÈüÀÇ ¸Þ¸ð¸® ÇÒ´ç º¸´Ù ÈξÀ ´õ »¡¸® ±×¸®°í ¸Þ¸ð¸®´Â ÇÔ¼ö°¡ Á¾·á µÉ ¶§ ÀÚµ¿À¸·Î ÇØÁ¦ µË´Ï´Ù. ¶ÇÇÑ, ¸ÅÅ©·Î MultiByteToWideChar (¶Ç´Â WideCharToMultiByte)¸¦ È£Ãâ ÇÏÁö ¸¶½Ê½Ã¿À ¹ø ÀÌ»ó. ÀÌ°ÍÀº ÇÊ¿äÇÑ °Í º¸´Ù Á¶±Ý ´õ ¸¹Àº ¸Þ¸ð¸®¸¦ ÇÒ´ç ÇÏ ¿© ÀÌ·ç¾îÁý´Ï´Ù. ¿ì¸®´Â MBC ¸¹¾Æ¾ß ÇϳªÀÇ WCHAR ·Î º¯È¯ µË´Ï´Ù ¾Ë°í °¢ WCHAR ¿¡ ´ë ÇÑ ¿ì¸® µÎ MBC ¹ÙÀÌÆ®ÀÇ ÃÖ´ë ÀÖÀ» °ÍÀÔ´Ï´Ù. º¸´Ù Á¶±Ý ´õ ÇÊ¿ä ÇÏÁö¸¸ Ç×»ó ÃæºÐÈ÷ ÇÒ´ç ÇÏ ¿© µÎ ¹ø° º¯È¯ µÎ ¹ø° È£ÃâÀ» ó¸® Çϱâ À§ÇØ º¯È¯ ÇÔ¼ö¸¦ È£Ãâ ÇÏ´Â ÇÇÇÒ ¼ö ÀÖ½À´Ï´Ù. AfxA2Whelper µµ¿ì¹Ì ÇÔ¼ö¸¦ È£Ãâ Àμö µÇ°Ú½À´Ï´Ù (ÀÌ ÀÎÇØ ÀÛÀº ÄÚµå º¸´Ù ±×°Í MultiByteToWideChar À» Á÷Á¢ È£Ãâ ÇÏ´Â °æ¿ì) º¯È¯À» ¼öÇà Çϱâ À§ÇØ ¼öÇà ÇØ¾ß ÇÏ´Â ¼ö¸¦ ÁÙ¿© ÁÝ´Ï´Ù.

Çϱâ À§Çؼ­´Â °ø°£À» ¸ÅÅ©·Î ´ë ÇÑ ÀúÀå ÇÏ´Â Àӽà ±æÀÌ ±×°ÍÀº º¯È¯ ¸ÅÅ©·Î »ç¿ë ÇÏ´Â ¾Ê´ÂÀÌ °¢ ÇÔ¼ö¿¡ _convert ¶ó´Â Áö¿ª º¯¼ö¸¦ ¼±¾ð ÇÏ´Â µ¥ ÇÊ¿äÇÑ. ÀÌ ¿¹Á¦¿¡¼­ À§¿¡¼­ º» USES_CONVERSION ¸ÅÅ©·Î È£Ãâ ÇÏ ¿© ÀÌ·ç¾îÁý´Ï´Ù.

°Å±â¿¡ ÀϹÝÀûÀÎ º¯È¯ ¸ÅÅ©·Î ¹× OLE ƯÁ¤ ¸ÅÅ©·Î. ÀÌ·¯ÇÑ µÎ °¡Áö ´Ù¸¥ ¸ÅÅ©·Î ¼¼Æ®´Â ¾Æ·¡¿¡ ¼³¸í µÇ¾îÀÖ½À´Ï´Ù. ¸ÅÅ©·ÎÀÇ ¸ðµç AFXPRIV¿¡ »óÁÖ ÇÕ´Ï´Ù.H¡£

ÀÏ¹Ý º¯È¯ ¸ÅÅ©·Î

ÀÏ¹Ý º¯È¯ ¸ÅÅ©·Î ±âº» ¸ÞÄ¿´ÏÁòÀ» Çü¼ºÇÕ´Ï´Ù. ¸ÅÅ©·Î ¿¹Á¦ ¹× ±¸Çö A2W, ÀÌÀü ¼½¼Ç ¿¡¼­Ã³·³ °°Àº ÇϳªÀÇ "ÀϹÝ" ¸ÅÅ©·ÎÀÔ´Ï´Ù. ±×°ÍÀº ±¸Ã¼ÀûÀ¸·Î OLE¿¡ ¾Æ¹« °ü°èµµ ÀÖ´Ù. ÀÏ¹Ý ¸ÅÅ©·Î ¼³Á¤ ¾Æ·¡¿¡ ³ª¿­ µË´Ï´Ù.:

 A2CW (LPCSTR)-gt; (LPCWSTR)
A2W (LPCSTR)-> (LPWSTR)
W2CA (LPCWSTR)-> (LPCSTR)
W2A (LPCWSTR)-> (LPSTR)

ÅؽºÆ® º¯È¯ ÇÏ °í, °Ô´Ù°¡ °Å±â¿¡ ¸ÅÅ©·Î ¹× TEXTMETRIC, DEVMODE, BSTR¹× OLE º¯È¯ Çϱâ À§ÇÑ µµ¿ì¹Ì ÇÔ¼ö ¹®ÀÚ¿­À» ÇÒ´ç ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ¸ÅÅ©·ÎÀÌ ³íÀÇÀÇ ¹üÀ§¸¦ ³Ñ¾î-AFXPRIV¸¦ ÂüÁ¶ ÇϽʽÿÀ.ÀÌ·¯ÇÑ ¸ÅÅ©·Î ´ë ÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº H¡£

OLE º¯È¯ ¸ÅÅ©·Î

OLE º¯È¯ ¸ÅÅ©·Î ó¸® OLESTR ¹®ÀÚ¸¦ ±â´ë ÇÏ´Â ±â´ÉÀ» À§ÇØ Æ¯º°È÷ ¼³°è µÇ¾ú½À´Ï´Ù. OLE Çì´õ¸¦ °Ë»ç ÇÏ´Â °æ¿ì LPCOLESTR ¹× OLECHAR¿¡ ´ë ÇÑ ¸¹Àº ÂüÁ¶°¡ ³ªÅ¸³³´Ï´Ù. ÀÌ·¯ÇÑ Ç÷§Æû¿¡ ƯÁ¤ ÇÏÁö ¾ÊÀº ¹æ½ÄÀ¸·Î OLE ÀÎÅÍÆäÀ̽º¿¡ »ç¿ë µÇ´Â ¹®ÀÚÀÇ Á¾·ù¸¦ ÂüÁ¶ ÇÏ´Â µ¥ »ç¿ë µË´Ï´Ù. Win16 ¹× Macintosh Ç÷§Æû¿¡¼­ char ¹× WCHAR ¿¡¼­ Win32 OLECHAR Áöµµ¡£

MFC Äڵ忡¼­ # ifdef Áö½Ã¹®ÀÇ ¼ö´Â ÃÖ¼ÒÇÑÀ¸·Î À¯Áö Çϱâ À§Çؼ­´Â ¿ì¸®´Â °¢ º¯È¯¿¡ ´ëÇØ ºñ½ÁÇÑ ¸ÅÅ©·Î OLE ¹®ÀÚ¿­ °ü·Ã µË´Ï´Ù. ´ÙÀ½ ¸ÅÅ©·Î °¡Àå ÀϹÝÀûÀ¸·Î »ç¿ë µÇ´Â.:

T2COLE (LPCTSTR)-gt; (LPCOLESTR)
T2OLE (LPCTSTR)-> (LPOLESTR)
OLE2CT (LPCOLESTR)-> (LPCTSTR)
OLE2T (LPCOLESTR)-> (LPCSTR)

´Ù½Ã TEXTMETRICÇÏ °í ºñ½ÁÇÑ ¸ÅÅ©·Î, DEVMODE, BSTR¹× OLE ¹®ÀÚ¿­À» ÇÒ´ç ÇÕ´Ï´Ù. AFXPRIV¸¦ ÂüÁ¶ ÇϽʽÿÀ.´õ ¸¹Àº Á¤º¸¿¡ ´ë ÇÑ H¡£

±âŸ °í·Á »çÇ×

²Ë ·çÇÁ¿¡¼­ ¸ÅÅ©·Î »ç¿ë ÇÏÁö ¸¶½Ê½Ã¿À. ¿¹¸¦ µé¾î, ´ç½ÅÀº ´ÙÀ½°ú °°Àº Á¾·ùÀÇ Äڵ带 ÀÛ¼º ÇÏ·Á¸é:

void BadIterateCode(LPCTSTR lpsz)
{
USES_CONVERSION;
¿¡ ´ë ÇÑ (int ii = 0; ii lt; 10000; ii + +)
pI-> SomeMethod (ii, T2COLE(lpsz));
}

À§ÀÇ ÄÚµå ¹®ÀÚ¿­ÀÇ ³»¿ë¿¡ µû¶ó ½ºÅÿ¡ ¸Þ¸ð¸®ÀÇ ¸Þ°¡¹ÙÀÌÆ® ÇÒ´ç µÉ ¼ö ÀÖ½À´Ï´Ù lpsz ÀÔ´Ï´Ù! nbsp; ¶ÇÇÑ ·çÇÁÀÇ °¢ ¹Ýº¹¿¡ ´ë ÇÑ ¹®ÀÚ¿­À» º¯È¯ ÇÏ´Â ½Ã°£ÀÌ °É¸³´Ï´Ù. ´ë½Å ·çÇÁÀÇ ¹ÛÀ¸·Î Áö¼ÓÀûÀÎ º¯È¯ °°Àº À̵¿(&N):

void MuchBetterIterateCode(LPCTSTR lpsz)
{
USES_CONVERSION;
LPCOLESTR lpszT = T2COLE(lpsz);
¿¡ ´ë ÇÑ (int ii = 0; ii lt; 10000; ii + +)
pI-> SomeMethod (2, lpszT);
}

¹®ÀÚ¿­ »ó¼ö °æ¿ì, ÇÔ¼ö¿¡ ¸Þ¼­µå È£ÃâÀ» ĸ½¶È­ ÇÕ´Ï´Ù. ÀÌ°ÍÀº º¯È¯ ¹öÆÛ °¢ ½Ã°£¿¡ °ø°£À» È®º¸ÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. ¿¹¸¦ µé¾î:

void CallSomeMethod (int ii, LPCTSTR lpsz)
{
USES_CONVERSION;
pI-gt;SomeMethod (ii, T2COLE(lpsz));
}

void MuchBetterIterateCode2 (LPCTSTR * lpszArray)
{
¿¡ ´ë ÇÑ (int ii = 0; ii < 10000; ii + +)
CallSomeMethod (2, lpszArray[ii]);
}

Àý´ë ¹Ýȯ °ª ¹Ýȯ Çϱâ Àü¿¡ µ¥ÀÌÅÍÀÇ º¹»çº»À» ¸¸µå´Â °ÍÀ» ÀÇ¹Ì ÇÏÁö ¾Ê´Â °á°ú ¸ÅÅ©·Î Áß Çϳª¸¦ ¹Ýȯ ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î,ÀÌ ÄÚµå´Â ³ª»Û:

LPTSTR BadConvert(ISomeInterface* pI)
{
USES_CONVERSION;
LPOLESTR lpsz = NULL;
pI-gt;GetFileName(&lpsz);
LPTSTR lpszT = OLE2T(lpsz);
CoMemFree(lpsz);
¹Ýȯ lpszT; / / ³ª»Û! alloca ¸Þ¸ð¸® ¹Ýȯ
}

À§ÀÇ ÄÚµå´Â °ªÀ» º¹»ç ÇÏ´Â ¹º°¡¸¦ ¹Ýȯ °ªÀ» º¯°æ ÇÏ ¿© ÇØ°á µÉ ¼ö ÀÖ½À´Ï´Ù.:

CString BetterConvert(ISomeInterface* pI)
{
USES_CONVERSION;
LPOLESTR lpsz = NULL;
pI-gt;GetFileName(&lpsz);
LPTSTR lpszT = OLE2T(lpsz);
CoMemFree(lpsz);
¹Ýȯ lpszT; / / CString º¹»ç
}

¸ÅÅ©·Î Äڵ忡 »ðÀÔ Çϱ⠽±°í »ç¿ë Çϱ⠽¬¿î ÇÏÁö¸¸ ±×µéÀ» »ç¿ë ÇÏ´Â °æ¿ì ÁÖÀÇ ÇØ¾ß À§ÀÇ ÁÖÀÇ¿¡¼­ ¸»ÇÒ ¼ö ÀÖ´Â,¡£

±â¼ú ³ëÆ® ¹øÈ£·Î |nbsp; Ä«Å×°í¸®º° ±â¼ú ³ëÆ®(&N)

Index