Эмулятор терминала Reflection - Интеграция с IE
-
03-07-2019 - |
Вопрос
Я пытаюсь реализовать некоторую интеграцию между устаревшим приложением, запущенным в эмуляторе терминала Reflection, и браузерным приложением, работающим в IE.
Я использую сценарии, инициируемые хостом, чтобы проблемы с обслуживанием и развертыванием были изолированы от устаревшего приложения.Все сценарии будут сгенерированы в устаревшем приложении и переданы в Reflection с использованием escape-последовательностей.
В настоящее время я могу:
- Запустите IE
- Установите такие параметры, как скрытие панелей инструментов
- Перейдите по URL-адресу
- Передача информации о состоянии обратно в устаревшее приложение
- Дождитесь сигнала "закрыть" от устаревшего приложения
- Закрыть 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, но это Строка, а не объект.)
Вот пример того, что я хотел бы сделать:
Сценарий 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.Однако мне не очень повезло ни с тем, ни с другим, в основном из-за отсутствия документации.
Итак, мои вопросы таковы:
- Возможно ли то, что я пытаюсь сделать используя OLE?То есть, есть ли способ сохранить мой дескриптор в IE через вызовы скрипта, инициированные хостом?
- Должен ли я ожидать, что GetObject() сработает, или это тупик?
- Можно ли использовать Win32 API в скрипте, инициируемом хостом, для повторного подключения к IE с использованием hWND?
Мы будем очень признательны за любые ссылки на соответствующие статьи, примеры кода или другую информацию.
Решение
AFAIK GetObject просто не поддерживается для объекта InternetExplorer.Однако это еще не конец:) Среди много других способов вы можете извлечь его из коллекции Windows shell32.Чтобы пример кода (адаптированный из кода по ссылке выше) работал, вам необходимо установить ссылку на следующее:
- Средства управления Интернетом Microsoft
- Библиотека объектов Microsoft HTML
- Средства управления и автоматизации Microsoft Shell
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()
Затемнить objIE как SHDocVw.InternetExplorer
Затемнить doc как MSHTML.HTMLDocument
Установить objIE = GetIEByURL("http://www.google.com/")
Установить doc = objIE.document
MsgBox doc.body.innerText
Конечный вложенный файл
Частная функция получает URL-адрес (обычно URL-адрес в виде строки) Как SHDocVw.InternetExplorer
Затемняет objShell как Shell32.Оболочка
Dim objExplorer Как Shell32.ShellFolderView
Dim obj как объект
Установите objShell = Новая оболочка
Для каждого объекта в objShell.Windows
Если TypeOf obj равен SHDocVw.InternetExplorer, тогда
Если StrComp(obj.LocationURL, URL, vbTextCompare) = 0 и тогда
Завершите для
Завершить, если
Завершить, если
Следующий объект
Установите GetIEByURL = obj
Функция завершения
Однако я думаю, что, возможно, стоит обсудить, чего вы пытаетесь достичь.Роботизация IE - довольно неуклюжий подход (в котором я часто бываю виноват), но может быть лучший, менее ресурсоемкий способ.