--- title: "ptr::Attach | Microsoft Docs" ms.custom: "" ms.date: "11/04/2016" ms.reviewer: "" ms.suite: "" ms.technology: - "cpp-windows" ms.tgt_pltfrm: "" ms.topic: "reference" f1_keywords: - "msclr::com::ptr::Attach" - "ptr::Attach" - "ptr.Attach" - "msclr.com.ptr.Attach" dev_langs: - "C++" helpviewer_keywords: - "Attach method" ms.assetid: 81d930de-cb2a-4c30-9bd6-94d65942c47a caps.latest.revision: 8 author: "mikeblome" ms.author: "mblome" manager: "ghogen" translation.priority.ht: - "cs-cz" - "de-de" - "es-es" - "fr-fr" - "it-it" - "ja-jp" - "ko-kr" - "pl-pl" - "pt-br" - "ru-ru" - "tr-tr" - "zh-cn" - "zh-tw" --- # ptr::Attach Attaches a COM object to a `com::ptr`. ## Syntax ``` void Attach( _interface_type * _right ); ``` #### Parameters `_right` The COM interface pointer to attach. ## Exceptions If the `com::ptr` already owns a reference to a COM object, `Attach` throws . ## Remarks A call to `Attach` references the COM object but does not release the caller's reference to it. Passing `NULL` to `Attach` results in no action being taken. ## Example This example implements a CLR class that uses a `com::ptr` to wrap its private member `IXMLDOMDocument` object. The `ReplaceDocument` member function first calls `Release` on any previously owned object and then calls `Attach` to attach a new document object. ``` // comptr_attach.cpp // compile with: /clr /link msxml2.lib #include #include #import 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); } // replace currently held COM object with another one void ReplaceDocument(IXMLDOMDocument* pDoc) { // release current document object m_ptrDoc.Release(); // attach the new document object m_ptrDoc.Attach(pDoc); } // note that the destructor will call the com::ptr destructor // and automatically release the reference to the COM object private: com::ptr m_ptrDoc; }; // unmanaged function that creates a raw XML DOM Document object IXMLDOMDocument* CreateDocument() { IXMLDOMDocument* pDoc = NULL; Marshal::ThrowExceptionForHR(CoCreateInstance(CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&pDoc)); return pDoc; } // use the ref class to handle an XML DOM Document object int main() { IXMLDOMDocument* pDoc = NULL; try { // create the class from a progid string XmlDocument doc("Msxml2.DOMDocument.3.0"); // get another document object from unmanaged function and // store it in place of the one held by our ref class pDoc = CreateDocument(); doc.ReplaceDocument(pDoc); // no further need for raw object reference pDoc->Release(); pDoc = NULL; } catch (Exception^ e) { Console::WriteLine(e); } finally { if (NULL != pDoc) { pDoc->Release(); } } } ``` ## Requirements **Header file** \ **Namespace** msclr::com ## See Also [ptr Members](../dotnet/ptr-members.md) [ptr::operator=](../dotnet/ptr-operator-assign.md) [ptr::Release](../dotnet/ptr-release.md)