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 C++ ] Création et utilisation d'une DLL de classe c++


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut [ DLL C++ ] Création et utilisation d'une DLL de classe c++
    Bonjour à tous.

    Je suis confronté à un problème de dll depuis quelque temps. Je cherche à créer une dll sous visual studio.
    Je doit faire un code générique en code c++ non managé que je doit ensuite importer dans un projet c++ managé

    Pour ce faire, voila ce que j'ai fait :

    Je crée donc un projet win32 --> dll -> projet vide.
    Je crée une classe très simple :

    Voici mon fichier Calculette.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
     
    #pragma once
    #include <iostream>
    #include <string>
    using namespace std;
     
    extern "C" class __declspec(dllexport) Calculette
    {
     
    private:
    	double PI;
     
    public:
    	Calculette(void);
    	~Calculette(void);
     
    	int addition(int nbA, int nbB);
    	double addPI(double nb);
    	int soustraction(int nbA, int nbB);
    };
    Voici mon fichier Calculette.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 "Calculette.h"
     
     
    Calculette::Calculette(void)
    {
    	this->PI = 3.14;
    }
     
     
    Calculette::~Calculette(void)
    {
    }
     
     
    int Calculette::addition(int nbA, int nbB)
    {
    	return nbA + nbB;
    }
     
    double Calculette::addPI(double nb)
    {
    	return nb + this->PI;
    }
     
    int Calculette::soustraction(int nbA, int nbB)
    {
    	return nbB - nbA;
    }
    Ensuite j'ajoute à ma solution un nouveau projet de type console CLR ( Code managé ).
    Je copie la .dll ainsi que le fichier .lib généré par la compilation de ma dll à la source du projet.
    Ensuite je place le code suivant :


    Voici le fichier TestConsoleClass.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
     
    // TestConsoleClass.cpp : main project file.
     
    #include "stdafx.h"
     
    using namespace System;
     
    // Importation des éléments de ma DLL
    #pragma comment (lib, "FirstClassDll.lib")
    extern "C" class __declspec(dllexport) Calculette;
     
    int main(array<System::String ^> ^args)
    {
        Console::WriteLine(L"Lancement du programme");
     
    	// Calcul simple et écriture dans la console du résulat
    	Calculette calc = new Calculette();
    	int resultat = calc->addition(2,3);
    	Console::WriteLine(resultat);
     
    	Console::ReadLine();
        return 0;
    }
    J'essai ensuite de compiler le programme et voila ce que j'obtient comme erreur :

    1 error C2079 'calc' uses undefined class 'Calculette'
    2 error C2512 'Calculette': no appropriate default constructor available
    3 error C2227 left of '->addition' must point to class/struct/union/generic type

    Je pense que le problème viens du faite qu'il n'importe pas la classe comme il faudrait. J'ai vue sur internet après plusieurs recherche qu'il y a plusieurs solutions pour utiliser les dll. J'ai choisi d'opter pour la solution des __declspec(dllexport) qui est plus simple à implémenter.


    Je vous remerci d'avance pour toute l'aide que vous pourrez m'apporter.

  2. #2
    Membre habitué

    Inscrit en
    Mai 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 132
    Points : 171
    Points
    171
    Par défaut
    Salut,

    a mon avis ton compiler ne sait rien de Calculette dans TestConsoleClass.cpp. Quand tu veux utiliser une class, tu dois dire au compiler toute la definition de la class avec

    #include "Calculette.h"

    (... je pense :-) )

    Bonne chance. Fredy

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est ça le bug. Il faut l'en-tête obligatoirement.

  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 519
    Points
    41 519
    Par défaut
    Aussi, j'ai du mal à comprendre le coup de mettre une classe C++ en extern "C"...
    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 à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut Information
    Merci pour les réponses. Je test sa ce soir et je vous tient au courant.


    Le extern C étais la juste pour faire un test. Je ne pense pas qu'il soit nécessaire.
    Si je l'ai mit, c'est qu'il est utilisé pour faire des exports de fonction C lorsqu'on utilise des dll.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut Test
    J'ai tester une compilation en retirant le extern C, cela ne change rien.

    En ce qui concerne l'inclusion du fichier header de la classe, il ne faut pas oublier que je n'ai pas accès aux fichiers sources mais à une dll contenant l'ensemble de mon code compiler.

    J'ai quand même fait le test, mais il me dit qu'il ne trouve pas le fichier header, ce qui parait logique.

    Si vous avez d'autre proposition je suis ouvert à toute les idées.

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu DOIS avoir le fichier d'en-tête. Sans ça, ça ne fonctionnera JAMAIS.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Dans ce cas, sa veut dire que sit je donne ma dll à un tiers il faut que je fournisse la dll, le .lib et les fichiers header ?

  9. #9
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par libery Voir le message
    Dans ce cas, sa veut dire que sit je donne ma dll à un tiers il faut que je fournisse la dll, le .lib et les fichiers header ?
    C'est l'idée. Sinon le tiers en question ne connaîtra jamais la structure exacte des fonctions et données exportées par la DLL.

    C'est un peu comme si Microsoft se contentait de fournir les .lib et les .dll du SDK, sans les headers correspondants. On s'amuserais bien pour développer sous Windows, hein ?
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Ok, merci je n'avais pas saisi cette nuance. Je ne développe pas sur c++ d'habitude mais plutôt sur java ou c#. Donc je découvre les choses petit à petit lol.


    Est ce que quelqu'un pourrait me donner un exemple simple de code comme j'ai mit dans mon post d'un import export de dll en utilisant les __declspec(dllexport)

    Sa me permettrait de partir sur de bonne base.

    Merci d'avance à tous

  11. #11
    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 519
    Points
    41 519
    Par défaut
    dllexport n'est pas conseillé pour la compatibilité avec les autres langages/compilateurs, mais quand on touche aux classes C++ on n'est généralement plus à cela près.

    Ce thread devrait pouvoir t'aider.
    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.

Discussions similaires

  1. Réponses: 27
    Dernier message: 29/08/2014, 12h29
  2. Création et utilisation d'une DLL
    Par Dereck07 dans le forum Débuter
    Réponses: 3
    Dernier message: 03/05/2010, 23h39
  3. création et utilisation d'une dll .net
    Par r83 dans le forum C#
    Réponses: 2
    Dernier message: 08/10/2008, 16h13
  4. Réponses: 8
    Dernier message: 20/06/2008, 09h00

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