📄 ioleobj.cpp
字号:
//CHAPTER23MOD
if (NULL!=m_pObj->m_pIOleIPSite)
{
m_pObj->InPlaceDeactivate();
m_pObj->m_fAllowInPlace=FALSE;
}
//End CHAPTER23MOD
/*
* If we're not running, make sure we are. In any
* case, make the dialog visible and insure it has
* the right parent now.
*/
hr=NOERROR;
if (NULL==m_pObj->m_hDlg)
hr=m_pObj->m_pImpIRunnableObject->Run(NULL);
if (FAILED(hr) || NULL==m_pObj->m_hDlg)
return ResultFromScode(E_OUTOFMEMORY);
ShowWindow(m_pObj->m_hDlg, SW_SHOW);
SetFocus(m_pObj->m_hDlg);
m_pObj->SendAdvise(OBJECTCODE_SHOWOBJECT);
m_pObj->SendAdvise(OBJECTCODE_SHOWWINDOW);
break;
//CHAPTER23MOD
case OLEIVERB_INPLACEACTIVATE:
if (NULL!=m_pObj->m_pHW)
{
HWND hWndHW=m_pObj->m_pHW->Window();
ShowWindow(hWndHW, SW_SHOW);
SetFocus(hWndHW);
return NOERROR;
}
/*
* Only inside-out supporting containers will use
* this verb.
*/
m_pObj->m_fContainerKnowsInsideOut=TRUE;
m_pObj->InPlaceActivate(pActiveSite, FALSE);
break;
case OLEIVERB_UIACTIVATE:
m_pObj->InPlaceActivate(pActiveSite, TRUE);
break;
//End CHAPTER23MOD
default:
return ResultFromScode(OLEOBJ_S_INVALIDVERB);
}
return NOERROR;
}
/*
* CImpIOleObject::GetUserClassID
*
* Purpose:
* Used for linked objects, this returns the class ID of what end
* users think they are editing.
*
* Parameters:
* pClsID LPCLSID in which to store the CLSID.
*
* Return Value:
* HRESULT NOERROR or a general error value.
*/
STDMETHODIMP CImpIOleObject::GetUserClassID(LPCLSID pClsID)
{
/*
* If you are not registered to handle data other than yourself,
* then you can just return your class ID here. If you are
* registered as usable from Treat-As dialogs, then you need to
* return the CLSID of what you are really editing.
*/
*pClsID=CLSID_Polyline19;
return NOERROR;
}
/*
* CImpIOleObject::SetExtent
*
* Purpose:
* Sets the size of the object in HIMETRIC units. Since we're in
* a dialog, the size of the object in us is fixed, so we ignore
* this call.
*
* Parameters:
* dwAspect DWORD of the aspect affected.
* pszl LPSIZEL containing the new size.
*
* Return Value:
* HRESULT NOERROR or a general error value.
*/
STDMETHODIMP CImpIOleObject::SetExtent(DWORD dwAspect
, LPSIZEL pszl)
{
//Ignored: no size change in the dialog.
return NOERROR;
}
/*
* CImpIOleObject::GetExtent
*
* Purpose:
* Retrieves the size of the object in HIMETRIC units.
*
* Parameters:
* dwAspect DWORD of the aspect requested
* pszl LPSIZEL into which to store the size.
*
* Return Value:
* HRESULT NOERROR or a general error value.
*/
STDMETHODIMP CImpIOleObject::GetExtent(DWORD dwAspect, LPSIZEL pszl)
{
//Delegate directly to IViewObject2::GetExtent
return m_pObj->m_pImpIViewObject->GetExtent(dwAspect, -1
, NULL, pszl);
}
/*
* CImpIOleObject::Advise
* CImpIOleObject::Unadvise
* CImpIOleObject::EnumAdvise
*
* Purpose:
* Advisory connection functions.
*/
STDMETHODIMP CImpIOleObject::Advise(LPADVISESINK pIAdviseSink
, LPDWORD pdwConn)
{
if (NULL==m_pObj->m_pIOleAdviseHolder)
{
HRESULT hr;
hr=CreateOleAdviseHolder(&m_pObj->m_pIOleAdviseHolder);
if (FAILED(hr))
return hr;
}
return m_pObj->m_pIOleAdviseHolder->Advise(pIAdviseSink
, pdwConn);
}
STDMETHODIMP CImpIOleObject::Unadvise(DWORD dwConn)
{
if (NULL!=m_pObj->m_pIOleAdviseHolder)
return m_pObj->m_pIOleAdviseHolder->Unadvise(dwConn);
return ResultFromScode(E_FAIL);
}
STDMETHODIMP CImpIOleObject::EnumAdvise(LPENUMSTATDATA *ppEnum)
{
if (NULL!=m_pObj->m_pIOleAdviseHolder)
return m_pObj->m_pIOleAdviseHolder->EnumAdvise(ppEnum);
return ResultFromScode(E_FAIL);
}
/*
* CImpIOleObject::SetMoniker
*
* Purpose:
* Informs the object of its moniker or its container's moniker
* depending on dwWhich.
*
* Parameters:
* dwWhich DWORD describing whether the moniker is the
* object's or the container's.
* pmk LPMONIKER with the name.
*
* Return Value:
* HRESULT NOERROR or a general error value.
*/
STDMETHODIMP CImpIOleObject::SetMoniker(DWORD dwWhich
, LPMONIKER pmk)
{
LPMONIKER pmkFull;
HRESULT hr=ResultFromScode(E_FAIL);
if (NULL!=m_pObj->m_pIOleClientSite)
{
hr=m_pObj->m_pIOleClientSite->GetMoniker
(OLEGETMONIKER_ONLYIFTHERE, OLEWHICHMK_OBJFULL
, &pmkFull);
}
if (SUCCEEDED(hr))
{
if (NOERROR==pmkFull->IsRunning(NULL, NULL, NULL))
{
pmkFull->Release();
return NOERROR;
}
//This will revoke the old one if m_dwRegROT is nonzero.
INOLE_RegisterAsRunning(m_pObj, pmkFull, 0
, &m_pObj->m_dwRegROT);
//Inform clients of the new moniker
if (NULL!=m_pObj->m_pIOleAdviseHolder)
m_pObj->m_pIOleAdviseHolder->SendOnRename(pmkFull);
pmkFull->Release();
}
return hr;
}
/*
* CImpIOleObject::GetMoniker
*
* Purpose:
* Asks the object for a moniker that can later be used to
* reconnect to it.
*
* Parameters:
* dwAssign DWORD determining how to assign the moniker to
* to the object.
* dwWhich DWORD describing which moniker the caller wants.
* ppmk LPMONIKER * into which to store the moniker.
*
* Return Value:
* HRESULT NOERROR or a general error value.
*/
STDMETHODIMP CImpIOleObject::GetMoniker(DWORD dwAssign
, DWORD dwWhich, LPMONIKER *ppmk)
{
HRESULT hr=ResultFromScode(E_FAIL);
*ppmk=NULL;
/*
* Since we only support embedded objects, our moniker
* is always the full moniker from the contianer.
*/
if (NULL!=m_pObj->m_pIOleClientSite)
{
hr=m_pObj->m_pIOleClientSite->GetMoniker
(OLEGETMONIKER_ONLYIFTHERE, OLEWHICHMK_OBJFULL, ppmk);
}
return (NULL!=*ppmk) ? NOERROR : hr;
}
//Methods not implemented or trivial
STDMETHODIMP CImpIOleObject::InitFromData(LPDATAOBJECT pIDataObject
, BOOL fCreation, DWORD dw)
{
return ResultFromScode(E_NOTIMPL);
}
STDMETHODIMP CImpIOleObject::GetClipboardData(DWORD dwReserved
, LPDATAOBJECT *ppIDataObj)
{
return ResultFromScode(E_NOTIMPL);
}
STDMETHODIMP CImpIOleObject::Update(void)
{
return NOERROR;
}
STDMETHODIMP CImpIOleObject::IsUpToDate(void)
{
return NOERROR;
}
STDMETHODIMP CImpIOleObject::SetColorScheme(LPLOGPALETTE pLP)
{
return ResultFromScode(E_NOTIMPL);
}
//Methods implemented using registry helper functions in OLE.
STDMETHODIMP CImpIOleObject::EnumVerbs(LPENUMOLEVERB *ppEnum)
{
return OleRegEnumVerbs(m_pObj->m_clsID, ppEnum);
}
STDMETHODIMP CImpIOleObject::GetUserType(DWORD dwForm
, LPOLESTR *ppszType)
{
return OleRegGetUserType(m_pObj->m_clsID, dwForm, ppszType);
}
STDMETHODIMP CImpIOleObject::GetMiscStatus(DWORD dwAspect
, LPDWORD pdwStatus)
{
return OleRegGetMiscStatus(m_pObj->m_clsID, dwAspect
, pdwStatus);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -