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

Composants VCL Delphi Discussion :

XMLDocument.LoadFromXML : Violation d'accès


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Points : 81
    Points
    81
    Par défaut XMLDocument.LoadFromXML : Violation d'accès
    Salut,
    J'essaie tant bien que mal de lire le retour XML d'une requête POST, mais je me ramasse une jolie erreur.

    Mon code:

    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
    26
    27
     
        // ici pour le DEBUG, je copie le retour XML de la connexion dans une variable, car tout est OK de ce côté, et ça embrouillerait le code.
     
        Reponse := '<?xml version="1.0" encoding="UTF-8" ?><mt><return><status>0</status><error>METHOD NOT ALLOWED</error></return></mt>';
     
        with TXMLDocument.Create(nil) do
        try
     
        LoadFromXML(Reponse);
        Active := True;
     
        XMLReponseString := ChildNodes.Nodes['mt'].ChildNodes.Nodes['return'].ChildNodes.Nodes['status'].Text;
     
        if(XMLReponseString = '0') then
        begin
          Result := False;
        end
        else
        begin
          Result := True;
        end;
     
        Active := False;
     
        finally
          Free;
        end;
    Le système m'envoie a la merde avec ceci:

    ---------------------------
    Notification d'une exception du débogueur
    ---------------------------
    Le projet Encoder.exe a provoqué une classe d'exception EAccessViolation avec le message 'Violation d'accès à l'adresse FFFF0000. Lecture de l'adresse FFFF0000'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
    ---------------------------
    OK Aide
    ---------------------------

    Merci de votre aide

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Tu devrais tester à chaque étage que le noeud est bien retourné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    XNdoe : IXMLNode;
    ...
    XNode := ChildNodes.Nodes['mt']
    If XNode<>Nil then...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Points : 81
    Points
    81
    Par défaut
    Toujours une violation d'accès !!


    Erreur a la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (XMLNode1 <> nil) then
    Le code:

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
       Reponse := '<?xml version="1.0" encoding="UTF-8" ?><mt><return><status>0</status><error>METHOD NOT ALLOWED</error></return></mt>';
     
        with TXMLDocument.Create(nil) do
        try
     
          LoadFromXML(Reponse);
          Active := True;
     
          XMLNode1 := ChildNodes.Nodes['mt'];
     
          if (XMLNode1 <> nil) then
          begin
            ShowMessage('La node MT est vide.');
          end
          else
          begin
     
          XMLNode2 := XMLNode1.ChildNodes.Nodes['return'];
     
            if (XMLNode2 <> nil) then
            begin
              ShowMessage('La node Return est vide.');
            end
            else
            begin
              ShowMessage(XMLNode2.ChildNodes.Nodes['status'].Text);
            end;
     
          end;
     
          if (XMLReponseString = '0') then
          begin
            Result := False;
          end
          else
          begin
            Result := True;
          end;
     
          Active := False;
     
        finally
          Free;
        end;

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour, première remarque dans ton algorithme tu t'es trompé car tu dois tester XMLNode1 = NIL alors erreur au lieu de XMLNode1 <> NIL.

    Ensuite pour le premier noeud pourquoi ne tenterait-tu pas de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XMLNode1 := DocumentElement;

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Points : 81
    Points
    81
    Par défaut
    encore et toujours violation d'accès alors que les erreurs doivent être gerées à présent ...

    et le mieux c'est qu'a présent l'IDE ne me dit même pas ou il bloque.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
        Reponse := '<?xml version="1.0" encoding="UTF-8" ?><mt><return><status>0</status><error>METHOD NOT ALLOWED</error></return></mt>';
     
        with TXMLDocument.Create(nil) do
        try
          //XML :=Reponse; // MARCHE PAS ?
          LoadFromXML(Reponse);
          Active := True;
     
          XMLNode1 := DocumentElement;
     
          if (XMLNode1 = nil) then
          begin
            ShowMessage('La node MT est vide.');
          end
          else
          begin
     
          XMLNode2 := XMLNode1.ChildNodes.Nodes[0];
     
            if (XMLNode2 = nil) then
            begin
              ShowMessage('La node Return est vide.');
            end
            else
            begin
              ShowMessage(XMLNode2.ChildNodes.Nodes['status'].Text);
            end;
     
          end;
     
          if (XMLReponseString = '0') then
          begin
            Result := False;
          end
          else
          begin
            Result := True;
          end;
     
          Active := False;
     
        finally
          Free;
        end;

  6. #6
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    En pas à pas l'erreur est sur : XMLNode1 := ChildNodes.Nodes['mt'];
    DocumentElement ne marche pas ici. (Violation d'accès)


    J'ai essayé d"insérer (je n'aime pas les with pour le débugage, j'ai mis une variable):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var
      test : WideString; // Caractère Unicode comme la représentation mémoire du fichier XML.
    begin
      // ...
      // Le noeud fils 1 correspond à mt
          test := document.ChildNodes.Nodes[1].NodeName;
     
          XMLNode1 := document.ChildNodes.Nodes[test];
      // ...
    Et je me retrouve avec une erreur abstraite au lieu de la violation d'accès.

    Par contre, retrouver une node par son nom me paraît bizarre de cette, façon, car si plusieurs nodes ont le même nom, il est impossible de récupérer la deuxième.

    Solution:
    Passer par une boucle sur les ChildNodes et tester la NodeName est bien 'mt' et ainsi de suite.

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Est-ce que vous effectuez une lecture asynchrone (poAsyncLoad dans la propriété ParseOptions) ?

    Par ailleurs il y a un truc que j'ai lu dans l'aide de Delphi à propos de la méthode LoadFromXml et qui me fait tiquer, je cite :

    Le paramètre XML est une chaîne contenant le texte d'un document XML.Il doit représenter le texte XML codé en utilisant UTF-8,Unicode ou UTF-16.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Points : 81
    Points
    81
    Par défaut
    Solution??
    Que faire pour lire la valeur de STATUS dans cette chaine qui restera toujours FIXE:

    <?xml version="1.0" encoding="UTF-8" ?><mt><return><status>0</status><error>METHOD NOT ALLOWED</error></return></mt>
    Merci

  9. #9
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    Par contre en posant un document TXMLDocument et en renseignant la propriété XML directement dans l'éditeur le code de départ fonctionne.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Points : 81
    Points
    81
    Par défaut
    Arf.... mais je ne peux pas.
    Le code va être ajouté dans une DLL.

    Je code dans une application classique pour avoir des contrôles de test.

  11. #11
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    C'était juste pour dire que c'est sûrement au niveau de la construction qu'il y a un problème. Il me smeble qu'il faut absolument un Owner au TXMLDocument pour qu'il fonctionne correctement.

    Et en passant directement par l'interface ça fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var
        document : IXMLDocument;
    begin
        document := LoadXMLData(Reponse);
    Le reste ne change pas normalement.
    Pas de free.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Points : 81
    Points
    81
    Par défaut
    La réponse est ici:

    http://www.developpez.net/forums/showthread.php?t=32043



    with TXMLDocument.Create(nil) do

    deviens:

    with TXMLDocument.Create(application) do

    Merci quand même ;-)

  13. #13
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    Salut

    si c'est dans une dll je croit me souvenir que tu doit faire un
    CoInitialize avant l'utilisation de ton object

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure FaireQuelqueChose;
    var
      Document: IXMLDocument;
    begin
      Document := TXMLDocument.Create(nil);
      Document.loadFromXml(...);
     
    end;
     
    begin
      CoInitialize(nil);
      FaireQuelqueChose;
      CoUninitialize;
    end.
    @+ Phil

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Points : 81
    Points
    81
    Par défaut
    Alors là, on a un sérieux problème:


    Dans une application ceci ne fonctionne pas :

    TXMLDocument.Create(nil);

    Ceci fonctionne :

    TXMLDocument.Create(application);


    (Déjà là, c'est une victoire )

    Mais, dans ma DLL : aucun des deux ne fonctionne:


    TXMLDocument.Create(nil); = Erreur
    TXMLDocument.Create(application); donne ceci:


    [Erreur] dll.pas(106): Identificateur non déclaré : 'application'
    [Erreur] dll.pas(106): Aucune version surchargée de 'Create' ne peut être appelée avec ces arguments

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Points : 81
    Points
    81
    Par défaut
    J'ai même essayé des Coinitialize .. quedalle.
    J'abandonne, j'ai ouvert VB, c'est codé, c'est pesé, ca tourne.

  16. #16
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    utilise Txmlcursor si tu ne veut pas t'embeter

    @+ Phil

  17. #17
    Membre averti

    Profil pro
    Enseignant
    Inscrit en
    Juillet 2003
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2003
    Messages : 296
    Points : 441
    Points
    441
    Par défaut
    Et utiliser l'API MSXML au lieu de TXMLDocument, tu n'aurais pas moins de problèmes ?

Discussions similaires

  1. ReportPrinterDialog (QR2) : violation d'accès..
    Par Harry dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 14h04
  2. [XMLDocument] Violation d'accès
    Par xant dans le forum Composants VCL
    Réponses: 8
    Dernier message: 29/09/2004, 15h39
  3. requete / violation d'accès
    Par marie253 dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/08/2004, 13h29
  4. Violation d'acces apres Execute
    Par SegmentationFault dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 10/08/2004, 16h23
  5. Violation d'accès apres Close
    Par SegmentationFault dans le forum Bases de données
    Réponses: 3
    Dernier message: 05/07/2004, 16h46

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