2009-03-02 2 views
1

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

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

Я в настоящее время в состоянии:

  1. Запуск IE
  2. опции Set, такие как скрытие панелей инструментов
  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 сохраняется в сценариях, но у него нет свойства, которое я могу использовать для этой цели. (Session имеет свойство UserData, но это строка, а не объект.)

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

Сценарий 1 - Открыть IE & Оставьте Open:


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 

Script 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

AFAIK GetObject просто не поддерживается для объекта InternetExplorer. Однако это еще не конец :) Среди many other ways вы можете вытащить его из коллекции 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 " 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

Я думаю, что это может быть стоит обсуждать то, что вы пытаетесь сделать, хотя. Roboting IE - довольно забавный подход (которого я часто виноват), но может быть лучше, менее ресурсоемкий способ.