🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fr.comp.text.xml
Article #10400

Re: "Caster" une interface "node" en interface "element" dans le DOM microsoft?

#10400
From: Mathieu Poumeyrol
Date: Mon, 16 Oct 2000 00:00
56 lines
3262 bytes
Bon, c'est pas vraiment une question XML, mais je vais repondre quand meme...

On Sun, 15 Oct 2000 08:25:23 +0200, 
Jean-Philippe BRUNET <jean-philippe.brunet@libertysurf.fr> wrote:
>Je travaille en C++ en environnement Microsoft.
>Quelqu'un sait-il comment on peut r�cup�rer une interface
>MSXML2::IXMLDOMElement � partir d'une interface MSXML2::IXMLDOMNode bien sur
>quand le "node" est un "�l�ment".
>La doc dit que IXMLDOMElement  h�rite deIXMLDOMNode  mais je ne connais pas
>la formule magique pour "caster" un objet interface en un autre (un "cast"
>C++ standard crashe m�chamment).
>
>HRESULT hr;
>bstr_t str = "/root/table";
>  MSXML2::IXMLDOMNodeList *list ;
>  MSXML2::IXMLDOMNode       *item ;
>  MSXML2::IXMLDOMElement   *element ;
>  hr= m_XmlDom->selectNodes(str,&list);
>  ASSERT(hr== S_OK)    ;
>  long len ;
>  list->get_length(&len) ;// V�rifie que l'on a deux tables
>  for(int i=0;hr== S_OK && i< len ;i++){ // Accede aux deux tables
>successivement
>       BSTR src ;
>       hr = list->get_item(i,&item);// R�cup�re un NODE, tout va bien
>       ASSERT(hr== S_OK)    ;
>       hr= item->get_nodeType(&nodeType);// Verifie que le node est bien un
>�l�ment, ca va toujours
>       ASSERT(hr== S_OK)    ;
>       ASSERT(nodeType == NODE_ELEMENT);
>      //********************************************************
>      // ***** A partir de l�, je d�croche, il faudrait r�cup�rer l'�l�ment.
>HELP!****
>      //********************************************************
>    // j'ai essay� histoire de rigoler
>      // element = (MSXML2::IXMLDOMElement   *) item    ;
>      //Ca plante violent
>     // Que faire en fait. il doit bien exister une formule magique pour
>"caster" une interface dans un de ses descendants
>    //ou une facon en DOM de reconstruire un �l�ment existant.

ce sont des objets COM, il faut donc utiliser QueryInterface pour caster
essayes quelque chose du genre (de tete, hein, je suis pas sur que ca 
compile en l'etat)

hr = item->QueryInterface(__uuidof(IXMLDOMElement), (void**)&element);

Je te conseille aussi d'utiliser
ASSERT(SUCCEEDED(hr)) plutot que ASSERT(hr == S_OK);

Enfin lorsqu'on veut down-caster des object C++, il est preferable d'utiliser
le cast dynamique au lieu du cast statique (mais pour les objets COM, le 
query interface est obligatoire).

-- 
Mathieu Poumeyrol
Technical Details
Message-ID: <slrn8uld5q.qap.kali@zen.via.ecp.fr>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <8sbi8m$18l4$1@news5.isdnet.net>

Show Full Headers
Complete Article Headers
X-Google-Language: FRENCH,ASCII
X-Google-Thread: 114f60,6013863413d8b177
X-Google-Attributes: gid114f60,public
From: kali@via.ecp.fr (Mathieu Poumeyrol)
Subject: Re: "Caster" une interface "node" en interface "element" dans le DOM microsoft?
Date: 2000/10/16
Message-ID: <slrn8uld5q.qap.kali@zen.via.ecp.fr>
X-Deja-AN: 681967780
Content-Transfer-Encoding: 8bit
References: <8sbi8m$18l4$1@news5.isdnet.net>
Content-Type: text/plain; charset=iso-8859-15
X-Complaints-To: ingesys@cti.ecp.fr
X-Trace: smilodon.ecp.fr 971683002 12007 138.195.130.71 (16 Oct 2000 07:56:42 GMT)
Organization: Ecole Centrale Paris : Grde Voie des Vignes, 92295 Chatenay-Malabry Cdx
Mime-Version: 1.0
User-Agent: slrn/0.9.6.2 (Linux)
Reply-To: kali@via.ecp.fr
NNTP-Posting-Date: 16 Oct 2000 07:56:42 GMT
Newsgroups: fr.comp.text.xml