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

C# Discussion :

Passer un pointeur de fonction en param d'une méthode importée d'une dll C++ native


Sujet :

C#

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut Passer un pointeur de fonction en param d'une méthode importée d'une dll C++ native
    Bonjour,

    je développe un projet C# sous visual studio 2005 qui implémente une dll c++ native

    je dois utiliser une méthode de la dll qui demande un pointeur de fonction en paramètre...

    Je ne sais pas comment m'y prendre
    quelqu'un pourrait-il m'aiguiller?..

    Merci

  2. #2
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    déclare un délégué a lui passer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public delegate void toto();
    private void test()
    {
    }
     
    toto x = test;

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    ça ne marche pas trop...
    et j'ai bien peur que ça soit un peu plus compliqué...

    voici le prototype de la méthode de la dll C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long MethodeDeLaDll(unsigned int param, CALL_BACK* ptrFonction);
    où CALL_BACK est type de pointeur de fonction défini toujours dans la dll comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void (*CALL_BACK ) (int);
    en fait, j'ai essayé de faire l'implémentation en C++ managé, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // définition d'un délégué dans le .h :
    public: delegate void DelegueCallBack(int param);
    
    
    // et dans la méthode qui appelle la méthode de la dll :
    DelegueCallBack^ delegue = gcnew DelegueCallBack(this, &MethodeCallback);
    System::IntPtr ptr = System::Runtime::InteropServices::Marshal::GetFunctionForDelegate(delegue);
    CALL_BACK* ptrCB = new CALL_BACK((CALL_BACK)ptr.ToPointer());
    
    long retour = MethodeDeLaDll(param, *ptrCB);
    et là, ça marchait bien...
    donc, je voudrais faire la même chose en C#
    mais le problème, c'est que je n'ai pas accès à la définition du pointeur de fonction 'CALL_BACK' de la dll depuis C#...

    j'espère être claire
    et que quelqu'un pourrait me dire comment m'en sortir...

  4. #4
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    en C# ce qui ressemble le plus a un pointeur de fonction c/c++ c'est un délégué .... suffit de voir la DOC correspondant a delegate :
    En C ou C++, l'équivalent le plus proche d'un délégué est un pointeur fonction. Un délégué peut représenter une méthode statique ou une méthode d'instance. Lorsque le délégué représente une méthode d'instance, il stocke non seulement une référence au point d'entrée de la méthode, mais également une référence à l'instance de classe. Contrairement aux pointeurs fonction, les délégués sont orientés objet et de type sécurisé.
    donc si ca fonctionne pas, je vois pas

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    en fait, c'est la ligne en rouge dans mon post précédent qui pose souci

    Comment faire l'équivalent C#??

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 88
    Points : 81
    Points
    81
    Par défaut
    Bonjour melleb

    Déjà, je pense que tu auras plus d'aide si tu déplaces ton message dans le sous forum dédié à l'interop C ++.

    Sinon pour ton problème tu ne peux pas le faire en C#.

    Seul le C++/CLI (ce que tu montrais dans ton exemple est exactement ce qu'il faut faire) peut fonctionner.

    Cela vient du fait que du code non .NET n'est lisible et utilisable qu'en C++/CLI...

    Par contre, si tu créés une classe C++/CLI (une ref class, et pas une class), tu peux utiliser cette classe dans du C#.

    Pour aller plus loin, tu devrais regarder le tutoriel fait par nico-pyright et écrire un beau wrapper. C'est très simple à faire et tu as quasiment déjà tout fait !

    Voila

    Bonne journée

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    merci pour vos réponses,
    finalement
    j'ai réussi à faire avec un delegate

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/11/2011, 20h25
  2. Réponses: 1
    Dernier message: 29/12/2010, 09h36
  3. Réponses: 1
    Dernier message: 09/04/2010, 11h15
  4. Réponses: 2
    Dernier message: 10/12/2008, 10h53
  5. Réponses: 4
    Dernier message: 28/03/2008, 21h43

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