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

MFC Discussion :

DLL avec fonction prenant en parametre une autre fonction


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 54
    Points : 37
    Points
    37
    Par défaut DLL avec fonction prenant en parametre une autre fonction
    (re)bonjour a tous,
    je ne suis pas tres a l'aise en C++ et je voudrais developpez une DLL a laquelle on passe une fonction de "Callback" qui renverrait des nombres
    voici mon code:


    fichier.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #define DllExp __declspec( dllexport )
     
    typedef void (*CALLBACKPROC)(long);
     
    #ifdef __cplusplus 
    extern "C" { 
    #endif 
     
    DllExp bool InitDLL(CALLBACKPROC);
    #ifdef __cplusplus 
    } 
    #endif
    fichier.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    DllExp bool InitDLL(CALLBACKPROC cb)
    {
    	CALLBACKPROC callback;
     
    	callback = cb;
    	callback(20);
    	callback(255);
    	callback(11000);
    	callback(2004);
     
    	return true;
    }
    Mon probleme est que les nombres que je recupere dans mon programme de test ne correspondent pas du tout a ceux-ci ...
    Mon programme utilisant la DLL est en Delphi :

    en voici un extrait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function InitDLL(cb: TCallBack):Boolean; cdecl; external 'madll.dll'
    [...]
    TCallback = procedure (s: Integer);
     
    procedure WriteLine(s: Integer);
    begin
       Form1.Memo.Lines.Add('Callback: '+inttostr(s));
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       InitDLL(WriteLine);
    end;
    Voila mon programme ne plante pas il me renvoie simplement de mauvaises valeurs (toujours les memes d'ailleurs...) j'ai bidouillé tout l'aprem sans succes

    merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    Hello,

    Je ne connais pas du tout Delphi, mais j'ai quand meme des pistes pour toi :

    - en Delphi du fait TCallback = procedure (s: Integer); donc si je te suis "s" est un integer, est ce un 16 bits ou un 32 bits ? en Visual C++, un long est un 32 bits

    - en C++ tu fais typedef void (*CALLBACKPROC)(long); donc ta fonction reçoi un long passer par valeur. Est ce bien cela que tu fais en Delphi, tu ne passe pas par pointeur ou par référence ?

    - en C++ quand tu fais callback(20); , 20 est considéré parfois comme un int qui est casté après en long, d'ou peut être le pb en cas de cast incorrecte. essai callback(20L); (L pour long) idem si nombre < à 32535 (ou un truc comme ça)

    - en Delphi quand tu fais InitDLL(WriteLine); est ce que le Delphi prend bien l'adresse de la fonction ?

    a+

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 54
    Points : 37
    Points
    37
    Par défaut
    runn2 tes pistes me parraissent exploitable ...

    alors en Delphi un Integer est un 32 bits comme le long de C++ donc jusque la ca va ...
    Mais je ne suis pas sur que le probleme vient d'un cast incorrect car j'ai essayer avec des unsigned char (=byte en delphi) ou des char* (=pChar en Delphi) et c'est tout le temps pareil ....
    De plus, mon parametre long est bien passé par valeur ...

    par contre en ce qui concerne ta derniere remarque je ne suis pas sûr que le "InitDLL(WriteLine)" passe bien l'addresse (en reflechissant un peu ca m'etonnerait bien en fait )
    Donc je m'assurerait demain matin au boulot de bien passer l'adresse ...

    - Mais bon en reflechissant un peu dans le cas ou je ne passerait pas bien l'adresse pourquoi mais fonction serait-elle bien appelée alors ? car je confirme quelle est bien appelée et que seul le parametre est louche)

    - Sinon quels sont vite faits les differents moyens de definir mon CALLBACKPROC en C++ que je vois le plus approprié à Delphi ?
    J'ai le droit de faire typedef void (CALLBACKPROC)(long); par exemple ? ca change quoi ?

    merci bien

    j'ai des pistes a explorer apres une bonne nuit de sommeil...

    a+

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 54
    Points : 37
    Points
    37
    Par défaut
    J'ai resolu mon probleme:

    ma fonction de CallBack "Writeline" en Delphi devait etre definie avec la convention d'appel cdecl (pour les appels de fonctions a partir de bibliotheques partagées C, C++)
    comme ceci:
    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
     
     
    function InitDLL(cb: TCallBack):Boolean; cdecl; external 'madll.dll' 
    [...] 
    TCallback = procedure (s: Integer); cdecl;
     
    procedure WriteLine(s: Integer); cdecl;
    begin 
       Form1.Memo.Lines.Add('Callback: '+inttostr(s)); 
    end; 
     
    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
       InitDLL(WriteLine); 
    end;
    je vais pouvoir commancer a bosser maintenant

    merci a+

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

Discussions similaires

  1. Bouton avec une fonction ayant en argument une autre fonction
    Par Serratonique dans le forum Général Python
    Réponses: 8
    Dernier message: 28/02/2014, 18h53
  2. Réponses: 4
    Dernier message: 24/04/2007, 16h07
  3. fonction en paramètre d'une autre fonction
    Par zorobab dans le forum Général Python
    Réponses: 3
    Dernier message: 25/03/2007, 13h34
  4. entrer une fonction en argument d'une autre fonction
    Par arno78 dans le forum VB 6 et antérieur
    Réponses: 22
    Dernier message: 07/09/2006, 14h29
  5. [VB]Passage de Fonction en paramètre (d'une autre fonction)
    Par Australia dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 21/03/2006, 18h55

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