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

C++Builder Discussion :

Violation d'accès lors utilisation TXMLDocument dynamiquement


Sujet :

C++Builder

  1. #1
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 437
    Points
    1 437
    Par défaut Violation d'accès lors utilisation TXMLDocument dynamiquement
    Bonjour,

    Dans le besoin d'un traitement multithread utilisant XML, je ne peux pas utiliser le composant TXMLDocument en glissant seulement de la palette Internet ce composant; je dois avoir un TXMLDocument pour chaque thread
    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
    void __fastcall TMyThread::Treatment()
    {
    TXMLDocument* pXmlDoc = new TXMLDocument("");
    pXmlDoc->DOMVendor = GetDOMVendor("MSXML");
    pXmlDoc->Active = true;
    AnsiString str = "<MainForm><Height>480</Height><!--Salut--><Width>696</Width><Top>107</Top><Left>233</Left><Panel1><Caption>Panel1</Caption><Color>clBtnFace</Color><Boolean>0</Boolean><Strings>Rijaniaina</Strings></Panel1></MainForm>";
    pXmlDoc->LoadFromXML(str);
    _di_IXMLNodeList xmlRootNode = pXmlDoc->DocumentElement->ChildNodes;//surely MainForm
    MainForm->Height =  StrToInt(xmlRootNode->Nodes[WideString("Height")]->Text);
    MainForm->Width = StrToInt(xmlRootNode->Nodes[WideString("Width")]->Text);
    MainForm->Top =  StrToInt(xmlRootNode->Nodes[WideString("Top")]->Text);
    MainForm->Left = StrToInt(xmlRootNode->Nodes[WideString("Left")]->Text);
    _di_IXMLNodeList xmlPanelNode = xmlRootNode->Nodes[WideString("Panel1")]->ChildNodes;
    Panel1->Caption = xmlPanelNode->Nodes[WideString("Caption")]->Text;
    Panel1->Color = StringToColor(xmlPanelNode->Nodes[WideString("Color")]->Text);
    CheckBox1->Checked = StrToBool(xmlPanelNode->Nodes[WideString("Boolean")]->Text);
    Memo1->Lines->CommaText = xmlPanelNode->Nodes[WideString("Strings")]->Text;
    }
    J'ai une exception de violation d'accès à l'adresse 0x00000000 à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _di_IXMLNodeList xmlRootNode = pXmlDoc->DocumentElement->ChildNodes;//surely MainForm
    , il semble que ->DocumentElement est NULL. Pourquoi? Qu'est-ce qu'il y a d'erroné dans ce code, ça me semble complet pour invoquer dynamiquement un XMLDocument!!!
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  2. #2
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    A tout hasard, ca n'a rien a voir avec ce qui est dis: la dedans ?

    ++
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  3. #3
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 437
    Points
    1 437
    Par défaut
    En effet, si j'utilise dans tous mes Execute() le XMLDocument que j'ai draggé sur ma fiche, il y aura les problèmes de synchronisation comme INTERBLOCAGE et FAMINE !!! Et même si je gère la synchronisation, ce sera plus lent que d'invoquer dynamiquement TXMLDocument !
    J'ai par exemple le cas où il y avait erreur dans la chaîne XML utilisé, le programme plante carrément à toute utilisation du composant XML sur la fiche, c'est là la nécessité d'utilisation dynamiquement et le delete-er à la fin de Execute()!

    En effet Sunchaser, c'est tout à fait le même problème que moi, j'ai du faire une recherche avant de poser ma question
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  4. #4
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 437
    Points
    1 437
    Par défaut
    Voici donc le code résultant
    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
    void __fastcall TMyThread::Treatment()
    {
    _di_IXMLDocument d;
     
    TXMLDocument* pXmlDoc = new TXMLDocument("");
    pXmlDoc->DOMVendor = GetDOMVendor("MSXML");
     
    pXmlDoc->GetInterface(d);
     
    pXmlDoc->Active = true;
    AnsiString str = "<MainForm><Height>480</Height><!--Salut--><Width>696</Width><Top>107</Top><Left>233</Left><Panel1><Caption>Panel1</Caption><Color>clBtnFace</Color><Boolean>0</Boolean><Strings>Rijaniaina</Strings></Panel1></MainForm>";
    pXmlDoc->LoadFromXML(str);
    _di_IXMLNodeList xmlRootNode = pXmlDoc->DocumentElement->ChildNodes;//surely MainForm
    MainForm->Height =  StrToInt(xmlRootNode->Nodes[WideString("Height")]->Text);
    MainForm->Width = StrToInt(xmlRootNode->Nodes[WideString("Width")]->Text);
    MainForm->Top =  StrToInt(xmlRootNode->Nodes[WideString("Top")]->Text);
    MainForm->Left = StrToInt(xmlRootNode->Nodes[WideString("Left")]->Text);
    _di_IXMLNodeList xmlPanelNode = xmlRootNode->Nodes[WideString("Panel1")]->ChildNodes;
    Panel1->Caption = xmlPanelNode->Nodes[WideString("Caption")]->Text;
    Panel1->Color = StringToColor(xmlPanelNode->Nodes[WideString("Color")]->Text);
    CheckBox1->Checked = StrToBool(xmlPanelNode->Nodes[WideString("Boolean")]->Text);
    Memo1->Lines->CommaText = xmlPanelNode->Nodes[WideString("Strings")]->Text;
    delete pXmlDoc;
    }
    L'exception que j'obtiens maintenant c'est à la fin de cette fonction: une violation d'accès lors du delete!!! Peut-être que C++ Builder le fait automatiquement ou quoi ?

    Ma dernière question est donc: puisque MSXML, il faut l'installer donc mon application ne sera pas portable??
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  5. #5
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Post ajouté avant le Rollback

    Citation Envoyé par copeau31
    Up.. j'ai le même problème que randriano, avec une violation d'acces lors du delete d'un TXMLDocument qui a fait un GetInterface...

    Tu as trouvé, randriano ?
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

Discussions similaires

  1. BCB 6 / Violation d'accès après utilisation d'une DLL
    Par a_lincoln54 dans le forum C++Builder
    Réponses: 1
    Dernier message: 28/04/2008, 14h15
  2. [ADO] Violation d'accès en utilisant EditConnectionString
    Par Kephuro dans le forum Bases de données
    Réponses: 7
    Dernier message: 02/04/2008, 16h22
  3. Violation d'accès lors de la lecture
    Par Fullmetal82 dans le forum C++
    Réponses: 9
    Dernier message: 29/11/2007, 17h13
  4. Violation d'acces lors d'une destruction d'un composant
    Par Rayek dans le forum Composants VCL
    Réponses: 15
    Dernier message: 23/11/2005, 11h37
  5. Violation d'accès sur un TXMLDocument
    Par WebPac dans le forum Composants VCL
    Réponses: 14
    Dernier message: 15/03/2005, 15h10

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