Problème pour référencer une dll [Résolu]

cs_Daemon80 35 Messages postés mercredi 21 décembre 2011Date d'inscription 21 juin 2012 Dernière intervention - 10 mai 2012 à 11:46 - Dernière réponse : cs_Daemon80 35 Messages postés mercredi 21 décembre 2011Date d'inscription 21 juin 2012 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 16 mai 2012 à 17:18
3
Merci
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 ?

Merci foliv57 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de foliv57
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 10 mai 2012 à 21:02
0
Merci
Declare Function ...
C'est pour les vraies DLLs.
Une créée avec VB est un serveur COM.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
cs_Daemon80 35 Messages postés mercredi 21 décembre 2011Date d'inscription 21 juin 2012 Dernière intervention - 11 mai 2012 à 09:29
0
Merci
Merci pour l'information mais comment je fais donc pour référencer mon serveur com comme tu dis dans access?
Commenter la réponse de cs_Daemon80
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 11 mai 2012 à 10:27
0
Merci
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++
Commenter la réponse de BruNews
cs_Daemon80 35 Messages postés mercredi 21 décembre 2011Date d'inscription 21 juin 2012 Dernière intervention - 11 mai 2012 à 11:26
0
Merci
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......
Commenter la réponse de cs_Daemon80
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 11 mai 2012 à 12:12
0
Merci
Tu as ajouté TA dll VB dans les references ???

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
cs_Daemon80 35 Messages postés mercredi 21 décembre 2011Date d'inscription 21 juin 2012 Dernière intervention - 11 mai 2012 à 14:09
0
Merci
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 ?
Commenter la réponse de cs_Daemon80
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 11 mai 2012 à 19:37
0
Merci
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.
Commenter la réponse de foliv57
cs_Daemon80 35 Messages postés mercredi 21 décembre 2011Date d'inscription 21 juin 2012 Dernière intervention - 14 mai 2012 à 09:17
0
Merci
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....
Commenter la réponse de cs_Daemon80
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 15 mai 2012 à 13:26
0
Merci
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)
Commenter la réponse de foliv57
cs_Daemon80 35 Messages postés mercredi 21 décembre 2011Date d'inscription 21 juin 2012 Dernière intervention - 15 mai 2012 à 14:18
0
Merci
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.
Commenter la réponse de cs_Daemon80
cs_Daemon80 35 Messages postés mercredi 21 décembre 2011Date d'inscription 21 juin 2012 Dernière intervention - 15 mai 2012 à 14:34
0
Merci
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.....
Commenter la réponse de cs_Daemon80
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 15 mai 2012 à 19:05
0
Merci
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
Commenter la réponse de foliv57
cs_Daemon80 35 Messages postés mercredi 21 décembre 2011Date d'inscription 21 juin 2012 Dernière intervention - 16 mai 2012 à 09:27
0
Merci
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éé.
Commenter la réponse de cs_Daemon80
cs_Daemon80 35 Messages postés mercredi 21 décembre 2011Date d'inscription 21 juin 2012 Dernière intervention - 16 mai 2012 à 09:40
0
Merci
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.
Commenter la réponse de cs_Daemon80
cs_Daemon80 35 Messages postés mercredi 21 décembre 2011Date d'inscription 21 juin 2012 Dernière intervention - 18 mai 2012 à 09:06
0
Merci
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
Commenter la réponse de cs_Daemon80
cs_Daemon80 35 Messages postés mercredi 21 décembre 2011Date d'inscription 21 juin 2012 Dernière intervention - 18 mai 2012 à 09:21
0
Merci
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é.
Commenter la réponse de cs_Daemon80

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.