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

Lazarus Pascal Discussion :

DLL utilisant la LCL [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut DLL utilisant la LCL
    Bonjour,

    J'ai enormément de difficultés à créer une DLL utilisant la LCL.
    Impossible de compiler...
    Je pense qu'il faut modifier les paramètres de mon projet de façon à ce qu'il intègre les packages de la LCL mais je ne sais pas du tout comment faire.

    Quelqu'un a t'il réussi à compiler une DLL utilisant la LCL ?

    Je mets en pièce jointe un projet basique mettant en évidence mon problème.

    Merci pour votre aide.

    Ver FPC : 2.2.4
    Lazarus : 0.9.28.2 Beta
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je n'ai pas consulté votre code. Si cela peut vous être utile, voilà comment je faisais :

    Exemple dll
    Nouveau projet --> Librairie
    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
    library libtest;
     
    {$mode objfpc}{$H+}
     
    uses
      Classes
      { you can add units after this },
      SysUtils;
     
    function RenvoiChaine(pChaine: pChar): Pchar; cdecl;
    var
       str:  String;
    begin
      str := pChaine;
      str := str + ' (chaine renvoyée par la bibli)';
      result := pChar(str);
    end;
     
    function RenvoiSomme(int1,int2 : integer): integer; cdecl;  
    begin
      result := int1+int2;
    end;
     
    exports
      RenvoiChaine, RenvoiSomme;
     
    {$IFDEF WINDOWS}{$R libtest.rc}{$ENDIF}
     
    begin
    end.
    Puis Exécuter -->Construire

    Exemple d'utilisation dans un autre programme Lazarus
    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
    
    uses
      ....,dynlibs;
    
    type
      { Librairies dynamiques }
       TlzSomme = function(n1,n2:integer): Integer; cdecl;
       TlzChaine  = function(p1:pChar): PChar; cdecl;
    
      { TForm1 }
      TForm1 = class(TForm) ....
    
    
    var
       Form1: TForm1;
       hLib: THandle;
       lzSomme : TlzSomme;
       lzChaine  : TlzChaine;
       bLibOK : boolean;  // Appel correct de la librairie ?
    
    
    procedure TForm1.FormCreate(Sender: TObject);
    {Chargement de la librairie et de ses fonctions}
    var
      bDynOK : boolean; //Chargement correct de la fonction en cours ?
    begin
      bLibOK:= true;
      bDynOK:= true;
      hLib := dynlibs.LoadLibrary('libtest.dll');
      if (hLib <> 0) then begin
       // Chargement des procedures
       lzSomme := TlzSomme(GetProcAddress(hLib, 'RenvoiSomme'));
       if pChar(@lzSomme) = '' then
         bDynOK:= false
       else begin
         lzChaine  := TlzChaine(GetProcAddress(hLib, 'RenvoiChaine'));
         if pChar(@lzChaine) = '' then bDynOK:=false;
       end;
    
       //Conclusion
       if (bDynOK=false) then bLibOK:=false;
      end else bLibOK:=false;
      //CR
      if (bLibOK=false) then Showmessage('Utilisation de la libraririe impossible.');
    end;
    
    procedure TForm1.FormDestroy(Sender: TObject);
    {Déchargement de la librairie et de ses fonctions}
    begin
      if (bLibOK=true) then
       {$IFDEF WIN32}
        dynlibs.UnLoadLibrary(NilHandle);
       {$ELSE}
        dynlibs.UnLoadLibrary(hLib);
       {$ENDIF} ;
    end;         
    
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    begin
      if (bLibOK=true) then begin
        showmessage(IntToStr(lzSomme(8,2)));
        ShowMessage(lzChaine(pChar('Coucou')));
      end;
    end;
    Remarques
    • Le procédé fonctionne sous Win et Nux. [Pas testé sous Mac]


    • Sous Nux, évidemment la bibli n'a pas pour extension .dll. Je crois qu'il faut préciser l'extension .so qq part pour l'obtenir (sinon par défaut pas d'extension) lors de la construction. Sous Nux toujours, il faut indiquer le chemin absolu lors de l'appel de la librairie par le programme principal ou alors placer cette dernière en respectant les conventions (de placement de ces fichiers sous linux).

    • Dans tous les OS, les Strings ne peuvent être échangées sans passer par des pChars.

    • Enfin pour être aussi exhaustif que possible - il faudrait regarder dans le forum - nous avons rencontré un problème lorsque nous avons utilisé une 0.9.28.2 (à la place de la 0.9.26.2 où nous n'avions pas ce problème) : Plantage lors de l'usage intensif d'une fonction externe. Je ne me souviens plus de ce que nous avons corrigé... mais la procédure de correction a été trouvée par tâtonnements et finalement le hasard nous a été favorable... Peut-être le code ci-dessus est-il le code corrigé.


    Code vérifié sous Lazarus 0.9.28.3 XP


    Cordialement. Gilles
    Dernière modification par Alcatîz ; 10/05/2010 à 21h19. Motif: balise non fermée ;-)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut Essayez et tenez moi au courant svp
    Merci Gilles d'avoir pris le temps de mettre en ligne une réponse travaillée.

    Je suis d'accord avec tout ce que tu as écrit. Tout est correct mais ne réponds pas à mon problème initial.
    Peut-être n'ai-je pas su présenter correctement mon problème, alors je vais ajouter quelques précisions :

    Je souhaite créer une Librairie (.dll sou Windows / .so sous Linux) utilisant la LCL.
    Par exemple, une fonction exportée de ma Librairie devra ouvrir une Fenêtre (TForm), une autre faire un Showmessage.
    TForm et showmessage sont des éléments qui sont présents dans la LCL mais ils sont complètement inaccessibles lors de la compilation d'une Librairie.

    Pour te rendre compte trés rapidement du problème, prends une librairie que tu as crée (et qui fonctionne) et ajoute un showmessage dans n'importe quelle fonction (Avec le uses Dialogs qui va bien ).

    Tu verras que le fichier dialogs.pas référencée par ton uses n'est pas celui de la LCL, mais un autre ne contenant pas de showmessage... d'où mon problème... surprenant non ?
    Essayez et tenez moi au courant svp, parceque c'est tellement gros que j'ai l'impression d'être passé à coté d'un truc énorme...

    Perso, je pense que Lazarus a pris certains choix quant aux packages accessibles lors de la création d'un projet "Library" et j'aimerai savoir comment lui faire comprendre que je souhaite integrer la LCL à mon projet de librairie.

    David

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut C'est la looze !
    La réponse à mon problème est ici :

    http://bugs.freepascal.org/view.php?id=1866

    Je suis découragé ... Je lache l'affaire et retourne à DELPHI.

    Bon courage à tous.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    J'aurais dû prendre le temps de visiter le fichier joint... Je n'ai pas essayé votre procédure quoiqu'en y réfléchissant bien, il me semble qu'en 0.9.24 cela passait... mais je ne vais pas aller recherche l'ancêtre pour vérifier.

    J'ai récemment déclaré "Résolu" un problème équivalent (Appel de dll en c++) de manière identique. C'est bien dommage.

    Des bugs sur Lazarus, il y en a... et celui-là semble dater (comme beaucoup d'autres)... Il existe souvent des procédures de contournement qui entrainent de fâcheux contre-temps, il est vrai. Il est vrai aussi, que contrairement à Delphi, ce n'est pas un langage "carré". Si le positionnement est purement Windows, à mon avis, Lazarus a peu d'intérêt... même en formation (voir un problème de Date soulevé, il y a quelque temps, sur ce forum).

    L'approche du problème et sa conclusion : http://bugs.freepascal.org/view.php?id=7182... méritent
    • un commentaire : j'en arrive à la conclusion que Lazarus est un langage "insuffisant" par ses propres objets et malheureusement fermé (sauf assembleur et mode DOS [lib C]) : le problème ne risque pas de pouvoir, à priori, être réglé par l'appel à des librairies C++ (avec objets, classes...), voir discussion récente ! C'est très loin des performances des langages actuels "de pointe", au point que je m'y sens vraiment trop à "l'étroit" et même brimé dans mes développements.

    • et une conclusion : bref, rien ne sert de ruminer... Bon courage aux Lazarusien(nes) dont je ne suis plus désormais.


    Cordialement. Gilles
    Dernière modification par Invité ; 10/05/2010 à 12h14.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Un peu tard certainement, mais j'ai la moitié de la solution... J'arrive à compiler votre DLL un peu modifiée... mais je n'arrive pas à l'appeler. Le Loadlibrary fonctionne, mais si j'introduis une fonction Showmessage(), j'ai un plantage. Dans la même DLL, la même fonction sans Showmessage est correctement appelée. Mais là, cela vient peut-être certainement de ma méthode d'appel. Si vous êtes (encore) intéressé, faites -moi signe. Visiblement votre codage est très différent du mien.

    Cordialement. Gilles

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

Discussions similaires

  1. [WINDEV10][DLL]Utiliser les icônes inclues
    Par kuranes dans le forum WinDev
    Réponses: 3
    Dernier message: 15/12/2006, 15h32
  2. Réponses: 9
    Dernier message: 06/04/2006, 18h40
  3. dll utilisable avec VBAccess 97
    Par Mü dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 10/02/2005, 15h45
  4. [DLL] utiliser une DLL a partir d' une DLL et un .def
    Par venomelektro dans le forum MFC
    Réponses: 9
    Dernier message: 07/12/2004, 14h01
  5. [DLL] Utilisation d'une DLL pour utiliser serveur Firebird
    Par sekiryou dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/08/2004, 14h20

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