🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: fr.comp.text.xml
2 messages
2 total messages Started by Jean-Philippe BRUNET Sun, 15 Oct 2000 06:25
"Caster" une interface "node" en interface "element" dans le DOM microsoft?
#10397
Author: Jean-Philippe BRUNET
Date: Sun, 15 Oct 2000 06:25
56 lines
3187 bytes
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).

Voici le bout de source concern�:
///************************************************
XML SOURCE
///************************************************
<root>
    <table>
        <line>xxx</line>
        <line>yyy</line>
        <line>zzz</line>
    </table>
    <table>
        <line>aaa</line>
        <line>bbb</line>
        <line>ccc</line>
    </table>
</root>
///****************************************************************
C++ SOURCE
///****************************************************************
../..
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.
Re: "Caster" une interface "node" en interface "element" dans le DOM microsoft?
#10400
Author: 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
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads