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 :

Déchiffrage de macro.


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 75
    Points
    75
    Par défaut Déchiffrage de macro.
    Bonjour à tous,

    j'ai entre les mains un code permettant de charger dynamiquement les fonctions d'une dll. Cependant, le brillant auteur a utillisé des macro pour aller plus vite mais a oublié de les expliquer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //macro 1
    #define ILLDLLH(nom, arg) tupedef unsigned int (stdcall *LPF##nom)arg; extern LPF##nom nom
     
    //macro 2
    #define ILLDLLDEF(nom) LPF##nom nom=NULL
     
    //macro 3
    #define ILLDLL(nom) =nom =(LPF##nom)GetProcAddress(g hDll,#nom)
    Merci d'avance

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    ## concaténe deux chaines de caractères, je suppose que c'est ça qui pose problème?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 75
    Points
    75
    Par défaut
    Principalement merci pour tonn aide!!!

    sinon plus prosaiquement l'usage d'extern est-il du au fait que les fonctions de la dll sont écrites en C??

    d'autre part, je ne comprends pas l'utilité de la seconde macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define LPF##nom nom=null
    // quelle est l'utilité de déclarer un variable nulle??? 8O
    petites précisions : la macro n'est appellée que dans 1 dans le header et les macros 2 et 3 ne sont appelées que dans le fichier source.

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    l'usage d'extern est-il du au fait que les fonctions de la dll sont écrites en C??
    Oui.

    Pour la secondre macro, Ca déclare une variable du type Il suffit de "LPFnom" (tout en ayant substitué nom). Le nom de cette variable est "nom" et elle est initialisée à NULL.
    Pour l'initialisation avec NULL, je suppose car LPF est une sorte de typedef sur un pointeur mais sans garantie
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    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
    ILLDLLH:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //S'appelle ainsi:
    ILLDLLH(toto, (int a, int b));
     
    //Donne ceci:
    typedef unsigned int (stdcall *LPFtoto)(int a, int b); extern LPFToto toto;
    //Déclare un typedef de pointeur de fonction
    ILLDLLDEF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //S'appelle ainsi:
    ILLDLLDEF(toto);
     
    //Donne ceci:
    LPFtoto toto=NULL;
    //Pointeur de fonction, initialisé à NULL
    Pour ILLDLL, il faut sans doute supprimer le premier '=', mais pas sûr: Il faut voir comment c'est utilisé.
    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. [VB6] Exécuter une macro Access
    Par Nektanebos dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 22/02/2006, 16h32
  2. [VBA-E] Macro ouverture fichier déja ouvert
    Par bhaal76 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/12/2002, 14h30
  3. [VBA-E] [Excel] Lancer une macro à une heure donnée
    Par Lysis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/10/2002, 12h15
  4. Qu'est-ce qu'une macro ?
    Par karli dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/09/2002, 03h38
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

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