1

我正在尝试在反射终端模拟器中运行的遗留应用程序和在 IE 中运行的基于浏览器的应用程序之间实现一些集成。

我正在使用主机启动脚本,以便将维护和部署问题与旧版应用程序隔离开来。所有脚本都将在旧版应用程序中生成,并使用转义序列传输到 Reflection。

我目前能够:

  1. 启动 IE
  2. 设置选项,例如隐藏工具栏
  3. 导航到 URL
  4. 将状态信息传输回旧版应用程序
  5. 等待来自旧版应用程序的“关闭”信号
  6. 关闭 IE

这是执行此操作的 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 的引用。在 Sub Main 之外将 objIE 声明为 Global 并没有帮助。Session 对象在脚本调用中确实存在,但它似乎没有我可以用于此目的的属性。(Session 确实有一个 UserData 属性,但那是一个字符串,而不是一个对象。)

这是我想做的一个例子:

脚本 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 回答 1

1

InternetExplorer 对象不支持AFAIK GetObject。然而这还不是结束:) 在许多其他方法中,您可以将它从 shell32 的 windows 集合中拉出来。要使示例代码(改编自上面链接中的代码)正常工作,您需要设置对以下内容的引用:

  1. 微软互联网控制
  2. Microsoft HTML 对象库
  3. Microsoft Shell 控件和自动化

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 是一种非常笨拙的方法(我经常对此感到内疚),但可能有更好的、资源消耗更少的方法。

于 2009-12-16T04:15:47.817 回答