문제

반사기 터미널 에뮬레이터에서 실행되는 레거시 앱과 IE에서 실행되는 브라우저 기반 앱간에 일부 통합을 구현하려고합니다.

유지 보수 및 배포 문제가 레거시 앱으로 격리되도록 호스트 시작 스크립트를 사용하고 있습니다. 모든 스크립트는 레거시 앱에서 생성되며 탈출 시퀀스를 사용하여 반사로 전송됩니다.

나는 현재 :

  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

이것의 문제점은 스크립트가 레거시 앱에서 Close 명령을 얻을 때까지 계속 실행된다는 것입니다.

내가하고 싶은 것은 하나의 스크립트를 사용하여 브라우저를 시작하고 다른 스크립트를 사용하고 다른 스크립트를 닫거나 다른 URL에 대해 재사용하는 것입니다. 그러나 스크립트 호출에서 IE에 대한 참조를 저장할 수있는 방법을 찾을 수 없었습니다. Objie를 Global Outside Sub Main으로 선언하는 것은 도움이되지 않았습니다. 세션 객체는 스크립트 호출에서 지속되지만이 목적으로 사용할 수있는 속성이있는 것으로 보이지 않습니다. (세션에는 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

내가 알아낼 수없는 부분은 스크립트 2와 3에 사용 된 findoriginalie () 함수를 구현하는 방법입니다.

CreateObject () 대신 getObject ()를 사용하려고 시도했지만 아무데도 없었습니다. getObject ()는 새 IE 창을 열지 않거나 기존 창을 찾지 않습니다. 나는 이것이 Citrix 아래에서 실행되기 때문에 이것이 확실하지 않다고 생각하지만 확실하지 않습니다.

내 유일한 리드는 IE의 HWND를 사용하여 원래 창에 다시 연결하거나 OLE 대신 DDE를 사용하는 것입니다. 그러나 나는 주로 문서화가 없기 때문에 그 중 어느 쪽이든 운이 많지 않았습니다.

그래서 내 질문은 다음과 같습니다.

  1. 내가 OLE을 사용하여 가능합니까? 즉, 호스트가 시작된 스크립트 통화를 통해 핸들을 IE로 유지하는 방법이 있습니까?
  2. getObject ()가 작동 할 것으로 예상해야합니까, 아니면 막 다른 골목입니까?
  3. HWND를 사용하여 IE와 다시 연결하기 위해 호스트 시작 스크립트에서 Win32 API를 사용할 수 있습니까?

관련 기사, 샘플 코드 또는 기타 통찰력에 대한 모든 링크는 대단히 감사합니다.

도움이 되었습니까?

해결책

Afaik getObject는 InternetexPlorer 객체에 대해 지원되지 않습니다. 그러나 이것은 끝이 아닙니다 :) 다른 많은 방법 Shell32의 Windows 컬렉션에서 꺼낼 수 있습니다. 예제 코드 (위의 링크의 코드에서 조정)는 작업을 위해 다음을 참조해야합니다.

  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 () 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

shdocvw.internetexplorer dim objshell as shell32. shell32.shell dim obexplorer as shell32. shellfolderview dim obj as objshell = new shell as objshell.windows typeof ovj 인 경우 shdocvw.internetexplorer ife if ife if ife if ife as objshell.windows as shell32. shell32. shell32. shell32. shellfolderview dim dim obj strcomp (obj.locationurl, url, vbtextcompare) = 0 & 그런 다음 다음 if 다음에 종료를 종료하십시오.

그래도 당신이 성취하려는 것을 논의 할 가치가 있다고 생각합니다. Roboting IE는 예쁜 Kludgey 접근법 (종종 유죄 인 경우)이지만 더 나은 리소스 집약적 인 방법이있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top