Article ID: 189486
Article Last Modified on 11/21/2006
class CSomeClientItem : public COleClientItem
{
...
BEGIN_INTERFACE_PART(OleServiceProvider, IServiceProvider)
INIT_INTERFACE_PART(CSomeClientItem, OleServiceProvider)
STDMETHOD(QueryService)
(REFGUID guidService, // Unique identifier for the requested
// service.
REFIID riid, //Unique identifier for the requested interface.
void** ppv); //Address of output variable.
END_INTERFACE_PART(OleServiceProvider)
DECLARE_INTERFACE_MAP()
...
};
Place the following code in the .cpp file of your derived ColeClientItem
class:
BEGIN_INTERFACE_MAP(CSomeClientItem, COleClientItem)
INTERFACE_PART(CSomeClientItem,IID_IServiceProvider,
OleServiceProvider)
END_INTERFACE_MAP()
STDMETHODIMP_(ULONG) CSomeClientItem::XOleServiceProvider::AddRef()
{
METHOD_PROLOGUE_EX(CSomeClientItem, OleServiceProvider)
return pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) CSomeClientItem::XOleServiceProvider::Release()
{
METHOD_PROLOGUE_EX(CSomeClientItem, OleServiceProvider)
return pThis->ExternalRelease();
}
STDMETHODIMP CSomeClientItem::XOleServiceProvider::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX(CSomeClientItem, OleServiceProvider)
return pThis->ExternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP CSomeClientItem::XOleServiceProvider::QueryService(
REFGUID guidService, REFIID riid, void** ppv)
{
METHOD_PROLOGUE_EX(CSomeClientItem, OleServiceProvider)
if ((guidService == SID_SContainerDispatch)&&(IID_IDispatch ==
riid))
{
// In this example, automation support has been added to
// the document.
if (*(ppv) = (LPVOID) pThis->GetDocument()->GetIDispatch(TRUE))
return S_OK;
else
return E_FAIL;
}
return E_FAIL;
}
Additional query words: IServiceProvider QueryService 430 Container Office Automation
Keywords: kbautomation kbcode kbcontainer kbhowto KB189486