En un post anterior detallé los pasos básicos necesarios para la implementación de un ActiveX con .NET (C#). Pero faltó por describir aquellos necesarios para la interacción de la página HTML con el ActiveX y de este con la página.

Interacción de la página con el ActiveX

La interacción de la página con el ActiveX consiste en poder llamar a métodos del ActiveX o establecer y/o recuperar valores de propiedades públicas del mismo.

Para establecer el valor de una propiedad haremos lo siguiente:

  1. Marcar la propiedad, a la que queremos acceder desde la página, como visible para COM.
  2. [ComVisible(true)]
    public string Property1
    {
        get; set;
    }
  3. Establecer el valor de la propiedad pasándolo como parámetro del ActiveX
  4. <object id="MyActiveX" width="306px" height="167px" classid="clsid:D857B4F5-8684-453e-82C8-7F493CBE5592"
                viewastext style="border-style:dashed">
        <param name="Property1" value="desde Javascript" />
        <p>
            Pon el texto que quieras mostrar si se abre la página con un browser no compatible
            o si el ActiveX no está instalado correctamente.             
        </p>
    </object>
  5. Recuperar el valor de la propiedad del ActiveX
  6. <script type="text/javascript">
        function Method1() {
            alert(MyActiveX.Property1);
        }
    </script>

Para llamar a un método del ActiveX haremos lo siguiente:

  1. Marcar el método que queremos llamar como visible para COM.
  2. [ComVisible(true)]
    public void Method1()
    {
        MessageBox.Show("Hola Mundo desde Javascript");
    }
  3. Llamar el método desde la página.
  4. <script type="text/javascript">
        function Method2() {
            MyActiveX.Method1();
        }
    </script>
    y si abrimos la página en Internet Explorer y hacemos clic en el nuevo botón veremos lo siguiente
    LlamadaDesdeJS

Interaccion del ActiveX con la página

La interacción del ActiveX con la página consiste en poder ejecutar código javascript desde el ActiveX. Esta funcionalidad esta muy bien descrita en este artículo de microsoft y en esencia se trata de crear eventos en .NET y suscribirse a estos desde javascript.

Para ello implementamos la siguiente interface.

using System.Runtime.InteropServices;

namespace MyActiveX
{
    public delegate void ControlEventHandler(string eventArgs);

    [Guid("0422D916-C11A-474e-947D-45A107038D12")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [ComVisible(true)]
    public interface IControlEvents
    {
        [DispId(0x60020000)]
        void Execute(string handler);
    }
}

Marcamos el control tal como sigue

[ClassInterface(ClassInterfaceType.AutoDispatch), ComSourceInterfaces(typeof(IControlEvents))]
[ComVisible(true), Guid("D857B4F5-8684-453e-82C8-7F493CBE5592")]
public partial class MyUserControl : UserControl
{
    ...
}

Luego creamos un evento y el método que lo dispara

public event ControlEventHandler Execute;

private void OnExecute(string handler)
{
    if (Execute != null)
        Execute(handler);
}

Una vez hecho esto en la página HTML nos suscribimos al evento de la siguiente forma

<script type="text/javascript">        
    function MyActiveX::Execute(param)
    {
        alert(param)
    }
</script>

y ya solo los queda llamarlo cuando haga falta. Para este ejemplo la llamada la haremos al hacer click en un botón del control.

mapping_events

y esto ha sido todo. Creo que solo quedaría lo relacionado con marcar el ActiveX como seguro para scripting pero eso es algo que podemos retomar en otro post. Mientras tanto aquí les dejo el código fuente.


 |