Pointeurs fonctions de types inconnus

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 16 août 2005 à 14:57
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009 - 19 août 2005 à 16:52
Bien le bonjour,

J`aimerai recuperer des pointeurs vers des fonctions dont je ne connais pas le type a l`avance.

Ex:

DWORD FonctionAlacon(char* pStr)
{
return strlen(pStr) - strlen(pStr); // alors ca pour une fonction a la con, ... !

}

int main(void)
{
void* pointeurFunction;
pointeurFunction = FonctionAlacon;

return 0;
}

Ca ne compile pas car il faut preciser les arguments et parametres. Mais je n`peux pas car je ne connais pas les fonctions a l`avance.

Comment resoudre ce probleme ?

Je vous remercie.

21 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 août 2005 à 15:20
Bonjour,

Sans documentation sur cette fonction, il est difficile de trouver son
type de pointeur. Avec beaucoup de chance, tu y arriveras en faisant
des tests avec différents paramètres. Les plantages sont assurés quand
ce ne sont pas les bons. Plus le nombre de paramètres augmente et plus
les chances diminuent. Il faut penser aussi à la convention d'appel.

Bonne chance quand-même.
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
16 août 2005 à 15:21
Un pointeur généric ne peut pas contenir l'adresse d'une fonction,
seulement d'un objet. Tu peux passer par une structure par exemple.





DWORD FonctionAlacon(char* pStr)

{

return strlen(pStr) - strlen(pStr);

}



struct s_Fonction{

DWORD (*FonctionAlacon)(char* pStr)

}f = {FonctionAlacon };



int main(void)

{

void* pointeurFunction;

pointeurFunction = &f;



((struct s_Fonction *)f)->FonctionAlacon...

return 0;

}
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
16 août 2005 à 15:26
Essaye de forcer le compilo à convertir ta fonction lorsque tu veut récuperer son pointeur dans pointeurFonction:

void* pointeurFonction;
pointeurFonction = (void*)fonctionAlacon;

Je suis pas sur que ça marche sur les fonctions mais essaye quand même

neodelphi
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 août 2005 à 15:35
Comme dit racpp, le seul prob ce sont les params (nbr et type) sinon:

pfunc = GetProcAddress(hdll, "nomFunc);

quand appel, si 3 params par exemple:


__ asm {
push param3
push param2
push param1
call pfunc
}

et on se soucie plus des contorsions de cast du C.

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 août 2005 à 15:37
et prévoir remontée de ESP si func non stdcall.

ciao...
BruNews, MVP VC++
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
16 août 2005 à 15:40
C'est marrant, il me semblais qu'on ne pouvais affecter l'adresse d'une fonction à un pointeur générique, j'aurais revé ?
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
16 août 2005 à 16:06
J'ai pas revé, le standard l'interdit.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 août 2005 à 16:45
On peut définir un type de pointeur de fonction comme ceci:

typedef BOOL (*PFonction)(int);

On définit ici un pointeur d'une fonction qui renvoie un BOOL et reçoit un int comme paramètre.

Pour déclarer notre pointeur on fait:

PFonction pf;

Pour lui affecter l'adresse d'une fonction on fait:

pf = (PFonction) NotreFonction;

Ainsi, on peut remplacer NotreFonction par pf dans le programme.

Dans cet exemple, la convention d'appel n'est pas précisée. Dans
ce cas le compilateur utilise la convention par défaut : __cdecl. Pour
la préciser dans la définition du type de pointeur on fait par exemple:

typedef BOOL (__stdcall *PFonction)(int);
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
16 août 2005 à 17:35
Merci a tous !

Je vais donc definir un type commun a toutes les fonctions (que je dois modifier):

typedef void (__stdcall *VOID_FUNC)(void*);

A coup de memcopy, ca devrait aller pour renvoyer et recevoir n`importe quel type d`argument .

Ex:

void func1(void* pData)
{
BYTE *b = (BYTE*)pData;
float f1 = 0.7f;
float f2 = 0.9f;
float f3 = 7.4f;
memcpy(b, &f1, sizeof(float)); b+=sizeof(float);
memcpy(b, &f2, sizeof(float)); b+=sizeof(float);
memcpy(b, &f3, sizeof(float)); b+=sizeof(float);
}

VOID_FUNC pf;
BYTE byte[3*sizeof(float)];
pf = func1;

pf(byte);

Merci encore.
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
16 août 2005 à 18:12
Tu peux simplifier



void func1(void* pData)
{
static const float f[] = {0.7f, 0.9f, 7.4f};
memcpy(pData, f, sizeof f);
}

VOID_FUNC pf;
float f[3];
pf = func1;

pf(f);
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
16 août 2005 à 18:27
Oui, c`est vrai, j`aurais du prendre un exemple avec differents types de parametres.
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
16 août 2005 à 18:33
Dans ce cas passe plutot une structure:



struct Params

{

int i;

float f;

};


void func1(void* pData)
{
struct Params *params = pData;

params->i = 5;

params->f = 27.1f;
}



VOID_FUNC pf;
struct Params params;
pf = func1;

pf(&params);
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
16 août 2005 à 22:26
Par curiosité, j'aimerais savoir ce que tu veux faire exactement ?! Le "pourquoi du comment".



Avec des possibilités comme le polymorphise paramétrique ou le
polymorphisme d'exécution, je ne vois vraiment pas quelle application
amene à devoir empiler des (void)(void*)(void*).

Cordialement,
Xterminhate.
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
17 août 2005 à 02:24
Bon, je ne vais pas raconter ma vie, mais je fais un editeur (trop long a expliquer).

J'ai donc fait une console pour modifier des données sans avoir a recompiler le programme.

Et j'ai besoin d'envoyer des actions comme.



SetTexture(3, {Group(5-8), 1,2-11}, {0});

Qui est censé appliquer la texture 3 aux 1er subset des meshes 1, 2 à 11 et aux meshes appartenant au groupes 5 à 8.



Bref, des trucs comme ça.



Je dois analyser ces chaines de caracteres.

Facile de recuperer le nom de la fonction, le nombre de parametre et
les parametres "extraits" (genre 1-3 => 1,2,3 et lecture
des groupes).



Le probleme est qu'il y a enormement de fonctions comme SetTexture. Des fonctions ayant besoin de parametres différents.

Je pensais ecrire les fonctions comme SetTexture dans le programme et leur envoyer les parametres lus dans la console.

Je voulais faire une structure pour toutes les fonctions.



struct SFunction

{

char s_strName[32]; // ex "SetTexture"

BYTE s_bNumParameters;

DWORD s_dwParameters[8]; // flags pour definir les parametres

VOID_FUNC s_Function; // pointeur vers une fonction

};



et faire:

for (i=0; i<m_dwNumFunction; i++)

if (StringCompare(strFuncName, objFunc[i].s_strName))

(objFunc[i].s_Function)((BYTE*) pParameters );



Je voulais faire pointer s_Function vers des fonctions comme SetTexture qui prend comme parametres 1 int et 2 listes d'int.

Mais toutes les fonctions n'ont pas tous les meme types d'arguments....



Bon , je n'ai pas été clair, mais ce n'est pas grave.

Je teste d'autre methode... pour l'instant.
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
17 août 2005 à 08:50
<meta name="GENERATOR" content="OpenOffice.org 1.1.4 (Linux)"><meta name="CREATED" content="20050817;8353000"><meta name="CHANGED" content="20050817;8355200">




<style>
<!--
@page { size: 21cm 29.7cm; margin: 2cm }
P { margin-bottom: 0.21cm }
-->
</style>

Ok, on retombe alors sur une
application ordinaire du polymorphime d'execution en C++.



Donc, pas
besoin de cette merde de (void*)(void*).



Je peux t'avancer une solution si tu n'est pas réticent à l'orienté objet et au C++.
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
17 août 2005 à 12:08
Je suis ouvert a toutes propositions.
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
17 août 2005 à 12:42
Bien, ce soir ou demain, je poste un nouveau source qui sera intitulé
"Classe Interpreteur de commande" que tu pourras dériver afin de
réaliser - en partie - ce que tu souhaites faire. J'ai moi même un
besoin similaire et souvent récurrant qui semble tres proche du tien.
Je vais donc le formaliser....

Cordialement,
Xterminhate.
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
17 août 2005 à 12:52
Merci infiniment !

Je vais de ce pas (\de ce clic) me renseigner sur les polymorphismes d`execution pour ne pas etre largue en lisant ta source.

Merci encore.
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
17 août 2005 à 13:20
xterminhate, ce que tu appels polymorphime d'execution c'est bien le
polymorphime d'inclusion (par le biais de l'heritage et de methodes
virtuelles) ?
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
18 août 2005 à 07:17
Stevy > Exactement.

Cordialement,
Xterminhate.
0
Rejoignez-nous