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

Langage Delphi Discussion :

Comment détecter la fermeture d'une DLL ?


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Points : 11
    Points
    11
    Par défaut Comment détecter la fermeture d'une DLL ?
    Bonjour à tous,
    Je charge dynamiquement une dll dans un programme (notion de plugin)
    Je gère l'appel aux diverses fonctions de la dll depuis le prog sans difficulté, la dll peut afficher sa propre form et ses fonctionnalités
    Je souhaite pouvoir détecter depuis le programme principal, lorsque la dll est fermée depuis sa propre form
    Avez-vous une idée
    Merci

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    si c'est une dll celle-ci ne se décharge pas toutes seul
    donc c'est a toi de gérer la fermeture dans le onclose de ta forme

    @+ Phil

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    Anapurna a raison.

    Une façon simple est d'envoyer un message (PostMessage) à l'application lors de la femeture de ta fiche DLL. Ainsi l'application principale sera notifiée et fera par la même occasion le FreeLibrary.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Merci de vos réponses,
    Mon message était peut-être un peu léger, mais vous avez bien compris mon problème, en plus précis effectivement, si je ferme la dll depuis l'appli, je peut réaliser le FreeLibrary, mais si l'utilisateur ferme la form de la dll depuis cette dernière (ce qui est le plus probable dans l'usage normal) je ne savais pas comment informer l'appli pour décharger la DLL.
    Je comprends mieux la réponse de Andnotor, et j'étais arrivé à cette conclusion à force de recherches, et c'est ce que je m'apprêtes à réaliser, mais comment ?
    Pour le PostMessage (de préférence à SendMessage dans ce cas, ça j'ai compris), je vois à peu près.
    Par contre pour intercepter le message dans l'application parente, je n'arrive pas à modéliser la manière.
    Si vous pouvez me mettre sur la voie, merci d'avance.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Désolé, mais ne perdez pas trop de temps pour répondre à mon message précédent, j'ai trouvé un tutoriel, ok c'est pas ici, peutêtre ai-je mal cherché, en tout cas il répond à mon besoin, j'ai donc ajouté une partie de ce code dans mon appli à l'unité qui va gérée le pilotage des plugins(dll), cela fonctionne.
    Il me reste une dernière interrogation, comment ou quel contenu affecter au paramètre message, j'ai déjà vu qu'il fallait supérieur à 1024 à priori, donc j'ai testé avec 2047 (choisit au pif), mais après je sèche un peu, il doit y avoir une méthode plus élégante.

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    utilise la constante WM_USER pour connaitre le 1er id de message disponible (=1024) en general. si tu veux etre sur que le message que tu utilise ne puisse pas etre envoyé par une autre appli, tu peux utiliser la fonction RegisterMessage (ou RegisterWindowMessage, je sais plus trop), qui te permet de reserver un id de message. c'est utile si c'est la mainWindowProc qui traite ton message (ie. c'est le handle de ton appli qui recoit le message de la dll). Car le probleme qui peut arriver si tu ne reserve pas le message, c'est qu'une autre appli reserve le meme message que toi, et l'envoie en bradcast. du coup tu recois le message que tu crois etre une demande de dechargement de ta dll, mais aui a en fait ete envoyé par une autre appli pour une toute autre raison.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    C'est interressant, mais cela soulève une autre question:
    Si je prend le 1er WM_USER+1 disponible par exemple, je n'aurais pas toujours le même id suivant l'organisation en cours.
    Or dans mon appli, il faut bien que j'attende un id particulier pour savoir que cela provient de ma dll....
    a moins que ce ne soit cette histoire de register, vais gratter de ce coté ...

    Edition: En fait j'ai trouver le tuto ici http://jfdeterme.developpez.com/tuto...hi/messagesys/ , je vais donc essayer ce RegisterWindowMessage

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    C'est bon, cela fonctionne.
    Le registerWindowMessage permet d'obtenir un id de message unique construit à partir de la chaine passée en paramètre, on peut donc par convention faire un register dans l'appli, et un autre dans la dll plugin avec la même string, on obtient le même id. Je me sers des param wParam et lParam pour transmettre les infos supplémentaire.
    Merci de m'avoir aiguiller

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Pourquoi ne pas proposer un CallBack ?
    La DLL Plug-in est lancé par l'application, dans à un moment, tu peux appeler une fonction SetClosingProcedure, tu lui passe un pointeur de procédure de l'application, ainsi lorsque la DLL s'arrête, elle appele la procédure, et donc l'application est averti que la DLL se ferme ...

    unité commune, par exemple dans les protypes des exports ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TClosingProc = procedure(HandleDLL: Integer; Param1: PChar: Param2: Cardinal);
    TInitProc = procedure(Param3: PChar; Param4: Integer; ClosingProc: TClosingProc);
    côté application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HandleDLL := LoadLibrary('Fichier.DLL');
    @ProcInit := GetProcAdress(HandleDLL, 'InitPlugIn');
    ProcInit('Salut', HandleDLL, @AppClosingProc);
    ...
    procedure AppClosingProc(HandleDLL: Integer; Param1: PChar: Param2: Cardinal);
    begin
      ManagerDLL.Remove(HandleDLL);
    end;
    côté DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure DllEntryPointProc(Reason : Integer);
    begin
      case Reason of
        DLL_PROCESS_DETACH, DLL_THREAD_DETACH: gClosingProc(gHandleDLL, 'Bye', 0);    
      end;
    end;
     
    procedure InitPlugIn(Param3: PChar; Param4: Integer; ClosingProc: TClosingProc);
    begin
     gHandleDLL := Param4;
     @gClosingProc := ClosingProc;
    end;

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

Discussions similaires

  1. Comment détecter la fermeture d'une fenêtre par la croix?
    Par man_coef dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/06/2008, 16h34
  2. Réponses: 13
    Dernier message: 20/07/2007, 13h51
  3. Comment détecter la fermeture d'une fenêtre?
    Par Masmeta dans le forum C++Builder
    Réponses: 1
    Dernier message: 18/01/2007, 16h02
  4. Comment détecter l'ouverture d'une session, sans dll ?
    Par yosthegost dans le forum Delphi
    Réponses: 4
    Dernier message: 24/05/2006, 19h58
  5. Comment détecter la frappe d'une touche ?
    Par Bubonik software dans le forum C
    Réponses: 17
    Dernier message: 11/12/2003, 21h52

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