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

Code::Blocks Discussion :

Compiler une dll pour Excel VBA


Sujet :

Code::Blocks

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Inscrit en
    Janvier 2004
    Messages
    173
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Par d�faut Compiler une dll pour Excel VBA
    Bonjour � tous,

    une question qui est entre du C++ et du VBA (j'ai choisi de la mettre ici) :
    Je veux compiler une dll pour l'utiliser ensuite en VBA sous Excel. C'est la premi�re fois que je fais �a et je veux juste assimiler le principe avec un exemple tr�s simple.

    J'ai cr�� un projet sous code block. Voici mon .h :

    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
    #ifndef __MAIN_H__
    #define __MAIN_H__
     
    #include <windows.h>
     
    /*  To use this exported function of dll, include this header
     *  in your project.
     */
     
    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT __declspec(dllimport)
    #endif
     
     
    #ifdef __cplusplus
    extern "C"
    {
    #endif
     
    int DLL_EXPORT carre(int chiffre);
     
    #ifdef __cplusplus
    }
    #endif
     
    #endif // __MAIN_H__
    et voici mon .cpp :

    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
    #include "main.h"
     
    // a sample exported function
    int DLL_EXPORT carre(int chiffre)
    {
        return chiffre*chiffre;
    }
     
    extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason)
        {
            case DLL_PROCESS_ATTACH:
                // attach to process
                // return FALSE to fail DLL load
                break;
     
            case DLL_PROCESS_DETACH:
                // detach from process
                break;
     
            case DLL_THREAD_ATTACH:
                // attach to thread
                break;
     
            case DLL_THREAD_DETACH:
                // detach from thread
                break;
        }
        return TRUE; // succesful
    }
    Je compile ma dll, �a a l'air de fonctionner. Je vais sous Excel et je d�clare dans un module :

    Option Explicit

    Private Declare Function carre Lib "C:\Users\Nicolas\Desktop\DLL C++\TestDLL\bin\Release\TestDLL.dll" (ByVal chiffre As Integer) As Integer

    Sub toto()
    Debug.Print carre(10)
    End Sub

    J'obtiens l'erreur 49 :

    Convention d'appel de dll incorrecte

    J'ai tent� de changer le type des variables en double dans les deux (C et VBA), mais sans succ�s. Est ce que quelqu'un peut me dire d'o� vient le probl�me ?

    Je vous remercie

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Les fonctions export�es doivent avoir la convention d'appel __stdcall (elles sont en __cdecl par d�faut).

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    DLL_EXPORT int __stdcall carre(int chiffre);
    PS: Pense � donner un nom plus explicite que "DLL" dans DLL_EXPORT et BUILD_DLL; un nom pour lequel le risque de collision soit faible.
    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
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Par d�faut
    Bonjour,

    Je viens de tomber sur ce post d�j� ancien.
    Il se fait que je suis d�butant sur Code::Blocks et que je me pose la m�me question que ANOVA.
    Je travaille avec Code::Blocks 13.12 et avec Excel 2010 sous Seven 64 bits.

    Sans appliquer le conseil de M�dinoc, donc en restant identique � ANOVA, j'obtiens sous VBA la r�ponse : "Convention d'appel de DLL incorrecte".
    En lan�ant l'outil Dependency Walker" sur ma DLL, j'obtiens :
    • Hint 0 DllMain@12 Entry Point 0x0001220
    • Hint 1 carre EntryPoint 0x0001214


    En appliquant le conseil de M�dinoc, en mettant le __stdcall dans le .h et le .ccp, j'obtiens sous VBA la r�ponse : "Point d'entr�e carre d'une DLL introuvable dans "......dll"".
    En lan�ant l'outil Dependency Walker" sur ma DLL, j'obtiens :
    • Hint 0 DllMain@12 Entry Point 0x0001220
    • Hint 1 carre@4 EntryPoint 0x0001214


    C'est d�sesp�rant !!
    Pourriez-vous m'indiquer la d�marche � suivre.
    Je n'ai pas trouv� de tutorial pour cr�er des DLL pour Excel avec Code::Blocks, uniquement avec Visual C++.

    Je vous remercie pour votre aide.

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Pour exporter une fonction avec son nom non-d�cor�, il faut faire un fichier .def qu'on passe au linker lors du linkage de 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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Par d�faut
    Bonsoir,

    En fait, j'ai trouv� la r�ponse sur un autre forum.
    Je vous la livre.

    En reprenant texto le code source propos� par ANOVA, il faut le modifier comme suit :
    • Rajouter __stdcall, aussi bien dans le .h que dans le .cpp
    • dans le .h : int DLL_EXPORT __stdcall carre(int chiffre);
    • dans le .cpp : int DLL_EXPORT __stdcall carre(int chiffre) { .... }


    Tout au moins avec la derni�re version de Code::Blocks (13.12), il n'est pas besoin de faire un fichier .def (il est automatiquement r�alis�).
    PAR CONTRE, il faut rajouter une option dans Code::Block :
    • Menu Project / Build options / Linker settings / Other linker options
    • Saisir l'option suivante : -Wl,--add-stdcall-alias


    Compiler la DLL et l'utiliser comme indiqu� par ANOVA ... et cette fois-ci, �a marche parfaitement, tant dans le VBA que dans les cellules de la feuille Excel.

    Autre subtilit� :
    Dans l'exemple d'ANOVA, la variable est pass�e par valeur (int chiffre). Dans le VBA, on d�clare le param�tre avec un ByVar dans le VBA.
    Si l'on veut passer le param�tre par r�f�rence, on indiquer (int & chiffre) dans le .h et le .cpp, et on d�clare le param�tre avec ByRef dans le VBA.


    Bonne soir�e.
    On peut donc cl�turer ce post.

Discussions similaires

  1. Creer un Add-in ou une .dll pour Excel/VBA
    Par funtim78 dans le forum C#
    R�ponses: 4
    Dernier message: 31/05/2014, 15h05
  2. R�ponses: 0
    Dernier message: 21/01/2011, 09h14
  3. R�ponses: 3
    Dernier message: 07/07/2009, 16h17
  4. R�ponses: 4
    Dernier message: 02/09/2005, 10h24
  5. [DLL] Utilisation d'une DLL pour utiliser serveur Firebird
    Par sekiryou dans le forum Bases de donn�es
    R�ponses: 2
    Dernier message: 11/08/2004, 14h20

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