现在的位置: 首页 > 综合 > 正文

HOWTO: Connect to a Running Instance of Internet Explorer

2017年01月11日 ⁄ 综合 ⁄ 共 4515字 ⁄ 字号 评论关闭
 

PSS ID Number: Q176792

Article Last Modified on 07-20-2001


The information in this article applies to:
  • Microsoft Internet Explorer (Programming) 4.0, 4.01, 5
  • Microsoft Internet Client SDK 4.0, 4.01

Summary

It is possible to connect to a running instance of Internet Explorer version 4.0 or later using the SHDocVw.ShellWindows collection.

More Information

Normally, an application connects to a running instance of another application using the Running Object table. Because Internet Explorer 4.0 does not register itself in the running object table, another method is necessary.

The ShellWindows collection is described in the Internet Client SDK as follows: The ShellWindows object represents a collection of the open windows that belong to the shell. In fact, this collection contains references to Internet Explorer as well as other windows belonging to the shell, such as the Windows Explorer.

The following Visual Basic code obtains a reference to the ShellWindows collection. The collection is enumerated and the LocationName for each object added to a list box. If the document associated with the object is of type HTMLDocument (a Web Page), the title for the page is added to another list box.

In order to run the following code, it is necessary to add a reference to "Microsoft Internet Controls" (Shdocvw.dll) and "Microsoft HTML Object Library" (Mshtml.dll) to the Visual Basic project:

Dim SWs As New SHDocVw.ShellWindows
Dim IE As SHDocVw.InternetExplorer

Private Sub Form_Load()
   Dim Doc
   List1.Clear
   List2.Clear

   Text1.Text = SWs.count

   For Each IE In SWs
      List1.AddItem IE.LocationName

      Set Doc = IE.Document
      If TypeOf Doc Is HTMLDocument Then
         'if this is an HTML page, display the title
         'may or may not be the same as LocationName
         List2.AddItem Doc.Title
      End If
   Next
End Sub 

In C++, a connection can be accomplished in roughly the same way. Visual C++ Native Com Support is used here for the sake of brevity.

Add references to Shdocvw.dll and Mshtml.dll to the project:

#import <mshtml.dll> // Internet Explorer 4.0x
#import <mshtml.tlb> // Internet Explorer 5
#import <shdocvw.dll> 

Declare an instance of an IShellWindows pointer in your view class:

SHDocVw::IShellWindowsPtr m_spSHWinds; 

Create an instance of a ShellWindows object in your view's constructor:

m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)); 

Use the ShellWindows object in your view's OnInitialUpdate function:

void CConnectIEView::OnInitialUpdate()
{
   CFormView::OnInitialUpdate();

   ASSERT(m_spSHWinds != NULL);

   CString strCount;
   long nCount = m_spSHWinds->GetCount();

   strCount.Format("%i", nCount);
   m_strWinCount = strCount;

   UpdateData(FALSE);

   IDispatchPtr spDisp;
   for (long i = 0; i < nCount; i++)
   {
      _variant_t va(i, VT_I4);
      spDisp = m_spSHWinds->Item(va);

      SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
      if (spBrowser != NULL)
      {
         m_ctlListLoc.AddString(spBrowser->GetLocationName());

         MSHTML::IHTMLDocument2Ptr spDoc(spBrowser->GetDocument());
         if (spDoc != NULL)
         {
             m_ctlListTitle.AddString(spDoc->Gettitle());
         }
      }
   }
} 

The previous method for connecting to a running instance of the Internet Explorer does not work if Shell Integration is not installed or if "Browse in a new process" is selected in Internet Explorer 4.0.

If these factors cannot be controlled, there is still one possible method that may work. A browser helper object can be written to register Internet Explorer 4.0 in the running object table (ROT). There are many implementations possible here depending on how the application is to determine the instance of Internet Explorer with which to connect. This is just one possible solution: The browser helper object, having access to the object model of the instance of Explorer that launched it, would determine if this is the instance of the browser that should be registered in the running object table.

The interface that the consumer is interested in can be registered in the ROT with the RegisterActiveObject function and a dummy CLSID that the consumer will recognize. Another solution, that would allow multiple instances of the explorer to be registered in the ROT, would be to have the Browser Helper object compose an Item moniker based on a GUID and piece of data unique to each instance of Internet Explorer. The moniker would be registered in the ROT with the IRunningObjectTable::Register method. Again, the consumer would have to know how recognize this moniker.

 

References

For more information, please visit the MSDN Online Web Workshop at:

http://msdn.microsoft.com/workshop/

The Internet Client SDK; search on Internet Tools and Technologies - Windows Shell API

For additional information, please see the following article in the Microsoft Knowledge Base:

FILE: IEHelper-Attaching to IE4 using a Browser Helper Object

For more information, please visit the following article at:

http://msdn.microsoft.com/library/techart/bho.htm

(c) Microsoft Corporation 1997, All Rights Reserved. Contributions by Robert Duke, Microsoft Corporation

 

Additional query words: helper connect

Keywords: kbcode kbIE400 kbie401 kbSDKInet400 kbSDKInet401 kbGrpDSInet kbie500
Issue Type: kbhowto
Technology: kbIEsearch kbAudDeveloper kbSDKIESearch kbSDKSearch kbIE500Search kbSDKIE400 kbSDKIE401 kbSDKIE500 kbSDKIClient400 kbSDKIClient401 kbIClientSearch

抱歉!评论已关闭.