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

Langage C++ Discussion :

fonction à paramètres variables stockée dans une DLL.


Sujet :

Langage C++

  1. #1
    Membre du Club
    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
    Points : 48
    Points
    48
    Par défaut fonction à paramètres variables stockée dans une DLL.
    Bonjour,

    J'utilise MinGW sous windows 8. J'essaye d'exporter une fonction à paramètres variables, la compilation de la DLL se passe bien, mais lorsque je compile le programme qui utilise la DLL, le linker me dit "undefined reférence to" concernant cette fonction. J'ai regardé dans le .def de la DLL, et elle n'est pas mentionnée comme exportée.

    J'ai essayé en déclarant la fonction 'extern "C"', mais le résultat est le même.

    C'est donc impossible d'exporter une fonction à arguments variables ? Du moins impossible avec MinGW ?

  2. #2
    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 518
    Points
    41 518
    Par défaut
    Si elle n'est pas mentionnée comme exportée dans le .def, comment l'exportes-tu?
    Avec __declspec(dllexport)?

    PS: Au fait, une fonction à nombre d'arguments variable ne peut pas être en __stdcall, elle est forcément en __cdecl. Cela change la façon dont son nom est "décoré", et si tu n'utilises pas un .def c'est le nom décoré qui est exporté.
    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.

  3. #3
    Membre régulier Avatar de harlock59
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 261
    Points : 107
    Points
    107
    Par défaut décompilation de flash.dll
    Bonjour,

    je sais que je suis hors-sujet mais j'ai atteri ici en ayant tapé dans google "in which language is compiled flash.dll"... je vais donc éditer ce post avec le lien vers le nouveau thread...

    voici le nouveau thread: http://www.developpez.net/forums/d14...ile-flash-dll/
    --
    Dépanneur Informatique à Domicile dans le Valenciennois
    https://www.depannage-informatique-valenciennes.site/

  4. #4
    Membre du Club
    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
    Points : 48
    Points
    48
    Par défaut
    Je l'exporte avec __declspec(dllexport).

    PS: Au fait, une fonction à nombre d'arguments variable ne peut pas être en __stdcall, elle est forcément en __cdecl. Cela change la façon dont son nom est "décoré", et si tu n'utilises pas un .def c'est le nom décoré qui est exporté.
    J'ai refait des tests. La fonction apparait dans le .def de la DLL, mais lors de la compilation du programme qui utilise la DLL, le linker dit: "undefined reference to" concernant cette fonction, pourtant le nom est correct, et les décorations sont les mêmes que dans le fichier .def.

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par bertrand125 Voir le message
    Je l'exporte avec __declspec(dllexport).

    J'ai refait des tests. La fonction apparait dans le .def de la DLL, mais lors de la compilation du programme qui utilise la DLL, le linker dit: "undefined reference to" concernant cette fonction, pourtant le nom est correct, et les décorations sont les mêmes que dans le fichier .def.
    Et que dit notre explorateur de DLL préféré ?
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre du Club
    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
    Points : 48
    Points
    48
    Par défaut
    Finalement, les décorations ne sont pas les mêmes, j'avais mal lut car il n'y avait qu'une seule lettre de différence.
    Dans le .def: _Z5printiz
    et la fonction recherchée par l'éxécutable: _Z5printz

    En la déclarant extern "C", la compilation de la DLL ne passe pas, il dit que la fonction est redéfinie.

    Pour que la fonction apparaisse dans le .def, je suis contraint d'ajouter un __declspec(dllexport) lors de la définition de la fonction, en plus de sa déclaration. Je pense que le problème viens du fait que le prototype de déclaration et celui de définition est différent pour les fonctions à paramètres variables:
    pour la déclaration: int fonction(...)
    pour la définition: int fonction(int n_args, ...)

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par bertrand125 Voir le message
    Finalement, les décorations ne sont pas les mêmes, j'avais mal lut car il n'y avait qu'une seule lettre de différence.
    Dans le .def: _Z5printiz
    et la fonction recherchée par l'éxécutable: _Z5printz

    En la déclarant extern "C", la compilation de la DLL ne passe pas, il dit que la fonction est redéfinie.

    Pour que la fonction apparaisse dans le .def, je suis contraint d'ajouter un __declspec(dllexport) lors de la définition de la fonction, en plus de sa déclaration. Je pense que le problème viens du fait que le prototype de déclaration et celui de définition est différent pour les fonctions à paramètres variables:
    pour la déclaration: int fonction(...)
    pour la définition: int fonction(int n_args, ...)
    Le prototype utilisé dans la définition doit être le même que celui utilisé pour la déclaration - sans quoi ça ne va pas marcher.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. Problème d'accès à une variable stockée dans une DLL
    Par bertrand125 dans le forum Langage
    Réponses: 1
    Dernier message: 03/03/2014, 15h56
  2. Réponses: 11
    Dernier message: 11/07/2008, 14h58
  3. Déclarer une fonction ayant 2 prototypes dans une DLL
    Par Jayceblaster dans le forum Delphi
    Réponses: 8
    Dernier message: 17/02/2007, 12h00
  4. Utilisation d'une variable publique dans une DLL
    Par Delphi-ne dans le forum Delphi
    Réponses: 13
    Dernier message: 05/12/2006, 13h19
  5. variable globale dans une dll MFC
    Par loup_precaire dans le forum MFC
    Réponses: 4
    Dernier message: 12/09/2006, 11h22

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