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

MFC Discussion :

Appel dynamique de fonctions


Sujet :

MFC

  1. #1
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut Appel dynamique de fonctions


    Je me pose une question, pas très compliqué, mais qui me tient en echec depuis plusieurs heures ( voir jours ).
    Je voudrais appeller des fonction avec en quelque sortes une méthode universelle ( quoiqu'elle changerait en fonction de la convention d'appel ).
    Par exemple :

    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
     
    typedef void * (WINAPI *GENERIC_FUNC)(...);
     
    int GENERIC_MSGBOX(HWND Parent,LPCTSTR Text,LPCTSTR Title,DWORD params)
    {
    	HMODULE h = LoadLibrary("user32.dll");
    	GENERIC_FUNC func = (GENERIC_FUNC)GetProcAddress(h,"MessageBoxA");
     
    	void * resV = ((*func)(Parent,Text,Title,params));
            // j'ai bien la boite de méssage correcte, mais après j'ai une érreur m'indiquant que le registre ( eax je crois ) n'est pas valide alors comment faire ?
    	int res = 0;
    	memcpy(&res,resV,sizeof(int));
    	func = NULL;
    	return res;
    }
     
    Appel :
    GENERIC_MSGBOX(0,"Ceci test un test","Holà",MB_YESNO);
    Une idée ?

    Je me demandais aussi s'il y avait un moyen d'ajouter, mais vraiment de manière absolument dynamique chaque paramètre c-à-d du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Add(UnParametre);
    Add(BenAutreChose);
    Call(ParamList,&Func);
    je rêve ou c'est possible ?

  2. #2
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    A tout hasard l'assembleur ne pourrait pas t'aider?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    __asm
    {
       push param2
       push param1
       call ma_fonction
    }
    quitte à faire une boucle si le nombre de param peu changer.

    Pour ton problème, eax est la plupart du temps utilisé pour enregistrer la valeur de retour d'une fonction, mais vu que je n'y connais rien en pointeur de fonctions je ne saurais pas t'aider.

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    c'est presque nikel
    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
     
    int GENERIC_MSGBOX(HWND Parent,LPCTSTR Text,LPCTSTR Title,DWORD params)
    {
    	HMODULE h = LoadLibrary("user32.dll");
    	FARPROC DllMsgBox = GetProcAddress(h,"MessageBoxA");
     
            //Sympatique d'inverser l'odre des paramètres, c'est en fonction des conventions d'appel ?
    	__asm
    	{
    		push params
    		push Title
    		push Text
    		push Parent
     
    		call [DllMsgBox]
    	}
            //DllMsgBox définit l'eax, donc ma valeur de messageBox est bien retournée :D
     
    }
    Maintenant, quel serait le code à placer dans une fonction "universelle" ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void * //Ou void si pas de valeur de retour ?
    Universal_Caller(LPCTSTR dllName,LPCTSTR funcName,...)
    {
     ???
     Comment utiliser les arguments de ... ?
     pour utiliser le petit "push", ne faut-il pas connaitre le type du paramètre ? car dans le code machine du déboggueur MSVC, je vois que push devient push dword ptr ...
    }

  4. #4
    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
    Eh bien, le problème majeur vient de la "caling convention": __cdecl, __stdcall (WINAPI) ou __fastcall.
    Habituellement, les noms sont décorés selon la convention d'appel, mais ce n'est pas le cas avec l'API Windows, donc on ne peut pas vraiment faire de fonction appelante "universelle" qui devine la convention d'appel par leur nom...
    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
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    nan, ça ne me pose pas de problème ça. Il suffirait juste de parser une chaine déclaration de fonction pour trouver la convention d'appel...., je veux pouvoir appeller une fonction sans rien connaitre d'elle à part son addresse et sa convention d'appel ( ainsi que savoir si elle retourne ou pas une valeur ).

Discussions similaires

  1. Appel dynamique de Fonction ou Procédure
    Par bepbep dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/02/2009, 13h18
  2. Appel dynamique de fonction par char*
    Par Scorpi0 dans le forum C
    Réponses: 8
    Dernier message: 11/06/2008, 21h08
  3. [JavaScript] [FAQ] Appeler dynamiquement une fonction et passer une fonction en argument
    Par SpaceFrog dans le forum Contribuez
    Réponses: 0
    Dernier message: 28/05/2008, 14h48
  4. Appeler dynamiquement une fonction javascript
    Par BigDozer dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 28/05/2008, 14h41
  5. [Framework] Appel dynamique de fonctions
    Par hdd dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 21/12/2006, 17h35

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