Reflection Terminal Emulator で実行されているレガシー アプリと IE で実行されているブラウザー ベースのアプリとの統合を実装しようとしています。
Host Initiated Scripts を使用しているため、メンテナンスと展開の問題はレガシ アプリに分離されます。すべてのスクリプトはレガシー アプリで生成され、エスケープ シーケンスを使用して Reflection に送信されます。
現在、次のことができます。
- IEを起動
- ツールバーの非表示などのオプションを設定する
- URL に移動する
- ステータス情報をレガシー アプリに送り返す
- レガシ アプリからの「閉じる」信号を待ちます
- 閉じる
これを行うための 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
これに関する問題は、レガシー アプリから閉じるコマンドを取得するまでスクリプトが実行され続けることです。
私がやりたいことは、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 ウィンドウを開いたり、既存のウィンドウを見つけたりしません。これは、私が Citrix で実行しているためだと思われますが、よくわかりません。
私の唯一の手がかりは、IE の hWND を使用して元のウィンドウに再接続するか、OLE の代わりに DDE を使用することです。ただし、主にドキュメントが不足しているため、どちらもうまくいきませんでした。
だから、私の質問は次のとおりです。
- 私がやろうとしていることは、OLE を使用して可能ですか? つまり、ホストが開始したスクリプト呼び出し全体でハンドルを IE に保持する方法はありますか?
- GetObject() が機能することを期待する必要がありますか、それとも行き止まりですか?
- ホストが開始するスクリプトで Win32 API を使用して、hWND を使用して IE に再接続することはできますか?
関連記事、サンプル コード、またはその他の洞察へのリンクは大歓迎です。