質問

Reflection Terminal Emulatorで実行されているレガシーアプリとIEで実行されているブラウザベースのアプリとの統合を実装しようとしています。

Host Initiated Scriptsを使用して、メンテナンスと展開の問題をレガシーアプリに分離しています。すべてのスクリプトはレガシーアプリで生成され、エスケープシーケンスを使用してReflectionに送信されます。

現在できること:

  1. IEを起動
  2. ツールバーの非表示などのオプションを設定します
  3. URLに移動する
  4. ステータス情報を従来のアプリに送信
  5. " close"を待つ従来のアプリからの信号
  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

これに関する問題は、レガシーアプリから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を使用することです。ただし、主にドキュメントが不足しているため、これらのいずれにもあまり運がありませんでした。

だから、私の質問は:

  1. 私がやろうとしていることは可能です OLEを使用していますか?つまり、方法はありますか IEに対するハンドルを保持する ホストがスクリプト呼び出しを開始しましたか?
  2. GetObject()が動作することを期待すべきですか、 それとも行き止まりですか?
  3. Win32 APIを使用することは可能ですか ホスト開始スクリプトで hWNDを使用してIEに再接続しますか?

関連記事、サンプルコード、またはその他の洞察へのリンクは大歓迎です。

役に立ちましたか?

解決

AFAIK GetObjectは、InternetExplorerオブジェクトではサポートされていません。ただし、これで終わりではありません。)他の多くの方法 shell32のwindowsコレクションからヤンクできます。サンプルコード(上記のリンクのコードから修正)を機能させるには、次への参照を設定する必要があります。

  1. Microsoftインターネットコントロール
  2. Microsoft HTML Object Library
  3. 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のロボット化はかなり巧妙なアプローチです(多くの場合、これは有罪です)が、より優れた、より少ないリソース集約的な方法があるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top