Message d'erreur, api windows ?

lotfi213_b19 Messages postés 36 Date d'inscription dimanche 31 décembre 2006 Statut Membre Dernière intervention 31 juillet 2010 - 11 oct. 2007 à 16:12
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 11 oct. 2007 à 23:41
bonjour a tous,
j'aimerais bien savoir la raison du message d'erreur :
Violation d'acces a l'addresse 0000000000 dans le module "project1.exe"

surtout dans les applcations utilisant les api windows
merci d'avance

7 réponses

lotfi213_b19 Messages postés 36 Date d'inscription dimanche 31 décembre 2006 Statut Membre Dernière intervention 31 juillet 2010
11 oct. 2007 à 16:13
d'autre facon,je demande plus de details sur ce genre de problemes
merci
0
dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
11 oct. 2007 à 16:29
Bonjour,
Ce sont des objets créés mais pas libérés en général ....
Si tu fais un pas à pas , cela peut te permettre de trouver l'erreur.
Sinon, utilises quelque chose comme Memcheck ...

Dom
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
11 oct. 2007 à 18:50
c'est que tu (ou l'api windows) essaye d'acceder a des pointeurs nil (=0).
Verifie que tu utilise correctement les fonctions de l'api.
Certaines fonctions necessite que tu leur passe un buffer qu'elles remplissent. si tu n'as pas initialisé le buffer, tu obtiens une erreur de ce type
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
11 oct. 2007 à 19:14
Un objet non libéré ne provoque pas d'erreur ... du moins il ne le doit pas.
tant qu'une instance est valide il ne peut pas y'avoir de violation d'accés a cette derniere.

par contre, une instance non allouée ou deja libérée devient irremediablement invalide et donc un appel a une telle instance provoque immediatement une violation d'accés car l'addresse memoire ne pointe plus sur un espace memoire valide.

c'est pour cela qu'il existe des fonctions tel Assigned ou FreeAndNil ou même la valeur Nil (Null).

une reference (objet ou pointeur) doit toujours etre remis a Nil pendant l'execution d'un programme, car tant que ce n'est pas fait l'instance contient toujours une addresse memoire.
cette reference n'est rien d'autre qu'une variable qui stocke une addresse memoire sur un entier 32bit, cette addresse memoire nous permet d'acceder a un espace memoire qui vas contenir les données soit d'un objet, soit d'un type quand il s'agit d'un pointeur.

il une erreur frequente, qui aboutie sur une violation d'accés :

- l'appel d'un constructeur de classe sans assignation de son retour (appel direct de Create sans assignation) :
  "MonObjet.Create" au lieu de "MonObjet := ClasseObjet.Create" ou "With ClasseObjet.Create do"

qu'est-ce qui se passe dans ce cas :

MonObjet.Create; { on crée une reference mais elle est immediatement perdue }
MonObjet.Caption := 'oops'; { violation d'accés, MonObjet n'est pas une reference valide }
MonObjet.Free; { violation d'accés, MonObjet n'est pas une reference valide }

par contre :

MonObjet := ClasseObjet.Create; { on crée une reference est elle est assignée a MonObjet }
MonObjet.Caption := 'ouf!'; { pas de probleme }
MonObjet.Free; { pas de probleme ici non plus }
MonObjet.Caption := 'i''m an idiot!'; { violation d'accés sur tentative d'accés a une instance detruite }

With ... Do fonctionne comme si on utilisait la variable MonObjet donc :

with ClasseObjet.Create do { pas de probleme }
try
  Caption := 'youpi!'; { pas de probleme }
finally { assure la certitude de la liberation }
  Free; { pas de probleme }
  Caption := 'Idée stupide'; { violation d'accés sur tentative d'accés a une instance detruite }
end;

remettre a Nil une reference permet d'effectuer un test simple avant un code, ce test permet de reduire les violation d'accés, mais on devrat toujours etre vigilant a ce que l'on fait.

on peut donc faire :

if not Assigned(MonObjet) then { assure qu'on ne vas pas ecrasser une instance existante }
  MonObjet := ClasseObjet.Create;

try
  { exploitation de MonObjet }
finally
  FreeAndNil(MonObjet); { libere et remet a nil la reference pour assigned() }
end;
 
voila pour les objets, le concept est le même pour les pointeurs, car une reference d'objet n'est rien d'autre qu'un pointeur, a peu de choses prés.

<hr size="2" width="100%" />
http://deefaze.gnomz.com
0

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

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
11 oct. 2007 à 19:21
pour les API travaillant surtout avec des pointeur ou handle il y a deux test a faire pour s'assurer qu'une reference est valide :

pour un Handle :

if MonHandle <> INVALID_HANDLE_VALUE then ... on peu l'utiliser

pour un pointeur :

if MonPointeur <> Nil then ... on peu l'utiliser

et pour un objet (rappel) :

if Assigned(MonObjet) then ... on peu l'utiliser

cela t'eviteras les problemes de violation d'accés. par contre, si ta reference a été mal libérée ou mal initialisée tu aura d'autres erreurs qui surviendront.
donc il ne faut pas oublier :
- de tester si on ne vas pas ecraser une instance existante avant de la créée.
- de tester la validitée d'une instance avant d'y acceder.
- de liberer correctement une instance (grace a Try Finally ou Try Except).
- de bien finaliser les references (par remise a Nil (pointeur et objet) ou Invalid_Handle_Value (handle, dc, hwnd))

<hr size="2" width="100%" />
http://deefaze.gnomz.com
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
11 oct. 2007 à 21:09
tres bonne explication foxi.
mais tu as oublié de preciser un cas : la multireference.
par exemple

procedure TMonObjet.Reset;

begin [@UnSousObjet = $XXXX]

  Self.UnSousObjet.free;

  ...
  Self.UnSousObjet :TSousObjet.Create; [@UnSousObjet $YYYY]

end;
x :MonObjet.UnSousObjet [@x $1234]

 ... traitements ...

MonObjet.Reset; [@UnSousObjet = $3456]

x.UneFonction; [@x = $1234]// la reference n'est plus valide => plantage (violation d'acces 0x00001234)

Mais dans ton cas lofti, la violation 00000000 signifie que tu essaye d'acceder un une variable non ilitialisée (nil ou NULL)
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
11 oct. 2007 à 23:41
Le titre du sujet n'a rien à voir avec le contenu, je supprime le thread ou je modifie le titre ?
allez, je modifie ... mais gaffe,  la prochaine fois mets un vrai titre.
0
Rejoignez-nous