Passer un tableau de Bytes en paramètre d'une fonction dll

Taoufik77 Messages postés 14 Date d'inscription dimanche 17 octobre 2004 Statut Membre Dernière intervention 3 novembre 2004 - 31 oct. 2004 à 10:32
Taoufik77 Messages postés 14 Date d'inscription dimanche 17 octobre 2004 Statut Membre Dernière intervention 3 novembre 2004 - 1 nov. 2004 à 13:09
Bonjour,

j'ai une fonction dll (C++) qui prend en parametre un tableau de Bytes (CByteArray). Pour pouvoir l'appeler à partir d'une appli VB, j'ai défini dans ma dll un type "pointeur sur Byte Array" (Etant donné que les tableau sont passé par référence en VB):

typedef CByteArray *LPCByteArray;

le prototye de la fonction dll est :
void __stdcall maFonction(LPCByteArray sBuf);

la déclaration en VB:
Private Declare Sub maFonction Lib "ici le chemin complet de la dll" _
(ByRef ByteArray() As Byte)

l'appel de la fonction en VB:

Dim monMessageFormate(0 To 133) As Byte

For i = 0 To 133
monMessageFormate(i) = i
Next

maFonction monMessageFormate

Alors le problème c'est que, en debuggant la dll, je me rends-compte que je n'arrive pas à recevoir le message (monMessageFormate) tel que je l'ai passé dans l'appel en VB

Quelqu'un aurait une idée s'il vous plaît ?

touf

5 réponses

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
31 oct. 2004 à 12:23
salut

personnellement, je ferais comme ca vu que les tableaux vb sont des SAFEARRAY :

void __stdcall maFonction(BYTE* lpbBuf,ULONG cbBuf);

'le declare
Private Declare Sub maFonction Lib "ici le chemin complet de la dll" _
(byref lpbBuf As Byte,Byval cbBuf)

et pour l'appel :

maFonction monMessageFormate(0),134

après dans ta dll tu dois bien arriver à construire ton objet CByteArray pour qu'il pointe sur lpbBuf...

ShareVB
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 oct. 2004 à 12:26
Salut Taoufik77
La DLL dont il est question, c'est une DLL perso ?
Sinon, précise nous laquelle.
En général, quand on passe un tableau de valeurs à une DLL du système, elle demande aussi le nombre d'éléments dans ce tableau, et la commande a ce format :
Call LaFonction (LeTableau(0), LeNbrEléments)

Sinon, essaye de passer ton tableau en précisant le 1er élément
Call LaFonction (LeTableau(0))

Vala
Jack
0
Taoufik77 Messages postés 14 Date d'inscription dimanche 17 octobre 2004 Statut Membre Dernière intervention 3 novembre 2004
31 oct. 2004 à 19:16
Merci ShareVB et Jack,

ta proposition, shareVB, a l'air de marcher (j'arrive à récupérer le premier élément du tableau).

Seulement, je ne m'y connais pas trop dans les pointeurs. Si vous pouviez m'indiquer comment je dirai à mon objet CByteArray qu'il va être rempli par les bytes qui commencent à lpbBuf (celà suppose que les bytes sont stockés à partir de cet emplacement à la queuleuleu).

Merci d'avance
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
1 nov. 2004 à 09:53
salut

c'est le principe d'un tableau : les octets sont les uns à la suite des autres en VB et en C/C++ et dans tous les langages d'ailleurs

pour affecter ton pointeur à ton CByteArray essaie :

CByteArray Arr = lpbBuf; // je suis pas sur du tout

sinon essaie de te passer de cette classe en utilisant lpbBuf comme un tableau : val = lpbBuf[index]

ShareVB
0

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

Posez votre question
Taoufik77 Messages postés 14 Date d'inscription dimanche 17 octobre 2004 Statut Membre Dernière intervention 3 novembre 2004
1 nov. 2004 à 13:09
L'affectation de pointeur ne marche pas, par contre l'affecattion élément par élément elle, marche:

CByteArray sBuf;
sBuf.SetSize(cbBuf,-1);

for(int i = 0; i<cbBuf; i++)
{
sBuf[i] = lpbBuf[i];
}

Merci ShareVB,

touf
0
Rejoignez-nous