none
Evénements C# et vbscript dans HTML RRS feed

  • Question

  • Bonjour,

    Nous développons actuellement un client RDP personnalisé en C# qui s'intégrera dans une page HTML (via une balise 'object').

    Nous arrivons à intégrer un client simple (pas de problème de connexion, ...).

    Par contre, dans l'exemple de Microsoft http://msdn.microsoft.com/EN-US/library/aa380809.aspx, à la fin du code, on voit apparaître des fonctions Sub qui 'catchent' des événements lancés par le composant ActiveX.

    Notre composant est basé sur un UserControl dans lequel est intégré le composant COM Terminal Services.

    Nous voulons pouvoir gérer les événements de la même manière.

    Quelle est la solution pour pouvoir 'attacher' notre gestion d'événements au script VB intégré à la page HTML?


    Je vous en remercie d'avance.
    jeudi 24 mars 2011 13:30

Réponses

  • J'ai trouvé la solution.

     

    Il faut donner un DispId à l'interface des événements (TSClientEvents) et déclarer le délégué dans la classe du Usercontrol.

     

    http://www.15seconds.com/issue/060309.htm

     

     

    lundi 28 mars 2011 09:49

Toutes les réponses

  • Voici un code de test.

     

    Je m'attache à l'événement OnDisconnected du composant RDP (la fonction _OnDisconnected est bien lancée).

     

    J'ai essayé d'implémenter du code que j'ai trouvé sur le site de Microsoft (Recherche sur 'How to : Raise Events Handled by a COM Sink')

     

    N'étant pas familier des délégués et d'après ce que j'ai compris, les 'public event' devraient être visibles au niveau COM de l'application appelante (du VBScript par exemple en déclarant une fonction Sub du nom de l'événement préfixé du nom de l'objet + underscore)...

     

    Le VBScript ne lance pas la fonction Sub correspondante à 'public event ... OnDisconnected'

     

    Qu'est-ce que j'ai manqué?

     

    Merci de votre aide

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace LPAPI_TSClient
    {
    
      public delegate void OnDisconnectedEventHandler(int disconnectCode);
    
    
      [Guid("F49446DB-91AC-49d8-A06A-D02DDAF47C48")]
      [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
      public interface TSClientEvents
      {
        void OnDisconnected(int disconnectCode);
      }
    
      [Guid("707F5D71-5201-421c-BE1D-917BB061A0B3")]
      [InterfaceType(ComInterfaceType.InterfaceIsDual)]
      public interface ITSClient
      {
        [DispId(2)] void _OnDisconnected(object sender, AxMSTSCLib.IMsTscAxEvents_OnDisconnectedEvent e);
      }
    
    
    
      [Guid("197FDA4E-5151-42db-82F0-713C611F47EE")]
      [ComSourceInterfaces(typeof(TSClientEvents), typeof(ITSClient))]
      public partial class TSClient : UserControl
      {
    
        public event OnDisconnectedEventHandler OnDisconnected;
    
        public TSClient()
        {
          
          InitializeComponent();
    
    
          axRdp.OnDisconnected += new AxMSTSCLib.IMsTscAxEvents_OnDisconnectedEventHandler(_OnDisconnected);
          
        }
    
    
    
    
        
        protected override void OnSizeChanged(EventArgs e)
        {
          base.OnSizeChanged(e);
          this.axRdp.Size = new System.Drawing.Size(this.Width, this.Height);
          
        }
    
    
        
    
        public void _OnDisconnected(object sender, AxMSTSCLib.IMsTscAxEvents_OnDisconnectedEvent e)
        {
          MessageBox.Show("c#");
          OnDisconnected(1);
        }
      }
    }
    
    vendredi 25 mars 2011 09:20
  • J'ai trouvé la solution.

     

    Il faut donner un DispId à l'interface des événements (TSClientEvents) et déclarer le délégué dans la classe du Usercontrol.

     

    http://www.15seconds.com/issue/060309.htm

     

     

    lundi 28 mars 2011 09:49