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 :

Chargement d'une DLL et application qui ne se ferme plus


Sujet :

Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Points : 109
    Points
    109
    Par défaut Chargement d'une DLL et application qui ne se ferme plus
    Bonjour, j'ai une application dans la quelle je charge une dll de manière statique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function Code(S:string):string;stdcall;external 'EncryptLib.dll';
    function Decode(S:string):string;stdcall;external 'EncryptLib.dll';
    procedure SetKeyCode(S:String);stdcall;external 'EncryptLib.dll';
    Si je lance l'application sans faire appel a ses funtion ou procédure, l'application se ferme sans problème.
    La ou ca se complique, c'est que si par exemple je crée un nouveau bouton et sur l'évènement OnClik j'exécute la procédure SetKeyCode et que je lance l'application SANS activer l'évènement click, l'application ne se ferme pas complètement, et ce même dans l'IDE Delphi 2006

    Existe t'il une fonction pour libérer la DLL de la mémoire ou la détacher de l'application?
    Ou bien ai je mal codé ma DLL?

  2. #2
    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 davels
    Ou bien ai je mal codé ma DLL?
    Ben montre nous le code qu'on puisse vérifier

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Points : 109
    Points
    109
    Par défaut
    Voilà le code de ma DLL. C'est la première fois que je l'utilise.

    Au début, je voulais utiliser une classe dans ma DLL mais j'ai vite abandonné vu la complexité

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    library EncryptLib;
     
    uses
      SysUtils,
      ShareMem,
      Classes;
     
    var
      KeyCode : String;
     
     
    function Trans(Ch1,Ch2: Char;Sens:smallint): Char;
    const Alphanum='-_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    var a,b,r, l:integer;
    begin
      l:=Length(Alphanum);
      a:=Pos(Ch1,Alphanum)-1;
      b:=Pos(Ch2,Alphanum)-1;
      r:=(a+b*sens);
      if r<0 then r:=l+r;
      if r>l then r:=r-l;
      Result := Alphanum[r+1];
    end;
     
    function Code(S:string):string;stdcall;export;
    var I,J: Integer;
        S2:string;
    begin
      S2:='';
      if (KeyCode<>'') and (S<>'') then
      begin
        J := 1;
        for I:=1 to Length(s) do
        begin
          S2:=S2+Trans(S[i],KeyCode[J],-1);
          J:=(J mod Length(KeyCode)) + 1;
        end;
      end;
      Result:=S2;
    end;
     
    function Decode(S:string):string;stdcall;export;
    var I,J: integer;
        S2:string;
    begin
      S2:='';
      if (KeyCode<>'') and (S<>'') then
      begin
        J := 1;
        for I:=1 to length(S) do
        begin
          S2:=S2+Trans(S[i],KeyCode[J],1);
          J:=(J mod Length(KeyCode)) + 1;
        end;
      end;
      Result:=S2;
    end;
     
    procedure SetKeyCode(S:String);stdcall; export;
    begin
      KeyCode := S;
    end;
     
    exports SetKeyCode,Code,Decode;
     
    {$R *.res}
     
    begin
    end.

  4. #4
    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
    Alors 2 choses que je vois:
    • Le Export à la fin de chaque déclaration est inutile.
    • Les types stringssont difficiles à utiliser dans les échanges appli/DLL. Tu as 3 solutions:
    La première: Utiliser des SHortString (255 caractères) ou bien des PChar
    la seconde: utiliser l'unité ShareMem qui t'oblige à fournir une DLL (Borldmm.DLL ou quelque chose comme ça) avec ton appli.
    La dernière: utiliser FastShareMem qui est pour certains, la solution miracle. Elle l'était pour moi jusuq'à ce qu'elle me fasse complètement n'importe quoi sur mon appli en cours de dev... à un tel poitn que je suis repassé au ShortString...

    Bon courage

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Points : 109
    Points
    109
    Par défaut
    Merci, je ne savais pas que le shortstring permettait d'éviter de charger la DLL de Borland et d'utiliser ShareMem.

    J'essaye de suite

    Edit : ca fonctionne d'enfer, j'ai utilisé des shortstring et retiré export à la fin de chaque fonction.

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

Discussions similaires

  1. [2.0] Get sur une variable d'application qui bug ??
    Par brousaille dans le forum ASP.NET
    Réponses: 8
    Dernier message: 14/03/2006, 05h08
  2. Chargement d'une DLL
    Par olive_le_malin dans le forum MFC
    Réponses: 15
    Dernier message: 16/12/2005, 17h09
  3. Réponses: 4
    Dernier message: 03/11/2005, 13h57
  4. Contexte de chargement d'une DLL
    Par Guillemot dans le forum Windows
    Réponses: 2
    Dernier message: 10/07/2005, 09h34
  5. Chargement d'une DLL et utilisation du multithread
    Par Maitre Kanter dans le forum Langage
    Réponses: 6
    Dernier message: 07/09/2004, 23h18

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