1

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

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

現在、次のことができます。

  1. IEを起動
  2. ツールバーの非表示などのオプションを設定する
  3. URL に移動する
  4. ステータス情報をレガシー アプリに送り返す
  5. レガシ アプリからの「閉じる」信号を待ちます
  6. 閉じる

これを行うための 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 を使用することです。ただし、主にドキュメントが不足しているため、どちらもうまくいきませんでした。

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

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

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

4

1 に答える 1

1

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

  1. Microsoftインターネットコントロール
  2. MicrosoftHTMLオブジェクトライブラリ
  3. Microsoft Shell Controls and Automation

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のロボット化は、かなり厄介なアプローチですが(私はしばしば罪を犯します)、より優れた、リソースをあまり消費しない方法があるかもしれません。

于 2009-12-16T04:15:47.817 に答える