|
ÀÌ ±ÛÀº ´ÙÀ½ »çÀÌÆ®¿¡ ¿Ã¶ó¿Â ±ÛÀ» Âü°íÇÑ °ÍÀÌ´Ù. Debugging the last COM Error (SetErrorInfo/GetErrorInfo) COMÀº ÄÄÆ÷³ÍÆ®µé °£ÀÇ ¿À·ù ¸Þ½ÃÁö¸¦ ÁÖ°í¹Þ±â À§ÇÏ¿© APIµéÀ» »ç¿ëÇϴµ¥, ÀÌ APIµéÀÌ ¿À´Ã ¾ê±âÇÒ ole32!GetErrorInfo/ole32!SetErrorInfoÀÌ´Ù. Visual Studio ¿ª½Ã µ¿ÀÏÇÑ ¸ñÀûÀ¸·Î ÀÌ APIµéÀ» »ç¿ëÇϰí ÀÖÀ¸¸ç, ÀÌ ±Û¿¡¼µµ ÀÌ APIµé¿¡ ´ëÇØ¼ ÁßÁ¡ÀûÀ¸·Î ¼³¸íÇÒ °ÍÀÌ´Ù. ¿ì¼± ¸¶Áö¸· ¿À·ù °ªÀ» ¼³Á¤ÇÏ´Â APIµéÀº ±Ùº»ÀûÀ¸·Î ±×¸® ÁÁÀº ¹æ½ÄÀÌ ¾Æ´Ï¶ó´Â Á¡À» ¹àÇôµÎ°í ½Í´Ù. ÀÌ APIµéÀÇ ±â¿øÀ» º¸¸é ÀϹÝÀûÀÎ C ¹æ½ÄÀÇ ÇÁ·Î±×·¡¹Ö¿¡¼ºÎÅÍ ¿ì¸®°¡ ½±°Ô Á¢ÇÒ ¼ö ÀÖ¾ú´Âµ¥, µµ½º¿ë C ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¶§¿¡µµ, ¿À·ù°¡ ¹ß»ýÇÏ¸é ¾ðÁ¦³ª ¿À·ù °ªÀÌ ÇÁ·Î±×·¥ÀÇ ¾îµò°¡¿¡ ÀÖ´Â º¯¼ö¿¡ ¸¶Áö¸· ¿À·ù °ªÀ¸·Î ÀúÀåµÇ°ï Çß´Ù. * Âü°í : µð¹ö±ë Áß¿¡´Â Watch â¿¡¼ @err,hr À» ÀÔ·ÂÇÏ¿©, ¸¶Áö¸· ¿À·ù °ª¿¡ ´ëÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ÇÏÁö¸¸, ÀÌ·¯ÇÑ ¹æ½ÄÀº ¿À·ù °ªÀÌ ½Ã½Ã ¶§¶§·Î º¯ÇÑ´Ù´Â ¹®Á¦Á¡°ú µ¿±âÈ ¹®Á¦¿¡ ÀÖ¾î¼ ÇÁ·Î±×·¡¸Ó¿¡°Ô À߸øµÈ Á¤º¸¸¦ Á¦°øÇÏ´Â °æ¿ì°¡ ¸¹±â ¶§¹®¿¡, ÀÌ Á¤º¸´Â ¾ÆÁÖ ±âÃÊÀûÀÎ Á¤º¸¸¸À» Á¦°øÇÑ´Ù´Â Á¡°ú ¿ÏÀüÈ÷ ½Å·ÚÇØ¼´Â ¾ÈµÈ´Ù´Â Á¡À» ¹Ì¸® ¾Ë¾ÆµÑ Çʿ䰡 ÀÖ´Ù. ÀÌ¿¡ ´ëÇÑ ¿¹·Î´Â [µð¹ö±ë ÀüÀï À̾߱â] ÇöÀç Æú´õÀÇ À§Ä¡¿Í »ó´ë °æ·ÎÀÇ À§Ç輺¸¦ Âü°íÇϵµ·Ï ÇÑ´Ù. ¾îÂîµÇ¾úµç°£¿¡, ÀÌ APIµéÀ» »ç¿ëÇÏ´Â Äڵ带 µð¹ö±ëÇÑ´ÙÄ¡¸é, ´ÙÀ½°ú °°Àº µÎ°¡Áö Áú¹®À» ÇÒ ¼ö ÀÖ°Ú´Ù.
1. Áö±Ý ¾òÀ» ¼ö ÀÖ´Â Á¤È®ÇÑ ¸¶Áö¸· ¿À·ù °ªÀº ¹«¾ùÀΰ¡? Á¤´ä!
1. Last Error = (IErrorInfo*)*(DWORD*)(272 + *(DWORD*)(@tib+3968)) ´ç¿¬ÇϰԵµ, ¸¶Áö¸· ¿À·ù °ªÀÇ ±âº» ¿ø¸®´Â ´©±¸³ª Á¢±ÙÇÒ ¼ö ÀÖ´Â °ø°£¿¡ ¿À·ù °ªÀ» ¼³Á¤ÇÏ´Â ¹æ½ÄÀ̹ǷÎ, Áú¹®¿¡ ´ëÇÑ ´ä ¿ª½Ã, ÇØ´ç À§Ä¡¸¦ ¾Ë ¼ö ÀÖ´Ù¸é »ó´ç ºÎºÐ ÇØ°áµÇ¾ú´Ù°í º¼ ¼ö ÀÖ´Ù. ¿ì¼±, @tib´Â ÇöÀç ½º·¹µåÀÇ Á¤º¸ ºí·ÏÀÌ À§Ä¡ÇÑ ¸Þ¸ð¸® À§Ä¡¸¦ ¸»ÇØÁÖ´Â µð¹ö°Å°¡ Á¦°øÇÏ´Â ½´µµ-·¹Áö½ºÅÍÀÌ´Ù. TIB, ¶Ç´Â TEB(Thread environment block)´Â ¿î¿µÃ¼Á¦°¡ ½º·¹µå¿¡ ´ëÇÑ Á¤º¸(¿¹¿Ü ó¸® ÇÔ¼ö³ª TLS(Thread local storage) º¯¼öµî)¸¦ º¸°üÇϴ â°íÀÌ´Ù. ´ÙÀ½Àº winternl.h¿¡¼ °¡Á®¿Â TEBÀÇ Á¤ÀÇÀÌ´Ù.
typedef struct _TEB {
BYTE Reserved1[1952];
PVOID Reserved2[412];
PVOID TlsSlots[64];
BYTE Reserved3[8];
PVOID Reserved4[26];
PVOID ReservedForOle; // Windows 2000 only
PVOID Reserved5[4];
PVOID TlsExpansionSlots;
} TEB;
ÀÌ Áß¿¡¼ À¯½ÉÈ÷ »ìÆìºÁ¾ß ÇÒ ºÎºÐÀÌ ReservedForOle Æ÷ÀÎÅÍÀÌ´Ù. ÀÌ °ªÀº ¸ðµç OLE µ¥ÀÌÅ͸¦ °¡¸®Å²´Ù(¸¶Áö¸· ¿À·ù °ª Æ÷ÇÔ). ±×¸®°í '3968'ÀÌ TEB ³»¿¡¼ÀÇ 'ReservedForOle'¸¦ °¡¸®Å°´Â °ªÀÌ´Ù(Á÷Á¢ °è»êÇØ º¸¸é ¾Ë ¼ö ÀÖ´Ù). ÀÌ °ªÀº '&((_TEB*)0)->ReservedForOle'¿Í °°Àº ½ÄÀ¸·Î ½±°Ô ¾Ë ¼ö ÀÖ´Ù.ÀÌÁ¦ ¸¶Áö¸· ¿À·ù °ªÀÌ ¾îµð¿¡ ÀúÀåµÇ´ÂÁö¸¦ ¾Ë¾Æ¾ß Çϴµ¥, ÀÌ °ªÀ» ¾ò±â À§Çؼ ´ÙÀ½°ú °°Àº Äڵ带 ÀÛ¼ºÇÏ¿´´Ù.
CComPtr
ÀÌ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ ´ÙÀ½, OLE µ¥ÀÌÅÍÀÇ ÁÖ¼Ò¸¦ ¸Þ¸ð¸® â¿¡ µå·ÓÇÑ ´ÙÀ½, OLE°¡ 'pError' °ªÀ» ¾îµð¿¡ ÀúÀåµÇ¾î ÀÖ´ÂÁö¸¦ È®ÀÎÇØº»´Ù. ³» ÄÄÇ»ÅÍ¿¡¼´Â 272 ¹ÙÀÌÆ® ¶³¾îÁø °÷¿¡ ¸¶Áö¸· ¿À·ù °ªÀ» ÀúÀåÇϰí ÀÖ¾ú´Ù.¸¶Áö¸·À¸·Î Çϳª¸¸ ´õ ¾ð±ÞÀ» ÇÏÀÚ¸é, ¿Ö {,,ole32}_SetErrorInfo@8°ú °°Àº ¹æ½ÄÀ¸·Î Áß´ÜÁ¡À» ¼³Á¤ÇÏÁö ¾Ê¾Ò´Â°¡¶ó°í ¹¯´Â´Ù¸é, COMÀº ¿©·¯ºÐÀÌ ±³Â÷ ½º·¹µå È£ÃâÀÌ ÀÖÀ» ½Ã¸¶´Ù ÀÌ ¿À·ù °ªÀ» ³»ºÎÀûÀ¸·Î ¾÷µ¥ÀÌÆ®Çϱ⠶§¹®ÀÌ´Ù. ÀÌ °æ¿ì¿¡´Â SetErrorInfo API¸¦ È£ÃâÇÏÁö ¾Ê´Â´Ù.
|