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++/CLI Discussion :

[C# 2.0] Utilisation d'un IntPtr par une dll native


Sujet :

C++/CLI

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut [C# 2.0] Utilisation d'un IntPtr par une dll native
    Salut !

    Je bosse sur une application qui doit passer un IntPtr à une dll native écrite en C. Cette dll attend un pointeur de type void* donc je convertit mon IntPtr en void* de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monPointeur.ToPointer()
    monPointeur est un IntPtr.

    Par contre, ma dll doit manipuler la donnée pointée et là c'est le drame, une exception est levée : "Access Violation Exception, Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée."

    Comment puis-je résoudre ce problème ?

    Merci.

    ++
    Le problème est souvent entre la chaise et le clavier

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Que contient ton pointeur, une structure ou autre...

    Est-il initialisé dans la dll ?

    Car pour ma part j'appel une fct en C du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    extern "C" __declspec(dllexport) void Bye(void * str)
    {
    	Rec * s = (Rec *)str;
            ....
    }
    mais mon pointeur est initialisé par la fct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    extern "C" __declspec(dllexport) void * Hello()
    {
    	Rec * s = (struct Entree*)malloc(10*sizeof(struct Entree));
            return s;
    }
    Coté C# dans ma fct d'appel à ma dll , j'ai juste un pointeur IntPtr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
           IntPtr handle = Hello();
           Bye(handle);
    J'espere que ca a pu t'aider

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Le pointeur contient une suite d'octets, il est initialisé par l'application puis transmis à la dll qui l'utilise.

    En fait l'exception est levée parce que la dll veut utiliser le pointeur.

    Voici l'import de la fonction de la dll et la structure transmise à la fonction. Le pointeur fait partie de cette structure.

    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
     
    public struct MessageStructure
    	{
    		public unsafe void* body;
    		public byte size;
    		public byte type;
    	}
     
    [DllImport("madll.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void
    	send_message
    	(
    		MessageStructure messageToSend,
    		byte destinationAddress,
    		CommInterfaces destinationInterface
    	);
    Le problème est souvent entre la chaise et le clavier

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    ce serait pas un pb avec le garbage collector qui depace l'adresse de ton ptr comme il est alloué par ton appli c# et en C il ne pointe pas sur le bonne espace mémoire.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Citation Envoyé par Mouti
    ce serait pas un pb avec le garbage collector qui depace l'adresse de ton ptr comme il est alloué par ton appli c# et en C il ne pointe pas sur le bonne espace mémoire.
    Je ne sais pas, comment le savoir ? A noter que le pointeur est encore valide avant de le passer à la dll...
    Le problème est souvent entre la chaise et le clavier

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    J'ai résolu mon problème ! En fait j'ai renoncé aux IntPtr et je bosse avec des pointeurs natifs. De toute manière c'est que qu'attend ma dll.

    J'avais déjà essayé cette solution mais je "fixais" pas mon pointeur à l'aide de l'instruction "fixed", du coup le garbage collector passait par là et boum

    Voici l'article qui m'a mis sur la piste : http://morpheus.developpez.com/dlldotnet/#LIV

    Merci Mouti et Morpheus pour son article

    ++
    Le problème est souvent entre la chaise et le clavier

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/10/2011, 15h34
  2. Utilisation d'une dll native par une toolbar managée
    Par didierll dans le forum C++/CLI
    Réponses: 1
    Dernier message: 10/07/2007, 08h56
  3. Utiliser un pointeur IntPtr d'une BitmapSource WPF - que peut-on faire avec ça ?
    Par BruceWayne dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 01/06/2007, 19h24
  4. Réponses: 5
    Dernier message: 26/10/2006, 10h23
  5. Réponses: 1
    Dernier message: 01/11/2005, 03h29

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