IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Evênement d'un composant COM


Sujet :

C++Builder

  1. #1
    DR
    DR est déconnecté
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2002
    Messages : 28
    Par défaut Evênement d'un composant COM
    Bonjour,

    J'ai fait un composant COM en .net et il fonctionne très bien, du moins je crois .
    De .net à .net, ça fonctione très bien car ça ne passe pas par les couches COM .
    A parti d'Excel mon composant bien bien .
    Mais à partir de C++ Builder (5), j'arrive à affecter mes propriétés , j'arrive à appeler mes méthodes , mais je n'arrive pas à affecter mes évênements . La lithérature (bouquin, aide en ligne , internet...) n'est pas très causante sur ce sujet.

    Si vous aviez une petite idée pour moi ?

    Voici mon code .net :
    Il s'agit d'une classe Employe à laquelle on peut affecter un nom et une date de naissance. Et si on affecte la date de naissance le jour de son anniversaire, la classe doit rappeler un évênement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
     
     
    namespace ClassLibrary1
    {
      public delegate void AnniversaireEventHandler(string nom);
     
      [ComVisible(true)]
      [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
      public interface Employe_Events
      {
        void Anniversaire(string nom);
      }
     
      [ComVisible(true)]
      [ProgId("ClassLibrary1.Employe")]
      [Guid("2A5FE789-63F4-406b-954A-0B6F025DFB9F")]
      [ClassInterface(ClassInterfaceType.AutoDual)]
      [ComSourceInterfaces(typeof(Employe_Events))]
      public class Employe
      {
        #region Variables privées
        private string _nom;
        private DateTime _dateNaissance;
        #endregion
     
        #region Propriétés
        [DispId(0)]
        public string Nom
        {
          get { return _nom; }
          set { _nom = value; }
        }
     
        public DateTime DateNaissance
        {
          get { return _dateNaissance; }
          set
          {
            //MessageBox.Show(value.ToShortDateString());
            _dateNaissance = value;
            if ((Anniversaire != null) &&
              (value.Day == DateTime.Now.Day) &&
              (value.Month == DateTime.Now.Month))
            {
              Anniversaire(this.Nom);
            }
          }
        }
     
        #endregion
     
        #region Evênements
        public event AnniversaireEventHandler Anniversaire;
     
        #endregion
     
        #region Fonctions
        public Employe()
        {
        }
     
        [ComRegisterFunction]
        private static void Register(Type t)
        {
          //MessageBox.Show("Enregistrement");
        }
     
        [ComUnregisterFunction]
        private static void UnRegister(Type t)
        {
          //MessageBox.Show("Désenregistrement");
        }
     
        #endregion
      }
    }
    Dans Builder, je suis passé par le menu Projet/Importer une bibliothèque de types... puis par le bouton "Créer l'unité" pour ajouter le code (ClassLibrary1_TLB.h et ClassLibrary1_TLB.cpp) à mon projet.

    Ensuite j'essaie de me servir du composant COM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "ClassLibrary1_TLB.h"
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
      TCOM_Employe *e = new TCOM_Employe();
      CoInitialize(NULL);
      HRESULT resultat = e->CreateInstance(L"ClassLibrary1.Employe");
      e->nom = L"David";
      //e->add_Anniversaire((LPUNKNOWN)&OnAnniv2);
      //e->add_Anniversaire(t);
      e->DateNaissance = (double)TDateTime(2000,05,11);
      ShowMessage(e->nom);
      e->Release();
      delete e;  
    }
    Les commentaires pour affecter l'évênement sont des essais, mais aucun d'eux ne fonctionne (soit à la compile, soit à l'exécution). Le reste fonctionne.

  2. #2
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Par défaut
    Tout d'abord
    dans ton code source dotnet
    déclares ton event de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	[ComVisible(true)]
    	[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    	public interface Employe_Events
    	{
    		[DispId(1)] void Anniversaire(string nom);
    	}
    Je t'ai crée une classe spéciale qui permet de se connecter à l'interface event d'un objet COM de type employée

    cet objet te permet de cree en meme temps un objet com de type employé et en plus de faire une belle connection au flux d'event...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #ifndef __EMPLOYE_H__
    #define __EMPLOYE_H__
     
     
    #include "ClassLibrary1_TLB.h"
    #include <utilcls.h>
     
    	//Closure pour recevoir l'événement du serveur COM.
       typedef void (__closure * TEventAnniversaire)(BSTR nom/*[in]*/);
     
    	class EmployeEventReceiver : public TEventDispatcher<EmployeEventReceiver, &DIID_Employe_Events>
    	{
    	public:
    		EmployeEventReceiver() { Connect(); }
    		virtual ~EmployeEventReceiver() { Disconnect(); }
     
    		//__Closure pour s'abonner à l'événement
    		__property TEventAnniversaire OnAnniversaire={ read=FOnAnniversaire, write=FOnAnniversaire };
     
    des addref et release.
    		__property EmployePtr EmployeeCOM = { read = m_Ptr };
     
    		//overloaded from TEventDispatcher.
    		//See tlb for disp Ids of the event interface :
    		HRESULT InvokeEvent(DISPID id, TVariant *params)
    		{
    			try
    			{
    				switch(id)
    				{
    				case 1:
    					if (FOnAnniversaire)
    						(FOnAnniversaire)((BSTR)TVariant(params[0]));
    					break;
     
    				default:
    					break;
    				}
    			}
    			catch(...)
    			{
     
    			}
    			return S_OK;
    		}
     
    	private:
    		void Connect()
    		{
    			if(false == m_Ptr.IsBound())
    			{
    				m_Ptr.CreateInstance(CLSID_Employe);
    			}
    			ConnectEvents(m_Ptr);
    		}
     
    		void Disconnect()
    		{
    			if(m_Ptr.IsBound())
    			{
    				DisconnectEvents(m_Ptr);
    				m_Ptr.Release();
    			}
    		}
    		EmployePtr m_Ptr;
     
    		TEventAnniversaire FOnAnniversaire;
    	};
     
    #endif
    code dans la forme main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    il faut declarer dans le .h : void OnAnniversaireReceived(BSTR nom/*[in]*/);
    dans mon code Dotnet j'ai fait leve l'event anniversaire quand le nom a été changé....c'est un peu différent du tien
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
     
       m_receiver = new EmployeEventReceiver();
       m_receiver->OnAnniversaire = OnAnniversaireReceived;
     
    }
    void TForm1::OnAnniversaireReceived(BSTR nom/*[in]*/)
    {
       AnsiString Annif = AnsiString(nom);
       ShowMessage(Annif);
    }
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       if (0 !=  m_receiver)
       {
          m_receiver->EmployeeCOM->nom = WideString("Essai");
       }
    }

  3. #3
    DR
    DR est déconnecté
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2002
    Messages : 28
    Par défaut
    Merci pour ta réponse. J'ai compris l'esprit du code, mais pas le compilateur C++ ; il me plante avec l'erreur :
    Unresolved external '__fastcall COMHlpr_DisconnectEvents(const _GUID&, IUnknown *, unsigned long&)' referenced from UNIT.OBJ
    Unresolved external '__fastcall COMHlpr_ConnectEvents(const _GUID&, IUnknown *, unsigned long&)' referenced from UNIT.OBJ
    En enlevant les lignes suivantes dans ton code, ça compile, mais ça ne fait plus rien de correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DisconnectEvents(m_Ptr);
    Aurais-tu une idée ? Y-a-t'il une condition (define) à mettre, une lib à inclure...

  4. #4
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Par défaut
    envoies moi tes sources car je ne comprends pas ton erreur de compilation.

  5. #5
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Par défaut
    au fait on le met résolu ou pas ? pas de nouvelle, bonne nouvelle

Discussions similaires

  1. Développement d'un composant COM
    Par inertia dans le forum C++
    Réponses: 18
    Dernier message: 01/06/2006, 15h21
  2. [ATL] Debuguer un composant COM+ 1.0
    Par glKabuto dans le forum MFC
    Réponses: 8
    Dernier message: 16/05/2006, 19h22
  3. [VB] Problème composants COM Word
    Par Vince dans le forum VBA Word
    Réponses: 5
    Dernier message: 08/12/2005, 10h18
  4. [C#] C# et composant COM
    Par beway dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/11/2004, 08h56
  5. Composant COM et style XP
    Par Reisubar dans le forum Composants VCL
    Réponses: 7
    Dernier message: 10/11/2003, 19h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo