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

Visual C++ Discussion :

Dll C++ pour VBA


Sujet :

Visual C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Dll C++ pour VBA
    Bonjour,

    je suis débutant en C++ et j'aimerais pouvoir accélérer mes programmes VBA en créant des fonctions en C++(utilisable une dll).
    Il y a énormement de chose sur internet sur la création de dll mais après avoir crée ma dll, j'ai une erreur VBA "erreur 53 - dll introuvable" que je n'arrive absolument pas à comprendre


    voici le code de la dll (fonction square)

    // fichier square.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "square.h"
     
    int __stdcall square(int x)
    {
    	return x*x;
    }
    j'ai ensuite crée un fichier de définition
    \\ DefFile.def

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    LIBRARY "DLL_VBA2"
    EXPORTS 
    square
    et un fichier d'en-tete

    \\square.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define export __declspec (dllexport) 
    export int __stdcall square(int);
    La dll est alors générée et voila le code VBA pour l'appeler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Declare PtrSafe Function square Lib "C:\DLL_VBA2.dll" (ByVal x As Integer) As Integer
        Sub test()
        Dim a As Integer
        Dim b As Integer
        a = 5
        b = square(a)
        End Sub
    Avec dependency walker, la fonction square contenue dans la dll est visible mais voilà le log que je récupère:

    Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
    Error: Modules with different CPU types were found.

    Toute idée est la bienvenue

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    "different CPU Types" ça sent le problème de 64 bits, ça...
    Attends, le Depends, tu l'as fait sur quoi? La DLL ou le VB?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    j'ai utilisé dependency walker sur la dll.

    En essayant de compiler aussi bien en win32 qu'en x64, j'obtiens les mêmes logs.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Dans quel répertoire mets-tu la DLL? Je n'ai aucune idée d'où VBA tape.
    Voir aussi si tu peux la mettre dans un répertoire dans le PATH (ne pas oublier de quitter et relancer VBA si tu changes la variable d'environnement).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    Moi, j'aurai pas fait une dll C++ Win32.
    J'aurai fait une Dll C++ COM, ça facilite grandement l'intégration entre VBA et le code C++.
    Mais bon, faut connaitre COM et c'est pas une mince affaire.

    Win32 c'est une API pour l'OS, aussi bien en 64 bits qu'en 32bits.

    Le message d'erreur suggère un problème de compatibilité binaire entre l'exécutable et la dll.

    Votre processus hôte de votre VBA est-il en 32bits ou en 64bits ?
    IA32/64 ou x86-64 ?
    ...

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je pense qu'on peut ignorer le message d'erreur sur le CPU, s'il provient d'un simple Depends sur la DLL seule.

    @hadGP: As-tu fait un programme de test en C++ qui utilise la DLL?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    je viens juste de le faire et la dll fonctionne très bien
    c'est vraiment juste le passage en VBA qui bug

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    @Medinoc: lors de la déclaration de la dll en VBA j'indique le path, dans mon cas pour simplifier je l'ai mis sur la racine C:\
    j'ai également essayer de la mettre dans system32 mais le message d'erreur persiste.

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Declare PtrSafe Function square Lib "C:\DLL_VBA2.dll" (ByVal x As Integer) As Integer

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    Un petit problème entre les type VBA et les types C++ ?
    http://www.drivenbysteam.com/?p=158

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    En suivant les instructions présentent dans votre lien, j'ai modifier le type de variable de la manière suivante: (transformation des integer en long dans le VBA).

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Declare PtrSafe Function square Lib "C:\Users\hadrien\Documents\Visual Studio 2013\Projects\essai lecture dll\Win32Project5\DLL_VBA2.dll" (ByVal x As Long) As Long
     
        Sub test()
        Dim a As Long
        Dim b As Long
        a = 5
        b = square(a)
        End Sub

    Malheureusement, j'obtiens toujours le même message d'erreur me disant que le dll est introuvable
    Je n'aurais jamais imaginé que quelque chose d'aussi "simple" serait si longue à mettre en place.

    Auriez vous d'autres suggestions ?

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    On va faire dans le bourrin.
    Utilisez un outil comme processmonitor (http://technet.microsoft.com/fr-fr/s.../bb896645.aspx) pour voir où le programme cherche cette Dll.
    Moi, je ne suis pas sur qu'on puisse donner le chemin complet de la Dll dans le Declare.

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    excusez moi pour le retard sur le post.
    Conformément à vos conseil, j'ai utilisé process monitor et j'obtiens l'erreur le log suivant:
    Nom : log process monitor.JPG
Affichages : 263
Taille : 88,9 Ko

    donc a priori, il essai bien d'atteindre la dll mais à priori l'ouverture ne fonctionne pas.

    En essayant de rajouter la dll en référence VBA mais j'obtiens le message d'erreur suivant:
    "impossible d'ajouter la référence spécifiée"

    En regardant sur le net, j'ai également essayer la commande regsvr32 dans l'invite de commandes et j'ai le message suivant:
    Nom : log regsvr32.JPG
Affichages : 258
Taille : 15,6 Ko

    Enfin bref, j'essaye tout et rien ne marche sniff

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    regsvr32 c'est pour les DLLs COM. Malheureusement ta DLL est une DLL ordinaire, et non pas un composant COM.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    donc a priori, il essai bien d'atteindre la dll
    On s'en fout de l'apriori, on utilise la méthode bourrin.
    Donc faut lire le résultat des appels, et c'est les colonnes que vous n'avez pas données (ainsi que les colonnes avec les paramètres).
    Sans ces valeurs, on ne peut faire que des hypothèses.
    Au vue des requêtes, j'ai juste l'impression soit que VB vérifie que le fichier est verrouillé/verrouillable en lecture seul, soit qu'il ne lit que l'en-tête du fichier pour soit voir la compatibilité de la dll soit l'existence du point d'entré demandé.

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Voilà les infos complètes:

    Nom : log process monitor.JPG
Affichages : 268
Taille : 108,7 Ko

    et voici le détails de la dernière colonne pour la requête refusée:
    Sync type: Sync typecreate section Page protection

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    Le fichier est bien chargé dans votre exécutable.
    Vérifiez la compatibilité de votre dll avec celui de l'exécutable, 32/64 bits etc...
    Utilisez l'EventViewer pour avoir des indices sur le problème.

Discussions similaires

  1. [Débutant] dll VB.NET pour VBA
    Par issoram dans le forum VB.NET
    Réponses: 7
    Dernier message: 26/09/2013, 20h42
  2. dll C++ pour VBA : erreur 49 et 453
    Par EL0807 dans le forum C++
    Réponses: 2
    Dernier message: 18/03/2006, 23h01
  3. DLL C++ pour VB 6?
    Par blackghost dans le forum MFC
    Réponses: 7
    Dernier message: 18/07/2005, 01h25
  4. dll builder pour projet visual...?
    Par iznotek dans le forum C++Builder
    Réponses: 8
    Dernier message: 12/01/2005, 19h27
  5. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30

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