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 :

Fermeture DLL


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut Fermeture DLL
    Bonjour,

    Je programme avec Delphi 2006 sous WinXP.

    J'ai créé une dll qui est utilisé par mon logiciel. Dans la dll, je crée un composant et j'essaie de le détruire avec :

    Ensuite je l'appel dans mon logiciel de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Function Recherche(R : String): String; external 'DLL_345';
    Tout fonctionne correctement lors de l'exécution du logiciel. Le problème survient lorsque je ferme l'application. La form disparait mais l'application continue toujours à tourner.

    J'ai essayé différentes approches, mais j'arrive pas à faire en sorte que lorsqu'on ferme l'application, elle s'arrête complètement ...

    Si vous avez une idée, elle est la bien venue

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Evite de passer des string, passe plutôt des PChar

  3. #3
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci pour ta réponse MD Software.

    Premièrement, j'ai réussi à faire en sorte que le logiciel se ferme totalement, lorsque je le lui demande. Mais j'aimerais avoir votre avis sur la procédure ... est-ce qu'il y a de mieux ? Procédure que j'ai rajouté en plus du reste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
      h : THandle;
     
    begin
      h := loadLibrary('DLL_345.dll');
      FreeLibrary(h);
    end;
    Deuxièmement, pour le type d'informations transmises entre la dll et le programme, à savoir le String. J'ai bien essayé de changer le format, mais le compilateur me lance un message d'erreur :

    W1035 Return value of function 'Recherche' might be undefined
    De plus, dans le logiciel comment puis je transformer le PChar en un string ?

    D'avance merci pour vos réponses.

  4. #4
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Salut,

    En définitif, je vais prendre l'exemple de la FAQ http://delphi.developpez.com/faq/?pa...pelfonctiondll. Cependant, le problème c'est qu'à chaque fois que je devrai appuyer sur un boutton pour appeler une fonction de la DLL, il faudra à nouveau recharger et revider ...

    N'y a t'il pas moyen de le faire une fois pour toute pour le logiciel et libérer l'ensemble lorsqu'on ferme le sof ?

    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
    procedure TForm1.Button4Click(Sender: TObject);
    var
      HandleDLL: THandle;
      Recherche : Function (R : String): String;
     
    begin
      Recherche := nil;
      HandleDLL := LoadLibrary(pAnsiChar('DLL_345.dll'));
     
      If HandleDLL = 0 then Exit;
     
      Recherche := GetProcAddress(HandleDLL, pAnsiChar('Recherche'));
     
      If Assigned(Recherche) then
        begin
          ShowMessage (Recherche(Edit1.Text));
        end;
     
      FreeLibrary(HandleDLL);
    end;
    D'avance merci pour vos réponses.

  5. #5
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Citation Envoyé par xenos
    N'y a t'il pas moyen de le faire une fois pour toute pour le logiciel et libérer l'ensemble lorsqu'on ferme le soft ?
    Et bien en déclarant la fonction comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function Recherche(R : String): String; external 'DLL_345.dll';
    Ensuite, pour le coup du type string en paramètre, ce n'est pas un soucis, il suffit de faire le uses dans la dll ET dans le programme de l'unité FastShareMem

  6. #6
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Citation Envoyé par neilbgr
    Et bien en déclarant la fonction comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function Recherche(R : String): String; external 'DLL_345.dll';
    Le problème c'est que c'est comme ça que je le faisais tout au début, mais j'ai essayé de trouver un autre système, vu que je n'arrivais pas à libérer la DLL.

    En utilisant donc ce système, comment dois je faire pour libérer la dll ? Car en utilisant FreeLibrary, malgré ce que j'ai écris plus haut, ça ne permet pas de libérer la dll et donc, le soft continue à tourner quand on le ferme.

    Citation Envoyé par neilbgr
    Ensuite, pour le coup du type string en paramètre, ce n'est pas un soucis, il suffit de faire le uses dans la dll ET dans le programme de l'unité FastShareMem
    Actuellement j'utilise ShareMem, qu'elle est la différence avec FastShareMem ?

  7. #7
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    FastShareMem Pas besoin de trainer la DLL de Borland, et "plus" rapide, comme son nom l'indique.

    Ensuite, pour la déclaration de la fonction, bien lire l'aide Delphi. Accessoirement faire attention à la convention d'appel utilisé (stdcall, ou autre... en tous cas, bien mettre la meme chose des deux cotés !)

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Quelques points à vérifier :

    - Comme on te l'as dit, éviter de passer par des strings. Il vaut mieux passer par une procédure qui utilise deux PChar: un pour l'"aller" et l'autre pour le "retour", avec une variable entière qui indique combien de caractères au maximum peut contenir la valeur de retour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure Recherche(AString: PChar; ARetVal: PChar; ARetValMaxLen: Integer);
    begin
      //Travailler avec AString
      //puis renvoyer la valeur de retour.
      StrPLCopy(ARetVal, UnString, ARetValMaxLen);
    end;
    ...et côté application cliente ça donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var
      LResult: array [0..255] of char;
    begin
      Recherche("texte", LResult, SizeOf(LResult));
    - Charger la DLL statiquement est bien mieux.
    - Vérifie les conventions de passage comme on te l'as suggéré.

    Bonne chance !

  9. #9
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci à MD Software, neilbgr, reisubar.

    Grâce à vos conseilles, il n'y a plus de messages d'erreur et tout fonctionne en PChar et non plus en String.

    Cependant, pour une meilleure compréhension du PChar, j'aurais encore deux questions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var
    LResult: array [0..XXX] of char;
    Je peux aller jusqu'à combien de caractère maximum ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Recherche(PChar(''+Edit1.Text+''), LResult, SizeOf(LResult));
      Memo1.Lines.Text := LResult;
    J'ai essayé de mettre directement Memo1 dans la première ligne ... mais j'ai eu beau cherché, je n'y suis pas arrivé. Y a t'il moyen de directement mettre memo1 dans la Procedure Recherche pour ne pas devoir passer par LResult ?

Discussions similaires

  1. Comment détecter la fermeture d'une DLL ?
    Par B-Technix dans le forum Langage
    Réponses: 8
    Dernier message: 21/10/2008, 10h33
  2. Plantage sur fermeture avec dll CLI
    Par greenzephyr dans le forum C#
    Réponses: 9
    Dernier message: 31/07/2007, 16h49
  3. [VB6] [MDI] Signaler la fermeture d'une fille à la mère
    Par cpri1shoot dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/04/2004, 08h57
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  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