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 :

Importer une DLL compilée avec MinGW dans un programme compilé avec Visual C++


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 Importer une DLL compilée avec MinGW dans un programme compilé avec Visual C++
    Je n'arrive pas à utiliser une DLL compilée avec MinGW chargée depuis un programme compilé avec Visual C++. J'utilise LoadLibrary("madll.dll") et GetProcAddress(hDLL,"mafonction"). Apparemment la DLL est bien chargée mais GetProcAdress ne trouve pas la fonction.

    Voici le code source du programme Visual C++, compilé avec prise en charge CLR et jeu de caractère multioctet:
    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
    32
    33
    34
    35
    36
    37
    #include "stdafx.h"
    #include "windows.h"
     
    using namespace System;
     
    typedef int (CALLBACK* LPFNDLLFUNC1)();
     
    HINSTANCE hDLL;               // Handle to DLL
    LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
    int uReturnVal;
     
     
    int _tmain(int argc, _TCHAR* argv[]) {
     
        uReturnVal = 0;
     
        hDLL = LoadLibrary("madll.dll");
     
        if (hDLL != NULL) {
     
            lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"mafonction");
            if (!lpfnDllFunc1) {
                // handle the error
    	    Console::WriteLine("Fonction mafonction non trouvée.");
                FreeLibrary(hDLL);
                return 1;
            } else {
                // call the function
                uReturnVal = lpfnDllFunc1();
    	    Console::WriteLine("Valeur de retour: {0}",uReturnVal);
            }
        } else {
    	Console::WriteLine("DLL non chargée.");
        }
     
        return 0;
    }
    et le code de la DLL compilée avec MinGW:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    extern "C" int __declspec(dllexport) __stdcall mafonction() {
        return 16;
    }
    ----------------------------------------------------

    Quand je crée la dll avec dlltool à partir d'un fichier .def, J'obtiens le message d'erreur au lancement du programme: madll2.dll n'est pas conçu pour s’exécuter sous Windows ou il contient une erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dlltool --def madll.def --dllname madll.dll --output-lib madll2.dll
    Et le fichier madll.def:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LIBRARY madll2.dll
    IMPORTS
       _imp__mafonction@0 = madll.mafonction
    EXPORTS
       mafonction=_mafonction@0

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut

    La DLL produite par MinGW n'est pas utilisable en l'état par MSVC, car le name mangling peut différer d'un compilateur à un autre (et d'une version d'un compilo à une autre).

    Néanmoins, le wiki de MinGW indique une technique, que je n'ai pas testée. Si tu le peux, évite ce genre de bidouilles, c'est toujours meilleur de tout compiler dans le même environnement.
    Find me on github

  3. #3
    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
    merci pour la réponse, mais la méthode ne fonctionne pas.

    Si tu le peux, évite ce genre de bidouilles, c'est toujours meilleur de tout compiler dans le même environnement.
    Le problème c'est que l'application que je dévelloppe doit compiler du code pour faire une DLL et ensuite charger la DLL fraichement compilée pour l'utiliser. Je pensait dévelloper l'application en visual c++ et utiliser MinGW comme sous-programme pour compiler la DLL.

    Je pourrait utiliser aussi MinGW pour le programme qui doit compiler, mais le problème est que je ne sais pas comment charger et utiliser une DLL fraichement compilée (LoadLibrary et GetProcAdress sous visual c++) et MinGW a en plus un problème d'accès aux fichiers avec les fonctions fread et fwrite qui gèrent mal le pointeur d'offset du fichier ouvert.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ca me semble compliqué comme moyen mis en oeuvre.
    Ton programme compile lui-même la DLL qu'il doit utiliser ?!
    Sinon, tu compiles la DLL avec VS.
    Tu peux utiliser VS en ligne de commande pour compiler.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Tu n'es pas le premier à vouloir faire ça ! Cette discussion devrait te donner quelques pistes.

    Citation Envoyé par bertrand125 Voir le message
    MinGW a en plus un problème d'accès aux fichiers avec les fonctions fread et fwrite qui gèrent mal le pointeur d'offset du fichier ouvert.
    Ce n'est pas MinGW en l'occurence mais gcc, et à mon avis c'est une différence de comportement documentée et pas le fait qu'il "gère mal".
    Find me on github

  6. #6
    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
    Par défaut
    Généralement pour espérer charger une DLL MinGW depuis une appli Visual C++, il faut que cette DLL exporte des symboles C donc, effectivement, faire attention aux name-mangling des compilos C++. Essaie peut-être de virer les directives Visual __declspec(dllexport) __stdcall.

  7. #7
    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 Bousk Voir le message
    Ton programme compile lui-même la DLL qu'il doit utiliser ?!
    Oui, il doit faire appel à un sous-programme comme gcc/g++ et une fois la dll compilée, mon programme doit l'utiliser.

    Citation Envoyé par Bousk Voir le message
    Sinon, tu compiles la DLL avec VS.
    Tu peux utiliser VS en ligne de commande pour compiler.
    J'y avais pensé mais VS est un logiciel propriétaire que je ne pourrai pas distribuer avec mon programme.

    -----------

    Citation Envoyé par jblecanard Voir le message
    Tu n'es pas le premier à vouloir faire ça ! Cette discussion devrait te donner quelques pistes.
    Merci.

  8. #8
    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
    J'ai résolu le problème: il y avait un __stdcall en trop dans le code source de la DLL.

    Voici le code source de la DLL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    extern "C" __declspec( dllexport ) int mafonction() {
        return 16;
    }

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/05/2014, 15h14
  2. [Débutant] Importer une dll dans son projet + utliser une classe
    Par benny-blanco dans le forum C#
    Réponses: 2
    Dernier message: 08/05/2012, 15h52
  3. Problème pour importer une dll dans un projet
    Par Kayl86 dans le forum VB.NET
    Réponses: 6
    Dernier message: 12/04/2010, 15h10
  4. Réponses: 2
    Dernier message: 05/11/2008, 10h36
  5. Comment importer une DLL dans du code???
    Par Jayceblaster dans le forum Delphi .NET
    Réponses: 29
    Dernier message: 19/04/2006, 19h19

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