<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.atalasoft.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Rick Minerich's Development Wonderland : iOleObjectType</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/tags/iOleObjectType/default.aspx</link><description>Tags: iOleObjectType</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>.NET 2.0+ ActiveX Controls Part 2 – Controlling Internet Explorer via IWebBrowser</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx</link><pubDate>Tue, 14 Jul 2009 16:11:38 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18848</guid><dc:creator>RickM</dc:creator><slash:comments>2</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/18848.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=18848</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=18848</wfw:comment><description>&lt;p&gt;After spending much time evaluating different approaches, I’ve found a way to easily and reliably grab the URL of my hosting page from inside of a C# based ActiveX Control.&amp;#160; This process involves using dynamic COM invocation to obtain the IWebBrower interface via my ActiveX control’s implicit IOleObject interface.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Introduction&lt;/h3&gt;  &lt;p&gt;IWebBrowser is useful for many things beyond just getting the currently displayed URL.&amp;#160; In fact, &lt;b&gt;it can control almost every aspect of Internet Explorer&lt;/b&gt;.&amp;#160; It can be used to completely control browser navigation, redirecting the browser to different pages, refreshing or even going forward and back. &lt;/p&gt;  &lt;p&gt;Also, it would be possible to go about this via a statically generated interface to shdocvw.dll.&amp;#160; However, using a static interface has the distinct disadvantage of failing quite explosively if the dll is not available.&amp;#160; &lt;b&gt;Dynamic invocation is much safer.&lt;/b&gt;&amp;#160; If something goes wrong we will simply get back null values instead of what we expected.&lt;/p&gt;  &lt;p&gt;If you don’t have much ActiveX experience, there are three important pieces of information to know about before starting:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Everything in COM is referenced by GUID. &lt;/li&gt;    &lt;li&gt;All COM access is done through querying existing COM objects. &lt;/li&gt;    &lt;li&gt;With a little syntactic sugar, C# takes care of much of the pain involved. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Defining our COM Interfaces&lt;/h3&gt;  &lt;p&gt;First we need to define the COM reference Guids for our top level browser service and the Internet Explorer application. &lt;/p&gt;  &lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; Guid _topLevelBrowserGuid = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Guid(&amp;quot;&lt;span style="color:#8b0000;"&gt;4C96BE40-915C-11CF-99D3-00AA004AE837&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2: &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; Guid _webBrowserAppGuid = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Guid(&amp;quot;&lt;span style="color:#8b0000;"&gt;0002DF05-0000-0000-C000-000000000046&lt;/span&gt;&amp;quot;); 
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Secondly, we need to define the &lt;b&gt;IServiceProvider&lt;/b&gt; COM interface.&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: [ComImport,
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2:  Guid(&amp;quot;&lt;span style="color:#8b0000;"&gt;6d5140c1-7436-11ce-8034-00aa006009fa&lt;/span&gt;&amp;quot;),
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3:  InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; IServiceProvider
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  5: {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  6:   &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; QueryService(
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  7:     &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; Guid guidService, 
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  8:     &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; Guid riid,
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  9:     [MarshalAs(UnmanagedType.Interface)] &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; ppvObject);
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 10: }
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Third, we need to define the &lt;b&gt;IWebBrowser&lt;/b&gt; COM interface.&amp;#160; &lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: [ComImport, 
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2:  TypeLibType((&lt;span style="color:#0000ff;"&gt;short&lt;/span&gt;)0x1050), 
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3:  Guid(&amp;quot;&lt;span style="color:#8b0000;"&gt;EAB22AC1-30C1-11CF-A7EB-0000C05BAE0B&lt;/span&gt;&amp;quot;)]
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4: &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; IWebBrowser
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  5: {
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  6:   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(100)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  7:   &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; GoBack();
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  8:   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x65)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  9:   &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; GoForward();
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 10:   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x66)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 11:   &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; GoHome();
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 12:   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x67)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 13:   &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; GoSearch();
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 14:   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x68)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 15:   &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Navigate([In, MarshalAs(UnmanagedType.BStr)] &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; URL, [In, Optional, MarshalAs(UnmanagedType.Struct)] &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; Flags, [In, Optional, MarshalAs(UnmanagedType.Struct)] &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; TargetFrameName, [In, Optional, MarshalAs(UnmanagedType.Struct)] &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; PostData, [In, Optional, MarshalAs(UnmanagedType.Struct)] &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; Headers);
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 16:   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(-550)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 17:   &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Refresh();
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 18:   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x69)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 19:   &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Refresh2([In, Optional, MarshalAs(UnmanagedType.Struct)] &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; Level);
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 20:   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x6a)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 21:   &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Stop();
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 22:   [DispId(200)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 23:   &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; Application { [&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;: MarshalAs(UnmanagedType.IDispatch)] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(200)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 24:   [DispId(0xc9)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 25:   &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; Parent { [&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;: MarshalAs(UnmanagedType.IDispatch)] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xc9)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 26:   [DispId(0xca)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 27:   &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; Container { [&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;: MarshalAs(UnmanagedType.IDispatch)] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xca)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 28:   [DispId(0xcb)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 29:   &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; Document { [&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;: MarshalAs(UnmanagedType.IDispatch)] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xcb)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 30:   [DispId(0xcc)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 31:   &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; TopLevelContainer { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xcc)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 32:   [DispId(0xcd)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 33:   &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Type { [&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;: MarshalAs(UnmanagedType.BStr)] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xcd)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 34:   [DispId(0xce)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 35:   &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Left { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xce)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; [param: In] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xce)] &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 36:   [DispId(0xcf)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 37:   &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Top { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xcf)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; [param: In] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xcf)] &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 38:   [DispId(0xd0)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 39:   &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Width { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xd0)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; [param: In] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xd0)] &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 40:   [DispId(0xd1)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 41:   &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Height { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xd1)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; [param: In] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xd1)] &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 42:   [DispId(210)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 43:   &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; LocationName { [&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;: MarshalAs(UnmanagedType.BStr)] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(210)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 44:   [DispId(0xd3)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 45:   &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; LocationURL { [&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;: MarshalAs(UnmanagedType.BStr)] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xd3)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 46:   [DispId(0xd4)]
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 47:   &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Busy { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xd4)] &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 48: }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;It’s quite a large and so I won’t go into the details of each member.&amp;#160; You can find out more by reading the IWebBrowser2 &lt;a href="http://msdn.microsoft.com/en-us/library/aa752127%28VS.85%29.aspx"&gt;MSDN article&lt;/a&gt;.&amp;#160; It’s an extension of the IWebBrowser interface which means the overlapping members will have the same effect. &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Using our COM Interfaces&lt;/h3&gt;

&lt;p&gt;Now that we have all of the necessary infrastructure in place, we must build a set of COM queries in order to obtain our &lt;b&gt;IWebBrowser&lt;/b&gt; instance.&amp;#160; The first step is getting our ActiveX control’s &lt;b&gt;IOleObject&lt;/b&gt; interface.&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: Type type = control.GetType();
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2: Type iOleObjectType = type.GetInterface(&amp;quot;&lt;span style="color:#8b0000;"&gt;IOleObject&lt;/span&gt;&amp;quot;, &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;We then use the &lt;b&gt;iOleObjectType&lt;/b&gt; interface to retrieve the client site service provider from our ActiveX control. &lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (iOleObjectType != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2: {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3:   oleClientSiteObj = iOleObjectType.InvokeMember(
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4:     &amp;quot;&lt;span style="color:#8b0000;"&gt;GetClientSite&lt;/span&gt;&amp;quot;,
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  5:     BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  6:     &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, control, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  7:   serviceProvider = oleClientSiteObj &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; IServiceProvider;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  8: }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;By querying our COM Object’s client side service provider, we can obtain &lt;b&gt;shdocvw.dll’s&lt;/b&gt; COM interface via it’s GUID and the GUID of the interface.&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (serviceProvider != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2: {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3:   Guid topLevelBrowserGuid = _topLevelBrowserGuid;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4:   Guid iServiceProviderGuid = &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(IServiceProvider).GUID;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  5:   serviceProvider.QueryService(
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  6:     &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; topLevelBrowserGuid,
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  7:     &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; iServiceProviderGuid,
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  8:     &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; topServiceProviderObj);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  9:   topServiceProvider = topServiceProviderObj &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; IServiceProvider;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 10: }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Finally, in a similar way, we can now obtain the &lt;b&gt;IWebBrowser&lt;/b&gt; interface from Internet Explorer’s COM interface via their GUIDs.&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (topServiceProvider != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2: {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3:   Guid webBrowserAppGuid = _webBrowserAppGuid;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4:   Guid iWebBrowserGuid = &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(IWebBrowser).GUID;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  5:   topServiceProvider.QueryService(
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  6:     &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; webBrowserAppGuid,
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  7:     &lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; iWebBrowserGuid,
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  8:     &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; webServiceProviderObj);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  9:   webBrowser = webServiceProviderObj &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; IWebBrowser;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt; 10: }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Now, we have an instance the &lt;strong&gt;IWebBrowser&lt;/strong&gt; interface.&amp;#160;&amp;#160; For my purposes, I need only the URL currently displayed in the browser window.&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:480px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (webBrowser != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2: {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3:   url = webBrowser.LocationURL;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4: }&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Using the &lt;strong&gt;IWebBrowser&lt;/strong&gt; allows you to access and control Internet Explorer in a way which is otherwise unavailable for .NET ActiveX Controls.&amp;#160; Thanks to .NET’s excellent COM interop capabilities it’s possible to do it easily in a safe and reliable way.&amp;#160; Also, this technique is known to work for IE 6 all the way through the newest versions of Internet Explorer.&amp;#160; For future reference, at the time of this article the newest is IE8.0.6001.18702.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;References and Additional Information&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2009/06/03/net-2-0-activex-control-gotchas-safe-for-scripting-and-hooking-into-events.aspx"&gt;Part 1 in this Series: .NET 2.0 ActiveX Control Gotchas (Safe for Scripting and Hooking into Events)&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa741313%28VS.85%29.aspx"&gt;MSDN: About the Browser&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/257717"&gt;How To Retrieve the Top-Level IWebBrowser2 Interface from an ActiveX Control&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://stackoverflow.com/questions/72048/net-activex-component-in-ie-how-to-get-browser-reference"&gt;StackOverflow: .NET ActiveX Component in IE&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.pinvoke.net/default.aspx/Interfaces/IWebBrowser2.html"&gt;PInvoke.NET IWebBrowser2 (Interfaces)&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx&amp;amp;;subject=.NET+2.0%2b+ActiveX+Controls+Part+2+%e2%80%93+Controlling+Internet+Explorer+via+IWebBrowser" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx&amp;amp;;title=.NET+2.0%2b+ActiveX+Controls+Part+2+%e2%80%93+Controlling+Internet+Explorer+via+IWebBrowser" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx&amp;amp;title=.NET+2.0%2b+ActiveX+Controls+Part+2+%e2%80%93+Controlling+Internet+Explorer+via+IWebBrowser" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx&amp;amp;;title=.NET+2.0%2b+ActiveX+Controls+Part+2+%e2%80%93+Controlling+Internet+Explorer+via+IWebBrowser" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx&amp;amp;;title=.NET+2.0%2b+ActiveX+Controls+Part+2+%e2%80%93+Controlling+Internet+Explorer+via+IWebBrowser&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/07/14/net-2-0-activex-controls-part-2-controlling-internet-explorer-via-iwebbrowser.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18848" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/pinvoke/default.aspx">pinvoke</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/activex/default.aspx">activex</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/activex+control/default.aspx">activex control</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/com/default.aspx">com</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/IWebBrowser2/default.aspx">IWebBrowser2</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/iOleObjectType/default.aspx">iOleObjectType</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/IWebBrowser/default.aspx">IWebBrowser</category></item></channel></rss>