// @pymethod int|PyIDataObject|DAdvise|Connects the object to an interface that will receive notifications when its data changes // @rdesc Returns a unique number that is used to identify the connection PyObject *PyIDataObject::DAdvise(PyObject *self, PyObject *args) { IDataObject *pIDO = GetI(self); if ( pIDO == NULL ) return NULL; FORMATETC formatetc; PyObject *obpformatetc; // @pyparm <o PyFORMATETC>|pformatetc||Defines the type of data for which the sink will receive notifications. // @pyparm int|advf||Combination of values from ADVF enum. (which currently do not appear in any of the constants modules!) // @pyparm <o PyIAdviseSink>|pAdvSink||Currently this interface is not wrapped. PyObject *obpAdvSink; DWORD advf; IAdviseSink *pAdvSink; if ( !PyArg_ParseTuple(args, "OlO:DAdvise", &obpformatetc, &advf, &obpAdvSink) ) return NULL; BOOL bPythonIsHappy = TRUE; if (bPythonIsHappy && !PyObject_AsFORMATETC( obpformatetc, &formatetc )) bPythonIsHappy = FALSE; if (bPythonIsHappy && !PyCom_InterfaceFromPyInstanceOrObject(obpAdvSink, IID_IAdviseSink, (void **)&pAdvSink, TRUE /* bNoneOK */)) bPythonIsHappy = FALSE; if (!bPythonIsHappy) return NULL; DWORD dwConnection; HRESULT hr; PY_INTERFACE_PRECALL; hr = pIDO->DAdvise( &formatetc, advf, pAdvSink, &dwConnection ); PY_INTERFACE_POSTCALL; if (pAdvSink) pAdvSink->Release(); if ( FAILED(hr) ) return PyCom_BuildPyException(hr, pIDO, IID_IDataObject ); return PyInt_FromLong(dwConnection); }
// @pymethod |PyIOleObject|Advise|Description of Advise. PyObject *PyIOleObject::Advise(PyObject *self, PyObject *args) { IOleObject *pIOO = GetI(self); if ( pIOO == NULL ) return NULL; // @pyparm <o PyIAdviseSink>|pAdvSink||Description for pAdvSink PyObject *obpAdvSink; IAdviseSink * pAdvSink; DWORD pdwConnection; if ( !PyArg_ParseTuple(args, "O:Advise", &obpAdvSink) ) return NULL; BOOL bPythonIsHappy = TRUE; if (!PyCom_InterfaceFromPyInstanceOrObject(obpAdvSink, IID_IAdviseSink, (void **)&pAdvSink, TRUE /* bNoneOK */)) bPythonIsHappy = FALSE; if (!bPythonIsHappy) return NULL; HRESULT hr; PY_INTERFACE_PRECALL; hr = pIOO->Advise( pAdvSink, &pdwConnection ); if (pAdvSink) pAdvSink->Release(); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return OleSetOleError(hr); PyObject *pyretval = Py_BuildValue("i", pdwConnection); return pyretval; }
STDMETHODIMP COPCGroupImpl::put_IsSubscribed(VARIANT_BOOL IsSubscribed) { if( !m_pOPCGroup ) return E_FAIL; HRESULT hr=S_OK; if( IsSubscribed == m_subscribed ) return hr; if( IsSubscribed ) { if( m_usingCP ) { IConnectionPointContainer *pCPC = 0; hr = m_pOPCGroup->QueryInterface(IID_IConnectionPointContainer, (LPVOID*)&pCPC); if( SUCCEEDED(hr) ) { IConnectionPoint *pCallbackCP = 0; hr = pCPC->FindConnectionPoint(IID_IOPCDataCallback, &pCallbackCP); pCPC->Release(); if( FAILED(hr) ) { return E_FAIL; } IUnknown* pUnk = NULL; ((COPCGroup*)this)->QueryInterface( IID_IUnknown, (LPVOID*)&pUnk); hr = pCallbackCP->Advise(pUnk, &m_DataConnection); pCallbackCP->Release(); pUnk->Release(); if( FAILED(hr) ) { return E_FAIL; } } } else { if( !m_pIDataObject ) { m_pIDataObject = m_pOPCGroup; // get IDataObject Interface if( !m_pIDataObject ) return E_FAIL; } IAdviseSink *pAdviseSink = NULL; hr = ((COPCGroup*)this)->QueryInterface(IID_IAdviseSink, (LPVOID *)&pAdviseSink); if (FAILED(hr)) { return E_FAIL; } FORMATETC formatEtc ; formatEtc.cfFormat = OPCSTMFORMATDATATIME; formatEtc.tymed = TYMED_HGLOBAL; formatEtc.ptd = NULL; formatEtc.dwAspect = DVASPECT_CONTENT; formatEtc.lindex = -1; hr = m_pIDataObject->DAdvise(&formatEtc, (DWORD)ADVF_PRIMEFIRST, pAdviseSink, &m_DataConnection); if( SUCCEEDED(hr) ) // also advise write complete { formatEtc.cfFormat = OPCSTMFORMATWRITECOMPLETE; hr = m_pIDataObject->DAdvise(&formatEtc, (DWORD)ADVF_PRIMEFIRST, pAdviseSink, &m_WriteConnection); } // DAdvise will hold its own reference pAdviseSink->Release(); } m_subscribed = VARIANT_TRUE; } else // Unsubscribing { if( m_usingCP ) { // OPC 2.0 ConnectionPoints IConnectionPointContainer *pCPC = 0; hr = m_pOPCGroup->QueryInterface(IID_IConnectionPointContainer, (LPVOID*)&pCPC); if( SUCCEEDED(hr) ) { IConnectionPoint *pCallbackCP = 0; hr = pCPC->FindConnectionPoint(IID_IOPCDataCallback, &pCallbackCP); if( SUCCEEDED(hr) ) { hr = pCallbackCP->Unadvise(m_DataConnection); pCallbackCP->Release(); } pCPC->Release(); } } else { if( m_pIDataObject.p ) // if a valid interface pointer { hr = m_pIDataObject->DUnadvise(m_DataConnection); if( SUCCEEDED(hr) ) // also unadvise write complete hr = m_pIDataObject->DUnadvise(m_WriteConnection); m_pIDataObject.Release(); } } m_subscribed = VARIANT_FALSE; } return hr; }
HRESULT CXcpControlHost::ActivateXcpControl(IUnknown* pUnKnown) { if (pUnKnown == NULL) { return S_OK; } m_spUnknown = pUnKnown; HRESULT hr = S_OK; pUnKnown->QueryInterface(__uuidof(IOleObject), (void**)&m_spOleObject); if (m_spOleObject) { //m_spOleObject->GetMiscStatus(DVASPECT_CONTENT, &m_dwMiscStatus); OleRegGetMiscStatus( __uuidof(m_spOleObject), DVASPECT_CONTENT, &m_dwMiscStatus ); if (m_dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST) { //CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown()); IOleClientSite *spClientSite = NULL; ((ATL::CAxHostWindow *)this)->QueryInterface( __uuidof(IOleClientSite), (void **)&spClientSite ); if( NULL != spClientSite ) { m_spOleObject->SetClientSite(spClientSite); spClientSite->Release(); } } //CComQIPtr<IPersistPropertyBag> pPersist(m_spOleObject); IPersistPropertyBag *pPersist = NULL; m_spOleObject->QueryInterface( __uuidof(IPersistPropertyBag), (void **)&pPersist ); if ( NULL != pPersist ) { IPropertyBag* pPropBag = (IPropertyBag*)new CXcpPropertyBag(); pPropBag->AddRef(); pPersist->Load((IPropertyBag*)pPropBag, NULL); pPropBag->Release(); } if (0 == (m_dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST)) { //CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown()); IOleClientSite *spClientSite = NULL; ((ATL::CAxHostWindow *)this)->QueryInterface( __uuidof(IOleClientSite), (void **)&spClientSite); //GetControllingUnknown()->QueryInterface( __uuidof(IOleClientSite), (void **)&spClientSite ); if( NULL != spClientSite ) { m_spOleObject->SetClientSite(spClientSite); spClientSite->Release(); } } m_dwViewObjectType = 0; hr = m_spOleObject->QueryInterface(__uuidof(IViewObjectEx), (void**) &m_spViewObject); if (FAILED(hr)) { hr = m_spOleObject->QueryInterface(__uuidof(IViewObject2), (void**) &m_spViewObject); if (SUCCEEDED(hr)) { m_dwViewObjectType = 3; } } else { m_dwViewObjectType = 7; } if (FAILED(hr)) { hr = m_spOleObject->QueryInterface(__uuidof(IViewObject), (void**) &m_spViewObject); if (SUCCEEDED(hr)) { m_dwViewObjectType = 1; } } //CComQIPtr<IAdviseSink> spAdviseSink(GetControllingUnknown()); IAdviseSink *spAdviseSink = NULL; //GetControllingUnknown()->QueryInterface( __uuidof(IAdviseSink), (void **)&spAdviseSink ); ((ATL::CAxHostWindow *)this)->QueryInterface( __uuidof(IAdviseSink), (void **)&spAdviseSink ); if( NULL != spAdviseSink ) { m_spOleObject->Advise(spAdviseSink, &m_dwOleObject); if (m_spViewObject) { m_spViewObject->SetAdvise(DVASPECT_CONTENT, 0, spAdviseSink); } spAdviseSink->Release(); } m_spOleObject->SetHostNames(OLESTR("AXWIN"), NULL); if ((m_dwMiscStatus & OLEMISC_INVISIBLEATRUNTIME) == 0) { m_spOleObject->GetExtent( DVASPECT_CONTENT, &m_hmSize ); m_pxSize.cx = m_rcPos.right - m_rcPos.left; m_pxSize.cy = m_rcPos.bottom - m_rcPos.top; AtlPixelToHiMetric(&m_pxSize, &m_hmSize); m_spOleObject->SetExtent(DVASPECT_CONTENT, &m_hmSize); m_spOleObject->GetExtent(DVASPECT_CONTENT, &m_hmSize); AtlHiMetricToPixel(&m_hmSize, &m_pxSize); m_rcPos.right = m_rcPos.left + m_pxSize.cx ; m_rcPos.bottom = m_rcPos.top + m_pxSize.cy ; //CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown()); IOleClientSite *spClientSite = NULL; //GetControllingUnknown()->QueryInterface( __uuidof(IOleClientSite), (void **)&spClientSite ); ((ATL::CAxHostWindow *)this)->QueryInterface( __uuidof(IOleClientSite), (void **)&spClientSite ); if( NULL != spClientSite ) { m_rcPos.left = m_rcPos.top = 0; m_rcPos.right = m_hmSize.cx; m_rcPos.bottom = m_hmSize.cy; hr = m_spOleObject->DoVerb( OLEIVERB_INPLACEACTIVATE, NULL, spClientSite, 0, m_hWnd, &m_rcPos ); ::RedrawWindow( m_hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME ); spClientSite->Release(); } } if( NULL != pPersist ) { pPersist->Release(); } } //CComPtr<IObjectWithSite> spSite; IObjectWithSite *spSite = NULL; pUnKnown->QueryInterface(__uuidof(IObjectWithSite), (void**)&spSite); if ( NULL != spSite ) { // spSite->SetSite(GetControllingUnknown()); IUnknown *iUnknown = NULL; ((ATL::CAxHostWindow *)this)->QueryInterface( __uuidof(IUnknown), (void **)&iUnknown ); spSite->SetSite( iUnknown ); spSite->Release(); } return hr; }