Partager via


ptr::QueryInterface

Interroge l'objet COM possédé pour une interface et lie le résultat à un autre com::ptr.

template<class _other_type>
void QueryInterface(
   ptr<_other_type> % other
);

Paramètres

  • other
    com::ptr qui obtient l'interface.

Exceptions

En interne, QueryInterface est appelé dans l'objet COM possédé et toute erreur HRESULT est convertie en une exception par ThrowExceptionForHR.

Notes

Utilisez cette méthode pour créer un wrapper COM pour une autre interface de l'objet COM possédé par le wrapper actuel.Cette méthode appelle QueryInterface via l'objet COM possédé pour demander un pointeur vers une interface spécifique de l'objet COM et associe le pointeur d'interface retourné à com::ptrpassé.

Exemple

Cet exemple implémente une classe CLR qui utilise com::ptr pour encapsuler son objet d' IXMLDOMDocument de membre privé.La fonction membre d' WriteTopLevelNode utilise QueryInterface pour remplir com::ptr local avec IXMLDOMNode puis passe com::ptr (par référence de suivi) à une fonction membre privée qui écrit le nom et les propriétés texte de nœud dans la console.

// comptr_queryinterface.cpp
// compile with: /clr /link msxml2.lib
#include <msxml2.h>
#include <msclr\com\ptr.h>

#import <msxml3.dll> raw_interfaces_only

using namespace System;
using namespace System::Runtime::InteropServices;
using namespace msclr;

// a ref class that uses a com::ptr to contain an 
// IXMLDOMDocument object
ref class XmlDocument {
public:
   // construct the internal com::ptr with a null interface
   // and use CreateInstance to fill it
   XmlDocument(String^ progid) {
      m_ptrDoc.CreateInstance(progid);   
   }

   void LoadXml(String^ xml) {
      pin_ptr<const wchar_t> pinnedXml = PtrToStringChars(xml);
      BSTR bstr = NULL;

      try {
         // load some XML into our document
         bstr = ::SysAllocString(pinnedXml);
         if (NULL == bstr) {
            throw gcnew OutOfMemoryException;
         }
         VARIANT_BOOL bIsSuccessful = false;
         // use operator -> to call IXMODOMDocument member function
         Marshal::ThrowExceptionForHR(m_ptrDoc->loadXML(bstr, &bIsSuccessful));
      }
      finally {
         ::SysFreeString(bstr);
      }
   }

   // write the top level node to the console
   void WriteTopLevelNode() {
      com::ptr<IXMLDOMNode> ptrNode;

      // query for the top level node interface
      m_ptrDoc.QueryInterface(ptrNode);
      WriteNode(ptrNode);
   }

   // note that the destructor will call the com::ptr destructor
   // and automatically release the reference to the COM object

private:
   // simplified function that only writes the node
   void WriteNode(com::ptr<IXMLDOMNode> % node) {
      BSTR bstr = NULL;

      try {
         // write out the name and text properties
         Marshal::ThrowExceptionForHR(node->get_nodeName(&bstr));
         String^ strName = gcnew String(bstr);
         Console::Write("<{0}>", strName);
         ::SysFreeString(bstr);
         bstr = NULL;

         Marshal::ThrowExceptionForHR(node->get_text(&bstr));
         Console::Write(gcnew String(bstr));
         ::SysFreeString(bstr);
         bstr = NULL;

         Console::WriteLine("</{0}>", strName);
      }
      finally {
         ::SysFreeString(bstr);
      }
   }

   com::ptr<IXMLDOMDocument> m_ptrDoc;
};

// use the ref class to handle an XML DOM Document object
int main() {
   try {
      // create the class from a progid string
      XmlDocument doc("Msxml2.DOMDocument.3.0");

      // stream some xml into the document
      doc.LoadXml("<word>persnickety</word>");

      // write the document to the console
      doc.WriteTopLevelNode();
   }
   catch (Exception^ e) {
      Console::WriteLine(e);   
   }
}
  

Configuration requise

fichier d'en-tête<msclr \ COM \ ptr.h>

Msclr::com deEspace de noms

Voir aussi

Référence

ptr::GetInterface

Autres ressources

membres PTR