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 :

OnFreeLibrary ça existe ou quelque chose du genre ?


Sujet :

Delphi

  1. #1
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut OnFreeLibrary ça existe ou quelque chose du genre ?
    Bonjour,

    Pour libérer une dll charger dynamique on fait appel à la méthode FreeLibrary. Mais y'a t'il une méthode standard qu'il est possible de coder dans une dll afin que cette dernière méthode s'exécute automatiquement avant la libération de la dll ?

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Dans ta DLL tu peux appeler ta méthode dans la section finalization.

  3. #3
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    J'ai écrit ça et ça ne marche pas

    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
    library MaDll;
     
    uses
      SysUtils,
      Classes,
      UCom in 'UCom.pas';
     
    {$R *.res}
     
    { Liste des fonctions exportées }
    exports
      MaMethode1
     
    initialization
     
    finalization
        MonOnFreeLibrary;
    end.
    Dur de trouver de l'aide la dessus sur le net... J'ai même un bouquin sur les genoux... :p

  4. #4
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    J'ai pu mettre un finalization uniquement dans ma Unit UCom, je vais voir si ça marche... ou pas :p

  5. #5
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    ça plante si j'utilise finalization :/

  6. #6
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 291
    Points : 1 942
    Points
    1 942
    Par défaut
    Tu fais un appel à CoUninitialize dans la partie finalization?

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 876
    Points : 11 365
    Points
    11 365
    Billets dans le blog
    6
    Par défaut
    il me semble qu'on peut détourner la procédure d'entrée de la dll et tester le paramètre motif, style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure DLLENtryProc(AReason: Word);
    case AReason of
      DLL_ATTACH : ...
      DLL_DETACH : ...
    end;
    une petite recherche te permettra sûrement de confirmer cette bribe de voie !

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    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 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Finalization, ne serait pas appelé une fois que le compteur de reférence tombe à zéro ? A Vérifier !
    DLLProc est appelé à chaque chargement\déchargement !

    Sinon, ton Finalization fait quoi ?
    Libération d'objet ? as-tu mis ces objets à nil au préalable pour que le Free (Assigned) ne plante pas ?

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 436
    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 436
    Points : 5 851
    Points
    5 851
    Par défaut
    salut

    si c'est une dll regarde le code de "tourlourou", il ta donnée la bonne voie a suivre

    @+ Phil

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    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 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Finalization, ne serait pas appelé une fois que le compteur de reférence tombe à zéro ? A Vérifier !
    Bon, si l'on fait deux LoadLibrary dans un même programme sur la même DLL, il faut deux FreeLibrary pour lancer la finalization ...

    Je viens d'en avoir besoin, pour une API à fournir à un partenaire ... declencher, avec DLLProc, cela fonctionnait mieux ?

    A mon avis, c'est ce que contient ta clause de finalization qui doit être sujer à erreur ...

  11. #11
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    Bonsoir,

    Après pas mal de test, j'ai retiré la clause finalization. J'avais trouvé une source expliquant la même chose que tourlourou, mais cette méthode a une limite qui se trouve au niveau de chargement multiple d'une dll dans une même application.

    La seule bonne conclusion que j'ai trouvé, c'est de faire une méthode à appeler systématiquement avant chaque FreeLibrary.

    Dailleurs il me semble qu'il n'y avait pas d'erreur dans la partie finalization puisque la méthode qui s'y trouvait est exactement la même que celle qui est aujourd'hu appelé avant chaque FreeLibrary...

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    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 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Citation Envoyé par declencher Voir le message
    mais cette méthode a une limite qui se trouve au niveau de chargement multiple d'une dll dans une même application.
    C'est ce que je disais par "DLLProc est appelé à chaque chargement\déchargement" donc qu'il faillait géré le compteur de reférence comme le fait la finalization ...

    Citation Envoyé par declencher Voir le message
    La seule bonne conclusion que j'ai trouvé, c'est de faire une méthode à appeler systématiquement avant chaque FreeLibrary.
    Une sorte de CloseHandle, moi aussi, j'ai ce type de fonction, mais c'est pour le cas où la DLL est chargé en permanence, ... dans le Finalization, j'appele une fonction de nettoyage de tout ce qui a été alloué (pointeur, fichier temp, SQL ...)

    Le Code peut-être bon, c'est peut-être l'enchainement des Finalization (des tes propres unités, de tes lib, ou même celle de delphi), qui fait que tes appels provoquent une violation d'accès ou autre ...

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

Discussions similaires

  1. [AC-2007] Faire passer un paramètre ou quelque chose du genre
    Par rogerfon dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/12/2012, 22h46
  2. Réponses: 8
    Dernier message: 05/07/2012, 23h01
  3. Réponses: 1
    Dernier message: 22/04/2008, 10h20
  4. existe t'il quelque chose pour parser du rtf?
    Par ukanoldai dans le forum Forms
    Réponses: 5
    Dernier message: 09/03/2007, 16h07
  5. [Info] plugin corba ou quelque chose du genre
    Par Cricket dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 07/03/2006, 20h30

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