2009-03-02 3 views
1

Reflection Terminal Emulatorで動作するレガシーアプリケーションとIEで動作するブラウザベースのアプリケーションとの間の統合を実装しようとしています。Reflection Terminal Emulator - IEとの統合

私は、Host Initiated Scriptsを使用しているため、保守と配備の問題が従来のアプリケーションと隔離されています。すべてのスクリプトはレガシーアプリで生成され、エスケープシーケンスを使用してReflectionに送信されます。

私は現在にできる午前

:そのようなバックのためのレガシーアプリ

  • 待ちにURL
  • 送信ステータス情報にツールバー
  • 移動を隠すよう

    1. 起動IE
    2. オプションを設定しますレガシーアプリからの「閉じる」信号
    3. 閉じる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 
    

    これに伴う問題は、スクリプトは、それがレガシーアプリからcloseコマンドを取得するまで実行し続けていることです。

    私がしたいことは、ブラウザを起動するために1つのスクリプトを使用し、別のURLのためにそれを閉じるか再利用することです。しかし、私はスクリプトコールを介してIEへの参照を保存する方法を見つけることができませんでした。サブメイン以外のグローバルとしてobjIEを宣言することは役に立たなかった。セッションオブジェクトは、スクリプト呼び出しを介して保持されますが、私はこの目的のために使用できるプロパティを持っていないようです。 (セッションが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 - 新しいURLに、元のIEウィンドウを送る

    
    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

    代わりにCreateObjectの私は、GetObjectメソッドを(使用してみました
    
    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()は新しいIEウィンドウを開くことも、既存のIEウィンドウを見つけることもありません。私はこれがCitrixの下で動作しているからだと思うが、わからない。

    私の唯一のリードは、IEのhWNDを使用して元のウィンドウに再接続したり、OLEの代わりにDDEを使用したりすることです。しかし、私はそれらのいずれかで多くの運がなかった、主にドキュメントの不足のために。

    だから、私の質問は以下のとおりです。

    1. は私がOLEを使用して 可能何をしようとしていますか?つまり、ある方法があります ホストがスクリプト呼び出しを開始したときにIEに私のハンドルを永続させるには?
    2. GetObject()が動作するとはいいでしょうか、 、それとも致命的なものですか?
    3. ホスト起動スクリプトでWin32 API を使用すると、 はhWNDを使用してIEに再接続できますか?

    関連記事、サンプルコード、またはその他の洞察力へのリンクがあれば、大変ありがたいです。

  • 答えて

    1

    AFAIK GetObjectはInternetExplorerオブジェクトではサポートされていません。しかし、これは最後ではありません:) many other waysの中であなたはshell32のwindowsコレクションからそれをヤンクできます。次への参照を設定する必要が動作するように(上記のリンク内のコードから適応)サンプルコードの場合:

    1. マイクロソフトのインターネットは
    2. マイクロソフトシェルコントロールとオートメーション
    3. のMicrosoft HTMLオブジェクトライブラリを制御します

    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

    私はそれはあなたがが達成しようとしているものを議論する価値があるかもしれないと思います。 Roboting IEは(私はしばしば罪を犯している)かなり複雑なアプローチですが、より良い、少ないリソース集約的な方法があるかもしれません。