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 :

Charger une dll avec MinGW


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 56
    Points : 48
    Points
    48
    Par défaut Charger une dll avec MinGW
    Je compile avec MinGW un programme sensé créer et charger une DLL. Apparemment la création et le chargement se passe bien, mais GetProcAddress() ne trouve pas la fonction.

    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 <windows.h>
    using namespace std ;
     
    typedef int (*MYPROC)(int); 
     
    static HMODULE hdll = NULL;
     
    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) {
     
        // création du fichier c qui sera compilé en dll:
        string dllstr("__declspec( dllexport ) int MyFuncInc(int a) { return ++a; }" );
        ofstream out("dll.c");
        out << dllstr << endl ;
        out.close();
     
        // Compilation pour créer la dll:
        system( "g++ -shared -o dll.dll dll.c" );
     
        // Chargement de la DLL:
        hdll = LoadLibrary("dll.dll");
        if (hdll == NULL) { cout << "LoadLibrary failed" << endl; return 1; }
     
        // chargement de la fonction:
        MYPROC MyFuncInc = (MYPROC)GetProcAddress( hdll, "MyFuncInc" );
        if (MyFuncInc == NULL) { cout << "GetProcAddress failed" << endl; return 1; }
     
        cout << MyFuncInc(41) << endl ;
        return 0;
    }

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086

  3. #3
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string dllstr("extern \"C\" __declspec( dllexport ) int MyFuncInc(int a) { return ++a; }" );

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 56
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par screetch Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string dllstr("extern \"C\" __declspec( dllexport ) int MyFuncInc(int a) { return ++a; }" );
    Merci, ca fonctionne.

  5. #5
    screetch
    Invité(e)
    Par défaut
    ah sinon j'avais pas vu que tu creais un fichier c, pas c++ (deformation professionnelle je suppose)
    lancer gcc au lieu de g++ aurait aussi resolu le probleme.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 56
    Points : 48
    Points
    48
    Par défaut
    Mais je peux quand même créer une DLL codée en C++ ? Ca correspond à quoi le extern "C" ? Ca signifie que je ne peux que programmer ma DLL en C ?

  7. #7
    screetch
    Invité(e)
    Par défaut
    soit tu programmes en C, et en compilant avec un compilateur C (gcc), les noms de fonctions exportes sont "corrects"; si tu as une methode doStuff, dans la DLL elle s'appellera doStuff
    soit tu programmes en C++, en et compilant avec le compilateur g++, les noms de fonctions sont "decorees" donc les nomschangent, il est alors impossible de retrouver une fonction par son nom (c'est parce que C++ autorise la surcharge des methodes, comme doStuff(int) et doStuff(float) qui ne peuent logiquement pas avoir le meme nom). Dans ce cas la, le nom dans la DLL ne ressemble pas vraiment a doStuff mais plutot a v@doStuff@4i ou un truc illisible comme ca

    mais en C++, tu peux forcer a utiliser un nom non decore (un nom correct en gros) en utilisant extern "C", ce qui revient a utiliser lenom de la methode pour la DLL. Dans ce cas, doStuff aura bien pour nom dans la DLL doStuff.


    pour resumer, compilateur C: pas de probleme, compilateur C++: utilise extern "C" pour les methodes que tu dois retrouver dans la DLL par leur nom.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. charger une dll avec un .lib
    Par Nehmé dans le forum Visual C++
    Réponses: 13
    Dernier message: 26/08/2009, 14h26
  2. generer une dll avec MVC et l'utiliser avec MinGW
    Par elraton dans le forum Débuter
    Réponses: 5
    Dernier message: 30/06/2009, 11h03
  3. [windows] charger une dll (avec classe)
    Par superpok dans le forum Windows
    Réponses: 11
    Dernier message: 09/09/2007, 11h15
  4. charger une DLL avec paramètres
    Par cyberchand dans le forum C#
    Réponses: 6
    Dernier message: 29/05/2007, 16h28
  5. créér une dll avec borland c++ compiler
    Par juju62610 dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 26/02/2003, 09h46

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