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 :

Utilisation de FreeLibrary ?


Sujet :

API, COM et SDKs Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 040
    Points
    7 040
    Par défaut Utilisation de FreeLibrary ?
    Pour charger dynamiquement une DLL, j'utilise LoadLibrary (comme il se doit).

    Pour libérer, je pensais qu'il fallait utiliser FreeLibrary, mais j'obtiens des violations d'accès à la fermeture de l'application pour certaines de mes DLL.
    Et si je ne l'utilise pas, plus d'erreur. Mais, la DLL chargée en mémoire, est-elle déchargée ?

    Je précise qu'auparavant, j'utilisais ma DLL de manière statique, sans problème. Je suis passé à une méthode dynamique pour pouvoir spécifier le chemin où se trouve la DLL.

    Donc, pour l'instant je n'utilise plus FreeLibrary.
    Mais, est-ce propre ?

  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

    Pour ma part point de LoadLibrary sans FreeLibrary.
    Si tu charges dynamiquement ta DLL il faut prendre le soin de la libérer après utilisation.

    Donc pour répondre à ta question: Est-ce propre ?
    Ma réponse est non.

    Par contre je suis étonné que tu n'aies pas de problème avec un chargement statique. Qu'est-ce qu'elle fait cette DLL ?

    @+ Claudius

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 040
    Points
    7 040
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Pour ma part point de LoadLibrary sans FreeLibrary.
    Si tu charges dynamiquement ta DLL il faut prendre le soin de la libérer après utilisation.

    Donc pour répondre à ta question: Est-ce propre ?
    Ma réponse est non.
    Bon, c'est ce qu'il me semblait.

    Citation Envoyé par Cl@udius Voir le message
    Par contre je suis étonné que tu n'aies pas de problème avec un chargement statique. Qu'est-ce qu'elle fait cette DLL ?
    Elle ouvre une fenêtre (ou plusieurs même), et après quelques saisies, je fais quelques requêtes Oracle pour ranger tous ça.
    Ca fonctionne bien depuis pas mal de temps (en statique). Si aucun utilisateur ne s'est plein, c'est que ça doit être plutôt stable.

    Sinon, j'ai testé avec un point d'arrêt sur le FreeLibrary, et la grosse erreur survient après. Mais, je ne peux plus tracer. Ce n'est plus dans mon code.

    Pour faire avancer le problème, voici des bouts de code :
    - Déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
       _HandleDLL: THandle;
       InitDemandeExtDLL_: procedure(HandleApp: HWND; pSession: Pointer; const sInstance: PChar; const sSociete, sSite, sAtelier, sLibelleAtelier, sUtilisateur: PChar);   stdcall;  // external 'DemandeExt.dll' name 'InitDemandeExtDLL';
       AffDemandeExt_: function(nMode: LongInt; sNumDemande: PChar; sQuantite: PChar; pInfoDmd: Pointer = nil): LongBool;   stdcall;  // external 'DemandeExt.dll' name 'AffDemandeExt';
       GetDernierID_: function: ShortString;   stdcall;  // external 'DemandeExt.dll' name 'GetDernierID';
       GetPorteRetour_: function(const sCode: PChar): TPorte;   stdcall;  // external 'DemandeExt.dll' name 'GetPorteRetour';
    - Chargement de la DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure ChargerDLL;
    begin
       _HandleDLL := 0;
     
       //.Chargement de la DLL.
       _HandleDLL := LoadLibrary('C:\APP_HMY\DLL\DemandeExt.dll');
       if _HandleDLL = 0 then
          raise Exception.Create('.Erreur :  le chargement de la DLL [DemandeExt.dll] a échoué !');
    end;
    - Exemple d'appel d'une fonction de ma DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure InitDemandeExtDLL(HandleApp: HWND; pSession: Pointer; const szInstance: String; const szSociete, szSite, szAtelier, szLibelleAtelier, szUtilisateur: String);
    begin
       @InitDemandeExtDLL_ := GetProcAddress(_HandleDLL, 'InitDemandeExtDLL');
       if @InitDemandeExtDLL_ = nil then
          raise Exception.Create('.Erreur :  la procedure ''InitDemandeExtDLL'' de la DLL [DemandeExt.dll] est introuvable !' + #13#10 + SysErrorMessage(GetLastError))
       else
          InitDemandeExtDLL_(HandleApp, pSession, PChar(szInstance), PChar(szSociete), PChar(szSite), PChar(szAtelier), PChar(szLibelleAtelier), PChar(szUtilisateur));
    end;
    - Libération de la DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure LibererDLL;
    begin
       //.Libération de la DLL.
       if _HandleDLL <> 0 then
          FreeLibrary(_HandleDLL);
    end;

  4. #4
    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
    Re,

    Dans InitDemandeExtDLL_, je suppose que HandleApp est le handle de l'application hôte.

    Est-ce que tu attribues ce handle au handle de l'objet TApplication de la DLL ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Handle := HandleApp;
    Je demande ça car je prends toujours cette précaution lorsque la DLL possède des fenêtres, comme préconisé dans l'aide de Delphi d'ailleurs.

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 040
    Points
    7 040
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Dans InitDemandeExtDLL_, je suppose que HandleApp est le handle de l'application hôte.

    Est-ce que tu attribues ce handle au handle de l'objet TApplication de la DLL ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Handle := HandleApp;
    Oui, c'est ça.
    De même que le pSession pour utiliser la même session Oracle et éviter une deuxième connexion.

  6. #6
    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
    Bon
    Difficile comme ça de cerner le problème.

    Pb de connexion de connexion avec Oracle ? Fermeture intempestive de la session à la libération ? Appel tardif d'une fonction de la DLL depuis l'hôte ?

    Je ne suis pas d'une grande aide, désolé.

    @+ Claudius.

  7. #7
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 040
    Points
    7 040
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Pb de connexion de connexion avec Oracle ? Fermeture intempestive de la session à la libération ?
    Je ne pense pas. Il n'y a pas d'erreur Oracle, ni BDE.
    Et à la fermeture, je ne fais aucune requête.

    Citation Envoyé par Cl@udius Voir le message
    Appel tardif d'une fonction de la DLL depuis l'hôte ?
    Il est possible que l'application fasse appel à la DLL d'une façon ou d'une autre. C'est le plus probable.

    Mais, il n'y a pas d'appel à mes fonctions de la DLL qui soit incontrôlés. C'est-à-dire qu'il y a très peu d'appel, et que sur des actions précises d'utilisateur (type clic sur un bouton). Donc, en fermeture, je ne vois pas bien ...


Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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