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 �clair�
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    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 :

    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.

    ++

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2007
    Messages
    15
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : F�vrier 2007
    Messages : 15
    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 �clair�
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    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
    	);

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2007
    Messages
    15
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : F�vrier 2007
    Messages : 15
    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 �clair�
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    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...

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    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

    ++

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 4
    Dernier message: 11/10/2011, 14h34
  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, 07h56
  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, 18h24
  4. R�ponses: 5
    Dernier message: 26/10/2006, 09h23
  5. R�ponses: 1
    Dernier message: 01/11/2005, 02h29

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