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

API, COM et SDKs Delphi Discussion :

Dll C et fonction CallBack dans Delphi


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Par défaut Dll C et fonction CallBack dans Delphi
    Bonsoir à tous.

    Je travaille sous Delphi 6.
    Je tente d’utiliser une dll écrite en C.
    La fonction en C est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Connexion(char *TargetName,unsigned long *ConnectionId,char *Login,char *Password,bool ShowPuTTY,long Protocol,unsigned long PortNumber,long GenerateReport,int *CallBackRcvData,unsigned long SpecSettings);
    Je l’utilise sous Delphi comme suit :
    D’abord les déclarations :

    (…)

    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
      private
    hDLL:THandle;
    C_Id_DLL: integer;
      public
      end;
    var
      Form1: TForm1;
      function ConnectCllBck (ConnexionId: LongInt;RValue: PChar;Size: LongInt;ConnectStatus: LongInt):LongInt;
    implementation
    var
        Connexion: function(TargetName: PChar;
                          var ConnexionId: LongInt;
                          Login: PChar;
                          Password: PChar;
                          ShowPuTTY: Boolean; 
                          Protocol: LongInt; 
                          PortNumber: LongInt; 
                          GenerateReport: LongInt; 
                          ptrFctRcv: Pointer; 
                          SpecSettings: LongInt): Integer cdecl  {$IFDEF WIN32} stdcall {$ENDIF};
    Puis l’utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      hDLL:=LoadLibrary(PChar('ExtraPuTTY.dll')); 
      if hDLL=0 then ShowMessage('erreur au chargement de la DLL');
      Connexion:=GetProcAddress(hDLL,'Connexion');  // affectation de la fonction Connexion de la dll à la fonction Connexion de notre programme
    Connexion('192.168.2.1',C_Id_DLL,'root',’mdproot’,true,1,22,0,nil,0);
    Jusque là, tout fonctionne parfaitement

    LE PROBLEME concerne la fonction pouvant être déclanchée en CallBack.
    En effet, si je cherche à utiliser cette fonction, mon programme se compile, mais j’ai une erreur à l’exécution.

    L’appel de la fonction de la DLL se fait alors comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connexion('192.168.2.1',C_Id_DLL,'root',’mdproot’,true,1,22,0, @ConnectCllBck,0);
    La fonction Callback en C est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int CallBackRcvData(unsigned long ConnectionId,char *buf, DWORD size,DWORD ConnectionStatus)
    Et ma fonction dans Delphi celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function ConnectCllBck (ConnexionId: LongInt;RValue: Pchar;Size: LongInt;ConnectStatus: LongInt):LongInt;
    begin
    //
    end;
    L’ERREUR provient-elle d’une mauvaise « traduction » C/Delphi de la fonction CallBackRcvData ou d’une mauvaise façon dont ma fonction ConnectCllBck est déclarée ?

    D’avance merci pour vos conseils.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 929
    Billets dans le blog
    6
    Par défaut
    Il doit suffire de déclarer la callBack avec le même mode de passage des paramètres (cdecl).
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    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 : 55
    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
    cdecl est utilisé généralement sous Linux et stdcall sous Windows.

    Note que dans ton code tu as cdecl {$IFDEF WIN32}stdcall{$ENDIF} qui devrait s'écrire {$IFDEF WIN32}stdcall{$ELSE}cdecl{$ENDIF}...à supposé que le code soit compatible Linux ou MACOSX
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 929
    Billets dans le blog
    6
    Par défaut
    Je ne sais plus lire... et reste visiblement obsédé par la librairie SQLite qui utilise la convention cdecl !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre averti
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Par défaut
    Merci à vous deux.

    J'ai ajouté cdecl à ma fonction ConnectCllBck et il n'y a plus d'erreur.

    N'ayant aucune formation informatique, j'avoue ne pas bien comprendre les différences entre cdecl et stdcall.
    Je tacherai cependant de me documenter afin de corriger mon code au mieux.

    Salutations

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

Discussions similaires

  1. La fonction callback dans c++
    Par bboy0303 dans le forum C++
    Réponses: 10
    Dernier message: 24/05/2009, 14h55
  2. Réponses: 5
    Dernier message: 11/02/2005, 16h52
  3. Utilisation fonction définie dans un .Dll
    Par jeab. dans le forum Windows
    Réponses: 5
    Dernier message: 23/03/2004, 16h23
  4. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42
  5. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33

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