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

Macros et VBA Excel Discussion :

Comment appeler une dll c++ sans connaitre ses sources


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Janvier 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2018
    Messages : 3
    Par défaut Comment appeler une dll c++ sans connaitre ses sources
    bonjour à tous,
    je tente ma chance pour la premiere fois sur un forum. Generalement j'arrive toujours à m'en sortir en cherchant sur internet mais là ca depasse un peu trop mes competences...

    voici mon problème :
    je cherche à appeler une fonction d'une dll sous vba mais je n'ai pas les sources de cette derniere.
    en revanche je sait comment l'appeller en C++, je sais aussi comment sont "typés" les arguments et le retour de la function.
    j'ai tenté (de maniere naive) un bout de code VBA mais je suis trop perdu dans les type pour m'en sortir
    merci à vous pour votre support!

    ci dessous quelque info lorsque la fonction et appeller en c++
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      // declaration
      char var1[200];
      int var2 = 0;
      int * var3 = 0;
      char **var4 = 0;
      // appel
      fonction_dll(var1, &var2, var3, var4);
      //je  crois que fonction_dll renvoit un integer...

    voici ce que j'ai coder en VBA:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Declare Function fonction_dll Lib "D:\ma_dll.dll" (ByVal var1 As String, ByVal var2 As integer, ByVal var3 As integer, ByRef var4 As String,) As Integer
     
    Private Sub test_dll()
    Dim var1 As String
    Dim var2 As integer
    Dim var3 As integer
    Dim var4 As String
    Dim ireturn As Integer
    ireturn = fonction_dll(var1, var2, var3, var4)
    End Sub

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re

    bonsoir je ne sais pas si c'est possible mais en tout cas dans ta citation tu y a mis ta reponse

    en c++ tu donne une valeur a var1,2,3 et en vba tu contente simplement de les redeclarer!!!!!! (chose a ne pas faire)dans ta sub sans leur attribuer une valeurs
    a mon sens ces variables var(1,2,3) la fonction les a deja

    peu etre que tu devraiis plutot injecter des valeurs ou des variables sous un autre nom

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     return= fonction_dll(10,30,55)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim v1,v2,v3
     
    v1=17
    v2=38
    v3=53
    return=fonction_dll(v1,v2,v3)

    pigé?

    voila

    d'autant plus que ta fonction est visiblement affublé d'un callback

    autrement dit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function fonction_dll Lib "D:\ma_dll.dll" (ByVal var1 As String, ByVal var2 As integer, ByVal var3 As integer, ByRef var4 As String,) As Integer
    devrait en vba s'utiliser comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sub test
    dim v1 as tring,v2 as integer,v3 as integer,v4 as string 
     
    v1="toto"'string
    v2=140 ' integer(numeric)
    v3=118 ' integer (numeric )
    'le v4 c'est pour le retour
    return=fonction_dll (v1,v2,v3,v4)
    msgbox return'te donne 0si la fonction ne c'est pas executé
    msgbox v4'te donne le resultat du callback
    end sub
    je peu me tromper bien entendu hein
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    je cherche à appeler une fonction d'une dll sous vba mais je n'ai pas les sources de cette derniere
    Ce n'est pas du code source, que tu as besoin, mais des spécifications précises de cette fonction
    A demander à son concepteur
    je sais aussi comment sont "typés" les arguments et le retour de la function
    Tu ne le sais qu'en C++. Il n'est pas dit (cela m'étonnerait même assez) que ces typages soient les mêmes en appelant cette fonction depuis VBA.

    A Patrick :
    d'autant plus que ta fonction est visiblement affublé d'un callback
    "Visiblement" ? Où "vois"-tu cela ? Je ne vois personnellement rien qui justifierait ce "visiblement" ..

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    La fonction renvoie un variant car elle n'a pas de type
    Code C++ integer : Sélectionner tout - Visualiser dans une fenêtre à part
    int fonction_dll(var1, &var2, var3, var4);

  5. #5
    Invité
    Invité(e)
    Par défaut
    En plus le code c++ présenté ne montre que la partie public du .h en gros la partie déclarative d'appel de la fonction de la librairie! Car il y a la partie privé du genre (mon C++ date de 30 ans je suis rouillé mais bon):

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // declaration
    char var1[200];
    int var2 = 0;
    int * var3 = 0;
    char **var4 = 0;
    // appel
    fonction_dll(var1, &var2, var3, var4);
    ::int fonction_dll(var1, &var2, var3, var4){
    //code
    }
    Dernière modification par LittleWhite ; 18/01/2018 à 20h54. Motif: Coloration code

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Robert
    mon C++ date de 30 ans je suis rouillé mais bon
    je ne suis pas en meilleur état, mais il me semble me rappeler que, par exemple, dans
    il faut voir que var3 est un pointeur (et non directement une valeur) de type Int et que la valeur qu'il pointe égale 0

    Enfin ... pas si certain ... mais c'est une des bulles qui reviennent peu à peu à travers mon brouillard.

  7. #7
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour tout le monde,

    Euh... Je vais certainement dire une bêtise...

    Mais bon, faut essayer non?

    Pourquoi ne pas référencer la Library dans les références du projet?
    Sous l'éditeur VBA : Outils>Références>Parcourir ==> sélectionner le fichier MaDll.dll.

    Puis, dans un Module, déclarer une variable se référant à cette dll, en utilisant, comme "Type" le nom de la référence telle qu'il apparaît dans la fenêtre "Références" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim maVar As New NomDeLaReference
    Puis utiliser une des fonctions de la Library par l'intermédiaire de cette variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim maVar As New NomDeLaReference, result As TypeDeRetour, arg1 As ??, arg2 As ??, arg3 As ??, arg4 As ??
    arg1 = ...
    arg2 = ...
    arg3 = ...
    arg4 = ...
    result = maVar.Fonction_dll(arg1, arg2, arg3, arg4)
    Encore faut-il connaître chaque type : pour les arguments et le retour.
    Mais tu dis les connaître alors, ne reste plus qu'a essayer...

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Franck
    Ce que tu dis n'est pas bête
    le bât continuera cependant à blesser (même cause, mêmes effets) en ce qui concerne les typages précis depuis VBA.
    (sans encore parler, par ailleurs, de la nécessité éventuelle d'une compilation conditionnelle ... du fait même de ces typages)
    Amitiés

  9. #9
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Robert
    il serait plus envisageable de réécrire la fonction car pour le coup tu sais ce que tu en attends!
    Pardi
    Y compris en VBA (avec en prime la disparition d'une dépendance).

    Il est très rarement adroit de "construire" une application par "assemblement" de choses ramassées ici et là pour pallier à ses propres difficultés

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Comme l'a indiqué Unparia et Patrick, oui il s'agit bien de variable pointeur ce qui a juste titre inspire Patrick dans sa déclaration ByVal Byref!

    Il est donc évident que les valeur sens pointeur doivent au moins être renseignées!

    Maintenant la fonction retour peut-être le statu du traitement?

    Notes également que nous ne savons pas de quand date la dll et que depuis Win Xp plus question d gérer le ports et/ou les interruptions!

    En revanche tu devrais pouvoir nous dire si et ou il y a des erreur!

    Faute de pouvoir, malgré notre Alzheimer, analyser la source C++, il serait plus envisageable de réécrire la fonction car pour le coup tu sais ce que tu en attends!

  11. #11
    Invité
    Invité(e)
    Par défaut
    Heureusement que l’utilisateur ne se préoccupe jamais du code de la librairie! Il connait le type des paramètres à fournir et ce qui lui est retourné!

    Note cependant que char * var4[]; c'est un string! donc tu lui passes un string ; int var3[] c'est un tableau donc dim var3() as integer!

    Mais j'avais compris que tu connaissais les types de valeur à fournir à ta dll!

    Passe-lui des variants et fournis-lui les valeurs minimales.

    Dans ton dernier post tu ne dis pas si tu as des messages d’erreur!
    Dernière modification par LittleWhite ; 18/01/2018 à 21h01. Motif: Balise code

  12. #12
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    @Robert :

    char * var1 ==> est un String en VBA.
    Ok Dim var1 As String. Mais pas de souci s'il s'agit d'un pointeur?

    int * var2 ==> est un Integer en C++. Perso, je lui passerais un Long en VBA. Voire même un LongPtr si VBA7, avec compilation conditionnelle...

    int var3[] ==> est un tableau d'entiers. Dim var3() As Long.

    char * var4[] ==> tableau de String. Dim var4() As String. Risque de poser le souci du pointeur... Ou pas, je n'en sais rien!

  13. #13
    Invité
    Invité(e)
    Par défaut
    var4[]
    Non la notion de string n'existe pas en c++
    dim var4() as char!

    var4[][] = dim var4() as string.

    En C++ un string est une table de char! on taille un spooler!

    il faut éviter de mettre son nez dans le code source du c++ si on veut pas devenir chèvre!

    il n'y a pas beaucoup de possibilités à tester on les fait toutes et basta! Déjà le demandeur informe ses colocataires des éventuels messages d’erreur!
    Dernière modification par LittleWhite ; 18/01/2018 à 21h01. Motif: Balise code

  14. #14
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Janvier 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2018
    Messages : 3
    Par défaut
    Merci,
    je ne peux tester pour le moment car j'attends une mise à jour de cette dernière (sans impact sur les entrées/sorties)

    donc si je récapitule:
    c++ ==> vba
    char * var1 ==> dim var1() as String.
    int * var2 ==> dim var2 as long.
    int var3[] ==> dim var3() as long.
    char * var4[] ==> dim var4() as string.

    Qu'en est-il de la déclaration de la dll?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function fonction_dll Lib "D:\ma_dll.dll" (ByVal? var1 As String, ByVal? var2 As long, ByRef ?var3 As long?, ByRef ?var4 As String?) As long

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    non si en c++ var3[] est un tableau alors en vba
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim v3 as variant 
    v3=array(1,2,3,4,5,6,7,8,9)
    ou
    'exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    redim v3(5) 'array de 5 item 
    v3(0)=1
    v3(1)=2
    etc....
    et pareil pour v4 il me semble
    dans nimporte quel cas un tableau ne peut pas etre "long" ce sont ses items qui peuvent etre long,string,variant,integer
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #16
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,
    Citation Envoyé par juju_debutant Voir le message
    donc si je recapitule:
    c++ ==> vba
    char * var1 ==> dim var1() as String
    int * var2 ==> dim var2 as long
    int var3[] ==> dim var3() as long
    char * var4[] ==> dim var4() as string
    Non.
    Si tu te réfères aux remarques de dysorthographie (salut Robert!), tu déclares comme ceci en VBA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim var1 As String, var2 As Long, var3() As Long
    Subsiste un doute pour var4.
    Tu dis qu'il est déclaré, en C++, sous la forme : char * var4[]. Or déclaré comme ceci, il s'agit d'un String.
    Et tu dis que : var4: Array of descriptive strings of xxx.
    Soit c'est un array et alors :
    Soit c'est un String et alors :
    Essaie les deux, tu sauras...

    Citation Envoyé par juju_debutant Voir le message
    qu'en est-il de la declaration de la dll?
    Si ta fonction possède un callback (cf Patrick que je salue également), tu pourras l'appeler comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function fonction_dll Lib "D:\ma_dll.dll" (ByVal var1 As String, ByVal var2 As Long, ByVal var3() As Long, ByRef var4?? As String) As Long
    Attention toutefois au fait que var2 semble être un pointeur.
    Auquel cas, il te faut utiliser une compilation conditionnelle (salutations à Jacques) pour les systèmes 64 bits.
    Ma boule de cristal te "pondrait" un code dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #If VBA7 Then
        'A NOTER : var2 As LongPtr
        Public Declare PtrSafe Function fonction_dll Lib "D:\ma_dll.dll" (ByVal var1 As String, ByVal var2 As LongPtr, ByVal var3() As Long, ByRef var4?? As String) As Long
    #Else
        Public Declare Function fonction_dll Lib "D:\ma_dll.dll" (ByVal var1 As String, ByVal var2 As Long, ByVal var3() As Long, ByRef var4?? As String) As Long
    #End If
    A voir également si ta fonction possède le même nom que Windows soit en 64 bits ou en 32.
    Auquel cas, il te faudrait alors une autre compilation conditionnelle du genre (toujours issu de ma boule de cristal) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #If VBA7 Then
        #If Win64 Then
            Private Declare PtrSafe Function fonction_dll Lib "D:\ma_dll.dll" Alias "MonNom64Bits" (ByVal var1 As String, ByVal var2 As LongPtr, ByVal var3() As Long, ByRef var4?? As String) As Long
        #Else
            Private Declare PtrSafe Function fonction_dll Lib "D:\ma_dll.dll" Alias "MonNom32Bits" (ByVal var1 As String, ByVal var2 As LongPtr, ByVal var3() As Long, ByRef var4?? As String) As Long
        #End If
    #Else
        Private Declare Function fonction_dll Lib "D:\ma_dll.dll" (ByVal var1 As String, ByVal var2 As Long, ByVal var3() As Long, ByRef var4?? As String) As Long 
    #End If
    A voir également si le résultat Long de ta fonction est un pointeur... Auquel cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare PtrSafe Function fonction_dll Lib "D:\ma_dll.dll" (ByVal var1 As String, ByVal var2 As Long, ByVal var3() As Long, ByRef var4?? As String) As LongPtr
    Si non (si pas de callback), il te faudra cocher la référence (cf mon post à ce sujet).
    [Remarque] : ce sera beaucoup plus simple...

    Citation Envoyé par juju_debutant Voir le message
    Private Declare Function fonction_dll Lib "D:\ma_dll.dll" (ByVal? var1 As String, ByVal? var2 As long, ByRef ?var3 As long?, ByRef ?var4 As String?) As long
    A lire

    Si je me fies au peu que tu nous donnes, ta fonction, tu lui passes 4 paramètres et elle te retourne un entier.
    Cet entier, soit c'est le résultat attendu de ta fonction, soit c'est une indication te permettant de savoir :
    - si elle a réussi
    --- dans ce cas, cet entier peut signifier plusieurs choses (plusieurs types de retour)
    - si elle a échoué
    Si cet entier (retour de ta fonction) est juste une indication et non la valeur attendue, cela signifie que l'un ou plusieurs des paramètres contiennent ce résultat.
    Si c'est le cas, ces paramètres doivent être modifiables par ta fonction au sein de ta dll, et doivent donc être passés ByRef.

  17. #17
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Coucou à tous

    Comment est passée une chaîne ?
    Qu'est un BSTR ("Basic string" ou "Binary string") ?
    De quoi (3 éléments) est composé un tel pointeur ?
    etc ...
    Rien de tout cela n'est du VBA (le présent forum) et ne devrait être à mon sens traité ici.

  18. #18
    Invité
    Invité(e)
    Par défaut
    Bonjour Patrick,
    Non Var3 n'est pas un tableau du point de vue vba!

    https://cpp.developpez.com/faq/cpp/?...res-std-string

    char var3[3]="123"
    Dernière modification par Invité ; 11/01/2018 à 20h01.

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/05/2015, 08h18
  2. Comment appeler une dll VB6 sous delphi
    Par zanoubya dans le forum Débuter
    Réponses: 6
    Dernier message: 05/10/2009, 18h04
  3. [POO] Comment appeler une page PHP sans iframe ?
    Par Stegue dans le forum Langage
    Réponses: 3
    Dernier message: 08/05/2007, 21h14
  4. Lister le contenu d'une table sans connaitre ses champs
    Par Google.be dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 30/03/2004, 15h23

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