IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

TXMLDocument sans propriétaire : opération de pointeur incorrect


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 254
    Points : 138
    Points
    138
    Par défaut TXMLDocument sans propriétaire : opération de pointeur incorrect
    Bonjour,

    Je suis en Delphi 2006 Win32 sous XP et W7.
    J'ai créé un descendant de TXMLDocument (qui répond au doux nom de TBackToDrawerParamXMLDoc) que j'utilise dans deux projets différents.
    Dans l'un des deux, le TBackToDrawerParamXMLDoc est créé avec, pour propriétaire, une TForm, et tout se passe bien.

    Dans l'autre projet, TBackToDrawerParamXMLDoc est créé localement dans une fonction avec un propriétaire à Nil (TBackToDrawerParamXMLDoc.Create(Nil) ), et là, à l'appel d'une première méthode (qui récupère simplement la valeur d'un attribut d'un noeud), il passe directement dans le destructeur de TBackToDrawerParamXMLDoc ....
    Du coup, dans le FreeAndNil en fin de procédure, boum : opération de pointeur incorrect !

    Après lecture de la doc Delphi 2006, reproduite ci-dessous (et un peu d'aspirine) :
    Les composants TXMLDocument créés lors de l'exécution sans propriétaire sont libérés automatiquement lorsque toutes les références à leur interface IXMLDocument sont libérées. Cela constitue une différence avec les composants TXMLDocument ajoutés à une fiche ou un module de données lors de la conception ou ceux créés avec un propriétaire. Lorsqu'il est ajouté à une fiche ou un module de données lors de la conception, l'objet est libéré explicitement par son Owner (la fiche ou le module de données
    Il semblerait que l'on soit dans ce cas. Les experts de cet honorable forum peuvent-ils me le comfirmer ? Et si oui comment faire pour contourner ce problème.
    Pour info, ci-dessous, le code de ma fonction (PREFIX_CATEGORY et PREFIX_RESULT sont des constantes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    function RelectureDemandee(UneCategorieTest: Integer ; UnCodeResultat, UnCodeResultatEx, UnCodeResultatMS8001: Integer): Boolean;
    var
      BackToDrawerParamXMLDoc : TBackToDrawerParamXMLDoc; // classe pour stockage  des resultats par categorie
      NodeName : string; // nom reconstitué du noeud à partir du numéro de la catégorie
      AttribName : string; // nom reconstitué de l'attribut à partir du numéro du résultat
      XmlNode : IXmlNode;
    begin
      Result := False;
      NodeName := TBackToDrawerParamXMLDoc.PREFIX_CATEGORY + IntToStr(UneCategorieTest);
      AttribName := TBackToDrawerParamXMLDoc.PREFIX_RESULT + IntToStr(UnCodeResultatEx);
     
      BackToDrawerParamXMLDoc := TBackToDrawerParamXMLDoc.Create(Form2);
      BackToDrawerParamXMLDoc.XML.Clear;
      try
      BackToDrawerParamXMLDoc.XML.Add('<?xml version="1.0"?><BackToDrawerParams></BackToDrawerParams>');
      BackToDrawerParamXMLDoc.Active := True;
      XmlNode := BackToDrawerParamXMLDoc.DocumentElement as IXmlNode;
      if BackToDrawerParamXMLDoc.GetAttributeValue(XmlNode, NodeName, AttribName) = 'O' then
        Result := True;
      finally
        FreeANdNil(BackToDrawerParamXMLDoc);
      end;
    end;
    D'avance merci

    Kim

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Par une création sans propriétaire, la variable doit être une interface (ex. IBackToDrawerParamXMLDoc) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      BackToDrawerParamXMLDoc : IBackToDrawerParamXMLDoc; // classe pour stockage des resultats par categorie
     
    begin
      BackToDrawerParamXMLDoc := TBackToDrawerParamXMLDoc.Create(nil);
     
      //L'interface est automatiquement libérée à la sortie de la procédure
      //FreeANdNil(BackToDrawerParamXMLDoc);
    end;

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 254
    Points : 138
    Points
    138
    Par défaut
    Merci Andnotor de ta réponse.

    En effet, je venais juste de comprendre et de résoudre le Pb dans le même esprit que ce que tu proposes, et je venais ici pour mettre à résolu...

    Merci encore

    Kim

  4. #4
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Autre chose importante, les interfaces sont passées automatiquement à nil sur le end de la fonction à laquelle ils appartiennent. Et le passage a nil d'une interface appelle le _Release qui, si il y a un compteur de référence (ce qui est le cas de IXMLNode), détruit l'objet si c’était la dernière référence.
    C'est ce qui se passe avec ton XmlNode , sa méthode _Release est appelée sur le end de ta fonction, hors il a déjà été détruit lors du FreeANdNil(BackToDrawerParamXMLDoc).
    Une simple correction serait de releaser le node avant la déstruction du XmlDoc.

    Citation Envoyé par kimlee Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    function RelectureDemandee(UneCategorieTest: Integer ; UnCodeResultat, UnCodeResultatEx, UnCodeResultatMS8001: Integer): Boolean;
    var
      BackToDrawerParamXMLDoc : TBackToDrawerParamXMLDoc; // classe pour stockage  des resultats par categorie
      NodeName : string; // nom reconstitué du noeud à partir du numéro de la catégorie
      AttribName : string; // nom reconstitué de l'attribut à partir du numéro du résultat
      XmlNode : IXmlNode;
    begin
      Result := False;
      NodeName := TBackToDrawerParamXMLDoc.PREFIX_CATEGORY + IntToStr(UneCategorieTest);
      AttribName := TBackToDrawerParamXMLDoc.PREFIX_RESULT + IntToStr(UnCodeResultatEx);
     
      BackToDrawerParamXMLDoc := TBackToDrawerParamXMLDoc.Create(Form2);
      BackToDrawerParamXMLDoc.XML.Clear;
      try
      BackToDrawerParamXMLDoc.XML.Add('<?xml version="1.0"?><BackToDrawerParams></BackToDrawerParams>');
      BackToDrawerParamXMLDoc.Active := True;
      XmlNode := BackToDrawerParamXMLDoc.DocumentElement as IXmlNode;
      if BackToDrawerParamXMLDoc.GetAttributeValue(XmlNode, NodeName, AttribName) = 'O' then
        Result := True;
      finally
        XmlNode := nil;//va appeler _Release()
        FreeANdNil(BackToDrawerParamXMLDoc);
      end;
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Opération de pointeur incorrecte
    Par colorid dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2010, 18h08
  2. "Opération de pointeur incorrect"
    Par Sancha dans le forum Langage
    Réponses: 5
    Dernier message: 18/11/2009, 12h33
  3. Opération de pointeur incorrecte au Raise d'une exception
    Par stanislas dans le forum Débuter
    Réponses: 5
    Dernier message: 24/06/2009, 11h11
  4. Réponses: 21
    Dernier message: 10/07/2008, 12h09
  5. Message d'erreur 'opération de pointeur incorrecte'
    Par Clotilde dans le forum Langage
    Réponses: 3
    Dernier message: 05/06/2008, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo