2008-09-16 12 views
6

Admito que sé lo suficiente sobre la arquitectura COM y IE solo para ser peligroso. Tengo un C# .NET control ActiveX de trabajo similar a esto:.NET Componente ActiveX en IE - Cómo obtener la referencia del navegador

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"; 
      } 
     } 
    } 

I registrado y haya creado una biblioteca de tipos utilizando regasm:

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

Y puede crear una instancia con éxito esta en javascript:

var CTIAX = new ActiveXObject("CTI.CTIActiveX"); 
alert(CTIAX.GetMsg()); 

¿Cómo puedo obtener una referencia al sitio del cliente (ventana del navegador) dentro de CTIActiveX? He hecho esto en un BHO implementando IObjectWithSite, pero no creo que este sea el enfoque correcto para un control ActiveX. Si implemento cualquier interfaz (me refiero a la interfaz COM como IObjectWithSite) en CTIActiveX cuando intento crear instancias en Javascript me sale un error de que el objeto no admite la automatización.

Respuesta

3

En primer lugar, su interfaz necesita ComVisible (verdadero) para ser visto por el script de llamada (esto probablemente esté causando el error).

En segundo lugar, agregue .NETreference en su proyecto a "Microsoft.mshtml". Esto importará las interfaces COM para varias cosas relacionadas con el IE (ventanas, documentos HTML, etc.)

Entonces, es necesario agregar una propiedad de tipo IHTMLDocument2 a su interfaz:

IHtmlDocument2 Document { set; } 

... implementarlo en su clase:

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

... llamaremos a partir de la escritura

CTIAX.Document = document; 

... una vez que se ha almacenado una referencia al documento, puede usarlo a voluntad para acceder a la ventana, a otros marcos o a cualquier parte del HTML DOM que desee.

+0

Buena respuesta que me ayuda con otro problema; sin embargo, no es exactamente lo que estoy buscando. IHTMLDocument2.parentWindow devuelve un mshtml.IHTMLWindow2, no SHDocVw.WebBrowser. Estoy buscando SHDocVw.WebBrowser, así que puedo acceder a los métodos GetProperty y PutProperty para comunicarme con un BHO. –

+0

Además, para ser claros, el ejemplo en la pregunta sí funciona. ComVisible (verdadero) no parece ser necesario si la clase de implementación especifica ComVisible como en mi ejemplo. Solo se rompe si implemento explícitamente una interfaz COM como IObjectWithSite. –

1

He encontrado una solución viable. No es ideal porque depende de la coincidencia de la URL de ubicación de la ventana de IE para obtener el contenedor correcto, pero funciona. En mi caso, estoy usando un valor especial en la cadena de consulta para asegurarme de obtener la ventana correcta.

Esto obtiene una referencia a SHDocVw.InternetExplorer, que expone la misma GetProperty y PutProperty que hace SHDocVw.WebBrowser:

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

¿Cómo obtuviste esa url en primer lugar? –

0

Hay una manera simple y limpio para hacerlo:

public void GetBrowser() 
     { 

      ShellWindows m_IEFoundBrowsers = new ShellWindows(); 

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

     } 
Cuestiones relacionadas