我正在尝试在反射终端模拟器中运行的遗留应用程序和在 IE 中运行的基于浏览器的应用程序之间实现一些集成。
我正在使用主机启动脚本,以便将维护和部署问题与旧版应用程序隔离开来。所有脚本都将在旧版应用程序中生成,并使用转义序列传输到 Reflection。
我目前能够:
- 启动 IE
- 设置选项,例如隐藏工具栏
- 导航到 URL
- 将状态信息传输回旧版应用程序
- 等待来自旧版应用程序的“关闭”信号
- 关闭 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。然而,我对其中任何一个都没有太大的运气,主要是因为缺乏文档。
所以,我的问题是:
- 我正在尝试使用 OLE 做什么?也就是说,有没有办法在主机启动的脚本调用中保持我对 IE 的句柄?
- 我应该期望 GetObject() 工作,还是死路一条?
- 是否可以在主机启动的脚本中使用 Win32 API 使用 hWND 重新连接到 IE?
非常感谢任何指向相关文章、示例代码或其他见解的链接。