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 : échec d'export


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 39
    Points : 27
    Points
    27
    Par défaut dll : échec d'export
    Bonjour à tous,

    Voilà quelques jours que je me suis lancé dans l'apprentissage de création de dll en C++(pour info j'utilise VS2008).
    En suivant ce tutoriel j'obtiens le code suivant :

    Fichier Header

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // MathFuncsDll.h
    // fonctions effectuant les operations de base
     
    namespace MathFuncs
    {
        class MyMathFuncs
        {
        public:
            // effectue a + b
            static __declspec(dllexport) double MyFunc(double a, double b);
     
        };
    }
    Fichier Source

    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
    // MathFuncsDll.cpp
    // compiler avec: /EHsc /LD
     
    #include "MathFuncsDll.h"
     
    #include <stdexcept>
     
    using namespace std;
     
    namespace MathFuncs
    {
        double MyMathFuncs::MyFunc(double a, double b)
        {
            return a + b;
        }
    }
    Ce qui, lorsque je compile, me donne un MyFuncDLL.dll. Jusque là tout semble aller comme je veux...

    Mais ce n'est pas le cas , car lorsque je tente d'exploiter ma fonction via cette dll à l'aide de :

    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
    38
    39
    40
    41
    42
    43
    44
    #include <windows.h>
    #include <stdio.h>
     
    // DLL function signature
    typedef double (*importFunction)(double, double);
     
    int main(int argc, char **argv)
    {
            importFunction MyFunc;
            double result;
     
            // Load DLL file
            HINSTANCE hinstLib = LoadLibrary(TEXT("MyFuncDLL.dll"));
            if (hinstLib == NULL) {
                    printf("ERROR: unable to load DLL\n");
     
            }
    		else { 
                    printf("DLL loaded\n");
     
    		}
            // Get function pointer
            MyFunc = (importFunction)GetProcAddress(hinstLib, "MyFunc");
            if (MyFunc == NULL) {
                    printf("ERROR: unable to find DLL function\n");
                    FreeLibrary(hinstLib);
     
            }
    		else { 
                    printf("function found\n");
     
    		} 
            // Call function.
            result = MyFunc(1, 2);
     
            // Unload DLL file
            FreeLibrary(hinstLib);
     
            // Display result
            printf("The result was: %f\n", result);
     
    		getchar();
            return 0;
    }


    J'obtiens bien le "DLL loaded" mais j'ai ensuite l'erreur "ERROR: unable to find DLL function" !

    Si quelqu'un(e) pouvait m'expliquer où se trouve mon erreur, ça m'enlèverait une fière chandelle du pied

    Merci d'avance pour vos conseils !!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Les noms des symboles C++ sont tous "décorés"; comme il n'y a pour l'instant pas de convention standard, ces décoration dépendent entierement du compilateur. Le meilleur moyen d'obtenir ce nom "décoré" est de faire dumpbin.exe /SYMBOLS malib.lib et de chercher un symbole contenant MyFunc, MyMathFuncs et MathFuncs.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    Merci pour ton aide, mais étant vraiment très peu expérimenté j'ai du mal à te suivre.

    La ligne de commande que tu évoques se lance bien à partir du terminal de VS ?
    Lorsque je fais cela, je reçois un message d'erreur command "dumpbin.exe" is not valid

    Que faire ?

  4. #4
    screetch
    Invité(e)
    Par défaut
    en general on utilise les methodes a signature C lorsqu'on exporte d'une DLL, pour pouvoir importer a la main (avec le nom de la methode)

    c'est a dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __declspec(dllexport) extern "C" double MyFunc(double a, double b);
    on ne peut plus mettre cette methode dans une classe.

Discussions similaires

  1. Réponses: 40
    Dernier message: 21/06/2007, 17h58
  2. Réponses: 8
    Dernier message: 22/12/2004, 22h57
  3. [CR] Dll ou format d'exportation incorrect
    Par Drahu dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 07/10/2004, 09h11
  4. Réponses: 4
    Dernier message: 01/07/2004, 11h53
  5. Réponses: 4
    Dernier message: 07/12/2002, 07h34

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