[VC++] Déclaration et appel d'une fonction callback

Déclaration et appel d'une fonction callback [VC++] - Programmation

Marsh Posté le 12-11-2001 à 15:14:11    

Salut !
 
voila j'utilise la fonction :
 
BOOL EnumChildWindows(
  HWND hWndParent,         // handle to parent window
  WNDENUMPROC lpEnumFunc,  // callback function
  LPARAM lParam            // application-defined value
);
 
je tape ceci : ::EnumChildWindows(::GetDesktopWindow(), EnumWindowsProc, 0);
 
et je déclare ma fonction CALLBACK ainsi :
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);
le problème est que si je ne rajoute pas "static" devant la déclaration le compilateur pete une erreur : cannot convert parameter 2 from 'int (struct HWND__ *,long)' to 'int (__stdcall *)(struct HWND__ *,long)'
 
j'arrive pas a faire un CAST pour que cela fonctionne sans mettre la fonction en static :(
 
merci de m'éclairer :)

Reply

Marsh Posté le 12-11-2001 à 15:14:11   

Reply

Marsh Posté le 12-11-2001 à 16:20:21    

up !
 
personne n'utilise de fonction callback ?

Reply

Marsh Posté le 12-11-2001 à 18:24:31    

:cry:  :cry:  
personne y veut m'aider :(

Reply

Marsh Posté le 12-11-2001 à 18:38:24    

ta essayer de mettre __stdcall a tout hasard?
bizarre ca marche bien chez moi

Reply

Marsh Posté le 12-11-2001 à 18:43:52    

Si ta callback est membre non static d´une classe c normal que ça foire..
Pour de sombres raisons le compilo est pas capable de connaitre l´adresse d´une fonction dans une classe.. qqun sait la raison profonde?? Est-ce parce que l´adresse d´une fonction est pas censée être donnée dynamiquement?? Pquoi est-ce impossible??
Donc moi j´ai dû mettre ttes mes callbacks en static..  :\


---------------
Athlon64 s754 10*200MHz - R9800Pro - 512MB DDR200MHz - ZX6RR - Q2[SupOp] - Tutorial Video: multilangues, multisstitres
Reply

Marsh Posté le 12-11-2001 à 18:46:20    

elle a pas l'aire d'etre dans une classe sa fonction

Reply

Marsh Posté le 12-11-2001 à 23:22:53    

qui arrive a faire appel a une fonction CALLBACK sans déclarer celel ci en static .. et/ou a aprtir de cette focntion CALLBACK a modifier une variable du programme principal ..
 
SVP parceque là je désespère ..

Reply

Marsh Posté le 12-11-2001 à 23:26:48    

oui j'aai essayé de metre __stdcall ainsi :
SetWindowsHookEx(WH_KEYBOARD, __stdcall MyKeyGrab, NULL,GetCurrentThreadId());
 
et j'ai l'erreur suivante : error C2059: syntax error : '__stdcall'
 
si quelqu'un a un pti programme  pour déclarer cette fonction en mode non static !!!!! :)

Reply

Marsh Posté le 13-11-2001 à 09:56:28    

Ta fonction est-elle ds une classe ou non???
 
Et sinon qqun peut me répondre dans le cas d´une classe pquoi c qu´en static?? :)

Reply

Marsh Posté le 13-11-2001 à 11:40:05    

H4dd3R a écrit a écrit :

Si ta callback est membre non static d´une classe c normal que ça foire..
Pour de sombres raisons le compilo est pas capable de connaitre l´adresse d´une fonction dans une classe.. qqun sait la raison profonde?? Est-ce parce que l´adresse d´une fonction est pas censée être donnée dynamiquement?? Pquoi est-ce impossible??
Donc moi j´ai dû mettre ttes mes callbacks en static..  :\  




 
vi, parce que les ptr de fonction membre sont different, vu qu'il faut :
 
1)ptr sur la fonction
2)ptr sur le membre
 
(donc ca entre po)
 
alors qu'en static ben tu te fous du membre, donc c ok
 
bref ca marche pas

Reply

Marsh Posté le 13-11-2001 à 11:40:05   

Reply

Marsh Posté le 13-11-2001 à 15:05:17    

c ds la declaration de la fonction __stdcall
 

Code :
  1. void __stdcall truc () {...}


 
en faite c la def de CALLBACK

Reply

Marsh Posté le 13-11-2001 à 19:18:39    

bon je rame toujours :(
 
alors la fonction EnumChildWindows() est appelée sur un OnButton
d'une classe DLG de la manière suivante :
::EnumChildWindows(TopWin->m_hWnd, EnumChildWnd,(LPARAM)&NextButton);
 
et EnumchildWnd est délarée dans le .h de ma classe de cette façon :
static BOOL CALLBACK EnumChildWnd( HWND hwnd, LPARAM lParam);
 
 
cela marche tant que je laisse le static devant.. moi je veux le virer :( comment faire ???

Reply

Marsh Posté le 13-11-2001 à 20:43:36    

EnumChildWnd est bien en dehors de la classe?

Reply

Marsh Posté le 13-11-2001 à 21:24:36    

non il est dans la classe pkoi ?

Reply

Marsh Posté le 13-11-2001 à 21:45:45    

:sarcastic:  
ca t'arrive de lire ce qu'on ecrit?

Reply

Marsh Posté le 14-11-2001 à 00:57:15    

:ange: heu bah oui je lis !!
mais j'avai pas capté que cela pouvai changer quelquechoz :(
j'essaye ...

Reply

Marsh Posté le 14-11-2001 à 02:04:11    

je veins de metre la focntion CALLBACK a l'intéréieure d'une autre classe et le pb est le meme :(
imosssible de faire l'appel sans déclarée la fonction en static :-(
 
je vais peter un plomb :(

Reply

Marsh Posté le 14-11-2001 à 08:26:22    

putain, on te dit que c pas possible !
 
si tu tiens a la mettre dans une classe, il FAUT la mettre en static
 
(qu'elle soit dns la classe A ou la classe B ca change niet)

Reply

Marsh Posté le 14-11-2001 à 11:03:42    

okkkkkkkkk !!! c vraimetn chiant alors :(
 
je vais devoir feinter :(
 
car mon bur est d'arriver a modifier des variable de la calsse ou est déclarée cette connnasse de fonction callback..
et lorsque la fonction est déclarée en static le copilot me dis qu'ne focntion static ne peux pas acceder aux variables de la classe.

Reply

Marsh Posté le 14-11-2001 à 11:22:44    

Ben sinon comment peut elle savoir a quelle classe elle fait reference...

Reply

Marsh Posté le 14-11-2001 à 11:26:40    

Kouye a écrit a écrit :

okkkkkkkkk !!! c vraimetn chiant alors :(
 
je vais devoir feinter :(
 
car mon bur est d'arriver a modifier des variable de la calsse ou est déclarée cette connnasse de fonction callback..
et lorsque la fonction est déclarée en static le copilot me dis qu'ne focntion static ne peux pas acceder aux variables de la classe.  




 
vi logique
 
mais generalement les callback on un param ou tu peux mettre dedans ce que tu veux.... genre un ptr vers ta classe

Reply

Marsh Posté le 14-11-2001 à 16:53:27    

[b]chrisbk[b]
1)ptr sur la fonction  
2)ptr sur le membre  
 
(donc ca entre po)

 
C pa vrai c juste pour ça que c interdit?? Juste parce qu´on s´est pas embêté à définir un type AdresseFunc qui encapsule les 2 et à l´utiliser pour les définitions de callback..
Ben.. Backward compatibility qd tu nous tient :(
 
Sinon d´accord avec toi pour la fin la solution c de passer l´adresse de la classe en param de callback.. Mais c pas très élégant..

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed