📄 olesvr1.cpp
字号:
pThis->m_lpClientSite->AddRef();
return S_OK;
}
STDMETHODIMP COleServerDoc::XOleObject::SetHostNames(
LPCOLESTR lpszContainerApp, LPCOLESTR lpszContainerObj)
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
ASSERT_VALID(pThis);
USES_CONVERSION;
TRY
{
pThis->OnSetHostNames(OLE2CT(lpszContainerApp),
OLE2CT(lpszContainerObj));
}
END_TRY
return S_OK;
}
STDMETHODIMP COleServerDoc::XOleObject::Close(DWORD dwSaveOption)
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
ASSERT_VALID(pThis);
pThis->InternalAddRef(); // protect this object
SCODE sc = S_OK;
TRY
{
// delegate through document for most of the work
pThis->OnClose((OLECLOSE)dwSaveOption);
}
CATCH_ALL(e)
{
sc = COleException::Process(e);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
pThis->InternalRelease(); // may 'delete this'
return sc;
}
STDMETHODIMP COleServerDoc::XOleObject::SetMoniker(
DWORD /*dwWhichMoniker*/, LPMONIKER /*pmk*/)
{
METHOD_PROLOGUE_EX_(COleServerDoc, OleObject)
if (pThis->m_lpClientSite == NULL)
return E_FAIL;
// get current full moniker from client-site
LPMONIKER lpMoniker = NULL;
if (pThis->m_lpClientSite->GetMoniker(OLEGETMONIKER_ONLYIFTHERE,
OLEWHICHMK_OBJFULL, &lpMoniker) != S_OK)
{
// just to make sure -- always set moniker to NULL on failure
lpMoniker = NULL;
}
// update all embedded items with new moniker
POSITION pos = pThis->GetStartPosition();
COleClientItem* pItem;
while ((pItem = pThis->GetNextClientItem(pos)) != NULL)
{
if (pItem->m_bMoniker)
pItem->m_lpObject->SetMoniker(OLEWHICHMK_CONTAINER, lpMoniker);
}
// send Rename advises
pThis->NotifyAllItems(OLE_RENAMED, (DWORD)lpMoniker);
RELEASE(lpMoniker);
return S_OK;
}
STDMETHODIMP COleServerDoc::XOleObject::GetMoniker(
DWORD dwAssign, DWORD /*dwWhichMoniker*/, LPMONIKER* ppMoniker)
{
METHOD_PROLOGUE_EX_(COleServerDoc, OleObject)
*ppMoniker = pThis->GetMoniker((OLEGETMONIKER)dwAssign);
return *ppMoniker == NULL ? E_FAIL : S_OK;
}
STDMETHODIMP COleServerDoc::XOleObject::InitFromData(
LPDATAOBJECT pDataObject, BOOL fCreation, DWORD /*dwReserved*/)
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
ASSERT_VALID(pThis);
COleServerItem* pItem;
SCODE sc;
TRY
{
// delegate through item
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
COleDataObject dataObject;
dataObject.Attach(pDataObject, FALSE);
sc = pItem->OnInitFromData(&dataObject, fCreation) ? S_OK : S_FALSE;
}
CATCH_ALL(e)
{
sc = COleException::Process(e);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
return sc;
}
STDMETHODIMP COleServerDoc::XOleObject::GetClipboardData(
DWORD /*dwReserved*/, LPDATAOBJECT* ppDataObject)
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
ASSERT_VALID(pThis);
*ppDataObject = NULL;
COleServerItem* pItem;
SCODE sc = S_OK;
TRY
{
// delegate through item
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
COleDataSource* pDataSource =
pItem->OnGetClipboardData(TRUE, NULL, NULL);
ASSERT(pDataSource != NULL);
*ppDataObject =
(LPDATAOBJECT)pDataSource->GetInterface(&IID_IDataObject);
ASSERT(*ppDataObject != NULL);
}
CATCH_ALL(e)
{
sc = COleException::Process(e);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
return sc;
}
STDMETHODIMP COleServerDoc::XOleObject::DoVerb(
LONG iVerb, LPMSG /*lpmsg*/, LPOLECLIENTSITE /*pActiveSite*/, LONG /*lindex*/,
HWND /*hwndParent*/, LPCRECT /*lpPosRect*/)
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
ASSERT_VALID(pThis);
pThis->InternalAddRef(); // protect this object
COleServerItem* pItem;
SCODE sc = S_OK;
TRY
{
// delegate through item
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
pItem->OnDoVerb(iVerb);
}
CATCH_ALL(e)
{
sc = COleException::Process(e);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
pThis->InternalRelease(); // may 'delete this'
return sc;
}
STDMETHODIMP COleServerDoc::XOleObject::EnumVerbs(
IEnumOLEVERB** ppenumOleVerb)
{
METHOD_PROLOGUE_EX_(COleServerDoc, OleObject)
*ppenumOleVerb = NULL;
LPOLEOBJECT lpObject = (LPOLEOBJECT)pThis->GetInterface(&IID_IOleObject);
ASSERT(lpObject != NULL);
CLSID clsid;
lpObject->GetUserClassID(&clsid);
return OleRegEnumVerbs(clsid, ppenumOleVerb);
}
STDMETHODIMP COleServerDoc::XOleObject::Update()
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
ASSERT_VALID(pThis);
COleServerItem* pItem;
SCODE sc = S_OK;
TRY
{
// delegate through item
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
pItem->OnUpdateItems();
}
CATCH_ALL(e)
{
sc = COleException::Process(e);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
return sc;
}
STDMETHODIMP COleServerDoc::XOleObject::IsUpToDate()
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
ASSERT_VALID(pThis);
COleServerItem* pItem;
SCODE sc;
TRY
{
// delegate through item
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
sc = pItem->OnQueryUpdateItems() ? S_FALSE : S_OK;
}
CATCH_ALL(e)
{
sc = COleException::Process(e);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
return sc;
}
STDMETHODIMP COleServerDoc::XOleObject::GetUserClassID(CLSID* lpClassID)
{
METHOD_PROLOGUE_EX_(COleServerDoc, OleObject)
LPPERSISTFILE lpPersistFile = (LPPERSISTFILE)
pThis->GetInterface(&IID_IPersistFile);
return lpPersistFile->GetClassID(lpClassID);
}
STDMETHODIMP COleServerDoc::XOleObject::GetUserType(
DWORD dwFormOfType, LPOLESTR* ppszUserType)
{
METHOD_PROLOGUE_EX_(COleServerDoc, OleObject)
*ppszUserType = NULL;
LPOLEOBJECT lpObject = (LPOLEOBJECT)pThis->GetInterface(&IID_IOleObject);
ASSERT(lpObject != NULL);
CLSID clsid;
lpObject->GetUserClassID(&clsid);
return OleRegGetUserType(clsid, dwFormOfType, ppszUserType);
}
STDMETHODIMP COleServerDoc::XOleObject::SetExtent(
DWORD dwDrawAspect, LPSIZEL lpsizel)
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
ASSERT_VALID(pThis);
COleServerItem* pItem;
SCODE sc = E_FAIL;
TRY
{
// convert rectangle to a CSize and call item OnSetExtent
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
CSize size((int)lpsizel->cx, (int)lpsizel->cy);
if (pItem->OnSetExtent((DVASPECT)dwDrawAspect, size))
sc = S_OK;
}
CATCH_ALL(e)
{
sc = COleException::Process(e);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
return sc;
}
STDMETHODIMP COleServerDoc::XOleObject::GetExtent(
DWORD dwDrawAspect, LPSIZEL lpsizel)
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
ASSERT_VALID(pThis);
COleServerItem* pItem;
SCODE sc = E_INVALIDARG;
TRY
{
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
// call to get regular windows CSize
CSize size;
if (pItem->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 COleServerDoc::XOleObject::Advise(
IAdviseSink* pAdvSink, DWORD* pdwConnection)
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
COleServerItem* pItem = NULL;
SCODE sc = E_OUTOFMEMORY;
TRY
{
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
sc = S_OK;
}
END_TRY
if (sc != S_OK)
return sc;
return pItem->GetOleObject()->Advise(pAdvSink, pdwConnection);
}
STDMETHODIMP COleServerDoc::XOleObject::Unadvise(DWORD dwConnection)
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
COleServerItem* pItem = NULL;
SCODE sc = E_OUTOFMEMORY;
TRY
{
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
sc = S_OK;
}
END_TRY
if (sc != S_OK)
return sc;
return pItem->GetOleObject()->Unadvise(dwConnection);
}
STDMETHODIMP COleServerDoc::XOleObject::EnumAdvise(
LPENUMSTATDATA* ppenumAdvise)
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
COleServerItem* pItem = NULL;
SCODE sc = E_OUTOFMEMORY;
TRY
{
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
sc = S_OK;
}
END_TRY
if (sc != S_OK)
return sc;
return pItem->GetOleObject()->EnumAdvise(ppenumAdvise);
}
STDMETHODIMP COleServerDoc::XOleObject::GetMiscStatus(
DWORD dwAspect, DWORD* pdwStatus)
{
METHOD_PROLOGUE_EX_(COleServerDoc, OleObject)
*pdwStatus = 0;
LPOLEOBJECT lpObject = (LPOLEOBJECT)pThis->GetInterface(&IID_IOleObject);
ASSERT(lpObject != NULL);
CLSID clsid;
lpObject->GetUserClassID(&clsid);
return OleRegGetMiscStatus(clsid, dwAspect, pdwStatus);
}
STDMETHODIMP COleServerDoc::XOleObject::SetColorScheme(LPLOGPALETTE lpLogpal)
{
METHOD_PROLOGUE_EX(COleServerDoc, OleObject)
ASSERT_VALID(pThis);
COleServerItem* pItem;
SCODE sc = E_NOTIMPL;
TRY
{
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
// delegate to embedded item
if (pItem->OnSetColorScheme(lpLogpal))
sc = S_OK;
}
END_TRY
return sc;
}
/////////////////////////////////////////////////////////////////////////////
// COleServerDoc::XDataObject
STDMETHODIMP_(ULONG) COleServerDoc::XDataObject::AddRef()
{
METHOD_PROLOGUE_EX_(COleServerDoc, DataObject)
return pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) COleServerDoc::XDataObject::Release()
{
METHOD_PROLOGUE_EX_(COleServerDoc, DataObject)
return pThis->ExternalRelease();
}
STDMETHODIMP COleServerDoc::XDataObject::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleServerDoc, DataObject)
return pThis->ExternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP COleServerDoc::XDataObject::GetData(
LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium)
{
METHOD_PROLOGUE_EX(COleServerDoc, DataObject)
COleServerItem* pItem = NULL;
SCODE sc = E_OUTOFMEMORY;
TRY
{
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
sc = S_OK;
}
END_TRY
if (sc != S_OK)
return sc;
return pItem->GetDataObject()->GetData(lpFormatEtc, lpStgMedium);
}
STDMETHODIMP COleServerDoc::XDataObject::GetDataHere(
LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium)
{
METHOD_PROLOGUE_EX(COleServerDoc, DataObject)
COleServerItem* pItem = NULL;
SCODE sc = E_OUTOFMEMORY;
TRY
{
pItem = pThis->GetEmbeddedItem();
ASSERT_VALID(pItem);
ASSERT_KINDOF(COleServerItem, pItem);
sc = S_OK;
}
END_TRY
if (sc != S_OK)
return sc;
return pItem->GetDataObject()->GetDataHere(lpFormatEtc, lpStgMedium);
}
STDMETHODIMP COleServerDoc::XDataObject::QueryGetData(
LPFORMATE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -