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 ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé·Á¸é |
|
- ÆÄÀÏ ¸Þ´º¿¡¼ »õ ÇÁ·ÎÁ§Æ®...¸¦ Ŭ¸¯ÇÕ´Ï´Ù.
»õ ÇÁ·ÎÁ§Æ® ´ëÈ »óÀÚ°¡ ³ªÅ¸³³´Ï´Ù. ÀÌ ´ëÈ »óÀÚ¿¡´Â Visual Studio¿¡¼ ¸¸µé ¼ö ÀÖ´Â ÀÀ¿ë ÇÁ·Î±×·¥ À¯ÇüÀÌ ³ª¿µË´Ï´Ù.
- Visual C++ ³ëµå ¾Æ·¡¿¡ "ATL"ÀÌ ¼±ÅõǾî ÀÖÁö ¾ÊÀ¸¸é ¼±ÅÃÇÑ ´ÙÀ½ Visual C++ ÇÁ·ÎÁ§Æ® À¯Çü¿¡¼ "ATL ÇÁ·ÎÁ§Æ®"¸¦ ¼±ÅÃÇÕ´Ï´Ù. ÇÁ·ÎÁ§Æ®ÀÇ À̸§À» "HelloWorld"·Î ÁöÁ¤ÇÏ°í ±âº» À§Ä¡¸¦ »ç¿ëÇÕ´Ï´Ù. È®ÀÎÀ» Ŭ¸¯ÇÕ´Ï´Ù.
- ATL ÇÁ·ÎÁ§Æ® ¸¶¹ý»ç¿¡¼ ¼¹ö À¯ÇüÀÌ "µ¿Àû ¿¬°á ¶óÀ̺귯¸®(DLL)"ÀÎÁö È®ÀÎÇÏ°í ¸¶Ä§À» Ŭ¸¯ÇÕ´Ï´Ù.
DLLÀ» À§ÇÑ ±âº» ±¸¼º ¿ä¼Ò°¡ »ý¼ºµË´Ï´Ù. ÀÌÁ¦ BHO¸¦ ±¸ÇöÇÏ´Â COM °³Ã¼¸¦ Ãß°¡ÇÕ´Ï´Ù.
- ¼Ö·ç¼Ç Ž»ö±â ÆÐ³Î¿¡¼ ÇÁ·ÎÁ§Æ®¸¦ ¸¶¿ì½º ¿À¸¥ÂÊ ´ÜÃ߷ΠŬ¸¯Çϰí Ãß°¡ ÇÏÀ§ ¸Þ´º¿¡¼ Ŭ·¡½º...¸¦ ¼±ÅÃÇÕ´Ï´Ù.
- "ATL ´Ü¼ø °³Ã¼"¸¦ ¼±ÅÃÇϰí Ãß°¡¸¦ Ŭ¸¯ÇÕ´Ï´Ù.
ATL ´Ü¼ø °³Ã¼ ¸¶¹ý»ç°¡ ³ªÅ¸³³´Ï´Ù.
- ATL ´Ü¼ø °³Ã¼ ¸¶¹ý»çÀÇ À̸§¿¡ ¾à½Ä À̸§À¸·Î "HelloWorldBHO"¸¦ ÀÔ·ÂÇÕ´Ï´Ù.
³ª¸ÓÁö À̸§Àº ÀÚµ¿À¸·Î ä¿öÁý´Ï´Ù.
- ATL ´Ü¼ø °³Ã¼ ¸¶¹ý»çÀÇ ¿É¼Ç¿¡¼ ½º·¹µù ¸ðµ¨¿¡´Â "¾ÆÆÄÆ®", ÁýÇÕü¿¡´Â "¾Æ´Ï¿ä", ÀÎÅÍÆäÀ̽º Çü½Ä¿¡´Â "ÀÌÁß", ±×¸®°í Áö¿ø¿¡´Â "IObjectWithSite"¸¦ °¢°¢ ¼±ÅÃÇÕ´Ï´Ù.
- ¸¶Ä§À» Ŭ¸¯ÇÕ´Ï´Ù.
|
|
ÀÌ ÇÁ·ÎÁ§Æ®ÀÇ ÀϺηΠ´ÙÀ½°ú °°Àº ÆÄÀÏÀÌ »ý¼ºµË´Ï´Ù.
- 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ÀÔ´Ï´Ù.
|
|
- Visual StudioÀÇ ¼Ö·ç¼Ç Ž»ö±â¿¡¼
HelloWorld.rgs¸¦ ¿±´Ï´Ù.
- ÆÄÀÏ ¸Ç ¾Æ·¡¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
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'
}
}
}
}
}
}
}
}
- À§¿¡¼ ForceRemove ´ÙÀ½¿¡ ³ª¿À´Â GUID¸¦
HelloWorld.idl¿¡ ÀÖ´Â BHOÀÇ CLSID·Î ¹Ù²ß´Ï´Ù. Áß°ýÈ£´Â ¹Ù²ÙÁö ¸¶½Ê½Ã¿À.
- ÆÄÀÏÀ» ÀúÀåÇϰí 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°¡ ´ÙÀ½ ¸Þ½ÃÁö¸¦ Ç¥½ÃÇÕ´Ï´Ù.
Ž»öÀ» °è¼ÓÇÏ¸é¼ ¸Þ½ÃÁö »óÀÚ°¡ ¾ðÁ¦ ¾ó¸¶³ª ÀÚÁÖ ³ªÅ¸³ª´ÂÁö °üÂûÇÕ´Ï´Ù. 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¸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇß½À´Ï´Ù. ÀÌ ÃʱÞÀûÀÎ ¿¹¸¦ ¿øÇÏ´Â ´ë·Î È®ÀåÇØ º¸½Ã±â ¹Ù¶ø´Ï´Ù. ´ÙÀ½ ¸µÅ©¸¦ ¹æ¹®ÇÏ¿© È®Àå °¡´É¼ºÀ» ´õ ÀÚ¼¼È÷ ¿¬±¸ÇØ º¼ ¼ö ÀÖ½À´Ï´Ù.
°ü·Ã Ç׸ñ