Dll C++ dans vb, tableau en paramètre

Résolu
Gueubaille Messages postés 34 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 31 mai 2006 - 5 mars 2005 à 19:00
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 - 16 oct. 2008 à 16:28
Bonjour, je cherche à passer un tableau d'entiers (de caractère j'ai
renoncé...) à partir de VB pour appeler une dll faite en C++, et je
voudrai savoir s'il y a des conditions particulière pour ce genre de
paramètres, car je n'y arrive pas... Les types simples passe sans
problème.

Merci

8 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 mars 2005 à 19:26
En VB, il faut que ton tableau soit déjà initialisé au moment de l'appel (il faut que sa taille soit définie et fixe).

tu fait ton appel comme ça :



dim ton_tab() as long

dim rep as long



redim ton_tab(0 to nb_éléments)

rep = TaFonctionDll( ton_tab(0) )



ta fonction doit etre déclarée comme ceci :

Declare Function TaFonctionDll Lib "TaDll.dll" (ByRef tab0 As Long) As Long



En C, tu écrit ta fonction ainsi :



int _stdcall TaFonctionDll(int *pt)

{

int i;



// Remplissage du tableau

for (i = 0; i < NB_ELEMENTS; i++)

*(pt+i) = i;



return(0);

}



Attention, dans ta dll tu dois connaitre la taille de ton tableau pour
ne pas la dépasser lors du remplissage. Si tu ne la connais pas à
l'avance, passe la au moment de l'appel avec un second argument à ta
fonction.











Si le cerveau était assez simple pour que nous puissions le comprendre,

nous serions assez bête pour ne pas le comprendre malgré tout.
3
Gueubaille Messages postés 34 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 31 mai 2006
5 mars 2005 à 19:47
Merci, mais en fait quand j'appel la dll le tableau contien déjà des
valeurs, dont j'ai besoin dans la dll, et je n'arive pas à passer ces
valeurs...
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 mars 2005 à 20:37
Avec le code que je t'ai donné tu peux le faire, il suffit d'utiliser le pointeur pt pour acceder à chaque éléments du tableau.



Le passage par ByRef et l'utilisation d'unpointeur, c'est le seul moyen
que j'ai trouvé pour utiliser les tableaux avec les Dll, et ça marche
nickel (même pour des tableaux de chaines de caractères même si c'est
nettement plus complexe à mettre en oeuvre).



Vérifie bien que tu fais les appels comme je t'indique avec ton_tab(0), ByRef..., et le pointeur

Vérifie bien la correspondance des type de variables entre VB et C :



integer (vb) --> short (C)

long (vb) --> int (C)

single (vb) --> float (C)



nota: c'est pour vb6 et vc6, pour .net les types de variables ont changés



As-tu un message d'erreur lors de l'utilisation de ta dll




Si le cerveau était assez simple pour que nous puissions le comprendre,

nous serions assez bête pour ne pas le comprendre malgré tout.
0
Gueubaille Messages postés 34 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 31 mai 2006
6 mars 2005 à 14:46
Je n'ai pas de message d'erreur, je sais juste que le tableau ne passe
pas avec les bonnes valeurs. J'essaye de mettre en place se que tu as
dis précédement et je vois...
0

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

Posez votre question
Gueubaille Messages postés 34 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 31 mai 2006
6 mars 2005 à 15:10
En regardan mieu il y a plusieurs chose que je ne comprend as dans ta
réponse. D'abord tu déclare un tableau dans VB, alors qu'en C tu
récupère un entier (*pt). Je ne vois pas comment utiliser ce pointeur.
En plus ta déclaration du tableau dans l'appel de la dll est bizarre
(tab0), quand je fais comme ça le compilateur plante (VB à rencontré
une erreur et doit fermé...). J'espère que je suis clair
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
6 mars 2005 à 15:30
Je ne m'était jamais rendu compte que tab0 pouvait porter à confusion
(c'est du code qui fonctionne depuis plusieur années, déployer dans
plus d'un centaine de soft maitenant). Si ça te dérange trop tu peut
mettre toto à la place, ça change absolument rien au fonctionnement.

Declare Function TaFonctionDll Lib "TaDll.dll" (ByRef toto As Long) As Long




Quelques explications :



En VB je déclare un tableau d'entiers (c'est bien ce que tu voulais,
non?) que je dimentionne (ReDim) pour qu'il existe physiquement en
mémoire. Lors de l'appel de la fonction je passe l'adresse du premier
élément (ByRef et TonTab(0) ).



En C, je ne récupère pas un entier, je récupère un pointeur sur un
entier, càd l'adresse mémoire de mon premier élément du tableau. Et
comme c'est un pointeur sur un entier, chaque incrément de mon
pointeur, pointe sur l'adresse mémoire de l'élément suivant de mon
tableau.



TonTab(0) (VB) --> *(pt + 0) (C)

TonTab(1) (VB) --> *(pt + 1) (C)

.....................................................

TonTab(n) (VB) --> *(pt + n) (C)



Attention en incrementant ton pointeur, de ne pas aller au dela du
tableau, contrairement à VB, en C avec un pointeur, il n'y a pas de
limite, tu peux passer en revue toute la mémoire si tu veux, avec un
joli BSOD à la clé, éventuellement.



Cela suppose de connaitre les pointeurs en C, et comme tu fais du C++, c'est nécessairement le cas.





Si le cerveau était assez simple pour que nous puissions le comprendre,

nous serions assez bête pour ne pas le comprendre malgré tout.
0
Gueubaille Messages postés 34 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 31 mai 2006
7 mars 2005 à 09:59
Merci beaucoup pour ces réponses et leur rapidités. Leur pertinence m'a
permis de résoudre une partie de mon problème, bien que finalementje
n'utilise pas cette méthode car le passage d'une chaine correspond mieu
à ce que je veux faire.
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
16 oct. 2008 à 16:28
Bonjour à tous

Et si mon tableau est un tableau de string ????
0
Rejoignez-nous