Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gibt den Besitz des COM-Objekts auf und gibt einen Zeiger auf das Objekt zurück.
_interface_type * Detach();
Rückgabewert
Der Zeiger auf das COM-Objekt.
Wenn kein Objekt gehört, wird NULL zurückgegeben.
Ausnahmen
Intern wird QueryInterface um dem Besitzen COM-Objekt aufgerufen, und jeder Fehler HRESULT wird einer Ausnahme durch ThrowExceptionForHR konvertiert.
Hinweise
Detach fügt zunächst einen Verweis auf das COM-Objekt im Namen des Aufrufers hinzufügen und dann alle Versionen verweist. com::ptr von BesitzDer Aufrufer muss das zurückgegebene Objekt letztendlich freigeben, um es zu zerstören.
Beispiel
In diesem Beispiel implementiert eine CLR-Klasse, die com::ptr verwendet, um den IXMLDOMDocument-Objekt des privaten Members zu umschließen.Die DetachDocument-Memberfunktionsaufrufe Detach, der den Besitz des COM-Objekts an den Aufrufer zurückzugeben und eines Zeigers aufzugeben.
// comptr_detach.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);
}
// detach the COM object and return it
// this releases the internal reference to the object
IXMLDOMDocument* DetachDocument() {
return m_ptrDoc.Detach();
}
// note that the destructor will call the com::ptr destructor
// and automatically release the reference to the COM object
private:
com::ptr<IXMLDOMDocument> m_ptrDoc;
};
// unmanaged function that loads XML into a raw XML DOM Document object
HRESULT LoadXml(IXMLDOMDocument* pDoc, BSTR bstrXml) {
HRESULT hr = S_OK;
VARIANT_BOOL bSuccess;
hr = pDoc->loadXML(bstrXml, &bSuccess);
if (S_OK == hr && !bSuccess) {
hr = E_FAIL;
}
return hr;
}
// use the ref class to handle an XML DOM Document object
int main() {
IXMLDOMDocument* pDoc = NULL;
BSTR bstrXml = NULL;
try {
// create the class from a progid string
XmlDocument doc("Msxml2.DOMDocument.3.0");
bstrXml = ::SysAllocString(L"<word>persnickety</word>");
if (NULL == bstrXml) {
throw gcnew OutOfMemoryException("bstrXml");
}
// detach the document object from the ref class
pDoc = doc.DetachDocument();
// use unmanaged function and raw object to load xml
Marshal::ThrowExceptionForHR(LoadXml(pDoc, bstrXml));
// release document object as the ref class no longer owns it
pDoc->Release();
pDoc = NULL;
}
catch (Exception^ e) {
Console::WriteLine(e);
}
finally {
if (NULL != pDoc) {
pDoc->Release();
}
}
}
Anforderungen
Headerdatei <msclr \ COM \ ptr.h>
Namespace msclr::com