Эмулятор терминала отражения - интеграция с IE - PullRequest
1 голос
/ 02 марта 2009

Я пытаюсь реализовать некоторую интеграцию между унаследованным приложением, запущенным в эмуляторе терминала отражения, и приложением на основе браузера, работающим в IE.

Я использую сценарии, инициированные хостом, чтобы проблемы обслуживания и развертывания были изолированы от устаревшего приложения. Все сценарии будут сгенерированы в унаследованном приложении и переданы в Reflection с помощью escape-последовательностей.

В настоящее время я могу:

  1. Запустите IE
  2. Настройка параметров, таких как скрытие панелей инструментов
  3. Перейдите на URL
  4. Передача информации о состоянии обратно в устаревшее приложение
  5. Ожидание сигнала «закрыть» из устаревшего приложения
  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

Проблема в том, что скрипт продолжает работать до тех пор, пока не получит команду закрытия из старого приложения.

Я хочу использовать один сценарий для запуска браузера, а другой - чтобы закрыть его или использовать повторно для другого URL. Тем не менее, я не смог найти способ сохранить свою ссылку на IE через вызовы сценария. Объявление objIE как глобального за пределами Sub Main не помогло. Объект Session сохраняется при вызове скрипта, но, похоже, у него нет свойства, которое я могу использовать для этой цели. (У сеанса есть свойство UserData, но это String, а не Object.)

Вот пример того, что я хотел бы сделать:

Сценарий 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

Я не могу понять, как реализовать функцию FindOriginalIE (), используемую в сценариях 2 и 3.

Я пытался использовать GetObject () вместо CreateObject (), но это ни к чему не привело. GetObject () не откроет новое окно IE или не найдет существующее. Я подозреваю, что это потому, что я работаю под Citrix, но я не уверен.

Мое единственное преимущество сейчас состоит в том, чтобы попытаться использовать hWND в IE для повторного подключения к исходному окну или использовать DDE вместо OLE. Однако мне не очень повезло с этим, в основном из-за отсутствия документации.

Итак, мои вопросы:

  1. Возможно ли то, что я пытаюсь сделать используя OLE? То есть есть ли способ чтобы сохранить мою ручку IE через инициированные хостом скриптовые вызовы?
  2. Должен ли я ожидать, что GetObject () будет работать, или это тупик?
  3. Возможно ли использовать Win32 API в хосте инициировал скрипт для повторно подключиться к IE с помощью hWND?

Будем весьма благодарны за любые ссылки на соответствующие статьи, примеры кода или другие идеи.

1 Ответ

1 голос
/ 16 декабря 2009

AFAIK GetObject просто не поддерживается для объекта InternetExplorer. Однако это не конец :) Среди многих других способов вы можете вытащить его из коллекции windows shell32. Для того, чтобы пример кода (адаптированный из кода по ссылке выше) работал, необходимо установить ссылку на следующее:

  1. Microsoft Internet Controls
  2. Библиотека объектов Microsoft HTML
  3. Средства управления и автоматизации Microsoft Shell

Public Sub RunMeFirst() Dim objIE As SHDocVw.InternetExplorer Set objIE = New SHDocVw.InternetExplorer objIE.Visible = True objIE.navigate "<a href="http://www.google.com/" rel="nofollow noreferrer">http://www.google.com/</a>" Do Until objIE.readyState = READYSTATE_COMPLETE DoEvents Loop End Sub</p> <p>Public Sub RunMeSecond() Dim objIE As SHDocVw.InternetExplorer Dim doc As MSHTML.HTMLDocument Set objIE = GetIEByURL("<a href="http://www.google.com/" rel="nofollow noreferrer">http://www.google.com/</a>") Set doc = objIE.document MsgBox doc.body.innerText End Sub</p> <p>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 - довольно хитрый подход (в котором я часто виновен), но может быть и лучший, менее ресурсоемкий способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...