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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    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
    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
    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.

  3. #3
    Membre confirm�
    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
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 confirm�
    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
    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.

  6. #6
    Membre confirm�
    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
    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;
    }

  7. #7
    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
    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".

  8. #8
    Membre �m�rite

    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
    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.

+ 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