ptr::QueryInterface

Las consultas el objeto COM propiedad para una interfaz y asocia el resultado a otro com::ptr.

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

Parámetros

  • other
    com::ptr que obtendrá la interfaz.

Excepciones

Internamente, QueryInterface se llama en el objeto COM en propiedad y los errores HRESULT se convierte en una excepción por ThrowExceptionForHR.

Comentarios

Utilice este método para crear un contenedor COM para otra interfaz de objeto COM que pertenece al contenedor actual.Este método llama a QueryInterface a través del objeto COM propiedad para solicitar un puntero a una interfaz específica del objeto COM y asocia el puntero devuelto de interfaz a com::ptrpasada.

Ejemplo

Este ejemplo implementa una clase CLR que utilice com::ptr para ajustar su objeto de IXMLDOMDocument miembro privado.La función miembro de WriteTopLevelNode utiliza QueryInterface para rellenar com::ptr local con IXMLDOMNode y pasa com::ptr (siguiendo referencia) a una función miembro privado que escriba el nombre y las propiedades de texto de nodo en la consola.

// 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);   
   }
}
  

Requisitos

archivo de encabezado <msclr \ COM \ ptr.h>

Msclr::com deespacio de nombres

Vea también

Referencia

ptr::GetInterface

Otros recursos

miembros de la PTR