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 ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇϽʽÿÀ.
- WebBrowser ÄÁÆ®·ÑÀ» È£½ºÆÃÇÏ´Â UserControl ¶óÀ̺귯¸® ÇÁ·ÎÁ§Æ®¸¦ ¿±´Ï´Ù.
- ¼Ö·ç¼Ç Ž»ö±â¿¡¼ ÇÁ·ÎÁ§Æ® ³ëµå¸¦ ¸¶¿ì½º ¿À¸¥ÂÊ ´ÜÃ߷ΠŬ¸¯ÇÑ ´ÙÀ½ ÂüÁ¶ Ãß°¡ Ŭ¸¯ÇϽʽÿÀ.
Âü°í Visual Studio 2005 ÂüÁ¶ Ãß°¡ÂüÁ¶°¡ º¯°æµË´Ï´Ù. - ¿¡ ÀÖ´Â Ãß°¡ ÂüÁ¶ ´ëÈ »óÀÚ¿¡¼ COM ÅÇÀ» Ŭ¸¯ÇÕ´Ï´Ù.
- ¼±ÅÃÇÑ ±¸¼º ¿ä¼Ò ¸ñ·Ï¿¡ Ç׸ñÀ» Ãß°¡ÇÏ·Á¸é Microsoft HTML °³Ã¼ ¶óÀ̺귯¸® ¹× Microsoft ÀÎÅÍ³Ý ÄÁÆ®·Ñ À» COM ±¸¼º ¿ä¼Ò ¸ñ·Ï¿¡¼ µÎ ¹ø ´©¸¥ ´ÙÀ½ È®ÀÎ À» ´©¸¨´Ï´Ù.
- 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¿¡¼´Â °ø¿ë ¾ð¾î ·±Å¸ÀÓ Áö¿ø ÄÄÆÄÀÏ·¯ ¿É¼ÇÀ» Ãß°¡ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇϽʽÿÀ. - ÇÁ·ÎÁ§Æ® ¸¦ Ŭ¸¯ÇÑ ´ÙÀ½ <ProjectName> ¼Ó¼ºÀ».
Âü°í<ProjectName> ÇÁ·ÎÁ§Æ® À̸§¿¡ ´ëÇÑ ÀÚ¸® Ç¥½ÃÀÚÀÔ´Ï´Ù. - ±¸¼º ¼Ó¼º À» È®ÀåÇÑ ´ÙÀ½ ÀÏ¹Ý À» Ŭ¸¯ÇϽʽÿÀ.
- È®ÀζõÀ» ¼±ÅÃÇÏ°í °ø¿ë ¾ð¾î ·±Å¸ÀÓ Áö¿ø, ÀÌÀü ±¸¹® (/clr:oldSyntax)°ø¿ë ¾ð¾î ·±Å¸ÀÓ Áö¿ø ÇÁ·ÎÁ§Æ® ¼³Á¤À» ¿À¸¥ÂÊ Ã¢¿¡ Àû¿ë À» ´©¸¥ ´ÙÀ½ È®ÀÎ À» ´©¸¨´Ï´Ù.
°ø¿ë ¾ð¾î ·±Å¸ÀÓ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ÄÄÆÄÀÏ·¯ ¿É¼ÇÀ» Áö¿øÇÏ´Â º¸·Á¸é ´ÙÀ½ Microsoft À¥ »çÀÌÆ®¸¦ ¹æ¹®ÇϽʽÿÀ.ÀÌ ´Ü°è´Â Àüü ¹®¼¿¡ Àû¿ëµË´Ï´Ù.
Âü°íÀûÀýÇÑ COM ÀÎÅÍÆäÀ̽ºÀÇ GUID ÀÎÅÍÆäÀ̽º¿¡ ÇÒ´çÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ, ÀÎÅÍÆäÀ̽ºÀÇ ¸ðµç ¸Þ¼µå¿¡ ´ëÇÑ Çü½Ä ¼±¾ðÀ» Æ÷ÇÔÇÒ ¼ö ÀÖ½À´Ï´Ù. - 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¸¦ ¼±¾ðÇÕ´Ï´Ù. ÀÌ·¸°Ô ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇϽʽÿÀ.
- UserControl Ŭ·¡½º¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ÇÕ´Ï´Ù:
private:
//Define the command group GUID for the WebBrowser control
Guid cmdGuid;
- ´ÙÀ½ Äڵ带 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 À¥ »çÀÌÆ®¸¦ ¹æ¹®ÇϽʽÿÀ.