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

Delphi Discussion :

[DLL] LoadLibrary et FreeLibrary


Sujet :

Delphi

  1. #1
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut [DLL] LoadLibrary et FreeLibrary
    Salut à tous
    Voila, je développe un programme qui utilise des plugins sous forme de DLL...Tout est géré dynamiquement et jusque là pas de problème
    A ceci près: FreeLibrary...
    Je fais un code du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var t: TMaProcedure;
         DLLHandle: HWND;
    begin
      DLLHandle := LoadLibrary('MaDLL.DLL');
      if DLLHandle <> 0 then
      begin
        @t := GetProcAddress(DLLHandle, PChar('MaProcedure'));
        if t <> nil then
          t(...);
        FreeLibrary(DLLHandle);
      end;
    end;
    Tel quel, j'ai droit à un freeze de l'appli ou bien une Access Violation...
    Si je mets:
    en lieu et place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      FreeLibrary(DLLHandle);
    ca marche mais j'ai l'impression de laisser pleins de trucs en mémoire...
    La procédure en question de la DLL crée une fiche, l'appelle avec ShowModal, fait pleins de trucs dessus puis la détruit lorsqu'elle se ferme...

    Quelqu'un peut m'expliquer pourquoi le FreeLibrary stipulé pas le SDK de Win ne fonctionne pas?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par Pedro
    La procédure en question de la DLL crée une fiche, l'appelle avec ShowModal, fait pleins de trucs dessus puis la détruit lorsqu'elle se ferme...
    Le problème se situe là En fait tu dois t'assurer que non seulement la fiche est détruite, mais aussi et surtout les ressources qu'elles engagent.
    Pour cela, il faut appeler Dispose, qui traite les derniers messages Windows envoyés à la fenêtre avant de la détruire.

    Le problème, c'est que Dispose est asynchrone, donc que dès que tu l'appeles, elle lance le processus de destruction et puis retourne. Le problème ne serait donc pas résolu, et même agravé.

    Donc la solution n'est pas là mais tu sais au moins d'où vient le problème. Il faut encore creusé. Si j'ai une idée, je reviens l'indiquer
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Merci sjrd
    Citation Envoyé par sjrd
    Le problème se situe là En fait tu dois t'assurer que non seulement la fiche est détruite, mais aussi et surtout les ressources qu'elles engagent.
    Pour cela, il faut appeler Dispose, qui traite les derniers messages Windows envoyés à la fenêtre avant de la détruire.

    Le problème, c'est que Dispose est asynchrone, donc que dès que tu l'appeles, elle lance le processus de destruction et puis retourne. Le problème ne serait donc pas résolu, et même agravé.

    Donc la solution n'est pas là mais tu sais au moins d'où vient le problème. Il faut encore creusé. Si j'ai une idée, je reviens l'indiquer
    Je pensais que c'était Release
    On peut bricoler un truc du genre dans la DLL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Form.Release;
      While Assigned(Form) do Application.ProcessMessages;
    Comme ça, on attend la vrai fin de la Form... Par contre, il faut évidemment que Release mette nil à Form parce que sinon, pas de chocolat...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  4. #4
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par Pedro
    Je pensais que c'était Release
    Euh, oui. Au temps pour moi
    Citation Envoyé par Pedro
    On peut bricoler un truc du genre dans la DLL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Form.Release;
      While Assigned(Form) do Application.ProcessMessages;
    Comme ça, on attend la vrai fin de la Form... Par contre, il faut évidemment que Release mette nil à Form parce que sinon, pas de chocolat...
    Ben non, justement, tout comme Free, la variable objet n'est pas modifiée. Par contre, si le coeur t'en dis, tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Form.Release;
    try
      while True do;
    except
      on Error : EAccessViolation do;
    end;
    Mais je crains que ça ne plaise pas au patron (ni même à ta conscience de développeur propre ^^)
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par sjrd
    Ben non, justement, tout comme Free, la variable objet n'est pas modifiée.
    Je me disais bien aussi: Trop facile...
    Citation Envoyé par sjrd
    Par contre, si le coeur t'en dis, tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Form.Release;
    try
      while True do;
    except
      on Error : EAccessViolation do;
    end;
    Mais je crains que ça ne plaise pas au patron (ni même à ta conscience de développeur propre ^^)
    Ah ouais! Ah ben non...
    Finalement, il suffirait de savoir si la fiche est bien détruite et finie d'être détruite pour que FreeLibrary ne plante pas?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par Pedro
    Finalement, il suffirait de savoir si la fiche est bien détruite et finie d'être détruite pour que FreeLibrary ne plante pas?
    Oui... Il suffirait
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  7. #7
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par sjrd
    Oui... Il suffirait
    Donc je vais rester sur le principe de garder les Handles ouverts du début à la fin du prog... COmme ça à la fin, les FreeLibrary ne devraient pas trop poser de problèmes
    Mais quoi qu'il en soit, je n'aime pas trop ça... En faisant LoadLibrary, que se passe-t-il exactement? La DLL est chargée en mémoire? Donc si je mets DLLHandle := 0 alors, je laisse toute cette mémoire en rade??
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  8. #8
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par Pedro
    Donc si je mets DLLHandle := 0 alors, je laisse toute cette mémoire en rade??
    Oui, jusqu'à fin d'exécution complète de ton programme, ce qui entraîne la libération de ressource associée par Windows.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  9. #9
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par sjrd
    Oui, jusqu'à fin d'exécution complète de ton programme, ce qui entraîne la libération de ressource associée par Windows.
    Donc in fine, le FreeLibrary ne sert pas à grand chose? Puisque notre cher Delphi se charge de tout
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  10. #10
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    Bonjour,
    Comme je n'ai pas le code complet du Bastiais sous les yeux, je vous propose un bout de code qui fonctionne trés bien chez moi avec des fiches modales. Il n'est pas commenté mais vous le lirez sans problème. Le but étant de substituer le handle de l'appli appelante et de le restituer à la fin... Pour la finalité, c'est Windows qui s'en charge...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    library MyDll;
    uses
      SysUtils,
      Controls,
      Classes,
      forms,
      windows,
      FormDsDll in 'FormDsDll.pas' {toto};
     
    {$R *.res}
    var
     OldAppHandle : Longint = 0;
     
     function ShowMyForm(AppHandle : longint):Longint;
    var
      Toto: TToto;
     begin
     if application.handle <>Apphandle then
     OldAppHandle := Application.handle;
     Application.handle := AppHandle;
     Toto := TToto.Create(Application);
     Toto.Showmodal;
     Result := longint(Application);
     end;
     
     function CloseMyForm(Handle: longint) :longint;
     var
     Toto : TToto;
     begin
      Toto :=TToto(Handle);
      Result := Toto.Handle;
      Toto.Close;
      Toto.Free;
      Application.handle := OldAppHandle;
      end;
     
      exports
      ShowMyForm,
      CloseMyForm;
     
    begin
    end.
    Cordialement,
    Hauwke

Discussions similaires

  1. DLL saute au LoadLibrary dans l'exécutable Delphi
    Par urusei dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 28/01/2008, 22h33
  2. LoadLibrary & FreeLibrary
    Par vonemya dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 24/07/2007, 17h52
  3. FreeLibrary erreur constante(DLL c++)
    Par Ninjagaiden24 dans le forum C++Builder
    Réponses: 14
    Dernier message: 16/04/2007, 18h22
  4. Réponses: 1
    Dernier message: 06/10/2006, 10h21
  5. LoadLibrary de libcurl.dll
    Par fidififouille dans le forum Windows
    Réponses: 3
    Dernier message: 02/11/2004, 11h30

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