Reflection Terminal Emulator-IEとの統合
-
03-07-2019 - |
質問
Reflection Terminal Emulatorで実行されているレガシーアプリとIEで実行されているブラウザベースのアプリとの統合を実装しようとしています。
Host Initiated Scriptsを使用して、メンテナンスと展開の問題をレガシーアプリに分離しています。すべてのスクリプトはレガシーアプリで生成され、エスケープシーケンスを使用してReflectionに送信されます。
現在できること:
- IEを起動
- ツールバーの非表示などのオプションを設定します
- URLに移動する
- ステータス情報を従来のアプリに送信
- " close"を待つ従来のアプリからの信号
- 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への参照を保存する方法を見つけることができませんでした。 Sub Mainの外部でobjIEをGlobalとして宣言しても助けにはなりませんでした。 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()関数の実装方法です。
CreateObject()の代わりにGetObject()を使用しようとしましたが、どこにも行きませんでした。 GetObject()は、新しいIEウィンドウを開いたり、既存のIEウィンドウを見つけたりしません。これはCitrixで実行しているためだと思いますが、よくわかりません。
今の私の唯一のリードは、IEのhWNDを使用して元のウィンドウに再接続するか、OLEの代わりにDDEを使用することです。ただし、主にドキュメントが不足しているため、これらのいずれにもあまり運がありませんでした。
だから、私の質問は:
- 私がやろうとしていることは可能です OLEを使用していますか?つまり、方法はありますか IEに対するハンドルを保持する ホストがスクリプト呼び出しを開始しましたか?
- GetObject()が動作することを期待すべきですか、 それとも行き止まりですか?
- Win32 APIを使用することは可能ですか ホスト開始スクリプトで hWNDを使用してIEに再接続しますか?
関連記事、サンプルコード、またはその他の洞察へのリンクは大歓迎です。
解決
AFAIK GetObjectは、InternetExplorerオブジェクトではサポートされていません。ただし、これで終わりではありません。)他の多くの方法 shell32のwindowsコレクションからヤンクできます。サンプルコード(上記のリンクのコードから修正)を機能させるには、次への参照を設定する必要があります。
- Microsoftインターネットコントロール
- Microsoft HTML Object Library
- Microsoftシェルコントロールとオートメーション
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のロボット化はかなり巧妙なアプローチです(多くの場合、これは有罪です)が、より優れた、より少ないリソース集約的な方法があるかもしれません。