Utilise une fonction c++

Résolu
cs_amiro Messages postés 48 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 8 mai 2005 - 23 févr. 2005 à 22:47
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 25 févr. 2005 à 09:42
j'utilise cette fonction dans une DLL pour l'appeler en vb
cette fonction fonctionne correctement en vc.
void liste_adap(char * device_name)
{
/* Vars */

pcap_if_t *alldevs;
pcap_if_t *d;
char error[PCAP_ERRBUF_SIZE];
/* Trouve toutes les interfaces */
pcap_findalldevs(&alldevs, error);

for(d=alldevs;d!=NULL;d=d->next)
{
strcpy(device_name,d->name);
}

}
le probléme c'est que visual basic se plante lorsque je fais l'appel à la fonction:


Private Declare Sub liste_adap Lib "d:\test.dll" (ByVal adap_name As String)



Private Sub Command1_Click()
Dim name_adap As String
Call liste_adap(name_adap)
End Sub
comment puis résoudre ce probléme:
j'ai d'autre fonction qui retourne des types simples int,float mais qui fonctionne correctement
ezzi

15 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 févr. 2005 à 07:55
Exact, j'avais pas vu



en vb il faut faire

Dim name_adap As String * xxx 'avec xxx = la longueur maxi de ta chaine




ou tu peut faire aussi dans le code avant l'appel de la dll : name_adap = space(xxx)



sinon en C quand tu remplis ta chaine, en fait tu écrase les
autres variables stocké en mémoire après cette chaine, avec en retour,
au mieux des valeurs érronnées et au pire un magnifique BSOD




<hr size="2" width="100%">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
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
23 févr. 2005 à 22:57
As-tu essayé :



Private Declare Sub liste_adap Lib "d:\test.dll" (ByRef adap_name As String)



Les chaines de caractères entre VB et C c'est pas toujours évidents, j'ai régulièrement moi aussi des problèmes.




<hr size="2" width="100%">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
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
24 févr. 2005 à 00:14
aucune dll ne peut changer la taille d'une chaîne passée par VB

Daniel
0
cs_amiro Messages postés 48 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 8 mai 2005
24 févr. 2005 à 09:00
Merci cassy,votre deuxiéme proposition a résolu mon probléme

ezzi
0

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

Posez votre question
cs_amiro Messages postés 48 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 8 mai 2005
24 févr. 2005 à 09:08
mais je ne vois pas l'utilité de la fonction Space car la programme fonctionne sans cette fonction

ezzi
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 févr. 2005 à 09:37
Il faut que ta chaine soit dimentionner (en gros que l'espace en mémoire soit réservé) avant l'appel de ta fonction dll.



Alors soit tu le fait lors de la déclaration, tel que je te l'ai
indiqué, soit tu garde ta déclaration comme tu l'avait fait au départ
et dans ce cas il faut dimentionner ta chaine en cours d'exécution.

Dans ce cas la fonction space(xxx) en ecrivant xxx espace dans ta chaine, la dimentionne automatiquement.



Tu utilise une deux solutions, les deux à la fois ce n'est pas utile.



La seconde (avec space) peut éventuellement etre utile si tu veux donner des tailles différentes à ta chaine.




<hr size="2" width="100%">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
cs_amiro Messages postés 48 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 8 mai 2005
24 févr. 2005 à 09:53
est ce que tu peux me donner un exemple d'une fonction qui retourne une structure et comment peut on l'appeler à partir de vb car je n'arrive pas à le faire

ezzi
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 févr. 2005 à 10:19
Pour VB :

déclarations :

Public Type ST_TEST

Var1 As Long

Var2 As Single

Var3 As Single

Var4 As Long

Var5 As Long

End Type



Public TaStruc As ST_TEST



Public Declare Sub TaFonctionDll Lib "TaDll.DLL" (ByRef TaStruc As ST_TEST)



Appel :

Call TaFonctionDll(TaStruc)



Pour la Dll :

déclaration :

typedef struct

{

int var_1;

float var_2;

float var_3;

int var_4;

int var_5;

}ST_C_TEST;



Utilisation :

void TaFonctionDll(ST_C_TEST *pt)

{

........

pt->var_1 = 1;

pt->var_2 = 2;

........

}







<hr size="2" width="100%">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
cs_amiro Messages postés 48 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 8 mai 2005
24 févr. 2005 à 11:45
ezzi
0
cs_amiro Messages postés 48 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 8 mai 2005
24 févr. 2005 à 17:55
void advanced_info(advanced_information_device *test,int *nbre_interface)
c'est le protoype d'une fonction que j'utilise dans une DLL pour l'appeler à partir de vb.
test :est un pointeur vers un tableau de structure
nbr_interface :valeur retournée par la fonction pour désigner le nombre d'interface trouvés.
elle fonctionne correctement en c++.
lorsque je fais l'appel de la fonction:


Public Declare Sub advanced_info Lib "d:\test.dll" (ByRef struct As advanced_information_device, ByRef nombre_interface As Integer)

Dim test_interface As advanced_information_device
Dim interface As Integer
Call advanced_info(test_interface, interface)
Text1.Text = test_interface.Description
MsgBox interface
le résultat est:
s'il ya une seule interface il l'affiche sinon il se plante
comment peut on faire passer une réference à un tableau de structure en vb
ezzi
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 févr. 2005 à 18:38
Effectivement ça plante car ce n'est pas un tableau de structure que tu passe mais une structure.

Le plantage viens du fait que lorsque dans la dll tu pointe sur ton
éventuelle seconde structure, tu écrase en fait d'autres variables,
c'est ce que je t'expliquait plus haut.



Il faut donc en vb déclarer ton tableau de structure de dimention connue et fixée :

Dim test_interface(NB_ELEMENT) As advanced_information_device




ensuite tu appelle ta fonction comme ça :

Call advanced_info(test_interface(0), interface, NB_ELEMENT)




Puis tu reprends ta fonction C, tu ajoute un parametre qui sera le nombre d'élements de ton tableau :

void advanced_info(advanced_information_device *test,int *nbre_interface,int nbre)




puis tu gère chaque structure ainsi



// Structure 1


test--> ##variables de ta structure##


// Structure 2


(test+1)--> ##variables de ta structure##


// Structure X +1


(test+X)--> ##variables de ta structure##


// Dernière Structure ATTENTION ne pas aller au delà



(test+nbre)--> ##variables de ta structure##


En fait tu gere ça comme ta chaine de caractère, car en C une chaine est en fait un tableau de caractère.



L'important c'est que ton tableau doit existe et avoir une taille bien
défini au moment de l'appel de ta fonction, et dans ta fonction il ne
faut pas dépasser la taille de ton tableau.



Sinon gare le BSOD rode pret à bondir.

















<hr size="2" width="100%">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
cs_amiro Messages postés 48 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 8 mai 2005
24 févr. 2005 à 22:15
j'ai changé un peu le code des fonctions ,ça fonctionne correctement en vc++ mais c'est le probléme existe dans ces quelques lignes
Public Declare Sub advanced_info Lib "d:\test.dll" (ByRef struct As advanced_information_device, ByVal nombre As Long)


Dim i As Long
Dim test_interface(5) As advanced_information_device
i = nbre_adap() 'i ne depasse pas la valeur 5
call advanced_info(test_interface(0), i)

ezzi
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 févr. 2005 à 22:48
Chez moi ça marche avec un petit prog de test et en reprenant ton code VB.



Quel est ton erreur exactement ?



As-tu penser à déclarer tes fonstions de la dll en "stdcall" pour
qu'elles soient visible par VB. Et en plus il faut inclure un fichier
.DEF dans ta DLL pour que ça marche en vb.
Mais je pense que c'est fait puisque tu arrivait à lire une structure tout à l'heure.




<hr size="2" width="100%">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
cs_amiro Messages postés 48 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 8 mai 2005
25 févr. 2005 à 08:37
avec vc++,il n'ya pas de probléme.j'ai inclut le ficj=hier .DEF ainsi que STDCALL
mais le probléme c'est au niveau vb parceque j'ai testé la fonction en vc et ça marche trés bien.
est ce que tu peux m'envoyer au moins l'exemple que tu es entrain de tester.

ezzi
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
25 févr. 2005 à 09:42
Désolé, je n'ai pas l'exemple sous la main pour l'instant (je suis au boulot).



Pour la dll, j'ai déclaré la fonction comme ceci :

void _stdcall advanced_info(advanced_information_device *pt, int nbre)


et je me suis codé la fonction comme l'exemple que je t'avais donné un peu plus haut.

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

{


(pt+i)->var_1 = 1;

(pt+i)->var_2 = 2;

........


}

dans le fichier DEF, j'ai ceci :

LIBRARY TEST



EXPORTS

advanced_info @1



Dans les settings du projet :

C/C++ / Général / Warning level : Level 3

C/C++ / Code Generation / Use runtime library : multithreaded (je sais pas si c'est utile, c'est comme ça depuis des années)

le reste : valeur par défaut.



Pour vb j'ai mis le dernier code que tu as posté

As-tu vérifier
que ta structure VB et ta structure Dll sont STRICTEMENT indentiques,
que les variables sont du même type des 2 cotés.



<hr size="2" width="100%">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
Rejoignez-nous