IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Hook dll, un avis SVP


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Hook dll, un avis SVP
    Bonjour,
    Quand on fait un hook dans une DLL, il y a un petit problème à résoudre au niveau du programme principal qui lance la DLL !
    En effet, la fonction DLL qui lance le HOOK revenant immédiatement dans le programme principal, il ne faut pas que le programme principal se termine, sinon la DLL se termine aussi et le HOOK est perdu !
    J'ai envisagé trois solutions pour bloquer le programme principal, sur les 3, les deux premières fonctionnent très bien et je voudrais savoir, à votre avis, laquelle consomme le moins de ressources système et éventuellement si vous connaissez d'autres solutions encore plus astucieuses pour arriver au même résultat.

    1ère solution qui marche: je fais une petit programme principal sans fenêtre et après l'appel de la DLL, j'utilise la fonction API32:
    2ème solution qui marche: je fais un programme principal avec une fenêtre (éventuellement invisible) et après l'appel de la DLL, le programme principal reste bloqué sur sa boucle:
    3ème solution qui ne marche pas: je fais un programme principal sans fenêtre, je m'arrange pour que l'appel de la fonction qui lance la DLL me transmette en retour le handle du HOOK, puis après le retour de la fonction DLL et toujours dans le programme principal, j'utilise la fonction API32:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WaitForSingleObjectEx(hookdll, INFINITE, false);
    qui est sensée bloquer sur le non changement d'état de n'importe quel objet, mais qui visiblement ne bloque pas pour ce type d'objet.

    J'ai quand même un avis sur les solutions 1 & 2, de mon point de vue, il me semble que c'est la solution 1 qui consomme le moins. A discuter donc.
    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 717
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 717
    Points : 13 196
    Points
    13 196
    Par défaut
    Les 3 méthode sont bloquantes, donc insatisfaisantes à mon goût

    La méthode 3 est la meilleure toute en y ajoutant un Time-Out pour ce ménager une porte de sortie. Maintenant que WaitForSingleObject soit sur le handle de la DLL ou un Event; A tester...

    Attention tout de même à vouloir centraliser tout le code dans la DLL, ça peut très vite pénaliser le système. Si on n'a pas besoin d'interférer avec la donnée, une communication par PostMessage avec l'application principale est à mon sens bien meilleure !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Attente DLL
    Ok merci, je testerai le WaitForSingleObjet sur le handle de la DLL. Par contre, il me semble que le Postmessage implique de maintenir une boucle Getmessage dans le programme principal, ce qui revient à rajouter une solution 2 par dessus la solution 3 ou au minimum à la solution 2. Initialement je pensais, mais à tort semble-t-il, que la fonction Sleep ne faisait qu'armer un timer externe à l'UC, donc ne prenait pas de temps UC, sauf au départ pour armer le timer et à la fin lorsque l'interruption de déclenchement du timer arrive sur l'UC, pour traiter l'interruption et reprendre la main. Alors qu'une boucle Getmessage, me semblait-il, ne faisait que tourner dans l'UC.
    A+

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 717
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 717
    Points : 13 196
    Points
    13 196
    Par défaut
    En fait, si tu ne mets pas de boucle pour tester au minimum un WM_CLOSE, l'application sera incapable de s'arrêter proprement et tu auras systématiquement à l'arrêt du système le message "L'application n'a pas pu se terminer..."

    Il faudrait maintenant savoir ce que tu vises avec ce hook. Parce qu'à moins que tu ne l'installes que pour un Thread précis, celui-ci ne sera de toute façon jamais déchargé puisque ton application est (actuellement) bloquante.

    Pour le PostMessage, ça dépend beaucoup de ce que fait ta routine. Si elle vise tous les processus, son temps de traitement, modification des données, etc.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Attente DLL
    Re-bonjour,
    En fait mon prog ppal travaille de deux manières différentes selon qu'il est appelé manuellement par un clic sur le .exe ou selon qu'il détecte un lancement automatique au démarrage de windows.
    S'il s'agit d'un appel manuel il construit une fenêtre et dans ce cas il boucle en permanence sur sa boucle Getmessage ce qui lui permet d'exécuter les différentes commandes de l'utilisateur via le menu, donc par exemple de lancer la dll du hook ou ensuite de l'arrêter.
    Par contre s'il détecte un lancement auto au démarrage, il ne construit pas de fenêtre donc pas de boucle Getmessage, il se contente de lancer la dll du look et de s'endormir sur un sleep(INFINITE), car je veux effectivement que le hook soit opérationnel en permanence. A l'arrêt du système il n'y a pas de message "L'application n'a pas pu se terminer...", l'application se termine proprement, ce message n'apparaît que si le programme avait au préalable construit une fenêtre ce qui n'est pas le cas lors d'un lancement automatique au démarrage (d'aiileurs il est précisé dans la doc API32 sur la fonction Sleep qu'il faut éviter d'utiliser cette fonction avec une fenêtre).
    J'ai essayé de remplacer le Sleep(INFINITE) par un WaitForSingleObject sur le handle de la dll, ça a l'air de fonctionner pareil.
    J'aurais pu aussi mettre une boucle Getmessage sans fenêtre, mais je n'en vois pas l'utilité du moment que dans le cas d'un lancement auto je ne veux pas arrêter le hook de la dll jusqu'à l'arrêt du système.
    En fait ma question était tout simplement d'avoir un avis sur la solution qui parmi les 3 présentées sollicitait le moins l'UC.
    Merci

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 375
    Points : 41 543
    Points
    41 543
    Par défaut
    Franchement, je dirais construis toujours une fenêtre, mais rends-là invisible (voire message-only) en cas de lancement automatique.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. nouvelle version de mon site (votre avis svp)
    Par fogh56 dans le forum Mon site
    Réponses: 12
    Dernier message: 24/01/2007, 20h02
  2. Donnez-moi votre avis SVP
    Par Immobilis dans le forum Mon site
    Réponses: 13
    Dernier message: 12/01/2007, 21h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo