📄 olecli3.cpp
字号:
m_lpObject = NULL;
m_lpViewObject = NULL;
m_dwConnection = 0;
// then load the new object from the new storage
BOOL bResult = FinishCreate(::OleLoad(m_lpStorage, IID_IUnknown,
NULL, (LPLP)&m_lpObject));
if (bResult)
{
RELEASE(lpObject);
RELEASE(lpViewObject);
}
else
{
m_lpObject = lpObject;
m_lpViewObject = lpViewObject;
m_dwConnection = dwConnection;
UpdateItemType();
}
ASSERT_VALID(this);
return bResult;
}
BOOL COleClientItem::Reload()
{
// first, close the object
Close();
// release any pointers we have to the object
RELEASE(m_lpObject);
RELEASE(m_lpViewObject);
// then reload the object with OleLoad and finish creation process
BOOL bResult = FinishCreate(::OleLoad(m_lpStorage, IID_IUnknown,
NULL, (LPLP)&m_lpObject));
ASSERT_VALID(this);
return bResult;
}
BOOL COleClientItem::ActivateAs(LPCTSTR lpszUserType,
REFCLSID clsidOld, REFCLSID clsidNew)
{
ASSERT_VALID(this);
ASSERT(lpszUserType == NULL || AfxIsValidString(lpszUserType));
ASSERT(m_lpObject != NULL);
// enable activate as
m_scLast = _AfxOleDoTreatAsClass(lpszUserType, clsidOld, clsidNew);
if (FAILED(m_scLast))
return FALSE;
// reload all items in this doucment
COleDocument* pDoc = GetDocument();
ASSERT_VALID(pDoc);
POSITION pos = pDoc->GetStartPosition();
COleClientItem* pItem;
while ((pItem = pDoc->GetNextClientItem(pos)) != NULL)
{
// reload it, so activate as works as appropriate
pItem->Reload();
}
ASSERT_VALID(this);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// COleClientItem printing support
BOOL COleClientItem::SetPrintDevice(const DVTARGETDEVICE* ptd)
{
ASSERT(ptd == NULL ||
AfxIsValidAddress(ptd, sizeof(DVTARGETDEVICE), FALSE));
// get printer device information from cache
LPOLECACHE lpOleCache;
DVTARGETDEVICE* ptdCur = NULL;
DWORD dwConnection;
if (!GetPrintDeviceInfo(&lpOleCache, &ptdCur, &dwConnection))
{
lpOleCache = QUERYINTERFACE(m_lpObject, IOleCache);
if (lpOleCache == NULL)
return FALSE; // no print device info available
}
ASSERT(lpOleCache != NULL);
// both may have no target device (considered equal)
if (ptd == NULL && ptdCur == NULL)
{
lpOleCache->Release();
CoTaskMemFree(ptdCur);
return TRUE;
}
if (ptd != NULL && ptdCur != NULL)
{
// should be non-NULL and valid addresses
ASSERT(AfxIsValidAddress(ptd, (size_t)ptd->tdSize));
ASSERT(AfxIsValidAddress(ptdCur, (size_t)ptdCur->tdSize));
// see if they compare equal
if (ptdCur->tdSize == ptd->tdSize &&
memcmp(ptdCur, ptd, (size_t)ptd->tdSize) == 0)
{
lpOleCache->Release();
CoTaskMemFree(ptdCur);
return TRUE;
}
}
// calling this with NULL will just remove the prevous printer cache
if (ptd != NULL)
{
// new cache is for CF_METAFILEPICT, DVASPECT_CONTENT
FORMATETC formatEtc;
formatEtc.cfFormat = CF_METAFILEPICT;
formatEtc.ptd = (DVTARGETDEVICE*)ptd;
formatEtc.dwAspect = DVASPECT_CONTENT;
formatEtc.lindex = -1;
formatEtc.tymed = TYMED_MFPICT;
// attempt to cache new format
DWORD dwNewConnection;
if (lpOleCache->Cache(&formatEtc, ADVFCACHE_ONSAVE,
&dwNewConnection) != S_OK)
{
lpOleCache->Release();
CoTaskMemFree(ptdCur);
return FALSE;
}
}
// new format is cached successfully, uncache old format
if (ptdCur != NULL)
{
lpOleCache->Uncache(dwConnection);
CoTaskMemFree(ptdCur);
}
// cleanup & return
lpOleCache->Release();
return TRUE;
}
BOOL COleClientItem::SetPrintDevice(const PRINTDLG* ppd)
{
ASSERT(ppd == NULL || AfxIsValidAddress(ppd, sizeof(*ppd), FALSE));
DVTARGETDEVICE* ptd = NULL;
if (ppd != NULL)
ptd = _AfxOleCreateTargetDevice((PRINTDLG*)ppd);
BOOL bResult = SetPrintDevice(ptd);
CoTaskMemFree(ptd);
return bResult;
}
/////////////////////////////////////////////////////////////////////////////
// other advanced COleClientItem support
void COleClientItem::GetUserType(
USERCLASSTYPE nUserClassType, CString& rString)
{
ASSERT_VALID(this);
ASSERT(m_lpObject != NULL);
LPOLESTR lpszUserType;
CheckGeneral(m_lpObject->GetUserType(nUserClassType, &lpszUserType));
ASSERT(lpszUserType != NULL);
ASSERT(AfxIsValidString(lpszUserType));
rString = lpszUserType;
CoTaskMemFree(lpszUserType);
}
void COleClientItem::Run()
{
ASSERT_VALID(this);
ASSERT(m_lpObject != NULL);
// is object already in running state?
if (::OleIsRunning(m_lpObject))
return;
// run the object -- throw exception on errors
SCODE sc = ::OleRun(m_lpObject);
CheckGeneral(sc);
// should be running now
ASSERT(::OleIsRunning(m_lpObject));
}
/////////////////////////////////////////////////////////////////////////////
// Linked COleClientItem operations
BOOL COleClientItem::UpdateLink()
{
ASSERT_VALID(this);
ASSERT(m_lpObject != NULL);
m_scLast = S_OK;
if (!IsLinkUpToDate())
{
m_scLast = m_lpObject->Update();
ASSERT_VALID(m_pDocument);
m_pDocument->SetModifiedFlag();
}
return m_scLast == S_OK;
}
BOOL COleClientItem::FreezeLink()
{
ASSERT_VALID(this);
ASSERT(m_lpObject != NULL);
ASSERT(m_pDocument != NULL);
ASSERT(GetType() == OT_LINK);
// first save & close the item
Close();
// get IDataObject interface
LPDATAOBJECT lpDataObject = QUERYINTERFACE(m_lpObject, IDataObject);
ASSERT(lpDataObject != NULL);
COleDataObject dataObject;
dataObject.Attach(lpDataObject, TRUE);
// save important state of original item
LPOLEOBJECT lpObject = m_lpObject;
LPSTORAGE lpStorage = m_lpStorage;
LPLOCKBYTES lpLockBytes = m_lpLockBytes;
LPVIEWOBJECT2 lpViewObject = m_lpViewObject;
DWORD dwConnection = m_dwConnection;
DWORD dwItemNumber = m_dwItemNumber;
m_lpObject = NULL;
m_lpStorage = NULL;
m_lpLockBytes = NULL;
m_lpViewObject = NULL;
m_dwConnection = 0;
// attempt to create new object from data
if (!CreateStaticFromData(&dataObject))
{
m_lpObject = lpObject;
m_lpStorage = lpStorage;
m_lpLockBytes = lpLockBytes;
m_lpViewObject = lpViewObject;
m_dwConnection = dwConnection;
return FALSE;
}
#ifdef _DEBUG
UpdateItemType();
ASSERT(GetType() == OT_STATIC);
#endif
// save new state of that item
LPOLEOBJECT lpNewObject = m_lpObject;
LPSTORAGE lpNewStorage = m_lpStorage;
LPLOCKBYTES lpNewLockBytes = m_lpLockBytes;
LPVIEWOBJECT2 lpNewViewObject = m_lpViewObject;
DWORD dwNewConnection = m_dwConnection;
DWORD dwNewItemNumber = m_dwItemNumber;
// shut down old item
m_lpObject = lpObject;
m_lpStorage = lpStorage;
m_lpLockBytes = lpLockBytes;
m_lpViewObject = lpViewObject;
m_dwConnection = dwConnection;
m_dwItemNumber = dwItemNumber;
#ifdef _DEBUG
UpdateItemType();
ASSERT(GetType() == OT_LINK);
#endif
Delete(FALSE); // revokes item & removes storage
// switch to new item
m_lpObject = lpNewObject;
m_lpStorage = lpNewStorage;
m_lpLockBytes = lpNewLockBytes;
m_lpViewObject = lpNewViewObject;
m_dwConnection = dwNewConnection;
m_dwItemNumber = dwNewItemNumber;
UpdateItemType();
ASSERT(GetType() == OT_STATIC);
// send an on changed with same state to invalidate the item
OnChange(OLE_CHANGED_STATE, (DWORD)GetItemState());
ASSERT_VALID(m_pDocument);
m_pDocument->SetModifiedFlag();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// Special link attributes
OLEUPDATE COleClientItem::GetLinkUpdateOptions()
{
ASSERT_VALID(this);
ASSERT(m_lpObject != NULL);
LPOLELINK lpOleLink = QUERYINTERFACE(m_lpObject, IOleLink);
ASSERT(lpOleLink != NULL); // perhaps not a link?
DWORD dwUpdateOpt;
SCODE sc = lpOleLink->GetUpdateOptions(&dwUpdateOpt);
lpOleLink->Release();
CheckGeneral(sc); // may throw an exception
return (OLEUPDATE)dwUpdateOpt;
}
void COleClientItem::SetLinkUpdateOptions(OLEUPDATE dwUpdateOpt)
{
ASSERT_VALID(this);
ASSERT(m_lpObject != NULL);
LPOLELINK lpOleLink = QUERYINTERFACE(m_lpObject, IOleLink);
ASSERT(lpOleLink != NULL); // perhaps not a link?
SCODE sc = lpOleLink->SetUpdateOptions(dwUpdateOpt);
lpOleLink->Release();
CheckGeneral(sc);
}
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -