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 :

[DLL]-Appel Dynammique


Sujet :

Langage Delphi

  1. #1
    Teo
    Teo est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 110
    Points : 111
    Points
    111
    Par défaut [DLL]-Appel Dynammique
    Bonjour

    J'attaque un fichier DLL en dynamique

    C'est le meme fichier avec differentes fonction.

    Quand l'appli s'arrete, j'appelle FreeLibrary(Hdl);

    J'ai remarqué
    que quand j'appelle une seule fois une fonction
    de la dll, le freelibrairie dure presque 40 secondes.

    Quand l'appli a fait appelle a plusieurs fonction,
    le freelibrairy est quasi immediat.

    Merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    Points : 190
    Points
    190
    Par défaut
    C'est quand tu appelles une fonction en particulier ? ou bin cela est-il valable quelque soit la fonction appelée ?

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    + quel est le genre de fonctions présentes dans ta dll ?

  4. #4
    Teo
    Teo est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 110
    Points : 111
    Points
    111
    Par défaut
    En fait ma DLL est une fiche qui contient un TWebBrowser

    J'au une unité qui a pour fonction principale de referencer toutes les
    dll que je creerai, et toutes mes appli devront l'appeler,
    et c'est elle (la unit) qui appellera les fonctions dans les dll.

    Actuellement elle (la unit) contient juste fonctions pour appeler
    mon fichier "Dll_TWebBrowser.Dll"

    Mon fichier Unit
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
    Interface
     
    Function Dll_Navigateur_Web_Simple(Titre_,Url_:PChar;Modal:Boolean;Var Err_Ch:PChar):Boolean;
     
    Implementation
     
    Var Dll_List_Hdl:TStringList;
     
     
    Procedure Dll_List_Hdl_Ajouter(FicDll,FctDll:String;Hdl:THandle);
    Begin
      If TObject_EstNil(Dll_List_Hdl)
      Then Begin
        Dll_List_Hdl := TSTringList.Create;
      End;
      If Pos('*'+IntToStr(Hdl)+'*',Dll_List_Hdl.Text) > 0 Then Exit;
      Dll_List_Hdl.Add(FicDll+'*'+FctDll+'*'+IntToStr(Hdl)+'*');
    End;
     
    Function Dll_List_Hdl_Donner_Info_Num(Num:Integer;Var FicDll,FctDll:String;Var Hdl:THandle):Boolean;
    Var
      Ch,S,C,C1,C2,C3:String;
      I:Integer;
    Begin
      Result := False;C1 := '';C2 := '';C3 := '';
      Ch := DonnerElmNumDeTStrings(Num-1,Dll_List_Hdl);
      C := Ch;
      While C > '' Do
      Begin
        I := Pos('*',C);
        If I > 1
        Then Begin
          S := CopierChDebFin(C,1,I-1);
          Delete(C,1,I);
        End
        Else Begin
          S := C;
          C := '';
        End;
        If C1 = ''
        Then C1 := S
        Else
        If C2 = ''
        Then C2 := S
        Else
        If C3 = ''
        Then C3 := S
        Else Exit;
      End;
      FicDll := C1;
      FctDll := C2;
      Hdl := StrToInt(C3);
      Result := (FicDll > '') And (FctDll > '') And (Hdl > 0);
    End;
     
    Function Dll_List_Executer(FicDll,FctDll:String;{Idx_Fct:Integer=-1;}Var Hdl:THandle):Pointer;
    Begin
      Result := Nil;ChMsgExcept := '';
      //Chargement de la DLL. On récupère son handle
      Hdl := LoadLibrary(pAnsiChar(FicDll));
      //Si le chargement a échoué, on sort
      If Hdl = 0
      Then Begin
        ChMsgExcept := 'LoadLibrary retourne zero pour '+QuotedStr(FicDll);
        Exit;
      End;
      //On récupère l'adresse de la fonction voulue, que l'on renvoie
      {If IndexFct < 0
      then //Si l'index est négatif on utilise le nom sous forme de chaîne
        Result := GetProcAddress(HandleDLL, pAnsiChar(NomFct))
      else
        //Sinon, on utilise l'index comme identifiant
        Result := GetProcAddress(HandleDLL, pAnsiChar(IndexFct));
      }
      Result := GetProcAddress(Hdl,pAnsiChar(FctDll));
      If (Result = Nil) Or (Not Assigned(Result))
      Then Begin
        ChMsgExcept := 'Echec chargement fonction '+QuotedStr(FctDll)+#13+'GetProcAddress à retourné zero';
        Exit;
      End;
      Dll_List_Hdl_Ajouter(FicDll,FctDll,Hdl);
    End;
     
    Procedure Dll_List_Hdl_Detruire;
    Var
      Ch,FicDll,FctDll:String;
      Hdl:THandle;
      I:Integer;
      Pt:TPoint;
      Proc:Pointer;
    Begin
      Pt := Point(0,0);
      Try
        If TObject_EstPasNil(Dll_List_Hdl)
        Then Begin
          Pt.Y := Dll_List_Hdl.Count;
          While Dll_List_Hdl.Count > 0 Do
          Begin
            Inc(Pt.X);Proc := Nil;
            If Pt.X > Pt.Y Then Break;
            If Dll_List_Hdl_Donner_Info_Num(1,FicDll,FctDll,Hdl)
            Then Begin
              Try            
                If Hdl <> 0
                Then FreeLibrary(Hdl);
              Except
                DonnerChMsgExcept;
              End;
            End;
            Try
              Dll_List_Hdl.Delete(0);
            Except
              I := -1;
              DonnerChMsgExcept;
            End;
          End;//While Dll_List_Hdl.Count > 0 Do
        End;
      Finally
        DetruireCeTObject(Dll_List_Hdl);
      End;
    End;
     
    Function Dll_Navigateur_Web_Simple(Titre_,Url_:PChar;Modal:Boolean;Var Err_Ch:PChar):Boolean;
    Const
      FicDll = 'Dll_TWebBrowser.Dll';
      FctDll = 'Dll_Navigateur_Web_Simple';
    Var
      Dll_Fct:Function(Titre_,Url_:PChar;Modal:Boolean;Var Err_Ch:PChar):Boolean;StdCall;
      Hdl:THandle;
    Begin
      Result := False;
      Dll_Fct := Dll_List_Executer(FicDll,FctDll,Hdl);
      If Not Assigned(Dll_Fct)
      Then Begin
        Exit;
      End;
      Result := Dll_Fct(Titre_,Url_,Modal,Err_Ch);
    End;
     
    Initialization
      Dll_List_Hdl := Nil;
      If UDGn1PasInit Then InitUDGn1;
    Finalization
      Dll_List_Hdl_Detruire;
     
    End.
    Coté appli
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TFichePrcp.BtOuvrirClick(Sender: TObject);
    Var
      AZT:PChar;
      Ch,C:String;
    begin
      //Appelle du navigateur
      Dll_Navigateur_Web_Simple('',PChar(EdtUrl.Text),ChkBoxModal.Checked,AZT);
      Ch := AZT;C := ChMsgExcept;
      If Ch > '' Then Information(Ch);
      If C > '' Then Information(C);
    end;
    Si je clique plus d'une fois sur BtOuvrir
    la liberation se fait sans probleme quand on ferme l'appli.
    Si je clique qu'une seule fois ==> a la fin de l'appli, la fiche principale
    disparait, mais l'appli reste dans la barre des taches pendant
    pres de 40 secondes(des fois plus).
    Ce probleme existe meme quand je place Dll_List_Hdl_Detruire;
    dans le "Finalization" de l'appli, ou dans le FormeDestroy de l'appli.

  5. #5
    Teo
    Teo est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 110
    Points : 111
    Points
    111
    Par défaut
    UP -

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    TObject_EstNil ?? what's ?
    d'habitude c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if obj <> nil then ...
    sinon il serai possible que ton application crash à la fin de son exécution :
    soit c'est ça, soit je sais pas, donc en supposant que je vise juste, éssai l'exécution pas à pas approfondie ( et en passant vérifie le status de Dll_List_Hdl à chaque point pour voir si tu n'éssai pas d'accéder à un objet détruit ou inexistant )

  7. #7
    Teo
    Teo est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 110
    Points : 111
    Points
    111
    Par défaut
    La TStringList, est bien gérée, je viens de refevirier.

    Pour contourner le probl j'appelle LoadLibrary une seconde fois
    si ma liste est vide, ainsi je simule 2 appelles.
    Il semble ne plus y avoir cette attente de pres d'une minute a la fin du prog

    Voici le code resultant
    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
     
    Function Dll_List_Executer(FicDll,FctDll:String;{Idx_Fct:Integer=-1;}Var Hdl:THandle):Pointer;
    Var
      Prm:Boolean;//*****Nouv
      Hdl_Bidon:THandle;//*****Nouv
    Begin
      Result := Nil;ChMsgExcept := '';
      //Chargement de la DLL. On récupère son handle
      Hdl := LoadLibrary(pAnsiChar(FicDll));
      //Si le chargement a échoué, on sort
      If Hdl = 0
      Then Begin
        ChMsgExcept := 'LoadLibrary retourne zero pour '+QuotedStr(FicDll);
        Exit;
      End;
      Prm := Dll_List_Hdl = Nil;//*****Nouv
      Dll_List_Hdl_Ajouter(FicDll,FctDll,Hdl);
     
      Result := GetProcAddress(Hdl,pAnsiChar(FctDll));
     
      If Prm//*****Nouv************
      Then Begin
        //Dll_List_Executer(FicDll,FctDll,Hdl_Bidon);
        Hdl_Bidon := LoadLibrary(pAnsiChar(FicDll));
      End;
     
      If (Result = Nil) Or (Not Assigned(Result))
      Then Begin
        ChMsgExcept := 'Echec chargement fonction '+QuotedStr(FctDll)+#13+'GetProcAddress à retourné zero';
        Exit;
      End;
    End;
    J'espere que faire 2 loadLibrary de suite(si Premiere fois) ne va pas dans certains cas, tout faire foirer.

    Faute de mieu je teste cette config en attendant...

    TObject_EstNil c'est une fonction a moi, qui fait
    Result := (Not Assigned(Obj)) Or (Obj = Nil) ;
    Sous Delphi2 "FreeAndNil" n'existe pas, des fois le ".Free" detruis
    l'objet, mais n'affecte pas systematiquement (voir jamais)
    NIL dans l'objet.
    Alors j'avait créé cette function.
    mais comme je l'utilise depuis toujours(ou presq) je la garde(pour le moment).
    De plus j'ai creer (merci copier/coller) mon propre FreeAndNil,que j'utilise
    tout le temps, donc effectivement je devrais pourvoir faire confiance
    au If Obj=Nil, mais comme j'ai de vielles routines
    que j'ai pas remises au gout du jour...

  8. #8
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 17
    Points : 21
    Points
    21
    Par défaut
    Salut à tous,

    Teo n'as tu pas été confronté à un problème avec les touches de tabulation et la touche "return" avec ton twebbrowser dans une dll ?
    J'essai de voir si d'autres que moi ont eu le problème et auraient trouvé une solution...

    Merci d'avance, que la réponse soit oui ou non.

    Marianne

  9. #9
    Teo
    Teo est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 110
    Points : 111
    Points
    111
    Par défaut
    Slt

    J'ai pas le probleme dont tu parles.
    Verifie tes ModalResult des tes boutons(je suppose que c'est fait).
    Tu peux aussi utiliser des TBitBTn je crois qu'ils réagissent pas
    aux focus du genre "tabulaires"

    @+

Discussions similaires

  1. Interop .NET DLL appelée en C
    Par MatteX dans le forum C#
    Réponses: 2
    Dernier message: 29/03/2007, 21h54
  2. creation d'une dll appelant une autre librairie
    Par nezdeboeuf62 dans le forum Windows
    Réponses: 5
    Dernier message: 23/03/2007, 10h22
  3. Réponses: 4
    Dernier message: 20/03/2007, 14h53
  4. TForm dans une dll appelée dynamiquement
    Par declencher dans le forum Delphi
    Réponses: 2
    Dernier message: 22/12/2006, 11h21
  5. [DLL] Appel d'une frame depuis une DLL
    Par Rayek dans le forum Langage
    Réponses: 6
    Dernier message: 16/12/2005, 16h32

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