JNI natif -> Java - appeler java depuis une fonction callback???

Résolu
rachmasse Messages postés 14 Date d'inscription dimanche 3 décembre 2000 Statut Membre Dernière intervention 10 juillet 2008 - 9 juil. 2008 à 09:00
rachmasse Messages postés 14 Date d'inscription dimanche 3 décembre 2000 Statut Membre Dernière intervention 10 juillet 2008 - 10 juil. 2008 à 13:36
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'arrive à rien depuis les fonctions callback (procedure qui releve les evenements ). aucune variable globale n'est valide.
Ce que je fais actuellement :
- sauvegarde de la JavaVM en variable globale grace à JNI_OnLoad
- utilisation de cette var globale depuis la fonction callback

est ce que quelqu'un a une idée?

7 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
10 juil. 2008 à 12:02
Il y a toute une série de fonctions associées dans l'API :
SendMessage() // à une fenêtre, attend la réponse
PostThreadMessage() // à un thread , retourne immédiatement
...

Le mieux serait je pense, si tu n'as pas besoin de réponse du programme source, d'utiliser PostThreadMessage(), parce que SendMessage s'adresse à une fenêtre donc si tu n'en n'as pas...
Tu peux définir tes messages personnalisés à partir de WM_USER, par exemple :
#define WM_PERSO_0 (WM_USER+2)
etc...

Par contre du coup dans ton programme source tu devras avoir une boucle de récupération de message.
Je ne sais pas si tu y es familier, dans le cas contraire :

MSG msg;
msg.message=WM_NULL;
while(msg.message!=WM_PERSO_QUIT) // par exemple
{
       GetMessage(&msg,NULL,WM_NULL,WM_NULL);
       switch(msg.message)
      {
            case WM_PERSO_0:
             ...
      }
}
Simple à comprendre : GetMessage() récupère les messages dans la file du thread, et tu boucles tant que tu n'as pas reçu l'ordre de sortir (WM_PERSO_QUIT). Par contre, faudra penser à le donner, cet ordre, depuis ton hook! Par exemple si l'application hookée se termine etc... Bien sûr tu peux mettre n'importe quelle autre condition dans le while à la place du message quitter, genre un temps limite...

La fonction PostThreadMessage() a besoin de l'ID du thread auquel envoyer le message, ce qui veut dire que tu dois lui passer cette information : c'est là qu'intervient CreateFileMapping() et compagnie.
Tu pourras récupérer l'ID du thread de ton programme source, par exemple avant d'installer le hook, par GetCurrentThreadId().

Bon si tu veux un exemple concret j'avais déposé une source de hook sur le notepad, où tu pourras trouver mémoire partagée, hooks et envoi de messages entre callback du hook et programme principal.
http://www.cppfrance.com/codes/PERSONNALISER-APP-CHANGER-COULEUR-POLICE-NOTEPAD_44037.aspx
Il y en a plein d'autres sur le site.
3
rachmasse Messages postés 14 Date d'inscription dimanche 3 décembre 2000 Statut Membre Dernière intervention 10 juillet 2008
9 juil. 2008 à 10:34
pas d'idées?
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
9 juil. 2008 à 13:56
Je connais pas du tout Java; cependant si tes hooks sont globaux ou ciblent d'autres processus, il faut savoir que les callbacks seront appelées dans le contexte du (ou des) programme(s) cible(s). Par conséquent il n'y a aucun partage de variables puisque tout se passe dans des espaces d'adressages différents. Si tu veux passer des valeurs entre ton programme source et les hooks, il faut utiliser de la mémoire partagée, par exemple avec l'API Windows CreateFileMapping() et MapViewOfFile().
0
rachmasse Messages postés 14 Date d'inscription dimanche 3 décembre 2000 Statut Membre Dernière intervention 10 juillet 2008
9 juil. 2008 à 14:38
ok j'ai deja utilisé cet technique qui marche trés bien en effet pour echanger des données style entier ou caractère .
Par contre lorsque j'essaye de sauvegarder le pointer de la JVM crée et de le faire passer à ma methode callback, ca ne semble pas marcher.
Pourtant j'initialise bien le pointer et quand je suis dans ma fonction callback j'ai  verfiié que  le pointeur est bien different de null mais il semble erroné.
0

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

Posez votre question
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
9 juil. 2008 à 18:14
en cas de pointeur c'est différent;
un pointeur est valable seulement dans l'espace mémoire dans lequel il a été référencé. Donc tu ne peux pas simplement le passer à une autre application, puisque ce ne sera pas le même contexte et donc la même valeur pointera sur tout à fait autre chose. Tu peux par contre peut-être utiliser ReadProcessMemory(), qui permettra depuis ta callback, à partir du pointeur du processus de base, de lire la mémoire dans le processus de base. Cependant, ceci permet seulement de copier la mémoire dans un nouveau buffer.
Je ne vois pas trop ce que tu veux faire en fait (comme dit j'y connais rien à Java), mais ne serait-il pas plus simple, à partir de la callback, d'envoyer des messages vers le processus source où le traitement serait assuré (parce que du coup tu seras dans le bon espace mémoire)?
0
rachmasse Messages postés 14 Date d'inscription dimanche 3 décembre 2000 Statut Membre Dernière intervention 10 juillet 2008
10 juil. 2008 à 09:13
bien joué l'idée des messages !merci de m'aider c cool.
ca pourrait etre une solution, parcontre tu pourrais me dire comment envoyer des messages entre different processus???
il me semble que ca marche avec des SIGNAL mais je suis plus trés sur du fonctionnement

++
0
rachmasse Messages postés 14 Date d'inscription dimanche 3 décembre 2000 Statut Membre Dernière intervention 10 juillet 2008
10 juil. 2008 à 13:36
merci mille fois, c la grande classe je pense que ca va le faire!!!!
0
Rejoignez-nous