com::ptr Class
Wrapper pour un objet COM qui peut être utilisé comme membre d'une classe CLR.Le wrapper automatise également la gestion de la durée de vie des objets COM, et libère toutes les références possédées sur l'objet lorsque le destructeur est appelé.Analogue à CComPtr, classe.
template<class _interface_type>
ref class ptr;
Paramètres
- _interface_type
Interface COM.
Notes
com::ptr peut également être utilisé comme une variable de fonction locale pour simplifier différentes tâches COM et automatiser la gestion de la durée de vie.
com::ptr ne peut pas être utilisé directement comme paramètre de fonction ; utilisez Opérateur de référence de suivi (extensions du composant C++) ou Handle sur l'opérateur Object (^) (extensions du composant C++) à la place.
com::ptr ne peut pas être directement retourné depuis une fonction ; utilisez un handle à la place.
Exemple
Cet exemple implémente une classe CLR qui utilise com::ptr pour encapsuler son objet d' IXMLDOMDocument de membre privé.Appeler les méthodes publiques d'une classe entraîne des appels à l'objet contenu d' IXMLDOMDocument .L'exemple crée une instance d'un document XML, la remplit avec un certain XML simple, et fait examen simplifiée des nœuds dans l'arborescence analysée de document à imprimer XML dans la console.
// comptr.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 the 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);
}
}
// simplified function to write just the first xml node to the console
void WriteXml() {
IXMLDOMNode* pNode = NULL;
try {
// the first child of the document is the first real xml node
Marshal::ThrowExceptionForHR(m_ptrDoc->get_firstChild(&pNode));
if (NULL != pNode) {
WriteNode(pNode);
}
}
finally {
if (NULL != pNode) {
pNode->Release();
}
}
}
// 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(IXMLDOMNode* pNode) {
BSTR bstr = NULL;
try {
// write out the name and text properties
Marshal::ThrowExceptionForHR(pNode->get_nodeName(&bstr));
String^ strName = gcnew String(bstr);
Console::Write("<{0}>", strName);
::SysFreeString(bstr);
bstr = NULL;
Marshal::ThrowExceptionForHR(pNode->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.WriteXml();
}
catch (Exception^ e) {
Console::WriteLine(e);
}
}
Configuration requise
fichier d'en-tête<msclr \ COM \ ptr.h>
Msclr::com deEspace de noms