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:

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
Dans les propriétés du projet, onglet Application, bouton Assembly Information, je coche

"Make Assembly code visible":

Nom : 2-References_Test03_GuidIndependantDuCodeDeLaClass.png
Affichages : 1415
Taille : 22,0 Ko

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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Regasm Alarmes.dll /tlb
b) En utilisant l'outil mis à disposition par Eric Vernié (cf référence de l'article plus

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 :

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
Le code est donc déclenché par l'appui sur un bouton (Bouton2).

Malheureusement, ça ne fonctionne pas.

J'obtiens l'erreur suivante:

Nom : 5a-Erreur_test03_AppelDepuisVBA.png
Affichages : 1251
Taille : 14,8 Ko

L'erreur survient au Set de la classe:

Nom : 5b-Erreur_test03_AppelDepuisVBA.png
Affichages : 1570
Taille : 109,3 Ko



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)