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 :
    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