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

MFC Discussion :

Point d'entrée d'une fonction dans une DLL


Sujet :

MFC

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut Point d'entrée d'une fonction dans une DLL
    Bonjour !

    J'ai créé une DLL à l'aide de VC6 avec une fonction exportée de cet acabis :

    unsigned long Convert (char* fichier1, char* fichier2);

    Maintenant je désire utiliser cette fonction de la DLL dans un autre programme. Pour cela je passe par LoadLibrary pour charger la DLL, puis GetProcAddress pour récupérer un pointeur sur la fonction.

    Mais quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FARPROC mafonction = ::GetProcAddress(HANDLE, "Convert");
    Ca ne fonctionne pas. Il ne trouve pas la fonction Convert. Quand j'utilise l'outil ViewDependency (de Visual Studio) pour etudier ma DLL, je vois que la fonction ne s'appelle plus "Convert" mais "?Convert@@YAPGPADO@Z".

    Je passe donc cette chaine a GetProcAddress et la ca fonctionne. Ca veut dire qu'a la creation de ma DLL y a un truc qui m'a échappé pour que le nom de la fonction soit simplement Convert.

    Comment faire pour créer une DLL contenant des fonctions dont le nom serait exploitable dans les programmes ? C'est une option de compile dans les Settings de mon programme ?

    Merci pour votre aide.
    A bientot.

    Alexandre.

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    pourquoi ne pas avoir fait une librairie ? avec fichier .def pour l'export ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    bonjour

    En fonction de la maniere de coder ta DLL il arrive que le nom de ta fonction soit decorée (expliquant pourquoi ton nom convert se transforme en en convert@12345

    en general quand je cree des DLL que j'utilise en chargement dynamique

    je definit dans mon .h par exemple getlist.h une fonction du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int __stdcall GetListTag(int SrPortNo);
    et j'ajoute un fichier getlist.def contenant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ; GetList.def : Declares the module parameters for the DLL.
     
    LIBRARY      "GetList"
    DESCRIPTION  'GetList Windows Dynamic Link Library'
     
    EXPORTS
        ; Explicit exports can go here
     
    	GetListTag			@1
    permettant de ne pas decorer le nom de ma fonction lors de la compilation et le link de la DLL

    cordialement

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Si le problème se pose plus souvent faire un composant ATL-COm

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    déclare tes fonctions extern "C" pour éviter la décoration et donc de devoir écrire un fichier .def
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" unsigned long Convert (char* fichier1, char* fichier2);

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ainsi, la fonction est décorée façon "C" et non pas façon C++.
    Cela dépend de sa convention d'appel : __cdecl (normal), __stdcall (les fonctions Windows sont comme ça), __fastcall.

    si la fonction est en __cdecl, elle s'appellera "_Convert" (mais bizarrement, sera exportée en tant que "Convert").

    Si la fonction est en __stdcall, elle s'appellera "_Convert@8" (à supposer que tu compiles en 32bits)

    Et si la fonction est en __fastcall, elle s'appellera "@Convert@8".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Réponses: 8
    Dernier message: 10/01/2007, 21h10
  5. [PHP-JS] une fonction dans une fonction
    Par lodan dans le forum Langage
    Réponses: 6
    Dernier message: 25/06/2006, 19h14

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