Вопрос

Я пытаюсь реализовать некоторую интеграцию между устаревшим приложением, запущенным в эмуляторе терминала Reflection, и браузерным приложением, работающим в 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, но это Строка, а не объект.)

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

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

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

Это было полезно?

Решение

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

  1. Средства управления Интернетом Microsoft
  2. Библиотека объектов Microsoft HTML
  3. Средства управления и автоматизации 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 - довольно неуклюжий подход (в котором я часто бываю виноват), но может быть лучший, менее ресурсоемкий способ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top