Fin de tableau retourné par une DLL

cs_andrebernard Messages postés 406 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 - 27 juin 2007 à 14:44
cs_andrebernard Messages postés 406 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 - 28 juin 2007 à 23:57
Bonjour à tous

J'ai fait une DLL standard non-activeX avec un autre language
Dans cette derniere,  il y a un tableau tout simple de 10 lignes

Le tableau complet remonte bien de la DLL dans mon appli lorsque je le dimensionne dans la DLL exactement du nombre de ligne donc 10
Si je le dimensionne a 11 dans la DLL, alors mon appli plante.
Y a t'il un moyen de reperer la fin du tableau afin que mon appli n'aille pas lire des lignes qui n'existent pas.

Voici le code :

Private Declare Function TabloCodage Lib "&P1M1.dll" () As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Bytes As Long)



Dim TabloExeCodage(100) As String
Dim TailleTabloCodage As Long, AdresseElement As Long, AdresseTabloCodage As Long
 
Function PeekL(ByVal Addresse As Long) As Variant
 Dim valueL As Long
 CopyMemory valueL, ByVal Addresse, 4
 PeekL = valueL
End Function



Function PeekB(ByVal Addresse As Long) As Variant
 Dim valueB As Byte
 CopyMemory valueB, ByVal Addresse, 1
 PeekB = valueB
End Function



Public Sub ChargeTablo()
 
 AdresseTabloCodage = TabloCodage()
 TailleTabloCodage = PeekL(AdresseTabloCodage - 8) - 1
 
 For Element = 1 To TailleTabloCodage
 
  AdresseElement = PeekL(AdresseTabloCodage + (Element * 4))
 
  For u = 0 To 20
 
   TabloExeCodage(Element) = TabloExeCodage(Element) + Chr(PeekB(AdresseElement + u))
  
   If PeekB(AdresseElement + u) = 0 Then Exit For
 
  Next
 
  PhraseTablo = PhraseTablo + " " + Left(TabloExeCodage(Element), Len(TabloExeCodage(Element)) - 1)
 
 Next
 
 MsgBox PhraseTablo
 
End Sub



Private Sub Form_Load()



 ChargeTablo ' Chargement du tableau de codage contenu dans la DLL
 
End Sub

Voici le tableau de la DLL :

Dim Codage$(10) Si je dimensionne à 11 ou plus ça plante

 Codage$(0)  = "Bonjour"
 Codage$(1)  = "je suis"
 Codage$(2)  = "un tableau"
 Codage$(3)  = "qui sert"
 Codage$(4)  = "scritement"
 Codage$(5)  = "a rien...."
 Codage$(6)  = "bref,"
 Codage$(7)  = "je ne sais pas "
 Codage$(8)  = "quoi "
 Codage$(9)  = "mettre"
 Codage$(10) = "dedans" 
 
Je vous remercie de votre aide

5 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
27 juin 2007 à 19:33
Salut
"mon appli plante" : Ce n'est pas un diagnostique très poussé ... difficile de te répondre
Quelle erreur obtiens-tu ? sur quelle ligne ?

Le tableau 'Codage', ce sont des valeurs que tu fournis à ta fonction ou est-ce la variable sensée réceptionner des valeurs ?
As-tu essayé d'utiliser un dimensionnement dynamique de ton tableau, genre :
Dim Codage() As String
et quand tu as besoin d'augmenter la taille (sans perdre les données grace à Preserve) :
Redim Preserve Codage(11)

Rien à voir, mais évite les déclarations en Variant
PeekB renvoie un Byte --> Function PeekB(ByVal Addresse As Long) As Byte
PeekL renvoie un Long --> Function PeekL(ByVal Addresse As Long) As Long

Tu n'as toujours pas déclaré tes variables, ça te jouera des tours ...
'Option Explicit' en haut de chaque page de code, insertion automatique (à la création des pages de code) dans les options de l'IDE de VB "Déclaration obligatoire des variables

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
27 juin 2007 à 19:52
Bonjour,

"Dans cette derniere,  il y a un tableau tout simple de 10 lignes"


Ma foi...

C'est la fonction concernée de ta dll, qu'il te faut revoir....
Fais lui accepter de dimensionner le tableau en fonction d'un paramètre à lui passer par ton appli.
0
cs_andrebernard Messages postés 406 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
27 juin 2007 à 23:13
Tout d'abord merci de votre aide




Bonjour Jack





Quelle erreur obtiens-tu ? sur quelle ligne ?

En fait je n'obtiens aucune erreur.
Vb plante et se ferme.
Et j'ai le panneau VB6 a rencontré une erreur et doit se fermer

Il suffit que je modifie la ligne

For Element = 1 To TailleTabloCodage
en
For Element = 1 To 10
Et la ça remarche puisque je ne vais pas lire plus loin que la fin du tableau

Letableau 'Codage', ce sont des valeurs que tu fournis à ta fonction ou est-ce la variable sensée réceptionner des valeurs ?
Le tableau ce sont des valeurs que j'ecris en dur dans ma fonction manuellement.
Mais comme je ne peux pas retourner le nombre de lignes du tableau dans mon appli (10), je ne connais pas le nombre de boucles "For element = 1 to ?????" à effectuer
Cette va etre ammenée a etre modifiée souvent le tableau va donc s'agrandir et je ne peux donc pas mettre une valeur en dur de la boucle "For element = 1 to" sauf celle de la taille du tableau

As-tu essayé d'utiliser un dimensionnement dynamique de ton tableau,
Le language de la DLL n'autorise pas les dimensionnements dynamique de tableau

Rien à voir, mais évite les déclarations en Variant
C'etait un oubli, je n'avais pas fait attention merci

Tu n'as toujours pas déclaré tes variables, ça te jouera des tours ...
Excuse moi, encore un oubli, c'est corrigé


Apparement ça fait pareil, j'ai essayé dan ACCESS et il tourne en boucle et reste coincé il faut le fermer par le gestionnaire des taches





Bonjour jmfmarques



Fais lui accepter de dimensionner le tableau en fonction d'un paramètre à lui passer par ton appli.

C'est vrai c'etait une bonne idée mais le dimentionnement de tableau ne peut etre que statique

J'suis dégouté, à mon avis c'est juste qu'il va lire trop loin ou il ne devrait pas, et qu'il se perd dans la memoire.
Si je met un messagebox ici :

For Element = 1 To TailleTabloCodage
  msgbox  Element
   AdresseElement = PeekL(AdresseTabloCodage + (Element * 4))
 
  For u = 0 To 20

J'obtiens bien  1,2,3,4,etc ...10 et paf plus rien ça se bloque.
Je pense que VB n'est pas autorisé à lire plus loin.
Mais voila je n'y connais pas grand chose en memoire, et je ne sais pas pourquoi.

Quand je fais tourner ce genre de code sur un autre language, ça ne plante pas , il n'y a qu'en VB et VBA
Je vous remercie d'avoir tenté de m'aider
Je vous souhaite une excelente soirée
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
28 juin 2007 à 18:44
Re
Excuses, mais j'ai toujours du mal à saisir l'utilisation du tableau.
Avec CopyMemory, on peut copier des tableaux de valeurs (long only) d'un coup : As-tu besoin d'une boucle ?
La dimension d'une variable de type tableau peut être récupérée par les LBound (index mini, en général 0) et UBound (index maxi)
Pour savoir quelle instruction cause le crash de VB, exécute ton programme en le lançant avec F8 au lieu de F5 (ou Ctrl-F5)
Ligne par ligne, survole avec la souris tes noms de vraibles pour vérifier qu'elles contiennent des valeurs, CopyMemory n'aime pas les valeurs 0, on ne sait jamais.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
0

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

Posez votre question
cs_andrebernard Messages postés 406 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
28 juin 2007 à 23:57
Avec CopyMemory, on peut copier des tableaux de valeurs (long only) d'un coup : As-tu besoin d'une boucle ?

Bah en fait j'ai pris ce code sur ce forum et extrait juste le PEEKL et PEEKB pour prendre bit a bit.
Mais je t'avoue ne pas avoir tout compris de la fonction.
Alors vu que ça marchais ......

Pour savoir quelle instruction cause le crash de VB, exécute ton programme en le lançant avec F8 au lieu de F5 (ou Ctrl-F5)
Ligne par ligne, survole avec la souris tes noms de vraibles pour vérifier qu'elles contiennent des valeurs, CopyMemory n'aime pas les valeurs 0, on ne sait jamais.
Eh bien justement, tout se passe bien le tableau remonte caractere par caractere jusqu'a ce qu'il atteigne le dernier caractere du tableau.
Et la il reste apparement coincé dans la boucle :
For Element = 1 To TailleTabloCodage
next
Mais apres pour VB il se ferme et pour acces j'ai le fond d'ecran access et plus la main.
Peut etre que comme tu dit il remonte 0 quand il est a la fin.
Il faudra que je controle ça dimanche ou lundi
Ce qui est sur c'est que comme je l'ai déja dit :
J'ai mis un messagebox et les lignes du tableau remonte bien les unes apres les autres jusqu'a la derniere et apres couic !!

For Element = 1 To TailleTabloCodage
  msgbox  Element

   AdresseElement = PeekL(AdresseTabloCodage + (Element * 4))
 
  For u = 0 To 20

Sinon si tu as un code qui est plus fiable en remontant le tableau d'un coup, sans planter VB, ça m'irait tres bien aussi.

Encore merci de ton aide
0