我正在尝试在Reflection Terminal Emulator中运行的遗留应用程序和在IE中运行的基于浏览器的应用程序之间实现某种集成。
我正在使用Host Initiated Scripts,因此维护和部署问题与旧版应用程序隔离。所有脚本都将在旧版应用程序中生成,并使用转义序列传输到Reflection。
我目前能够:
这是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。然而,我没有太多运气,主要是因为缺乏文件。
所以,我的问题是:
非常感谢任何相关文章,示例代码或其他见解的链接。
答案 0 :(得分:1)
InternetExplorer对象不支持AFAIK GetObject。然而,这不是结束:)在many other ways中你可以将它从shell32的windows集合中拉出来。要使示例代码(根据上面链接中的代码改编),您需要设置对以下内容的引用:
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是一种非常好的方法(我经常感到内疚),但可能会有更好的,资源更少的方式。