📄 olesvr2.cpp
字号:
GetMoniker(dwAssign, OLEWHICHMK_OBJREL, &lpMoniker2);
if (lpMoniker1 != NULL && lpMoniker2 != NULL)
{
// create composite from two parts
::CreateGenericComposite(lpMoniker1, lpMoniker2, ppMoniker);
}
else if (lpMoniker1 != NULL)
{
// just use container moniker
*ppMoniker = lpMoniker1;
lpMoniker1 = NULL;
}
// release sub-monikers
RELEASE(lpMoniker1);
RELEASE(lpMoniker2);
}
break;
}
return *ppMoniker == NULL ? E_FAIL : S_OK;
}
STDMETHODIMP COleServerItem::XOleObject::InitFromData(
LPDATAOBJECT /*pDataObject*/, BOOL /*fCreation*/, DWORD /*dwReserved*/)
{
// linked objects do not support InitFromData
return E_NOTIMPL;
}
STDMETHODIMP COleServerItem::XOleObject::GetClipboardData(
DWORD /*dwReserved*/, LPDATAOBJECT* ppDataObject)
{
METHOD_PROLOGUE_EX(COleServerItem, OleObject)
ASSERT_VALID(pThis);
*ppDataObject = NULL;
SCODE sc;
TRY
{
COleDataSource* pDataSource = pThis->OnGetClipboardData(TRUE, NULL, NULL);
ASSERT(pDataSource != NULL);
*ppDataObject =
(LPDATAOBJECT)pDataSource->GetInterface(&IID_IDataObject);
ASSERT(*ppDataObject != NULL);
sc = S_OK;
}
CATCH_ALL(e)
{
sc = COleException::Process(e);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
return sc;
}
STDMETHODIMP COleServerItem::XOleObject::DoVerb(
LONG iVerb, LPMSG /*lpmsg*/, LPOLECLIENTSITE /*pActiveSite*/, LONG /*lindex*/,
HWND /*hwndParent*/, LPCRECT /*lpPosRect*/)
{
METHOD_PROLOGUE_EX(COleServerItem, OleObject)
ASSERT_VALID(pThis);
pThis->InternalAddRef(); // protect this object
SCODE sc;
TRY
{
pThis->OnDoVerb(iVerb);
sc = S_OK;
}
CATCH_ALL(e)
{
sc = COleException::Process(e);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
pThis->InternalRelease(); // may 'delete this'
return sc;
}
STDMETHODIMP COleServerItem::XOleObject::EnumVerbs(
IEnumOLEVERB** ppenumOleVerb)
{
METHOD_PROLOGUE_EX_(COleServerItem, OleObject)
*ppenumOleVerb = NULL;
CLSID clsid;
pThis->GetOleObject()->GetUserClassID(&clsid);
return OleRegEnumVerbs(clsid, ppenumOleVerb);
}
STDMETHODIMP COleServerItem::XOleObject::Update()
{
METHOD_PROLOGUE_EX(COleServerItem, OleObject)
ASSERT_VALID(pThis);
SCODE sc;
TRY
{
pThis->OnUpdateItems();
sc = S_OK;
}
CATCH_ALL(e)
{
sc = COleException::Process(e);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
return sc;
}
STDMETHODIMP COleServerItem::XOleObject::IsUpToDate()
{
METHOD_PROLOGUE_EX(COleServerItem, OleObject)
ASSERT_VALID(pThis);
SCODE sc;
TRY
{
sc = pThis->OnQueryUpdateItems() ? S_FALSE : S_OK;
}
CATCH_ALL(e)
{
sc = COleException::Process(e);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
return sc;
}
STDMETHODIMP COleServerItem::XOleObject::GetUserClassID(CLSID* pClsid)
{
METHOD_PROLOGUE_EX_(COleServerItem, OleObject)
COleServerDoc* pDoc = pThis->GetDocument();
return pDoc->m_xPersistFile.GetClassID(pClsid);
}
STDMETHODIMP COleServerItem::XOleObject::GetUserType(
DWORD dwFormOfType, LPOLESTR* ppszUserType)
{
METHOD_PROLOGUE_EX_(COleServerItem, OleObject)
*ppszUserType = NULL;
CLSID clsid;
pThis->GetOleObject()->GetUserClassID(&clsid);
return OleRegGetUserType(clsid, dwFormOfType, ppszUserType);
}
STDMETHODIMP COleServerItem::XOleObject::SetExtent(
DWORD /*dwDrawAspect*/, LPSIZEL /*lpsizel*/)
{
// linked objects do not support SetExtent
return E_FAIL;
}
STDMETHODIMP COleServerItem::XOleObject::GetExtent(
DWORD dwDrawAspect, LPSIZEL lpsizel)
{
METHOD_PROLOGUE_EX(COleServerItem, OleObject)
ASSERT_VALID(pThis);
SCODE sc = E_INVALIDARG;
TRY
{
// call to get regular windows size
CSize size;
if (pThis->OnGetExtent((DVASPECT)dwDrawAspect, size))
{
if (size.cy < 0)
size.cy = -size.cy; // extents are always positive
lpsizel->cx = size.cx;
lpsizel->cy = size.cy;
sc = S_OK;
}
}
CATCH_ALL(e)
{
sc = COleException::Process(e);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
return sc;
}
STDMETHODIMP COleServerItem::XOleObject::Advise(
IAdviseSink* pAdvSink, DWORD* pdwConnection)
{
METHOD_PROLOGUE_EX_(COleServerItem, OleObject)
*pdwConnection = 0;
if (pThis->m_lpOleAdviseHolder == NULL &&
::CreateOleAdviseHolder(&pThis->m_lpOleAdviseHolder) != S_OK)
{
return E_OUTOFMEMORY;
}
ASSERT(pThis->m_lpOleAdviseHolder != NULL);
return pThis->m_lpOleAdviseHolder->Advise(pAdvSink, pdwConnection);
}
STDMETHODIMP COleServerItem::XOleObject::Unadvise(DWORD dwConnection)
{
METHOD_PROLOGUE_EX_(COleServerItem, OleObject)
if (pThis->m_lpOleAdviseHolder == NULL)
return E_FAIL;
ASSERT(pThis->m_lpOleAdviseHolder != NULL);
return pThis->m_lpOleAdviseHolder->Unadvise(dwConnection);
}
STDMETHODIMP COleServerItem::XOleObject::EnumAdvise(
LPENUMSTATDATA* ppenumAdvise)
{
METHOD_PROLOGUE_EX_(COleServerItem, OleObject)
*ppenumAdvise = NULL;
if (pThis->m_lpOleAdviseHolder == NULL)
return E_FAIL;
ASSERT(pThis->m_lpOleAdviseHolder != NULL);
return pThis->m_lpOleAdviseHolder->EnumAdvise(ppenumAdvise);
}
STDMETHODIMP COleServerItem::XOleObject::GetMiscStatus(
DWORD dwAspect, DWORD* pdwStatus)
{
METHOD_PROLOGUE_EX_(COleServerItem, OleObject)
*pdwStatus = 0;
CLSID clsid;
pThis->GetOleObject()->GetUserClassID(&clsid);
return OleRegGetMiscStatus(clsid, dwAspect, pdwStatus);
}
STDMETHODIMP COleServerItem::XOleObject::SetColorScheme(LPLOGPALETTE lpLogpal)
{
METHOD_PROLOGUE_EX(COleServerItem, OleObject)
ASSERT_VALID(pThis);
SCODE sc = E_NOTIMPL;
TRY
{
// delegate to embedded item
if (pThis->OnSetColorScheme(lpLogpal))
sc = S_OK;
}
END_TRY
return sc;
}
/////////////////////////////////////////////////////////////////////////////
// COleServerItem::XDataObject
STDMETHODIMP_(ULONG) COleServerItem::XDataObject::AddRef()
{
METHOD_PROLOGUE_EX_(COleServerItem, DataObject)
return pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) COleServerItem::XDataObject::Release()
{
METHOD_PROLOGUE_EX_(COleServerItem, DataObject)
return pThis->ExternalRelease();
}
STDMETHODIMP COleServerItem::XDataObject::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleServerItem, DataObject)
return pThis->ExternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP COleServerItem::XDataObject::GetData(
LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium)
{
METHOD_PROLOGUE_EX_(COleServerItem, DataObject)
return pThis->m_dataSource.m_xDataObject.GetData(lpFormatEtc, lpStgMedium);
}
STDMETHODIMP COleServerItem::XDataObject::GetDataHere(
LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium)
{
METHOD_PROLOGUE_EX_(COleServerItem, DataObject)
return pThis->m_dataSource.m_xDataObject.GetDataHere(
lpFormatEtc, lpStgMedium);
}
STDMETHODIMP COleServerItem::XDataObject::QueryGetData(LPFORMATETC lpFormatEtc)
{
METHOD_PROLOGUE_EX_(COleServerItem, DataObject)
return pThis->m_dataSource.m_xDataObject.QueryGetData(lpFormatEtc);
}
STDMETHODIMP COleServerItem::XDataObject::GetCanonicalFormatEtc(
LPFORMATETC /*lpFormatEtcIn*/, LPFORMATETC /*lpFormatEtcOut*/)
{
// because we support the target-device (ptd) for server metafile format,
// all members of the FORMATETC are significant.
return DATA_S_SAMEFORMATETC;
}
STDMETHODIMP COleServerItem::XDataObject::SetData(
LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium, BOOL bRelease)
{
METHOD_PROLOGUE_EX_(COleServerItem, DataObject)
return pThis->m_dataSource.m_xDataObject.SetData(
lpFormatEtc, lpStgMedium, bRelease);
}
STDMETHODIMP COleServerItem::XDataObject::EnumFormatEtc(
DWORD dwDirection, LPENUMFORMATETC* ppenumFormatEtc)
{
METHOD_PROLOGUE_EX_(COleServerItem, DataObject)
return pThis->m_dataSource.m_xDataObject.EnumFormatEtc(
dwDirection, ppenumFormatEtc);
}
STDMETHODIMP COleServerItem::XDataObject::DAdvise(
FORMATETC* pFormatEtc, DWORD advf,
LPADVISESINK pAdvSink, DWORD* pdwConnection)
{
METHOD_PROLOGUE_EX_(COleServerItem, DataObject)
*pdwConnection = 0;
// this special case is for apps like Excel which ask for DAdvise
// on CF_METAFILEPICT, DVASPECT_ICON for insert as icon.
FORMATETC formatEtc = *pFormatEtc;
if (formatEtc.cfFormat == CF_METAFILEPICT &&
formatEtc.dwAspect == DVASPECT_ICON)
{
formatEtc.dwAspect = DVASPECT_CONTENT;
}
// make sure the FORMATETC is valid
if (!(pFormatEtc->cfFormat == 0 && pFormatEtc->ptd == NULL &&
pFormatEtc->dwAspect == -1 && pFormatEtc->lindex == -1 &&
pFormatEtc->tymed == -1) &&
pThis->GetDataObject()->QueryGetData(&formatEtc) != S_OK)
{
// it is not a wildcard advise -and- the format is not acceptable
return DATA_E_FORMATETC;
}
// create the advise holder, if necessary
if (pThis->m_lpDataAdviseHolder == NULL &&
CreateDataAdviseHolder(&pThis->m_lpDataAdviseHolder) != S_OK)
{
return E_OUTOFMEMORY;
}
ASSERT(pThis->m_lpDataAdviseHolder != NULL);
return pThis->m_lpDataAdviseHolder->Advise(this, pFormatEtc, advf,
pAdvSink, pdwConnection);
}
STDMETHODIMP COleServerItem::XDataObject::DUnadvise(DWORD dwConnection)
{
METHOD_PROLOGUE_EX_(COleServerItem, DataObject)
if (pThis->m_lpDataAdviseHolder == NULL)
return E_FAIL;
ASSERT(pThis->m_lpDataAdviseHolder != NULL);
return pThis->m_lpDataAdviseHolder->Unadvise(dwConnection);
}
STDMETHODIMP COleServerItem::XDataObject::EnumDAdvise(
LPENUMSTATDATA* ppenumAdvise)
{
METHOD_PROLOGUE_EX_(COleServerItem, DataObject)
*ppenumAdvise = NULL;
if (pThis->m_lpDataAdviseHolder == NULL)
return E_FAIL;
ASSERT(pThis->m_lpDataAdviseHolder != NULL);
return pThis->m_lpDataAdviseHolder->EnumAdvise(ppenumAdvise);
}
//////////////////////////////////////////////////////////////////////////////
// special CItemDataSource implementation
BOOL COleServerItem::CItemDataSource::OnRenderGlobalData(
LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal)
{
ASSERT_VALID(this);
COleServerItem* pItem = (COleServerItem*)
((BYTE*)this - offsetof(COleServerItem, m_dataSource));
return pItem->OnRenderGlobalData(lpFormatEtc, phGlobal);
// Note: COleDataSource has no implementation
}
BOOL COleServerItem::CItemDataSource::OnRenderFileData(
LPFORMATETC lpFormatEtc, CFile* pFile)
{
ASSERT_VALID(this);
COleServerItem* pItem = (COleServerItem*)
((BYTE*)this - offsetof(COleServerItem, m_dataSource));
return pItem->OnRenderFileData(lpFormatEtc, pFile);
// Note: COleDataSource has no implementation
}
BOOL COleServerItem::CItemDataSource::OnRenderData(
LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium)
{
ASSERT_VALID(this);
COleServerItem* pItem = (COleServerItem*)
((BYTE*)this - offsetof(COleServerItem, m_dataSource));
if (pItem->OnRenderData(lpFormatEtc, lpStgMedium))
return TRUE;
return COleDataSource::OnRenderData(lpFormatEtc, lpStgMedium);
}
BOOL COleServerItem::CItemDataSource::OnSetData(
LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium, BOOL bRelease)
{
ASSERT_VALID(this);
COleServerItem* pItem = (COleServerItem*)
((BYTE*)this - offsetof(COleServerItem, m_dataSource));
return pItem->OnSetData(lpFormatEtc, lpStgMedium, bRelease);
// Note: COleDataSource has no implementation
}
//////////////////////////////////////////////////////////////////////////////
// COleServerItem Diagnostics
#ifdef _DEBUG
void COleServerItem::AssertValid() const
{
CDocItem::AssertValid();
// must be attached to a document
ASSERT(m_pDocument != NULL);
m_dataSource.AssertValid();
}
void COleServerItem::Dump(CDumpContext& dc) const
{
CDocItem::Dump(dc);
dc << "m_bNeedUnlock = " << m_bNeedUnlock;
dc << "\nm_bAutoDelete = " << m_bAutoDelete;
dc << "\nm_strItemName = " << m_strItemName;
dc << "\nm_lpOleAdviseHolder = " << m_lpOleAdviseHolder;
dc << "\nm_lpDataAdviseHolder = " << m_lpDataAdviseHolder;
dc << "\nwith m_dataSource: " << &m_dataSource;
}
#endif
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -