cs_andrebernard
Messages postés406Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 2013
-
27 juin 2007 à 14:44
cs_andrebernard
Messages postés406Date d'inscriptionlundi 9 juin 2003StatutMembreDerniè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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 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
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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.
cs_andrebernard
Messages postés406Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_andrebernard
Messages postés406Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 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