用于" Shell.Application"的CreateObject函数vs" InternetExplorer.Application"

时间:2015-05-31 05:26:11

标签: vba

我查了一篇文章(http://www.mrexcel.com/forum/excel-questions/553580-visual-basic-applications-macro-already-open-ie-window.html)。在这里,答案对我来说非常有趣,就像在代码中一样 -

text/html

这里CreateObject()使用" Shell.Application"和其他时间一起使用" InternetExplorer.Application"。第一次用它来引用已打开的窗口或已经激活但第二次用它来创建一个新的浏览器窗口。

我尝试运行以下代码,即使已经打开了实例,每次都会生成新的IE窗口。

    Sub GetIE_LateBinding()

      Dim IE As Object

      With CreateObject("Shell.Application").Windows

        If .Count > 0 Then
          ' Get IE
         Set IE = .Item(0) ' or .Item(.Count - 1)
        Else
          ' Create IE
          Set IE = CreateObject("InternetExplorer.Application")
          IE.Visible = True
        End If

        IE.Navigate "http://support.microsoft.com/kb/q176792/"

        Set IE = Nothing

      End With

   End Sub

我可以理解" InternetExplorer.Application"的行为。 - 每次创建新的IE应用程序实例因此新窗口。但是" Shell.Application"似乎获取已经打开的shell应用程序实例,因此,我们可以浏览已经打开的IE窗口。似乎有点混乱。我在哪里错过了?

注意:我正在猜测与#34; Shell.Application"的class_initialize()相关的内容。如果是这样,请帮我一个参考。

1 个答案:

答案 0 :(得分:0)

IE和Explorer曾经是同一个程序,这就是Shell.Application列出打开IE Windows的原因。它只是这样做,因为他们曾经都是资源管理器窗口。你很幸运,这符合你的需求。

CreateObject用于创建新对象。

GetObject(filename)连接到打开的文件,如果没有打开,则打开它。

Set xlBook = GetObject("C:\Users\David Candy\Documents\Super.xls")
msgbox xlbook.name

GetObject("","shell.application")连接到现有对象,如果它没有运行则会失败。

Set GetExcelApp = GetObject("", "Excel.Application")
Msgbox GetExcelApp

不要太挂在物体上。许多对象只是像Shell.Application这样的函数库。 您创建了一个新的函数库对象

  

来自COM帮助。

 **Component Automation**  
     

将Visual Basic映射到自动化

     

Visual Basic为Automation提供全面支持。下表列出了Visual Basic语句如何转换为OLE API。

     

Visual Basic语句OLE API

CreateObject (ProgID)
  

CLSIDFromProgID   CoCreateInstance的   QueryInterface获取IDispatch接口。

GetObject (filename, ProgID)
  

CLSIDFromProgID   CoCreateInstance的   IPersistFile接口的QueryInterface。   在IPersistFile接口上加载。   QueryInterface获取IDispatch接口。

 GetObject (filename)
  

CreateBindCtx为后续函数创建绑定上下文。   MkParseDisplayName返回BindMoniker的名字句柄。   BindMoniker返回指向IDispatch接口的指针。   释放绰号句柄。   发布背景信息。

GetObject (ProgID)
  

CLSIDFromProgID   类ID上的GetActiveObject。   QueryInterface获取IDispatch接口。

Dim x As New interface
  

查找接口的CLSID。   CoCreateInstance的   QueryInterface

     

©Microsoft Corporation。保留所有权利。