Déclaration et appel d'une fonction callback [VC++] - Programmation
Marsh Posté le 12-11-2001 à 18:38:24
ta essayer de mettre __stdcall a tout hasard?
bizarre ca marche bien chez moi
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.. :\
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 ..
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 !!!!!
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??
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
Marsh Posté le 13-11-2001 à 15:05:17
c ds la declaration de la fonction __stdcall
Code :
|
en faite c la def de CALLBACK
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 ???
Marsh Posté le 14-11-2001 à 00:57:15
heu bah oui je lis !!
mais j'avai pas capté que cela pouvai changer quelquechoz
j'essaye ...
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
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)
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.
Marsh Posté le 14-11-2001 à 11:22:44
Ben sinon comment peut elle savoir a quelle classe elle fait reference...
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
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..
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