(__cdecl *) => kesako?

Résolu
Oeil_de_taupe Messages postés 150 Date d'inscription samedi 31 janvier 2004 Statut Membre Dernière intervention 16 février 2009 - 16 avril 2005 à 18:01
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 18 avril 2005 à 09:14
Bonjour tout le monde,



J'ai créé deux classes qui représentent un protocole pour envoyer des
données entre deux PC. Lors de l'appele de leur constructeurs elles
demandent un pointeur sur une fonction afin d'envoyer des messages
d'information sur la connection par protocole (un peu comme la fonction
WndProc qui reçoit des messages sur la fenêtre ouverte).



Dans ma classe de décodage du protocole, mon constructeur demande un
pointeur de type pFunc ou pFunc est déclaré de cette manière:

typedef bool (*pFunc)(int, SOCKET, const char*, int, int);



Il existe en plus des deux classe représentant le protocole, deux
autres classes qui s'occupe que de la connection par Socket entre les
deux ordinateurs.

Dans la classe serveur (qui contient celle de décodage du protocole) un
thread se lance pour l'écoute avec un socket (c'est donc une fonction
static). Je passe le pointeur de toute la classe au thread pour qu'il
puisse accèder à sa classe (chose qui est impossible normalement avec
une fonction static)



J'utilise donc le constructeur de la classe qui traite le protocole
dans un thread d'une autre classe. Voici la création de la calsse
depuis le thread: lLocal->lDecodeur = new
CTDecode(lLocal->MessageReceive, csock);





lLocal est le pointeur sur le tout de la classe (pour que la fonction static puisse accéder à sa classe, paramètre du thread)

lDecodeur est un pointeur sur la classe de décodage utilisée

et lLocal->MessageReceive est un pointeur sur la fonction qui permet de récupérer les messages de la classe protocole

(csock est un bête socket déjà connecté)

MessageReceive est une fonction qui reçoit les message (elle n'est pas static). Voici son prototype:

bool MessageReceive(int, SOCKET, const char*, int, int);



Mais lorsque je compile le compilo me met une erreur de ce type

error C2664: '__thiscall CTDecode::CTDecode(bool (__cdecl
*)(int,unsigned int,const char *,int,int),unsigned int)' : cannot
convert parameter 1 from 'bool (int,unsigned int,const char *,int,int)' to 'bool (__cdecl *)(int,unsigned int,const char *,int,int)'


Es-ce-que quelqu'un aurait une idée pourquoi le compilo me met ce bug?



(j'ai déjà essayé de mettre ce "(__cdecl *)" dans le prototype de la fonction MessageReceive mais il y a toujours le même bug ...

5 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2005 à 18:23
Faudrait mettre ta fonction en static pour passer un pointeur dessus je pense.

ciao...
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 avril 2005 à 20:11
A la compilation le compilo doit savoir l'adresse de la fonction, si elle est membre de classe elle est chargée dynamiquement à l'instanciation de la classe et donc pas d'adresse fixe.

ciao...
BruNews, MVP VC++
3
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
18 avril 2005 à 09:14
Petite précision : les fcts membres des classes ont une adresse fixe (les fct virtuelles sont à placer un peu à part mais bon). La raison pour laquelle elle ne peuvent servir de CALLBACK à l'API Windows c'est que toutes les fct membres des classes (non statiques) ont un argument supplémentaire implicite (this) que l'API Windows est incapable de fournir.

Il y a un moyen de passer une fct membre nons tatique d'une classe en CALLBACK à une autre fonction mais c'est plus délicat (le type de la CALLBACK doit contenir le nom de la classe). Les MFC s'en servent pour la table des messages. Mais cette technique n'est pas possible pour toi car le type de la CALLBACK est déjà fixé par une API.
3
Oeil_de_taupe Messages postés 150 Date d'inscription samedi 31 janvier 2004 Statut Membre Dernière intervention 16 février 2009
16 avril 2005 à 19:59
Ho!!!



Tu as raison... Mais... Oulala!!! Je me sens vieillir .
C'est pas possible, j'ai bloqué pendant une journée sur ce problème et
tu me donne la solution en une phrase, alors qu'il me semblait que
j'avais déjà tester ce que tu avais dit avant!!!



Mais sait tu pourquoi on ne peut pas donner le pointeur d'un fonction
en non-static depuis une fonction static (alors que ces deux fonctions
sont dans la même classe)...




La taupe voit toujours tout (sauf les bugs)
0

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

Posez votre question
Oeil_de_taupe Messages postés 150 Date d'inscription samedi 31 janvier 2004 Statut Membre Dernière intervention 16 février 2009
17 avril 2005 à 12:28
Un mot va bien pour ta réponse BruNews: "MERCI"

La taupe voit toujours tout (sauf les bugs)
0
Rejoignez-nous