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 :

Création et utilisation d'une DLL


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Points : 137
    Points
    137
    Par défaut Création et utilisation d'une DLL
    Bonjour,

    J'essaie de créer puis d'utiliser une DLL. Sur le Site j'ai trouvé un tutorial mais il ne marche pas chez moi. C'est un exemple simple qui consiste à implémenter une fonction faisant la somme de deux entiers.

    Creation de la DLL:

    A partir du menu je fais "Nouveau | Autre..." et je crée un nouveau projet de type "Expert DLL.

    Puis j'implemente le code suivant:

    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
    library DLL1;
     
    { Remarque importante concernant la gestion de mémoire de DLL : ShareMem doit
      être la première unité de la clause USES de votre bibliothèque ET de votre projet 
      (sélectionnez Projet-Voir source) si votre DLL exporte des procédures ou des
      fonctions qui passent des chaînes en tant que paramètres ou résultats de fonction.
      Cela s'applique à toutes les chaînes passées de et vers votre DLL --même celles
      qui sont imbriquées dans des enregistrements et classes. ShareMem est l'unité 
      d'interface pour le gestionnaire de mémoire partagée BORLNDMM.DLL, qui doit
      être déployé avec vos DLL. Pour éviter d'utiliser BORLNDMM.DLL, passez les
      informations de chaînes avec des paramètres PChar ou ShortString. }
     
    uses
      SysUtils,
      Classes;
     
    {$R *.res}
     
    function Somme(A, B: Integer): Integer; stdcall;
    begin
      Result := A + B;
    end;
     
    exports
      Somme; //Sans précision, le nom d'exportation sera "Somme" et l'index 1
     
    begin
    end.
    Premier truc bizard dans le menu quand je fais:
    Projet / Compiler DLL1
    ou
    Projet / Construire DLL1
    ou
    Projet / Vérifier la syntaxe de DLL1

    En apparance aucune reaction de delphi, il ne se passe rien mais DLL1.dll apparaît dans le répertoire. Je me dis que ca doit etre ok.??

    Utilisation de la DLL:
    Puis j'essaie d'utiliser la DLL.
    Je la copie donc dans un autre repertoire qui est celui d'un projet standard.
    Est que c'est bien ca qu'il faut faire ?

    Voici le code de ce projet:
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        Label1: TLabel;
        Button2: TButton;
        Label2: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
     
    const
      NomDLL = 'DLL1.dll';
     
      function Somme(A, B: Integer): Integer; stdcall; external NomDLL;
     
     
    implementation
     
    {$R *.dfm}
     
    //Importation en spécifiant le nom de la fonction
    //function Somme(A, B: Integer): Integer; stdcall; external NomDLL name 'Somme';
     
    //Importation en spécifiant son index
    function Somme(A, B: Integer): Integer; stdcall; external NomDLL index 1;
     
     
     
    procedure TForm1.Button1Click(Sender: TObject); //test sans DLL
    begin
    button1.Caption:=inttostr(strtoint(Edit1.Text)+strtoint(Edit2.Text));
     
    end;
     
     
     
    procedure TForm1.Button2Click(Sender: TObject); //test de la DLL
    begin
    button2.Caption:=inttostr(somme(strtoint(Edit1.Text), strtoint(Edit2.Text)));
    end;
     
    end.
    Que J'utilise l'Importation en spécifiant son index ou son nom, je me fais jeter par delphi. Voici ce qu'il me dit:

    [Erreur] Unit1.pas(45): Identificateur redéclaré : 'Somme'
    [Avertissement] Unit1.pas(45): Le symbole 'INDEX' est propre à une plate-forme
    [Erreur] Unit1.pas(59): Trop de paramètres originaux
    [Erreur fatale] Project1.dpr(5): Impossible de compiler l'unité utilisée 'Unit1.pas'


    Quelqu'un voit il ce qui cloche ?

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Tu définis une fois de trop ta procédure : tu la déclare dans la partie Interface mais aussi dans la partie Implementation. Supprime l'une des deux déclaration.

    Pour le 'trop de paramêtre' dans le button2click, tu as simplement oublié l'appel de la fonction somme !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Points : 137
    Points
    137
    Par défaut
    Effectivement en mettant en commentaire une des deux déclarations ca marche nickel. Encor Merci

  4. #4
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    pour la bonne méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    interface
     
    function [identifiant fonction]([parametres: type]): [type retour]; [convention d'appel];
     
    implementation
     
    function [identifiant fonction]; external 'nom DLL' name 'nom de fonction';
     
    end.

    exemple avec ta DLL :

    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
    unit N;
     
    interface
     
    fonction Somme(A, B: integer): integer; stdCall; 
    // english alias and clean declaration
    fonction Sum(aA, aB: LongInt): LongInt; stdCall;
     
    implementation
     
    const
      MyLib = 'ma.dll';
     
    fonction Somme; external MyLib name 'Somme';
    function Sum; external MyLib name 'Somme';
     
    end.
    note qu'on n'est pas obligé de se conformer 1:1 à la déclaration de la fonction dans la lib.
    cela permet, comme ici dans l'exemple, de faire des wrapper traduit dans la langue du développeur.
    exemple :
    Somme (fr)
    Sum (en)
    Summe (de)
    Somma (it)
    Suma (sp)

    pointant toutes sur Ma.Dll.Somme

    cela permet des creer des alias de noms pour les fonctions ce qui peut être utile parfois.

    note aussi que l'on peut changer les types tant qu'il sont compatibles.
    integer, longint, longword, cardinal, ou même single qui sont tout trois de taille 32bits.
    même ici avec A et B on pourrait juste déclarer un record (TPoint par exemple) ou un Int64!
    bref.

    j'espere que tu as compris.

Discussions similaires

  1. Réponses: 10
    Dernier message: 17/01/2011, 09h20
  2. création et utilisation d'une dll .net
    Par r83 dans le forum C#
    Réponses: 2
    Dernier message: 08/10/2008, 16h13
  3. Réponses: 8
    Dernier message: 20/06/2008, 09h00
  4. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19

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