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 :

Pointeurs de fonction à partir d'une Dll


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Par défaut Pointeurs de fonction à partir d'une Dll
    Bonjour,

    Je suis nouveau dans ce forum de discussion. J'ai un énorme problème à résoudre. je dois pouvoir lire et exécuter des fonctions, définies dans une DLL,
    dans une application que je suis entrain de faire. Je dois les lire dynamiquement, mais en n'ayant pas à définir un typedef particulier.
    Ex: (définition avec pointeur de fonction)

    typedef double (*FUNC2DBLDBLDBL)(double,double)

    Je dois donc pouvoir construire par programmation une définition qui pourrait ressembler à l'expression ci-dessus, mais je ne dois pas la hardcodé.

    Aussi, je dois pouvoir l'exécuter. Par exemple:

    FUNC2DBLDBLDBL f;
    (*f)(3.1416, 3.1416);

    Dans ma DLL, la fonction pourrait ressembler à ceci:

    double add(double a, double b)
    {
    return a+b;
    }

    Comment faire pour pouvoir exécuter une telle chose?
    Est-ce faisable? Ça fait longtemps que je cherche et je n'ai pas encore trouvé. Quelqu'un pourrait m'aider?

    Merci

    Figaro.

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef double (*FUNC2DBLDBLDBL)(double,double)
    Ca marche ça même si ce n'est pas une DLL ?

    ça me semble bizarre quand même, je n'ai pas essayé, mais pour ma part, je ne pense pas que ce soit possible.

    Quand on utilise typedef, il y a "deux arguments", le nom du nouveau type puis l'ancien type. Et ton écriture ne respecte pas ça !

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Autant pour moi, en essayant de compiler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef double (*fonction)(double,double);
     
    int main(int argc, char *argv[])
    {
     
     
      return 0;
    }
    Et ça a marché !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 400
    Par défaut
    Figaro: Tu ne peux, à moins de programmer en assembleur : En effet en C, tu n'as pas de contrôle sur la pile, tu ne peux donc pas dynamiquement choisir combien d'arguments tu empiles.

    Résultat, quand bien même tu pourrais pointer vers ta fonction, tu ne parviendrais pas à lui passer de paramètres.
    C'est dans ce genre de circonstance qu'on utilise les listes d'arguments variables pouvant être construites dynamiquement: les va_list de <stdarg.h>.
    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.

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Tu initialises bien ton pointeur après ? Comme ça ?


    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
    #include<stdio.h>
    #include<stdlib.h>
     
     
    typedef int (*Fonction)(int,int);
     
    int add(int a, int b)
    {
    return a+b;
    }
     
    int main(int argc, char *argv[])
    {
      Fonction test;
      test = add;
      fprintf(stderr, "%d", test(1,2));
     
     
     
      system("PAUSE");	
      return 0;
    }
    Et là, ça marche

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 400
    Par défaut
    t'es à coté de la plaque millie, Figaro semble connaître les pointeurs de fonction, mais cherche à faire des appels dynamiques.
    Ce qui en C direct, n'est pas possible.
    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.

  7. #7
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Qu'est ce que tu entends par appel dynamique ?

    Tu semblais parler de nombre d'argument variable ? C'est effectivement possible avec le mot clef ... (comme pour printf), il y a deux méthodes je crois, une avec * stdarg.h et l'autre avec varargs.h. Malheureusement, c'est un peu trop loin tout ça pour moi !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 400
    Par défaut
    C'est toujours stdargs.h qu'il faut utiliser.

    Mais la méthode avec ... n'est appelable que statiquement.
    C'est à résoudre ce problème que servent les va_list, mais on ne peut appeler avec que des fonctions qui acceptent une va_list en paramètre.

    Une fonction (ou un pointeur de fonction) avec ... n'est PAS appelable dynamiquement (à moins de trifouiller en assembleur).

    Par conséquent, des fonctions non-prévues pour des va_list ne sont pas appelables dynamiquement (à moins... enfin vous m'avez compris).
    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.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Par défaut
    Ce que Médinoc vient d'écrire est en plein ce que je veux faire, et je crois malheureusement que ca ne puisse se faire.

    Millie disait que le typedef que j'ai inscrit marchait. Elle a tout à fait raison. Mais ce type def, je dois le fabriquer par programmation et non pas le Hardcodé.

    Il faudrait pouvoir faire des "Push" dans les arguments de la fonction en assembleur pour que ca fonctionne. Mais... comment faire pour les points flottants?????????

    Je vous remercie pour votre aide.

    Figaro

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par Figaro
    Il faudrait pouvoir faire des "Push" dans les arguments de la fonction en assembleur pour que ca fonctionne. Mais... comment faire pour les points flottants?????????
    Idem : push-push-push...

    Un peu de lecture qui pourrait t'inspirer : http://c-faq.com/varargs/invvarargs.19890604.html et http://c-faq.com/varargs/invvarargs.19920714.html

    Bon courage.

Discussions similaires

  1. Appel d'une fonction global à partir d'une DLL
    Par JeanNoel53 dans le forum C++Builder
    Réponses: 6
    Dernier message: 10/12/2010, 15h24
  2. Exporter et utiliser des fonction c à partir d'une dll
    Par alaeddine1983 dans le forum Windows
    Réponses: 10
    Dernier message: 10/07/2009, 13h12
  3. Réponses: 7
    Dernier message: 17/10/2006, 09h46
  4. [DLL] utiliser une DLL a partir d' une DLL et un .def
    Par venomelektro dans le forum MFC
    Réponses: 9
    Dernier message: 07/12/2004, 15h01
  5. pb de récup de handle à partir d'une dll
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2002, 13h29

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