lecture Home > .NET > Smart Client

Internet Explorer ¿¡¼­ÀÇ ´å³Ý Smart Client °³¹ß

   °­Á ÃÖÃÊ ÀÛ¼ºÀÏ : 2004³â 03¿ù 15ÀÏ
   °­Á ÃÖÁ¾ ¼öÁ¤ÀÏ : 2005³â 03¿ù 22ÀÏ

   °­Á ÀÐÀ½ ¼ö : ȸ

   ÀÛ¼ºÀÚ : kevin(Á¤ ¼ºÅÂ)
   ÆíÁýÀÚ : Taeyo(±è Å¿µ)

   °­Á Á¦¸ñ : Internet Explorer ¿ÍÀÇ ¿¬µ¿

°­ÁÂ Àü ÇÊÀÚÀÇ Àâ´ã>

±× Àü¿¡ Å¿ÀÀÇ Àâ´ã : ÀÌ °­Á´ 2004³â 2¿ùºÎÅÍ 4¿ù±îÁö ¿ù°£¸¶¼Ò¿¡ ¿¬ÀçµÇ¾ú´ø ½º¸¶Æ® Ŭ¶óÀÌ¾ðÆ®¿¡ ´ëÇÑ Ä÷³À̱¸¿ä. ´å³Ø¿¢½ºÆÛÆ®ÀÇ ±â¼ú ÄÁ¼³ÅÏÆ®À̽ŠÁ¤¼ºÅ´ÔÀÌ Á¦°øÇØÁּ̽À´Ï´Ù. ½º¸¶Æ® Ŭ¶óÀÌ¾ðÆ®¿¡ ´ëÇÑ ÀڷḦ ±¸Çϱâ Èûµç »óȲ¿¡¼­ ÀÌ·¸°Ô ¼±¶æ ÁÁÀº ÀڷḦ °ø°³ÇØÁֽмºÅ´Բ² ´Ù½Ã Çѹø °¨»çµå¸³´Ï´Ù.

Âü°í·Î, ¼ºÅ´ÔÀÇ °³ÀÎ »çÀÌÆ®´Â ¹Ù·Î www.sysnet.pe.krÀÔ´Ï´Ù.
°­Áº¸°í °¨µ¿À» ¸Ô¾î¼­ ÇѸ¶µð °Ý·Á¸¦ ÇØ ÁÖ°í ½Í°Å³ª, °­Á¿¡ ´ëÇØ Áú¹®Àº ¿ä±â·Î!!!


IE ´Â ±× ÀÚü°¡ Local Server COM °³Ã¼À̸鼭, COM °³Ã¼ ƯÀ¯ÀÇ ´Ù¾çÇÑ È®ÀåÀ» Á¦°øÇϰí ÀÖ´Ù. ºñ´Ü, IE ÀÚüÀÇ È®Àå¿¡¼­¸¸ COM ÀÌ ¾²ÀÌ´Â °ÍÀÌ ¾Æ´Ï°í, IE °¡ º¸¿©ÁÖ´Â HTML ¿¡¼­Á¶Â÷ <OBJECT/> ¶ó´Â ű׸¦ ÅëÇØ¼­ COM °³Ã¼¸¦ ÀνºÅϽºÈ­ ½Ãų ¼ö ÀÖ°í, HTML ÀÇ ÅÂ±× ÇϳªÇϳª±îÁöµµ ½ÇÁ¦·Î´Â COM °³Ã¼·Î Á¦°øµÇ±â ¶§¹®¿¡, ±×¾ß¸»·Î ¿Ïº®ÇÑ COM Application À̸鼭 ±×¸¦ À§ÇØ ¹«¼öÈ÷ ¸¹Àº COM °³Ã¼¸¦ ¸¸µé¾î ³»°Ô ÇÑ À庻ÀÎÀÌ´Ù. ÃÖ±Ù ´å³Ý ÇÁ·¹ÀÓ¿öÅ©°¡ ³ª¿À¸é¼­ "Smart Client" ¶ó´Â ¹Ý°¡¿î ¼Ò½ÄÀÌ ActiveX °³¹ßÀڵ鿡°Ô ÀüÇØÁ³´Ù. ºÐ¸í, Smart Client °¡ Á¦ÀÛÇϱ⠽±°í À¯Áö/º¸¼ö°¡ °£ÆíÇϱä ÇÏÁö¸¸, ±âÁ¸ ActiveX ÄÁÆ®·ÑµéÀº ±× Á¦ÀÛ ¹æ¹ý¿¡ À־ ´Ù¾çÇÑ IE ¿ÍÀÇ ¿¬µ¿ ±â¹ýÀ» »ç¿ëÇϰí ÀÖ¾ú´Ù. Smart Client ¿ª½Ã ±×¿Í µ¿ÀÏÇÑ ±â´ÉÀ» ±âº»ÀûÀ¸·Î ±¸ÇöÇÒ ¼ö ÀÖ¾î¾ß¸¸ ½ÇÁ¦ Çö¾÷¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖÀ» ÅÙµ¥, ºñ·Ï ´å³Ý ÇÁ·¹ÀÓ¿öÅ©°¡ COM ȯ°æ°úÀÇ ¿¬µ¿À» °í·ÁÇØ Á¦À۵DZä ÇßÁö¸¸, COM ÀÚü·Î µ¿À۵Ǵ °ÍÀº ¾Æ´Ï±â ¶§¹®¿¡ ±âÁ¸ ActiveX ÄÁÆ®·ÑÀÇ ±â´ÉÀ» Smart Client ·Î Æ÷ÆÃÇÏ´Â °ÍÀÌ ±×´ÙÁö ¸¸¸¸ÇÏÁø ¾Ê´Ù. À̹øÈ£¿¡¼­´Â, ¹Ù·Î Smart Client °¡ ¾î¶»°Ô "IE ¿ÍÀÇ ¿¬µ¿" À» ÇÒ ¼ö ÀÖ´ÂÁö¸¦ ¼Ò°³ÇϰíÀÚ ÇÑ´Ù.

Á¤¼ºÅ kevin@dotnetxpert.com

ÇöÀç (ÁÖ) ´å³Ý ¿¢½ºÆÛÆ® ¿¡¼­ ±â¼úÄÁ¼³ÅÏÆ®·Î ÀÏÇϰí ÀÖÀ¸¸ç, ÁÖ·Î COM-ActiveX, COM+, .NET Framework °ü·ÃÇÑ ÀÛ¾÷À» Çϰí ÀÖ´Ù.


¿¬Àç ¼ø¼­
1ȸ : Smart Client ÀÇ °³¿ä
2ȸ : Internet Explorer ¿ÍÀÇ ¿¬µ¿
3ȸ : ¹èÆ÷

¿¬Àç °¡À̵å
¿î¿µÃ¼Á¦ : IIS °¡ ¼³Ä¡µÈ Windows ¿î¿µÃ¼Á¦ - ÇÊÀÚÀÇ °æ¿ì Windows 2003
°³¹ßµµ±¸ : Visual Studio .NET 2003, .NET Framework v1.1.4322
±âÃÊÁö½Ä : COM, C#, ASP.NET ±âÃÊ
ÀÀ¿ëºÐ¾ß : ÇöÀç·Î¼­´Â ±â¾÷ ³»ºÎÀÇ ÀÎÆ®¶ó³Ý ȯ°æ¿¡¼­ÀÇ ActiveX ÄÁÆ®·Ñ ´ëü.
ÀÌÈÄ, ´å³Ý ÇÁ·¹ÀÓ¿öÅ©°¡ ÀϹÝÈ­µÇ¸é ¿ÜºÎ À¥»çÀÌÆ® ¿¡¼­ÀÇ ActiveX ÄÁÆ®·Ñ ´ëü

[°­ÁÂÀÇ ¼Ò½º¸¦ ´Ù¿î·ÎµåÇÏ°í ½Í´Ù¸é Ŭ¸¯Çϼ¼¿ä!!]


COM À¸·Î ActiveX ¸¦ °³¹ßÇØ º¸½Å ºÐÀ̶ó¸é ´ë°³ÀÇ °æ¿ì ÀÏÁ¤ÇÑ ¼ø¼­·Î °øºÎ¸¦ ÇßÀ» °ÍÀÌ´Ù. ¿ì¼±, ±âº»ÀûÀÎ ¸Þ¼­µå/¼Ó¼ºÀ» ±¸ÇöÇßÀ» °ÍÀÌ°í ±× ´ÙÀ½ ¾à°£ ¾î·Á¿î À̺¥Æ® ¿¬°áÀ» °øºÎÇßÀ» °ÍÀÌ´Ù. ±×·¸°Ô COM ¿¡ Àͼ÷ÇØÁö°í ³ª¸é, À¥¿¡¼­ÀÇ ActiveX ÄÁÆ®·Ñ Á¦ÀÛÀ» ÇØº¸°Ô µÇ°í °á±¹ Internet Explorer ¿ÍÀÇ ¿¬µ¿À» ÀÍÈ÷°Ô µÈ´Ù. ¸¶Âù°¡Áö·Î ¿ì¸®´Â ¿¬Àç 1ȸ¿¡¼­ ±âº»ÀûÀÎ ±â´ÉÀ» ÇÒ ¼ö ÀÖ´Â Smart Client ¸¦ °³¹ßÇØ º¸¾Ò´Ù. ½ºÅ©¸³Æ® »ó¿¡¼­ Smart Client ÀÇ ¼Ó¼º, ¸Þ¼­µå, À̺¥Æ®¸¦ ´Ù·ê ¼ö ÀÖ´Â ¹æ¹ýÀ» ¼Ò°³ÇßÀ¸¸ç, ±×¿¡ µû¸¥ º¸¾È °ü·ÃµÈ ¼³Á¤À» ¾Ë¾Æº¸¾Ò´Ù. ¼ø¼­´ë·Î, ÀÌÁ¦ ¿ì¸®´Â Smart Client ·Î Internet Explroer ¿Í ¿¬µ¿ÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æ³»¾ß ÇÑ´Ù. .NET Framework Àº ÀÏÁ¾¿¡ "ÇÁ·Î±×·¡¹Ö ¿î¿µÈ¯°æ" ¿¡ Áö³ªÁö ¾Ê±â ¶§¹®¿¡ IE ¿ÍÀÇ ¿¬µ¿ÀÌ ±×´ÙÁö ¸Å²ô·´°Ô ÀÌ·ç¾îÁöÁö´Â ¾Ê´Â´Ù. ¾Æ¸¶µµ ±× ºÎºÐÀº ´å³Ý¿¡¼­ÀÇ º¯È­¸¸À¸·Î´Â ºÎÁ·Çϰí IE ÀÚüµµ º¯È­µÇ¾î¾ß °¡´ÉÇÒÅÙµ¥, ±× ºÎºÐ¿¡ ´ëÇØ¼­´Â Â÷±â Internet Explorer ¹öÀü¿¡¼­³ª ±â´ëÇØ º¼ ¼ö ¹Û¿¡ ¾ø´Ù. ¾î·µç, ¿ì¸®´Â ÇöÀçÀÇ IE ȯ°æ¿¡¼­ ±¸ÇöÀ» ÇØ¾ß¸¸ ÇÑ´Ù. ±×·¯´Ù º¸´Ï, À̹ø ¿¬Àç¿¡¼­µµ ¿ª½Ã "COM" ¿¡ ´ëÇÑ Áö½ÄÀ» ±âº»ÀüÁ¦·Î ÇÏ°Ô µÉÅÙµ¥, ±×·¸´Ù°í ÇØ¼­ Äڵ尡 VC++ ·Î µÈ °ÍÀº ¾Æ´Ï´Ï, ´å³Ý ¾ð¾î¸¸À» ¾Æ½Ã´Â ºÐµéµµ ºÁµÎ½Ã¸é unmanaged ȯ°æ°úÀÇ interop À» ¾î¶»°Ô ÇÒ ¼ö ÀÖ´Â Áö¿¡ ´ëÇÑ ¸¹Àº Áö½ÄÀ» ¾ò°Ô µÉ °ÍÀÌ´Ù.

¾ÆÁ÷, °ø½ÄÀûÀ¸·Î MS ¿¡ ÀÇÇØ¼­ Á¦°øµÇ´Â IE ¿ÍÀÇ ¿¬µ¿¿¡ ´ëÇÑ ¿¹Á¦ ÄÚµå´Â ³ª¿Í ÀÖÁö ¾ÊÀº »óÅÂÀ̱⠶§¹®¿¡, ¿©±â¼­ º¸¿©ÁØ Äڵ尡 "Ç¥ÁØ" ÀûÀÎ Á¢±Ù¹æ½ÄÀ̶ó°í ¸»ÇÒ ¼ö´Â ¾ø´Ù. ´ÜÁö, ÇÊÀÚ°¡ ½ÃÇàÂø¿À·Î ¾Ë¾Æ³½ °ÍµéÀ̱⠶§¹®¿¡ À̿ܿ¡µµ ¾ó¸¶µçÁö ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ±¸Çö°¡´ÉÇÒ ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. °¢ÀÚÀÇ °³¹ß °æÇ踸ŭ ¿©ÀüÈ÷ ´Ù¸¥ ½ÄÀ¸·Î "IE ¿ÍÀÇ ¿¬µ¿" À» À̲ø¾î ³¾ ¼ö ÀÖÀ¸¸ç ¿ÀÈ÷·Á ´õ¿í ´õ ÁÁÀº ¹æ¹ýµéÀÌ ¿©·¯ºÐ ¸Ó¸®¼Ó¿¡ ÀÖÀ» ¼öµµ ÀÖÀ¸´Ï, ÀÌ ±â»ç¸¦ º¸¸é¼­ ±× °¡´É¼ºÀ» Á¦ÇÑÇÏÁö ¸»°í ÀÚ½ÅÀÌ »ý°¢ÇÏ´Â IE ¿ÍÀÇ ¿¬µ¿ ±â¹ýµµ ±¸ÇöÇØ º¸±â ¹Ù¶ó¸ç ¶ÇÇÑ ±× ¹æ¹ýÀ» ³Î¸® ¾Ë·ÁÁֱ⠹ٶõ´Ù. À̹øÈ£¿¡¼­´Â ´ÙÀ½ÀÇ ³»¿ëÀ» ÁÖÁ¦·Î À̾߱⸦ ÁøÇàÇÒ °ÍÀÌ´Ù.

1. ½ºÅ©¸³Æ®¿ÍÀÇ ¿¬µ¿
2. IWebBrowser2 ÀÎÅÍÆäÀ̽º ¾ò±â
3. DWebBrowserEvents2 À̺¥Æ® ¿¬°á
4. Smart Client ¿Í IE ÀÇ ¼¼¼Ç °øÀ¯

Âü°í·Î, 1ȸ ±â»ç¸¦ ÀÐÁö ¾ÊÀº µ¶ÀÚ´Â ¹Ýµå½Ã Àо°í À̹øÈ£ ±â»ç¸¦ µû¶óÇØ º¼ °ÍÀ» ±ÇÇÑ´Ù. ¿Ö³ÄÇϸé, À̹ø È£ ±â»ç¿¡¼­ÀÇ ½Ç½ÀÀº 1ȸ¿¡¼­ Çß´ø ¼³Á¤»çÇ×À» ±×´ë·Î À̾î¹Þ¾Æ¼­ ÇÒ °ÍÀ̱⠶§¹®¿¡, ±×·¯ÇÑ °í·Á¸¦ ÇÏÁö ¾ÊÀº »ç¿ëÀÚ¶ó¸é À̹øÈ£¿¡¼­ °³¹ßÇÏ´Â Smart Client ÀÇ µ¿ÀÛÀÌ ¾ÈµÉ ¼ö µµ ÀÖÀ½À» °¨¾ÈÇϱ⠹ٶõ´Ù.


1. ½ºÅ©¸³Æ®¿ÍÀÇ ¿¬µ¿

ActiveX ¸¦ Á¦ÀÛÇϸ鼭, HTML ¿¡ Æ÷ÇÔµÈ ½ºÅ©¸³Æ® ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ±â´ÉÀ» ¸¸µé¾î º» ÀûÀÌ ÀÖÀ» °ÍÀÌ´Ù. À̰ÍÀ» Smart Client ·Î ±¸ÇöÇØ º¸ÀÚ. COM À» Àß ¾Æ½Ã´Â ºÐÀ̶ó¸é ±×´ÙÁö ¾î·ÆÁö ¾ÊÀº ÀÛ¾÷À̰ÚÁö¸¸, ±×·¸Áö ¾ÊÀº ºÐµéÀº °¨ÀÌ Àß ÀâÈ÷Áö ¾ÊÀ» °ÍÀÌ´Ù. ¿¹Á¦¸¦ À§ÇÑ Smart Client ´Â Áö³­ È£¿¡ ÀÛ¾÷Çß´ø TreeControl À» È®ÀåÇØ ³ª°¡´Â ¹æ½ÄÀ¸·Î ÇϰڴÙ. Smart Client ¿¡¼­ HTML ³»ÀÇ Script ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀº ¾î¶² Àǹ̿¡¼­ "À̺¥Æ®" ¸¦ ¹ß»ý½ÃŰ´Â °Í°ú µ¿ÀÏÇÑ ±â´ÉÀ» ÇÑ´Ù. »ç½Ç, À̺¥Æ®¸¦ ±¸ÇöÇϱâ À§Çؼ­´Â À̺¥Æ® ¼Ò½º¸¦ ±¸ÇöÇØ¾ß ÇÏ´Â µîÀÇ ´Ù¼Ò º¹ÀâÇÑ ºÎ°¡ Äڵ尡 ÇÊ¿äÇÏÁö¸¸ ½ºÅ©¸³Æ® ÇÔ¼ö¸¦ Á÷Á¢ È£ÃâÇÏ´Â °ÍÀº ±×º¸´Ù Á»´õ °£´ÜÇÑ ÄÚµå·Î ±¸ÇöÀ» ÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦·Î, ÇÊÀÚÀÇ °æ¿ì¿¡´Â À̺¥Æ®¸¦ ±¸ÇöÇÏ´Â °Íº¸´Ù Script ÇÔ¼ö¸¦ Á÷Á¢ È£ÃâÇÏ´Â °ÍÀ» ´õ¿í ¼±È£Çϱ⵵ ÇÑ´Ù. ¿ì¼±, ÄÚµù¿¡ ¾Õ¼­ ÀÌ·ÐÀûÀÎ »çÇ׺ÎÅÍ »ìÆìº¸ÀÚ.

IE ´Â HTML ³»ºÎÀÇ Å±׻Ӹ¸ ¾Æ´Ï¶ó, JScript ÇÔ¼ö±îÁöµµ IDispatch ÀÎÅÍÆäÀ̽º·Î ´Ù·ê ¼ö ÀÖ°Ô Çϰí ÀÖ´Ù. ÀÌÇØ¸¦ µ½±â À§ÇØ [ÄÚµå 1] ÀÇ JScript ÇÔ¼ö¸¦ º¸ÀÚ. ¿©±â¼­ test_func ÇÔ¼ö ÀÚü°¡ IDispatch ÀÎÅÍÆäÀ̽ºÀÎ °ÍÀÌ´Ù.

[ÄÚµå 1]

function test_func()
{
    alert( ¡®ÀÏ¹Ý ÇÔ¼öÀÔ´Ï´Ù.¡¯ );
}

Á»´õ Á¤È®È÷ »ìÆìº¸¸é, test_func ÇÔ¼ö´Â IDispatchEx ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϰí ÀÖ´Ù. IDispatchEx ¿¡ ´ëÇØ¼­ ´Ù¼Ò ³¸¼³¾î ÇÏ½Ç ºÐÀÌ °è½Ç ÅÙµ¥, ¼³·É ±×·²Áö¶óµµ ´ë°³ÀÇ °æ¿ì ¸ð¸£´Â »óÅ·Π³Ê¹«³ª ÀϹÝÀûÀ¸·Î »ç¿ëÇÑ °ÍÀÌ ¹Ù·Î IDispatchEx ÀÎÅÍÆäÀ̽ºÀÌ´Ù. À̰ÍÀº ±âÁ¸ IDispatch ±¸ÇöÀ» Æ÷ÇÔÇϸ鼭 ¸â¹ö¿¡ ´ëÇÑ µ¿Àû Ãß°¡/»èÁ¦¸¦ Áö¿øÇϰí ÀÖ´Ù. IDispatch ÀÇ µ¿ÀÛ¿ø¸® ÀÚü°¡ IDispatchEx ·ÎÀÇ ±â´ÉÈ®ÀåÀ» À§ÇÑ ¹è·Á°¡ µÇ¾î ÀÖ´Ù°íµµ º¼ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾îº¸ÀÚ¸é, IDispatch ¸¦ ±¸ÇöÇÑ COM °³Ã¼ÀÇ "TestFunc" À̶ó´Â ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù°í °¡Á¤ÇÏÀÚ. ±×·³, Script ¿¡¼­ TestFunc ¸¦ obj.TestFunc() À̶ó°í È£ÃâÇÏ°Ô µÇ°í, ÀÌ´Â Active Scripting Engine ³»ºÎ¿¡¼­ obj °¡ ±¸ÇöÇÑ IDispatch °³Ã¼ÀÇ GetIDsOfNames ¸Þ¼­µå¸¦ È£ÃâÇØ¼­ "TestFunc" À̸§¿¡ ÇØ´çÇÏ´Â DISPID ¸¦ ¹Ýȯ¹Þ°Ô µÇ°í, ±× DISPID ¸¦ ÀÎÀÚ·Î ÇØ¼­ IDispatch::Invoke ¸Þ¼­µå¸¦ È£ÃâÇØÁÖ´Â °ÍÀÌ´Ù. Áï, IDispatch::GetIDsOfNames ¿¡ ÀÇÇÑ À̸§°ú DISPID ½ÖÀ¸·Î ¸Þ¼­µå È£ÃâÀÌ ÀÌ·ç¾îÁö¹Ç·Î, ¸â¹ö¸¦ Ãß°¡Çϱâ À§Çؼ­ ´ÜÁö ±× ¸ÅÇÎ Å×ÀÌºí ±¸Á¶¿¡ ¶Ç ´Ù¸¥ À̸§°ú DISPID ¸¦ Ãß°¡ÇØ ÁÖ°í, ±× DISPID ¿Í È£ÃâµÉ ¸Þ¼­µå ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ °ü¸®Çϱ⸸ ÇÏ¸é µÇ´Â °ÍÀÌ´Ù. ¿©·¯ºÐÀÌ ÀÌ·¯ÇÑ IDispatchEx ¸¦ ¾ðÁ¦ »ç¿ëÇß´Â Áö¸¦ Àá±ñ »ìÆìº¸ÀÚ.

[ÄÚµå 2]

<script language=JScript>
    function window.onload()
    {
        _btn_Test.newField = "»õ·Î¿î ¸â¹öº¯¼ö Ãß°¡";
        _btn_Test.newFunc = newAddedFunc;

        alert( _btn_Text.newField );
        _btn_Text.newFunc( "»õ·Î¿î ¸â¹öÇÔ¼ö Ãß°¡" );
    }

    function newAddedFunc( outputText )
    {
        alert( outputText );
    }
</script>
<body>
    <input type=button id="_btn_Test" value="¹öưÀ» ´©¸£¼¼¿ä">
</body>

[ÄÚµå 2] ¸¦ º¸½Ã¸é, "¾î! À̰Џ¹ÀÌ º¸´ø °Å³×" ¶ó°í ÇÏ´Â µ¶ÀÚ°¡ ÀÖÀ» °Í °°´Ù. ¾Æ½Ã´Â °Íó·³, ¿ø·¡ÀÇ <INPUT /> ¿ä¼Ò¿¡´Â newField ³ª newFunc À̶ó´Â ¸â¹ö´Â Á¸ÀçÇÏÁö ¾Ê´Â´Ù. ÇÏÁö¸¸, INPUT ¿ä¼Ò°¡ IDispatchEx ¸¦ ±¸ÇöÇϰí Àֱ⠶§¹®¿¡ À§¿Í °°ÀÌ ¸â¹ö º¯¼ö¿Í ¸â¹ö ¸Þ¼­µå¸¦ ½ÇÇà½Ã¿¡ µ¿ÀûÀ¸·Î Ãß°¡¸¦ ÇÏ°Ô µÈ °ÍÀÌ´Ù. [ÄÚµå 2] ´Â COM °³Ã¼¿¡ ´ëÇØ ÀüÇô ¸ð¸£´Â À¥ ÇÁ·Î±×·¡¸Óµéµµ ÀÚÁÖ »ç¿ëÇØ º¸¾ÒÀ» °ÍÀÌ´Ù. ±×·¸°Ô ¿ì¸° ÀÌ¹Ì ¾Ï¾Ï¸®¿¡ IDispatchEx¿Í ÃæºÐÈ÷ Ä£ÇØÁ® ÀÖ¾ú´ø °ÍÀÌ´Ù. HTML ¿ä¼Ò¿¡¼­´Â À§¿Í °°Àº Äڵ带 ¸¹ÀÌ »ç¿ëÇØ ºÃÀ» ÅÙµ¥, Á¤ÀÛ Script ÇÔ¼ö±îÁöµµ IDispatchEx ¶ó´Â °ÍÀ» ¾Æ´Â °³¹ßÀÚµéÀº ¸¹Áö ¾Ê´Ù. À§ÀÇ ¿ø¸®¸¦ ¾Ë¾ÒÀ¸´Ï, Script ÇÔ¼öµµ IDispatchEx ¸¦ ±¸ÇöÇß´Ù´Â °ÍÀ» Á÷Á¢ ¿¹¸¦ µé¾î Áõ¸íÇØ º¸ÀÚ.

[ÄÚµå 3]

function window.onload()
{
    testFunc.newField = "»õ·Î¿î ¸â¹ö º¯¼ö Ãß°¡";
    testFunc.newFunc = newAddedFunc;
    testFunc();
}

function testFunc()
{
    alert( testFunc.newField );
    testFunc.newFunc( "»õ·Î¿î ¸â¹ö ÇÔ¼ö Ãß°¡" );
}

function newAddedFunc( outputText )
{
    alert( outputText );
}

[ÄÚµå 2] ¿¡¼­ ¼³¸íÇÑ IDispatchEx ¸¦ ÀÌÇØÇÏ°í ½ºÅ©¸³Æ® ÇÔ¼ö°¡ ±× IDispatchEx ·Î ±¸ÇöµÇ¾ú´Ù´Â °ÍÀ» ¾È´Ù¸é [ÄÚµå 3] ¿¹Á¦°¡ ±×¸® ³¸¼³Áö ¾ÊÀ» °ÍÀÌ´Ù. º¸´Â ¹Ù¿Í °°ÀÌ, ½ºÅ©¸³Æ® ÇÔ¼öÀÎ testFunc ¿ª½Ã HTML ¿ä¼Ò¿Í ¶È°°ÀÌ µ¿ÀûÀÎ ¸â¹ö Ãß°¡°¡ °¡´ÉÇÏ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.

À̾߱âÀÇ ÁÖÁ¦¸¦ ´Ù½Ã Smart Client ·Î µ¹·Á º¸ÀÚ. °á±¹, Smart Client ¿¡¼­ ½ºÅ©¸³Æ® ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀº IDispatch ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍÀÇ Invoke ¸¦ È£ÃâÇÏ´Â °Í°ú ´Ù¸¦ °ÍÀÌ ¾ø´Ù. ¿¹¸¦ À§Çؼ­ ÀÌÀü¿¡ Á¦ÀÛÇØ µÎ¾ú´ø TreeControl ¿¡ ½ºÅ©¸³Æ® ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Â Äڵ带 Ãß°¡ÇØ º¸ÀÚ. ¿ì¼±, È£ÃâÇÒ ½ºÅ©¸³Æ® ÇÔ¼öÀÇ IDispatch ÀÎÅÍÆäÀ̽º¸¦ º¸°üÇÒ ¼Ó¼ºÀÌ ÇÊ¿äÇÏ´Ù. TreeEvent.cs ÆÄÀÏÀÇ ITreeControlCOMIncoming ÀÎÅÍÆäÀ̽º¿¡ ´ÙÀ½°ú °°Àº ¼Ó¼ºÀ» Ãß°¡ÇÑ´Ù.

object _NodeClicked { set; get; }

TreeControls.cs ÆÄÀÏ¿¡¼­´Â À§ÀÇ ÀÎÅÍÆäÀ̽º¿¡ ±¸ÇöµÈ ÇÁ·ÎÆÛƼ¸¦ ±¸ÇöÇØ ÁÖ¾î¾ß ÇÑ´Ù.

[ÄÚµå 4]

object _NodeClicked = null;
public object _NodeClicked // °ø¿ë ÇÁ·ÎÆÛƼ·Î Á¤ÀÇ
{
    get { return _nodeClicked; }
    set { _nodeClicked = value;
}

// ±âÁ¸¿¡ Á¤ÀÇµÈ TreeView::AfterSelect À̺¥Æ® Çڵ鷯¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤.
private void _treeView_AfterSelect( ... )
{
    if ( _nodeClicked != null )
    {
        // IDispatch::Invoke ¸Þ¼­µå¸¦ È£ÃâÇÏ´Â °Í°ú µ¿ÀÏÇÑ È£Ãâ ¿ªÇÒ
        Type type = _nodeClicked.GetType();
        type.InvokeMember( "", BindingFlags.InvokeMethod, null, _nodeClicked, null );
    }
}

IDispatch::Invoke ¸Þ¼­µå¸¦ Á÷Á¢ È£ÃâÇØ ÁÖ´ø °Í°ú ´Þ¸® Type Ŭ·¡½ºÀÇ InvokeMember ¸Þ¼­µå¸¦ È£ÃâÇÑ °Í¸¸ Á¦¿ÜÇÑ´Ù¸é VC++ ·Î µÈ ÄÚµå¿Í ºñ±³Çؼ­ ÆÐÅÏ ÀÚü´Â Å©°Ô º¯ÇÑ °ÍÀÌ ¾ø´Ù. Smart Client Ãø¿¡¼­´Â ³»ºÎÀûÀ¸·Î [ÄÚµå 4] ¿Í °°ÀÌ ±¸ÇöÇØÁÖ¸é µÈ´Ù. À̾ [ÄÚµå 5] ¿¡¼­ º¸´Â °Íó·³ HTML ½ºÅ©¸³Æ®¿¡¼­ È£ÃâµÉ ½ºÅ©¸³Æ® ÇÔ¼ö¸¦ ´ëÀÔÇØ ÁÖ°í, ÇØ´ç ½ºÅ©¸³Æ® ÇÔ¼ö¾È¿¡ Äڵ带 ±¸ÇöÇØ ÁÖ¸é µÈ´Ù.

[ÄÚµå 5]

Form1._Control1._NodeClicked = treeControl_nodeClicked;
function treeControl_nodeClicked()
{
    // Æ®¸®ÄÁÆ®·Ñ¿¡ ¼±ÅÃµÈ ³ëµå¸¦ °¡Á®¿Í ó¸®
}

ÀÌÁ¦, ÄÄÆÄÀÏ Çϰí À¥ºê¶ó¿ìÀú¿¡¼­ Å×½ºÆ®¸¦ ÇØº¸ÀÚ. Æ®¸® ÄÁÆ®·Ñ¿¡¼­ ³ëµå¸¦ Ŭ¸¯Çϸé, [ÄÚµå 5] ¿¡¼­ ±¸ÇöÇÑ treeControl_nodeClicked ½ºÅ©¸³Æ® ÇÔ¼ö°¡ ½ÇÇàµÇ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. °á±¹, ÀÌÀü¿¡ ¸»Çß´ø °Íó·³ °á°úÀûÀ¸·Î´Â À̺¥Æ® ÇÔ¼ö¿Í ¿ªÇÒÀÌ µ¿ÀÏÇÒ »Ó¸¸ ¾Æ´Ï¶ó, Áö³­ È£ÀÇ À̺¥Æ® ±¸ÇöÀ» À§ÇØ ¼Ò¿äµÇ¾ú´ø ÄÚµå¿Í ºñ±³ÇØ º¼ ¶§ ±¸Çöµµ °£´ÜÇØÁ³´Ù. ( Âü°í·Î, ¿©ÀüÈ÷ º¸¾È ¼³Á¤Àº "Unmanaged Äڵ带 È£Ãâ°¡´É" Çϵµ·Ï ¼³Á¤ÇØ µÎ¾î¾ß ÇÑ´Ù. )

Âü°í·Î, ÇÊÀÚ°¡ °ÞÀº Àç¹ÌÀÖ´Â ¿À·ù¸¦ Çϳª ¼³¸íÇØ º¸°íÀÚ ÇÑ´Ù. HTML ¿¡ ±¸ÇöµÈ ½ºÅ©¸³Æ® ÇÔ¼ö¸¦ CLR ¿¡¼­´Â InvokeMember ·Î È£ÃâÇÏ°Ô µÇ´Â µ¥, ¸¸¾à ±× ½ºÅ©¸³Æ® ÇÔ¼ö ³»ºÎ¿¡¼­ ¿À·ù°¡ ¹ß»ýÇϸé, ÈçÈ÷ º¸¾Æ¿Â Script ¿À·ù ¸Þ½ÃÁö âÀÌ ¶ßÁö ¾Ê°í, .NET Framework ÀÇ ¿¹¿Ü ¸Þ½ÃÁö âÀÌ ¶ß°Ô µÈ´Ù. ¿¹¿Ü ³»¿ëÀº System.Reflection.TargetInvocationException ÀÌ´Ï, Ȥ½Ã³ª ÀÌ ¿¹¿Ü°¡ ¹ß»ýÇß´Ù°í ÇØ¼­, CLR Äڵ带 ÀǽÉÇÏÁö ¸»°í ½ºÅ©¸³Æ® ÇÔ¼ö¸¦ »ìÆìº¸±â ¹Ù¶õ´Ù.


2. IWebBrowser2 ÀÎÅÍÆäÀ̽º ¾ò±â

À̹ø ¿¬ÀçÀÇ ÇÏÀ̶óÀÌÆ®°¡ ¾Æ´Ò±î »ý°¢µÈ´Ù. ÇÊÀÚ°¡ óÀ½ Smart Client ¸¦ Á¦ÀÛÇÏ°í¼­ °¡Àå ¸ÕÀú ÇØ°áÇϰíÀÚ Çß´ø °ÍÀÌ ¹Ù·Î ÀÚ½ÅÀ» È£½ºÆÃÇϰí ÀÖ´Â IWebBrowser2 ÀÎÅÍÆäÀ̽º¸¦ ¾ò¾î³»´Â °ÍÀÌ´Ù. ¾Æ¸¶µµ ÀÌ¹Ì °³¹ßµÈ ±âÁ¸ ActiveX Áß¿¡¼­µµ ¸¹Àº Ȱ¿ëÀ» Çϰí ÀÖ´Â ºÎºÐÀÌ ¾Æ´Ò±î ½Í´Ù. ActiveX ÄÁÆ®·Ñ·Î ±¸ÇöÇÒ ¶§ÀÇ ¾ê±â¸¦ ÇØº¸¸é, WebBrowser °³Ã¼´Â ÀÚ½ÅÀÌ È£½ºÆÃÇϰí ÀÖ´Â ¸ðµç ÄÁÆ®·Ñ¿¡ ´ëÇØ¼­, CreateInstance ·Î °³Ã¼¸¦ »ý¼ºÇÑ ÈÄ, IUnknown::QueryInterface ¸¦ ÅëÇØ IObjectWithSite ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ ¾ò¾î³½´Ù. ¸¸¾à ±× ÀÎÅÍÆäÀ̽º°¡ ±¸ÇöµÇ¾îÁ® ÀÖ´Ù¸é °³Ã¼ÀÇ Site IUnknown ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î ÇØ¼­ IObjectWithSite::SetSite ¸Þ¼­µå¸¦ È£ÃâÇØ ÁÖ°í, °á°úÀûÀ¸·Î ActiveX ÄÁÆ®·ÑÀº ³Ñ°Ü¹ÞÀº Site ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ ÅëÇØ¼­ ÀÚ½ÅÀ» È£½ºÆÃÇϰí ÀÖ´Â IWebBrowser2 ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ ¾ò¾î³¾ ¼ö ÀÖ°Ô µÇ´Â °ÍÀÌ´Ù.

ActiveX ¿¡¼­ÀÇ ±¸Çöó·³ óÀ½¿¡ Smart Client ¿ª½Ã IObjectWithSite ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇØ¼­ ´Ü¼øÈ÷ Ŭ·¡½º¿¡¼­ »ó¼ÓÀ» ¹Þ¾ÆÁÖ¸é µÇÁö ¾ÊÀ»±î ½Í¾ú´Â µ¥, ¼º°øÇÏÁö ¸øÇß´Ù. ¾ÆÁ÷ ÇÊÀÚ°¡ RCW / CCW ÀÇ ¿î¿µ¿¡ ´ëÇÑ Áö½ÄÀÌ ¹ÌÈíÇØ¼­ ¹àÈ÷Áö ¸øÇßÀ½À» ¹Ì¸® ¸»ÇصдÙ. ÀÌ °­ÁÂÀÇ [¼Ò½º ´Ù¿î·Îµå]¿¡¼­ Á¦°øÇÏ´Â ¼Ò½º¿¡¼­´Â IObjectWithSite ÀÎÅÍÆäÀ̽º Äڵ带 ½Ç¾îµÎ¾úÀ¸´Ï, µ¶Àڵ鵵 µµÀüÇØ º¸±â ¹Ù¶õ´Ù.

°¡Àå Ç¥ÁØÀûÀÏ ¼ö ÀÖ´Â IObjectWitheSite::SetSite ÀÎÅÍÆäÀ̽º¸¦ ÅëÇÑ ¹æ¹ýÀÌ ¹ÌÈíÇÑ ½Ç·ÂÀ¸·Î ÀÎÇØ ±¸ÇöÀ» ÇÒ ¼ö ¾øÁö¸¸, ÇÁ·Î±×·¡¹Ö ¼¼°è¿¡¼­´Â ¾î¶² ¹®Á¦ ÇØ°áÀ» À§ÇÑ ¹æ¹ýÀÌ ¿ÀÁ÷ Çϳª¸¸ ÀÖ´Â °ÍÀÌ ¾Æ´ÔÀ» µ¶Àڵ鵵 Àß ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ±×·¸´Ù¸é, °ú¿¬ ¹¹°¡ ³²¾Æ Àִ°¡? ÇÒ ¼ö ¾ø´Ù. ÀÌ·¸°Ô µÇ¸é, ¿ª½Ã ¿¹ÀüÀÇ unmanaged ȯ°æ¿¡¼­ Á¦°øµÇ¾ú´ø ±æÀ» ã¾Æ¾ß ÇÑ´Ù. ³ª¸§´ë·Î ¿©·¯ °¡Áö ¹æ¹ýÀÌ ÀÖÀ» ¼ö ÀÖ°ÚÁö¸¸, ÇÊÀÚ°¡ ¹ß°ßÇÑ ¹æ¹ýÀº Microsoft Active Accessibility SDK ( ÀÌÇÏ, MSAA ·Î Ç¥±â ) ¿¡¼­ Á¦°øÇØÁÖ´Â ObjectFromLresult ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ ¹æ¹ýÀÌ´Ù. À̰ÍÀº ÇØ´ç ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ °íÀ¯ÇÏ°Ô Á¤ÀÇÇÑ À©µµ¿ì ¸Þ½ÃÁö¸¦ ÅëÇØ¼­ ÇÁ·Î¼¼½º°£¿¡µµ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¿ÏÀüÈ÷ ¸¶¼£¸µµÈ ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ ¾òÀ» ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇØ ÁØ´Ù. ¹°·Ð, ±×·¸´Ù°í ÇØ¼­ ¸ðµç ActiveX ÄÁÆ®·ÑÀÌ ±âº»ÀûÀ¸·Î Á¦°øÇÏ´Â °ÍÀº ¾Æ´Ï°í, ÀÀ¿ë ÇÁ·Î±×·¥ °³¹ßÀÚ°¡ ¾Ë¾Æ¼­ ³»ºÎ¿¡ ±¸ÇöÀ» ÇØÁÖ¾î¾ß ÇÑ´Ù. ´ÙÇàÈ÷µµ, À¥ ºê¶ó¿ìÀú ÄÁÆ®·ÑÀÇ °æ¿ì ÀÌ ¹æ¹ýÀ» Á¦°øÇϰí ÀÖ´Â µ¥, ¾Æ¸¶µµ ÀÌ ±â´ÉÀ» ³Ö¾îµÐ MS ÀÇ °³¹ßÀÚ Á¶Â÷µµ ´å³Ý ȯ°æÀÇ Smart Client ¿¡¼­ À¯¿ëÇÏ°Ô ¾²ÀÏ °ÍÀ̶ó°í´Â ¿¹ÃøÇÏÁö ¸øÇßÀ» °Í °°´Ù.

Á¢±Ù ¹æ¹ýÀº Á¤ÇØÁ³À¸´Ï Çϳª¾¿ ±¸ÇöÀ» ÇØº¸ÀÚ. ¿ì¼± ÇØ¾ß ÇÒ °ÍÀº IWebBrowser2 °³Ã¼ÀÇ À©µµ¿ì ÇÚµéÀ» ¾Ë¾Æ³»¾ß ÇÑ´Ù. ÀÌ´Â Smart Client °¡ À©µµ¿ìÀÌ°í ±×ÀÇ ºÎ¸ð À©µµ¿ì°¡ WebBrowser ¶ó´Â °ÍÀ¸·Î ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. <È­¸é 1> Àº Spy ++ À¯Æ¿¸®Æ¼¸¦ ÀÌ¿ëÇØ¼­ À¥ºê¶ó¿ìÀú ¾È¿¡ Ȱ¼ºÈ­µÈ Smart Client ÀÇ À§Ä¡¸¦ È®ÀÎÇØ º» °ÍÀÌ´Ù.

[È­¸é 1: IE ¿Í TreeControl ÀÇ ºÎ¸ð/ÀÚ½Ä °ü°è]

Áö³­ ȸ¿¡ ¸¸µé¾î µÎ¾ú´ø Smart Client ÀÎ TreeControl ÀÇ °æ¿ì, À©µµ¿ì Æû À§¿¡ TreeView ÄÁÆ®·ÑÀ» ¾ñ¾î ³õÀº ÇüÅÂÀÌ´Ù. [È­¸é 1] À» º¸°Ô µÇ¸é, °­Á¶µÈ "WindowsForms10.Window8.app9" °¡ ¹Ù·Î À©µµ¿ì ÆûÀ̰í, ÇÏÀ§ÀÇ "WindowsForms10.SysTreeView32.app9" °¡ TreeView ÄÁÆ®·ÑÀÌ´Ù. ¿ì¸®°¡ ±¸ÇØ¾ß ÇÒ IWebBrowser2 ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ ´ã°í ÀÖ´Â À©µµ¿ì´Â Smart Client ÀÇ ºÎ¸ð À©µµ¿ìÀÎ "Internet Explorer_Server" À̱⠶§¹®¿¡, Win32 API ¿¡¼­ Á¦°øÇϰí ÀÖ´Â GetParent API ·Î ±¸ÇÒ ¼ö ÀÖ´Ù. ÀÏ´Ü HWND ¸¦ ±¸ÇÏ°í ³ª¸é ±× ÀÌÈÄÀÇ ±¸ÇöÀº Microsoft ¿¡¼­ Á¦°øÇØ ÁÖ´Â ¹®¼­´ë·Î ±¸ÇöÀ» ÇÏ¸é µÈ´Ù. ÇØ´ç ¹®¼­¿¡ ´ëÇØ¼­´Â ¿¬Àç ¸¶Áö¸·ÀÇ "Âü°í URL" ¿¡¼­ È®ÀÎÇÒ ¼ö ÀÖÀ¸´Ï ÂüÁ¶ÇϽðí, Smart Client ¿¡¼­ »ç¿ëÇϱâ À§ÇØ C# ¾ð¾î·Î Æ÷ÆÃµÈ ÄÚµå´Â [ÄÚµå 6] ¿¡ ½Ç¾î ³õ¾Ò´Ù. ÇѰ¡Áö ´õ ¾ð±ÞÇÏÀÚ¸é, Á¤»óÀûÀÎ ÄÄÆÄÀÏÀ» À§Çؼ­ PIA ( Primary Interop Assembly ) ¸ðµâ·Î Á¦°øÀÌ µÇ´Â "Microsoft.mshtml" À» ÂüÁ¶ Ãß°¡ÇØ¾ß ÇÑ´Ù. ÁÖÀÇÇØ¾ß ÇÒ °ÍÀº, ÀÌ ¸ðµâÀº ".NET Framework Àç¹èÆ÷¸ðµâ" ÀÌ ¼³Ä¡µÈ ÄÄÇ»ÅÍ¿¡´Â Æ÷ÇԵǾî ÀÖÁö ¾Ê°í, VS.NET À» ¼³Ä¡ÇÑ °æ¿ì¿¡¸¸ GAC ¿¡ µî·ÏµÈ´Ù´Â °ÍÀÌ´Ù. À̰ÍÀ¸·Î ÀÎÇØ ¹®Á¦°¡ ¹ß»ýÇÏ°Ô µÇ´Âµ¥, VS.NET 2003 IDE ¿¡¼­ ÂüÁ¶¸¦ Ãß°¡ÇÏ´Â °æ¿ì, ±âº»ÀûÀ¸·Î GAC ¿¡ µî·ÏµÈ ¸ðµâ¿¡ ´ëÇØ¼­ ·ÎÄú¹»ç°¡ "False" ¿©¼­ ÀÌ·¸°Ô µÇ¸é Ŭ¶óÀÌ¾ðÆ®¿¡¼­ Ȱ¼ºÈ­µÇ´Â Smart Client ÀÇ °æ¿ì ÇØ´ç DLL À» ãÀ» ¼ö ¾øÀ¸¹Ç·Î µ¿ÀÛ ÀÚü°¡ µÇÁö ¾Ê´Â´Ù. µû¶ó¼­, ¹Ýµå½Ã ÂüÁ¶·Î Ãß°¡ÇÑ ´ÙÀ½ ÇØ´ç ¸ðµâÀÇ ¼Ó¼ºÃ¢¿¡¼­ ·ÎÄà º¹»ç ¼Ó¼ºÀ» "True" ·Î ¹Ù²ã¾ß ÇÑ´Ù.

[ÄÚµå 6]

// ÀÚ½ÅÀÇ À©µµ¿ì ÇÚµéÀ» ±¸ÇÏ°í ºÎ¸ðÀÎ WebBrowser À©µµ¿ì ÇÚµéÀ» ±¸ÇÑ´Ù.
IntPtr pHandle = this.Handle;
pHandle = GetParent( pHandle );

// WebBrowser ÄÁÆ®·Ñ¿¡¼­ Á¤ÀÇµÈ Æ¯º°ÇÑ ¸Þ½ÃÁö¸¦ ¾ò¾î³½´Ù.
uint nMsg = RegisterWindowMessage( "WM_HTML_GETOBJECT" );

// ObjectFromLresult ÀÇ ÀÎÀÚ·Î Àü´ÞµÇ¾îÁ®¾ß ÇÒ lRes °ªÀ» ±¸Çϰí.
uint lRes = 0;
SendMessageTimeout( pHandle, nMsg, 0, 0, 2, 1000, ref lRes ); // SMTO_ABORTIFHUNG : 2

// MsHTML.h / ComDef.h ¿¡¼­ IHTMLDocument2 ÀÇ GUID ¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
Guid htmlDocumentGuid = new Guid( "332C4425-26CB-11D0-B483-00C04FD90119" );
// MSAA SDK ¿¡¼­ Á¦°øÇÏ´Â ÇÔ¼ö¸¦ ÅëÇØ¼­
// ¸¶¼£¸µµÈ IHTMLDocument2 ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ ±¸ÇÑ´Ù.
ObjectFromLresult( lRes, ref htmlDocumentGuid, 0, out _htmlDocument);

Type t = _htmlDocument.GetType();
string title = (string)t.InvokeMember( "title", BindingFlags.GetProperty, null, _htmlDocument, null );

// mshtml.HTMLDocument docObj = (mshtml.HTMLDocument)obj;
// string title2 = docObj.title;

¾Æ½Ã°ÚÁö¸¸, À§ÀÇ Äڵ忡¼­ GetParent, RegisterWindowMessage, SendMessageTimeout, ObjectFromLresult ¸Þ¼­µå´Â Win32 API ·Î½á PInvoke ·Î È£ÃâµÈ´Ù. ( ÇØ´ç DllImport ¼±¾ð°ú °ü°èµÈ ¼Ò½º´Â [¼Ò½º ´Ù¿î·Îµå] ¿¡ ½Ç·Á ÀÖ´Ù. ) ÀÏ´ÜÀº À§ÀÇ °úÁ¤À» ÅëÇØ¼­, IHTMLDocument2 ÀÎÅÍÆäÀ̽º±îÁö ¾òÀ» ¼ö ÀÖ´Ù.

[ÄÚµå 6] À» ÀÚ¼¼È÷ º¸¸é, ¸Ç ¸¶Áö¸· ¶óÀο¡ ÁÖ¼® 󸮰¡ µÈ °Í¿¡ ´ëÇØ¼­ Àǹ®À» Á¦±âÇÒ °ÍÀÌ´Ù. ÁÖ¼® ó¸®µÈ ¶óÀÎÀÇ À§¿¡ º¸¸é IHTMLDocument2::title À» ±¸Çϱâ À§Çؼ­ º¹ÀâÇÏ°Ô Type.InvokeMember ¸¦ È£ÃâÇÑ °ÍÀ» º¼ ¼ö Àִµ¥, ±»ÀÌ ±×·¸°Ô ÇÑ °Í¿¡´Â "º¸¾È" °ú °ü°èµÈ ¼³Á¤»çÇ× ¶§¹®ÀÌ´Ù. ÀÌÂë¿¡¼­ °í¹éÇϴµ¥, ÇÊÀÚ ³ª¸§´ë·Î Smart Client ¸¦ °³¹ßÇϸ鼭 ÀÌÇØÇÒ ¼ö ¾ø´Â Çö»óÀ» ¸¹ÀÌ Á¢ÇØ º¸¾Ò´Ù. À§ÀÇ ÄÚµå ¿ª½Ã ÇÊÀÚ¿¡°Ô´Â ¾ÆÁ÷ ±×·± "ÀÌÇØÇÒ ¼ö ¾ø´Â Çö»ó" ÁßÀÇ Çϳª·Î ³²¾Æ ÀÖ´Ù. ÁÖ¼®Ã³¸®µÈ Äڵ忡¼­ º¸´Â °Íó·³, ¸¸¾à mshtml.HTMLDocument ·Î Çüº¯È¯À» ÇÏ°Ô µÇ¸é, Áö³­ È£¿¡ ¼³Á¤Çß´ø "IneternetSmartClient_Zone" ¿¡ "Full Trust" ¸¦ ÁÖ¾î¾ß ÇÑ´Ù. °¡´ÉÇÑ ÃÖ¼ÒÇÑÀÇ ±ÇÇѸ¸À» Smart Client ¿¡°Ô ÁÖ´Â °ÍÀÌ ¹Ù¶÷Á÷Çϱ⠶§¹®¿¡ ÇÊÀڷμ­´Â "Full Trust" ¸¦ »ç¿ëÇÏÁö ¾Ê´Â ´Ù¸¥ ¹æ¹ýÀ» ã¾Ò°í ±×°ÍÀÌ Type.InvokeMember ¿´´Ù. ¹°·Ð, ¿øÄ¢ÀûÀ¸·Î ÀÌÇØÇÏ·Á°í µç´Ù¸é, mshtml.HTMLDocument ¸¦ »ç¿ëÇÏ´Â °Í¿¡´Â Áö³­ È£¿¡ »ìÆìº» "Unmanaged Code È£Ãâ°¡´É" ±ÇÇѸ¸À¸·Îµµ ÃæºÐÇÏ´Ù°í º¼ ¼ö ÀÖ´Ù. ±×·±µ¥, ¿Ö "Full Trust" ¸¦ ÇÊ¿ä·Î ÇÏ°Ô µÇ¾ú´ÂÁö¿¡ °üÇØ¼­´Â ÇÊÀÚ Àڽŵµ ¾î¶»°Ô ¼³¸íÇÒ ±æÀÌ ¾ø´Ù. Full Trust ¸¦ Smart Client ¿¡°Ô Çã¿ëÇØ¼­ mshtml.HTMLDocument ¸¦ »ç¿ëÇÒ °ÍÀÎÁö, ¾Æ´Ï¸é Á¦ÇÑµÈ "SmartClientSet" À» Çã¿ëÇϰí ÇÁ·Î±×·¥À» ´Ù¼Ò º¹ÀâÇÏ°Ô ÇÒ °ÍÀÎÁö´Â µ¶ÀÚÀÇ ¼±Åÿ¡ ´Þ·Á ÀÖ´Ù. ¹°·Ð, ÇÊÀÚ´Â ÀÌ ¿¬Àç Àüü¿¡ °ÉÃļ­ SmartClientSet À» ¼±ÅÃÇÑ °ÍÀ» ±âº»ÀüÁ¦·Î Äڵ带 ±¸ÇöÇßÀ½À» ¾Ë¾ÆÁֱ⠹ٶõ´Ù.

À§ÀÇ °úÁ¤À» ÅëÇØ¼­ ÀÏ´Ü object Çü½ÄÀÇ IHTMLDocument2 ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇÏ°Ô µÇ¾ú°í, Untyped »óÅ¿¡¼­ ÇØ´ç °´Ã¼ÀÇ ¸Þ¼­µå/¼Ó¼ºÀ» È£ÃâÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æ º¸¾Ò´Ù. °æ¿ì¿¡ µû¶ó¼­ Smart Client Á¦ÀÛ¿¡ À¥ ºê¶ó¿ìÀú¿ÍÀÇ ¿¬µ¿À» °í·ÁÇØ º¼¶§, ÀÌ Á¤µµ ¼öÁØ¿¡¼­µµ ³¡³¾ ¼ö ÀÖ´Ù. »ç½Ç ActiveX ÄÁÆ®·ÑÀ» Á¦ÀÛÇÏ´ø ¶§¸¦ »ý°¢ÇØ º¸¸é, IWebBrowser2 ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇÏ·Á´Â ¸ñÀû¿¡´Â Å©°Ô 2°¡Áö¸¦ ¶° ¿Ã¸± ¼ö ÀÖÀ» °ÍÀÌ´Ù. ù¹øÂ°´Â IWebBrowser2::Document ¸¦ ÅëÇØ¼­ ÄÁÆ®·ÑÀ» È£½ºÆÃÇϰí ÀÖ´Â HTML ¹®¼­¸¦ Á¢±ÙÇϰíÀÚ ÇÏ´Â °æ¿ìÀ̰í, µÎ¹øÂ°´Â À¥ ºê¶ó¿ìÀúÀÇ À̺¥Æ®¸¦ ¹Þ°í ½ÍÀº °æ¿ìÀÌ´Ù. ´ë°³ÀÇ °æ¿ì, ù¹øÂ° ¸ñÀûÀ̶ó¸é ObjectFromLresult ÇÔ¼öÀÇ Æ¯ÀÌÇÑ ´É·Â ´öºÐ¿¡ ±»ÀÌ IWebBrowser2 ÀÎÅÍÆäÀ̽º±îÁö ±¸ÇÒ ÇÊ¿ä¾øÀÌ [ÄÚµå 6] ±îÁö¸¸ ±¸ÇöÇÏ¸é µÈ´Ù. ÇÏÁö¸¸, À¥ ºê¶ó¿ìÀúÀÇ À̺¥Æ®¸¦ ¹Þ°íÀÚ ÇÑ´Ù¸é °á±¹ IWebBrowser2 ÀÎÅÍÆäÀ̽º±îÁö ¾ò¾î¾ß °¡´ÉÇÏ´Ù.

À¥ ºê¶ó¿ìÀú·ÎºÎÅÍ À̺¥Æ®¸¦ ¹Þ´Â °ÍÀ» ¸ñÇ¥·Î, Èûµé°ÚÁö¸¸ ÇÑ´Ü°è ´õ ³ª¾Æ°¡¼­ IWebBrowser2 ÀÎÅÍÆäÀ̽º±îÁö ±¸Çغ¸ÀÚ. IE ¿¡¼­ÀÇ ActiveX ÄÁÆ®·ÑÀ» ¸¸µé¾î º¸½Å ºÐµéÀº IWebBrowser2::Document ¸¦ ÅëÇØ¼­ IHTMLDocument2 ÀÎÅÍÆäÀ̽º¸¦ ½±°Ô ¾ò¾ú´ø ±â¾ïÀÌ ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸, ±× ¿ªÀ¸·Î º¯È¯ÇÏ´Â °Í¿¡ ´ëÇØ¼­ ÇØº¸½Å ºÐµéÀº ¸¹Áö ¾ÊÀ» °Í °°´Ù. ÀÏ´Ü, ±× ¹æ¹ý¿¡ °üÇÑ C++ ·Î µÈ ¼Ò½º´Â ±â»çÀÇ ¸¶Áö¸·¿¡ Á¦½ÃÇÑ "Âü°í URL" ºÎºÐÀ» ÂüÁ¶ÇϽðí, ¿©±â¼­´Â C# ¹öÀüÀ¸·Î Æ÷ÆÃµÈ ÄÚµå·Î »ìÆìº¸ÀÚ. mshtml.HTMLDocument ¸¦ ´Ù·ç±â À§Çؼ­ Microsoft.mshtml ¸ðµâÀ» ÂüÁ¶ÇÑ °Í°ú´Â ´Þ¸®, ¾Æ·¡¿¡¼­ ¼³¸íÇÒ Å×Áö¸¸, IWebBrowser2 ÀÎÅÍÆäÀ̽º¸¦ ´Ù·ç±â À§ÇÑ ÂüÁ¶ ( ShDocVw.dll, "Microsoft Internet Controls" ) ¸¦ Ãß°¡ÇÒ ÇÊ¿ä´Â ¾ø´Ù.

[ÄÚµå 7]

// IHTMLDocument2 ·ÎºÎÅÍ IWebBrowser2 ÀÎÅÍÆäÀ̽º ¾ò±â

// managed °³Ã¼·ÎºÎÅÍ unmanaged IUnknown Æ÷ÀÎÅ͸¦ ¹Ýȯ
IntPtr docPtr = Marshal.GetIUnknownForObject( _htmlDocument );

// IOleCommandTarget GUID´Â DocObj.h / ComDef.h ¿¡¼­ ±¸ÇÔ
Guid ocmTargetGuid = new Guid( "B722BCCB-4E68-101B-A2BC-00AA00404770" );
IntPtr ocmPtr;
// IUnknown::QueryInterface ¸¦ Marshal Ŭ·¡½º¿¡ Á¤ÀÇµÈ QueryInterface ¸¦ ÀÌ¿ë
// IHTMLDocument2 ·ÎºÎÅÍ IOleCommandTarget ÀÎÅÍÆäÀ̽º¸¦ °¡Á®¿À±â
Marshal.QueryInterface( docPtr, ref ocmTargetGuid, out ocmPtr );
Marshal.Release( docPtr );

// IServiceProvider ÀÇ GUID ´Â ServProv.h ¿¡¼­ ±¸ÇÔ
Guid svpGuid = new Guid( "6d5140c1-7436-11ce-8034-00aa006009fa" );
IntPtr svpPtr;
// IOleCommandTarget À¸·ÎºÎÅÍ IServiceProvider ÀÎÅÍÆäÀ̽º¸¦ °¡Á®¿À±â
Marshal.QueryInterface( ocmPtr, ref svpGuid, out svpPtr );
Marshal.Release( ocmPtr );

// unmanaged IServiceProvider °³Ã¼¸¦ managed °³Ã¼·Î º¯È¯
SmartClient.IServiceProvider svpObject = (SmartClient.IServiceProvider)Marshal.GetObjectForIUnknown( svpPtr );

// SID_SWebBrowserApp ¿Í IID_IWebBrowser2 GUID ´Â ExDisp.h ¿¡¼­ ±¸ÇÔ
Guid sidWBA = new Guid( "0002DF05-0000-0000-C000-000000000046" );
Guid webBrowser2 = new Guid( "D30C1661-CDAF-11d0-8A3E-00C04FC9E26E" );
// IServiceProvider::QueryService ¸¦ ÅëÇØ¼­ IWebBrowser2 ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ ¹Ýȯ
object WBObject = svpObject.QueryService( ref sidWBA, ref webBrowser2 );
Marshal.Release( svpPtr );

// SHDocVw.WebBrowser ·Î Çüº¯È¯
// ÀÌÈÄ IWebBrowser2 °³Ã¼¿Í µ¿ÀÏÇÏ°Ô Ã³¸®.
_webBr = (IWebBrowser2)WBObject;

[ÄÚµå 7] À» º¸°í ÀÖÀ¸¸é, ¾Æ¹«·¡µµ unmanaged COM °³Ã¼µéÀ» C++ ·Î ´Ù·ç´ø °ÍÀ» managed ȯ°æÀÇ C# ¿¡¼­ ´Ù·ç´Â °ÍÀÌ ½±Áö¸¸Àº ¾Ê¾Æ º¸ÀδÙ. [ÄÚµå 7] ÀÇ ³»¿ë¿¡¼­ ÇÙ½É ÀÛ¾÷Àº System.Runtime.InteropServices.Marshal Ŭ·¡½º·Î ¾î¶»°Ô unmanaged ȯ°æ¿¡¼­ÀÇ COM ÀÛ¾÷À» ´ëüÇÏ´À³Ä ÇÏ´Â °ÍÀε¥, º¸½Ã´Â °Íó·³, C/C++ º¸´Ù ¾à°£ ºÎ°¡ÀûÀÎ Äڵ带 ÇÊ¿ä·Î Çϱä ÇØµµ, C# À¸·Îµµ µ¿ÀÏÇÏ°Ô Æ÷ÆÃÀ» ÇÒ ¼ö ÀÖ´Ù. COM °³Ã¼¿ÍÀÇ »óÈ£¿î¿ëÀ» °¡´ÉÄÉ ÇÏ´Â Marshal Ŭ·¡½º¿¡´Â [ÄÚµå 7] ¿¡¼­ º¸¿©ÁØ ¸Þ¼­µå À̿ܿ¡µµ unmanaged ¿Í managed »çÀÌÀÇ ´Ù¸® ¿ªÇÒÀ» ÇØÁÖ´Â static ÇÔ¼öµéÀÌ »ó´ç¼ö Æ÷ÇԵǾî ÀÖÀ¸´Ï, ½Ã°£ÀÌ ³¯¶§ Æ´Æ´ÀÌ »ìÆì º¸´Â °Íµµ ÁÁ°Ú´Ù.

¿Ø¸¸Å­ COM À» ÇϽŠºÐµéÀÇ °æ¿ì¿¡´Â [ÄÚµå 7] À» Çϳª¾¿ ¶â¾îº¸¸é ¸ð¸¦ ¸¸ÇÑ ºÎºÐÀº ¾øÀ» ÅÙµ¥, ±×·¡µµ IServiceProvider ¿¡ ´ëÇØ¼­´Â ¤°í ³Ñ¾î°¡¾ß °Ú´Ù. [ÄÚµå 6] ¿¡¼­ º» °Íó·³, IDispatch ¸¦ »ó¼Ó¹ÞÀº ÀÎÅÍÆäÀ̽ºÀÇ ¸Þ¼­µå¸¦ È£ÃâÇÏ·Á¸é Type.InvokeMember ¸¦ ÅëÇØ¼­ °¡´ÉÇÏ´Ù´Â °ÍÀ» ¾Ë¾Ò´Ù. ÇÏÁö¸¸, IUnknown À¸·ÎºÎÅÍ »ó¼Ó¹ÞÀº IServiceProvider °°Àº °æ¿ì¿¡´Â »çÁ¤ÀÌ Æ²·ÁÁø´Ù. Áï, DISPID °¡ ¾ø´Â °æ¿ì¿¡´Â Á÷Á¢ vtable ¿¡ ±â¹ÝÇÑ ¸Þ¼­µå È£ÃâÀ» ÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù. ´ÙÇàÈ÷µµ C# ÀÇ interface ±¸¹®À¸·Î [ÄÚµå 8] °ú °°ÀÌ C/C++ ¿¡¼­¿Í °°Àº interface ¸¦ ¸¸µé ¼ö ÀÖ°Ô ÇØÁÖ°í ÀÖ´Ù. ´õ±º´Ù³ª, IServiceProvider °°Àº °æ¿ì¿¡´Â ´Ü¼øÇÏ°Ô IUnknown ÀÎÅÍÆäÀ̽º¿¡¼­ ´Ü ÇϳªÀÇ QueryService ¸Þ¼­µå¸¸À» Ãß°¡ÇÑ ÀÎÅÍÆäÀ̽ºÀ̱⠶§¹®¿¡ ±×´ÙÁö ¾î·ÆÁö ¾Ê°Ô ±¸ÇöÇÒ ¼ö ÀÖ´Ù.

[ÄÚµå 8]

[Guid("6d5140c1-7436-11ce-8034-00aa006009fa")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] // IUnknown ±âº»±¸Çö
[ComImport()]
public interface IServiceProvider
{
    [return: MarshalAs(UnmanagedType.IUnknown)] object QueryService( ref Guid guidService, ref Guid riid );
}

¹°·Ð, [ÄÚµå 8] ¿¡ ±¸ÇöµÈ Interface ¸¦ Á÷Á¢ »ó¼Ó¹Þ¾Æ¼­ »ç¿ëÇÒ ÀÏÀº ¾ø´Ù. [ÄÚµå 7] ¿¡¼­ º¸´Â °Íó·³ unmanaged ȯ°æ¿¡¼­ ±¸ÇÑ ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ managed °³Ã¼·Î º¯È¯ÇÑ ÈÄ¿¡ Stub ¸¸ ±¸ÇöÇØ µÐ ÀÎÅÍÆäÀ̽º·Î "Çüº¯È¯" À» ÇØÁÖ¾î »ç¿ëÇÏ´Â ¸ñÀûÀ¸·Î ¾²ÀÏ °ÍÀ̱⠶§¹®ÀÌ´Ù. »ç½Ç, IServiceProvider ±îÁö´Â ±¸ÇöÀÌ °£´ÜÇØ¼­ ÇØº¼¸¸ ÇÒÅÙµ¥, ±×¿Í µ¿ÀÏÇÏ°Ô ¿©·¯ºÐÀº IWebBrowser2 ¿¡ ´ëÇØ¼­µµ [ÄÚµå 8] °ú °°Àº µ¿ÀÏÇÑ ÇüÅÂÀÇ ÀÎÅÍÆäÀ̽º¸¦ Á÷Á¢ ÄÚµù ÇØÁÖ¾î¾ß ÇÑ´Ù. ¸¸¾à, À̺¥Æ® ±îÁö »ý°¢ÇÑ´Ù¸é, DWebBrowserEvents2 ÀÎÅÍÆäÀ̽º±îÁöµµ ¸¸µé¾î¾ß ÇÑ´Ù. ±×¿¡ ´ëÇØ¼­ ¾î¶² µ¶ÀÚµéÀº, ¿Ö SHDocVw.dll À» ÂüÁ¶ÇÑ RCW (Runtime Callable Wrapper) ¸¦ »ç¿ëÇÏÁö ¾Ê´À³Ä°í ¸»¾¸ÇϽô ºÐÀÌ °è½ÇÁöµµ ¸ð¸£°Ú´Ù. ¸Â´Â ¸»ÀÌ´Ù. À̷лóÀ¸·Î´Â ºÐ¸í SHDocVw.dll À» ÂüÁ¶Ãß°¡ÇÏ´Â °ÍÀ¸·Î ³¡³ª¾ß Á¤»óÀÌ´Ù. ±×·¯³ª, Çö½ÇÀº ±×·¸Áö ¾Ê´Ù. À§¿¡¼­ IWebBrowser2 ¸¦ IServiceProvider ó·³ ÀÎÅÍÆäÀ̽º Á¤ÀÇ·Î ÇÏÁö ¾Ê°í Á÷Á¢ SHDocVw.dll À» ÂüÁ¶Çؼ­ Çüº¯È¯ÇÏ¿© ¾²°Ô µÇ¸é, Smart Client °¡ ½ÇÇà½Ã¿¡ ¿À·ù¸¦ ¹ß»ýÇÏ°í ¸¸´Ù. ÇÊÀÚ´Â ±×·± ÀÌÇØÇÒ ¼ö ¾ø´Â Çö»ó¾Õ¿¡¼­ ¸¹Àº ½Ã°£À» ¼ÒºñÇÏ¿´°í, °á±¹ ã¾Æ³½ °ÍÀÌ C# Interface ¸¦ º°µµ·Î Á¤ÀÇÇÏ´Â °ÍÀ̾ú´Ù. Âü°í·Î, IWebBrowser2 ÀÎÅÍÆäÀ̽º¿Í DWebBrowserEvents ÀÎÅÍÆäÀ̽º Á¤ÀÇ´Â ¼Ò½º°¡ ±æ¾îÁö¹Ç·Î Áö¸é»ó [¼Ò½º ´Ù¿î·Îµå] À¸·Î ³Ö¾úÀ¸´Ï ÂüÁ¶Çϱ⠹ٶõ´Ù.


3. DWebBrowserEvents À̺¥Æ® ¿¬°á

°á±¹, ¿ì¿©°îÀý ³¡¿¡ IWebBrowser2 ÀÎÅÍÆäÀ̽º±îÁö ¾ò°Ô µÇ¾ú´Ù. [ÄÚµå 7] ¿¡¼­ ÇÊÀÚ°¡ C# À¸·Î »õ·Ó°Ô Á¤ÀÇÇÑ IWebBrowser2 ÀÎÅÍÆäÀ̽º·Î Çüº¯È¯µÈ °³Ã¼´Â SHDocVw.IWebBrowser2 ·Î Çüº¯È¯ ÇÑ °Í°ú µ¿ÀÏÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. SHDocVw.dll À» »ç¿ëÇÏÁö ¾ÊÀº °ü°è·Î ¿ì¸®°¡ Á÷Á¢ ±¸ÇöÇÑ C# IWebBrowser2 ÀÎÅÍÆäÀ̽º¿¡´Â ÇѰ¡Áö ¹®Á¦¸¦ Áö´Ï°í Àִµ¥, À¥ ºê¶ó¿ìÀú¿¡ À̺¥Æ®¸¦ ¿¬°áÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ¸ðÈ£ÇÏ´Ù´Â °ÍÀÌ´Ù. SHDocVw.dll ÂüÁ¶¿¡¼­´Â ÀûÀýÇÑ RCW °³Ã¼°¡ tlbimp.exe ¿¡ ÀÇÇØ¼­ "Interop.SHDocVw.dll" ·Î Á¦°øÀÌ µÇ¾î Áö¹Ç·Î ±×°É »ç¿ëÇÏ¸é ¹®Á¦°¡ ¾ø¾úÁö¸¸, ¸»¾¸µå·È´ø °Íó·³ Smart Client ¿¡¼­¸¸Å­Àº SHDocVw.dll À» ÂüÁ¶ÇÏ¿© ±¸ÇöÇÏ°Ô µÇ¸é ¿À·ù°¡ ¹ß»ýÇϹǷΠ±×·± ¼­ºñ½º´Â ¹ÞÀ» ¼ö°¡ ¾ø´Â »óÅÂÀÌ´Ù. ¿©±â¼­ ¿¹»óÇÒ ¼ö ÀÖ°ÚÁö¸¸, ¿ì¸® ¿ª½Ã tlbimp.exe °¡ »êÃâÇØ ÁØ "Interop.SHDocVw.dll" ´ë·Î ±¸ÇöÀ» ÇÑ´Ù¸é ÀÚ¿¬½º·´°Ô À̺¥Æ®¸¦ delegate ·Î ¿¬°áÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸, ¾Æ½±°Ôµµ ÇÊÀÚ ³ª¸§´ë·Î Àá½Ã ½Ã°£À» ³»¾î "Interop.SHDocVw.dll" °ú ¸ÂÃß·Á´Â ½Ãµµ¸¦ ÇßÁö¸¸ ¼º°øÇÏÁø ¸øÇß´Ù. µ¶ÀÚµé Áß¿¡¼­ ÀÌ¿¡ ´ëÇØ ½Ãµµ¸¦ ÇÏ½Ç ºÐÀÌ °è½Ã´Ù¸é, ±â»çÀÇ ¸¶Áö¸·¿¡ ±×¿Í °ü·ÃµÈ "°í±Þ COM Interop" ±â»ç ÀڷḦ "Âü°í URL" ¿¡ Æ÷ÇÔ½ÃÄ×À¸´Ï Âü°íÇϱ⠹ٶõ´Ù. ÇÊÀÚ ¿ª½Ã, ¾ðÁ¨°¡´Â ÀçµµÀüÀ» ¿°µÎ¿¡ µÎ°í, Áß°£ ´Ü°èÀÇ ½Ãµµ¸¦ TreeEvent.cs ¿¡ ½Ç¾î ³õ¾Ò´Âµ¥, Áö¸é»ó ´Ù·çÁö´Â ¸øÇϰí [¼Ò½º ´Ù¿î·Îµå] ¿¡¼­´Â ³Ö¾î µÎ¾úÀ¸´Ï ±× ÄÚµå·ÎºÎÅÍ ½ÃÀÛÇÑ´Ù¸é ³ë·ÂÀÌ Á» ´ú µé °ÍÀÌ´Ù.

±×°Ç ±×·¸°í, ´å³Ý¿¡¼­ Á¦°øÇØÁÖ´Â RCW ¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù°í ÇØ¼­ ±¸ÇöÀÌ ºÒ°¡´ÉÇÑ °ÍÀº ¾Æ´Ï´Ù. ¿ª½Ã unmanaged ½ÃÀý¿¡ ÀÍÈù °Íó·³, COM À̺¥Æ® ¹æ½ÄÀ¸·Î ¾ó¸¶µçÁö ±¸ÇöÀÌ °¡´ÉÇÏ´Ù. Àá½Ã, COM ¿¡ ³¸¼± ºÐµéÀ» À§Çؼ­ COM À̺¥Æ® ¸ðµ¨À» »ìÆìº¸°í Áö³ª°¡°Ú´Ù. [±×¸² 1] À» º¸¸é¼­ ¾Æ·¡ÀÇ ¼³¸íÀ» ÀÌÇØÇϱ⠹ٶõ´Ù.

º¸´Â ¹Ù¿Í °°ÀÌ, COM °³Ã¼´Â À̺¥Æ®¸¦ ¹ß»ýÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÑ ´ÙÀ½, ±× À̺¥Æ® ÀÎÅÍÆäÀ̽º¸¦ ³ª¿­ÇÒ ¼ö ÀÖ´Â IConnectionPointContainer ¸¦ ±¸ÇöÇØ µÎ¾î¾ß ÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ® Ãø¿¡¼­´Â ¹Ù·Î ±× IConnectionPointContainer ÀÎÅÍÆäÀ̽º¸¦ QueryInterface ·Î Á¶È¸¸¦ ÇÏ°Ô µÇ°í, FindConnectionPoint ¸Þ¼­µå¸¦ ÅëÇØ¼­ ¿¬°áÇϰíÀÚ ÇÏ´Â À̺¥Æ® ÀÎÅÍÆäÀ̽º¿¡ ÇØ´çÇÏ´Â GUID ¸¦ ³Ñ°ÜÁÖ¾î ±× À̺¥Æ® ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ ¿¬°áÁöÁ¡À» ´ã´çÇÏ´Â IConnectionPoint ÀÎÅÍÆäÀ̽º¸¦ ¶Ç ´Ù½Ã ±¸Çؿà ¼ö ÀÖ´Ù. ÀÌÈÄ, Ŭ¶óÀÌ¾ðÆ® Ãø¿¡¼­´Â À̺¥Æ® ÀÎÅÍÆäÀ̽º¸¦ »ó¼Ó¹ÞÀº Ŭ·¡½º¸¦ Á¤ÀÇÇÏ°í ±× Å¬·¡½ºÀÇ ÀνºÅϽº¸¦ ¸¸µç ´ÙÀ½, IConnectionPoint::Advise ¿¡ ÀνºÅϽº Æ÷ÀÎÅ͸¦ ³Ñ°ÜÁÖ¸é, À̸¥¹Ù "À̺¥Æ®¸¦ °Å´Â (sink)" ÀÛ¾÷ÀÌ ³¡³ª°Ô µÈ´Ù. ÀÌÈķδ COM ¼­¹ö¿¡¼­ À̺¥Æ®°¡ ¹ß»ýÇϸé Advise ¿¡ Àü´ÞµÇ¾ú´ø Ŭ¶óÀÌ¾ðÆ® Ãø¿¡ ±¸ÇöµÈ Ŭ·¡½ºÀÇ Æ÷ÀÎÅ͸¦ ÅëÇØ¼­ ÇØ´ç ¸Þ¼­µå¸¦ È£ÃâÇØ ÁÖ°Ô µÇ´Â °ÍÀÌ ¹Ù·Î COM À̺¥Æ® ±¸Á¶ÀÌ´Ù. ÇѸ¶µð·Î, COM À̺¥Æ®´Â "¾ç¹æÇâ Åë½Å" À» ÇÏ°Ô µÈ´Ù.

[±×¸² 1: COM ¿¡¼­ÀÇ À̺¥Æ® ±¸Çö]

À§ÀÇ ¿¹¸¦ ¿ì¸®°¡ ±¸ÇöÇÑ Smart Client ¿¹Á¦¿Í ºñ±³¸¦ ÇØº¸ÀÚ. [±×¸² 1] ¿¡¼­ "Client" ´Â ¿ì¸®°¡ ±¸ÇöÇÑ TreeControl ÀÌ µÉ °ÍÀ̰í, "Connectable Object" ´Â À¥ ºê¶ó¿ìÀú °¡ µÉ °ÍÀÌ´Ù. µû¶ó¼­, ¿ì¸®´Â À¥ ºê¶ó¿ìÀú·ÎºÎÅÍ IConnectionPointContainer ÀÎÅÍÆäÀ̽º¸¦ Á¶È¸ÇÑ ÈÄ, ±× ÀÎÅÍÆäÀ̽º¿¡¼­ Á¦°øÇØ ÁÖ´Â FindConnectionPoint ¸Þ¼­µå¸¦ »ç¿ëÇØ¼­ À¥ ºê¶ó¿ìÀú°¡ ±¸ÇöÇÑ "DWebBrowserEvents2" ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ IConnectionPoint ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù. ÀÌÈÄ, À̺¥Æ®¸¦ °É°í ½ÍÀ» ¶§´Â IConnectionPoint::Advise ¸Þ¼­µå¸¦ È£ÃâÇÏ¸é µÇ°í, À̺¥Æ® ÇØÁ¦¸¦ ÇϰíÀÚ ÇÒ¶§´Â IConnectionPoint::Unadvise ¸Þ¼­µå¸¦ È£ÃâÇØ ÁÖ¸é µÇ´Â °ÍÀÌ´Ù. À̸¦ C# ÄÚµå·Î Ç¥ÇöÇØ º¸¸é [ÄÚµå 9] ¿Í °°´Ù. º¸½Ã´Â °Íó·³, °£´ÜÇÏ°Ô À̺¥Æ®¸¦ ¿¬°áÇÒ ¼ö °¡ ÀÖ´Ù. Âü°í·Î, IConnectionPointContainer ÀÎÅÍÆäÀ̽º´Â IServiceProvider ¿Í´Â ´Þ¸® ´å³Ý Base Class Library Â÷¿ø¿¡¼­ UCOMIConnectionPointContainer ¶ó´Â ÀÎÅÍÆäÀ̽º·Î Á¦°øµÇ¾î Áö°í ÀÖÀ¸¸ç, IConnectionPoint ´Â UCOMIConnectionPoint ¶ó´Â À̸§À¸·Î µ¿ÀÏÇÑ ±¸Á¶ÀÇ ¸Þ¼­µå±îÁö Æ÷ÇÔÇØ¼­ Á¦°øÀ» ÇØÁֱ⠶§¹®¿¡ IServiceProvider ó·³ °³¹ßÀÚ°¡ ±¸ÇöÇØÁÙ Çʿ䰡 ¾ø´Ù.

[ÄÚµå 9]

// DWebBrowserEvents ¿¡ ´ëÇÑ GUID °ª
Guid DEventsGuid = new Guid( "34A715A0-6587-11D0-924A-0020AFC7AC4D" );

// WebBrowser °³Ã¼¸¦ IConnecitonPointContainer ·Î Çüº¯È¯
UCOMIConnectionPointContainer ICpc = (UCOMIConnectionPointContainer)WBObject;

// DWebBrowserEvents2 ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ IConnectionPoint ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ ¹Ýȯ
ICpc.FindConnectionPoint( ref DEventsGuid, out _ICp );

// TreeControl ¿¡¼­ DWebBrowserEvents2 ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϰí Àֱ⠶§¹®¿¡,
// ÀÚ½ÅÀÇ this Æ÷ÀÎÅ͸¦ Àü´ÞÇϰí, ÀÌÈÄ À̺¥Æ® ¿¬°á ÇØÁ¦¸¦ À§ÇØ Cookie °ªÀ» ¹Ýȯ
_ICp.Advise( this, out _dwCookie );

[ÄÚµå 9] ÀÇ ¼Ò½º¿¡¼­´Â Áö¸é»ó »ý·«ÇßÁö¸¸, TreeControl °³Ã¼´Â ÀÌ¹Ì DWebBrowser2 ÀÎÅÍÆäÀ̽º¸¦ »ó¼Ó¹Þ¾Æ¼­ ±×¿¡ ´ëÇÑ ¸â¹ö ÇÔ¼ö¸¦ ¸ðµÎ ±¸ÇöÇØ ³õ¾Ò±â ¶§¹®¿¡, ¸¶Áö¸· ºÎºÐÀÇ _ICp.Advise ¸Þ¼­µå¿¡¼­ ÀÚ½ÅÀÇ this Æ÷ÀÎÅ͸¦ Àü´ÞÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ÀÌ·¸°Ô À̺¥Æ®¸¦ °É¾îÁÖ°í ³ª¸é, ÀÌÈÄ·Î À¥ºê¶ó¿ìÀú·ÎºÎÅÍ À̺¥Æ®°¡ ¹ß»ýÇÒ ¶§¸¶´Ù DWebBrowserEvents2 ÀÎÅÍÆäÀ̽º¸¦ »ó¼Ó¹Þ¾Æ ±¸ÇöÇØ µÎ¾ú´ø TreeControl Ŭ·¡½ºÀÇ ¸â¹ö ¸Þ¼­µå°¡µéÀÌ ½ÇÇàµÇ¾îÁø´Ù. ¿ì¸®´Â ±×Àú ÇÊ¿äÇÑ À̺¥Æ®¿¡ ÇÑÇØ¼­ ±× ÇØ´ç ¸Þ¼­µå¿¡ Äڵ带 Ãß°¡ÇØ Áֱ⸸ ÇÏ¸é µÈ´Ù.

ÀÌÁ¦ ¿Ø¸¸Å­ ±¸ÇöÀÌ ³¡³­ °Í °°´Ù. ¿©±â¼­ Àá½Ã, COM À» ÇÏÁö ¾ÊÀº µ¶ÀÚ¶ó¸é °£°úÇϰí Áö³ª°¥ ¼ö ÀÖÀ» ¹®Á¦¸¦ ¤°í ³Ñ¾î°¡°Ú´Ù. À§¿¡¼­ QueryInterface ·Î ±¸ÇÑ ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍ °ªÀº ¾Ë·ÁÁø µ¥·Î ³»ºÎÀûÀ¸·Î IUnknown::AddRef °¡ È£ÃâµÇ¾îÁö¹Ç·Î, Áõ°¡µÈ ÂüÁ¶¼ö¸¦ ÁÙ¿©ÁÖ±â À§Çؼ­ ¹Ýµå½Ã Marshal.Release ¸¦ È£ÃâÇØ ÁÖ¾î¾ß¸¸ Çϰí, °É¾î³õÀº À̺¥Æ®¿¡ ´ëÇØ¼­µµ Unadvise ·Î ÇØÁ¦¸¦ ÇØÁÖ¾î¾ß ÇÑ´Ù. Smart Client ¿¡¼­ ÀÚ¿øÇØÁ¦¸¦ À§ÇÑ °¡Àå ÀûÀýÇÑ À§Ä¡´Â IDisposable.Dispose ¸Þ¼­µå ³»ºÎÀÌ´Ù. ±×°÷¿¡¼­ _ICp, _htmlDocument, _webBr °³Ã¼¿¡ ´ëÇÑ ÇØÁ¦ Äڵ带 ÀØÁö ¸»°í ³Ö¾îÁÖ°í, ÇØÁ¦¿Í °ü·ÃµÈ Äڵ嵵 [¼Ò½º ´Ù¿î·Îµå] ¿¡ ³Ö¾î µÎ¾úÀ¸´Ï È®ÀÎÇϱ⠹ٶõ´Ù.

À̹ø ÀýÀ» ÅëÇØ¼­, Smart Client ¸¦ È£½ºÆ®Çϰí ÀÖ´Â HTML Document ¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍ, WebBrowser ¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍ, ±×¸®°í ±× WebBrowser ¿¡ À̺¥Æ®¸¦ ¿¬°áÇÏ´Â ¹æ¹ýÀ» ±¸ÇöÇØ º¸¾Ò´Ù. Microsoft.mshtml °³Ã¼·ÎÀÇ Çüº¯È¯À» Full Trust º¸¾ÈÇÏ¿¡¼­¸¸ Á¦°øÇØ Áشٴ °ÍÀÌ ´Ù¼Ò ¿øÄ¢¿¡ ¸ÂÁö ¾Ê´Â µí ½ÍÀºµ¥ ¾Ö¼®ÇϰԵµ ÀÌ ¹®Á¦´Â .NET Framework 1.1 ¿¡¼­¸¸ ¹ß»ýÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ÇÊÀÚ°¡ Å×½ºÆ®Çϰí ÀÖ´Â SQL Server Â÷±â ¹öÀüÀÎ Yucon °ú ÇÔ²² ¼³Ä¡µÇ´Â ".NET Framework 2.0" ¹öÀü¿¡¼­µµ À§ÀÇ ¹®Á¦´Â µ¿ÀÏÇÏ°Ô ¹ß»ýÇϰí ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ¾ú´Ù. ¹°·Ð, .NET Framework 2.0 µµ ¾ÆÁ÷ Á¤½Ä ¸±¸®Áî°¡ µÈ °ÍÀº ¾Æ´Ï±â ¶§¹®¿¡ È®Á¤ÁöÀ» ¼ö´Â ¾ø°ÚÁö¸¸, ÇöÀç·Î¼­´Â ±â´ë¸¦ ÇÒ ¼ö ¾ø´Â »óȲÀÌ´Ù.

4. Smart Client ¿Í IE ÀÇ ¼¼¼Ç °øÀ¯

Smart Client ¸¦ ½Ç¹«¿¡ Àû¿ë½ÃŰ´Ù º¸´Ï IE ¿ÍÀÇ ¿¬µ¿À» ¼º°øÇÏ°Ô µÈ °ÍÀÌ IE ¿ÍÀÇ ¼¼¼Ç °øÀ¯¿¡µµ µµ¿òÀÌ µÉ ¼ö ÀÖ¾ú´Ù.. ¾Æ¸¶ Çö¾÷¿¡¼­ Á÷Á¢ Smart Client ¸¦ °³¹ßÇØ º¸½Å ºÐµéÀº ²À ÇѹøÂë °É·Á ³Ñ¾îÁ³À» µ¹»Ñ¸®°¡ ¹Ù·Î IE ¿ÍÀÇ ¼¼¼Ç °øÀ¯°¡ ¾Æ´Ò±î ½ÍÀºµ¥, ¿¬Àç 1ȸÀÇ ±â»ç¸¸ ÀÐ°íµµ ¿©·¯ºÐµéÀº ÀÌ¹Ì IE ¿ÍÀÇ ¼¼¼Ç °øÀ¯¸¦ ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» ¾È °ÍÀ̳ª ´Ù¸§ÀÌ ¾ø´Ù. ¿Ö³Ä¸é, À¥ºê¶ó¿ìÀú¿¡ ÇÒ´çµÈ ¼¼¼ÇÀ» ±¸ºÐÇØ ÁÖ´Â °íÀ¯ÇÑ "¼¼¼Ç ID" ´Â HTML ½ºÅ©¸³Æ® »ó¿¡¼­µµ ±¸ÇÒ ¼ö ÀÖ°í, ±×·¸°Ô ±¸ÇÑ ¼¼¼Ç ID ¸¦ ¿¬Àç 1ȸ¿¡¼­ ¹è¿î "¼Ó¼º" °ª¿¡ ´ëÀÔÇØ¼­ ³»ºÎÀûÀ¸·Î º¸°üÇϰí ÀÖ´Ù°¡ ÇÊ¿äÇÑ °æ¿ì ±× °ªÀ» ¾²¸é µÇ±â ¶§¹®ÀÌ´Ù. ½ÇÁ¦·Î, ¼­¹ö¿Í ¸Î¾îÁø ¼¼¼ÇÀ» ±¸ºÐÇØ ÁÖ´Â ¼¼¼Ç ID ´Â Cookie ¸¦ ÅëÇØ¼­ ¼­¹ö¿¡¼­ Àü´Þ ¹ÞÀº »óÅÂÀ̰í, HTML Document ´Â cookie ¶ó´Â ¼Ó¼ºÀ» ÅëÇØ¼­ Á¢±ÙÀ» Çã¿ëÇϰí Àֱ⿡, ¿¬Àç 1ȸ Á¤µµ¿¡¼­ ¹è¿î ½Ç·ÂÀ» ¹ßÈÖÇØ º»´Ù¸é, ¾Æ·¡¿Í °°Àº ÄÚµå·Î ¾ÆÁÖ ½±°Ô ±¸ÇöÇÒ ¼ö°¡ ÀÖ°Ô µÇ´Â °ÍÀÌ´Ù.

Form1._Control1.CookieValue = document.cookie;

ÇÏÁö¸¸, ¼¼¼Ç°ú ¿¬µ¿ÇØ¾ß ÇÏ´Â ¸ðµç Smart Client ¸¦ »ç¿ëÇÏ´Â À¥ÆäÀÌÁö¿¡¼­ À§ÀÇ ±¸¹®À» À¯ÁöÇØ ÁÖ´Â °Íµµ ÇϳªÀÇ ÀÏÀÌ´Ù. °Ô´Ù°¡, À̹ø ¿¬Àç 2ȸ¸¦ ÅëÇØ ¿©·¯ºÐµéÀº ±×·¯ÇÑ ¹ø°Å·Î¿òÀ» ÇØ°áÇÒ ¼ö ÀÖ´Â ¿­¼è¸¦ °®°Ô µÇ¾ú´Ù. Áï, ¾ÕÀÇ ´Ü°è¿¡¼­ ±¸Çß´ø _htmlDocument °³Ã¼¿¡¼­ cookie ¼Ó¼ºÀ» ÅëÇØ ÇöÀç Smart Client ¸¦ È£½ºÆÃÇϰí ÀÖ´Â IE ÀÇ Äí۰ªÀ» ±¸Çؼ­ »ç¿ëÇÏ¸é µÇ±â ¶§¹®ÀÌ´Ù. ÀÌ¹Ì ¾Õ¿¡¼­ ¹è¿î °Íó·³, Äí۰ªÀº ¾Æ·¡¿Í °°Àº ÄÚµå·Î °£´ÜÈ÷ ±¸ÇØÁú ¼ö ÀÖ´Ù.

Type t = _htmlDocument.GetType();
string cookieValue = (string)t.InvokeMember( "cookie", BindingFlags.GetProperty, null, _htmlDocument, null );

ÀÌ·¸°Ô °£´ÜÈ÷ cookieValue °ªÀº ±¸Çß°í, ±× Äí۸¦ ¼³Á¤Çؼ­ ¼­¹ö¿Í Åë½ÅÀ» ÇÏ¸é µÈ´Ù. unmanaged ȯ°æ¿¡¼­´Â ¼­¹ö¿Í Åë½ÅÇϱâ À§ÇØ º¸Åë IXMLHTTP °³Ã¼¸¦ »ç¿ëÇß¾ú°ÚÁö¸¸, .NET Framework ¿¡¼­´Â Base Class Library Â÷¿ø¿¡¼­ Á¦°øµÇ´Â WebRequest Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ´õ¿í ÀÚ¿¬½º·´´Ù. »ç¿ë¹æ¹ý¿¡ À־µµ IXMLHTTP °³Ã¼ ¸øÁö ¾Ê°Ô ½¬¿î ±¸Á¶¸¦ À¯ÁöÇØ ÁÖ°í ÀÖÀ¸´Ï ÇÊÀÚ´Â WebRequest ¸¦ ¼±ÅÃÇÏ¿© [ÄÚµå 10] °ú °°ÀÌ ±¸ÇöÇØ º¸¾Ò´Ù.

[ÄÚµå 10]

// URL ¿¡¼­ È£½ºÆ® µµ¸ÞÀÎ ºÎºÐÀ» ±¸ÇÑ´Ù.
string currentURL = _webBr.LocationURL;
Uri curURI = new Uri( currentURL );

// Query ¸¦ ³¯¸± aspx °æ·Î¸¦ ¼³Á¤.
string reqURL = "http://" + curURI.Host + "/WebApp/GetSessionValue.aspx";

// Factory ¸Þ¼­µå ÆÐÅÏÀ¸·Î WebRequest °³Ã¼¸¦ »ý¼º.
WebRequest webReq = WebRequest.Create( reqURL );

// À¥ºê¶ó¿ìÀú¿ÍÀÇ ¼¼¼Ç°øÀ¯¸¦ À§ÇØ Cookie °ªÀ» WebRequest ÀÇ HTTP ¿äû Çì´õ¿¡ ¼³Á¤
webReq.Headers.Add( "Cookie", cookieValue );

// ¿äûÀ» º¸³»°í, ¹ÞÀº byte ½ºÆ®¸²À» String À¸·Î º¯È¯Çؼ­ Ãâ·Â.
WebResponse response = webReq.GetResponse();
Stream stream = response.GetResponseStream();
byte [] byteText = new byte[ response.ContentLength ];
stream.Read( byteText, 0, (int)response.ContentLength );

string text = Encoding.Default.GetString( byteText );
MessageBox.Show( text );

[ÄÚµå 10] ¿¡¼­´Â, ¼­¹ö¿¡ ÀÌ¹Ì GetSessionValue.aspx À¥Æû ÆäÀÌÁö¸¦ ¸¸µé¾î µÎ¾ú´Ù°í °¡Á¤Çϰí ÀÖÀ¸¸ç, ±× ÆäÀÌÁö¿¡¼­´Â ´Ù¸¥ ÆäÀÌÁö¿¡¼­ ¼³Á¤µÈ Session º¯¼ö°ªÀ» Ãâ·ÂÇØÁÖ´Â ¿ªÇÒÀ» Çϰí ÀÖ´Ù. ±â¾ïÇØ µÎ¾î¾ß ÇÒ °ÍÀº, ¼­¹ö¿Í »õ·Ó°Ô ¿¬°áÀ» ¸Î´Â Ŭ¶óÀÌ¾ðÆ®´Â HTTP ¿äû Çì´õ¿¡ ¼¼¼ÇÀ» °øÀ¯ÇϰíÀÚ ÇÏ´Â ¿¬°á¿¡ ÇØ´çÇÏ´Â ¼¼¼Ç ID ¸¦ Cookie ¿¡ ½Ç¾î¼­ º¸³»¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. WebRequest ÀÇ °æ¿ì, Çì´õ¸¦ Ãß°¡Çϱâ À§ÇØ Headers ¶ó´Â NameVauleCollection Çü½ÄÀÇ °ø¿ë ¼Ó¼ºÀ» Á¦°øÇØ ÁÖ°í À־, ±âÁ¸ À¥ºê¶ó¿ìÀú¿¡¼­ ±¸ÇÑ Cookie °ª¿¡¼­ (ASP.NET ÀÇ °æ¿ì) ASP.NET_SessionId ۰ªÀ» µ¿ÀÏÇÏ°Ô ¼³Á¤ÇØ Á־ º¸³»¸é µÈ´Ù. [ÄÚµå 10] °ú °°ÀÌ HTTP ¿äûÀ» ÇÏ°Ô µÇ¸é, [Ç¥ 1] °ú °°Àº ±¸Á¶·Î HTTP ¿äû Çì´õ°¡ ±¸¼ºµÇ°Ô µÈ´Ù.

GET /WebApp/GetSessionValue.aspx HTTP/1.1
Connection: Keep-Alive
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: ko,en-us;q=0.5
Cookie: ASP.NET_SessionId=ucrave3mxye3ltqojrbnr455
Host: localhost
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; i-NavFourF; .NET CLR 1.1.4322; .NET CLR 1.0.3705)

[Ç¥ 1: ¼¼¼ÇÀ» °øÀ¯Çϱâ À§ÇØ Cookie ¿¡ ASP.NET_SessionId ¸¦ ¼³Á¤]

º¸½Ã´Â °Íó·³, ±½Àº ¼­Ã¼·Î µÈ ASP.NET_SessionId °¡ ±âÁ¸ ¿¬°á¿¡¼­ ±¸ÇÑ °ªÀ̱⠶§¹®¿¡, ¼­¹ö´Â »õ·Î¿î ¼¼¼ÇÀ» »ý¼ºÇÏÁö ¾Ê°í, ÀÌ¹Ì ¸Î¾îÁø ¼¼¼ÇÁß¿¡¼­ ÁÖ¾îÁø ¼¼¼Ç ID ¿¡ ÇØ´çÇÏ´Â ¼¼¼Ç °³Ã¼¸¦ ±×´ë·Î »ç¿ëÇÏ°Ô µÇ¾î, Smart Client ³»ºÎ¿¡¼­ »ý¼ºÇÑ WebRequest °³Ã¼¿Í Smart Client ¸¦ È£½ºÆÃ Çϰí ÀÖ´Â À¥ºê¶ó¿ìÀú°£¿¡ µ¿ÀÏÇÑ ¼¼¼ÇÀ» »ç¿ëÇÏ°Ô µÈ´Ù.


¿¬Àç 2ȸ¸¦ ¸¶Ä¡¸ç

¿¬Àç 1ȸ¿¡¼­´Â ¾à°£ÀÇ COM Áö½ÄÀ̸é ÃæºÐÇß¾ú´Âµ¥, À̹ø 2ȸÀÇ ¿¬Àç¿¡¼­´Â COM À¸·Î µµ¹è¸¦ ÇÑ °Í °°´Ù. ¾óÇÍ º¸¸é, À̰ÍÀÌ Smart Client ¿¡ ´ëÇÑ ±â»çÀÎÁö COM ¿¡ ´ëÇÑ ±â»çÀÎÁö ±¸ºÐÀÌ ¾È °¥ Á¤µµÀÌ´Ù. ±×·¸´Ù°í ÇØ¼­ COM Áö½ÄÀ» ¸ð¸£°í´Â Smart Client ¸¦ Á¢±ÙÇÒ ¼ö ¾ø´Ù´Â ÀνÄÀº ÇÏÁö ¸»±â ¹Ù¶õ´Ù. º»·¡ÀÇ .NET Framework ¿¡¼­ Á¦°øÇÏ´Â Base Class Library ·Îµµ Smart Client ÀÇ À§·ÂÀº ÃæºÐÈ÷ ¹ßÈÖÇÒ ¼ö ÀÖÁö¸¸, ´ÜÁö ÇÊÀÚÀÇ ¿¬Àç¿¡¼­´Â ±âÁ¸ ActiveX ¿¡¼­ ±¸ÇöÇß´ø °ÍµéÀ» Smart Client ¿¡¼­µµ ±¸ÇöÇÏ·Á´Ù º¸´Ï COM ¿¡ ´ëÇÑ ¹è°æÀ» Á¦¿Ü½ÃŰ±â°¡ ºÒ°¡´ÉÇßÀ» »ÓÀÌ´Ù. ±×³ª¸¶ À§¾ÈÀ» »ï´Â´Ù¸é, ¿©±â¼­ ´Ù·ç´Â ÄÚµåµéÀÇ ´ëºÎºÐÀÌ ¸ðµç Smart Client ¸¦ ±¸ÇöÇÏ´Â µ¥¿¡ ÀÖ¾î º¯°æ¾øÀÌ ¾µ ¼ö Àֱ⠶§¹®¿¡ º°µµÀÇ Å¬·¡½º·Î ±¸ÇöÇØ µÎ¾î, Smart Client ¸¦ ±¸ÇöÇÒ ¶§ ¸¶´Ù »ó¼ÓÀ» ÅëÇØ 󸮸¦ ÇÏ¸é µÇ±â ¶§¹®¿¡ ±×·¸°Ô ºÎ´ã°®Áö ¾Ê¾Æµµ µÉ °ÍÀÌ´Ù.

À̷νá, Smart Client ¸¦ Á¦ÀÛÇÔ¿¡ À־ ±âÁ¸ ActiveX ¸¦ ´ëüÇÒ ¼ö ÀÖÀ» Á¤µµÀÇ ±â¹Ý Áö½ÄÀº ´Ù·é °Í °°´Ù. ÇÏÁö¸¸, ¿ª½Ã Smart Client ÀÇ ¸ñÇ¥´Â »ç¿ëÀÚµéÀÇ ÄÄÇ»ÅÍ¿¡¼­ ½±°Ô ¿î¿µÀÌ µÉ ¼ö ÀÖÀ» ¶§ ´õ¿í °¡Ä¡°¡ ÀÖÀ» °ÍÀÌ´Ù. ´ÙÀ½ ȸ¿¡¼­´Â À̸¦ À§ÇÑ Smart Client ¹èÆ÷ ¹®Á¦¸¦ ´Ù·ç°í ±×¿Í °ü·ÃµÈ º¸¾È »çÇ×À» ´Ù·ïº¸µµ·Ï ÇϰڴÙ.


Âü°í URL

Microsoft ±â¼ú ÀÚ·á : HOWTO - Get IHTMLDocument2 from a HWND
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q249/2/32.asp
&NoWebContent=1&NoWebContent=1

IWebBrowser2 ÀÎÅÍÆäÀ̽º¿Í IHTMLDocument2 ÀÎÅÍÆäÀ̽º »óÈ£Á¢±Ù
http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&pageno=7&detail=1&wid=2&wtype=0

VS.NET µµ¿ò¸» : Visual Studio.NET / .NET Framework / .NET Framework ¸¦ »ç¿ëÇÑ ÇÁ·Î±×·¡¹Ö / °ü¸®µÇÁö ¾Ê´Â ÄÚµå¿ÍÀÇ »óÈ£ ¿î¿ë / °í±Þ COM Interop
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1042/cpguide/html/cpconadvancedcominterop.htm

Smart Client Á¤ÀÇ : µÚ´ÊÀº ¼Ò°³Áö¸¸, Ȥ½Ã³ª ÇÊÀÚÀÇ ±ÛÀ» Àаí Smart Client ´Â °ð ActiveX ¿Í µ¿ÀÏÇÑ °ÝÀ̶ó°í »ý°¢ÇÒ ºÐµéÀÌ °è½Ç °Í °°¾Æ¼­, Smart Client ¿¡ ´ëÇÑ º¸´Ù ÀϹÝÀûÀÎ Á¤ÀǸ¦ ´ã°í ÀÖ´Â ÀڷḦ ¼Ò°³ÇÑ´Ù.

http://211.169.248.133/netxpert/board/board_view.aspx?bbs=zColumns&pageno=1&searchKey=&searchtype=&basewid=46

°­Á ¸ñ·ÏÀ¸·Î..