Problème pour référencer une dll

Résolu
cs_Daemon80 Messages postés 33 Date d'inscription mercredi 21 décembre 2011 Statut Membre Dernière intervention 21 juin 2012 - 10 mai 2012 à 11:46
cs_Daemon80 Messages postés 33 Date d'inscription mercredi 21 décembre 2011 Statut Membre Dernière intervention 21 juin 2012 - 18 mai 2012 à 09:21
Bonjour, j'ai créé une dll en VB pour qu'elle soit utitisable en php et access.Avec php j'ai référencer l'objet com dans mon code pour appeller la dll et j'ai enregistrer celle-ci avec la commande regasm.La dll est enregistré et cela fonctionne avec php.Seulement voila, avec access quand je veux référencer ma dll dans une maccro il me renvoie l'erreur suivante "Erreur d’exécution '453' : Point d'entrée mad d'une DLL introuvable dans MADDL.dll"
Ma dll a été enregistré bien avant et elle se trouve également dans le dossier system32.

Je vous passe mon code vb sous access :

Option Compare Database
Declare Function Incremente Lib "MADLL.dll" Alias "mad" ()

Sub test1()
Dim Var As Integer
Var = 0
Incremente (Var)
End Sub

Incremente étant une fonction de ma dll qui permet d'incrémenter un entier.

Merci de vos réponses.

17 réponses

foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
16 mai 2012 à 17:18
Alors la, je sèche.

L'exemple que j'ai fourni dans les post plus haut fonctionne chez moi sans problème.

Etes vous sur de bien avoir une méthode
Public Sub Incremente(ByRef valeur As Integer)


dans votre classe ?
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 mai 2012 à 21:02
Declare Function ...
C'est pour les vraies DLLs.
Une créée avec VB est un serveur COM.

ciao...
BruNews, MVP VC++
0
cs_Daemon80 Messages postés 33 Date d'inscription mercredi 21 décembre 2011 Statut Membre Dernière intervention 21 juin 2012
11 mai 2012 à 09:29
Merci pour l'information mais comment je fais donc pour référencer mon serveur com comme tu dis dans access?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 mai 2012 à 10:27
Doit y avoir un menu Outils-References ou truc de ce genre.
Regarde ici:
http://www.vbfrance.com/forum/sujet-CRATION-DLL-VB-UTILISATION-DANS-EXCEL-VBA_1093105.aspx

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Daemon80 Messages postés 33 Date d'inscription mercredi 21 décembre 2011 Statut Membre Dernière intervention 21 juin 2012
11 mai 2012 à 11:26
J'ai regardé le lien est j'ai testé dans outils-référence, les références access y ont été misent, j'ai générer ma dll, je l'ai enregistrer et toujours pareil du côté d'access, erreur 453......
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 mai 2012 à 12:12
Tu as ajouté TA dll VB dans les references ???

ciao...
BruNews, MVP VC++
0
cs_Daemon80 Messages postés 33 Date d'inscription mercredi 21 décembre 2011 Statut Membre Dernière intervention 21 juin 2012
11 mai 2012 à 14:09
Quand j'essaie de référencer ma dll qui se trouve dans l'onglet COM il me renvoi une fenêtre d'erreur disant :

Une référence à "MADLL" n'a pas pu être ajouté

La bibliothèque de type ActiveX 'C:\Windows\System32\MADLL.tlb' a été exporté à partir d'un assembly .NET et ne peut pas être ajouté en tant que référence.
Ajoutez une référence à l'assembly .NET à la place.

Comment je peux faire ?
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
11 mai 2012 à 19:37
Bonjour,

Il ne faut pas ajouter une référence à la dll, mais au fichier tlb.

Lors de l'enregistrement, il faut faire un :
regasm.exe maDll.dll /tlb:maDll.tlb

afin de le créer.
0
cs_Daemon80 Messages postés 33 Date d'inscription mercredi 21 décembre 2011 Statut Membre Dernière intervention 21 juin 2012
14 mai 2012 à 09:17
Bonjour et merci pour ta réponse foliv57.
J'ai exécuté ta commande : C:\Windows\Microsoft.Net\Framework\v2.0.50727\RegAsm.exe C:\Windows\System32\MADLL.dll /tlb:MADLL.tlb
Il m'a créer le fichier tlb mais j'ai toujours le même soucis....
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
15 mai 2012 à 13:26
Voici les étapes que je suis toujours lorsque je développe des assembly .NET visibles par COM.

1) Rendre l'assembly COM visible :
Dans Visual Studio : Menu Projet -> Propriétés -> Application -> Informations de l'assembly -> Cocher la case "Rendre l'assembly visible par COM"

2) Signer l'assembly avec un nom fort afin de pouvoir utiliser l'option /CODEBASE de la commande vs.80).aspx REGASM
Dans Visual Studio : Menu Projet -> Propriétés -> Signature -> Cocher la case "Signer l'assembly" -> Choisir "Nouveau" dans le menu déroulant en dessous

(Rappel option CODEBASE : Crée une entrée Codebase dans le Registre. L'entrée Codebase spécifie le chemin d'accès du fichier d'un assembly qui n'est pas installé dans le Global Assembly Cache. Vous ne devez pas spécifier cette option si vous devez installer par la suite l'assembly que vous enregistrez dans le Global Assembly Cache. L'argument assemblyFile que vous spécifiez avec l'option /codebase doit être un assembly avec nom fort.)

2') Générer le projet bien entendu (Ca tombe sous le sens) et placer la dll dans system32 (Pas nécessairement. On peut la mettre ailleur).

3) Enregistrer la dll avec la commande REGASM
C:\Windows\Microsoft.Net\Framework\v2.0.50727\RegAsm.exe /CODEBASE C:\Windows\System32\MADLL.dll /tlb:C:\Windows\System32\MADLL.tlb 


4) Utiliser l'assembly dans ACCESS:
Dans l'éditeur VBA d'access : Menu Outils -> Références -> Parcourir. Puis sélectionner le fichier "C:\Windows\System32\MADLL.tlb"

5) Enjoy. Vous pouvez faire :
Dim monObj as New MADLL.MACLASSE
'ou
Set monObj  = CreateObject("MADLL.MACLASSE") '(Cette syntaxe ne nécessite pas l'ajout de la référence)


(Attention. Si vous êtes sous Windows 7/Vista x64 :
- Adapter la cible de compilation de l'assembly en fonction des compatibilités :
Dans Visual Studio : Menu Projet -> Propriétés -> Compiler -> Options avancées de compilation -> Unité centrale cible (Non disponible dans les versions Express de Visual Studio)
- Adapter la commande regasm utilisée en fonction des compatibilités :
C:\Windows\Microsoft.Net\Framework
ou
C:\Windows\Microsoft.Net\Framework64)
0
cs_Daemon80 Messages postés 33 Date d'inscription mercredi 21 décembre 2011 Statut Membre Dernière intervention 21 juin 2012
15 mai 2012 à 14:18
Bonjour et merci pour tous ses détails, c'est vraiment sympa.Mais j'ai le même problème, je suis sous windows 7 et j'utilise VB express, étant donné qu'il n'y a pas d'unité centrale cible dans express je pense que sa vient de là....
Aprés quand tu dis que je peux faire :

Code Visual Basic :

Dim monObj as New MADLL.MACLASSE
'ou
Set monObj = CreateObject("MADLL.MACLASSE") '(Cette syntaxe ne nécessite pas l'ajout de la référence)

Je rajoute sa dans ma classe VB? Car la il créé un objet com mais il va servir à quoi exactement?
Merci encore pour tes réponses.
0
cs_Daemon80 Messages postés 33 Date d'inscription mercredi 21 décembre 2011 Statut Membre Dernière intervention 21 juin 2012
15 mai 2012 à 14:34
J'ai réessayer de créer un nouveau projet vb et access pour vérifier, j'ai refait correctement les manipulations et encore l'erreur 453.....
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
15 mai 2012 à 19:05
Ok, je vois qu'il faut remonter un peut plus haut dans l'explication de l'interoperabilité avec .NET.

Lorsque l'on coche la case à cocher "Rendre visible par COM" on expose en faite toutes les classes public de l'assembly.

Je me trompe peut-être, mais je ne pense pas que l'on puisse exposer directement une fonction d'un module.

Voici donc un petit exemple complet.

Si l'on crée un projet nommé "TestInterop", que l'on paramètre en suivant mes explications plus haut. On peut y ajouter une classe public comme celle-ci, par exemple:
Public Class MaClasse

    Public Sub Incremente(ByRef valeur As Integer)
        valeur += 1
    End Sub

End Class


En compilant, nous avons donc un assembly nommé "TestInterop.dll" avec comme namespace "TestInterop" qui contient une classe nommée "MaClasse" qui décrit une fonction "Incremente" permettant d'ajouter 1 à une variable passée en paramètre.

Après avoir exécuté la commande regasm et ajouté la référence du fichier tlb à notre projet access, on peut écrire ce genre de code VBA dans access :
Sub test()

    Dim monObjet As New TestInterop.MaClasse
    Dim val As Integer
    
    val = 0
    monObjet.Incremente val
    
    MsgBox val

End Sub


ou

Sub test()

    Dim monObjet As Object
    Set monObjet = CreateObject("TestInterop.MaClasse")
    Dim val As Integer
    
    val = 0
    monObjet.Incremente val
    
    MsgBox val

End Sub
0
cs_Daemon80 Messages postés 33 Date d'inscription mercredi 21 décembre 2011 Statut Membre Dernière intervention 21 juin 2012
16 mai 2012 à 09:27
Merci foliv57, je connais mieux maintenant la procédure.
J'ai remplacer correctement le nom de la dll et de la classe dans le code que tu m'a fournis mais lors de la compilation il me dit :

----------------------
Erreur de compilation

Type défini par l'utilisateur non défini
----------------------

Sur le "Sub test()"
test étant une maccro que j'ai créé.
0
cs_Daemon80 Messages postés 33 Date d'inscription mercredi 21 décembre 2011 Statut Membre Dernière intervention 21 juin 2012
16 mai 2012 à 09:40
Erreur de ma part, j'ai mis un "e" à Classe1 alors qu'il y en avait pas....

Il me dit pas la suite que dans la ligne "monObjet.Incremente val" il y a une erreur :

----------------------
Erreur d’exécution 438

Propriété ou méthode non gérée par cet objet
----------------------

Apparemment il manque une référence pourtant j'ai mis la référence au fichier .tlb, y'aurait-il une autre référence à ajouter ou bien c'est un autre problème?
Merci.
0
cs_Daemon80 Messages postés 33 Date d'inscription mercredi 21 décembre 2011 Statut Membre Dernière intervention 21 juin 2012
18 mai 2012 à 09:06
Bonjour, dans ma classe écrite en VB j'ai sa :

Public Class Class1

Public Shared Function Incremente(ByVal var1 As String) As Integer
Return var1 + 1
End Function

End Class
0
cs_Daemon80 Messages postés 33 Date d'inscription mercredi 21 décembre 2011 Statut Membre Dernière intervention 21 juin 2012
18 mai 2012 à 09:21
J'ai changé la méthode en remplaçant "Shared" et "ByVal" par "Sub" et "ByRef" comme vous l'avez montré et sa fonctionne, encore merci de m'avoir aidé.
0
Rejoignez-nous