Mémoire ne peut pas etre READ (A l'aide !!)

[Résolu]
Signaler
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
-
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
-
Bonjour à tous

J'ai déja créé un POST sur ce forum, j'ai eu quelques gentilles aides, mais personne n'a été en mesure de trouver la solution à mon probleme.
Je m'excuse de vous déranger à nouveau, mais je suis coincé et ne sais plus quoi faire.



Voila, j'ai créé une DLL standard non-activeX dans laquelle j'ai mis juste un tableau tout simple de 3 lignes et c'est tout.
Cette DLL retourne l'adresse de debut du tableau AbreviationTitre
Voici la DLL que vous pouvez télécharger à cette adresse :

http://erdsjb.free.fr/EssaiDll.dll

Voici le tableau contenu dans la DLL 

Dim AbreviationTitre$(50)

AbreviationTitre$(0) = "aa"
AbreviationTitre$(1) = "bb"
AbreviationTitre$(2) = "cc"

J'ai fait ce code dans VB pour lire la DLL


Option Explicit
Private Declare Function DllTablo Lib "EssaiDll.dll" () As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Bytes As Long)
 
Function PeekL(ByVal Addresse As Long) As Long
 Dim valueL As Long
 CopyMemory valueL, ByVal Addresse, 4
 PeekL = valueL
End Function



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



Private Sub Form_Load()
 
 Dim TabloExeCodage(100), Element As Integer, u As Integer, PhraseTablo As String
 Dim TailleTabloCodage As Long, AdresseTabloCodage As Long, AdresseElement As Long
 AdresseTabloCodage = DllTablo()
 TailleTabloCodage = PeekL(AdresseTabloCodage - 8) - 1
 
 For Element = 0 To 2 'Plante si je remplace le 2 par TailleTabloCodage ou 3
  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



Ce code marche tres bien et me retourne dans une messagebox : aa bb cc
Mais voila, le probleme c'est que si  je met la longueur du tableau dans la boucle à la place du "2":

For Element = 0 To 2 





Remplacé par


For Element 0 To TailleTabloCodage (TailleTabloCodage 50)
Ou remplacé par
For Element = 0 To 3


En fin de compte des que j'essaie de lire en dehors du tableau à partir de 3
VB plante et se ferme, en me mettant un panneau "la memoire ne peut pas etre read"

Comment faire pour eviter ce message d'erreur et détecter la fin du tableau pour arreter la boucle avant qu'elle n'aille lire n'importe ou dans la mémoire.

Je vous remercie beaucoup de votre aide
Bonne journée

8 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
Dim AbreviationTitre$(50)
AbreviationTitre$(0) = "aa"
AbreviationTitre$(1) = "bb"
AbreviationTitre$(2) = "cc"

l'element 3 (et ceux qui suivent) aura une valeur arbitraire... (même si tu mets 0, ca va coincer...)

ton CopyMemory va donc pointer sur a peut pret n'importe quoi.
 fais une fonction qui renvoie le nombre d'element effectifs du tableau, c'est le plus simple a faire

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Merci de ta reponse RENFIELD

Donc il est impossible de connaitre la fin du tableau si on le lui met pas un drapeau de fin.
J'ai modifié la DLL afin qu'elle renvoie une string sous cette forme :

Str(AdresseDebutTablo) + "-" + Str(NombreElement)
Je recupere dans mon code VB les deux données

Autrement j'ai pensé envoyer en argument à la DLL un integer par exemple : 0 AdresseDebutTablo et 1 NombreElement
Et seulon l'argument envoyé j'ai en retour l'une ou l'autre donnée

Qu'en pense tu ?
C'est un peu de la bidouille, quelle est la methode la meilleure a tes yeux?
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
J'ai trouvé une troisieme solution encore plus simple.
J'enregistre la longueur du tableau dans la ligne AbreviationTitre$(0).
Comme ça j'ai plus qu'a prendre cette ligne pour redimensionner mon tableau dans l'appli VB.

Encore merci de ton aide
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
pourquoi ne pas ajouter une vraie fonction, qui renvoie un vrai Long indiquant le nombre d'elements ?

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
au pire, tu peux même utiliser le même tableau définit en C

enfin, il me semble, vu que j'ignoere ce que u cherches a faire... ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
pourquoi ne pas ajouter une vraie fonction, qui renvoie un vrai Long indiquant le nombre d'elements ?

Oui je pense que ça aurait été la solution la plus "Pro".
Mais vu que je ne me servais pas de la ligne 0 du tableau, j'ai pensé qu'au moins elle serait utilisée.
Car le tableau DLL commence à 0, et ça me cause souvent des decalages car j'ai pris l'habitude de commencer un tableau à 1 dans mes progs.
Donc une pierre deux coup

En plus cela rajoutait une fonction de plus alors que j'avais juste besoin d'une ligne pour tout le tableau.


au pire, tu peux même utiliser le même tableau définit en C
Je ne sais pas ce que ça veux dire, la DLL est faite par un autre language, qui créé des DLL presque equivalente au C, mais je ne connais pas le C.


Ce que je voulais faire c'est tout simple, c'est faire une DLL de convertion.
Quand mon prog trouve un caractere, il va fouiller dans le tableau de la DLL et recupere la valeur correspondante. J'ai aussi dans cette DLL une fonction de cryptage simple


J'ai mis ce tableau dans une DLL car je vais le mettre manuellement a jour, il est utilisé par plusieurs applis donc qd je veux faire une MAJ, y'aura qu' a copier la DLL et tous les tableaux de toutes les applis seront à jour.




En tout cas et grace à ton aide ça marche nickel et je t'en remercie grandement.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
"car j'ai pris l'habitude de commencer un tableau à 1 dans mes progs."
on peut en débattre, mais je pense que c'est une mauvaise habitude...

pourquoi utiliser une dll ? passes par un fichier de correspondance des caractères...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Oui tu as raison j'aurais pu aussi le faire.(Le fichier)
Mais il faudrait que je crypte ce fichier pour qu'il soit illisible avec notepad.

Mais surtout parce que je met aussi dans la DLL toutes les fonctions de cryptage differentes en plus du tableau de correspondance et au fur et a mesure j'en rajouterais des differentes en plus que je grandirais le tableau, mais la nouvelle DLL gardera toujours les anciens cryptages de façon a etre encore compatible avec tous les prg (anciens et nouveaux)

Tu as toujours raison, je me tate entre la ligne 0 avec la longueur dedans (qui marche tres bien) et la fonction supplementaire qui donne la longueur du tableau (plus pro)
Je vais peut etre t'ecouter, apres tout a quoi ça sert d'avoir les conseils d'un pro comme toi et de ne pas les ecouter ....

Encore merci pour tout