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 averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 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 averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 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