/*************************************************************************/ /* Copyright (C) 1999 Microsoft Corporation */ /* File: CHObj.cpp */ /*************************************************************************/ #include "stdafx.h" #include "chobj.h" /*************************************************************************/ /* Implemntation of Class: CHostedObject */ /*************************************************************************/ /*************************************************************************/ /* Function: CHostedObject */ /* Description: Constructor that initializes member variables of the */ /* object. */ /*************************************************************************/ CHostedObject::CHostedObject(BSTR strID, BSTR strPropBag, IUnknown* pUnknown){ Init(); m_strID = ::SysAllocString(strID); m_strPropBag = ::SysAllocString(strPropBag); m_pUnknown = pUnknown; ::ZeroMemory(&m_rcRawPos, sizeof(RECT)); }/* end of function CHostedObject */ /*************************************************************************/ /* Function: Init */ /* Description: Initializes the member variables */ /*************************************************************************/ void CHostedObject::Init(){ m_pContainerObject = NULL; m_strID = NULL; m_strPropBag = NULL; m_bWindowless = false; //m_fActive = false; m_fActive = true; m_fCapture = false; m_fFocus = false; ::ZeroMemory(&m_rcRawPos, sizeof(RECT)); }/* end of function Init */ /*************************************************************************/ /* Function: Cleanup */ /* Description: Cleans up the member variables */ /*************************************************************************/ void CHostedObject::Cleanup(){ try { ATLTRACE(TEXT("In the cleanup of the CHostedObject\n")); if(NULL != m_strID){ ::SysFreeString(m_strID); m_strID = NULL; }/* end of if statement */ if(NULL != m_strPropBag){ ::SysFreeString(m_strPropBag); m_strPropBag = NULL; }/* end of if statement */ Init(); } catch(...){ ATLTRACE(TEXT("Reference counting is off \n")); return; }/* end of if statement */ }/* end of function Cleanup */ /*************************************************************************/ /* Function: CreateObject */ /* Description: Creates the ActiveX Object via CoCreateInstance and */ /* initializes it. If everything went OK the return the newly allocate */ /* pObj. */ /*************************************************************************/ HRESULT CHostedObject::CreateObject(BSTR strObjectID, BSTR strProgID, BSTR strPropBag, CHostedObject** ppObj){ HRESULT hr; CLSID tmpCLSID; if(NULL == ppObj){ hr = E_POINTER; return(hr); }/* end of if statement */ *ppObj = NULL; // set the return value to NULL hr = ::CLSIDFromProgID(strProgID, &tmpCLSID); if (FAILED(hr)){ // Try to get CLSID from string if not prog ID HRESULT hrTmp = CLSIDFromString(strProgID, &tmpCLSID); if(FAILED(hrTmp)){ if (hr == CO_E_CLASSSTRING) { // BUG#101663 // We can not use %1!ls! for Win95. return DISP_E_EXCEPTION; }/* end of if statement */ return hr; }/* end of if statement */ }/* end of if statement */ CComPtr pUnknown; hr = pUnknown.CoCreateInstance(tmpCLSID); if (FAILED(hr)) { return(hr); }/* end of if statement */ // everything went OK now allocate the object and set the variables to it *ppObj = new CHostedObject(strObjectID, strPropBag, pUnknown); if(NULL == *ppObj){ // in case we do not support exception handling hr = E_OUTOFMEMORY; }/* end of if statement */ return (hr); }/* end of function CreateObject */ /*************************************************************************/ /* Function: AddObject */ /* Description: Simmilar to create object, but does not create on. Takes */ /* an existing IUnknown and wraps it, in the object structure. */ /*************************************************************************/ HRESULT CHostedObject::AddObject(BSTR strObjectID, BSTR strPropBag, LPUNKNOWN pUnknown, CHostedObject** ppObj){ HRESULT hr = S_OK; if(NULL == ppObj){ hr = E_POINTER; return(hr); }/* end of if statement */ if(NULL == pUnknown){ hr = E_POINTER; return(hr); }/* end of if statement */ *ppObj = NULL; // set the return value to NULL // everything went OK now allocate the object and set the variables to it *ppObj = new CHostedObject(strObjectID, strPropBag, pUnknown); if(NULL == *ppObj){ // in case we do not support exception handling hr = E_OUTOFMEMORY; }/* end of if statement */ return (hr); }/* end of function AddObject */ /*************************************************************************/ /* Function: GetID */ /* Description: Returns the ID of the object */ /*************************************************************************/ BSTR CHostedObject::GetID(){ return(m_strID); }/* end of function GetID */ /*************************************************************************/ /* Function: GetPropBag */ /* Description: Returns the textual information that represents property */ /* bag and is associate with the object. */ /*************************************************************************/ BSTR CHostedObject::GetPropBag(){ return(m_strPropBag); }/* end of function GetPropBag */ /*************************************************************************/ /* Function: GetUnknown */ /* Description: Gets the IUnknown stored in this object. */ /*************************************************************************/ IUnknown* CHostedObject::GetUnknown(){ return(m_pUnknown); }/* end of function GetUnknown */ /*************************************************************************/ /* Function: GetViewObject */ /* Description: Gets the IViewObject cached for this object. */ /*************************************************************************/ HRESULT CHostedObject::GetViewObject(IViewObjectEx** pIViewObject){ HRESULT hr = S_OK; try { if(NULL == pIViewObject){ throw(E_POINTER); }/* end of if statement */ if(!m_spViewObject){ hr = InitViewObject(); if(FAILED(hr)){ throw(hr); }/* end of if statement */ }/* end of if statement */ if(!m_spViewObject){ *pIViewObject = NULL; hr = E_FAIL; throw(hr); }/* end of if statement */ *pIViewObject = m_spViewObject; (*pIViewObject)->AddRef(); // giving it out have add reff }/* end of try statement */ catch(HRESULT hrTmp){ hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }/* end of catch statemenmt */ return(hr); }/* end of function GetViewObject */ /*************************************************************************/ /* Function: GetOleObject */ /* Description: Gets the IOleObject cached for this object. */ /*************************************************************************/ HRESULT CHostedObject::GetOleObject(IOleObject** ppIOleObject){ HRESULT hr = S_OK; try { if(NULL == ppIOleObject){ throw(E_POINTER); }/* end of if statement */ if(!m_pOleObject){ if(!m_pUnknown){ throw(E_UNEXPECTED); }/* end of if statement */ // cache up the IOleObject hr = m_pUnknown->QueryInterface(&m_pOleObject); if(FAILED(hr)){ throw(hr); }/* end of if statement */ }/* end of if statement */ #ifdef _DEBUG if(!m_pOleObject){ // sometimes we get OK from QI but IOleObject is NULL *ppIOleObject = NULL; throw(E_FAIL); }/* end of if statement */ #endif *ppIOleObject = m_pOleObject; (*ppIOleObject)->AddRef(); }/* end of try statement */ catch(HRESULT hrTmp){ hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }/* end of catch statemenmt */ return(hr); }/* end of function GetOleObject */ /*************************************************************************/ /* Function: GetTypeInfo */ /* Description: Calls the IDispatch object TypeInfo */ /*************************************************************************/ HRESULT CHostedObject::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo){ HRESULT hr = S_OK; try { if(!m_pUnknown){ throw(E_UNEXPECTED); }/* end of if statement */ CComPtr pDispatch; hr = m_pUnknown->QueryInterface(&pDispatch); if(FAILED(hr)){ throw(hr); }/* end of if statement */ hr = pDispatch->GetTypeInfo(itinfo, lcid, pptinfo); }/* end of try statement */ catch(HRESULT hrTmp){ hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }/* end of catch statemenmt */ return(hr); }/* end of funciton GetTypeInfo */ /*************************************************************************/ /* Function: GetPos */ /* Description: Accessor to the position of the embedded object. */ /*************************************************************************/ HRESULT CHostedObject::GetPos(RECT* pRcPos){ HRESULT hr = S_OK; if(NULL == pRcPos){ hr = E_POINTER; return(hr); }/* end of if statement */ // Get the raw rect for this object and then adjust it for the // offset of the container *pRcPos = m_rcRawPos; if(IsWindowless()){ return(hr); }/* end of if statement */ HWND hwnd = NULL; hr = GetWindow(&hwnd); if(FAILED(hr)){ hr = S_FALSE; return(hr); }/* end of if statement */ ::GetWindowRect(hwnd, pRcPos); m_rcRawPos = *pRcPos; // update our cached value return(hr); }/* end of function GetPos */ /*************************************************************************/ /* Function: SetRawPos */ /* Description: We set the RawPosition, which is location relative to the*/ /* container. Adjustment for the offset is done in GetPos function. */ /*************************************************************************/ HRESULT CHostedObject::SetRawPos(const RECT* pRcPos){ HRESULT hr = S_OK; if(NULL == pRcPos){ hr = E_POINTER; return(hr); }/* end of if statement */ m_rcRawPos = *pRcPos; return(hr); }/* end of function SetRawPos */ /*************************************************************************/ /* Function: SetObjectRects */ /* Description: Notififies the Controls about chaning rects, so they */ /* will update their positions. */ /*************************************************************************/ HRESULT CHostedObject::SetObjectRects(RECT* prcPos){ HRESULT hr = S_OK; RECT rc; if(NULL == prcPos){ hr = GetPos(&rc); } else { rc = *prcPos; }/* end of if statement */ if(FAILED(hr)){ throw(hr); }/* end of if statement */ CComPtr pIOlePlace; if(!m_pUnknown){ hr = S_FALSE; return(hr); // do not have the object yet no way to set it }/* end of if statement */ hr = m_pUnknown->QueryInterface(&pIOlePlace); if(FAILED(hr)){ hr = S_FALSE; return(hr); // do not have the IOleInPlaceObject in other words not activated // object yet no way to set it, so lets not complain that // much, since the ATL would break on }/* end of if statement */ // TODO: Pass down the clip rects evntaully, but right not used // in our controls hr = pIOlePlace->SetObjectRects(&rc, &rc); return(hr); }/* end of function SetObjectRects */ /*************************************************************************/ /* Function: InitViewObject */ /* Description: Initializes the ViewObject. */ /*************************************************************************/ HRESULT CHostedObject::InitViewObject(){ HRESULT hr = S_OK; if(!m_pUnknown){ hr = E_UNEXPECTED; return(hr); }/* end of if statement */ hr = m_pUnknown->QueryInterface(IID_IViewObjectEx, (void**) &m_spViewObject); if (FAILED(hr)){ hr = m_pUnknown->QueryInterface(IID_IViewObject2, (void**) &m_spViewObject); if (FAILED(hr)){ hr = m_pUnknown->QueryInterface(IID_IViewObject, (void**) &m_spViewObject); }/* end of if statement */ }/* end of if statement */ return(hr); }/* end of function InitViewObject */ /*************************************************************************/ /* Function: SetActive */ /* Description: Sets the control flag to be active or not. */ /* This disables it drawing in the container. */ /*************************************************************************/ HRESULT CHostedObject::SetActive(bool fActivate){ HRESULT hr = S_OK; m_fActive = fActivate; // this might seem like a bug, but flag is important // even if we do not get to hide the windowed control if(IsWindowless()){ return(hr); // do not have to deal with hiding and showing of the window // we just do not draw the nonactive objects in the container }/* end of if statement */ HWND hwnd = NULL; hr = GetWindow(&hwnd); if(FAILED(hr)){ return(hr); }/* end of if statement */ if(::IsWindow(hwnd)){ INT nShow = fActivate ? SW_SHOW : SW_HIDE; ::ShowWindow(hwnd, nShow); }/* end of if statement */ return(hr); }/* end of function SetActive */ /*************************************************************************/ /* Function: GetWindow */ /* Description: Gets the control window. */ /*************************************************************************/ HRESULT CHostedObject::GetWindow(HWND* pHwnd){ HRESULT hr = S_OK; // now try to if(!m_pUnknown){ hr = E_UNEXPECTED; return(hr); }/* end of if statement */ CComPtr pOleInPObject; hr = m_pUnknown->QueryInterface(&pOleInPObject); if(FAILED(hr)){ return(hr); }/* end of if statement */ hr = pOleInPObject->GetWindow(pHwnd); if(FAILED(hr)){ return(hr); }/* end of if statement */ return(hr); }/* end of if statement */ /*************************************************************************/ /* End of file: CHObj.cpp */ /*************************************************************************/