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.