反射终端仿真器 - 与IE集成

时间:2009-03-02 17:52:57

标签: internet-explorer vba com terminal terminal-emulator

我正在尝试在Reflection Terminal Emulator中运行的遗留应用程序和在IE中运行的基于浏览器的应用程序之间实现某种集成。

我正在使用Host Initiated Scripts,因此维护和部署问题与旧版应用程序隔离。所有脚本都将在旧版应用程序中生成,并使用转义序列传输到Reflection。

我目前能够:

  1. 启动IE
  2. 设置隐藏工具栏等选项
  3. 导航到网址
  4. 将状态信息传回旧版应用
  5. 等待遗留应用程序发出“关闭”信号
  6. 关闭IE
  7. 这是VBA代码:

    
    Sub Main
      Dim CR as String
      CR = CHR$(rcCR)
      Dim objIE as Object
      Set objIE = CreateObject("InternetExplorer.Application")
      objIE.ToolBar = false
      objIE.Navigate("http://www.google.com/")
      objIE.Visible = true
      Session.Transmit "OK" & CR
      Session.WaitForString "CLOSE", 0, rcAllowKeystrokes
      objIE.Quit
    End Sub
    

    这个问题是脚本继续运行,直到它从旧应用程序获得关闭命令。

    我想要做的是使用一个脚本启动浏览器,使用另一个脚本关闭它或将其重新用于另一个URL。但是,我还没有找到一种方法来保存我在脚本调用中对IE的引用。将objIE声明为全局外的Sub Main并没有帮助。 Session对象在脚本调用中保持不变,但它似乎没有可用于此目的的属性。 (Session确实有一个UserData属性,但这是一个String,而不是一个Object。)

    以下是我想做的一个例子:

    脚本1 - 打开IE&保持开放状态:

    
    Sub Main
      Dim CR as String
      CR = CHR$(rcCR)
      Dim objIE as Object
      Set objIE = CreateObject("InternetExplorer.Application")
      objIE.ToolBar = false
      objIE.Navigate("http://www.google.com/")
      objIE.Visible = true
      Session.Transmit "OK" & CR
    End Sub
    

    脚本2 - 将原始IE窗口发送到新URL

    
    Sub Main
      Dim CR as String
      CR = CHR$(rcCR)
      Dim objIE as Object
      Set objIE = FindOriginalIE()
      objIE.Navigate("http://www.stackoverflow.com/")
      Session.Transmit "OK" & CR
    End Sub
    

    脚本3 - 关闭IE

    
    Sub Main
      Dim CR as String
      CR = CHR$(rcCR)
      Dim objIE as Object
      Set objIE = FindOriginalIE()
      objIE.Quit
      Session.Transmit "OK" & CR
    End Sub
    

    我无法弄清楚的部分是如何实现脚本2和3中使用的FindOriginalIE()函数。

    我尝试使用GetObject()而不是CreateObject(),但这让我无处可去。 GetObject()不会打开新的IE窗口,也不会找到现有的窗口。我怀疑这是因为我在Citrix下运行,但我不确定。

    我现在唯一的引导是尝试使用IE的hWND重新连接到原始窗口,或使用DDE而不是OLE。然而,我没有太多运气,主要是因为缺乏文件。

    所以,我的问题是:

    1. 我正在尝试做什么 使用OLE?也就是说,有办法吗? 坚持我的句柄到IE 主持人发起的脚本调用?
    2. 我应该期待GetObject()工作, 或者那是一个死胡同?
    3. 是否可以使用Win32 API 在主机启动的脚本中 使用hWND重新连接到IE?
    4. 非常感谢任何相关文章,示例代码或其他见解的链接。

1 个答案:

答案 0 :(得分:1)

InternetExplorer对象不支持AFAIK GetObject。然而,这不是结束:)在many other ways中你可以将它从shell32的windows集合中拉出来。要使示例代码(根据上面链接中的代码改编),您需要设置对以下内容的引用:

  1. Microsoft Internet Controls
  2. Microsoft HTML对象库
  3. Microsoft Shell控件和自动化
  4. Public Sub RunMeFirst()
        Dim objIE As SHDocVw.InternetExplorer
        Set objIE = New SHDocVw.InternetExplorer
        objIE.Visible = True
        objIE.navigate "http://www.google.com/"
        Do Until objIE.readyState = READYSTATE_COMPLETE
            DoEvents
        Loop
    End Sub

    Public Sub RunMeSecond() Dim objIE As SHDocVw.InternetExplorer Dim doc As MSHTML.HTMLDocument Set objIE = GetIEByURL("http://www.google.com/") Set doc = objIE.document MsgBox doc.body.innerText End Sub

    Private Function GetIEByURL(ByVal URL As String) As SHDocVw.InternetExplorer Dim objShell As Shell32.Shell Dim objExplorer As Shell32.ShellFolderView Dim obj As Object Set objShell = New Shell For Each obj In objShell.Windows If TypeOf obj Is SHDocVw.InternetExplorer Then If StrComp(obj.LocationURL, URL, vbTextCompare) = 0& Then Exit For End If End If Next obj Set GetIEByURL = obj End Function

    我认为可能值得讨论你想要完成的事情。机器人IE是一种非常好的方法(我经常感到内疚),但可能会有更好的,资源更少的方式。