IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Utilisation d'une DLL dans VBA


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Utilisation d'une DLL dans VBA
    Bonjour a tous,

    J'ai essayé d'utiliser avec ACCESS 2003 et VBA une DLL écrite en C fournie par un constructeur de matériel, servant à configurer ses équipements.

    Je l'ai déclaré ainsi dans un module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Declare Function mafonction Lib "madll" (ByVal PortCom As Byte, ByVal Mode As Byte, ByVal Config As Byte, ByVal Debug2 As Byte, ByRef Context As Byte) As Byte
    Et je l'appelle de cette facon via un formulaire et un bouton pour tester dans un premier temps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim test, val1, val2, val3, val4, toto As Byte
    
    val1 = 41
    val2 = 9
    val3 = 1
    val4 = 1
    toto=1
    
    test = mafonction (val1, val2, val3, val4, toto)
    J'ai un message d'erreur à l’exécution :

    Erreur d’exécution '49'

    Convention d'appel de DLL incorrecte.


    La doc de cette DLL me donne les infos suivantes sur cette fonction que j'essaye d'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Paramètres en entrée
    
    unsigned char mafonction (unsigned char PortCom,
                                             unsigned char Mode,
                                             unsigned char Config, 
                                             unsigned char Debug,
                                             unsigned char *Context ) ;
    
    Paramètres en sortie
    
    Context
    J'ai parcouru des dizaines de sites sur Internet pour comprendre ce qu'il se passe, et je suppose que cela est lié à la façon dont sont déclarées les variables étant donné que l'une d'elle dans la DLL est un pointeur C (d'ou le ByRef Context As Byte dans la déclaration de la fonction).

    Mais rien n'y fait j'ai systématiquement cette erreur.

    Je ne débute pas en VBA, mais ne n'ai jamais vraiment utilisé de DLL de ce type la avec des primitives complexes associées.

    Si quelqu'un peut m'aider...

    Merci.

  2. #2
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    banjaman,

    La partie déclarative de la fonction de ta DLL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Declare Function mafonction Lib "madll" (ByVal PortCom As Byte, ByVal Mode As Byte, ByVal Config As Byte, ByVal Debug2 As Byte, ByRef Context As Byte) As Byte
    ne correspond pas au document d'intégration qui accepte pour chacun des arguments un type String ?

    Sur la partie déclaration de tes variables (tu dois avoir aussi un paramètre de la fonction qui indique si celle-ci s'est bien passée). Le As Byte que tu as mis n'est pas spécifié dans le Doc ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim test as byte
    Dim val1 as string, val2 as string, val3 as string, val4 as string, toto As as string
     
    val1 = "41"
    val2 = "9"
    val3 = "1"
    val4 = "1"
    toto=""
     
    test = mafonction (val1, val2, val3, val4, toto)
    JimBoLion

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour Jimbolion,

    Merci de ta réponse.

    J'ai essayé de passer les arguments en type string mais après du coup j'ai une erreur incompatibilité de type.

    Les codes retour de la fonction sont ci dessous (en plus du pointeur *context apparemment).

    Voila ce que j'ai dans la doc en clair :

    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
    Prototypage de la primitive
    unsigned char HR8_CONNECT (	unsigned char PortCom,
                                                    unsigned char Mode,
                                                    unsigned char Config, 
                                                    unsigned char Debug,
                                                    unsigned char *Context ) ;
    
    Retour fonction
    
    0		=>	OK
    1		=>	Erreur : Paramètre Config invalide
    2		=>	Erreur : Paramètre PortCom correspondant à un port série déjà ouvert par la DLL
    3		=>	Erreur : Paramètre Mode invalide
    4	        =>	Erreur : Paramètre Config invalide
    170		=>	Erreur : problème interne de ressources système manquantes
    180		=>	Erreur : Pas de réponse de l’OTR
    199		=>	Erreur : Port série indisponible
    255		=>	Erreur : Liaison carte RF rompue
    
    Paramètres en entrée
    
    PortCom	=>	Port série à utiliser
                                    Valeurs possibles : 1 à 49
    
    Mode		=>	Mode de fonctionnement
    				Valeurs possibles : 1 à 12
    				1 : Mode WB Normal
    				2 : Mode WB Alarme
    				3 : Mode WB Statistiques
    				4 : Mode WB Reconfiguration
    				5 : Mode DB Normal
    				6 : Mode DB Alarme
    				7 : Mode DB Statistiques
    				8 : Mode DB Reconfiguration
    				9 : Mode réseau fixe
                                    10 : Mode WB avec niveau RSSI (pas de données)
                                    11 : Mode WB Normal, sans émission de préambule de réveil (SPY WB DATA)
                                    12 : Mode WB RSSI, sans émission de préambule de réveil (SPY WB RSSI)
    	Config		=>	Configuration terrain
    				Valeurs possibles : 1 (Rues de Paris) ou 2 (Immeubles)
    	Debug		=>	Par défaut à 0 (utilisé par HomeRider pour le débogage)
    				BIT7 : activer les logs DLL (1 : OUI   /   0 : NON)
    				BIT6 : activer les beeps lors de la réception de trames RF.
     
    
    Paramètres en sortie
    
    Context 	=>	Contexte retourné par la DLL, à utiliser lors des appels suivants

  4. #4
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    banjaman

    Tu avais raison sur les appels (utiliser des numériques plutôt que string), ici j'ai trouvé un article sur la transposition des valeurs entre librairie C et un appel VB6 (VBA les appels sont identiques).

    http://www.sharevb.net/IMG/pdf/APIVB6.pdf

    Ta version d'Office c'est du 64 bits ? car tu pourrais avoir des problèmes avec des API 32

    Tiens moi au courant

    JimBoLion

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Ça à l'air intéressant ce lien ! Je vais regarder dans le détail quand j'aurais un peu plus de temps dans la journée.

    J'ai une version XP 32bits.

    Merci encore !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour Jimbolion,

    Désolé pour la réponse tardive : bon a priori le pb est lié au fait que les fonctions de la DLL sont exportées en __cdecl et pas en __stdcall, donc pas compatible avec VB

    Je vais clore le post, et continuer à galérer...peut être....

    Merci en tous les cas.

    Banjaman

  7. #7
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Dans ce type de déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim test, val1, val2, val3, val4, toto As Byte
    seul toto est As Byte
    les autres sont en Variant.

    Ensuite, toute déclaration de type Declare doit pointer en général dans %System32% si c'est une API Windows.
    Si la DLL est locale, alors il convient de spécifier son chemin complet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Function MyDll Lib "c:\MyAppPath\MyDLL.dll" (ByVal P1 As Integer, ByVal P2 As Integer) As Long
    Tu peux enfin employer un LoadLibrary() pour vérifier que ta DLL est «chargeable».

    Argy

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VS2008 utilisation d'une DLL en VBA
    Par Isildur dans le forum Visual Studio
    Réponses: 6
    Dernier message: 11/02/2009, 10h20
  2. Utilisation d'une DLL dans le meme repertoire de l'application
    Par Stargate SG1 dans le forum VBA Access
    Réponses: 6
    Dernier message: 29/01/2009, 20h14
  3. Réponses: 9
    Dernier message: 06/04/2006, 18h40
  4. Utilisation d'une dll dans une application.
    Par jamais34 dans le forum MFC
    Réponses: 5
    Dernier message: 31/03/2006, 10h39
  5. Utilisation d'une dll dans C
    Par Korma dans le forum Autres éditeurs
    Réponses: 12
    Dernier message: 08/12/2005, 19h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo