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

API, COM et SDKs Delphi Discussion :

Windows-Messages : comment intercepter "application.quit"


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 68
    Par défaut Windows-Messages : comment intercepter "application.quit"
    Bonjour,

    J'ai ajouter du code à un jeu par le biais d'un proxy-dll, c'est à dire que mon code est dans un fichier nommé "d3d9.dll", placé dans le répertoire du jeu, sachant que ce dernier regarde d'abord dans son répertoire pour charger la dll DX de Microsoft avant d'aller voir dans le répertoire system de Windows.

    Du coup il charge ma dll, mon code démarre (et moi je fais le relais avec la "vraie" d3d9.dll).

    Voilà, ça c'est pour placer le contexte


    Ce que j'ai besoin de faire :
    Connaitre le moment où l'utilisateur quitte le jeu, parce que je dois stopper les actions de mon code personnel et surtout libérer la mémoire suite à la création dynamique d'objets (DirectX et autre).

    La première idée qui me vient à l'esprit c'est de capter le message windows correspondant. Mais une question se pose : si l'application "maître" (c'est à dire celle dans laquelle j'ai injecté mon code) recoit le message-windows avant moi je ne le détecterais jamais puisqu'elle va l'effacer de la queue des messages (puisque traité).

    Donc il faudrait que je sois sûr de la capter en premier et aussi de le laisser tourner pour que l'application maître le recoive.


    Avez-vous des idées la dessus ? ou même d'autres pour solutionner ce problème ?

    J'ai pensé aussi à faire un hook sur l'équivalent de notre fonction "application.close" dans Delphi, mais comment la trouver ? :/

    Merci d'avance,
    Alekhine.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 083
    Par défaut
    le plus simple, c'est plutôt de gérer le déchargement de la DLL modifiée d3d9.dll via un DllEntryPoint DETACH
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 68
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    le plus simple, c'est plutôt de gérer le déchargement de la DLL modifiée d3d9.dll via un DllEntryPoint DETACH

    Salut, merci.

    Le souci c'est que "je" ne la charge pas cette DLL, elle est chargée par le jeu parce que je le trompe en lui fesant "croire" que c'est la DLL Microsoft.

    Alors pour trouver le moment où il la décharge... outch non ?

    Alek.

  4. #4
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    1 - Chopper le Handle du jeu
    2 - de temps à autre vérifier que celui-ci est toujours en activité

    Cherche du côté de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Var
      lpExitCode : DWORD;
    begin
       If GetExitCodeProcess(hProcess, lpExitCode) and
          (lpExitCode <> STILL_ACTIVE) then
        begin
         // Traitement de fin de process
        end;
    end;

    a+

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 932
    Par défaut
    Justement, ce que te propose Shai ne concerne pas ton application.
    Et d'ailleurs, tu ne t'occupe pas du chargement, pourquoi t'occuperas-tu du déchargement .

    Par contre, ta DLL sait quand elle est chargée... et déchargée . Ces notions sont standardisées et correspondent au DLLEntryPoint.

    Le prototype de ces DLLs est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    library TaLib;
     
    procedure DllEntryPoint(dwReason : dword);
    begin
      case dwReason of
        Dll_Process_Attach : ; //Chargement
        Dll_Process_Detach : ; //Déchargement
      end;
    end;
     
    begin
      DLLProc := @DllEntryPoint;
      DLLEntryPoint(Dll_Process_Attach);
    end.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 68
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Justement, ce que te propose Shai ne concerne pas ton application.
    Et d'ailleurs, tu ne t'occupe pas du chargement, pourquoi t'occuperas-tu du déchargement .

    Par contre, ta DLL sait quand elle est chargée... et déchargée . Ces notions sont standardisées et correspondent au DLLEntryPoint.

    Le prototype de ces DLLs est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    library TaLib;
     
    procedure DllEntryPoint(dwReason : dword);
    begin
      case dwReason of
        Dll_Process_Attach : ; //Chargement
        Dll_Process_Detach : ; //Déchargement
      end;
    end;
     
    begin
      DLLProc := @DllEntryPoint;
      DLLEntryPoint(Dll_Process_Attach);
    end.

    Magnifique! , merci beaucoup à Shai également

    @Yurck : j'avais déjà tester mais je le sais trop tard...
    ou alors il faut stresser le CPU pour observer ça sans arrêt :/


    Merci à tous, c'est que du bonheur de poser une question sur ce forum.
    Par pur respect je creuse au max avant de me résoudre à poser la question, mais parfois j'arrive à rien sans "vous", la preuve :s



    Alek.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment intercepter les messages d'un processus sous windows?
    Par Hamdi Hedhili dans le forum Général Java
    Réponses: 3
    Dernier message: 17/03/2008, 16h57
  2. [WebForms]Comment installer l'application sur Windows 2003 Server ?
    Par pepin21 dans le forum Général Dotnet
    Réponses: 7
    Dernier message: 04/05/2006, 14h41
  3. Comment fermer l'application en même temps que Windows ?
    Par semaj_james dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2004, 22h17

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