Я пытаюсь реализовать некоторую интеграцию между унаследованным приложением, запущенным в эмуляторе терминала отражения, и приложением на основе браузера, работающим в 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, но это 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. Однако мне не очень повезло с этим, в основном из-за отсутствия документации.
Итак, мои вопросы:
- Возможно ли то, что я пытаюсь сделать
используя OLE? То есть есть ли способ
чтобы сохранить мою ручку IE через
инициированные хостом скриптовые вызовы?
- Должен ли я ожидать, что GetObject () будет работать,
или это тупик?
- Возможно ли использовать Win32 API
в хосте инициировал скрипт для
повторно подключиться к IE с помощью hWND?
Будем весьма благодарны за любые ссылки на соответствующие статьи, примеры кода или другие идеи.