Bonjour à tous,
Je suis déjà intervenu dans plusieurs posts à ce sujet, et vous m'avez donné différentes
pistes que j'ai étudié.
Aujourd'hui, je passe à la mise en pratique et comme je n'arrive toujours pas à réaliser le
Set de ma classe, je me permets de créer ce sujet en espérant bientôt le marquer comme Résolu
grâce à votre aide
La solution que je tente de mettre en oeuvre est basée sur les interventions de rv26t dans ce
post: http://www.developpez.net/forums/d13...cutables-lier/
et sur l'article de Eric Vernié suivant : http://msdn.microsoft.com/fr-fr/library/bb727303.aspx.
1ère étape: Création de la DLL sous Microsoft Visual Basic 2008 Express
Edition
Je lance l'environnement en tant qu'administrateur, et je créé un projet de type bibliothèque
de classe.
Le code est le suivant:
Dans les propriétés du projet, onglet Application, bouton Assembly Information, je coche
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 ''' <summary>L'interface représente un Wrapper de la classe Alarme pour les programmes exe vb6.</summary> ''' <remarks>Sera exportée dans la bibliothéque de type créé dans l'assembly.</remarks> Public Interface IAlarmes Property Nom() As String Sub GestAlarme() End Interface ''' <summary>La classe alarme visible.</summary> ''' <remarks>Les éléments public seront visible. ''' Bien implémenter toutes les définitions de l'interface.</remarks> <ComClass(Alarme.ClassId, Alarme.InterfaceId, Alarme.EventsId)> _ Public Class Alarme Implements IAlarmes ' contrat entre classe et interface. #Region "COM GUIDs" ' These GUIDs provide the COM identity for this class ' and its COM interfaces. If you change them, existing ' clients will no longer be able to access the class. Public Const ClassId As String = "4a0e43b3-c03d-4a5e-a236-f2c5494e5325" Public Const InterfaceId As String = "19990bbb-65e8-4726-b01e-b1df1b120540" Public Const EventsId As String = "6e86907a-52d3-4087-8af6-c341a64a76eb" #End Region Private mNom As String ''' <summary>Une propriété pour exemple</summary> ''' <value>La nouvelle valeur de la propriété.</value> ''' <returns>La valeur de la propriété.</returns> ''' <remarks>Bien implémenter l'interface.</remarks> Public Property Nom() As String _ Implements IAlarmes.Nom ' implémentation de la propriété définie dans l'interface Get Return mNom End Get Set(ByVal value As String) mNom = value End Set End Property Public Sub New() 'MyBase.New() End Sub ''' <summary>Une procedure de test.</summary> ''' <remarks>Bien implémenter l'interface.</remarks> Public Sub GestAlarme() _ Implements IAlarmes.GestAlarme ' implémentation de la procédure définie dans l'interface MsgBox("alarme") MsgBox("Mon nom est " & mNom) End Sub End Class
"Make Assembly code visible":
Je compile via le menu Build et j'obtiens le fichier Alarmes.dll
2ème étape: Création du fichier .tlb
A présent que je dispose du fichier Alarmes.dll, il faut construire la bibiothèque de type
Alarmes.tlb (car celle-ci ne peut pas être générée automatiquement avec la version Express)
Pour cela, j'ai testé 2 solutions qui donnent (à priori) le même résultat:
a) En utilisant Regasm
Je place Regasm.exe dans le même répertoire que Alarmes.dll
J'ouvre la console "invite de commandes" en tant qu'administrateur
Je tape la commande:
b) En utilisant l'outil mis à disposition par Eric Vernié (cf référence de l'article plus
Code : Sélectionner tout - Visualiser dans une fenêtre à part Regasm Alarmes.dll /tlb
haut)
Dans les 2 cas j'obtiens le fichier Alarmes.tlb
3ème étape: Ecriture de la macro sous Excel Office 2007
J'ajoute la référence à la DLL en utilisant le fichier Alarmes.tlb
Dans un module VBA, je tape le code suivant :
Le code est donc déclenché par l'appui sur un bouton (Bouton2).
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 Option Explicit Private monAlarme As Alarmes.Alarme ' la classe vb.net Private monAlInt As Alarmes.IAlarmes ' l'interface pour vb6 ' programmation classique (miracle) Sub Bouton2_Clic() ' ' Bouton2_Clic Macro ' Set monAlarme = New Alarmes.Alarme ' implémente la classe alarme (nous avons un objet alarme) Set monAlInt = monAlarme ' récupère l'interface à partir de l'objet alarme (permet d'avoir l'Intellisense ce qui est très pratique) MsgBox "clic sur le bouton" monAlInt.Nom = "alarme1" ' attribue un nom Call monAlInt.GestAlarme ' appele la sub 'Call GestAlarme ' appele la sub Set monAlarme = Nothing Set monAlInt = Nothing End Sub
Malheureusement, ça ne fonctionne pas.
J'obtiens l'erreur suivante:
L'erreur survient au Set de la classe:
J'ai vraiment besoin de votre aide !!!
Pour commencer, je ne comprends pas à quoi correspond le numéro GUID présent sur la fenêtre "Assembly Information" (cf image jointe), car il n'en est pas question dans les articles en référence. En y mettant le même numéro que celui de la ClassId du code de la classe, je n'arrive plus à générer le fichier .tlb
Je tourne en rond depuis plusieurs jours et je compte sur vos lumières !
(PS: Si l'emplacement de ce post est plutôt dans la section Office VBA, n'hésitez pas à me
le signaler ou à le déplacer)
Partager