2008-09-16 3 views
6

나는 COM 및 IE 아키텍처에 대해서만 충분히 알고 위험하다고 인정합니다.IE의 .NET ActiveX 구성 요소 - 브라우저 참조를 얻는 방법

using System; 
using System.Runtime.InteropServices; 
using BrowseUI; 
using mshtml; 
using SHDocVw; 
using Microsoft.Win32; 

    namespace CTI 
    { 
     public interface CTIActiveXInterface 
     { 
      [DispId(1)] 
      string GetMsg(); 
     } 

     [ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)] 
     public class CTIActiveX : CTIActiveXInterface 
     { 

      /*** Where can I get a reference to SHDocVw.WebBrowser? *****/ 
      SHDocVw.WebBrowser browser; 

      public string GetMsg() 
      { 
       return "foo"; 
      } 
     } 
    } 

내가 등록 RegAsm을 사용하여 형식 라이브러리를 생성 :

regasm CTIActiveX.dll /tlb:CTIActiveXNet.dll /codebase 

을 성공적으로 자바 스크립트에서이 인스턴스를 할 수 있습니다

var CTIAX = new ActiveXObject("CTI.CTIActiveX"); 
alert(CTIAX.GetMsg()); 
나는이 유사한 작업의 C# .NET ActiveX 컨트롤을

CTIActiveX에서 클라이언트 사이트 (브라우저 창)에 대한 참조를 얻으려면 어떻게해야합니까? IObjectWithSite를 구현하여 BHO에서이 작업을 수행했지만이 방법이 ActiveX 컨트롤에 대한 올바른 접근 방식이라고 생각하지 않습니다. Javascript에서 인스턴스를 만들려고 할 때 CTIActiveX에서 어떤 인터페이스 (IObjectWithSite와 같은 COM 인터페이스)를 구현하면 객체가 자동화를 지원하지 않는다는 오류가 발생합니다.

답변

3

먼저 호출 스크립트에서 볼 수 있도록 인터페이스에 ComVisible (true)이 필요합니다 (이로 인해 오류가 발생할 가능성이 있음).

둘째, "Microsoft.mshtml"에 프로젝트의 .NET 참조를 추가하십시오. 이것은 다양한 IE 관련 것들 (등 창, HTML 문서)

에 대한 COM 인터페이스를 가져옵니다 그런 다음, 당신은 당신의 인터페이스 유형 IHTMLDocument2에의 속성을 추가해야합니다

IHtmlDocument2 Document { set; } 

... 클래스에서 구현 ... ...

public IHtmlDocument2 Document 
{ 
    set { _doc = value;} 
} 

을 스크립트

CTIAX.Document = document; 

에서 호출하면 한 번 문서에 대한 참조를 저장했다면 원하는대로 창, 다른 프레임 또는 원하는 HTML DOM 부분으로 가져올 수 있습니다.

+0

이 같은 GetProperty를하고 PutProperty이 SHDocVw.WebBrowser가하는 노출 SHDocVw.InternetExplorer에 대한 참조를 가져옵니다 다른 문제로 나를 도와주는 답. 그러나 그것은 내가 찾고있는 것이 아닙니다. IHTMLDocument2.parentWindow는 SHDocVw.WebBrowser가 아닌 mshtml.IHTMLWindow2를 반환합니다. BHO와 통신하기 위해 GetProperty 및 PutProperty 메서드를 사용할 수 있도록 SHDocVw.WebBrowser를 찾고 있습니다. –

+0

또한 분명히하기 위해 질문의 예가 ​​효과적입니다. 예제 에서처럼 구현 클래스가 ComVisible을 지정하면 ComVisible (true)이 필요하지 않은 것처럼 보입니다. IObjectWithSite와 같은 COM 인터페이스를 명시 적으로 구현하는 경우에만 중단됩니다. –

1

실용적인 해결책을 찾았습니다. Internet Explorer 창의 위치 URL을 일치시켜 올바른 컨테이너를 얻는 방식에 의존하기 때문에 이상적이지는 않지만 제대로 작동합니다. 제 경우에는 쿼리 문자열에 특별한 값을 사용하여 올바른 창을 표시하는지 확인합니다.

private InternetExplorer GetIEWindow(string url) 
{ 
    SHDocVw.ShellWindowsClass sh = new ShellWindowsClass(); 
    InternetExplorer IE; 

    for (int i = 1; i <= sh.Count; i++) 
    { 
     IE = (InternetExplorer)sh.Item(i); 
     if (IE != null) 
     { 
      if (IE.LocationURL.Contains(url)) 
      { 
       return IE; 
      } 
     } 
    } 

    return null; 
} 
+1

처음에 어떻게 그 URL을 얻었습니까? –

0

이 간단하고 깨끗한 방법은 그것을 할 : : 좋은

public void GetBrowser() 
     { 

      ShellWindows m_IEFoundBrowsers = new ShellWindows(); 

      foreach (InternetExplorer Browser in m_IEFoundBrowsers) 
      { 
       webBrowser = (SHDocVw.WebBrowser) Browser; 
       // do what you want ... 
      } 

     }