cpueblo's
Programming
     

Google
 
Programming | Tools | Money | Blog | ±âÁ¸ ÀÚ·á½Ç | ÄÚµå»ç¶û ¹æ¸í·Ï | About Me | English | °Ë»ö   
¾ð¾îº°:


ÁÖÁ¦º°:


Àüü Ç׸ñº°


±âŸ


±¤ÈñÀÇ ÀÚÀÛÅø

cpueblo's Library

 

[À¥±Û] Visual Studio 2005¿¡¼­ ºê¶ó¿ìÀú µµ¿ì¹Ì °³Ã¼ ¸¸µé±â(Windows IETechCol)

µî·ÏÀÚ : À¯±¤Èñ, 07-09-19 12:03:20


ÀÌ ±ÛÀº http://www.microsoft.com/korea/msdn/library/ko-kr/IETechCol/cols/dnexpie/expie_hello_bho.aspx ¿¡¼­ °¡Á®¿Â 'À¥±Û' ÀÔ´Ï´Ù.
³»¿ëÀÇ ÀúÀÛ±ÇÀº ¾Æ·¡ »çÀÌÆ®¿¡ ÀÖ½À´Ï´Ù

Visual Studio 2005¿¡¼­ ºê¶ó¿ìÀú µµ¿ì¹Ì °³Ã¼ ¸¸µé±â(Windows IETechCol)
MSDN Ȩ > °³¹ß & µµ±¸ > Visual Studio 2005 > Visual Studio 2005¿¡¼­ ºê¶ó¿ìÀú µµ¿ì¹Ì °³Ã¼ ¸¸µé±â(Windows IETechCol)

Visual Studio 2005¿¡¼­ ºê¶ó¿ìÀú µµ¿ì¹Ì °³Ã¼ ¸¸µé±â(Windows IETechCol)

Tony Schreiner, John Sudds
Microsoft Corporation

2006³â 10¿ù 27ÀÏ

¿ä¾à: ÀÌ ±â»ç¿¡¼­´Â Microsoft Visual Studio 2005¸¦ »ç¿ëÇÏ¿© IObjectWithSite ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϰí Internet Explorer¿¡ ¿¬°áµÇ´Â ±¸¼º ¿ä¼Ò °³Ã¼ ¸ðµ¨(COM) °³Ã¼ÀÎ ´Ü¼ø ºê¶ó¿ìÀú µµ¿ì¹Ì °³Ã¼(BHO)¸¦ ¸¸µå´Â ¹æ¹ýÀ» ¼³¸íÇÕ´Ï´Ù. Ãʺ¸ÀûÀÎ BHO¸¦ ¸¸µå´Â ¹æ¹ýÀ» ´Ü°èº°·Î ¼³¸íÇÒ °ÍÀÔ´Ï´Ù. ±â»ç¿¡¼­ ÀÛ¼ºÇÒ BHO´Â ¿ì¼± Internet Explorer¿¡¼­ ¹®¼­¸¦ ·ÎµåÇÒ ¶§ "Hello World!"¶ó´Â ¸Þ½ÃÁö¸¦ Ç¥½ÃÇÕ´Ï´Ù. ±×·± ´ÙÀ½ BHO°¡ È®ÀåµÇ¾î ·ÎµåµÈ ÆäÀÌÁö¿¡¼­ À̹ÌÁö¸¦ Á¦°ÅÇÕ´Ï´Ù. ÀÌ ±â»ç´Â ºê¶ó¿ìÀúÀÇ ±â´ÉÀ» È®ÀåÇϰí Internet Explorer¿ë À¥ °³¹ßÀÚ µµ±¸¸¦ ¸¸µå´Â ¹æ¹ýÀ» ¹è¿ì°íÀÚ ÇÏ´Â °³¹ßÀÚ¸¦ À§ÇØ ÀÛ¼ºµÇ¾ú½À´Ï´Ù.

¸ñÂ÷

¼Ò°³
°³¿ä
ÇÁ·ÎÁ§Æ® ¼³Á¤
±âº» »çÇ× ±¸Çö
À̺¥Æ®¿¡ ÀÀ´ä
DOM Á¶ÀÛ
¿ä¾à
°ü·Ã Ç׸ñ


¼Ò°³

ÀÌ ±â»ç¿¡¼­´Â Microsoft Visual Studio 2005¿Í ATL(Active Template Library)À» »ç¿ëÇÏ¿© C++·Î BHO¸¦ °³¹ßÇÕ´Ï´Ù. ATLÀ» »ç¿ëÇϱâ·Î °áÁ¤ÇÑ ÀÌÀ¯´Â Çʿ信 µû¶ó È®ÀåÇÒ ¼ö ÀÖ´Â ±âº» ±¸¼º ¿ä¼Ò¸¦ Æí¸®ÇÏ°Ô ±¸ÇöÇÒ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù. MFC(Microsoft Foundation Classes), Win32 API, COM µîÀÇ ´Ù¸¥ ¹æ¹ýÀ¸·Îµµ BHO¸¦ ¸¸µé ¼ö ÀÖÁö¸¸ °æ·® ¶óÀ̺귯¸®ÀÎ ATLÀ» »ç¿ëÇϸé BHO Ŭ·¡½º ½Äº°ÀÚ(CLSID)ÀÇ ·¹Áö½ºÆ®¸® ¼³Á¤À» ºñ·ÔÇÑ ¸¹Àº ¼¼ºÎ ÀÛ¾÷À» ÀÚµ¿À¸·Î ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù.

ATLÀÇ ¶Ç ´Ù¸¥ ÀåÁ¡Àº COM °³Ã¼ÀÇ ¼ö¸íÀ» °ü¸®ÇÏ´Â COM ÀÎ½Ä ½º¸¶Æ® Æ÷ÀÎÅÍ Å¬·¡½º(CComPtr (¿µ¹®) ¹× CComBSTR (¿µ¹®) µî)ÀÔ´Ï´Ù. ¿¹¸¦ µé¾î CComPtrÀº °ªÀÌ ÇÒ´çµÉ ¶§ AddRef¸¦ È£ÃâÇÏ¸ç °³Ã¼°¡ ¼Ò¸êµÇ°Å³ª ¹üÀ§¸¦ ¹þ¾î³ª¸é Release¸¦ È£ÃâÇÕ´Ï´Ù. ½º¸¶Æ® Æ÷ÀÎÅÍ´Â Äڵ带 ´Ü¼øÈ­ÇÏ°í ¸Þ¸ð¸® ´©¼ö¸¦ ¾ø¾Ö´Â µ¥ µµ¿òÀÌ µË´Ï´Ù. ½º¸¶Æ® Æ÷ÀÎÅÍÀÇ ¾ÈÁ¤¼º°ú ½Å·Ú¼ºÀº ´ÜÀÏ ¸Þ¼­µå ¹üÀ§ ³»¿¡¼­ »ç¿ëµÉ ¶§ ƯÈ÷ À¯¿ëÇÕ´Ï´Ù.

ÀÌ ±â»çÀÇ Ã³À½ ºÎºÐ¿¡¼­´Â ´Ü¼ø BHO¸¦ ±¸ÇöÇϰí Internet Explorer¿¡ ·ÎµåµÇ¾ú´ÂÁö È®ÀÎÇÏ´Â °úÁ¤À» »ìÆìº¸°Ú½À´Ï´Ù. ´ÙÀ½ ºÎºÐ¿¡¼­´Â BHO¸¦ ºê¶ó¿ìÀú À̺¥Æ®¿¡ ¿¬°áÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¸°í ¸¶Áö¸· ºÎºÐ¿¡¼­´Â À¥ ÆäÀÌÁöÀÇ ¸ð¾çÀ» º¯°æÇÏ´Â DHTML ¹®¼­ °³Ã¼ ¸ðµ¨(DOM)°úÀÇ °£´ÜÇÑ »óÈ£ ÀÛ¿ëÀ» »ìÆìº¸°Ú½À´Ï´Ù.


°³¿ä

ºê¶ó¿ìÀú µµ¿ì¹Ì °³Ã¼(BHO)ÀÇ Á¤È®ÇÑ Á¤ÀÇ´Â ¹«¾ùÀԴϱî? °£´ÜÈ÷ ¸»ÇØ BHO´Â Internet Explorer¿¡ »ç¿ëÀÚ ÁöÁ¤ ±â´ÉÀ» Ãß°¡ÇÏ´Â °æ·® DLL È®ÀåÀÔ´Ï´Ù. ÈçÈ÷ º¼ ¼ö ÀÖ´Â ¿¹´Â ¾Æ´Ï¸ç º» ±â»çµµ ÃÊÁ¡Àº ¾Æ´ÏÁö¸¸ Windows Explorer ¼Ð¿¡ ±â´ÉÀ» Ãß°¡ÇÏ´Â µ¥µµ BHO¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

BHO´Â ÀϹÝÀûÀ¸·Î ÀÚü »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÏÁö ¾Ê°í ºê¶ó¿ìÀú À̺¥Æ®¿Í »ç¿ëÀÚ ÀԷ¿¡ ÀÀ´äÇϸ鼭 ¹é±×¶ó¿îµå¿¡¼­ ÀÛµ¿ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î BHO´Â ÆË¾÷ Â÷´Ü (¿µ¹®), ÀÚµ¿ ¾ç½Ä ä¿ì±â ¶Ç´Â ¸¶¿ì½º µ¿ÀÛ (¿µ¹®)¿¡ ´ëÇÑ Áö¿øÀ» Ãß°¡ µîÀ» ¼öÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀϹÝÀûÀ¸·Î µµ±¸ ¸ðÀ½ È®Àå (¿µ¹®)¿¡ BHO°¡ ÇÊ¿äÇÏ´Ù°í À߸ø Àνĵǰí ÀÖÁö¸¸ µµ±¸ ¸ðÀ½°ú ÇÔ²² BHO¸¦ »ç¿ëÇÏ¸é º¸´Ù dzºÎÇÑ »ç¿ëÀÚ È¯°æÀ» Á¦°øÇÒ ¼ö ÀÖ´Â °ÍÀº »ç½ÇÀÔ´Ï´Ù.

Âü°í BHO´Â ÃÖÁ¾ »ç¿ëÀÚ¿Í °³¹ßÀÚ ¸ðµÎ¿¡°Ô Æí¸®ÇÑ µµ±¸ÀÌÁö¸¸ BHO¿¡´Â ºê¶ó¿ìÀú¿Í À¥ ÄÜÅÙÃ÷¿¡ ´ëÇÑ »ó´çÇÑ ±ÇÇÑÀÌ ºÎ¿©µÇ¸ç °¨ÁöµÇÁö ¾Ê´Â °æ¿ì°¡ ¸¹±â ¶§¹®¿¡ »ç¿ëÀÚ´Â ½Å·ÚÇÒ ¼ö ÀÖ´Â °÷¿¡¼­¸¸ BHO¸¦ ¹Þ°í ¼³Ä¡Çϵµ·Ï ÃæºÐÇÑ ÁÖÀǸ¦ ±â¿ï¿©¾ß ÇÕ´Ï´Ù.

BHOÀÇ ¼ö¸íÀº »óÈ£ ÀÛ¿ëÇÏ´Â ºê¶ó¿ìÀú ÀνºÅϽºÀÇ ¼ö¸í°ú µ¿ÀÏÇÕ´Ï´Ù. Áï, Internet Explorer 6 ¹× ÀÌÀü ¹öÀü¿¡¼­´Â °¢°¢ÀÇ »õ·Î¿î ÃÖ»óÀ§ ⸶´Ù »õ·Î¿î BHO°¡ »ý¼º ¹× ¼Ò¸êµÇÁö¸¸ Internet Explorer 7¿¡¼­´Â °¢ ÅǸ¶´Ù »õ·Î¿î BHO°¡ »ý¼ºµÇ°í ¼Ò¸êµË´Ï´Ù. BHO´Â WebBrowser ÄÁÆ®·Ñ (¿µ¹®)À» È£½ºÆÃÇÏ´Â ´Ù¸¥ ÀÀ¿ë ÇÁ·Î±×·¥À̳ª HTML ´ëÈ­ »óÀÚ¿Í °°Àº â¿¡¼­´Â ·ÎµåµÇÁö ¾Ê½À´Ï´Ù.

BHO »ç¿ëÀ» À§ÇÑ ÁÖ¿ä ¿ä±¸ »çÇ×Àº IObjectWithSite (¿µ¹®) ÀÎÅÍÆäÀ̽º ±¸ÇöÇÏ´Â °ÍÀÔ´Ï´Ù. ÀÌ ÀÎÅÍÆäÀ̽º´Â Internet Explorer¿ÍÀÇ Ãʱâ Åë½ÅÀ» ¿øÈ°È÷ Çϰí ÇØÁ¦µÇ±â Àü¿¡ À̸¦ BHO¿¡ ¾Ë¸®´Â SetSite¶ó´Â ¸Þ¼­µå¸¦ °ø°³ÇÕ´Ï´Ù. ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϰí BHOÀÇ CLSID¸¦ ·¹Áö½ºÆ®¸®¿¡ Ãß°¡ÇÏ¿© ´Ü¼ø ºê¶ó¿ìÀú È®ÀåÀ» ¸¸µé¾î º¸°Ú½À´Ï´Ù.

ÀÌÁ¦ ½ÃÀÛÇÕ´Ï´Ù.


ÇÁ·ÎÁ§Æ® ¼³Á¤

Microsoft Visual Studio 2005¿¡¼­ BHO ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé·Á¸é
  1. ÆÄÀÏ ¸Þ´º¿¡¼­ »õ ÇÁ·ÎÁ§Æ®...¸¦ Ŭ¸¯ÇÕ´Ï´Ù.
    »õ ÇÁ·ÎÁ§Æ® ´ëÈ­ »óÀÚ°¡ ³ªÅ¸³³´Ï´Ù. ÀÌ ´ëÈ­ »óÀÚ¿¡´Â Visual Studio¿¡¼­ ¸¸µé ¼ö ÀÖ´Â ÀÀ¿ë ÇÁ·Î±×·¥ À¯ÇüÀÌ ³ª¿­µË´Ï´Ù.
  2. Visual C++ ³ëµå ¾Æ·¡¿¡ "ATL"ÀÌ ¼±ÅõǾî ÀÖÁö ¾ÊÀ¸¸é ¼±ÅÃÇÑ ´ÙÀ½ Visual C++ ÇÁ·ÎÁ§Æ® À¯Çü¿¡¼­ "ATL ÇÁ·ÎÁ§Æ®"¸¦ ¼±ÅÃÇÕ´Ï´Ù. ÇÁ·ÎÁ§Æ®ÀÇ À̸§À» "HelloWorld"·Î ÁöÁ¤ÇÏ°í ±âº» À§Ä¡¸¦ »ç¿ëÇÕ´Ï´Ù. È®ÀÎÀ» Ŭ¸¯ÇÕ´Ï´Ù.
  3. ATL ÇÁ·ÎÁ§Æ® ¸¶¹ý»ç¿¡¼­ ¼­¹ö À¯ÇüÀÌ "µ¿Àû ¿¬°á ¶óÀ̺귯¸®(DLL)"ÀÎÁö È®ÀÎÇÏ°í ¸¶Ä§À» Ŭ¸¯ÇÕ´Ï´Ù.

DLLÀ» À§ÇÑ ±âº» ±¸¼º ¿ä¼Ò°¡ »ý¼ºµË´Ï´Ù. ÀÌÁ¦ BHO¸¦ ±¸ÇöÇÏ´Â COM °³Ã¼¸¦ Ãß°¡ÇÕ´Ï´Ù.

  1. ¼Ö·ç¼Ç Ž»ö±â ÆÐ³Î¿¡¼­ ÇÁ·ÎÁ§Æ®¸¦ ¸¶¿ì½º ¿À¸¥ÂÊ ´ÜÃ߷ΠŬ¸¯Çϰí Ãß°¡ ÇÏÀ§ ¸Þ´º¿¡¼­ Ŭ·¡½º...¸¦ ¼±ÅÃÇÕ´Ï´Ù.
  2. "ATL ´Ü¼ø °³Ã¼"¸¦ ¼±ÅÃÇϰí Ãß°¡¸¦ Ŭ¸¯ÇÕ´Ï´Ù.
    ATL ´Ü¼ø °³Ã¼ ¸¶¹ý»ç°¡ ³ªÅ¸³³´Ï´Ù.
  3. ATL ´Ü¼ø °³Ã¼ ¸¶¹ý»çÀÇ À̸§¿¡ ¾à½Ä À̸§À¸·Î "HelloWorldBHO"¸¦ ÀÔ·ÂÇÕ´Ï´Ù.
    ³ª¸ÓÁö À̸§Àº ÀÚµ¿À¸·Î ä¿öÁý´Ï´Ù.
  4. ATL ´Ü¼ø °³Ã¼ ¸¶¹ý»çÀÇ ¿É¼Ç¿¡¼­ ½º·¹µù ¸ðµ¨¿¡´Â "¾ÆÆÄÆ®", ÁýÇÕü¿¡´Â "¾Æ´Ï¿ä", ÀÎÅÍÆäÀ̽º Çü½Ä¿¡´Â "ÀÌÁß", ±×¸®°í Áö¿ø¿¡´Â "IObjectWithSite"¸¦ °¢°¢ ¼±ÅÃÇÕ´Ï´Ù.

    ATL ´Ü¼ø °³Ã¼ ¸¶¹ý»ç ¿É¼Ç
  5. ¸¶Ä§À» Ŭ¸¯ÇÕ´Ï´Ù.

ÀÌ ÇÁ·ÎÁ§Æ®ÀÇ ÀϺηΠ´ÙÀ½°ú °°Àº ÆÄÀÏÀÌ »ý¼ºµË´Ï´Ù.

  • HelloWorldBHO.h - ÀÌ Çì´õ ÆÄÀÏ¿¡´Â BHO¿¡ ´ëÇÑ Å¬·¡½º Á¤Àǰ¡ µé¾î ÀÖ½À´Ï´Ù.
  • HelloWorldBHO.cpp - ÀÌ ¼Ò½º ÆÄÀÏÀº ÇÁ·ÎÁ§Æ®ÀÇ ÁÖ ÆÄÀÏÀ̸ç COM °³Ã¼°¡ µé¾î ÀÖ½À´Ï´Ù.
  • HelloWorld.cpp - ÀÌ ¼Ò½º ÆÄÀÏÀº DLLÀ» ÅëÇØ COM °³Ã¼¸¦ Á¦°øÇÏ´Â ³»º¸³»±â¸¦ ±¸ÇöÇÕ´Ï´Ù.
  • HelloWorld.idl - ÀÌ ¼Ò½º ÆÄÀÏÀº »ç¿ëÀÚ ÁöÁ¤ COM ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÏ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. º» ±â»ç¿¡¼­´Â ÀÌ ÆÄÀÏÀ» º¯°æÇÏÁö ¾Ê½À´Ï´Ù.
  • HelloWorld.rgs - ÀÌ ¸®¼Ò½º ÆÄÀÏ¿¡´Â DLL µî·Ï ¹× µî·Ï Ãë¼Ò ½Ã¿¡ ÀÛ¼º ¹× Á¦°ÅµÇ´Â ·¹Áö½ºÆ®¸® ۰¡ µé¾î ÀÖ½À´Ï´Ù.

±âº» »çÇ× ±¸Çö

ATL ÇÁ·ÎÁ§Æ® ¸¶¹ý»ç´Â SetSiteÀÇ ±âº» ±¸ÇöÀ» Á¦°øÇÕ´Ï´Ù. IObjectWithSite ÀÎÅÍÆäÀ̽º °è¾à¿¡´Â Çʿ信 µû¶ó ¹Ýº¹Çؼ­ ÀÌ ¸Þ¼­µå¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ ¾Ï½ÃµÇ¾î ÀÖÁö¸¸ Internet Explorer¿¡¼­´Â ¿¬°áÀ» ¼³Á¤ÇÒ ¶§¿Í ºê¶ó¿ìÀú¸¦ Á¾·áÇÒ ¶§ Á¤È®ÇÏ°Ô µÎ ¹ø ÀÌ ¸Þ¼­µå¸¦ È£ÃâÇÕ´Ï´Ù. ƯÈ÷ ÀÌ ¿¹¿¡¼­ BHOÀÇ SetSite ±¸Çö¿¡¼­´Â ´ÙÀ½°ú °°Àº ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù.

  • »çÀÌÆ®¿¡ ´ëÇÑ ÂüÁ¶¸¦ ÀúÀåÇÕ´Ï´Ù. ÃʱâÈ­ÇÏ´Â µ¿¾È ºê¶ó¿ìÀú´Â IUnknown Æ÷ÀÎÅ͸¦ ÃÖ»óÀ§ WebBrowser ÄÁÆ®·Ñ·Î Àü´ÞÇϰí BHO´Â ÀÌ¿¡ ´ëÇÑ ÂüÁ¶¸¦ Àü¿ë ¸â¹ö º¯¼ö¿¡ ÀúÀåÇÕ´Ï´Ù.
  • ÇöÀç À¯ÁöÇϰí ÀÖ´Â »çÀÌÆ® Æ÷ÀÎÅ͸¦ ÇØÁ¦ÇÕ´Ï´Ù. Internet Explorer¿¡¼­ NULLÀ» Àü´ÞÇϸé BHO´Â ¸ðµç ÀÎÅÍÆäÀ̽º ÂüÁ¶¸¦ ÇØÁ¦ÇÏ°í ºê¶ó¿ìÀú¿¡¼­ ¿¬°áÀ» ²÷¾î¾ß ÇÕ´Ï´Ù.

SetSite¸¦ ó¸®ÇÏ´Â °úÁ¤¿¡ BHO´Â Çʿ信 µû¶ó ´Ù¸¥ ÃʱâÈ­ ¹× ÃʱâÈ­ Ãë¼Ò ÀÛ¾÷À» ¼öÇàÇØ¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î ºê¶ó¿ìÀú À̺¥Æ®¸¦ ¼ö½ÅÇÒ ¼ö ÀÖµµ·Ï ºê¶ó¿ìÀú¿¡ ´ëÇÑ ¿¬°á ÁöÁ¡À» ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.


HelloWorldBHO.h

Visual Studio ¼Ö·ç¼Ç Ž»ö±â¿¡¼­ HelloWorldBHO.h¸¦ µÎ ¹ø Ŭ¸¯ÇÏ¿© ¿±´Ï´Ù.

¸ÕÀú shlguid.h¸¦ Æ÷ÇÔÇÕ´Ï´Ù. ÀÌ ÆÄÀÏÀº IWebBrowser2 (¿µ¹®) ¹× ÇÁ·ÎÁ§Æ®¿¡¼­ ³ªÁß¿¡ »ç¿ëµÇ´Â À̺¥Æ®ÀÇ ÀÎÅÍÆäÀ̽º ½Äº°ÀÚ¸¦ Á¤ÀÇÇÕ´Ï´Ù.

#include <shlguid.h>     // IID_IWebBrowser2, DIID_DWebBrowserEvents2 µî(Âü°í: ÇÁ·Î±×·¡¸Ó ÁÖ¼®Àº ¿¹Á¦ ÇÁ·Î±×·¥ ÆÄÀÏ¿¡´Â ¿µ¹®À¸·Î Á¦°øµÇ¸ç ±â»ç¿¡´Â ÀÌÇØ¸¦ µ½±â À§ÇØ ¹ø¿ª¹®À¸·Î Á¦°øµË´Ï´Ù.)

´ÙÀ½À¸·Î CHelloWorldBHO Ŭ·¡½ºÀÇ °ø¿ë ¼½¼Ç¿¡¼­ SetSite¸¦ ¼±¾ðÇÕ´Ï´Ù.

STDMETHOD(SetSite)(IUnknown *pUnkSite);

STDMETHOD ¸ÅÅ©·Î´Â ¸Þ¼­µå¸¦ °¡»óÀ¸·Î Ç¥½ÃÇÏ°í °ø¿ë COM ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ ¿Ã¹Ù¸¥ È£Ãâ ±ÔÄ¢À» °¡Áú ¼ö ÀÖµµ·Ï ÇÏ´Â ATL ±ÔÄ¢ÀÔ´Ï´Ù. ÀÌ ¸ÅÅ©·Î´Â COM ÀÎÅÍÆäÀ̽º¸¦ Ŭ·¡½º¿¡ ÀÖÀ» ¼ö ÀÖ´Â ´Ù¸¥ °ø¿ë ¸Þ¼­µå¿Í ±¸ºÐÇÏ´Â µ¥ µµ¿òÀÌ µË´Ï´Ù. STDMETHODIMP ¸ÅÅ©·Î´Â ¸â¹ö ¸Þ¼­µå¸¦ ±¸ÇöÇÒ ¶§ ºñ½ÁÇÏ°Ô »ç¿ëµË´Ï´Ù.

¸¶Áö¸·À¸·Î Ŭ·¡½º ¼±¾ðÀÇ Àü¿ë ¼½¼Ç¿¡¼­ ºê¶ó¿ìÀú »çÀÌÆ®¸¦ ÀúÀåÇÒ ¸â¹ö º¯¼ö¸¦ ¼±¾ðÇÕ´Ï´Ù.

private:
    CComPtr<IWebBrowser2>  m_spWebBrowser;

HelloWorldBHO.cpp

ÀÌÁ¦ HelloWorldBHO.cpp·Î ÀüȯÇϰí SetSite¿¡ ´ÙÀ½ Äڵ带 »ðÀÔÇÕ´Ï´Ù.

STDMETHODIMP CHelloWorldBHO::SetSite(IUnknown* pUnkSite)
{
    if (pUnkSite != NULL)
    {
        // IWebBrowser2¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ij½ÌÇÕ´Ï´Ù.
        pUnkSite->QueryInterface(IID_IWebBrowser2, (void**)&m_spWebBrowser);
    }
    else
    {
        // ij½ÌµÈ Æ÷ÀÎÅÍ ¹× ´Ù¸¥ ¸®¼Ò½º¸¦ ¿©±â¿¡¼­ ÇØÁ¦ÇÕ´Ï´Ù.
        m_spWebBrowser.Release();
    }

    // ±âº» Ŭ·¡½º ±¸ÇöÀ» ¹ÝȯÇÕ´Ï´Ù.
    return IObjectWithSiteImpl<CHelloWorldBHO>::SetSite(pUnkSite);
}

ÃʱâÈ­ÇÏ´Â µ¿¾È ºê¶ó¿ìÀú´Â ÇØ´ç ÃÖ»óÀ§ IWebBrowser2 ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ ÂüÁ¶¸¦ Àü´ÞÇϸç Äڵ忡¼­ ÀÌ ÂüÁ¶¸¦ ij½ÌÇÕ´Ï´Ù. ÃʱâÈ­¸¦ Ãë¼ÒÇÏ´Â µ¿¾È ºê¶ó¿ìÀú°¡ NULLÀ» Àü´ÞÇÕ´Ï´Ù. ¸Þ¸ð¸® ´©¼ö¸¦ ¹æÁöÇÏ°í ¼øÈ¯ ÂüÁ¶°¡ ¹ß»ýµÇÁö ¾Ê°Ô ÇÏ·Á¸é À̶§ ¸ðµç Æ÷ÀÎÅÍ¿Í ¸®¼Ò½º¸¦ ÇØÁ¦ÇÏ´Â °ÍÀÌ Áß¿äÇÕ´Ï´Ù. ¸¶Áö¸·À¸·Î ³ª¸ÓÁö ÀÎÅÍÆäÀ̽º °è¾àÀ» ÀÌÇàÇÒ ¼ö ÀÖµµ·Ï ±âº» Ŭ·¡½º ±¸ÇöÀ» È£ÃâÇÕ´Ï´Ù.


HelloWorld.cpp

DLLÀÌ ·ÎµåµÇ¸é ½Ã½ºÅÛÀº DLL_PROCESS_ATTACH ¾Ë¸²°ú ÇÔ²² DllMain ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. Internet Explorer´Â ´ÙÁß ½º·¹µùÀ» Ȱ¹ßÇÏ°Ô »ç¿ëÇϹǷΠDllMain¿¡ ´ëÇÑ ÀæÀº DLL_THREAD_ATTACH ¹× DLL_THREAD_DETACH ¾Ë¸²À¸·Î ÀÎÇØ È®Àå°ú ºê¶ó¿ìÀú ÇÁ·Î¼¼½ºÀÇ Àüü ¼º´ÉÀÌ ÀúÇ쵃 ¼ö ÀÖ½À´Ï´Ù. ÀÌ BHO¿¡´Â ½º·¹µå ¼öÁØ ÃßÀûÀÌ ÇÊ¿ä ¾øÀ¸¹Ç·Î DLL_PROCESS_ATTACH ¾Ë¸² ³»¿¡¼­ DisableThreadLibraryCalls (¿µ¹®)¸¦ È£ÃâÇÏ¿© »õ ½º·¹µå ¾Ë¸²À¸·Î ÀÎÇÑ ¿À¹öÇìµå°¡ ¹ß»ýÇÏÁö ¾Êµµ·Ï ÇÒ ¼ö ÀÖ½À´Ï´Ù.

HelloWorld.cpp¿¡¼­ ´ÙÀ½°ú °°ÀÌ DllMain ÇÔ¼ö Äڵ带 ÀÛ¼ºÇÕ´Ï´Ù.

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hInstance);
    }
    return _AtlModule.DllMain(dwReason, lpReserved); 
}

BHO µî·Ï

ÀÌÁ¦ ³²Àº ÀÏÀº ·¹Áö½ºÆ®¸®¿¡ BHOÀÇ CLSID¸¦ Ãß°¡ÇÏ´Â °ÍÀÔ´Ï´Ù. ÀÌ Ç׸ñÀº DLLÀ» ºê¶ó¿ìÀú µµ¿ì¹Ì °³Ã¼·Î Ç¥½ÃÇÏ¿© Internet Explorer°¡ ½ÃÀÛÇÒ ¶§ BHO¸¦ ·ÎµåÇϵµ·Ï ÇÕ´Ï´Ù. Visual Studio´Â ÇÁ·ÎÁ§Æ®¸¦ ºôµåÇÒ ¶§ CLSID¸¦ µî·ÏÇÒ ¼ö ÀÖ½À´Ï´Ù.

Âü°í Windows Vista¿¡¼­´Â ·¹Áö½ºÆ®¸®¿Í »óÈ£ ÀÛ¿ëÇϱâ À§ÇØ Visual Studio¿¡ »ó½ÂµÈ ±ÇÇÑÀÌ ÇÊ¿äÇÕ´Ï´Ù. ½ÃÀÛ ¸Þ´º¿¡¼­ Microsoft Visual Studio 2005¸¦ ¸¶¿ì½º ¿À¸¥ÂÊ ´ÜÃ߷ΠŬ¸¯ÇÏ°í °ü¸®ÀÚ·Î ½ÇÇàÀ» ¼±ÅÃÇÏ¿© °³¹ß ȯ°æÀ» ½ÃÀÛÇϵµ·Ï ÇϽʽÿÀ.

ÀÌ BHOÀÇ CLSID´Â HelloWorld.idlÀÇ ´ÙÀ½°ú °°Àº ÄÚµå ºí·Ï¿¡ ³ª¿Í ÀÖ½À´Ï´Ù.

    importlib("stdole2.tlb");
    [
        uuid(D2F7E1E3-C9DC-4349-B72C-D5A708D6DD77),
        helpstring("HelloWorldBHO Class")
    ]

ÀÌ ÆÄÀÏ¿¡´Â GUID°¡ ¼¼ °³ ÀÖÁö¸¸ ¿ì¸®¿¡°Ô ÇÊ¿äÇÑ °ÍÀº ¶óÀ̺귯¸®³ª ÀÎÅÍÆäÀ̽º IDÀÇ CLSID°¡ ¾Æ´Ñ classÀÇ CLSIDÀÔ´Ï´Ù.

ÀÚµ¿ µî·Ï BHO¸¦ ¸¸µé·Á¸é
  1. Visual StudioÀÇ ¼Ö·ç¼Ç Ž»ö±â¿¡¼­ HelloWorld.rgs¸¦ ¿±´Ï´Ù.
  2. ÆÄÀÏ ¸Ç ¾Æ·¡¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
    HKLM {
      NoRemove SOFTWARE {
        NoRemove Microsoft {   
          NoRemove Windows {
            NoRemove CurrentVersion {
              NoRemove Explorer {
                NoRemove 'Browser Helper Objects' {
                  ForceRemove '{D2F7E1E3-C9DC-4349-B72C-D5A708D6DD77}' = s 'HelloWorldBHO' {
                    val 'NoExplorer' = d '1'
                  }
                }
              }
            }
          }
        }
      }
    }
  3. À§¿¡¼­ ForceRemove ´ÙÀ½¿¡ ³ª¿À´Â GUID¸¦ HelloWorld.idl¿¡ ÀÖ´Â BHOÀÇ CLSID·Î ¹Ù²ß´Ï´Ù.
    Áß°ýÈ£´Â ¹Ù²ÙÁö ¸¶½Ê½Ã¿À.
  4. ÆÄÀÏÀ» ÀúÀåÇϰí F6 ۸¦ ´­·¯ ¼Ö·ç¼ÇÀ» ´Ù½Ã ºôµåÇÕ´Ï´Ù.
    Visual Studio¿¡¼­ °³Ã¼¸¦ ÀÚµ¿À¸·Î µî·ÏÇÕ´Ï´Ù.

NoRemove Ű¿öµå´Â BHO µî·ÏÀ» Ãë¼ÒÇÒ ¶§ ۸¦ »èÁ¦ÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù´Â °ÍÀ» ³ªÅ¸³À´Ï´Ù. ÀÌ Å°¿öµå¸¦ ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ºó ۰¡ Á¦°ÅµË´Ï´Ù. ForceRemove Ű¿öµå´Â ۸¦ ºñ·ÔÇÏ¿© Ű¿¡ Æ÷ÇÔµÈ ¸ðµç °ª°ú ÇÏÀ§ ۸¦ »èÁ¦ÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ³ªÅ¸³À´Ï´Ù. ForceRemove´Â ¶ÇÇÑ BHO¸¦ µî·ÏÇÒ ¶§ ۰¡ ÀÌ¹Ì ÀÖ´Â °æ¿ì ´Ù½Ã »ý¼ºµÇµµ·Ï ÇÕ´Ï´Ù.

ÀÌ BHO´Â Internet Explorer¿ëÀ¸·Î Ưº°È÷ ¼³°èµÇ¾ú±â ¶§¹®¿¡ Windows Explorer¿¡¼­ ·ÎµåÇÏÁö ¾Êµµ·Ï NoExplorer °ªÀ» ÁöÁ¤ÇÕ´Ï´Ù. Windows Explorer´Â NoExplorer Ç׸ñÀÌ ÀÖÀ¸¸é Ç׸ñÀÇ °ªÀ̳ª Çü½Ä¿¡ °ü°è¾øÀÌ BHO¸¦ ·ÎµåÇÏÁö ¾Ê½À´Ï´Ù.

ÀÌÁ¦ Visual Studio 2005ÀÇ ºôµå ¸Þ´º¿¡¼­ ¼Ö·ç¼ÇÀ» ºôµåÇÒ ¼ö ÀÖ½À´Ï´Ù.


Å×½ºÆ®

ºü¸¥ Å×½ºÆ®¸¦ À§ÇØ SetSite¿¡ Áß´ÜÁ¡À» ¼³Á¤Çϰí F5 ۸¦ ´­·¯ µð¹ö°Å¸¦ ½ÃÀÛÇÕ´Ï´Ù. µð¹ö±× ¼¼¼Ç¿¡ »ç¿ëÇÒ ½ÇÇà ÆÄÀÏ ´ëÈ­ »óÀÚ°¡ ³ªÅ¸³ª¸é "±âº» À¥ ºê¶ó¿ìÀú"¸¦ ¼±ÅÃÇϰí È®ÀÎÀ» Ŭ¸¯ÇÕ´Ï´Ù. Internet Explorer°¡ ±âº» ºê¶ó¿ìÀú°¡ ¾Æ´Ñ °æ¿ì ½ÇÇà ÆÄÀÏÀ» ãÀ» ¼ö ÀÖ½À´Ï´Ù.

Âü°í Windows Vista¿¡¼­´Â Internet ExplorerÀÇ º¸È£ ¸ðµå ±â´ÉÀÌ º°µµÀÇ ÇÁ·Î¼¼½º¸¦ ½ÃÀÛÇϰí Á¾·áÇϹǷΠµð¹ö±×°¡ ¾à°£ ´õ ¾î·Æ½À´Ï´Ù. ÇöÀç ¼¼¼Ç¿¡¼­ º¸È£ ¸ðµå¸¦ ÇØÁ¦ÇÏ·Á¸é Visual Studio¿Í °°Àº °ü¸® ÇÁ·Î¼¼½º¿¡¼­ ºê¶ó¿ìÀú¸¦ ½ÃÀÛÇϰųª ·ÎÄà HTML ÆÄÀÏÀ» ¸¸µé°í Internet Explorer¿¡ ´ëÇÑ ¸í·ÉÁÙ ¸Å°³ º¯¼ö¿¡¼­ ÆÄÀÏÀ» ÁöÁ¤ÇÏ´Â µÎ °¡Áö ¼Õ½¬¿î ¹æ¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

ºê¶ó¿ìÀú´Â ½ÃÀÛÇÒ ¶§ BHO¿ë DLLÀ» ·ÎµåÇÕ´Ï´Ù. Áß´ÜÁ¡¿¡ µµ´ÞÇϸé pUnkSite ¸Å°³ º¯¼ö°¡ ¼³Á¤µÇ¾î ÀÖ´ÂÁö È®ÀÎÇÕ´Ï´Ù. F5 ۸¦ ´Ù½Ã ´­·¯ Ȩ ÆäÀÌÁö¸¦ °è¼ÓÇØ¼­ ·ÎµåÇÕ´Ï´Ù.

ºê¶ó¿ìÀú¸¦ ´Ý°í SetSite°¡ NULLÀ» »ç¿ëÇÏ¿© ´Ù½Ã È£ÃâµÇ´ÂÁö È®ÀÎÇÕ´Ï´Ù.


À̺¥Æ®¿¡ ÀÀ´ä

ÀÌÁ¦ Internet Explorer¿¡¼­ BHO¸¦ ·ÎµåÇÏ¿© ½ÇÇàÇÒ ¼ö ÀÖÀ½À» È®ÀÎÇÏ¿´À¸¹Ç·Î ´ÙÀ½Àº ºê¶ó¿ìÀú À̺¥Æ®¿¡ ¹ÝÀÀÇϵµ·Ï BHO¸¦ È®ÀåÇØ º¸°Ú½À´Ï´Ù. ÀÌ ¼½¼Ç¿¡¼­´Â ATLÀ» »ç¿ëÇÏ¿© ÆäÀÌÁö°¡ ·ÎµåµÈ ÈÄ¿¡ ¸Þ½ÃÁö »óÀÚ¸¦ Ç¥½ÃÇÏ´Â DocumentComplete (¿µ¹®)¿¡ ´ëÇÑ À̺¥Æ® 󸮱⸦ ±¸ÇöÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÕ´Ï´Ù.

BHO´Â À̺¥Æ®¿¡ ´ëÇÑ ¾Ë¸²À» ¹Þ±â À§ÇØ ºê¶ó¿ìÀú¿Í ¿¬°á ÁöÁ¡À» ¼³Á¤Çϸç ÀÌ·¯ÇÑ À̺¥Æ®¿¡ ÀÀ´äÇÒ ¼ö ÀÖµµ·Ï IDispatch (¿µ¹®)¸¦ ±¸ÇöÇÕ´Ï´Ù. DocumentComplete¿¡ ´ëÇÑ ¼³¸í¼­¿¡ µû¸£¸é À̺¥Æ®¿¡´Â pDisp(IDispatch¿¡ ´ëÇÑ Æ÷ÀÎÅÍ) ¹× pUrlÀ̶ó´Â ¸Å°³ º¯¼ö µÎ °³°¡ ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ¸Å°³ º¯¼ö´Â À̺¥Æ®ÀÇ ÀϺηΠIDispatch::Invoke¿¡ Àü´ÞµË´Ï´Ù. ±×·¯³ª À̺¥Æ® ¸Å°³ º¯¼ö¸¦ Á÷Á¢ ó¸®ÇÏ´Â °ÍÀº ¾î·Æ°í ¿À·ù°¡ ¹ß»ýÇϱ⠽¬¿î ÀÛ¾÷ÀÔ´Ï´Ù. ´ÙÇེ·´°Ôµµ ATLÀº À̺¥Æ® ó¸® ³í¸®¸¦ ´Ü¼øÈ­ÇÏ´Â µ¥ µµ¿òÀÌ µÇ´Â ±âº» ±¸ÇöÀ» Á¦°øÇÕ´Ï´Ù.


HelloWorldBHO.h

HelloWorldBHO.h´Â ºê¶ó¿ìÀú À̺¥Æ®ÀÇ ¹ß¼Û ID¸¦ Á¤ÀÇÇÏ´Â exdispid.h¸¦ Æ÷ÇÔÇÏ´Â °ÍÀ¸·Î ½ÃÀÛÇÕ´Ï´Ù.

#include <exdispid.h> // DISPID_DOCUMENTCOMPLETE µî

´ÙÀ½À¸·Î À̺¥Æ® 󸮸¦ À§ÇÑ InvokeÀÇ ½±°í ¾ÈÀüÇÑ ´ë¾ÈÀÌ µÇ´Â IDispEventImpl ±âº» Ŭ·¡½º¿¡¼­ ÆÄ»ý½Ãŵ´Ï´Ù. IDispEventImplÀº À̺¥Æ® ½ÌÅ© ¸Ê°ú ÇÔ²² ÀÛ¾÷ÇÏ¿© ÀûÀýÇÑ Ã³¸®±â ÇÔ¼ö·Î À̺¥Æ®¸¦ ¶ó¿ìÆÃÇÕ´Ï´Ù. ´ÙÀ½ Ŭ·¡½º Á¤ÀÇ(°­Á¶ Ç¥½ÃµÊ)¸¦ »ç¿ëÇÏ¿© DWebBrowserEvents2 ÀÎÅÍÆäÀ̽º¿¡ ÀÇÇØ Á¤ÀǵǴ À̺¥Æ®¸¦ ó¸®Çϵµ·Ï ÁöÁ¤ÇÕ´Ï´Ù.

class ATL_NO_VTABLE CHelloWorldBHO :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
    public IObjectWithSiteImpl<CHelloWorldBHO>,
    public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_TestBho1Lib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>

´ÙÀ½À¸·Î »õ OnDocumentComplete À̺¥Æ® 󸮱⠸޼­µå·Î À̺¥Æ®¸¦ ¶ó¿ìÆÃÇÏ´Â ATL ¸ÅÅ©·Î¸¦ Ãß°¡ÇÕ´Ï´Ù. ÀÌ ¸Þ¼­µå´Â DocumentComplete À̺¥Æ®¿¡¼­ Á¤ÀÇÇÑ °Í°ú µ¿ÀÏÇÑ Àμö¸¦ µ¿ÀÏÇÑ ¼ø¼­·Î ¹Þ½À´Ï´Ù. Ŭ·¡½ºÀÇ °ø¿ë ¼½¼Ç¿¡ ´ÙÀ½ Äڵ带 ³Ö½À´Ï´Ù.

BEGIN_SINK_MAP(CHelloWorldBHO)
    SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
END_SINK_MAP()

    // DWebBrowserEvents2
 void STDMETHODCALLTYPE OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL); 

SINK_ENTRY_EX ¸ÅÅ©·Î¿¡ Á¦°øµÈ ¼ö(1)´Â IDispEventImpl Ŭ·¡½º Á¤ÀÇÀÇ Ã¹ ¹øÂ° ¸Å°³ º¯¼ö¸¦ ³ªÅ¸³»¸ç ÇÊ¿äÇÑ °æ¿ì ´Ù¸¥ ÀÎÅÍÆäÀ̽º¿¡¼­ À̺¥Æ®¸¦ ±¸ºÐÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. À̺¥Æ® 󸮱⿡¼­´Â °ªÀ» ¹ÝȯÇÒ ¼ö ¾ø´Ù´Â »ç½Çµµ ±â¾ïÇØ¾ß ÇÕ´Ï´Ù. ±×·¯³ª Internet Explorer´Â Invoke¿¡¼­ ¹ÝȯÇÏ´Â °ªÀ» ¹«½ÃÇϹǷΠ°ü°è´Â ¾ø½À´Ï´Ù.

¸¶Áö¸·À¸·Î °³Ã¼°¡ ºê¶ó¿ìÀú¿Í ¿¬°áÀ» ¼³Á¤Çß´ÂÁö ¿©ºÎ¸¦ ÃßÀûÇÏ´Â Àü¿ë ¸â¹ö º¯¼ö¸¦ Ãß°¡ÇÕ´Ï´Ù.

private:
    BOOL m_fAdvised; 

HelloWorldBHO.cpp

À̺¥Æ® ¸ÊÀ» ÅëÇØ ºê¶ó¿ìÀú¿¡ À̺¥Æ® 󸮱⸦ ¿¬°áÇÏ·Á¸é SetSite¸¦ ó¸®ÇÏ´Â µ¿¾È DispEventAdvise (¿µ¹®)¸¦ È£ÃâÇÕ´Ï´Ù. ¸¶Âù°¡Áö·Î ¿¬°áÀ» ²÷À¸·Á¸é DispEventUnadvise (¿µ¹®)¸¦ »ç¿ëÇÕ´Ï´Ù.

´ÙÀ½Àº SetSiteÀÇ »õ ±¸ÇöÀÔ´Ï´Ù.

STDMETHODIMP CHelloWorldBHO::SetSite(IUnknown* pUnkSite)
{
    if (pUnkSite != NULL)
    {
        // IWebBrowser2¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ij½ÌÇÕ´Ï´Ù.
        HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser);
        if (SUCCEEDED(hr))
        {
            // DWebBrowserEvents2¿¡¼­ À̺¥Æ® ½ÌÅ©¸¦ µî·ÏÇÕ´Ï´Ù.
            hr = DispEventAdvise(m_spWebBrowser);
            if (SUCCEEDED(hr))
            {
                m_fAdvised = TRUE;
            }
        }
    }
    else
    {
        // À̺¥Æ® ½ÌÅ© µî·ÏÀ» Ãë¼ÒÇÕ´Ï´Ù.
        if (m_fAdvised)
        {
            DispEventUnadvise(m_spWebBrowser);
            m_fAdvised = FALSE;
        }

        // ij½ÌµÈ Æ÷ÀÎÅÍ ¹× ´Ù¸¥ ¸®¼Ò½º¸¦ ¿©±â¿¡¼­ ÇØÁ¦ÇÕ´Ï´Ù.
        m_spWebBrowser.Release();
    }

    // ±âº» Ŭ·¡½º ±¸ÇöÀ» È£ÃâÇÕ´Ï´Ù.
    return IObjectWithSiteImpl<CHelloWorldBHO>::SetSite(pUnkSite);
}

¸¶Áö¸·À¸·Î °£´ÜÇÑ OnDocumentComplete À̺¥Æ® 󸮱⸦ Ãß°¡ÇÕ´Ï´Ù.

void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
{
    // »çÀÌÆ®¿¡¼­ ÃÖ»óÀ§ âÀ» °Ë»öÇÕ´Ï´Ù.
    HWND hwnd;
    HRESULT hr = m_spWebBrowser->get_HWND((LONG_PTR*)&hwnd);
    if (SUCCEEDED(hr))
    {
        // ÆäÀÌÁö°¡ ·ÎµåµÇ¸é ¸Þ½ÃÁö »óÀÚ¸¦ Ãâ·ÂÇÕ´Ï´Ù.
        MessageBox(hwnd, L"Hello World!", L"BHO", MB_OK);
    }
}

¸Þ½ÃÁö »óÀÚ¿¡¼­´Â ÇØ´ç ¸Å°³ º¯¼ö¿¡ ´Ü¼øÈ÷ NULLÀ» Àü´ÞÇÏÁö ¾Ê°í »çÀÌÆ®ÀÇ ÃÖ»óÀ§ âÀ» ºÎ¸ð âÀ¸·Î »ç¿ëÇÕ´Ï´Ù. Internet Explorer 6¿¡¼­ NULL ºÎ¸ð âÀº ÀÀ¿ë ÇÁ·Î±×·¥À» Â÷´ÜÇÏÁö ¾ÊÀ¸¹Ç·Î ¸Þ½ÃÁö »óÀÚ¿¡¼­ »ç¿ëÀÚ ÀÔ·ÂÀ» ´ë±âÇÏ´Â µ¿¾È »ç¿ëÀÚ°¡ °è¼ÓÇØ¼­ ºê¶ó¿ìÀú¿Í »óÈ£ ÀÛ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶§·Î´Â ÀÌ·Î ÀÎÇØ ºê¶ó¿ìÀú°¡ Á¤ÁöÇϰųª Ãæµ¹ÇÒ ¼ö ÀÖ½À´Ï´Ù. µå¹® °æ¿ìÀ̱â´Â ÇÏÁö¸¸ BHO°¡ UI¸¦ Ç¥½ÃÇØ¾ß ÇÏ´Â °æ¿ìµµ ÀÖÀ¸¹Ç·Î ºÎ¸ð â¿¡ ´ëÇÑ ÇÚµéÀ» ÁöÁ¤ÇÏ¿© Ç×»ó ¸Þ½ÃÁö »óÀÚ°¡ ÀÀ¿ë ÇÁ·Î±×·¥ ¸ð´ÞÀÌ µÇµµ·Ï ÇØ¾ß ÇÕ´Ï´Ù.


´Ù¸¥ Å×½ºÆ® ÇØº¸±â

F5 ۸¦ ´­·¯ Internet Explorer¸¦ ´Ù½Ã ½ÃÀÛÇÕ´Ï´Ù. ¹®¼­°¡ ·ÎµåµÇ¸é BHO°¡ ´ÙÀ½ ¸Þ½ÃÁö¸¦ Ç¥½ÃÇÕ´Ï´Ù.

"Hello World!" ¸Þ½ÃÁö »óÀÚ

Ž»öÀ» °è¼ÓÇϸ鼭 ¸Þ½ÃÁö »óÀÚ°¡ ¾ðÁ¦ ¾ó¸¶³ª ÀÚÁÖ ³ªÅ¸³ª´ÂÁö °üÂûÇÕ´Ï´Ù. BHO ¾Ë¸²Àº ÆäÀÌÁö°¡ ·ÎµåµÉ ¶§»Ó ¾Æ´Ï¶ó µÚ·Î ´ÜÃ߸¦ Ŭ¸¯ÇÏ¿© ÆäÀÌÁö¸¦ ´Ù½Ã ·ÎµåÇÏ´Â °æ¿ì¿¡µµ Ç¥½ÃµË´Ï´Ù. ±×·¯³ª »õ·Î °íħ ´ÜÃ߸¦ Ŭ¸¯ÇÒ ¶§´Â Ç¥½ÃµÇÁö ¾Ê½À´Ï´Ù. Internet Explorer 7¿¡¼­´Â »õ ÅǸ¶´Ù ¸Þ½ÃÁö »óÀÚ°¡ Ç¥½ÃµË´Ï´Ù.

À̺¥Æ®´Â ÆäÀÌÁö¸¦ ´Ù¿î·ÎµåÇÏ°í ±¸¹® ºÐ¼®À» ¸¶Ä£ ÈÄ window.onload (¿µ¹®) À̺¥Æ®°¡ Æ®¸®°ÅµÇ±â Àü¿¡ ¹ß»ýÇÕ´Ï´Ù. ÇÁ·¹ÀÓÀÌ ¿©·¯ °³ ÀÖ´Â °æ¿ì À̺¥Æ®°¡ ¿©·¯ ¹ø ¹ß»ýÇÏ°í ¸¶Áö¸·¿¡ ÃÖ»óÀ§ ÇÁ·¹ÀÓ À̺¥Æ®°¡ ¹ß»ýÇÕ´Ï´Ù. ´ÙÀ½ Äڵ忡¼­´Â À̺¥Æ®ÀÇ pDisp ¸Å°³ º¯¼ö¿¡ Àü´ÞµÈ °³Ã¼¿Í SetSite¿¡ ij½ÌµÈ ÃÖ»óÀ§ ºê¶ó¿ìÀú¸¦ ºñ±³ÇÏ¿© ÀÏ·ÃÀÇ ÃÖÁ¾ À̺¥Æ®¸¦ °Ë»öÇß½À´Ï´Ù.


DOM Á¶ÀÛ

´ÙÀ½ JavaScript ÄÚµå´Â DOMÀÇ ±âº» Á¶ÀÛÀ» º¸¿© ÁÝ´Ï´Ù. ÀÌ Äڵ忡¼­´Â À̹ÌÁöÀÇ ½ºÅ¸ÀÏ °³Ã¼ÀÇ display (¿µ¹®) Ư¼ºÀ» "none"À¸·Î ¼³Á¤ÇÏ¿© À¥ ÆäÀÌÁö¿¡¼­ À̹ÌÁö¸¦ °¨Ãä´Ï´Ù.
function RemoveImages(doc)
{
    var images = doc.images;
    if (images != null)
    {
        for (var i = 0; i < images.length; i++) 
        {
            var img = images.item(i);
            img.style.display = "none";
        }
    }
}

¸¶Áö¸· ¼½¼Ç¿¡¼­´Â C++·Î ÀÌ ±âº» ·ÎÁ÷À» ±¸ÇöÇÏ´Â ¹æ¹ýÀ» º¸¿© ÁÝ´Ï´Ù.


HelloWorldBHO.h

¿ì¼± HelloWorldBHO.h¸¦ ¿­°í mshtml.h¸¦ Æ÷ÇÔÇÕ´Ï´Ù. ÀÌ Çì´õ ÆÄÀÏÀº DOMÀ» »ç¿ëÇϱâ À§ÇØ ÇÊ¿äÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÕ´Ï´Ù.

#include <mshtml.h>         // DOM ÀÎÅÍÆäÀ̽º

´ÙÀ½À¸·Î À§ÀÇ JavaScript C++ ±¸ÇöÀ» Æ÷ÇÔÇϵµ·Ï Àü¿ë ¸â¹ö ¸Þ¼­µå¸¦ Á¤ÀÇÇÕ´Ï´Ù.

private:
    void RemoveImages(IHTMLDocument2 *pDocument);

HelloWorldBHO.cpp

OnDocumentComplete À̺¥Æ® 󸮱â´Â ÀÌÁ¦ ´ÙÀ½°ú °°Àº µÎ °¡Áö »õ ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù. ù ¹øÂ°´Â ij½ÌÇÑ WebBrowser Æ÷ÀÎÅ͸¦ À̺¥Æ®°¡ ¹ß»ýÇÑ °³Ã¼¿Í ºñ±³ÇÏ´Â °ÍÀÌ¸ç µÎ Ç׸ñÀÌ °°À¸¸é ÇØ´ç À̺¥Æ®´Â ÃÖ»óÀ§ â¿¡ ´ëÇÑ À̺¥Æ®ÀÌ¸ç ¹®¼­´Â ¿ÏÀüÈ÷ ·ÎµåµÈ °ÍÀÔ´Ï´Ù. µÎ ¹øÂ°´Â document (¿µ¹®) °³Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °Ë»öÇϰí RemoveImages·Î Àü´ÞÇÏ´Â °ÍÀÔ´Ï´Ù.

void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
{
    HRESULT hr = S_OK;

    // IWebBrowser2 ÀÎÅÍÆäÀ̽º¿¡ ´ëÇØ Äõ¸®ÇÕ´Ï´Ù.
    CComQIPtr<IWebBrowser2> spTempWebBrowser = pDisp;

    // À̺¥Æ®°¡ ÃÖ»óÀ§ â°ú ¿¬°áµÇ¾î ÀÖ½À´Ï±î?
    if (spTempWebBrowser && m_spWebBrowser &&
        m_spWebBrowser.IsEqualObject(spTempWebBrowser))
    {
        // ºê¶ó¿ìÀú¿¡¼­ ÇöÀç ¹®¼­ °³Ã¼¸¦ ¾ò½À´Ï´Ù...
        CComPtr<IDispatch> spDispDoc;
        hr = m_spWebBrowser->get_Document(&spDispDoc);
        if (SUCCEEDED(hr))
        {
            // ...±×¸®°í HTML ¹®¼­¿¡ ´ëÇØ Äõ¸®ÇÕ´Ï´Ù.
            CComQIPtr<IHTMLDocument2> spHTMLDoc = spDispDoc;
            if (spHTMLDoc != NULL)
            {
                // ¸¶Áö¸·À¸·Î À̹ÌÁö¸¦ Á¦°ÅÇÕ´Ï´Ù.
                RemoveImages(spHTMLDoc);
            }
        }
    }
}

pDispÀÇ IDispatch Æ÷ÀÎÅÍ¿¡´Â ¹®¼­°¡ ·ÎµåµÈ âÀ̳ª ÇÁ·¹ÀÓÀÇ IWebBrowser2 ÀÎÅÍÆäÀ̽º°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ÀÌ °ªÀ» QueryInterface¸¦ ÀÚµ¿À¸·Î ¼öÇàÇÏ´Â CComQIPtr Ŭ·¡½º º¯¼ö·Î ÀúÀåÇÕ´Ï´Ù. ´ÙÀ½À¸·Î ÆäÀÌÁö°¡ ¿ÏÀüÈ÷ ·ÎµåµÇ¾ú´ÂÁö È®ÀÎÇϱâ À§ÇØ ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍ¿Í ÃÖ»óÀ§ ºê¶ó¿ìÀúÀÇ SetSite¿¡ ij½ÌÇÑ Æ÷ÀÎÅ͸¦ ºñ±³ÇÕ´Ï´Ù. ÀÌ Å×½ºÆ® °á°ú ÃÖ»óÀ§ ºê¶ó¿ìÀú ÇÁ·¹ÀÓÀÇ ¹®¼­¿¡¼­¸¸ À̹ÌÁö¸¦ Á¦°ÅÇÏ°Ô µË´Ï´Ù. ÃÖ»óÀ§ ÇÁ·¹ÀÓÀ¸·Î ·ÎµåµÇÁö ¾ÊÀº ¹®¼­´Â ÀÌ Å×½ºÆ®¸¦ Åë°úÇÏÁö ¸øÇÕ´Ï´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº How To Determine When a Page Is Done Loading in WebBrowser Control ¹× How to get the WebBrowser object model of an HTML frameÀ» ÂüÁ¶ÇϽʽÿÀ.

HTML document °³Ã¼¸¦ °Ë»öÇÏ·Á¸é µÎ ´Ü°è¸¦ °ÅÃÄ¾ß ÇÕ´Ï´Ù. get_Document´Â ºê¶ó¿ìÀú°¡ ´Ù¸¥ Çü½Ä(¿¹: Microsoft Word ¹®¼­)ÀÇ ¹®¼­ °³Ã¼¸¦ È£½ºÆÃÇÑ °æ¿ì¿¡µµ Ȱ¼º ¹®¼­¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °Ë»öÇϹǷΠIHTMLDocument2 (¿µ¹®) ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ È°¼º ¹®¼­¸¦ Ãß°¡·Î Äõ¸®ÇÏ¿© ½ÇÁ¦ HTML ÆäÀÌÁöÀÎÁö È®ÀÎÇØ¾ß ÇÕ´Ï´Ù. IHTMLDocument2 ÀÎÅÍÆäÀ̽º´Â DHTML DOMÀÇ ÄÜÅÙÃ÷¿¡ ´ëÇÑ ¾×¼¼½º¸¦ Á¦°øÇÕ´Ï´Ù.

HTML ¹®¼­°¡ ·ÎµåµÈ °ÍÀ» È®ÀÎÇÑ ÈÄ¿¡´Â RemoveImages·Î °ªÀ» Àü´ÞÇÕ´Ï´Ù. Àμö´Â CComPtrÀÌ ¾Æ´Ñ IHTMLDocument2¿¡ ´ëÇÑ Æ÷ÀÎÅÍ·Î Àü´ÞµË´Ï´Ù.

void CHelloWorldBHO::RemoveImages(IHTMLDocument2* pDocument)
{
    CComPtr<IHTMLElementCollection> spImages;

    // DOM¿¡¼­ À̹ÌÁö Ä÷º¼ÇÀ» ¾ò½À´Ï´Ù.
    HRESULT hr = pDocument->get_images(&spImages);
    if (hr == S_OK && spImages != NULL)
    {
        // Ä÷º¼Ç¿¡¼­ À̹ÌÁö ¼ö¸¦ ¾ò½À´Ï´Ù.
        long cImages = 0;
        hr = spImages->get_length(&cImages);
        if (hr == S_OK && cImages > 0)
        {
            for (int i = 0; i < cImages; i++)
            {
                CComVariant svarItemIndex(i);
                CComVariant svarEmpty;
                CComPtr<IDispatch> spdispImage;

                // Ä÷º¼Ç¿¡¼­ À妽º·Î À̹ÌÁö¸¦ ¾ò½À´Ï´Ù.
                hr = spImages->item(svarItemIndex, svarEmpty, &spdispImage);
                if (hr == S_OK && spdispImage != NULL)
                {
                    // ¸ÕÀú Á¦³×¸¯ HTML ¿ä¼Ò ÀÎÅÍÆäÀ̽º¿¡ ´ëÇØ Äõ¸®ÇÕ´Ï´Ù...
                    CComQIPtr<IHTMLElement> spElement = spdispImage;

                    if (spElement)
                    {
                        // ...´ÙÀ½Àº ½ºÅ¸ÀÏ ÀÎÅÍÆäÀ̽º¿¡ Á¤º¸¸¦ ¿äûÇÕ´Ï´Ù.
                        CComPtr<IHTMLStyle> spStyle;
                        hr = spElement->get_style(&spStyle);

                        // display="none"À¸·Î ¼³Á¤ÇÏ¿© À̹ÌÁö¸¦ °¨Ãä´Ï´Ù.
                        if (hr == S_OK && spStyle != NULL)
                        {
                            static const CComBSTR sbstrNone(L"none");
                            spStyle->put_display(sbstrNone);
                        }
                    }
                }
            }
        }
    }
}

C++·Î DOM°ú »óÈ£ ÀÛ¿ëÇÏ·Á¸é JavaScriptº¸´Ù ´õ º¹ÀâÇÏÁö¸¸ ÄÚµå È帧Àº ±âº»ÀûÀ¸·Î µ¿ÀÏÇÕ´Ï´Ù.

¾ÕÀÇ ÄÚµå´Â À̹ÌÁö Ä÷º¼ÇÀÇ °¢ Ç׸ñ¸¶´Ù ¹Ýº¹µË´Ï´Ù. ½ºÅ©¸³Æ®¿¡¼­´Â Ä÷º¼Ç ¿ä¼Ò°¡ ¼­¼ö³ª À̸§ Áß ¾î´À °ÍÀ¸·Î ¾×¼¼½ºµÇ´ÂÁö È®½ÇÇÏÁö¸¸ C++¿¡¼­´Â ºó variant¸¦ Àü´ÞÇÏ¿© ÀÌ·¯ÇÑ Àμö¸¦ ¼öµ¿À¸·Î ±¸ºÐÇØ¾ß ÇÕ´Ï´Ù. ¿©±â¿¡¼­µµ ATL µµ¿ì¹Ì Ŭ·¡½º(À̹ø¿¡´Â CComVariant)¸¦ »ç¿ëÇÏ¿© ÀÛ¼ºÇØ¾ß ÇÒ ÄÚµåÀÇ ¾çÀ» ÁÙ¿´½À´Ï´Ù.


ÃÖÁ¾ Âü°í »çÇ×

½ºÅ©¸³Æ® ÀÛ¼ºÀ» ¿ëÀÌÇÏ°Ô Çϱâ À§ÇØ DOMÀÇ ¸ðµç °³Ã¼´Â IDispatch¸¦ »ç¿ëÇÏ¿© ¿©·¯ ÀÎÅÍÆäÀ̽º¿¡¼­ ÆÄ»ýµÈ ¼Ó¼º°ú ¸Þ¼­µå¸¦ °ø°³ÇÕ´Ï´Ù. ±×·¯³ª C++¿¡¼­´Â »ç¿ëÇÒ ¼Ó¼ºÀ̳ª ¸Þ¼­µå¸¦ Áö¿øÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ ¸í½ÃÀûÀ¸·Î Äõ¸®ÇØ¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î À̹ÌÁö °³Ã¼´Â IHTMLElement (¿µ¹®) ¹× IHTMLImgElement (¿µ¹®) ÀÎÅÍÆäÀ̽º¸¦ ¸ðµÎ Áö¿øÇÕ´Ï´Ù. ±×·¯¹Ç·Î À̹ÌÁö¿¡ ´ëÇÑ ½ºÅ¸ÀÏ °³Ã¼¸¦ °Ë»öÇÏ·Á¸é ¿ì¼± get_style ¸Þ¼­µå¸¦ Á¦°øÇÏ´Â IHTMLElement ÀÎÅÍÆäÀ̽º¸¦ Äõ¸®ÇØ¾ß ÇÕ´Ï´Ù.

¶ÇÇÑ COM ±ÔÄ¢Àº ½ÇÆÐ ½Ã¿¡ À¯È¿ÇÑ Æ÷ÀÎÅ͸¦ º¸ÀåÇÏÁö´Â ¸øÇϹǷΠ¸ðµç COM È£Ãâ ÈÄ¿¡´Â HRESULT¸¦ È®ÀÎÇØ¾ß ÇÕ´Ï´Ù. ´õ¿íÀÌ ¸¹Àº DOM ¸Þ¼­µåÀÇ °æ¿ì NULL °ªÀ» ¹ÝȯÇÏ´Â °ÍÀÌ ¿À·ù°¡ ¾Æ´Ï±â ¶§¹®¿¡ ¹Ýȯ °ª°ú Æ÷ÀÎÅÍ °ªÀ» ¸ðµÎ ÁÖÀÇÇØ¼­ È®ÀÎÇØ¾ß ÇÕ´Ï´Ù. º¸´Ù Á¤È®ÇÑ È®ÀÎÀ» À§ÇØ Ç×»ó ¹Ì¸® Æ÷ÀÎÅ͸¦ NULL·Î ÃʱâÈ­ÇϽʽÿÀ. ¹æ¾îÀûÀ̰í ÀÚ¼¼ÇÏ¸ç ¿À·ù¸¦ ¹æÁöÇÏ´Â ÄÚµù ½ºÅ¸ÀÏÀ» äÅÃÇÏ¸é ³ªÁß¿¡ ¿¹±âÄ¡ ¸øÇÑ ¹ö±×¸¦ ¿¹¹æÇÏ´Â µ¥ µµ¿òÀÌ µË´Ï´Ù.


¿ä¾à

±¤¹üÀ§ÇÑ ¿ëµµ·Î »ç¿ëµÇ´Â ´Ù¾çÇÑ BHO°¡ ÀÖÁö¸¸ ¸ðµç BHO¿¡´Â ÇϳªÀÇ °øÅëµÈ ±â´ÉÀÌ ÀÖ½À´Ï´Ù. ºê¶ó¿ìÀú¿¡ ´ëÇÑ ¿¬°á ±â´ÉÀÔ´Ï´Ù. Internet Explorer¿Í ±ä¹ÐÇÏ°Ô ÅëÇÕµÉ ¼ö Àֱ⠶§¹®¿¡ BHO´Â ºê¶ó¿ìÀúÀÇ ±â´ÉÀ» È®ÀåÇÏ·Á´Â ¸¹Àº °³¹ßÀÚµéÀÌ Áß¿äÇÏ°Ô ¿©±â´Â µµ±¸ÀÔ´Ï´Ù. ÀÌ ±â»ç¿¡¼­´Â ·ÎµåµÈ ¹®¼­¿¡¼­ IMG ¿ä¼ÒÀÇ ½ºÅ¸ÀÏ Æ¯¼ºÀ» ¼öÁ¤ÇÏ´Â ´Ü¼ø BHO¸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇß½À´Ï´Ù. ÀÌ ÃʱÞÀûÀÎ ¿¹¸¦ ¿øÇÏ´Â ´ë·Î È®ÀåÇØ º¸½Ã±â ¹Ù¶ø´Ï´Ù. ´ÙÀ½ ¸µÅ©¸¦ ¹æ¹®ÇÏ¿© È®Àå °¡´É¼ºÀ» ´õ ÀÚ¼¼È÷ ¿¬±¸ÇØ º¼ ¼ö ÀÖ½À´Ï´Ù.


°ü·Ã Ç׸ñ


©2007 Microsoft Corporation. All rights reserved. »ç¿ë¾à°ü |»óÇ¥ |°³ÀÎÁ¤º¸º¸È£ |¹ýÀûÁ¤º¸
Microsoft

Links

  • Links - http://www.microsoft.com/korea/msdn/library/ko-kr/IETechCol/cols/dnexpie/expie_hello_bho.aspx
  • World of World. http://cpueblo.com by À¯±¤Èñ. mail to cpueblocpueblo.com