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 :

Callback function avec une DLL


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Par défaut Callback function avec une DLL
    Bonjour,

    J'essaye de faire un callback avec une dll, j'ai trouver un exemple sur google et je n'arrive pas a compiler la partie client

    Quelqu'un pourrait m'eclairer?


    http://www.delphi3000.com/articles/article_2362.asp?SK=

    Type incompatibles: 'procédure normale et pointeur de méthode'

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
     
    type
      TCallBackFunction = function(sig: integer):boolean;
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        function callME(sig: integer):boolean;
     
      private
     
      public
     
      end;
     
    var
      Form1: TForm1;
     
    implementation
    procedure TestCallBack(myCBFunction: TCallBackFunction); register;
                                             external('watchcom.dll');
    {$R *.dfm}
     
    function TForm1.callMe(sig: integer): boolean;
       begin
         showmessage('I was called with'+ inttostr(sig));
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      testCallBack(callMe);
    end;
     
    end.

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    tu fais une confusion entre une procédure et une méthode objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function { TForm1. }callMe(sig: integer): boolean;
    begin
         showmessage('I was called with'+ inttostr(sig));
    end;
    mais tu peux faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type
      TCallBackFunction = function:boolean; of object;
    // le paramètre 'sig' est utilisé comme pointer "self"
    ensuite il manque probablement un stdcall
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    c'est un peu violent d'utiliser Self comme ça quand même !
    pour rester plus "prudent", dadouuuu, utilise la première méthode, mets callMe en dehors de l'objet

    pour le stdcall, tout dépend si tu l'as mis dans ta DLL, c'est conseillé de le mettre partout !

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type 
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
     
      public
     
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    type
      TCallBackFunction = function(sig: integer):boolean; stdcall;
     
    procedure TestCallBack(myCBFunction: TCallBackFunction); stdcall;   
    external 'watchcom.dll' name 'TestCallBack'; // attention à la déclaration, utilise plutôt LoadLibrary et GetProcAddress !
     
    function callMe(sig: integer): boolean; stdcall; 
    begin
         showmessage('I was called with'+ inttostr(sig));
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      testCallBack(callMe);
    end;
     
    end.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    c'est un peu violent d'utiliser Self comme ça quand même !
    d'autant que j'ai dit une bêtise

    ça ne serait possible QUE si le paramètre sig était un paramètre de TestCallBack, or là c'est une valeur renvoyée par watchcom.dll qui ne sera donc pas un pointeur objet Delphi
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Donc, pour résumer, il ne faut pas confondre un pointeur sur une routine (sans of object) et un pointeur sur une méthode (avec of object), comme l'explique en détails ce tutoriel.

    Ainsi, soit tu déclares le type TCallbackFunction comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TCallbackFunction = function(sig: Integer) stdcall;
    et tu déclares ta routine CallMe sans TForm1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function CallMe(sig: Integer); stdcall;
    begin
    end;
    Soit tu déclares le type TCallbackFunction comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TCallbackFunction = function(sig: Integer) of object stdcall;
    et tu déclares ta routine CallMe avec TForm1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function TForm1.CallMe(sig: Integer); stdcall;
    begin
    end;
    Si, pour une raison ou une autre, tu veux déclarer TCallbackFunction sans le of object, mais que tu veux déclarer CallMe comme méthode de TForm1, tu peux utiliser la routine MakeProcOfStdCallMethod telle que développée dans ce tutoriel.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    et si tu as delphi 2009 ou mieux tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TCallBackFunction = reference to function(Sig: integer): boolean; stdcall;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/08/2005, 00h39
  2. Association d'une icone avec une dll
    Par ybruant dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 14/07/2005, 11h10
  3. [VB.NET] Problem de récupération de variable avec une DLL
    Par ludovic85 dans le forum Windows Forms
    Réponses: 11
    Dernier message: 19/01/2005, 11h37
  4. Appeler une API sans liaison avec une DLL
    Par mat.M dans le forum x86 32-bits / 64-bits
    Réponses: 10
    Dernier message: 13/07/2004, 02h22
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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