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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    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 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    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 !

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, 14h24
  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, 12h12
  3. Réponses: 7
    Dernier message: 17/10/2006, 08h46
  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, 14h01
  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, 12h29

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