2009-03-02 69 views
1

我試圖在反射終端仿真器中運行的遺留應用程序與在IE中運行的基於瀏覽器的應用程序之間實現一些集成。反射終端仿真器 - 與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的引用。宣佈objIE爲全球外部Sub Main沒有幫助。 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中使用的FindOriginalIE()函數和3

我嘗試使用GetObject的(部分)取代的CreateObject(),但是這讓我無處。 GetObject()不會打開一個新的IE窗口,或找到一個現有的窗口。我懷疑這是因爲我在Citrix下運行,但我不確定。

我現在唯一的線索是嘗試使用IE的hWND重新連接到原始窗口,或者使用DDE而不是OLE。然而,我沒有太幸運,主要是因爲缺乏文件。

所以,我的問題是:

  1. 是什麼,我嘗試使用OLE 做可能嗎?也就是說,有沒有辦法 堅持我的句柄跨越 主機發起的腳本調用?
  2. 我應該期待GetObject()的工作, 還是那個死衚衕?
  3. 是否可以在主機啓動的腳本中使用Win32 API 到 使用hWND重新連接到IE?

任何指向相關文章,示例代碼或其他見解的鏈接都非常感謝。

回答

1

AFAIK GetObject只是不支持InternetExplorer對象。然而,這不是結束:)在many other ways之中,你可以將它從shell32的windows集合中抽出來。對於示例代碼(適用於上面的鏈接從代碼)工作,你需要設置下面的一個參考:

  1. Microsoft Internet控制
  2. Microsoft HTML對象庫
  3. 微軟殼牌控制和自動化

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是一個非常糟糕的方法(我經常犯有這種方法),但是可能會有更好的,資源更少的方法。