public virtual void DocumentComplete(object pDisp, ref object uRL)
 {
     DWebBrowserEvents2_DocumentCompleteEvent documentcompleteEvent = new DWebBrowserEvents2_DocumentCompleteEvent(pDisp, uRL);
     this.parent.RaiseOnDocumentComplete(this.parent, documentcompleteEvent);
     uRL = documentcompleteEvent.uRL;
 }
        /// <summary>
        /// Event handler for DocumentComplete. We fire 2 events out of this event handler:
        ///		FrameComplete -- frame within a frameset completes
        ///		DocumentComplete -- entire document (page or frameset) completes
        ///	Both of these events provide the URL and the IDispatch of the document
        ///	object as part of their event arguments.
        /// </summary>
        /// <param name="sender">object sending the event</param>
        /// <param name="e">event parameters</param>
        private void AxWebBrowser_DocumentComplete(
            object sender, DWebBrowserEvents2_DocumentCompleteEvent e)
        {
            // Create native event args based on the passed event args
            BrowserDocumentEventArgs evtArgs =
                new BrowserDocumentEventArgs(e.uRL.ToString(), e.pDisp);

            // Check to see if this is the full document (page or frameset). This
            // technique is based on the article "HOWTO: Determine When a Page Is
            // Done Loading in WebBrowser Control" at:
            //  http://support.microsoft.com/default.aspx?scid=KB;en-us;q180366
            IntPtr thisPtr = Marshal.GetIDispatchForObject(e.pDisp);
            IntPtr browserPtr = Marshal.GetIDispatchForObject(m_browser.GetOcx());
            bool isDocument = (thisPtr == browserPtr);
            Marshal.Release(thisPtr);
            Marshal.Release(browserPtr);

            if (isDocument)
            {
                // TODO: update address bar on DocumentComplete

                // fire to listeners
                OnDocumentComplete(evtArgs);
            }
            else // this was a frame within a frameset
            {
                // fire to listeners
                OnFrameComplete(evtArgs);
            }
        }
 internal void RaiseOnDocumentComplete(object sender, DWebBrowserEvents2_DocumentCompleteEvent e)
 {
     if ((this.DocumentComplete != null))
     {
         this.DocumentComplete(sender, e);
     }
 }