(__cdecl *) => kesako? [Résolu]

Signaler
Messages postés
150
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
16 février 2009
-
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Faudrait mettre ta fonction en static pour passer un pointeur dessus je pense.

ciao...
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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++
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
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.
Messages postés
150
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
16 février 2009

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)
Messages postés
150
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
16 février 2009

Un mot va bien pour ta réponse BruNews: "MERCI"

La taupe voit toujours tout (sauf les bugs)