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

C++ Discussion :

DLL en C++ via Excel : utilisation des méthodes de classes


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Points : 10
    Points
    10
    Par défaut DLL en C++ via Excel : utilisation des méthodes de classes
    Bonjour,

    Je souhaiterais utiliser une DLL programmée en C++ pour l'utiliser avec Excel afin de réaliser quelques calculs lourds.

    J'utilise Dev-Cpp 4.9.9.2, Excel 2003 et Visual Basic 6.0.

    Cependant, je ne sais pas comment utiliser mes objets à travers la DLL. Je ne sais utiliser que des fonctions. D'ailleurs je vais expliquer comment je fais cela, si ça peut intéresser du monde ...

    Mon fichier "maDLL.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
    #ifndef _DLL_H_
    #define _DLL_H_
     
    #if BUILDING_DLL
    # define DLLIMPORT __declspec (dllexport)
    #else /* Not BUILDING_DLL */
    # define DLLIMPORT __declspec (dllimport)
    #endif /* Not BUILDING_DLL */
     
    # define EXPORT extern "C" DLLIMPORT __stdcall
     
    EXPORT int getOne();
     
    #endif /* _DLL_H_ */
    Mon fichier "maDLL.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
    #include "MaDLL.h"
    #include <windows.h>
     
    BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                           DWORD reason        /* Reason this function is being called. */ ,
                           LPVOID reserved     /* Not used. */ )
    {
        switch (reason)
        {
          case DLL_PROCESS_ATTACH:
            break;
     
          case DLL_PROCESS_DETACH:
            break;
     
          case DLL_THREAD_ATTACH:
            break;
     
          case DLL_THREAD_DETACH:
            break;
        }
     
        /* Returns TRUE on success, FALSE on failure */
        return TRUE;
    }
     
    int getOne() {
        return 1;
    }
    Je compile avec "--no-export-all-symbols --add-stdcall-alias" pour mon linker et "-DBUILDING_DLL=1" pour le compilo.

    En VB je crée un module et j'ajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Declare Function getOne Lib "maDLL.dll" () As Long
    Note : en fait, j'ai mis le chemin complet vers ma DLL à la place de "maDLL.dll" parce que Excel ne la trouvait pas.

    Je crée ensuite un CommandButton que j'appelle CBTest et j'ajoute dans la feuille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CBTest_Click()
        MsgBox getOne
    End Sub
    En cliquant sur mon bouton, j'obtiens bien un message contenant "1". Cool ;-)

    Enfin bon, on ne va pas très loin avec tout ça. Et puis c'est pas vraiment du C++. Moi je souhaiterais utiliser les méthodes de mes classes. Je donne un exemple simpliste :

    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
    struct Interface {
    	virtual const int getX() = 0 const;
    	virtual const int setX(const int) = 0;		
    };
     
    class Base : public Interface {
    private :
    	int x;
    public :
    	Base();
    	virtual ~Base();
    	virtual const int getX() const;
    	virtual	const int setX(const int);
    };
     
    const int Base::getX() const {
        return x;
    }
     
    const int Base::setX(const int _x) {
        x = _x;
        return 1;
    }
    Mon problème est là, comment dois-je faire pour créer mon objet Base depuis Excel, lui assigner une valeur et la récupérer ?

    Plus vicieux : comment faire si je souhaire récupérer une référence vers mon objet ? Par exemple, en remplaçant setX(int) de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Base& Base::setX(const int _x) {
        x = _x;
        return *this;
    }

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Bon j'ai avancé un peu dans mon problème ... Mais c'est toujours pas ça.

    Déjà j'ai changé d'environnement : j'utilise désormais Visual C++ 2005 Express (gratuit et débugger génial pour utiliser la DLL en même temps qu'Excel). Mais ça ne change rien au problème. Les déclarations changent un petit peu, c'est tout.

    En fait on n'est plus obligé d'utiliser extern "C" et __stdcall. Ce dernier choix se fait dans les options du compilateur. Il suffit également d'ajouter un fichier de définition des fonctions à exporter.

    Il suffira juste d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # define DLLEXPORT __declspec (dllexport)
    pour exporter une fonction ou une classe.

    J'ai trouvé une petite parade pour pouvoir utiliser un objet. Voici le code de ma DLL :

    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
    class DLLEXPORT Interface {
    public:
    	Interface();
    	virtual ~Interface() = 0;
    	virtual const int getX() const = 0;
    };
     
    class DLLEXPORT C : public Interface {
    private:
    	int x;	
    public:
    	C();
    	virtual ~C();
    	virtual const int getX() const;
    };
    avec dans mon .cpp le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const int C::getX() const {
    	return x;
    }
    Sous VB, j'obtiens bien une valeur de x (aléatoire vu que je ne l'ai pas définie).

    Maintenant, en ajoutant cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int setXToNewObj(C*, int);
    en la définissant ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const int C::setXToNewObj(C* Adress, int _x) {
    	Adress->setX(_x);
    	return Adress->x;
    }
    et un constructeur de l'objet (oui je sais c'est pas génial mais bon ...) définit de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C* C::getNewObjAdress() {
    	return (new C);
    }
    Je peux maintenant utiliser mon objet sous VB mais c'est vraiment pas génial au niveau synthaxe. Surtout je ne peux pas utiliser ma méthode setX() originale. Donc je suis obligé de reécrire toute mes méthodes que je souhaite exporter !!! Je pense qu'il existe une manière de faire ça beaucoup plus facilement ... mais laquelle ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/11/2014, 16h34
  2. Réponses: 14
    Dernier message: 08/04/2008, 16h42
  3. Réponses: 5
    Dernier message: 25/03/2008, 11h31
  4. Utilisation des méthodes de classe dans une autre classe
    Par ChriGoLioNaDor dans le forum C++
    Réponses: 4
    Dernier message: 28/07/2007, 15h10
  5. [VB.NET][Excel] utiliser des fonction Excel comme xlToRight
    Par Alexj51 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/03/2006, 12h10

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