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.
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. –
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. –