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 :

Reflexion en C++


Sujet :

C++

  1. #61
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    La première erreur, c'est que tu appelles une fonction __stdcall avec un pointeur non-stdcall.

    Et ensuite, déclarer un typedef pour chaque fonction est plus fastidieux qu'utiliser des templates dépendant simplement du nombre de paramètres. Les templates peuvent être instanciés partout où l'on a le prototype des fonctions de la DLL, donc si on a le fichier d'en-tête on peut mettre ça où l'on veut...
    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.

  2. #62
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Par défaut
    ok merci pour tes precisions, du coup j'ai trouvé ce qui n'allait pas, la __stdcall se met dans la parenthese comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int (__stdcall *FCTX)(int hWnd, char *Texte, char *Titre, unsigned int Type);
    et il n'y a plus d'erreur

  3. #63
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Par défaut typdef template
    slt,

    je devrais peut-être créer un nouveau topic pour ca, mais ca a un lien direct avec la derniere ligne de code que j'ai postée.

    Je voudrais faire un typedef template.
    Au lieu d'avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int (__stdcall *FCTX)(int param1, char *param2, char *param3, unsigned int param4);
    j'aimerai avoir quelque chose de générique toujours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int (__stdcall *FCTX)(type1 param1, type2 param2, type3 param3, type4 param4);
    Et évidemment, en c++ c'est interdit, mais heureusement il y a des solutions de secours, mais je ne les comprends pas, et tout ce que je copie du net ne compile pas, quelqu'un pourrait-il m'aider?

  4. #64
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    J'ai commencé à réfléchir et développer un petit bout de code pour permettre la réflexion à base de macros et boost.mpl. J'ai un petit problème pour le moment, dû à des futurs conflits de noms quand j'ajoute un élément dans le mpl::vector(contenant les classes qui seront réfléchies).

  5. #65
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par Xorgnem
    slt,

    je devrais peut-être créer un nouveau topic pour ca, mais ca a un lien direct avec la derniere ligne de code que j'ai postée.

    Je voudrais faire un typedef template.
    Au lieu d'avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int (__stdcall *FCTX)(int param1, char *param2, char *param3, unsigned int param4);
    j'aimerai avoir quelque chose de générique toujours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int (__stdcall *FCTX)(type1 param1, type2 param2, type3 param3, type4 param4);
    Et évidemment, en c++ c'est interdit, mais heureusement il y a des solutions de secours, mais je ne les comprends pas, et tout ce que je copie du net ne compile pas, quelqu'un pourrait-il m'aider?
    Tu crées une struct avec ces 4 paramètres templates et à l'intérieur tu définis ton type à l'aide de ces 4 paramètres template.
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<class chose>
    struct bidule
    {
      typedef int montypesupercompliqué(chose machin);
    };

  6. #66
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il y a une Q/R dans la FAQ concernant les typedef templates.

    Quelles solutions as-tu essayé ? Qu'est-ce que tu ne comprends pas ?

  7. #67
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Par défaut
    Si on prend l'exemple de Miles, ca va etre quoi mon "type1" : chose, bidule ou machin ?
    Et ensuite par quel moyen je lui dit que mon "type1" ce sera finalement un int par exemple ?
    Chui à la rue là mon inexperience en c++ se fait ressentir ...

    J'avais essayé de copier un bout de code que j'avais trouvé dans le fichier d'aide de Visual Studio, et ca par exemple ca n'a pas compilé ... sympa

  8. #68
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename type1, typename type2, typename type3, typename type4>
    struct FCTX
    {
        typedef int (__stdcall *type)(type1, type2, type3, type4);
    };
    Et tu l'utilises comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FCTX<int, double, char, float>::type

  9. #69
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    "type1" sera chose.

    Ainsi, si tu prends :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bidule<truc>::montypesupercompliqué * unPointeurDeFonction;
    type1 sera truc.

    Edit: Arg, grillé.
    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.

  10. #70
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Par défaut
    merci pour votre aide les gars...
    voici les erreurs que j'ai a la compilation, sachant que j'ai integré ce qu'a proposé Laurent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    readingMessage3.cpp(69) : error C2955: 'FCTX' : use of class template requires t
    emplate argument list
            readingMessage3.cpp(9) : see declaration of 'FCTX'
    readingMessage3.cpp(69) : error C2133: 'Fn_Ptr' : unknown size
    readingMessage3.cpp(69) : error C2512: 'FCTX' : no appropriate default construct
    or available
    readingMessage3.cpp(72) : error C2440: 'type cast' : cannot convert from 'FARPRO
    C' to 'FCTX'
            The target type has no constructors
    readingMessage3.cpp(83) : error C2064: term does not evaluate to a function taki
    ng 4 arguments
    readingMessage3.cpp(91) : error C2679: binary '<<' : no operator found which tak
    es a right-hand operand of type 'FCTX' (or there is no acceptable conversion)
    Ca ne me parle pas beaucoup...
    "requires template argument list" par exemple, pourquoi ? Qu'est-ce qui va pas ?

  11. #71
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Vu les messages d'erreur, tu en as fait une mauvaise utilisation. On peut voir le bout de code correspondant à ces erreurs ?

  12. #72
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Si tu l'utilises dans un code template, il faut le mot-clé typename devant les utilisation de ::Type.

  13. #73
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Par défaut
    Citation Envoyé par Laurent Gomila
    Vu les messages d'erreur, tu en as fait une mauvaise utilisation. On peut voir le bout de code correspondant à ces erreurs ?

    oui :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include <iostream> 
    using namespace std; 
    #include <string>
    #include <windows.h>
    #include <stdio.h>
    template <typename type1, typename type2, typename type3, typename type4>
    struct FCTX
    {
        typedef int (__stdcall *type)(type1, type2, type3, type4);
    };
     
    #define FUNCTION_NAME "MessageBoxA" // name of the function we want to call
    #define MODULE_NAME "user32.dll" // Library where the function is
     
    void itsAfunction(string msgBuf);
    string readName(string msgBuf);
    int ltr=0;
    static char ModPath[255]="C:\\WINDOWS\\SYSTEM32\\"; // path to DLL
    int         Status;
    HMODULE     ModId;
     
    string msgBuf("fMessageBoxA@193title"); // Generic message arrives, and is stocked in msgBuf
     
    int main()
    {
     
    	strcat(ModPath, MODULE_NAME); // complete path to DLL
    	ModId = LoadLibrary(ModPath);
     
    	switch (msgBuf[0]) //Reading of the message
    	{
    		case 'f' : // it is a function
    			ltr=1;
    			itsAfunction(msgBuf);
    			break;
    		defaut :	// Not well formatted message
    			break;
    	}
     
    	FreeLibrary(ModId);
    return 0;
    }
     
     
    void itsAfunction(string msgBuf)
    {
     
    	FCTX<int, char*, char*, unsigned int>::type;
    	FCTX        Fn_Ptr;
    	string funcName(readName(msgBuf));
    	LPCSTR funcName2="MessageBoxA";
    	Fn_Ptr = (FCTX)GetProcAddress(ModId, funcName2);
     
     
    	string paramValue;
     
    	switch (193)
    	{
    		case 193 : // it is a int IN
    			//paramValue=readName(msgBuf);
    			Status = Fn_Ptr(0, "Some text and some text again", "title", MB_OK);
    			break;
    		defaut :
    			break;
    	}
    }
     
    string readName(string msgBuf)
    {
    	string funcName("");
    	while(msgBuf[ltr]!='@' && msgBuf[ltr]!='\0')
    	{
    		funcName+=msgBuf[ltr];  // We write the function name in funcName
    		ltr++;
    	}
    	return funcName;
    }
    Voila j'ai épuré le code, jespere pas trop ...
    il reste encore quelques details inutiles, vous en tiendrez pas compte, il y beaucoup de choses à corriger. chaque chose en son temps.

    Alors l'ai-je mal utilisé ?

  14. #74
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Clairement !
    C'est quoi ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FCTX<int, char*, char*, unsigned int>::type;
    ?
    Ca, c'est le type de tes fonctions, donc les lignes après avec juste FCTX sont fausses, il faut utiliser FCTX<...>::type.

  15. #75
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Par défaut
    C'est parce que j'étais fatigué hier c'est pour ca

    Oui j'ai remplacé tous les FCTX, et ca compile
    Je vais voir si j'arrive à faire ce que je veux avec ca, je vous remercie bien tous, vous etes tous très sympas

  16. #76
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Par défaut
    et tous très calés en C++

Discussions similaires

  1. [VB.NET]Reflexion lister les membres d'une classe ...presque
    Par lucie.houel dans le forum ASP.NET
    Réponses: 19
    Dernier message: 20/09/2005, 13h49
  2. [débat] Reflexion sur « quel langage ?»
    Par jack69 dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 23/05/2005, 08h30

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