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++ et appel depuis windev


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut DLL en c++ et appel depuis windev
    Bonjour,
    je n'arrive pas à faire un appel à une fonction avec une dll en c++ voici la source (récupérer depuis le site microsoft)
    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
     
    // MathFuncsDll.h
     
    #ifdef MATHFUNCSDLL_EXPORTS
    #define MATHFUNCSDLL_API __declspec(dllexport) 
    #else
    #define MATHFUNCSDLL_API __declspec(dllimport) 
    #endif
    namespace MathFuncs
    {
        // This class is exported from the MathFuncsDll.dll
        class MyMathFuncs
        {
        public: 
            // Returns a + b
            static MATHFUNCSDLL_API double Add(double a, double b); 
     
            // Returns a - b
            static MATHFUNCSDLL_API double Subtract(double a, double b); 
     
            // Returns a * b
            static MATHFUNCSDLL_API double Multiply(double a, double b); 
     
            // Returns a / b
            // Throws const std::invalid_argument& if b is 0
            static MATHFUNCSDLL_API double Divide(double a, double b); 
        };
    }
    puis
    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
     
    // MathFuncsDll.cpp : Defines the exported functions for the DLL application.
    //
     
    #include "stdafx.h"
    #include "MathFuncsDll.h"
    #include <stdexcept>
     
    using namespace std;
     
    namespace MathFuncs
    {
        double MyMathFuncs::Add(double a, double b)
        {
            return a + b;
        }
     
        double MyMathFuncs::Subtract(double a, double b)
        {
            return a - b;
        }
     
        double MyMathFuncs::Multiply(double a, double b)
        {
            return a * b;
        }
     
        double MyMathFuncs::Divide(double a, double b)
        {
            if (b == 0)
            {
                throw invalid_argument("b cannot be zero!");
            }
     
            return a / b;
        }
    }
    l'appel se fait comme ceci en c++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MathFuncs::MyMathFuncs::Add(a, b)
    en windev j'essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    toto1 est un réel sur 8 octets
    toto2 est un réel sur 8 octets
    ChargeDLL("xxx.dll")
    nAdresseChaîne est un entier = API("xxx.dll","MathFuncs::MyMathFuncs::Add",toto1,toto2)
    ou
    nAdresseChaîne est un entier = API("xxx.dll","MathFuncs.MyMathFuncs.Add",toto1,toto2)
    rien a faire , quelqu'un à une idée ?

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Je me souviens avoir tenté, et m'être cassé les dents.
    Au final, j'ai choisi la solution de facilité, et ai implémenté un Assembly C#
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Pourquoi faire des fonctions statiques d'une classe sans contenu?
    Utilise donc des fonctions libres

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut
    merci de vos réponses

    Citation Envoyé par dragonjoker59 Voir le message
    Je me souviens avoir tenté, et m'être cassé les dents.
    Au final, j'ai choisi la solution de facilité, et ai implémenté un Assembly C#
    , j'evite le c# car il faut installer tout un biz en +

    Citation Envoyé par ternel Voir le message
    Pourquoi faire des fonctions statiques d'une classe sans contenu?
    Utilise donc des fonctions libres
    c'est à dire ?

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    remplacer ton code de base:
    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
    namespace MathFuncs
    {
        // This class is exported from the MathFuncsDll.dll
        class MyMathFuncs
        {
        public: 
            // Returns a + b
            static MATHFUNCSDLL_API double Add(double a, double b); 
     
            // Returns a - b
            static MATHFUNCSDLL_API double Subtract(double a, double b); 
     
            // Returns a * b
            static MATHFUNCSDLL_API double Multiply(double a, double b); 
     
            // Returns a / b
            // Throws const std::invalid_argument& if b is 0
            static MATHFUNCSDLL_API double Divide(double a, double b); 
        };
    }
    par ceci:
    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
    namespace MathFuncs
    {
            // Returns a + b
            MATHFUNCSDLL_API double Add(double a, double b); 
     
            // Returns a - b
            MATHFUNCSDLL_API double Subtract(double a, double b); 
     
            // Returns a * b
            MATHFUNCSDLL_API double Multiply(double a, double b); 
     
            // Returns a / b
            // Throws const std::invalid_argument& if b is 0
            MATHFUNCSDLL_API double Divide(double a, double b);
    }
    Qu'est un MyMathFuncs? (a part un plagiat d'un défaut de java, à savoir l'absence de fonctions libres)

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 492
    Par défaut
    Bizarre que personne n'ait mentionné le mangling C++.
    Même si le code source vient de MSDN, il faut le comprendre avant de l'utiliser.
    Ici, c'est assez piègeux, car c'est faussement simple.

    Moi, je suis beaucoup plus radical dans la critique du code de MSDN qu'@ternel.
    @ternel critique le fait de ne pas utiliser des fonctions libres, mais en fait, c'est le fait de faire une API C++ qui est merdique.
    Le C++ n'a pas normalisé la décoration des symboles que les modules exportent.
    Donc, en utilisant une API C++, vous générez un module qui n'est facilement utilisable QUE par la MÊME chaine de compilation (compilateur + éditeur de lien) qui a généré le module binaire (ici la Dll).
    Donc, l'exemple de MSDN, c'est uniquement dans le monde merveilleux où tout le monde utilise la même version du compilateur, avec les même options de compilations qu'il est opérationnel.
    Donc, avec votre utilisation de WinDev, vous êtes clairement sortie de ce monde merveilleux et vous vous êtes mangé un poteau en travers du casque.

    Si vous voulez vraiment voir l'envers du décor de pacotille, utilisez un outils comme Dependency Walker ( http://www.dependencywalker.com/ ) pour voir la tête des noms exportés par MSVC.
    Cela ne sera clairement pas "MathFuncs::MyMathFuncs::Add", mais une horreur avec tout plein de "?", "_" et autres "@".
    Il s'agira du mangling C++ (décoration des noms) utilisé par MSVC et compris nativement que par MSVC.

    Si vous ne voulez pas faire toutes ces acrobaties (et ne les faites pas), il serait largement plus simple de faire une Dll exportant une interface C et non C++.
    Dans votre cas, c'est très simple, car l'utilisation de namespace ou de classe ne se justifie pas, comme l'indique @ternel.

    En reprenant le code de @ternel

    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
    extern "C"
    {
            // Returns a + b
            MATHFUNCSDLL_API double Add(double a, double b); 
     
            // Returns a - b
            MATHFUNCSDLL_API double Subtract(double a, double b); 
     
            // Returns a * b
            MATHFUNCSDLL_API double Multiply(double a, double b); 
     
            // Returns a / b
            // Throws const std::invalid_argument& if b is 0 -> NON
    // API C donc pas d'exception, retournez un NaN ou autres bidules de la norme IEEE de nombre à virgule flottante
            MATHFUNCSDLL_API double Divide(double a, double b);
    }
    idem pour le .cpp, ajoutez extern "C"{...} autour des implementations de ces fonctions libres.

    En utilisant Dependency Walker, vous verrez que les noms des symboles exportés par la Dll avec une interface C seront bien plus "simple".

    Si tout est correctement exporté par le Dll et que WinDev support bien une Interface C, le WinDev code serait un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ChargeDLL("xxx.dll")
    nAdresseChaîne est un entier = API("xxx.dll","Add",toto1,toto2)

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut
    merci becelar et ternel
    je vais faire ceci sans prendre de poteau dans le casque
    je vais surtout essayer Dependency Walker avec ma dll , j'aime bien le nom déjà lol

Discussions similaires

  1. [C#] DLL C# Appelée depuis Windev
    Par loic18 dans le forum Débuter
    Réponses: 0
    Dernier message: 07/02/2014, 16h08
  2. Réponses: 2
    Dernier message: 19/05/2009, 10h53
  3. OpenGL appelé depuis une DLL perd son contexte
    Par sopsag dans le forum OpenGL
    Réponses: 7
    Dernier message: 27/10/2008, 12h39
  4. Installaton de dll et appel depuis Excel
    Par LittleDev dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/03/2008, 21h11
  5. Réponses: 4
    Dernier message: 01/06/2006, 15h55

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