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.
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.
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 } }
Ensuite j'essaie de me servir du composant COM :
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.
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; }
Partager