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 :

Traduction C++/Delphi DLL et function Callback


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Traduction C++/Delphi DLL et function Callback
    Salut, Je reposte a propos des pb traduction C++/ Delphi

    Voila ce que j'ai dans un .h C++ permettant d'appelé une DLL C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct Cbi{//callback information
    	void	*handle;
    	unsigned status;
    	unsigned error;
    	unsigned sensors;
    };
     
    typedef void (*Cbf)(Cbi&cbi);//callback function << J'ai du mal ca capté comment traduire ca
     
    //open comm port, set a callback function and return a handle to an opaque structure
     
    typedef int (*Open)(char*port, Cbf cbf, void*&handle);
    J'ai Traduit ca en :

    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
      sCbi = packed record
    		handle : pointer;
    		status : cardinal;
    		error  : cardinal;
    		sensors: cardinal;
      end;
     
    TCbf = Procedure (var Cbi : sCbi); // ici j'ai de gros doute
     
      function dll_Open  (port : pchar; cbf : TCbf ; handle : pointer) : integer; cdecl; external 'tkt.dll' name 'open';
     
    et j'appelle la dll de cette maniere :
     
    procedure tkt_callback(var Cbi : sCbi);
    begin
      showmessage('Callback Reached');
    end;
     
    procedure TForm1.BtnOpenClick(Sender: TObject);
    var    tkt_handle : pointer;
    begin
      dll_Open (pchar(EdComPort.Text), tkt_callback , tkt_handle);
    end;
    J'ai essayé differente approche pour appellé et declaré la traduction de la fonction open. Mais ca se traduit a chaque fois par une violation d'acces.
    J'ai egalement essayé d'appel dll_open avec un nil pour callback, resultat idem.

    J'ai egalement des doutes au nivo du CDECL, ne vaut il pas mieux utilisé STDCALL ? (je n'ai pas l'info sur comment est faite la DLL)
    Comment le savoir d'ailleurs ?

    Merci pour vos eclaircissements

  2. #2
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Le cdel est bon je pense, puisque la DLL est visiblement en C++.

    question bête: Tu as chargé la dll au moins? chargement dynamique ou link en dur de la dll?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    J'ai fait un link en dur, comme je le fais habituellement
    si tu as la methode pour un chargement dynamique je veux bien.

  4. #4
    Membre habitué
    Développeur .NET
    Inscrit en
    Juin 2002
    Messages
    274
    Détails du profil
    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2002
    Messages : 274
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par Crafton
    si tu as la methode pour un chargement dynamique je veux bien.

    http://delphi.developpez.com/faq/?pa...pelfonctiondll

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Merci pour le lien, Tres instructif.

    Par contre cela ne regle pas specialement mon soucis d'appel de fonction avec callback.

  6. #6
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Tu utilises le showmessage de l'API directement ou celui d'un objet MFC?

    Car dans le deuxième cas, il se peut qu'il ne soit pas initialisé au moment de l'appel du callback. En effet, suivant le code de la DLL, il se peut que le contexte d'exécution ne soit pas identique au contexte du processus appelant.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Pas bete, j'ai egalement essayé sans, ca fait la meme chose.

    Je seche un peu sur le sujet la

  8. #8
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Je pense qu'il convient de vérifier chacun des arguments.

    A vue de nez, je dirais que la DLL ne supporte pas les pointeurs nil.

    Au moment ou ça plant, si tu y as accès, vérifies la pile d'appel (call stack) voir>debug>pile d'appels.

    Si tu n'y as pas accès, pose un break point avant chacun des appels de OPen et vérifie qu'il n'y avait aucun argument à nil.

    Ici, je penche pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pchar(EdComPort.Text)
    Es-tu sûr que ce composant est initialisé au moment de l'appel.
    Par exemple si l'appel est dans du code exécuté avant le FormCreate, il peut valoir nil.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Verification Faite, tous est clean au nivo appel.

    Par contre j'ai toujours de serieux doute sur ma traduc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void (*Cbf)(Cbi&cbi); //callback function
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TCbf = Procedure (var Cbi : sCbi);

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 875
    Points : 11 365
    Points
    11 365
    Billets dans le blog
    6
    Par défaut
    essaye de passer l'adresse de la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dll_Open (pchar(EdComPort.Text),    @tkt_callback     , tkt_handle);

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Vi j'ai egalement essayé ca sans resultat , j'ai contacté le developpeur de la dll peut etre qu'il pourra me tuyauté.

    Wait & see

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 875
    Points : 11 365
    Points
    11 365
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TCbf = Procedure (var Cbi : sCbi); 
     
    TPCbf =  ^TCbf;
     
    PBcf:TPCbf;
     
      function dll_Open  (port : pchar; cbf : TPCbf ; handle : pointer) : integer; cdecl; external 'tkt.dll' name 'open'; 
     
    PCbf^:=@tkt_callback;     
     
    dll_Open (pchar(EdComPort.Text),    PCbf     , tkt_handle);
    en passant réellement un pointeur vers une procédure, plutôt que son adresse ???

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Yes, Finalement en y regardant avec un nouvelle oeil, je me suis apercu qu'effectivement j'avais un pointeur a Nil.

    Donc probleme resolu, merci Caine et les autres pour l'aide precieuse.

    Bonne continuation a tous.

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

Discussions similaires

  1. Traduction en Delphi d'une structure
    Par skywaukers dans le forum Delphi
    Réponses: 6
    Dernier message: 14/06/2007, 00h07
  2. [Delphi] [DLL] Problème avec un paramètre PChar
    Par Mickey.jet dans le forum Langage
    Réponses: 1
    Dernier message: 22/03/2006, 16h43
  3. Comment intégrer un Delphi DLL dans CBuilder
    Par Xavier dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/09/2005, 16h49
  4. TRaduction C++ => Delphi VOID ??
    Par escafr dans le forum Langage
    Réponses: 6
    Dernier message: 20/02/2003, 10h39
  5. traduction en delphi "reinterpreted cast"
    Par Chupakabra dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2003, 15h49

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