Probleme violation de la mémoire

Résolu
BrokenArrow29 Messages postés 110 Date d'inscription vendredi 1 décembre 2006 Statut Membre Dernière intervention 14 décembre 2011 - 11 oct. 2007 à 21:11
surfzoid Messages postés 463 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 21 avril 2010 - 11 mars 2008 à 18:21
Bonjour,
j'obtiens cette erreur lorsque j'éxécute un petit programme :
"L'exception System.AccessViolationException n'a pas été gérée
Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée."
Détail: System.AccessViolationException
"
Le programme lit une base de donnée et cherche le correspondant dans une autre base de donnée. L'erreur n'arrive jamais au meme endroit ou au meme enregistrement. Parcontre elle arrive toujours lorsque par une fonction (contenu dans un dll qui est en référence) attribue une valeur a une variable. C'est un peu weird ...

Merci de votre aide

14 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
12 oct. 2007 à 20:44
ALors déjà effectivement, comme je disais, tu n'instancie pas correctement tes string avant l'appel. Certes tu les instancies mais de longueur nulle. C'est à dire qu'aucune place n'est réservée en mémoire pour contenir la chaine de caractère. Hors il est probable que ta dll ne soit pas capable de créer une string en mémoire, elle doit juste se contenter (comme la quasi totalité des dlls api) de remplir une zone mémoire déjà occupée par la string à remplir. Dans ce cas là, avant de passer la string à la fonction, il faut veiller à ce que une zone mémoire suffisament grande est effectivement occupée par la dite string, c'est à dire que la string soit de longueur suffisament importante pour acceuillir sa nouvelle valeur.
Dans ton cas, si tant est que ce soit ça le problème, il faut que avant chaque appel, tu initialise chacune des strings avec suffisament de caractères pour que la zone réservée en mémoire soit suffisament grande. Ce qui donnerais le code suivant :

Dim PLAYERFIRST As String
Dim PLAYERCITY As String
Dim PLAYERLAST As String
Dim PLAYERindx As Integer =  0

'PARTIE  DE CODE

'HandleEXH est
mon fichier ouvert de base de donnée.
For I = 0 To (TABLEINFO.RecordCount - 1)

        PLAYERFIRST = New String(vbNullChar, 100)
        PLAYERLAST = New String(vbNullChar, 100)
        PLAYERCITY = New String(vbNullChar, 100)
        PLAYERindx = New String(vbNullChar, 100)

        TDBFieldGetValueAsString(HandleEXH, "SPBT", "FNME", I, PLAYERFIRST)
        TDBFieldGetValueAsString(HandleEXH, "SPBT", "LNME", I, PLAYERLAST)
        TDBFieldGetValueAsString(HandleEXH, "SPBT", "CITY", I, PLAYERCITY)
        TDBFieldGetValueAsString(HandleEXH, "SPBT", "INDX", I, PLAYERindx)

Next

Autre problème possible :
Il te faut vérifier que la ligne de déclaration de ta dll correspond bien à une déclaration pour VB2005 et non pas VB6. En effet entre VB6 et VB2005, le type de variable a changé. Ainsi les integer (vb6) deviennent des short (ou Int16) en VB2005, les longs deviennent des integers.

Si donc ta déclaration avec des integers est prevu ppour VB6, pour l'utiliser avec VB2005, il te faut remplcer les integer par des shorts ou des Int16.

En espérant ne pas t'avoir trop embrouiller

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #   
3