Gueubaille
Messages postés34Date d'inscriptionmercredi 12 janvier 2005StatutMembreDernière intervention31 mai 2006
-
5 mars 2005 à 19:00
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDerniè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.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.
Gueubaille
Messages postés34Date d'inscriptionmercredi 12 janvier 2005StatutMembreDernière intervention31 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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Gueubaille
Messages postés34Date d'inscriptionmercredi 12 janvier 2005StatutMembreDernière intervention31 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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.
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.
Gueubaille
Messages postés34Date d'inscriptionmercredi 12 janvier 2005StatutMembreDernière intervention31 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.