±â¼ú ÀÚ·á: 815716 - ¸¶Áö¸· °ËÅä: 2007³â 11¿ù 29ÀÏ ¸ñ¿äÀÏ - ¼öÁ¤: 4.2

¼Ò½º º¸±â ´ëÈ­ »óÀÚ, ã±â ´ëÈ­ »óÀÚ ¹× ÀÎÅÍ³Ý ¿É¼Ç ´ëÈ­ »óÀÚÀÇ Visual C++ .NET¿¡¼­ ¶Ç´Â Visual C++ 2005 ¿¡¼­ WebBrowser ÄÁÆ®·ÑÀÇ È£ÃâÇÏ´Â ¹æ¹ý

ÀÌ ÆäÀÌÁö¿¡¼­

¸ðµÎ È®´ë | ¸ðµÎ Ãà¼Ò

¼Ò°³

Microsoft WebBrowser ÄÁÆ®·ÑÀÇ ´Ù¾çÇÑ ´ëÈ­ »óÀÚ¸¦ È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ´ëÈ­ »óÀÚ´Â ¼¼: ¼Ò½º º¸±â, ã±â ¹× ÀÎÅÍ³Ý ¿É¼Ç. ÀÌ·¯ÇÑ ´ëÈ­ »óÀÚ¸¦ ÅëÇØ È£½ºÆÃµÈ UserControl °³Ã¼¸¦ È£ÃâÇÒ ¼ö Àü¿¡ IOleCommandTarget ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇϰí ÇØ´ç ÀÎÅÍÆäÀ̽º¸¦ ³ëÃâÇÏ´Â ¸Þ¼­µå¸¦ ±¸ÇöÇØ¾ß ÇÕ´Ï´Ù. ÀÌ ¹®¼­¿¡¼­´Â ÀÌ·¯ÇÑ ¼¼ °³ÀÇ ´ëÈ­ »óÀÚ¸¦ È£ÃâÇÏ·Á¸é µû¶ó¾ß ÇÏ´Â ´Ü°è¸¦ ¼³¸íÇÕ´Ï´Ù.

°æ°í ÀÌ »ùÇÿ¡¼­´Â ¾ÕÀ¸·Î º¯°æµÉ ¼ö ÀÖ½À´Ï´Ù ¹®¼­È­µÇÁö ¾ÊÀº ¸í·É ±×·ì GUID¸¦ »ç¿ëÇÕ´Ï´Ù. ÀÌ »ùÇÿ¡¼­´Â Internet Explorer 6 ¹× ÀÌÀü ¿Ã¹Ù¸£°Ô ÀÛµ¿Çϵµ·Ï Å×½ºÆ®µÇ¾ú½À´Ï´Ù ÀÖÁö¸¸ ÀÌ·¯ÇÑ ±â¼úÀ» °è¼Ó ¼º°øÀûÀ¸·Î ÇâÈÄ ¹öÀü¿¡¼­ ÀÛµ¿ÇÏÁö ¾ÊÀ» ¼öµµ°¡ ÀÖ½À´Ï´Ù.

Ãß°¡ Á¤º¸

¿ä±¸ »çÇ×

´ÙÀ½Àº ±ÇÀåµÇ´Â Çϵå¿þ¾î, ¼ÒÇÁÆ®¿þ¾î, ³×Æ®¿öÅ© ÀÎÇÁ¶ó ¹× ÇÊ¿äÇÑ ¼­ºñ½º ÆÑÀÇ ¸ñ·ÏÀÔ´Ï´Ù.
  • Microsoft Visual C++ .NET 2003 ¶Ç´Â Microsoft Visual C++ 2005
  • Microsoft .NET Framework 1.1
  • Microsoft Internet Explorer 6.0
ÀÌ ¹®¼­¿¡¼­´Â »ç¿ëÀÚ°¡ ´ÙÀ½ Ç׸ñÀ» Àß ¾Ë°í ÀÖ´Ù°í °¡Á¤ÇÕ´Ï´Ù.
  • Microsoft Visual C++ .NET ¶Ç´Â Microsoft Visual C++ 2005 ÇÁ·Î±×·¡¹Ö
  • WebBrowser ÄÁÆ®·Ñ (Shdocvw.dll) È£½ºÆÃ

IOleCommandTarget ÀÎÅÍÆäÀ̽º Á¤ÀÇ

(IOleCommandTarget) ±¸¼º ¿ä¼Ò °³Ã¼ ¸ðµ¨(COM) ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ ÂüÁ¶¸¦ ¾òÀ» ¼ö ÀÖ´Â .NET ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇϽʽÿÀ.
  1. WebBrowser ÄÁÆ®·ÑÀ» È£½ºÆÃÇÏ´Â UserControl ¶óÀ̺귯¸® ÇÁ·ÎÁ§Æ®¸¦ ¿±´Ï´Ù.
  2. ¼Ö·ç¼Ç Ž»ö±â¿¡¼­ ÇÁ·ÎÁ§Æ® ³ëµå¸¦ ¸¶¿ì½º ¿À¸¥ÂÊ ´ÜÃ߷ΠŬ¸¯ÇÑ ´ÙÀ½ ÂüÁ¶ Ãß°¡ Ŭ¸¯ÇϽʽÿÀ.

    Âü°í Visual Studio 2005 ÂüÁ¶ Ãß°¡ÂüÁ¶°¡ º¯°æµË´Ï´Ù.
  3. ¿¡ ÀÖ´Â Ãß°¡ ÂüÁ¶ ´ëÈ­ »óÀÚ¿¡¼­ COM ÅÇÀ» Ŭ¸¯ÇÕ´Ï´Ù.
  4. ¼±ÅÃÇÑ ±¸¼º ¿ä¼Ò ¸ñ·Ï¿¡ Ç׸ñÀ» Ãß°¡ÇÏ·Á¸é Microsoft HTML °³Ã¼ ¶óÀ̺귯¸® ¹× Microsoft ÀÎÅÍ³Ý ÄÁÆ®·Ñ À» COM ±¸¼º ¿ä¼Ò ¸ñ·Ï¿¡¼­ µÎ ¹ø ´©¸¥ ´ÙÀ½ È®ÀÎ À» ´©¸¨´Ï´Ù.
  5. IOleCommandTarget ÀÎÅÍÆäÀ̽º ¼±¾ðÀ» ¾È¿¡ MSHTML Microsoft HTML IOleCommandTarget ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ ÂüÁ¶¸¦ Ãß°¡ÇÒ ÄÁÆ®·ÑÀÇ ³×ÀÓ½ºÆäÀ̽º ¼±¾ðÀÌ Æ÷ÇԵ˴ϴÙ. ÀÌ·¸°Ô ÇÏ·Á¸é UserControl Ŭ·¡½º Á¤ÀÇ ¾Õ¿¡ ´ÙÀ½ Äڵ带 »ðÀÔÇÕ´Ï´Ù: OLECMDTEXT
    [StructLayout(LayoutKind::Sequential)] 
    public __gc struct OLECMDTEXT
    {
    public:
    	unsigned int cmdtextf;
    	unsigned int cwActual;
    	unsigned int cwBuf;
    	char rgwz;
    };
    
    [StructLayout(LayoutKind::Sequential)] 
    public __gc struct OLECMD
    {
    public:
    	long cmdID;
    	UInt64 cmdf;
    };
    // Interop definition for IOleCommandTarget. 
    [ComImport, 
    Guid("b722bccb-4e68-101b-a2bc-00aa00404770"),
    InterfaceType(ComInterfaceType::InterfaceIsIUnknown)]
    public __gc __interface IOleCommandTarget
    { 
    	//IMPORTANT: The order of the methods is critical here. You will perform
    	//early binding in most cases, and therefore, the order of the methods
    	//here MUST match the order of their vtable layout (which is determined
    	//by their layout in IDL). The interop calls key off the vtable ordering,
    	//not off the symbolic names, and therefore, if you switched these method
    	//declarations and tried to call the Exec() function on an IOleCommandTarget
    	//interface from your application, it would translate into a call to
     //QueryStatus() instead. 
    	void QueryStatus(Guid* pguidCmdGroup, UInt32 cCmds, 
     [MarshalAs(UnmanagedType::LPArray, SizeParamIndex=1)] OLECMD* prgCmds, OLECMDTEXT* CmdText);
    	void Exec(Guid* pguidCmdGroup, long nCmdId, long nCmdExecOpt, Object* pvaIn, Object* pvaOut);
    };
    ÄÄÆÄÀÏ·¯ ¿É¼ÇÀ» Áö¿øÇÏ´Â ³ëÆ® °ø¿ë ¾ð¾î ·±Å¸ÀÓ¿¡¼­ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù (/clr:oldSyntax) ¼º°øÀûÀ¸·Î ÀÌÀü ÄÚµå »ùÇÃÀ» ÄÄÆÄÀÏÇÏ·Á¸é Visual C++ 2005 ¿¡¼­. Visual C++ 2005¿¡¼­´Â °ø¿ë ¾ð¾î ·±Å¸ÀÓ Áö¿ø ÄÄÆÄÀÏ·¯ ¿É¼ÇÀ» Ãß°¡ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇϽʽÿÀ.
    1. ÇÁ·ÎÁ§Æ® ¸¦ Ŭ¸¯ÇÑ ´ÙÀ½ <ProjectName> ¼Ó¼ºÀ».

      Âü°í<ProjectName> ÇÁ·ÎÁ§Æ® À̸§¿¡ ´ëÇÑ ÀÚ¸® Ç¥½ÃÀÚÀÔ´Ï´Ù.
    2. ±¸¼º ¼Ó¼º À» È®ÀåÇÑ ´ÙÀ½ ÀÏ¹Ý À» Ŭ¸¯ÇϽʽÿÀ.
    3. È®ÀζõÀ» ¼±ÅÃÇÏ°í °ø¿ë ¾ð¾î ·±Å¸ÀÓ Áö¿ø, ÀÌÀü ±¸¹® (/clr:oldSyntax)°ø¿ë ¾ð¾î ·±Å¸ÀÓ Áö¿ø ÇÁ·ÎÁ§Æ® ¼³Á¤À» ¿À¸¥ÂÊ Ã¢¿¡ Àû¿ë À» ´©¸¥ ´ÙÀ½ È®ÀÎ À» ´©¸¨´Ï´Ù.
    °ø¿ë ¾ð¾î ·±Å¸ÀÓ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ÄÄÆÄÀÏ·¯ ¿É¼ÇÀ» Áö¿øÇÏ´Â º¸·Á¸é ´ÙÀ½ Microsoft À¥ »çÀÌÆ®¸¦ ¹æ¹®ÇϽʽÿÀ.
    /clr (°ø¿ë ¾ð¾î ·±Å¸ÀÓ ÄÄÆÄÀÏ)
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx (http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx)
    ÀÌ ´Ü°è´Â Àüü ¹®¼­¿¡ Àû¿ëµË´Ï´Ù.

    Âü°íÀûÀýÇÑ COM ÀÎÅÍÆäÀ̽ºÀÇ GUID ÀÎÅÍÆäÀ̽º¿¡ ÇÒ´çÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ, ÀÎÅÍÆäÀ̽ºÀÇ ¸ðµç ¸Þ¼­µå¿¡ ´ëÇÑ Çü½Ä ¼±¾ðÀ» Æ÷ÇÔÇÒ ¼ö ÀÖ½À´Ï´Ù.
  6. COM À̺¥Æ® ¼Ò½º·Î ³ëÃâµÇ´Â ÀÎÅÍÆäÀ̽º ¸ñ·ÏÀ» ½Äº°ÇÕ´Ï´Ù UserControl Ŭ·¡½º´Â ComSourceInterfaces Ư¼ºÀ» Ãß°¡ÇϽʽÿÀ. ÀÌ·¸°Ô ÇÏ·Á¸é UserControl Ŭ·¡½º Á¤ÀÇ ¾Õ¿¡ ´ÙÀ½ Äڵ带 »ðÀÔÇϽʽÿÀ: COM À̺¥Æ® ¼Ò½º·Î ³ëÃâµÇ´Â ÀÎÅÍÆäÀ̽º ¸ñ·ÏÀ» ÄÁÆ®·Ñ Ŭ·¡½º¿¡//identify
    //Add a ComSourceInterfaces attribute to the control class to 
    //identify the list of interfaces that are exposed as COM event sources.
    [ClassInterface(ClassInterfaceType::None),ComSourceInterfaces(__typeof(IOleCommandTarget))]

CGID_IWebBrowser ÄÁÆ®·ÑÀÇ ¸í·É GUID¸¦ Á¤ÀÇÇϽʽÿÀ

¶ÇÇÑ ¸í·É ID ó¸® ¹æ¹ýÀ» MSHTML ¾Ë¸®±â À§ÇØ CGI_IWebBrowser ´ëÇÑ GUID Á¤ÀÇÇØ¾ß ÇÕ´Ï´Ù. Microsoft .NET Framework Ŭ·¡½º GUID¸¦ »ç¿ëÇÏ¿© GUID¸¦ ¼±¾ðÇÕ´Ï´Ù. ÀÌ·¸°Ô ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇϽʽÿÀ.
  1. UserControl Ŭ·¡½º¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ÇÕ´Ï´Ù:
    private:
    	//Define the command group GUID for the WebBrowser control
    	Guid cmdGuid;
  2. ´ÙÀ½ Äڵ带 InitializeComponent ÇÔ¼ö È£ÃâÇϸé UserControl Ŭ·¡½º´Â »ý¼ºÀÚ¿¡¼­ »ðÀÔ:
    cmdGuid = Guid(S"ED016940-BD5B-11CF-BA4E-00C04FD70816");
¶ÇÇÑ °¢ ¸í·ÉÀ» »ç¿ëÇÏ´Â ¸í·É ID¸¦ Á¤ÀÇÇϽʽÿÀ. ÀÌ·¸°Ô ÇÏ·Á¸é ´ÙÀ½ Äڵ带 UserControl Ŭ·¡½º´Â »ðÀÔ:
private:
	// Constants for the commands that are named earlier
	__value enum MiscCommandTarget
	{
		Find = 1,
		ViewSource,
		Options
	};
Ç׸ñ, WebBrowser ÄÁÆ®·ÑÀÇ ¹®¼­ ¼Ó¼ºÀ» ±¸ÇöÇÏ·Á¸é mshtml::HTMLDocument ¸â¹ö º¯¼ö¸¦ Á¤ÀÇÇÕ´Ï´Ù. ÀÌ·¸°Ô ÇÏ·Á¸é ´ÙÀ½ º¯¼ö ¼±¾ðÀ» UserControl Ŭ·¡½º´Â »ðÀÔ:
private:
	// The current instance of MSHTML
	mshtml::HTMLDocument *document;

Exec() ¸Þ¼­µå¸¦ È£ÃâÇÏ¿©ÇÕ´Ï´Ù

¹®¼­ ¼Ó¼ºÀ» ¹ÝȯÇÏ·Á¸é ¼Ó¼º getter ÇÔ¼ö¸¦ ±¸ÇöÇϽʽÿÀ. ÀÌ·¸°Ô ÇÏ·Á¸é InitializeComponent ÇÔ¼ö µÚ¿¡ ´ÙÀ½ Äڵ带 »ðÀÔÇÕ´Ï´Ù.:
public:
	__property mshtml::HTMLDocument* get_Document()
	{
		try
		{
			//mshtml::IHTMLDocument2* doc;
			document = __try_cast<mshtml::HTMLDocument*>(axWebBrowser1->Document);
			return document;
		}
		catch(Exception* e)
		{
			System::Windows::Forms::MessageBox::Show(e->Message->ToString());
		}
	}
¸¶Áö¸·À¸·Î ¼¼ º°µµÀÇ ¸Þ¼­µå È£Ãâ Exec ¸Þ¼­µå È£ÃâÀ» ĸ½¶È­ÇÕ´Ï´Ù. ÀÌ·¸°Ô ÇÏ·Á¸é UserControl Ŭ·¡½º´Â ´ÙÀ½ Äڵ带 »ðÀÔÇÕ´Ï´Ù.:
public:
	void viewsource()
	{
		IOleCommandTarget* cmdt;
		Object * o = new Object();
		// If the doc object is not set to anything, or if there is
		// some bizarre error in accessing IOleCommandTarget,
		// exit gracefully.
		try
		{
			cmdt = __try_cast<IOleCommandTarget*>(get_Document());				
			cmdt->Exec(&cmdGuid, (long)MiscCommandTarget::ViewSource, (long)Interop::SHDocVw::OLECMDEXECOPT::OLECMDEXECOPT_DODEFAULT, o, o);				
		}
		catch(Exception* e) 
		{
			System::Windows::Forms::MessageBox::Show(e->Message->ToString());				
		}
	}

	void find()
	{
		IOleCommandTarget* cmdt;
		Object * o = new Object();

		// If the doc object is not set to anything, or if there is
		// some bizarre error in accessing IOleCommandTarget,
		// exit gracefully.
		try
		{
			cmdt = __try_cast<IOleCommandTarget*>(get_Document());
			cmdt->Exec(&cmdGuid, (long)MiscCommandTarget::Find, (long)Interop::SHDocVw::OLECMDEXECOPT::OLECMDEXECOPT_DODEFAULT, o, o);
		}
		catch(Exception * e)
		{
			System::Windows::Forms::MessageBox::Show(e->Message->ToString());
		}
	}
	void options()
	{    
		IOleCommandTarget* cmdt;
		Object * o = new Object();
		try
		{
			cmdt = __try_cast<IOleCommandTarget*>(get_Document());
			cmdt->Exec(&cmdGuid, (long)MiscCommandTarget::Options, (long)Interop::SHDocVw::OLECMDEXECOPT::OLECMDEXECOPT_DODEFAULT, o, o);
		}
		catch(Exception * e)
		{
		// NOTE: Because of the way that this CMDID is handled in Internet Explorer,
				// this catch block will always fire, even though the dialog box
				// and its operations completed successfully. You can suppress this
				// error without causing any damage to your host.
			String * s = e->Message->ToString();
		}
	}

ÂüÁ¶

ÀÚ¼¼ÇÑ ³»¿ëÀº Microsoft ±â¼ú ÀÚ·áÀÇ ´ÙÀ½ ¹®¼­¸¦ ÂüÁ¶ÇϽʽÿÀ.
311303? (http://support.microsoft.com/kb/311303/ ) WebOCHostVB.exe´Â Visual Basic .NET ¿¡¼­ WebBrowser ÄÁÆ®·ÑÀ» È£½ºÆ®ÇÕ´Ï´Ù.
326217? (http://support.microsoft.com/kb/326217/ ) Á¤º¸: WebOCHostCSharp.exe C# .NETÀ» WebBrowser ÄÁÆ®·ÑÀ» È£½ºÆ®ÇÕ´Ï´Ù.

Microsoft Internet Explorer ¿ë À¥ ±â¹Ý ¼Ö·ç¼ÇÀ» °³¹ßÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÀ½ Microsoft À¥ »çÀÌÆ®¸¦ ¹æ¹®ÇϽʽÿÀ.
http://msdn.microsoft.com/ie (http://msdn.microsoft.com/ie)

º» ¹®¼­ÀÇ Á¤º¸´Â ´ÙÀ½ÀÇ Á¦Ç°¿¡ Àû¿ëµË´Ï´Ù.
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft .NET Framework 1.1
  • Microsoft Internet Explorer 6.0
Ű¿öµå:?
kbmt kbcode kbwindowsforms kbforms kbdll kbdlg kbctrl kbcontrol kbcominterop kbcollections kbactivexevents kbinterop kbinetdev kbevent kbhowtomaster KB815716 KbMtko
±â°è ¹ø¿ªµÈ ¹®¼­±â°è ¹ø¿ªµÈ ¹®¼­
Áß¿ä: º» ¹®¼­´Â Àü¹® ¹ø¿ª°¡°¡ ¹ø¿ªÇÑ °ÍÀÌ ¾Æ´Ï¶ó Microsoft ±â°è ¹ø¿ª ¼ÒÇÁÆ®¿þ¾î·Î ¹ø¿ªÇÑ °ÍÀÔ´Ï´Ù. Microsoft´Â ¹ø¿ª°¡°¡ ¹ø¿ªÇÑ ¹®¼­ ¹× ±â°è ¹ø¿ªµÈ ¹®¼­¸¦ ¸ðµÎ Á¦°øÇϹǷΠMicrosoft ±â¼ú ÀÚ·á¿¡ ÀÖ´Â ¸ðµç ¹®¼­¸¦ Çѱ۷ΠÁ¢ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ±â°è ¹ø¿ª ¹®¼­°¡ Ç×»ó ¿Ïº®ÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù. µû¶ó¼­ ±â°è ¹ø¿ª ¹®¼­¿¡´Â ¸¶Ä¡ ¿Ü±¹ÀÎÀÌ Çѱ¹¾î·Î ¸»ÇÒ ¶§ ½Ç¼ö¸¦ ÇÏ´Â °Íó·³ ¾îÈÖ, ±¸¹® ¶Ç´Â ¹®¹ý¿¡ ¿À·ù°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. Microsoft´Â ³»¿ë»óÀÇ ¿À¿ª ¶Ç´Â Microsoft °í°´ÀÌ ÀÌ·¯ÇÑ ¿À¿ªÀ» »ç¿ëÇÔÀ¸·Î½á ¹ß»ýÇÏ´Â ºÎ Á¤È®¼º, ¿À·ù ¶Ç´Â ¼ÕÇØ¿¡ ´ëÇØ Ã¥ÀÓÀ» ÁöÁö ¾Ê½À´Ï´Ù. Microsoft´Â ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ±â°è ¹ø¿ª ¼ÒÇÁÆ®¿þ¾î¸¦ ÀÚÁÖ ¾÷µ¥ÀÌÆ®Çϰí ÀÖ½À´Ï´Ù.
 

±â¼ú ÀÚ·á ¹ø¿ª