ÀͽºÇ÷η¯¸¦ ÀÌ¿ëÇÑ ÀÎÅÍ³Ý ÇÁ·Î±×·¡¹Ö äÆà ÇÁ·Î±×·¥ ¸¸µé±â Áö³­ È£¿¡¼­´Â ³Ý¹ÌÆÿ¡ ´ëÇÑ °£·«ÇÑ °³·ÐÀ» »ìÆ캸°í À̸¦ ¹ÙÅÁÀ¸·Î INmManager ÀÎÅÍÆäÀ̽º¿Í INmSysInfo ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇغ¸´Â ¾ÆÁÖ °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸¾Ò´Ù. À̹ø È£´Â À̸¦ º¸´Ù ¹ßÀü½ÃÄÑ Ã¤Æà ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ. ³Ý¹ÌÆÃÀ» ÀÌ¿ëÇÑ ÇÁ·Î±×·¡¹ÖÀº Å©°Ô µÎ °¡Áö Á¾·ù·Î ³ª´©¾î º¼ ¼ö ÀÖ´Ù. °£´ÜÇÑ ¹æ¹ýÀ¸·Î´Â ³Ý¹ÌÆÿ¡ Á¦°øµÇ´Â ¾×ƼºêX ÄÁÆ®·ÑÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù. À̺¸´Ù º¹ÀâÇÑ ¹æ¹ýÀ¸·Î´Â ³Ý¹ÌÆà COM ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÈÄÀÚÀÇ ¹æ¹ýÀº »ó´çÈ÷ ³­ÇØÇÑ ÆíÀÌ´Ù. ±âº»ÀûÀ¸·Î C++¸¦ »ç¿ëÇؾ߸¸ ÇÏ°í COM¿¡ ´ëÇØ ¾î´À Á¤µµÀÇ Áö½ÄÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ³Ý¹ÌÆà COM ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¡¹Ö¿¡µµ Å©°Ô µÎ °¡Áö ¹æ¹ýÀÌ Á¸ÀçÇÑ´Ù. ³Ý¹ÌÆà UI¸¦ »ç¿ëÇÏ´Â ¹æ¹ý°ú ³Ý¹ÌÆà UI¸¦ »ç¿ëÇÏÁö ¾Ê´Â ¹æ¹ýÀÌ ÀÖ´Ù. Áö³­ È£¿¡ ¸¸µé¾î º» ¿¹Á¦¿Í ¸¶Âù°¡Áö·Î À̹ø È£ÀÇ ¿¹Á¦ ÇÁ·Î±×·¥ ¿ª½Ã C++¸¦ ÀÌ¿ëÇØ ³Ý¹ÌÆà COM ÄÄÆ÷³ÍÆ®¸¦ ¸¸µç ´ÙÀ½ ³Ý¹ÌÆà UI¸¦ »ç¿ëÇÏÁö ¾Ê´Â ÇÁ·Î±×·¥À¸·Î ¸¸µé¾î º¼ »ý°¢ÀÌ´Ù. À̹ø È£ ¿¹Á¦ ÇÁ·Î±×·¥Àº ÀÏ´ëÀÏ Ã¤Æà ÇÁ·Î±×·¥ÀÌ´Ù. ¿Àµð¿À³ª ºñµð¿À, ÆÄÀÏ Àü¼Û, ÇÁ·Î±×·¥ °øÀ¯, È­ÀÌÆ® º¸µå µîÀÇ ±â´ÉÀº Áö¿øÇÏÁö ¾Ê´Â´Ù. ¿ø·¡ ³Ý¹ÌÆà ÀÚü´Â ¸ÖƼ¹Ìµð¾î µ¥ÀÌÅÍÀÇ ¼Û¼ö½Å ÇÁ·ÎÅäÄÝÀÎ H.323À» ÄÄÆ÷³ÍƮȭÇÑ °ÍÀ̶ó°í º¼ ¼ö Àִµ¥ »ç½Ç äÆÃÀº ³Ý¹ÌÆÃÀÇ µ¥ÀÌÅÍ Ã¤³ÎÀ» ÀÌ¿ëÇÏ´Â °ÍÀ¸·Î ÀÌ´Â T.120À̶ó´Â ÇÁ·ÎÅäÄÝÀ» ±â¹ÝÀ¸·Î ÇÑ´Ù. äÆà ¿¹Á¦ ÇÁ·Î±×·¥ ÀÚü´Â ³Ý¹ÌÆà SDK¿¡ µþ·Á¿À´Â NMUI¶ó´Â ¿¹Á¦ ÇÁ·Î±×·¥(±×¸² 1 ÂüÁ¶)À» ¹ÙÅÁÀ¸·Î ¸¸µé¾ú´Ù. NMUI ÇÁ·Î±×·¥Àº ¼Ò½ºÀÇ ¾çÀÌ »ó´çÈ÷ ¹æ´ëÇÏ°í ¾î·Æ´Ù. ÇÏÁö¸¸ ³Ý¹ÌÆÃÀÇ ±â´ÉÀÌ °ÅÀÇ ¿Ïº®ÇÏ°Ô ±¸ÇöµÈ ¿¹Á¦ ÇÁ·Î±×·¥À̱⠶§¹®¿¡ ³Ý¹ÌÆà ÇÁ·Î±×·¡¹ÖÀ» ÇÒ »ç¶÷À̶ó¸é ´©±¸³ª ¹Ýµå½Ã »ìÆ캸¾Æ¾ß ÇÒ ÇÁ·Î±×·¥ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ¼Ò½ºÀÇ ¸ðµâÈ­°¡ Àß µÇ¾î Àֱ⠶§¹®¿¡ ´Ù¸¥ ÇÁ·Î±×·¥¿¡ °¡Á®´Ù ¾²±â¿¡µµ ÁÁÀº ÆíÀÌ´Ù. ³Ý¹ÌÆà ÄÄÆ÷³ÍÆ® ³Ý¹ÌÆÃÀº µÎ »ç¶÷°£ÀÇ ¿Àµð¿À, ºñµð¿À ¿¬°á¸¸À» Áö¿øÇÑ´Ù. ¿©·¯ »ç¶÷(±×·ì)ÀÌ °°ÀÌ ¿Àµð¿À, ºñµð¿À ÄÁÆÛ·±½º¸¦ °®°í ½Í´Ù¸é MCU(Multiple Control Unit)¶ó´Â °ÍÀ» ÀÌ¿ëÇØ¾ß ÇÑ´Ù. MCU·Î´Â È­ÀÌÆ® ÆÄÀÎ ¼ÒÇÁÆ®¿þ¾î(White Pine Software)ÀÇ ¹ÌÆÃÆ÷ÀÎÆ®(Meeting Point)¶ó´Â ÇÁ·Î±×·¥ÀÌ Á¦ÀÏ À¯¸íÇÏ´Ù. ³Ý¹ÌÆÃÀº µ¥ÀÌÅÍ Åë½Å(ÅؽºÆ® äÆÃ, °øÀ¯ È­ÀÌÆ®º¸µå, ÇÁ·Î±×·¥ °øÀ¯, ÆÄÀÏ Àü¼Û)ÀÇ °æ¿ì¿¡ ÃÖ´ë 8¸í±îÁöÀÇ ¿¬°áÀ» Áö¿øÇÑ´Ù. µ¿ÀÛ ¹æ½Ä ³Ý¹ÌÆÃÀ» ÀÌ¿ëÇÑ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ·Á¸é ÀÏ´Ü ³Ý¹ÌÆÃÀ» ±¸¼ºÇÏ´Â ÄÄÆ÷³ÍÆ®µéÀÇ Á¾·ù¿Í À̵éÀÇ ¿ªÇÒÀÌ ¹«¾ùÀÎÁö ÀÌÇØÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. Á¦ÀÏ Áß¿äÇÑ ³Ý¹ÌÆà ÄÄÆ÷³ÍÆ®´Â ¹Ù·Î ¸Å´ÏÀú ÄÄÆ÷³ÍÆ®(INmManager)ÀÌ´Ù. À̸¦ ÀÌ¿ëÇؾ߸¸ ´Ù¸¥ ±â´ÉµéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¸Å´ÏÀú ÄÄÆ÷³ÍÆ®¸¦ ¸¸µé¸é ÀÌ°ÍÀ¸·Î ³Ý¹ÌÆà ÃʱâÈ­´Â ¿Ï·áµÈ °ÍÀ̳ª ´Ù¸§¾ø´Ù. ´ÙÀ½À¸·Î ¿Àµð¿À/ºñµð¿À/µ¥ÀÌÅÍ Åë½ÅÀ» ÇÒ »ó´ë¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù. ÀÌ ¶§ »ç¿ëµÇ´Â °ÍÀÌ ÄÝ ÄÄÆ÷³ÍÆ®(INm Call)ÀÌ´Ù. À̸¦ ÀÌ¿ëÇØ »ó´ë¿Í ¿¬°áÀÌ ÀÌ·ç¾îÁö¸é ÀÌ´Â ÄÁÆÛ·±½º ÄÄÆ÷³ÍÆ®(INmConference)·Î ´ëÇ¥µÈ´Ù. Áï ÄÝÀÌ ¼º°øÇϸé ȸÀÇ°¡ ¸¸µé¾îÁö´Â °³³äÀ̶ó°í »ý°¢ÇÏ¸é µÈ´Ù. ÄÁÆÛ·±½ºÀÇ Âü¿©ÀÚµéÀº ¸â¹ö ÄÄÆ÷³ÍÆ®(INm Member)·Î ´ëÇ¥µÈ´Ù. ¸â¹öµé°£ÀÇ ¿Àµð¿À/ºñµð¿À/ÀÏ¹Ý µ¥ÀÌÅÍÀÇ ¼Û¼ö½ÅÀº ä³Î ÄÄÆ÷³ÍÆ®(INmChannel)¸¦ ÅëÇØ ÀÌ·ç¾îÁø´Ù. ä³Î ÄÄÆ÷³ÍÆ®¿¡´Â ¿Àµð¿À ä³Î(INm ChannelAudio), ºñµð¿À ä³Î(INmChannelVideo), µ¥ÀÌÅÍ Ã¤³Î(INmChannelData), ÆÄÀÏ Àü¼Û ä³Î(INm ChannelFt), ÇÁ·Î±×·¥ °øÀ¯ ä³Î(INmChannel App Share) µî ¼­ºê ä³Î ÄÄÆ÷³ÍÆ®µéÀÌ Á¸ÀçÇÑ´Ù. ÀÌ·¯ÇÑ ÄÄÆ÷³ÍÆ®µéÀº ¿ì¸®°¡ ³Ý¹ÌÆÿ¡ ¾î¶² ¸í·ÉÀ» ³»¸®±â À§ÇØ »ç¿ëÇÏ´Â °ÍÀÌ°í ³Ý¹ÌÆÿ¡ ³»¸° ¸í·É¿¡ ´ëÇÑ °á°ú³ª ³Ý¹ÌÆÿ¡¼­ ¾Ë·ÁÁÖ´Â ¾î¶² À̺¥Æ®¸¦ ¹Þ±â À§ÇÑ ¾Ë¸² ÄÄÆ÷³ÍÆ®(Notification Component)µéÀÌ Á¸ÀçÇÑ´Ù. ´ëºÎºÐÀÇ ³Ý¹ÌÆà ÄÄÆ÷³ÍÆ®µéÀº ±×¿¡ ´ëÀÀÇÏ´Â ¾Ë¸² ÄÄÆ÷³ÍÆ®¸¦ °®°í ÀÖ´Ù. ÀÌ¿¡ ´ëÇؼ­´Â Áö³­ È£¿¡ ¾ð±ÞÇÑ ¹Ù ÀÖÁö¸¸ ´Ù½Ã Çѹø Á¤¸®Çϸé Ç¥ 1°ú °°´Ù. ¿ÞÆíÀÇ ÄÄÆ÷³ÍÆ®µéÀº ³Ý¹ÌÆÿ¡ ¸í·ÉÀ» ³»¸®´Âµ¥ »ç¿ëµÇ´Â °ÍÀ¸·Î °³¹ßÀÚ°¡ ¸¸µå´Â °ÍÀÌ ¾Æ´Ï¶ó ³Ý¹ÌÆÿ¡¼­ Á¦°øµÇ´Â °ÍÀ» ´ÜÁö °¡Á®´Ù »ç¿ëÇÏ¸é µÈ´Ù. ¿À¸¥ÆíÀÇ ÄÄÆ÷³ÍÆ®µéÀº ¿ÞÆíÀÇ ÄÄÆ÷³ÍÆ®¿¡¼­ ¹ß»ýÇÏ´Â ÀÏ¿¡ ´ëÇØ º¸°í¹Þ¾Æ ±×¿¡ ´ëÀÀÇϱâ À§ÇÑ ÄÄÆ÷³ÍÆ®·Î °³¹ßÀÚ°¡ Á÷Á¢ ¸¸µé¾î ³Ý¹ÌÆÿ¡ Á¦°øÇØ¾ß ÇÏ´Â °ÍÀÌ´Ù. Áï ¿À¸¥ÆíÀÇ ÄÄÆ÷³ÍÆ®´Â °³¹ßÀÚ°¡ ¸¸µé¾î¾ß ÇÑ´Ù. ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­ ±× ¿¹¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ³Ý¹ÌÆÃÀÇ ÁÖ¿ä ÄÄÆ÷³ÍÆ®µéÀÇ ±â´É¿¡ ´ëÇØ ´Ù½Ã Çѹø °£·«È÷ Á¤¸®ÇÏ¸é ´ÙÀ½°ú °°´Ù. ¡¤ ¸Å´ÏÀú ÄÄÆ÷³ÍÆ®(INmManager) : ³Ý¹ÌÆÃÀÇ °¡Àå ÇÙ½ÉÀÌ µÇ´Â ÄÄÆ÷³ÍÆ®·Î ´Ù¸¥ ÄÄÆ÷³ÍÆ®µéÀº ¸ðµÎ ÀÌ ÄÄÆ÷³ÍÆ®¸¦ ÅëÇØ ¸¸µé°Ô µÈ´Ù. ¡¤ ÄÝ ÄÄÆ÷³ÍÆ®(INmCall) : ³Ý¹ÌÆÃÀ» ÅëÇØ ´ëÈ­¸¦ ³ª´­ ¾ç¹æÀ» ¿¬°áÇØÁÖ´Â ¿ªÇÒÀ» ÇÑ´Ù. ¡¤ ÄÁÆÛ·±½º ÄÄÆ÷³ÍÆ®(INmConference) : ÄÝÀÌ ¿¬°áµÇ¾î ´ëÈ­¸¦ ³ª´©°í ÀÖ´Â ±×·ìÀ» ³ªÅ¸³»´Â ¿ªÇÒÀ» ÇÑ´Ù. ¡¤ ¸â¹ö ÄÄÆ÷³ÍÆ®(INmMember) : ÄÁÆÛ·±½º¿¡ Âü¿©ÇÏ°í ÀÖ´Â Âü¿©ÀÚ¸¦ ³ªÅ¸³½´Ù. ¡¤ ä³Î ÄÄÆ÷³ÍÆ®(INmChannel) : ÄÁÆÛ·±½º¿¡ Âü¿©ÇÑ Âü¿©Àڵ鰣¿¡ ¿Àµð¿À/ºñµð¿À/ÀÏ¹Ý µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ´Âµ¥ »ç¿ëµÈ´Ù. °£´ÜÈ÷ ¿ä¾àÇϸé ÄÝÀ» ¿¬°áÇÏ¿© ÄÁÆÛ·±½º¸¦ ¸¸µç ´ÙÀ½ ä³ÎÀ» ÅëÇØ µ¥ÀÌÅ͸¦ ÁÖ°í¹Þ´Â´Ù°í ÇÒ ¼ö ÀÖ´Ù. ÀÌ ÀýÂ÷¸¦ Á¤¸®ÇÏ¸é ´ÙÀ½°ú °°´Ù. ¨ç ³Ý¹ÌÆÃÀ» ÃʱâÈ­(INmManager::Initialize)ÇÑ´Ù. ³Ý¹ÌÆÃÀ» ÃʱâÈ­ÇÒ ¶§ ´ëºÎºÐÀÇ °æ¿ì¿¡´Â INmManagerNotify °´Ã¼¸¦ Çϳª ¸¸µé¾î ¸Å´ÏÀú °´Ã¼¿¡ ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù. ±×·¡¾ß¸¸ ¿ÜºÎ¿¡¼­ »õ·Î¿î ÄÝÀÌ µé¾î¿À°Å³ª ÄÁÆÛ·±½º°¡ ¹ß»ýÇϸé À̸¦ º¸°í¹ÞÀ» ¼ö ÀÖ´Ù. ¨è ¿¬°áÇÒ »ó´ë¿¡°Ô ÄÝ(Call)À» Àü¼Û(INmManager::CreateCall)ÇÑ´Ù. ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖ´Â ÄÁÆÛ·±½º¿¡ Âü¿©ÇÏ°í ½Í´Ù¸é INmManager:: CallConference¸¦ »ç¿ëÇÑ´Ù. ÄÝ °´Ã¼´Â ÄÝÀ» ¹Þ´Â »ó´ë¹æ¿¡µµ Çϳª ¸¸µé¾îÁø´Ù. ÀÌ´Â »ó´ë¹æ ÇÁ·Î±×·¥¿¡¼­ Á÷Á¢ ¸¸µå´Â °ÍÀÌ ¾Æ´Ï¶ó ³Ý¹ÌÆÿ¡¼­ ¸¸µé¾î¼­ INmManagerNotify::Call Created·Î À̺¥Æ®·Î ³Ñ±ä´Ù. ÀÌ À̺¥Æ®´Â ÄÝÀ» ¹Þ´Â ÂʻӸ¸ ¾Æ´Ï¶ó ÄÝÀ» ¸¸µé¾î º¸³½ ÂÊ¿¡µµ ¹ß»ýÇÑ´Ù. ¿©±â¼­ ÄÝ¿¡ ´ëÇÑ ÁøÇà »óȲÀ» ¾Ë°í ½Í´Ù¸é INmCallNotify °´Ã¼¸¦ Çϳª ¸¸µé¾î ÄÝ °´Ã¼ ÂÊ¿¡ ¾Ë·Á ÁÖ¾î¾ß ÇÑ´Ù. ±×·¯¸é ÄÝÀÌ »ó´ë¹æ¿¡ ÀÇÇØ ¼ö¶ôµÇ¾ú´ÂÁö ¾Æ´Ï¸é °ÅºÎµÇ¾ú´ÂÁö µîÀÇ ÁøÇà »óȲÀ» º¸°í¹ÞÀ» ¼ö ÀÖ´Ù. ÀÌ´Â INmCallNotify::StateChan ged À̺¥Æ®·Î ¾Ë ¼ö ÀÖ´Ù. ¨é »ó´ë¹æÀÌ ÄÝÀ» ¼ö¶ôÇϸé ÄÁÆÛ·±½º°¡ Çϳª »ý¼ºµÈ´Ù. »ó´ë¹æÀÌ ÄÝÀÇ ¼ö¶ôÇÏ´Â °÷Àº INmCallNotify::StateChangedÀÇ ÀÎÀÚ·Î NM_CALL_RINGÀÌ µé¾î¿ÔÀ» °æ¿ìÀÌ´Ù. ÄÝÀÇ ¼ö¶ôÀº INmCall::Accept ¸Þ¼Òµå¸¦ È£ÃâÇÏ¸é µÈ´Ù. ÄÝÀÌ ¼ö¶ôµÇ¸é ÄÝÀ» »ý¼ºÇÑ ÂÊ¿¡´Â INmCallNotify::StateChangedÀÇ ÀÎÀÚ·Î NM_CALL_ ACCEPTED°¡ ³Ñ¾î°¡°í ÄÝÀ» ¼ö¶ôÇÑ ÂÊ¿¡´Â INmCallNotify:: AcceptedÀ¸·Îµµ ¼ö¶ô ¿©ºÎ°¡ ¾Ë·ÁÁø´Ù. »ç½Ç ÄÁÆÛ·±½º´Â À̺¸´Ù ¸ÕÀú ¸¸µé¾îÁöÁö¸¸ ÀÌ ÄÁÆÛ·±½º°¡ ÀÎÁ¤µÇ´Â °ÍÀº ÄÝÀÌ ¾ç¹æÇâ¿¡¼­ Çã¶ôµÈ ´ÙÀ½ÀÌ´Ù. ÄÁÆÛ·±½º´Â ³Ý¹ÌÆÿ¡¼­ ¸¸µé¾î¼­ ³Ñ°ÜÁִµ¥ ÀÌ´Â INmManagerNotify::ConferenceCreated À̺¥Æ®·Î ¾Ë·ÁÁø´Ù. ¾Õ¼­ ÄÝ °´Ã¼³ª ¸Å´ÏÀú °´Ã¼¿¡¼­Ã³·³ ÄÁÆÛ·±½º °´Ã¼¿¡¼­ ¹ß»ýÇÏ´Â ÀÏ¿¡ ´ëÇØ º¸°í¹Þ°í ½Í´Ù¸é INmConfNotify °´Ã¼¸¦ ¸¸µé¾î À̸¦ ÄÁÆÛ·±½º °´Ã¼¿¡ ¾Ë·Á¾ß ÇÑ´Ù. INmManagerNotify::ConferenceCreated À̺¥Æ®¿¡¼­ INmConfNotify °´Ã¼¸¦ ¸¸µé¾î À̸¦ ÄÁÆÛ·±½º °´Ã¼¿¡ ¾Ë¸°´Ù. ¨ê ÄÁÆÛ·±½º ³»ÀÇ Ã¤³Î°ú ¸â¹ö°¡ Á¤ÇØÁø´Ù. ÄÁÆÛ·±½º°¡ ¸¸µé¾îÁö¸é ¿©±â¿¡ Âü¿©ÇÒ ¸â¹ö°¡ °áÁ¤µÇ¾î¾ß ÇÑ´Ù. ÀÌ´Â INmConfNotify::MemberChanged À̺¥Æ®·Î ¾Ë·ÁÁø´Ù. ÀÌ¿Í ÇÔ²² ÄÁÆÛ·±½º ³»¿¡¼­ »ç¿ëÇÒ Ã¤³ÎÀÌ °áÁ¤µÇ¾î¾ß ÇÑ´Ù. ÀÌ Ã¤³ÎÀº INmConfNotify::ChannelChanged À̺¥Æ®·Î ¾Ë·ÁÁø´Ù. ¾Õ¼­ »ìÆ캻 °Í°ú °°ÀÌ Ã¤³Î¿¡´Â ¿©·¯ Á¾·ù°¡ Á¸ÀçÇϴµ¥ ³Ý¹ÌÆÿ¡¼­ ¾ç¹æ°£¿¡ ¿¬°áÀÌ °¡´ÉÇÑ Ã¤³Î ŸÀÔÀ» »ìÆ캸°í ÀÌ Ã¤³Îµé¿¡ ´ëÇؼ­¸¸ INmConfNotify::ChannelChanged À̺¥Æ®¸¦ Àü¼ÛÇÑ´Ù. ¿¹¸¦ µé¾î ¾î¶² ½Ã½ºÅÛ¿¡´Â ¿Àµð¿À ±â´ÉÀÌ Àִµ¥ ´Ù¸¥ ½Ã½ºÅÛ¿¡´Â ¿Àµð¿À ±â´ÉÀÌ ¾ø´Ù¸é INmChannelNotify::ChannelChanged À̺¥Æ®·Î ¿Àµð¿À´Â ¹ß»ýÇÏÁö ¾Ê´Â´Ù. ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­´Â ÀÌ Ã¤³Îµé Áß¿¡¼­ INmChannelData¸¸À» »ç¿ëÇÑ´Ù. ÀÌ Ã¤³ÎÀº ÀÏ¹Ý µ¥ÀÌÅ͸¦ ÁÖ°í¹Þ±â À§ÇÑ Ã¤³Î·Î À̸¦ ÀÌ¿ëÇØ ¿©·¯ °¡Áö ÀÛ¾÷À» ¼öÇàÇÒ ¼ö Àִµ¥ ±× Áß¿¡¼­ °¡Àå ´ëÇ¥ÀûÀÎ °ÍÀÌ ¹Ù·Î äÆÃÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. ÀÌ µ¥ÀÌÅÍ Ã¤³ÎÀ» ÅëÇØ µ¥ÀÌÅ͸¦ ¹Þ°Å³ª ÀÚ½ÅÀÌ º¸³½ µ¥ÀÌÅÍ°¡ ¹«¾ùÀÎÁö ¾Ë°í ½Í´Ù¸é ´Ù¸¥ ³Ý¹ÌÆà ÄÄÆ÷³ÍÆ®¿¡¼­¿Í ¸¶Âù°¡Áö·Î INmChannel DataNotify °´Ã¼¸¦ ¾Ë¸² °´Ã¼·Î ¿¬°áÇØ ÁÖ¾î¾ß ÇÑ´Ù. ¨ë »ç¿ëÀÚ°£¿¡ äÆà µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ´Â´Ù. äÆà µ¥ÀÌÅʹ äÆà ÄÄÆ÷³ÍÆ®(INmChannelData)ÀÇ SendData·Î Àü¼ÛÇÒ ¼ö ÀÖ´Ù. µ¥ÀÌÅ͸¦ º¸³¾ »ó´ë´Â INmMember ÀÎÅÍÆäÀ̽º·Î ÁöÁ¤ÇÏ¸é µÈ´Ù. Á¦´ë·Î Àü¼ÛµÇ¸é INmChannelData::DataSent·Î ±× µ¥ÀÌÅÍ°¡ ´Ù½Ã ³Ñ¾î¿Â´Ù. »ó´ë°¡ ³ª¿¡°Ô·Î º¸³½ µ¥ÀÌÅÍ´Â INmChannelData::DataReceived·Î ¹Þ¾Æº¼ ¼ö ÀÖ´Ù. ÀÌ°ÍÀ¸·Î °£·«È÷ µ¿ÀÛ ÀýÂ÷¸¦ ¾Ë¾Æº¸¾Ò´Ù. °£·«È÷ ¾Ë¾Æº¸±ä ÇßÁö¸¸ À§ÀÇ ÀýÂ÷´Â ¾ÆÁÖ Áß¿äÇÏ´Ù. À§ÀÇ ÀýÂ÷¸¦ ¸ð¸£°í ¿¹Á¦ ÇÁ·Î±×·¥ÀÇ ¼Ò½º¸¦ º¸¸é ±× ³»¿ëÀ» ¾Ë±â Èûµé´Ù. ÀÌÁ¦ ÀÌ ¿¬Àç¿¡¼­ °¡Àå Áß¿äÇÑ ³Ý¹ÌÆà ÀÎÅÍÆäÀ̽ºµé¿¡ ´ëÇØ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. ³Ý¹ÌÆà ÀÎÅÍÆäÀ̽º ÀÌÇØÇϱâ Áö³­ È£¿¡¼­´Â ¸Å´ÏÀú ÄÄÆ÷³ÍÆ®¿Í ½Ã½ºÅÛ Á¤º¸ ÄÄÆ÷³ÍÆ® ÀÎÅÍÆäÀ̽º¿¡ ´ëÇؼ­¸¸ »ìÆ캸¾Ò´Ù. À̹ø¿¡´Â Áö³­ È£¿¡¼­ ¾Ë¾Æº¸Áö ¸øÇÑ ¸Å´ÏÀú ÄÄÆ÷³ÍÆ®ÀÇ ¾Ë¸² ÀÎÅÍÆäÀ̽º(INmManagerNotify)¿Í ÄÝ ÀÎÅÍÆäÀ̽º(INmCall), ÄÝ ¾Ë¸² ÀÎÅÍÆäÀ̽º(INmCallNotify), ÄÁÆÛ·±½º ÀÎÅÍÆäÀ̽º(INmConference)¿Í ÄÁÆÛ·±½º ¾Ë¸² ÀÎÅÍÆäÀ̽º(INmConferenceNotify), ä³Î ÀÎÅÍÆäÀ̽º(INmChan nel), ä³Î ¾Ë¸² ÀÎÅÍÆäÀ̽º(INmChannelNotify) µé¿¡ ´ëÇØ °£·«ÇÏ°Ô ¾Ë¾Æº¸ÀÚ. ¨ç ¸Å´ÏÀú ¾Ë¸² ÀÎÅÍÆäÀ̽º(INmManagerNotify) ³Ý¹ÌÆÃÀÇ ¸ðµç ¾Ë¸² ÀÎÅÍÆäÀ̽º´Â ICNotify ÀÎÅÍÆäÀ̽º·ÎºÎÅÍ °è½ÂµÈ´Ù. ICNotify ÀÎÅÍÆäÀ̽ºµµ COM ÀÎÅÍÆäÀ̽ºÀ̱⠶§¹®¿¡ ´ç¿¬È÷ IUnknownÀ¸·ÎºÎÅÍ °è½ÂµÈ´Ù. ICNotify ÀÎÅÍÆäÀ̽º¿¡´Â Connect¿Í Disconnect ¸Þ¼Òµå°¡ Æ÷ÇԵǾî ÀÖ´Ù. ÀÌ ¸Þ¼ÒµåµéÀº ¾Ë¸² ÀÎÅÍÆäÀ̽º¿Í ¾Ë¸²ÀÇ ´ë»ó°£À» ¿¬°áÇØÁÖ°í ¿¬°áÀ» ²÷´Â ¿ªÇÒÀ» ´ã´çÇÑ´Ù. ¿¹¸¦ µé¾î INmManagerNotify ÀÎÅÍÆäÀ̽º¸¦ Çϳª ¸¸µé°í ±×°ÍÀÇ Connect ¸Þ¼ÒµåÀÇ ÀÎÀÚ·Î ¸Å´ÏÀú °´Ã¼¸¦ Çϳª ÁöÁ¤ÇØÁÖ¸é ±× ¸Å´ÏÀú¿¡ »õ·Î¿î ÄÝÀ̳ª ÄÁÆÛ·±½º°¡ »ý¼ºµÉ ¶§¸¶´Ù ÇØ´ç INmManagerNotify ÀÎÅÍÆäÀ̽ºÀÇ ¸Þ¼ÒµåµéÀÌ È£ÃâµÈ´Ù. ¾Æ¹«Æ° ³Ý¹ÌÆÃÀÇ ¸ðµç ¾Ë¸² ÀÎÅÍÆäÀ̽º¿¡´Â Connect, Disconnect, QueryInter face³ª AddRef, Release µîÀÌ ´ç¿¬È÷ Æ÷ÇԵȴÙ. ÀÌµé ¸Þ¼Òµå¿¡ ´ëÇÑ ¼³¸íÀº Á¦¿ÜÇϵµ·Ï ÇÏ°Ú´Ù. INmMana gerNotify´Â Ç¥ 2¿¡ ³ªÅ¸³­ ¸Þ¼Òµå·Î ±¸¼ºµÈ´Ù. ¾Ë¸² ÀÎÅÍÆäÀ̽ºÀ̹ǷΠ°³¹ßÀÚ°¡ ÀÚ½ÅÀÌ ÇÊ¿ä·Î ÇÏ´Â ¿ëµµ¿¡ ¸Â°Ô ¸¸µé¾î Á¦°øÇØ¾ß ÇÑ´Ù´Â Á¡¿¡ ÁÖÀÇÇϱ⠹ٶõ´Ù. ¨è ÄÝ ÀÎÅÍÆäÀ̽º(INmCall) µé¾î¿Â ÄÝÀ» ¼ö¶ôÇϰųª °ÅºÎÇÏ°í ¿äûÇÑ ÄÝÀ» Ãë¼ÒÇÏ´Â µîÀÇ ÀÛ¾÷À» Çϴµ¥ »ç¿ëµÈ´Ù. ÀÌ°ÍÀº ³Ý¹ÌÆÿ¡¼­ Á¦°øµÇ´Â ÀÎÅÍÆäÀ̽ºÀ̱⠶§¹®¿¡ ±×³É »ç¿ëÇÏ¸é µÈ´Ù(Ç¥ 3 ÂüÁ¶). ¨é ÄÝ ¾Ë¸² ÀÎÅÍÆäÀ̽º(INmCallNotify) ÄÝ ¾Ë¸² ÀÎÅÍÆäÀ̽º´Â ÄÝ °ü·Ã À̺¥Æ®¸¦ ³Ý¹ÌÆÿ¡¼­ ÇÁ·Î±×·¥ ÂÊÀ¸·Î ¾Ë¸®´Âµ¥ »ç¿ëµÈ´Ù. StateChanged¿Í Accepted¸¦ ÁÖÀDZí°Ô »ìÆ캸±â ¹Ù¶õ´Ù. ¾Ë¸² ÀÎÅÍÆäÀ̽ºÀ̹ǷΠÀÌ ÀÎÅÍÆäÀ̽º´Â °³¹ßÀÚ°¡ Á÷Á¢ ¸¸µé¾î¾ß ÇÑ´Ù(Ç¥ 4 ÂüÁ¶). ¨ê ÄÁÆÛ·±½º ÀÎÅÍÆäÀ̽º(INmConference) ÄÝÀÌ ¼º°øÇϸé ÄÁÆÛ·±½º°¡ ¸¸µé¾îÁø´Ù. ÀÌ·¯ÇÑ ÄÁÆÛ·±½º¸¦ Á¦¾îÇϴµ¥ Ç¥ 5¿Í °°Àº ¸Þ¼Òµå¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¨ë ÄÁÆÛ·±½º ¾Ë¸² ÀÎÅÍÆäÀ̽º(INmConferenceNotify) ÄÁÆÛ·±½º ¾Ë¸² ÀÎÅÍÆäÀ̽º´Â ÄÁÆÛ·±½º °ü·Ã À̺¥Æ®¸¦ ³Ý¹ÌÆÿ¡¼­ ÇÁ·Î±×·¥ ÂÊ¿¡ ¾Ë¸®´Âµ¥ »ç¿ëµÈ´Ù. State Changed¿Í Accepted¸¦ ÁÖÀDZí°Ô º¸¸é µÈ´Ù. ¾Ë¸² ÀÎÅÍÆäÀ̽ºÀ̱⠶§¹®¿¡ ÀÌ ÀÎÅÍÆäÀ̽º´Â ¸¸µé¾î¾ß ÇÑ´Ù(Ç¥ 6 ÂüÁ¶). ¨ì ä³Î ÀÎÅÍÆäÀ̽º(INmChannel) ³Ý¹ÌÆà ä³ÎÀ» Á¶ÀÛÇÏ°íÀÚ ÇÒ ¶§ ¾²ÀÌ´Â ÀÎÅÍÆäÀ̽º·Î ÀÌ ÀÎÅÍÆäÀ̽º·ÎºÎÅÍ µ¥ÀÌÅÍ Ã¤³Î ÀÎÅÍÆäÀ̽º¿Í °°Àº ±âŸ ä³Î ÀÎÅÍÆäÀ̽ºµéÀÌ °è½ÂµÇ¾ú´Ù(Ç¥ 7 ÂüÁ¶). ¨í ä³Î ¾Ë¸² ÀÎÅÍÆäÀ̽º(INmChannelNotify) ä³Î ¾Ë¸² ÀÎÅÍÆäÀ̽º´Â ³Ý¹ÌÆÿ¡¼­ ä³Î °ü·Ã À̺¥Æ®¸¦ ÇÁ·Î±×·¥ ÂÊ¿¡ ¾Ë¸®´Âµ¥ »ç¿ëµÈ´Ù. StateChanged¿Í Accepted¸¦ ÁÖÀÇ ±í°Ô º¸¸é µÈ´Ù. ¾Ë¸² ÀÎÅÍÆäÀ̽ºÀ̱⠶§¹®¿¡ ÀÌ ÀÎÅÍÆäÀ̽º´Â ¸¸µé¾î¾ß ÇÑ´Ù(Ç¥ 8 ÂüÁ¶). ¨î µ¥ÀÌÅÍ Ã¤³Î ÀÎÅÍÆäÀ̽º(INmChannelData) ¿©·¯ ä³Î ŸÀÔ Áß¿¡¼­ ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇغ¼ °ÍÀº µ¥ÀÌÅÍ Ã¤³ÎÀÌ´Ù. ÀÌ°ÍÀº INmChannel·ÎºÎÅÍ °è½ÂµÇ¾úÀ¸¹Ç·Î ¾Õ¿¡¼­ »ìÆ캻 INmChannelÀÌ °®°í ÀÖ´Â ¸Þ¼Òµå ÀÌ¿Ü¿¡ Ç¥ 9¿Í °°Àº ¸Þ¼Òµå¸¦ °®´Â´Ù. ¨ï µ¥ÀÌÅÍ Ã¤³Î ¾Ë¸² ÀÎÅÍÆäÀ̽º(INmChannelDataNotify) µ¥ÀÌÅÍ Ã¤³Î¿¡ »ó´ë°¡ º¸³½ µ¥ÀÌÅÍ°¡ µµÂøÇϰųª ÀÚ½ÅÀÇ º¸³½ µ¥ÀÌÅÍ°¡ Ãâ·Â Å¥¿¡ ½×ÀÌ¸é ´ÙÀ½°ú °°Àº À̺¥Æ®¸¦ ¹ß»ý½ÃŲ´Ù(Ç¥ 10 ÂüÁ¶). ÀÌ¿Ü¿¡µµ ¸¹Àº ä³Î °ü·Ã ÀÎÅÍÆäÀ̽ºµéÀÌ Àִµ¥ ±× °Íµé¿¡ ´ëÇؼ­´Â Áö¸é °ü°è»ó ´õ ÀÌ»ó ¼³¸íÇÏÁö ¾Êµµ·Ï ÇÏ°Ú´Ù. ¸¶Áö¸·À¸·Î INmMember ÀÎÅÍÆäÀ̽º¿¡ ´ëÇØ »ìÆ캸ÀÚ. ¨ð ¸â¹ö ÀÎÅÍÆäÀ̽º(INmMember) ÄÁÆÛ·±½º¿¡ Âü¿©ÇÑ ¸â¹ö¿¡ ´ëÇÑ ÀÛ¾÷À» ÇÒ ¼ö Àִ ǥ 11ÀÇ ¸Þ¼Òµå¸¦ Á¦°øÇÑ´Ù. ¿¹Á¦ ÇÁ·Î±×·¥ÀÇ ÀÛ¼º ¿¹Á¦ ÇÁ·Î±×·¥Àº Áö³­ ȸ¿Í ¸¶Âù°¡Áö·Î MFC·Î ÀÛ¼ºÇÏ¿´´Ù. ÇÁ·ÎÁ§Æ® ŸÀÔÀº ´ÙÀ̾ó·Î±× ±â¹ÝÀ¸·Î ¼±ÅÃÇÏ¿´°í À̸§Àº Chat·Î Á¤Çß´Ù. ¿¹Á¦ ÇÁ·Î±×·¥Àº ¾Õ¼­ ¾ð±ÞÇÑ °Íó·³ ÀÏ´ëÀÏ Ã¤Æà ÇÁ·Î±×·¥ÀÌ´Ù. ½ÇÇà È­¸éÀº ±×¸² 2¿Í °°´Ù. ¿ìÃøÀÇ ¸®½ºÆ® ¹Ú½º´Â ÀÏÁ¾ÀÇ µð¹ö±ë¿ë ·Î±×âÀ¸·Î ÀÛ¾÷ÀÇ ÁøÇà »óȲÀ» Ç¥½ÃÇØÁØ´Ù. »ó´ë¿Í ¿¬°áÇÏ°íÀÚ ÇÒ ¶§ ¡°»ó´ë ¿¬°á¡± ¹öÆ°À» ´©¸£¸é ±×¸² 3°ú °°Àº ´ÙÀ̾ó·Î±×°¡ ¶°¼­ »ó´ë¹æÀÇ IP ÁÖ¼Ò¸¦ ÀԷ¹ÞÀ» ¼ö ÀÖ´Ù. ÀÌ ¿¹Á¦ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÏ·Á¸é ³Ý¹ÌÆà SDK°¡ ÀÖ¾î¾ß ÇÑ´Ù. Âü°í·Î ³Ý¹ÌÆà SDK´Â ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® À¥ »çÀÌÆ®(http://www.microsoft.com/windows/Net Meeting/Authors/SDK/Default.ASP)¿¡¼­ ´Ù¿î·Îµå¹ÞÀ» ¼ö ÀÖ´Ù. ÇÁ·Î±×·¡¹Ö½Ã¿¡ ³Ý¹ÌÆà SDKÀÇ API µµ¿ò¸»À» Âü°íÇÒ ÀÏÀÌ ¸¹À» °ÍÀÌ´Ù. ³Ý¹ÌÆà SDK¸¦ ´Ù¿î¹Þ¾Æ ¼³Ä¡ÇßÀ¸¸é Include µð·ºÅ丮ÀÇ imsconf2.idlÀ» ¿¹Á¦ ÇÁ·ÎÁ§Æ®ÀÇ µð·ºÅ丮·Î º¹»çÇÑ´Ù. ±× ´ÙÀ½¿¡ À̸¦ ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡ÇÏ°í ÀÌ ÇÁ·ÎÁ§Æ® ¼¼ÆÃÀ» º¯°æÇØ¾ß ÇÑ´Ù. ÀýÂ÷°¡ Á» º¹ÀâÇÑ ÆíÀε¥ ÀÌ¿¡ ´ëÇؼ­´Â Áö³­ ȸ ±â»çÀÇ ¡°¿¹Á¦ ÇÁ·Î±×·¥-³Ý¹ÌÆà ½Ã½ºÅÛ Á¤º¸ ¾Ë¾Æ³»±â¡±¸¦ Âü°íÇϱ⠹ٶõ´Ù. ÀÌÁ¦ ³Ý¹ÌÆà °ü·Ã Äڵ带 »ìÆ캸±â·Î ÇÏÀÚ. »ó¼¼ÇÑ ÄÚµå´Â ¿¹Á¦ ÇÁ·Î±×·¥ÀÇ ¼Ò½º¸¦ ´Ù¿î¹Þ¾Æ º¸±â ¹Ù¶ó¸ç ¿©±â¼­´Â ¾Õ¼­ ¼³¸íÇß´ø ³Ý¹ÌÆÃÀÇ µ¿ÀÛ ¹æ½Ä¿¡ ÀÇ°ÅÇؼ­ Áß¿äÇÑ ºÎºÐ¸¸ ¼³¸íÇϵµ·Ï ÇÏ°Ú´Ù. ³Ý¹ÌÆà ÃʱâÈ­ ³Ý¹ÌÆà ÃʱâÈ­´Â CChatDlgÀÇ OnCreate ÇÔ¼ö¿¡¼­ ¼öÇàÇÏ¿´´Ù. InitConfMgrÀ̶ó´Â ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ½ÇÇàÇßÀ¸¸ç ÀÌ ÇÔ¼öÀÇ ³»¿ëÀº ¸®½ºÆ® 1°ú °°´Ù. ¸®½ºÆ® 1ÀÇ ¼Ò½º¸¦ º¸¸é ¸Å´ÏÀú °´Ã¼¸¦ ¸¸µç ÈÄ ¸Å´ÏÀúÀÇ ¾Ë¸² °´Ã¼(CMgrNotify)¸¦ ¸¸µé¾î ¿¬°áÇÏ°í ÀÖ´Ù. Áï, ¸Å´ÏÀú °´Ã¼¿¡ ¾î¶² ÀÏ(ÄÝÀÌ »ý°å´Ùµç°¡ ÄÁÆÛ·±½º°¡ ¹ß»ýÇߴٵ簡)ÀÌ ¹ß»ýÇϸé À̸¦ ¿¬¶ô¹Þ±â À§ÇÑ °ÍÀÌ´Ù. CMgrNotify Ŭ·¡½º°¡ ¹Ù·Î INmManagerNotify ÀÎÅÍÆäÀ̽º¸¦ Ŭ·¡½ºÈ­ÇÑ °ÍÀÌ´Ù. ¾Õ¼­ ¼³¸íÇÑ °Íó·³ ¾Ë¸² ÀÎÅÍÆäÀ̽º°¡ °³¹ßÀÚ°¡ Á÷Á¢ ¸¸µé¾î¼­ ³Ý¹ÌÆÿ¡ Á¦°øÇØÁÖ¾î¾ß ÇÑ´Ù. ±× ºÎºÐÀÇ ÄÚµå´Â ´ÙÀ½°ú °°´Ù. hr = m_pMgrNotify->Connect(m_pMgr); AddDebugMessage¶ó´Â ÇÔ¼öµµ º¼ ¼ö Àִµ¥ ÀÌ ÇÔ¼ö´Â ¾Õ¼­ ±×¸² 2ÀÇ ¿ìÃø ¸®½ºÆ® ¹Ú½º¿¡ ÇÑ ÁÙÀ» Ç¥½ÃÇÏ´Â ¿ªÇÒÀ» ÇÏ´Â ÇÔ¼öÀÌ´Ù. ±×·¯¸é CMgrNotify Ŭ·¡½ºÀÇ ½ÇÁ¦ ¼Ò½º´Â µÚ¿¡¼­ ´Ù½Ã »ìÆ캸±â·Î ÇÏ°í ´ÙÀ½À¸·Î ÄÝÀ» Àü¼ÛÇÏ´Â ºÎºÐ¿¡ ´ëÇØ »ìÆ캸ÀÚ. ¸®½ºÆ® 1. ³Ý¹ÌÆà ÃʱâÈ­ HRESULT CChatDlg::InitConfMgr(BOOL bUseNMUI) { HRESULT hr; LPCLASSFACTORY pcf; // ÄÁÆÛ·±½º ¸Å´ÏÀú °´Ã¼¸¦ »ý¼ºÇÑ´Ù. hr = CoGetClassObject(CLSID_NmManager, CLSCTX_INPROC, NULL, IID_IClassFactory, (void**)&pcf); if (FAILED(hr)) { AddDebugMessage(¡°ÄÁÆÛ·±½º ¸Å´ÏÀú °´Ã¼ »ý¼º¿¡ ½ÇÆÐÇß½À´Ï´Ù.¡±); return hr; } else { // IID_INmManager ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò´Â´Ù. hr = pcf->CreateInstance(NULL, IID_INmManager, (void**)&m_pMgr); if (FAILED(hr)) AddDebugMessage(¡°INmManager::CreateInstance¿¡ ½ÇÆÐÇß ½À´Ï´Ù.¡±); else { // ÄÁÆÛ·±½º ¸Å´ÏÀú °´Ã¼¿¡ ¿¬°áÇÒ À̺¥Æ® °´Ã¼¸¦ ¸¸µç´Ù. m_pMgrNotify = new CMgrNotify(); if (m_pMgrNotify == NULL) { hr = E_OUTOFMEMORY; AddDebugMessage(¡°CMgrNotify¸¦ »ý¼ºÇÒ ¼ö ¾ø½À´Ï´Ù.¡±); } else { // ÄÁÆÛ·±½º ¸Å´ÏÀú °´Ã¼¿Í À̺¥Æ® °´Ã¼¸¦ ¿¬°áÇÑ´Ù. hr = m_pMgrNotify->Connect(m_pMgr); if (FAILED(hr)) { AddDebugMessage(¡°CMgrNotify::Connect ½ÇÆÐ Çß½À´Ï´Ù.¡±); m_pMgrNotify->Release(); m_pMgrNotify = NULL; } else { // NmÀ» ÃʱâÈ­ÇÑ´Ù. ULONG uchCaps = NMCH_ALL; ULONG uOptions; if (bUseNMUI) uOptions = (ULONG)NM_INIT_NORMAL; else uOptions = (ULONG)NM_INIT_CONTROL; hr = m_pMgr->Initialize(&uOptions, &uchCaps); } } } pcf->Release(); } return hr; } ÄÝÀÇ »ý¼º ÄÝÀ» »ý¼ºÇϴµ¥´Â INmManager::CreateCall ¸Þ¼Òµå¸¦ »ç¿ëÇÑ´Ù. ÀÎÀÚ·Î ÄÝ ¿äûÀ» ¹ÞÀ» »ó´ëÀÇ ÁÖ¼Ò(IP ÁÖ¼Ò)°¡ ÇÊ¿äÇÏ´Ù. À̸¦ ÀÔ·ÂÇϱâ À§ÇÑ ´ÙÀ̾ó·Î±× Ŭ·¡½º°¡ ¹Ù·Î ±×¸² 3ÀÇ CGetIP Ŭ·¡½ºÀÌ´Ù. ÀÌ ´ÙÀ̾ó·Î±× Ŭ·¡½º´Â ³Ê¹« °£´ÜÇؼ­ ¼Ò½º¸¦ º¸¸é ±Ý¹æ ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ´ÙÀ̾ó·Î±×¸¦ ¶ç¿ö ÁÖ¼Ò¸¦ ÀԷ¹ްí ÄÝÀ» Àü¼ÛÇÏ´Â ºÎºÐÀÇ ÄÚµå´Â ´ÙÀ½°ú °°´Ù. void CChatDlg::OnConnect() { CGetIP getIPDlg(this); if (getIPDlg.DoModal() == IDOK) { HRESULT hr; INmCall * pCall; CString strIP; strIP = getIPDlg.m_strIP; // getIPDlg.m_strIP·Î ¿¬°áÀ» ½ÃµµÇÑ´Ù. if (NULL == m_pMgr) return; // IP ÁÖ¼Ò¸¦ À¯´ÏÄÚµå·Î º¯°æÇÑ´Ù. BSTR bstrAddr = strIP.AllocSysString(); hr = m_pMgr->CreateCall(&pCall, NM_CALL_T120, NM_ADDR_IP, bstrAddr, NULL); if (SUCCEEDED(hr)) { pCall->Release(); } } } INmManager::CreateCallÀÇ ÀÎÀÚ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº ³Ý¹ÌÆà SDK¸¦ Âü°íÇϱ⠹ٶõ´Ù. µÎ ¹ø° ÀÎÀÚ°¡ ÄÝÀÇ Å¸ÀÔÀ» ÁöÁ¤Çϴµ¥ µ¥ÀÌÅÍ Åë½Å¸¸À» ÇÒ °ÍÀ̱⠶§¹®¿¡ NM_CALL_T120À¸·Î ÁöÁ¤Çß´Ù. ¼¼ ¹ø° ÀÎÀÚ´Â »ó´ë ÁÖ¼ÒÀÇ ÁöÁ¤ ¹æ½ÄÀ» ³ªÅ¸³»´Âµ¥ NM_ADDR_IP¸¦ ÇÒ´çÇÏ¸é ¸» ±×´ë·Î »ó´ë ÁÖ¼Ò¸¦ IP ÁÖ¼Ò·Î ÁöÁ¤ÇÏ°Ú´Ù´Â °ÍÀÌ´Ù. ³× ¹ø° ÀÎÀÚ·Î »ó´ëÀÇ IP ÁÖ¼Ò¸¦ À¯´ÏÄÚµå·Î ÁöÁ¤ÇÑ °ÍÀ» º¼ ¼ö ÀÖ´Ù. ÄÝÀÌ ¸¸µé¾îÁ®¼­ »ó´ë¹æ°ú ¿¬°áµÇ¸é ¾çÂÊ ¸ðµÎ¿¡ ÄÝ °´Ã¼°¡ »ý¼ºµÈ´Ù. »ý¼ºµÈ ÄÝ °´Ã¼´Â INmManagerNotifyÀÇ CallCreated ¸Þ¼Òµå·Î ¸®ÅϵȴÙ. ±×·¯¸é ¿©±â¼­ ´Ù½Ã ÀÌ ¾Ë¸² ÀÎÅÍÆäÀ̽º¿¡ ´ëÇØ »ìÆ캸±â·Î ÇÏÀÚ. ¸Å´ÏÀú ÄÄÆ÷³ÍÆ® »Ó¸¸ ¾Æ´Ï¶ó ÄÝ, ä³Î, ÄÁÆÛ·±½º ¸ðµÎ °¢±â ¾Ë¸² ÀÎÅÍÆäÀ̽º¸¦ °®´Âµ¥ ±¸¼ºÀº ¸ðµÎ À¯»çÇÏ´Ù. ¸Å´ÏÀú ÄÄÆ÷³ÍÆ®ÀÇ ¾Ë¸² ÀÎÅÍÆäÀ̽º ±¸¼º¸¸ ÀÌÇØÇÑ´Ù¸é ´Ù¸¥ °Íµéµµ ÀÌÇØÇÑ ¼ÀÀÌ´Ù. ´ÙÀ½ÀÇ CMgrNotify Ŭ·¡½º´Â INmManagerNotify ÀÎÅÍÆäÀ̽º¸¦ Ŭ·¡½ºÈ­ÇÑ °ÍÀÌ´Ù. class CMgrNotify : public INmManagerNotify { DWORD m_dwCookie; // ¸Å´ÏÀú¿Í ¸Å´ÏÀú ¾Ë¸² ÀÎÅÍÆäÀ̽º°£ÀÇ ¿¬°áÀ» ³ªÅ¸³»´Â °ª IUnknown * m_pUnk; IConnectionPoint *m_pcnp; IConnectionPointContainer *m_pcnpcnt; DWORD m_dwObjRefCount; public: CMgrNotify(); ~CMgrNotify(); // INmManagerNotify HRESULT STDMETHODCALLTYPE NmUI(CONFN uNotify); HRESULT STDMETHODCALLTYPE ConferenceCreated(INmConference *pConference); HRESULT STDMETHODCALLTYPE CallCreated(INmCall *pCall); // ICNotify methods HRESULT STDMETHODCALLTYPE Connect (IUnknown *pUnk); HRESULT STDMETHODCALLTYPE Disconnect(void); // IUnknown methods ULONG STDMETHODCALLTYPE AddRef(void); ULONG STDMETHODCALLTYPE Release(void); HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, PVOID *ppvObj); IUnknown * GetPunk() {return m_pUnk;} }; À§ÀÇ ¼Ò½º¸¦ º¸¸é IConnectionPoint¿Í IConnection PointContainer¶ó´Â ÀÎÅÍÆäÀ̽º°¡ º¸À̴µ¥ ÀÌ´Â ÀÎÅÍÆäÀ̽º°£¿¡ À̺¥Æ®¸¦ ¹Þ´Âµ¥ »ç¿ëµÇ´Â ÀÎÅÍÆäÀ̽ºµé·Î Àá±ñ ¼³¸íÇϱ⿡´Â º¹ÀâÇÏ´Ù. ¿äÁò ÇÊÀÚ°¡ ±¸·ç Ä®·³¿¡ ¿¬Àç ÁßÀÎ COM ½ÉÃþ ºÐ¼®¿¡¼­ ±âȸ°¡ µÈ´Ù¸é ÀÚ¼¼È÷ ´Ù·ïº¼ »ý°¢ÀÌ´Ù. ¿©±â¼­´Â ÀÎÅÍÆäÀ̽º°£¿¡ À̺¥Æ®¸¦ ¹Þ´Âµ¥ »ç¿ëµÈ´Ù´Â Á¤µµ·Î¸¸ ¼³¸íÀ» ³¡³»°Ú´Ù. CMgrNotify Ŭ·¡½ºÀÇ ±¸Çö ÄÚµå Áß¿¡¼­ ¾Õ¼­ ÁøÇàÇÏ´ø ¼³¸í¿¡ ÇÊ¿äÇÑ CallCreatedÀÇ ÄÚµå´Â ´ÙÀ½°ú °°´Ù. ÄÝÀÌ Çϳª »ý¼ºµÇ¾úÀ¸¹Ç·Î À̸¦ CChatDlgÀÇ m_ listCall ¸®½ºÆ®¿¡ Ãß°¡ÇÏ°í ÀÌ ÄݷκÎÅÍ ¹ß»ýÇÏ´Â À̺¥Æ®¸¦ º¸°í¹Þ±â À§ÇØ CCallNotify Ŭ·¡½ºÀÇ °´Ã¼¸¦ Çϳª ¸¸µé¾î À̸¦ ¿¬°áÇÏ¿´´Ù. ¾Õ¼­ ¸Å´ÏÀú °´Ã¼ÀÇ ÃʱâÈ­ ÀÛ¾÷¿¡¼­¿Í Èí»çÇÑ ¼ø¼­¸¦ ¹â°í ÀÖ´Ù. ÀÌ·¸°Ô ¸¸µé¾îÁø CCall Notify °´Ã¼´Â CChatDlgÀÇ m_listCallNotify ¸®½ºÆ®¿¡ Ãß°¡µÈ´Ù. CCallNotify Ŭ·¡½º´Â INmCallNotify ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÑ °ÍÀ¸·Î ¿©±â¿¡´Â ÄÝÀÇ »óŸ¦ ¾Ë·ÁÁÖ´Â StateChanged¶ó´Â À̺¥Æ®°¡ ÀÖ´Ù. ÄÚµå´Â ¸®½ºÆ® 3°ú °°´Ù. ¸®½ºÆ® 3À» º¸¸é ÀÎÀÚ·Î ³Ñ¾î¿À´Â °ª¿¡ µû¶ó ÀÏÀ» ó¸®ÇÏ°í ÀÖ´Ù. NM_CALL_RINGÀÌ µé¾î¿À°í ±× ÄÝÀÇ IsIncoming ¸Þ¼ÒµåÀÇ ¸®ÅÏ°ªÀÌ S_OKÀ̸é ÀÌ´Â ¾î¶² »ó´ë·ÎºÎÅÍ ÄÝ ¿äûÀÌ µé¾î¿Â °ÍÀÌ´Ù. ±×·¯¸é ¸Þ½ÃÁö ¹Ú½º¸¦ Çϳª ¶ç¿ö ´ëÈ­¸¦ ³ª´­ °ÍÀÎÁö ¹°¾îº»´Ù. ¡®¿¹¡¯¸¦ ¼±ÅÃÇϸé ÄÝÀÇ Accept ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© ÄÝ ¿äûÀ» ¹Þ¾ÆµéÀÌ°í ¡®¾Æ´Ï¿À¡¯¸¦ ¼±ÅÃÇϸé Reject ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© ÄÝ ¿äûÀ» °ÅºÎÇÑ´Ù. ÄÝ ¿äûÀÌ ¼ö¶ôµÇ¸é StateChanged ¸Þ¼ÒµåÀÇ ÀÎÀÚ·Î NM_CALL_ACCEPTED°¡ µé¾î¿À°í ÀÌ ¶§ äÆà °ü·Ã ÄÁÆ®·ÑµéÀÇ »óŸ¦ È°¼ºÈ­½ÃŲ´Ù. ÄÝ ¿äûÀÌ °ÅºÎµÇ¸é NM_CALL_REJECTED°¡ µé¾î¿Â´Ù. ¸®½ºÆ® 2 : CMgrNotifyÀÇ CallCreated ¸Þ¼Òµå // ------------------------------------------- // »õ·Î¿î ÄÝÀÌ Çϳª »ý±â¸é ÀÌ ÇÔ¼ö°¡ È£ÃâµÈ´Ù. // ------------------------------------------- HRESULT STDMETHODCALLTYPE CMgrNotify::CallCreated(INmCall *pCall) { HRESULT hr; CCallNotify *pNotify; CChatDlg *pDlg = (CChatDlg *)AfxGetMainWnd(); BYTE* ppb=NULL; ULONG pcb=0; pDlg->AddDebugMessage(¡°CallÀÌ Çϳª »ý¼ºµÇ¾ú½À´Ï´Ù.¡±); pCall->AddRef(); pDlg->m_listCall.AddTail(pCall); pNotify = new CCallNotify(); if (pNotify == NULL) { pDlg->AddDebugMessage(¡°CCallNotify¸¦ »ý¼ºÇÒ ¼ö ¾ø½À´Ï´Ù.¡±); hr = E_OUTOFMEMORY; } else { hr = pNotify->Connect(pCall); if (FAILED(hr)) { pDlg->AddDebugMessage(¡°CMgrNotify::Connect¿¡ ½ÇÆÐÇß½À´Ï´Ù.¡±); pNotify->Release(); } else { pDlg->AddDebugMessage(¡°CCallNotify¸¦ »ý¼ºÇÏ¿´½À´Ï´Ù.¡±); pDlg->m_listCallNotify.AddTail(pNotify); } } return hr; } ÄÁÆÛ·±½ºÀÇ »ý¼º ÄÝÀÌ ¿¬°áµÇ°í ¼ö¶ôµÇ¸é ÀÌ ¶§ºÎÅÍ ÄÁÆÛ·±½º°¡ Á¤½ÄÀ¸·Î µ¿ÀÛÇÑ´Ù. »ç½Ç ÄÝÀÌ ¸¸µé¾îÁö´Â ½ÃÁ¡ºÎÅÍ ÄÁÆÛ·±½º´Â ¸¸µé¾îÁ® ÀÖ´Ù. óÀ½¿¡´Â ÈÞÁö(idle) »óÅÂÀÌ´Ù°¡ ÄÁÆÛ·±½º¿¡ ±¸¼º¿øµéÀÌ µé¾î¿À¸é È°¼ºÈ­ »óÅ·Πº¯°æµÈ´Ù. ÄÁÆÛ·±½º°¡ ¸¸µé¾îÁö¸é ÀÌ´Â ¸Å´ÏÀú ¾Ë¸² ÀÎÅÍÆäÀ̽ºÀÇ Con ferenceCreated ¸Þ¼Òµå·Î Å뺸µÈ´Ù(¸®½ºÆ® 4 ÂüÁ¶). ¾Õ¼­ ¸¹ÀÌ º¸¾Ò´ø Äڵ忡¼­Ã³·³ ÄÁÆÛ·±½º¿¡¼­µµ ¾Ë¸² °´Ã¼¸¦ Çϳª ¸¸µé¾î ¿¬°áÇÏ°í ÀÖ´Ù. ÄÁÆÛ·±½º ¾Ë¸² °´Ã¼·Î ÄÁÆÛ·±½º ³»¿¡ »õ·Î Ãß°¡µÇ´Â ¸â¹ö¿Í ä³Î¿¡ ´ëÇÑ Á¤º¸°¡ Å뺸µÈ´Ù. ¸®½ºÆ® 3 : CCallNotify::StateChanged ¸Þ¼Òµå HRESULT STDMETHODCALLTYPE CCallNotify::StateChanged (NM_CALL_STATE uState) { HRESULT hr; CChatDlg *pDlg = (CChatDlg *)AfxGetMainWnd(); if (uState == NM_CALL_RING) // ¿ÜºÎ¿¡¼­ µé¾î¿Â ÄÝÀÇ °æ¿ì¿¡¸¸ ´ÙÀ̾ó·Î±×¸¦ ¶ç¿î´Ù. { pDlg->AddDebugMessage(¡°CCallNotify::StateChanged ¿ÜºÎ¿¡¼­ ÀüÈ­°¡ ¿À°í ÀÖ½À´Ï´Ù.¡±); INmCall *pCall = (INmCall *)m_pUnk; if (pCall->IsIncoming() == S_OK) { BSTR bstrName; pCall->GetName(&bstrName); CString str = bstrName; CString strMsg; pDlg->AddDebugMessage(¡°CCallNotify::State Changed ¿ÜºÎ¿¡¼­ ¿Â ÄÝÀÔ´Ï´Ù.¡±); strMsg.Format(¡°%s´ÔÀ¸·ÎºÎÅÍ ¿Â äÆà ¿äûÀ» ¼ö¶ôÇϽðڽÀ´Ï±î ?¡±, str); UINT nRet = AfxMessageBox(strMsg, MB_YESNO); // ÄÝÀ» ¹ÞÀ» °ÍÀÎÁö ¿©ºÎ¸¦ °áÁ¤ÇÑ´Ù. if (nRet == IDYES) hr = pCall->Accept(); else hr = pCall->Reject(); } } else if (uState == NM_CALL_ACCEPTED) { pDlg->AddDebugMessage(¡°CCallNotify::StateChanged ÄÝÀÌ ¼ö¶ôµÇ¾ú½À´Ï´Ù.¡±); // ÀÌ °æ¿ì¿¡ ¹öÆ°µéÀ» È°¼ºÈ­ÇÑ´Ù. AfxGetMainWnd()->GetDlgItem(IDC_LOG)->EnableWindow(TRUE); AfxGetMainWnd()->GetDlgItem(IDC_INPUT)->EnableWindow(TRUE); AfxGetMainWnd()->GetDlgItem(IDC_SEND)->EnableWindow(TRUE); } else if (uState == NM_CALL_REJECTED) { pDlg->AddDebugMessage(¡°CCallNotify::StateChanged ÄÝÀÌ °ÅºÎµÇ¾ú½À´Ï´Ù.¡±); AfxMessageBox(¡°È£ÃâÀÌ °ÅºÎµÇ¾ú½À´Ï´Ù.¡±); } return S_OK; } ¸®½ºÆ® 4 : CMgrNotify Ŭ·¡½ºÀÇ ConferenceCreatedÀÇ ±¸Çö HRESULT STDMETHODCALLTYPE CMgrNotify::ConferenceCreated (INmConference *pConference) { HRESULT hr; CConfNotify * pNotify; CChatDlg *pDlg = (CChatDlg *)AfxGetMainWnd(); pDlg->AddDebugMessage(¡°Conference°¡ Çϳª »ý¼ºµÇ¾ú½À´Ï´Ù.¡±); pConference->AddRef(); pDlg->m_listConference.AddTail(pConference); pNotify = new CConfNotify(); if (NULL == pNotify) { hr = E_OUTOFMEMORY; pDlg->AddDebugMessage(¡°CConfNotify¸¦ »ý¼ºÇÒ ¼ö ¾ø½À´Ï´Ù.¡±); } else { hr = pNotify->Connect(pConference); if (FAILED(hr)) { pDlg->AddDebugMessage(¡°CConfNotify::Connect¿¡ ½ÇÆÐÇß½À´Ï´Ù.¡±); pNotify->Release(); pNotify = NULL; } else { pDlg->AddDebugMessage(¡°CConfNotify °´Ã¼¸¦ ¼º°øÀûÀ¸·Î ¸¸µé¾ú½À´Ï´Ù¡±); pDlg->m_listConferenceNotify.AddTail(pNotify); } } return S_OK; } ÄÁÆÛ·±½º ³»ÀÇ Ã¤³Î°ú ¸â¹ö Ãß°¡/»èÁ¦ ÄÁÆÛ·±½º ¾Ë¸² °´Ã¼´Â CConfNotify¶ó´Â Ŭ·¡½º·Î ±¸ÇöµÈ´Ù. ÀÌ Å¬·¡½º´Â INmConferenceNotify ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÑ °ÍÀÌ´Ù. ÀÌ ¸Þ¼Òµå Áß StateChanged·Î ÄÁÆÛ·±½ºÀÇ »óÅ º¯È­°¡ ¾Ë·ÁÁö°í MemberChanged·Î ÄÁÆÛ·±½ºÀÇ Âü¿©ÀÚ Ãß°¡/»èÁ¦ Á¤º¸°¡ ¾Ë·ÁÁø´Ù. Channel Changed·Î ÄÁÆÛ·±½º¿¡¼­ »ç¿ëÇÒ Ã¤³ÎÀÇ Ãß°¡/»èÁ¦/º¯°æ Á¤º¸°¡ Å뺸µÈ´Ù. ÀÌ Áß¿¡¼­ Channel ChangedÀÇ ³»¿ë Áß Ã¤³ÎÀ» Ãß°¡ÇÏ´Â ºÎºÐÀº ´ÙÀ½°ú °°´Ù. ÄÁÆÛ·±½º¿¡ »õ·Î¿î »ç¿ëÀÚ°¡ µé¾î¿À¸é ±× »ç¿ëÀÚ¿Í ÄÁÆÛ·±½º³»ÀÇ »ç¿ëÀڵ鰣¿¡´Â ä³ÎÀÌ Çü¼ºµÈ´Ù. Çü¼ºµÇ´Â ä³ÎÀÇ Á¾·ù´Â µÎ »ç¿ëÀÚÀÇ ½Ã½ºÅÛ »óÅ¿¡ µû¶ó ´Ù¸£´Ù. ¸®½ºÆ® 5¿¡¼­´Â µ¥ÀÌÅÍ Ã¤³ÎÀÏ °æ¿ì¿¡¸¸ INmChan nelData ÀÎÅÍÆäÀ̽º¸¦ »Ì¾Æ³»°í ¾Ë¸² °´Ã¼(CData Notify)¸¦ ¿¬°áÇÏ°í ÀÖ´Ù. CDataNotify Ŭ·¡½º´Â INmChannelDataNotify ÀÎÅÍÆäÀ̽º¸¦ Ŭ·¡½ºÈ­ÇÑ °ÍÀ¸·Î ÀÌ°ÍÀÇ DataSent¿Í DataReceived ¸Þ¼Òµå¸¦ ÅëÇØ ¼Û¼ö½ÅµÇ´Â ÅؽºÆ® µ¥ÀÌÅ͸¦ ¾Ë ¼ö ÀÖ´Ù. ÅؽºÆ® µ¥ÀÌÅÍÀÇ ¼Û¼ö½Å µ¥ÀÌÅÍÀÇ ¼Û½ÅÀº INmChannelDataÀÇ SendData ¸Þ¼Òµå¸¦ ÅëÇØ °¡´ÉÇÏ´Ù. »ó´ë°¡ º¸³½ µ¥ÀÌÅÍÀÇ ¼ö½ÅÀº INmChannelDataNotifyÀÇ DataReceived ¸Þ¼Òµå¸¦ ÅëÇØ Å뺸¹Þ°Ô µÇ¸ç ³»°¡ »ó´ë¿¡°Ô º¸³½ µ¥ÀÌÅÍ´Â Ãâ·Â Å¥¿¡ ³õÀÎ ´ÙÀ½ INmChannelDataNotifyÀÇ DataSent ¸Þ¼Òµå¸¦ ÅëÇØ Å뺸¹Þ´Â´Ù. DataReceived ºÎºÐÀÇ ÄÚµå´Â ´ÙÀ½°ú °°´Ù. HRESULT STDMETHODCALLTYPE CDataNotify::DataReceived(INmMember *pMember, ULONG uSize, LPBYTE pb, ULONG dwFlags) { CChatDlg *pDlg = (CChatDlg *)AfxGetMainWnd(); LPTSTR psz; psz = (LPTSTR)pb; pDlg->AddDebugMessage(psz); if (dwFlags & NM_DF_SEGMENT_BEGIN) { pDlg->AddChatMessage(pMember, psz); // äÆÃâ¿¡ ¸Þ½ÃÁö¸¦ Ãß °¡ÇÑ´Ù. } return S_OK; } ÀÌ°ÍÀ¸·Î ³Ý¹ÌÆà ¿¹Á¦ ÇÁ·Î±×·¥À» »ìÆ캸¾Ò´Ù. »ç½Ç ¹æ´ëÇÑ ³»¿ëÀ̶ó 1ȸ ºÐ·®À¸·Î ¼³¸íÇϱ⿣ Á» ¹÷Âù °¨ÀÌ ¾øÁö ¾Ê¾Ò´Ù. ¼Ò½º¸¦ ÂüÁ¶ÇÏ¸ç ¿­½ÉÈ÷ °øºÎÇϱ⠹ٶõ´Ù. INmConferenceNotifyÀÇ ChannelChanged ¸Þ¼ÒµåÀÇ Ã³¸®¸¦ Á¶±Ý¸¸ ¼öÁ¤ÇÏ¸é ¿Àµð¿À³ª ºñµð¿À ä³ÎÀÇ Ãß°¡µµ ¾î·ÆÁö ¾Ê´Ù. ³Ý¹ÌÆÃÀÇ NMUI ¿¹Á¦ÀÇ ÇØ´ç ºÎºÐÀ» Âü°íÇϱ⠹ٶõ´Ù. Áö³­ 6°³¿ù¿¡ °ÉÄ£ ÀÎÅÍ³Ý ÇÁ·Î±×·¡¹ÖÀÇ ¿¬Àçµµ ÀÌ°ÍÀ¸·Î ³¡³µ´Ù. »õ·Î¿î ³»¿ëÀ» ¸¹ÀÌ ´Ù·ç·Á Çߴµ¥ ¾î¶² ºÎºÐ¿¡ À־´Â »ý°¢º¸´Ù Ãæ½ÇÇÏ°Ô ´Ù·çÁö´Â ¸øÇÑ °Í °°´Ù. ¾Æ¹«Æ° ¸¹Àº µ¶ÀÚ ¿©·¯ºÐ²² µµ¿òÀÌ ¸¹ÀÌ ¸¹ÀÌ µÇ¾úÀ¸¸é ÇÏ´Â ¹Ù·¥ÀÌ´Ù. ±× µ¿¾È ¿¬ÀçµÇ¾ú´ø ³»¿ë¿¡ ´ëÇØ Áú¹®ÀÌ ÀÖÀ¸¸é ¾ðÁ¦µçÁö ÁÖÀú¸»°í ÇÊÀÚÀÇ À̸ÞÀÏ·Î º¸³» Áֱ⠹ٶõ´Ù. ´õ ÁÁÀº ³»¿ëÀ¸·Î ´Ù½Ã µ¶ÀÚ ¿©·¯ºÐ°ú ¸¸³¯ °ÍÀ» ¾à¼Óµå¸°´Ù. ¸®½ºÆ® 5 : ÄÁÆÛ·±½º ä³ÎÀÇ Ãß°¡/»èÁ¦ HRESULT STDMETHODCALLTYPE CConfNotify::ChannelChanged (NM_CHANNEL_NOTIFY uNotify, INmChannel *pChannel) { CChatDlg *pDlg = (CChatDlg *)AfxGetMainWnd(); HRESULT hr; switch (uNotify) { case NM_CHANNEL_ADDED: { CChannelNotify * pNotify; ULONG uch; pDlg->AddDebugMessage(¡°CConfNtfy::ChannelChanged CHANNEL ADDED¡±); pChannel->GetNmch(&uch); if (uch != NMCH_DATA) // Ãß°¡µÈ ä³ÎÀÌ µ¥ÀÌÅÍ Ã¤³ÎÀÌ ¾Æ´Ñ °æ¿ì¿¡´Â ¹«½ÃÇÑ´Ù. { pDlg->AddDebugMessage(¡°CConfNotify::ChannelChanged No Data channel¡±); break; } else pDlg->AddDebugMessage(¡°CConfNotify::ChannelChanged Data channel¡±); pChannel->AddRef(); pDlg->m_listChannel.AddTail(pChannel); pNotify = new CChannelNotify(); if (pNotify == NULL) { pDlg->AddDebugMessage(¡°CConfNotify::ChannelChanged¡± ¡° CChannelNotify out of memory¡±); hr = E_OUTOFMEMORY; } else { hr = pNotify->Connect(pChannel); .......... hr = pChannel->QueryInterface(IID_INmChannelData, (void **)&pDlg->m_pChannelData); .......... CDataNotify * pDataNotify; pDataNotify = new CDataNotify(); .......... hr = pDataNotify->Connect(pDlg->m_pChannelData); .........