Passer un tableau de Byte à une DLL

hdr Messages postés 3 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 14 mars 2008 - 13 mars 2008 à 18:16
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 14 mars 2008 à 23:38
Salut à tous,

Je souhaiterai utiliser une fonction dans une DLL dont le prototype est :
    public virtual int GetImageRawData(ref int pBuf, int bufLen);

Le premier paramètre est un buffer de type byte[] destiné à contenir les triplets RVB d'une image.
Mais je ne sais pas comment transformer mon tableau
    byte[] Data = new byte[640 * 480 * 3]
en
    ref int pBuf

Merci d'avance pour votre aide.

5 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
13 mars 2008 à 21:08
Salut,

GCHandle gch = GCHandle.Alloc( buffer, GCHandleType.Pinned );
IntPtr ptr = gch.AddrOfPinnedObject( );
...
...
gch.Free( ); // A la fin du traitement.




// Ou version unsafe :


byte[ ] buffer = new byte[ 255 ];


fixed ( byte* p = buffer ) // context unsafe.
{
    IntPtr ptr = ( IntPtr )p;
}
0
hdr Messages postés 3 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 14 mars 2008
14 mars 2008 à 12:12
Merci pour la réponse.
Je l'avais vue dans cet autre topicet j'ai essayé de transformer IntPtr en Intmais la fonction ne rempli pas mon buffer !!!
Une idée ?
Merci
0
hdr Messages postés 3 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 14 mars 2008
14 mars 2008 à 17:15
Après pas mal de tentatives infructueuses, j'ai compris certaines choses.
Voilà le code (très simple) :

byte[] buffer = new byte[640 * 480 * 3];
fixed (byte* ptr = buffer)
{
    int ptrDll = (int)ptr;
    int res = GetImageRawData(ref ptrDll, buffer.length);
}

En fait la Dll (ActiveX plus exactement) modifie la valeur de la variable ptrDll de type int.
Si par exemple elle vaut 415698 avant l'appel, elle vaut 1569875 après et le programme plante.
Si je force sa valeur à 0 (ptrDll = 0;) elle vaut encore 1569875 après l'appel et le programme plante toujours.

Si je comprends bien, il faudrait que ptrDll pointe sur le premier octet de mon buffer.
Et ça je ne sais pas comment faire.

Merci pour votre aide.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
14 mars 2008 à 23:24
"Si je comprends bien, il faudrait que ptrDll pointe sur le premier octet de mon buffer. Et ça je ne sais pas comment faire."

C'est le cas, l'adresse d'un tableau c'est aussi l'adresse de son 1er élément, le code suivant le prouve :

byte[ ] buffer = new byte[ 10 ];
buffer[ 0 ] = 128;


fixed ( byte* p buffer, p0 &buffer[ 0 ] )
{
    MessageBox.Show( String.Format(
        "valeur de p: {0}\r\nvaleur de p0: {1}", *p, *p0 ) );
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
14 mars 2008 à 23:38
Par contre ce n'est pas valide de caster un IntPtr en Int32 sur une machine 64 bits, si ton activeX attend seulement un pointeur 32 bits je ne sais pas quel comportement il va avoir.. Mais ton application peut fonctionner en 32 bits si tu la compile avec l'option "-platform:x86" ( voir dans les paramètres de VS ).
0
Rejoignez-nous