Dll : échec d'export

Signaler
Messages postés
20
Date d'inscription
jeudi 24 mai 2012
Statut
Membre
Dernière intervention
27 septembre 2012
-
Messages postés
20
Date d'inscription
jeudi 24 mai 2012
Statut
Membre
Dernière intervention
27 septembre 2012
-
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 vs.80%29.aspx ce tutoriel j'obtiens le code suivant :
[b]
Fichier Header/b

// 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);

    };
} 

[b]
Fichier Source/b

// 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 :

#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 !!

5 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
Classes et autres Cplusplusseries ont très peu à faire dans une DLL, c'est fait pour exporter des fonctions.

Tu en trouveras tout plein dans mes sources.

ciao...
BruNews, MVP VC++
Messages postés
20
Date d'inscription
jeudi 24 mai 2012
Statut
Membre
Dernière intervention
27 septembre 2012

Je sais bien que cet exemple est "naïf" mais j'ai choisi un exemple de fonction volontairement simpliste pour me faire la main sur les dll...et ça s'est avéré utile puisque ça me pose des problèmes. Je voudrais juste savoir ce qui m'enpeche dans cet exemple d'exploiter cette fonction qui est censée être dans la dll.

Merci de m'éclairer si c'est possible
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
il est ou ton fichier .def pour exporter une fonction ?

ciao...
BruNews, MVP VC++
Messages postés
20
Date d'inscription
jeudi 24 mai 2012
Statut
Membre
Dernière intervention
27 septembre 2012

C'est donc ça qui me manque...
Le tutoriel que j'ai suivi n'en faisait pas mention, je vais chercher à quoi ça correspond.

Merci !
Messages postés
20
Date d'inscription
jeudi 24 mai 2012
Statut
Membre
Dernière intervention
27 septembre 2012

Sur le site msdn, il est écrit qu'il y a deux façons d'exporter des fonctions :

Un fichier .DLL a une structure similaire à celle d'un fichier .exe, à une différence importante près : un fichier DLL contient une table d'exportations. La table d'exportations contient le nom de chaque fonction que la DLL exporte vers d'autres exécutables. Ces fonctions sont les points d'entrée dans la DLL ; seules les fonctions figurant dans la table d'exportations sont accessibles par d'autres exécutables. Les autres fonctions de la DLL restent l'exclusivité de la DLL. La table d'exportations d'une DLL peut être affichée à l'aide de l'outil DUMPBIN avec l'option /EXPORTS.

Vous pouvez exporter des fonctions à partir d'une DLL selon deux méthodes :

-Créez un fichier de définition de module (.def) et utilisez-le lors de la génération de la DLL. N'adoptez cette approche que si vous souhaitez exporter des fonctions à partir de la DLL par ordinal plutôt que par nom.

-Utilisez le mot clé __declspec(dllexport) dans la définition de la fonction.

Lorsque vous exportez des fonctions par l'une de ces méthodes, veillez à utiliser la convention d'appel __stdcall.


J'ai apparemment utilisé la deuxième méthode, je vais donc peut être essayer l'autre façon, mais à la lecture de ce paragraphe une question me brûle les lèvres :

Que signifie "N'adoptez cette approche que si vous souhaitez exporter des fonctions à partir de la DLL par ordinal plutôt que par nom." ?

Je vais aussi me pencher sur la "convention d'appel __stdcall" car je ne vois pas trop de quoi il s'agit (et oui, quand je dis que je suis novice, ce n'est pas exagéré)

Merci pour vos conseils et éclaircissements !