Article ID: 177551
Article Last Modified on 8/5/2004
class CMyDocObjectServer : public CDocObjectServer
{
public:
CMyDocObjectServer(COleServerDoc* pOwner,
LPOLEDOCUMENTSITE pDocSite = NULL)
: CDocObjectServer(pOwner, pDocSite) {}
}
DECLARE_INTERFACE_MAP()
BEGIN_INTERFACE_PART(MyOleCommandTarget, IOleCommandTarget)
STDMETHOD(QueryStatus)(const GUID*, ULONG, OLECMD[], OLECMDTEXT*);
STDMETHOD(Exec)(const GUID*, DWORD, DWORD, VARIANTARG*,
VARIANTARG*);
END_INTERFACE_PART(MyOleCommandTarget)
BEGIN_INTERFACE_MAP(CMyDocObjectServer, CDocObjectServer)
INTERFACE_PART(CMyDocObjectServer, IID_IOleCommandTarget,
MyOleCommandTarget)
END_INTERFACE_MAP()
STDMETHODIMP_(ULONG)
CMyDocObjectServer::XMyOleCommandTarget::AddRef()
{
METHOD_PROLOGUE_EX(CMyDocObjectServer, MyOleCommandTarget)
ASSERT_VALID(pThis);
return pThis->m_xOleCommandTarget.AddRef();
}
STDMETHODIMP_(ULONG)
CMyDocObjectServer::XMyOleCommandTarget::Release()
{
METHOD_PROLOGUE_EX(CMyDocObjectServer, MyOleCommandTarget)
ASSERT_VALID(pThis);
return pThis->m_xOleCommandTarget.Release();
}
STDMETHODIMP CMyDocObjectServer::XMyOleCommandTarget::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX(CMyDocObjectServer, MyOleCommandTarget)
ASSERT_VALID(pThis);
return pThis->m_pOwner->ExternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP CMyDocObjectServer::XMyOleCommandTarget::Exec(
const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt,
VARIANTARG* pvarargIn, VARIANTARG* pvarargOut)
{
METHOD_PROLOGUE_EX(CMyDocObjectServer, MyOleCommandTarget)
ASSERT_VALID(pThis);
return pThis-&m_xOleCommandTarget.Exec(pguidCmdGroup, nCmdID,
nCmdExecOpt, pvarargIn,
pvarargOut);
}
STDMETHODIMP CMyDocObjectServer::XMyOleCommandTarget::QueryStatus(
const GUID* pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[],
OLECMDTEXT* pcmdtext)
{
...
}
This changes the nested class name from XOleCommandTarget to
XMyOleCommandTarget.
METHOD_PROLOGUE_EX(CMyDocObjectServer, OleCommandTarget)to this:
METHOD_PROLOGUE_EX(CMyDocObjectServer, MyOleCommandTarget)
COleCmdUI state(rgCmds, cCmds, pguidCmdGroup);to this
CMyOleCmdUI state(rgCmds, cCmds, pguidCmdGroup);CMyOleCmdUI is the COleCmdUI-derived class that you will create in step 10.
#include "MyDocObjectServer.h"
return new CMyDocObjectServer(this, pDocSite);
class CMyOleCmdUI : public COleCmdUI
{
public:
CMyOleCmdUI(OLECMD* rgCmds, ULONG cCmds, const GUID* pGroup)
: COleCmdUI(rgCmds, cCmds, pGroup)
{
}
virtual BOOL DoUpdate(CCmdTarget* pTarget, BOOL
bDisableIfNoHandler);
};
#include "MyOleCmdUI.h"
if (bDisableIfNoHandler && !m_bEnableChanged)
{
AFX_CMDHANDLERINFO info;
info.pTarget = NULL;
bResult = pTarget->OnCmdMsg(m_nID, CN_COMMAND, this, &info);
Enable(bResult);
if (bResult || m_bEnableChanged)
m_rgCmds[m_nIndex].cmdf |= OLECMDF_SUPPORTED;
else
m_rgCmds[m_nIndex].cmdf &= ~OLECMDF_SUPPORTED;
}
to this:
if (bDisableIfNoHandler && !m_bEnableChanged)
{
AFX_CMDHANDLERINFO info;
info.pTarget = NULL;
bResult = pTarget->OnCmdMsg(m_nID, CN_COMMAND, this, &info);
if (bResult || m_bEnableChanged)
m_rgCmds[m_nIndex].cmdf |= OLECMDF_SUPPORTED;
else
m_rgCmds[m_nIndex].cmdf &= ~OLECMDF_SUPPORTED;
Enable(bResult);
}
This changes the order in which Enable is called.
#include "afxconv.h"
and add this include statement to the CMyOleCmdUI implementation file:
#include <afxpriv.h>
119591 How to Obtain Microsoft Support Files from Online Services
Additional query words: Axdocfix
Keywords: kbinfo kbdownload kbfile kbsample KB177551