cs_amiro
Messages postés48Date d'inscriptionsamedi 1 mai 2004StatutMembreDernière intervention 8 mai 2005
-
23 févr. 2005 à 22:47
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 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);
}
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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.
cs_amiro
Messages postés48Date d'inscriptionsamedi 1 mai 2004StatutMembreDerniè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
cs_amiro
Messages postés48Date d'inscriptionsamedi 1 mai 2004StatutMembreDerniè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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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
// 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.
cs_amiro
Messages postés48Date d'inscriptionsamedi 1 mai 2004StatutMembreDerniè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)
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.
cs_amiro
Messages postés48Date d'inscriptionsamedi 1 mai 2004StatutMembreDerniè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.