Accueil > Forum > > > > Utilisation de fonctions Callback
Utilisation de fonctions Callback
lundi 23 juillet 2007 à 16:08:39 |
Utilisation de fonctions Callback

N0euX
|
Bonjour a tous,
Je suis actuellement confronte a un probleme de fonction callback.
J utilise une librairie pour controler un peripherique. Dans celle-ci, il y a une fonction dont la declaration est la suivante :
typedef void (WINAPI *NOTIFICATION_CALLBACK) (HANDLE cyDevice, DWORD dwNotify, DWORD dwUser);
// cyDevice = Handle to device triggering callback
// dwNotify = Reason for callback
// dwUser = User-defined parameter
// Subscribe for event notifications such as ready-to-read
// Only one subscriber callback per device
// Returns OK or an error code
DWORD SubscribeNotifications
(
HANDLE cyDevice, // Handle obtained from Open()
NOTIFICATION_CALLBACK callback, // Pointer-to-function for callback
DWORD dwUser // User-defined parameter to pass to callback
);
Je cherche a utiliser la fonction SubscribeNotifications dans mon programme c++ mais je ne connais pas grand chose aux fonctions callback.
Pour cela, je cree une fonction telle que :
void WINAPI OnUser(HANDLE hanReader, DWORD dwNotify, DWORD dwUser)
{
// mon code
}
Et par la suite, dans mon main, je fais appel a ma fonction Subscribe_notifications :
RFID_NOTIFICATION_CALLBACK callback;
callback = (RFID_NOTIFICATION_CALLBACK)OnUser;
DWORD dwUser;
cout << "Error Code sub notif " << RFID_SubscribeNotifications(hanReader,callback,dwUser) << endl;
Logiquement, a chaque evenement sur mon peripherique, la fonction OnUser devrait s executer (en tout cas c est mon but) mais ce n est pas le cas.. Je ne sais pas si c est moi qui ne comprends pas grand chose aux callback (c est bien possible) mais j aimerais bien savoir que faire pour corriger mon erreur svp.
Merci d avance.
|
|
lundi 23 juillet 2007 à 17:44:00 |
Re : Utilisation de fonctions Callback

acx01b
|
salut pourquoi mets tu sans RFID_ puis avec RFID_ ensuite ?
ils disent HANDLE cyDevice, // Handle obtained from Open() dans ta lib, tu as passé le bon ?
|
|
lundi 23 juillet 2007 à 18:05:53 |
Re : Utilisation de fonctions Callback

ctx_man
|
Salut !
Déjà petite simplification :
RFID_SubscribeNotifications(hanReader, (NOTIFICATION_CALLBACK)OnUser, 0);
Redéfinir un pointeur local pour ton callback sert strictement à rien.
Le DWORD dwUser c'est fait pour passer un paramètre à ta fonction callback, tu t'en sert pas alors ne définit pas une varible locale pour la passer à ton callback, surtout que tu ne l'initialise pas, tu ne sais pas ce qu'il y a dedans.
Ensuite, meme remarque que acx01b, c'est marquer "NOTIFICATION_CALLBACK callback, // Pointer-to-function for callback" donc d'où vien le "(RFID_NOTIFICATION_CALLBACK)".
Et comment as-tu obtenu ton hanReader ?
|
|
lundi 23 juillet 2007 à 19:08:03 |
Re : Utilisation de fonctions Callback

N0euX
|
desole, autant pour moi je n etais trompe en recopiant mon code donc le RFID est une erreur qui n y est normalement pas (jai modifie le post en consequence)
acx01b, comment sa passer le bon handler? je pensais que comme la fonction allait s executer au declenchement d un evenement, les parametres etaient transmis automatiquement.. (un peu comme en vb .net ou on peut recuperer des informations sur levenement qui se declenche, ici je pensais que les infos etaient le handler declencheur, levenement dwNotify et le dwUser d ou est issu l evenement ) sinon je ne vois pas comment gerer cela.
ctx_man, oui j ai enleve la redefinition du pointeur local, juste comme cela ne marchait pas j ai un peu tout teste (enfin, tout ce que je sais faire). Pour le parametre a passer a la fonction callback, je sais que jen ai pas besoin mais je ne sais pas quoi passer a ma fonction SubscribeNotification si je ne definis pas un DWORD quelconque.. Le hanReader est obtenu auparavant dans le main tel que "hanreader = open(1)" (1 etant le numero du periph, la fonction open marche correctement jai pu tester dautres fonctions par le suite utilisant le handreader)
|
|
lundi 23 juillet 2007 à 19:41:58 |
Re : Utilisation de fonctions Callback

racpp
|
Salut, Je ne connais pas SubscribeNotification(). Elle appartient à quelle librairie? Pour
que ta fonction CallBack soit appelée, il faut qu'elle soit
correctement enregistrée par le service de notification concerné.
C'est sûrement le role de SubscribeNotification(). Es-tu sûr que ce service est actif?
|
|
mardi 24 juillet 2007 à 08:28:06 |
Re : Utilisation de fonctions Callback

ctx_man
|
Salut, je passe en couranr juste pour te dire que j'avais répondu à "je sais que jen ai pas besoin mais je ne sais pas quoi passer a ma fonction SubscribeNotification si je ne definis pas un DWORD quelconque".
DWORD = Double Mot = 4 octets = 32 bits = unsigned int
petit rappel, un nombre sortit direct dans le code est un int par défaut.
RFID_SubscribeNotifications(hanReader, (NOTIFICATION_CALLBACK)OnUser, 0);
Voila le petit 0 à la place de la variable. Plus l'allocation et un paramètre que tu connais. De mannière générale, la majoritée des fonctions sont faite de telle sorte que quand tu sais pas quoi mettre comme paramettre, tu met 0 ou NULL (sachant que NULL n'est qu'un define de 0)
|
|
mardi 24 juillet 2007 à 09:51:07 |
Re : Utilisation de fonctions Callback

N0euX
|
racpp
, SubscribeNotification est fournie dans la librairie de mon periph, et permet, moyennant le passage d une fonction de callback d effectuer des operations que lon veut lors de l occurence d un evenement. le service est cense s activer par cette fonction elle meme.. d apres la doc, donc si cela ne marche pas, c est que je dois mal appeler ma fonction d apres moi.. (meme si elle ne me renvoit pas une erreur)
ctx_man, merci pr les infos, jai hesite a mettre null mais je savais pas si cela correspondait a un dword. Avec ta syntaxe, l execution est correcte mais il n execute pas de callback comme je le voudrais..
|
|
mardi 24 juillet 2007 à 10:07:11 |
Re : Utilisation de fonctions Callback

ctx_man
|
En fait mettre 0 ce n'est pas tou a fait un DWORD. Le DWORD c'est un define (ou un typedef je sais plus) de unsigned int. Si tu ne met pas de préfixe/suffixe pour indiquer la nature de ta constante, alors le compilateur décide que c'est un int tout court (donc un signed int). Cependant, tant que les valeurs que tu met restent dans la fourchette positive d'un signed int, le compilo dira rien car aucun risque de perte de donnée.
Pour en revenir à ton problème : tu es absolument certain qu'il n'execute pas ton callback ?
Je veux dire par la que si ta facon de tester si ta fonction callback est appellée c'est de mettre un printf ou un messagebox a l'intérieur de cette fonction, alors tu ne peux être certain qu'elle n'est pas appellée. Met un point d'arret dans ta fonction callback, par exemple sur le return en écrivant ton callback comme suit :
void WINAPI OnUser(HANDLE hanReader, DWORD dwNotify, DWORD dwUser)
{
return; //<---point d'arret à poser ici.
}
C'est une bonne mannière d'etre sur de savoir si tu passe par ton callback ou non.
Sinon, es-tu sur que c'est tou ce qu'il faut faire ? La doc ne fait pas état d'une fonction d'initialisation du système de notification ou quelque chose à faire avant/apres ton RFID_SubscribeNotifications ?
|
|
mardi 24 juillet 2007 à 12:38:40 |
Re : Utilisation de fonctions Callback

N0euX
|
en fait je vais revenir sur mon programme. c est une application c++ console que jappelle avec un parametre apres compil tel que "monprog param". jusque la mormal. suivant le parametre dans le main de mon programme, on discute avec le periph en lui envoyant des commandes, puis le programme termine. dans le cas present, jappelle avec /subnotif comme parametre et apres dans le main je fais donc appel a SubscribeNotifications qui est cense (d apres la doc) initialiser le systeme de notification, en lui precisant la fonction de callback (celle ci etant dans mon programme, en dehors du main). mais apres, lors de l evenement, le programme n etant pas lance, je ne vois pas comment cela peut fonctionner et comment le periph peut executer ma fonction..
ainsi, je ne sais pas comment mettre de point d arret n etant pas en debug.. pour le moment je verifie si lecriture dans un fichier est effectuee ou pas, et ce n est pas le cas.
la seule chose precisee par la doc a faire en dehors dappeler cette fonction est d autoriser l occurence des evenements qui m interessent sur le periph, et cela marche car jai pu le verifier autrement. c est juste que je narrive pas a le recuperer loccurence de cet evenement (et ainsi pouvoir le traiter).
|
|
mardi 24 juillet 2007 à 13:06:02 |
Re : Utilisation de fonctions Callback

ctx_man
|
Re !
En fait, avec VS (et certainement la majoritée des IDE) tu peux passer des paramètres a ton programme en mode debug. La configuration de la ligne de commande lançant ton programme en mode debug est souvent placée dans les propriétées du projet. Tu peux donc quand même lancer ton programme en mode debug avec le point d'arret. Sinon tu peux te servir du paramètre de ta fonction calback pour passer un pointer qui te permettra de retourner une valeur ou je ne sais quoi d'autre.
Petit question : Si ton programme se termine juste apres avoir fait ton subnotif, c'est plutot normal que la callback soit pas appelé puisque le programme référencant la fonction est terminé. Donc, tu n'es pas sensé boucler sur quelque chose ?
|
|
Cette discussion est classée dans : fonction, handle, callback, dword, dwuser
Répondre à ce message
Sujets en rapport avec ce message
Probleme de timer avec fonction de callback [ par julienbj ]
Bonjour,j'ai un petit souci lors de la création d'un timer avec une fonction de callback.Voici un bout de code qui ne fonctionne pas, mais je ne vois
Passer un pointeur sur une instance à une fonction membre static ? [ par tintin72 ]
Bonjour, j'ai un problème pour passer un pointeur sur une instance ou l'adresse de l'instance à une fonction callback Windows. Je m'explique J'ai créé
implementation d'une fonction callback pour l'appel à une DLL [ par 3asfoura ]
Hi all!J'utilise visual c++ 6.0.J'ai une DLL client dont je connais seulement les noms de fonctions visualisés sous "Dependency walker". Je veux imple
Adresse d'une fonction CallBack dans une classe [ par Capa6T ]
Bonjour, J'ai un petit souçis pour récupèrer l'adresse d'une fonction CallBack dans une classe. MaClasse.h : ------------ class MaClasse { protected
JNI natif -> Java - appeler java depuis une fonction callback??? [ par rachmasse ]
salu,Voila j'essaye depuis plusieurs jours deja de faire remonter à JAVA mes evenements detectés grace aux fameux hook.Le problème est que je n'arriv
Problème avec la fonction callback du timer [ par Arkadias ]
Bonjour tout le monde, je suis confronté à un problème de timer.Voila la situation :Dans le cadre d'un projet de conversion de protocole, je récupère
Appel fonction avec GTK+ [ par ptityo31 ]
Bonjour,je débute sur GTK+, et j'aimerai avoir des précisions sur le lancement d'une application à partir d'un clic.En effet je dois envoyer des trame
Fonctionnement de la Winpcap [ par myanaa ]
Bonjour à tous,Actuellement, je travail sur un projet en relation avec la lib Winpcap. Et je me pose certaines questions, dont je n'ai pas trouvé de r
Obtenir l'handle d'une DLL [ par TryToHelpMe ]
Bonjour,J'ai un nouveau problème que je n'arrive pas à résoudre.J'ai besoin de récupérer l'handle de ma DLL.Je fait appel à ma DLL depuis un programme
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|