Foros del Web » Programando para Internet » Javascript »

Recibir eventos de una DLL mediante COM

Estas en el tema de Recibir eventos de una DLL mediante COM en el foro de Javascript en Foros del Web. Buenas a todos, para una DLL proporcionada por un fabricante, la documentación de la DLL (se limita a mostrar los métodos, interfaces y eventos) indica ...
  #1 (permalink)  
Antiguo 21/04/2015, 13:33
 
Fecha de Ingreso: marzo-2011
Mensajes: 13
Antigüedad: 13 años, 1 mes
Puntos: 0
Recibir eventos de una DLL mediante COM

Buenas a todos,

para una DLL proporcionada por un fabricante, la documentación de la DLL (se limita a mostrar los métodos, interfaces y eventos) indica que se puede utilizar tanto haciendo referencia a ella desde .NET, como via COM, literalmente indica:


"The object can be added to a project for connection via COM or it can be added
to a Microsoft .NET project as a reference for integration via .NET."

Para .NET hemos conseguido (no sin poco esfuerzo) utilizar dicha DLL, llamar a sus métodos, esperar sus eventos y realizar acciones en base a estos eventos.

Pero el problema es que necesitamos realizar los mismo desde una web, por lo que hemos intentado acceder vía COM sin todo el éxito deseado. Por ahora hemos conseguido instanciar un objeto del tipo necesario, y ejecutar sus métodos, pero no hemos podido conseguir que los eventos funcionen de manera correcta, básicamente el navegador peta al recibirlo. El codigo que tenemos actualmente es:

Código HTML:
<html>
    <head>
		<meta charset="UTF-8">
		
		<object name="BSAClient" id="BSAClient" classid="clsid:90bfaaff-4317-4c22-ba36-c7563c03c0a2" /></object>

        <script language='JavaScript'>
				
			//Se arranca la aplicacion de BLustar
			function ejecutaBS() {				
				BSAClient.LaunchBSA();
			}
			
			
			//Se inicializa la conexion con Blustar ya arrancado
			function inicializaConexion() {
				resultadoInicializar = BSAClient.Initialize();
							
				if (resultadoInicializar)
				{
					alert("Conexion contra BSA establecida correctamente");

				}else{
					alert("Fallo en la conexion contra BSA");
				}
			}

			
			//Se cierra la conexion con BLustar
			function cerrarBS() {				
				BSAClient.CloseApplication();		
			}			

        </script>
	
		
		
		<SCRIPT LANGUAGE="javascript" FOR="BSAClient" EVENT="OnApplicationReadyForInitialization()">
		<!--
			alert("Aplicacion preparada para inicializacion");
		//-->		
		</SCRIPT>		
		
    </head>
    <body>
 
		<form name='formPrincipal'>
		
			<table border='1' width='500px' align='center'>
			<tr>
				<td>
					Ejecutar aplicación: 
				</td>
				<td>
					<input type='button' name='ejecutaBS' value='Ejecuta BS' onClick='javascript:ejecutaBS();'>
				</td>
			</tr>
			<tr>
				<td>
					Inicializar conexión : 
				</td>
				<td>
					<input type='button' name='ejecutaBS' value='Ejecuta BS' onClick='javascript:inicializaConexion();'>
				</td>
			</tr>			
			<tr>
				<td>
					Cerrar aplicación Blustar: 
				</td>
				<td>
					<input type='button' name='cerrarBS' value='Cerrar BS' onClick='javascript:cerrarBS();'>
				</td>
			</tr>			
			</table>
			
		</form>
		
    </body>
</html> 

Los 3 botones hacen lo que deben, uno de ellos arranca un programa (especifico del fabricante y para el que se ha creado la DLL), otro inicializa una "conexión" contra el programa ya abierto, y el ultimo cierra el programa.

Entre los muchos eventos proporcionados por ahora solo hemos puesto el "OnApplicationReadyForInitialization", que se ejecuta cuando después de arrancar el programa con el primer botón, dicho programa se encuentra preparado para que se incialice la conexion con el segundo botón.

Sabemos que esta llegando a este evento, lo esta detectanado, por que si en vez de "OnApplicationReadyForInitialization" ponemos el evento "meLoAcaboDeInventar" que evidentemente no existe, el script sigue ejecutandose normalmente (por que no coincide ese evento con nada que tenga programado). En cambio, si ponemos un nombre de evento correcto, el navegador peta (solo probado en Internet Explorer que es obligación en nuestro caso), con independencia de la versión del navegador (probado en un IE 11, IE 9, IE8), con todos los frameworks cargados, y todos los redistributables.

El error que saca el navegador es:

Cita:
Firma con problemas:
Nombre del evento de problema: CLR20r3
Firma del problema 01: iexplore.exe
Firma del problema 02: 11.0.9600.17728
Firma del problema 03: 55024724
Firma del problema 04: mscorlib
Firma del problema 05: 4.0.30319.17929
Firma del problema 06: 4ffa561c
Firma del problema 07: 10d1
Firma del problema 08: 1eb
Firma del problema 09: System.Reflection.Target
Versión del sistema operativo: 6.1.7601.2.1.0.256.48
Id. de configuración regional: 3082
Información adicional 1: 0a9e
Información adicional 2: 0a9e372d3b4ad19135b953a78882e789
Información adicional 3: 0a9e
Información adicional 4: 0a9e372d3b4ad19135b953a78882e789

Lea nuestra declaración de privacidad en línea:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0c0a

Si la declaración de privacidad en línea no está disponible, lea la declaración de privacidad sin conexión:
C:\Windows\system32\es-ES\erofflps.txt

Es cierto que para la versión en .NET ha sido necesario utilizar delegados y manejadores de eventos propios de la clase, por que sino también petaba. Por esto, y como suponer en gratis, quizás lo que pueda estar pasando en que al producirse el evento se esta intentado entrar en una zona de memoria no permitida.

Por si fuera de utilidad, en .NET la parte de programación para este evento es:

Código:
namespace WindowsFormsApplication2
{

    public delegate void Delegado_ApplicationReadyForInitializationEventHandler();
    
    public partial class Form1 : Form
    {
        BSAClient cliente = new BSAClient();   



        public Form1()
        {

            InitializeComponent();
            
            //Evento para cuando el Blustar informa que esta listo para que esta aplicacion se conecte a el 
            cliente.OnApplicationReadyForInitialization += new BSAClient.ApplicationReadyForInitializationEventHandler(cliente_OnApplicationReadyForInitialization);            
        }




        public void cliente_OnApplicationReadyForInitialization()
        {
            if (this.InvokeRequired)
            {
                Delegado_ApplicationReadyForInitializationEventHandler delegado = new Delegado_ApplicationReadyForInitializationEventHandler(cliente_OnApplicationReadyForInitialization);
                this.Invoke(delegado);
            }
            else
            {
                textBox1.Text = "Preparado para inicializacion";
            }
        }


        
    }
}


A ver si alguno se le ocurre que pueda estar pasando....y sobre todo, como solucionarlo...


Muchas gracias.

Etiquetas: dll, eventos, funcion, html, input, mediante, recibir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:08.