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 :

[D7][dll callback]+ [windev][METHODE]


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Points : 167
    Points
    167
    Par défaut [D7][dll callback]+ [windev][METHODE]
    Bonjour à tous,
    voilà depuis ce matin j'étais confronté à la problématique suivante

    1) Je construit une dll delphi qui marche très bien par ailleurs.
    2) celle-ci abrite un socket tcp
    3) sur ce socket j'ai des retour d'évennements de type onafterconnect etc...

    Probleme, commet l'application cliente de la dll (non delphi) peut recevoir l'évennement


    Voici la solution que j'ai utilisé: création d'un callback dans la dll


    1) création d'un type pour mon callback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type 
      TConnectCallBack = procedure (i: integer);stdcall;

    2)J'ai une procedure Registercallback qui permet de stoquer l'adresse de la procedure cliente (je crois)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Var
      ZConnectCallBack     : TConnectCallBack;
     
    //déclaration...
    procedure RegisterConnectCallBack(ThisCallBack:TConnectCallBack);stdcall;
     
    //implémentation..
    procedure RegisterConnectCallBack(ThisCallBack:TConnectCallBack);stdcall;
    begin
      ZConnectCallBack:=ThisCallBack;
    end;
    Et enfin, lorsque j'ai mon event qui est déclanché...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TDB9Connector.OnAfterConnect(Sender: TObject);
    begin
      FConnected:=true;
      showmessage('appel de callback');
      ZConnectCallBack(integer(FConnected));
    end;


    Voici le pseudo code application "cliente"

    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
     
    //déclaration du type callback (pointeur sur une fonction?)
    Type
     TConnectCallBack = procedure (i:integer);stdcall;
    (...)
    //déclaration de la procedure de test
    var
      procedure TestCallBack(i:integer);stdcall;
    (...)
    //déclaration du register
    procedure RegisterCallBack(ThisCallBack:TConnectCallBack);stdcall;external aDll name 'RegisterConnectCallBack';
    (...)
    //Appel du register
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     RegisterCallBack(TestCallBack);
    end;
    (...)
    //implementation du callback
    procedure TestCallBack(i: integer);
    begin
     Showmessage('Callback' + inttostr(i));
    end;
    Ca fonctionne... Quand l'event est déclenché dans la dll
    ma procédure TestCallBack est appelée dans l'application cliente.
    et je récupère la valeur de i;

    Si vous voyez une erreur flagrante dans mon code ou un moyen de l’améliorer, n’hésitez pas à me le faire savoir.

    Et euhhh. Si quelqu'un sait comment utiliser cette dll sous windev (déclaration du callback et tout... ben je suis tout à fait ouvert à une discussion sur le sujet)

    Merci d'avance.
    Passez une bonne journée

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 753
    Points : 13 336
    Points
    13 336
    Par défaut
    Le point 2 est à supprimer, cette procédure TestConnectCallBack ne sert à rien. Tu peux directement l'appeler depuis OnAfterConnect.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TDB9Connector.MyAfterConnect(Sender: TObject);
    begin
      FConnected:=true;
      showmessage('appel de callback');
      ZConnectCallBack(integer(FConnected));
    end;
    Attention au mélange integer et pinteger. (mais je suppose que c'est un reste du message de 11h37 )

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Points : 167
    Points
    167
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Attention au mélange integer et pinteger. (mais je suppose que c'est un reste du message de 11h37 )
    Oups oui c'est exact...

    Merci pour ta remarque au sujet de la fonction inutile. Je fais un edit du post pour remettre ça en ordre.

    Bon ca merde completement sous windev (je ne suis pas un spécialiste non plus et j'ai du mal à comprendre les concepts de ce language).

    Je vais donc poster sur un forum windev. L'ideal étant de trouver quelqu'un qui connait les deux.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 753
    Points : 13 336
    Points
    13 336
    Par défaut
    N'édite plus s'il te plaît !!!

    Sinon ma réponse n'aura plus de raison d'être et les futures personnes qui pourraient lire ce sujet n'y comprendront rien

    EDIT
    Trop tard...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Points : 167
    Points
    167
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    N'édite plus s'il te plaît !!!

    Sinon ma réponse n'aura plus de raison d'être et les futures personnes qui pourraient lire ce sujet n'y comprendront rien

    EDIT
    Trop tard...
    Oups j'ai encore gaffé...

    Bon si vous ne comprenez plus rien à la conversation, sachez que le code actuellement dans le post d'origine fonctionne et qu'il est corrigé en tenant compte des remarques ci-dessus.[

    Merci de votre attention.

    En espérant que ca pourra épargner des recherches à quelqu'un qui serait confronté à ce problème.

    Les callbacks c'est super pratique.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Points : 167
    Points
    167
    Par défaut [APPEL SOUS WINDEV]
    pour en finir avec le problème énoncé,
    voici la méthode pour appeler la dll et les callbacks sous windev.

    Je précise qu'il faudra extrapoler un peu.

    Je vais surement écrire un article un jour qui parlera de création de dll avec callback sous delphi et les utilisations de celle-ci dans différents languages.

    Cela permettra d'aborder entre autre les problèmes
    -de type de données
    -de conventions d'appels
    -et de présenter des méthodes pour faire passer des string de la dll delphi à l'appli sans sharemem (problème récurrent lorsqu'on débute avec les dll).

    Donc Windev...

    1) Déclarer une méthode qui aura les mêmes arguments que celle du type callback (1 du premier post)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PROCEDURE ConnectCallBack(i est un entier sur 4 octets) 
    	//traitement
            TitreSuivant("Bravo!")
            Info("Votre callback fonctionne", numériqueverschaine(i));
    2) Enregistrer votre callback dans la dll

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      (...)
        //initialisation de votre dll en fonction de vos besoins
      (...)
      AppelDLL32("ESSD.dll", "RegisterConnectCallBack", &ConnectCallBack)
    C'est tout!
    Lorsque la dll recevra votre event, le callback dans votre application sera automatiquement déclenché.

    Notez bien le &connectcallback (ou le nom de votre méthode). On passe l'adresse de la fonction.
    Il faut bien comprendre que tout est une question de pointeurs dans cette affaire.

    En effet cette déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Type 
      TConnectCallBack = procedure (i: integer);stdcall;
    revient à déclarer un pointeur sur une fonction/procedure.

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Citation Envoyé par darkvadr Voir le message
    revient à déclarer un pointeur sur une fonction/procedure.
    Oui, c'est écrit dans la documentation : Types procéduraux

    Sans le savoir, quasiment tous les développeurs Delphi en utilisent avec les Gestionnaires d'Evènement qui utilisent le même principe de "CallBack" mais appliqué à une méthode d'objet, c'est totalement transparent et d'une simplicité enfantine !

    Quand j'ai codé en WD5.5 à 7.5, je déclarais en anglais, surtout que tu n'es pas obligé d'utiliser la déclaration verbeuse puisque par défaut en 32bit depuis la 7

    tu dois pouvoir écrire en WD 7 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PROCEDURE ConnectCallBack(i long int)
    WD étant codé en C++, on y retrouve les mêmes termes

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

Discussions similaires

  1. Scan dll exe windev
    Par zouzoukha dans le forum WinDev
    Réponses: 4
    Dernier message: 08/06/2012, 16h55
  2. Créer des DLL avec WinDev
    Par DgpMartin dans le forum WinDev
    Réponses: 4
    Dernier message: 12/03/2012, 14h46
  3. [WD14] Création de dll avec windev
    Par devalender dans le forum WinDev
    Réponses: 3
    Dernier message: 03/02/2012, 08h30
  4. Réponses: 4
    Dernier message: 29/04/2008, 15h46
  5. [DLL] Acces a une methode par son index de maniere dynamique
    Par Clorish dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 11/03/2005, 17h14

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