237 lines
6.2 KiB
C++
Executable File
237 lines
6.2 KiB
C++
Executable File
// tDispatch.cpp: implementation of the tDispatch class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "tDispatch.h"
|
|
#include "tOleHandler.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
/*
|
|
* tDispatch::tDispatch
|
|
* tDispatch::~tDispatch
|
|
*
|
|
* Parameters (Constructor):
|
|
* pTen PCTenant of the tenant we're in.
|
|
* pUnkOuter LPUNKNOWN to which we delegate.
|
|
*/
|
|
|
|
tDispatch::tDispatch(tOleHandler *pTen, LPUNKNOWN pUnkOuter)
|
|
{
|
|
m_cRef=0;
|
|
m_pTen=pTen;
|
|
m_pUnkOuter=pUnkOuter;
|
|
return;
|
|
}
|
|
|
|
tDispatch::~tDispatch(void)
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
* tDispatch::QueryInterface
|
|
* tDispatch::AddRef
|
|
* tDispatch::Release
|
|
*/
|
|
|
|
STDMETHODIMP tDispatch::QueryInterface(REFIID riid, PPVOID ppv)
|
|
{
|
|
return m_pUnkOuter->QueryInterface(riid, ppv);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) tDispatch::AddRef(void)
|
|
{
|
|
++m_cRef;
|
|
return m_pUnkOuter->AddRef();
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) tDispatch::Release(void)
|
|
{
|
|
m_cRef--;
|
|
return m_pUnkOuter->Release();
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
* tDispatch::GetTypeInfoCount
|
|
* tDispatch::GetTypeInfo
|
|
* tDispatch::GetIDsOfNames
|
|
*
|
|
* Unimplemented members, not needed for ambient properties.
|
|
*/
|
|
|
|
STDMETHODIMP tDispatch::GetTypeInfoCount(UINT *pctInfo)
|
|
{
|
|
*pctInfo=0;
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP tDispatch::GetTypeInfo(UINT itinfo
|
|
, LCID lcid, ITypeInfo **pptInfo)
|
|
{
|
|
*pptInfo=NULL;
|
|
return ResultFromScode(E_NOTIMPL);
|
|
}
|
|
|
|
STDMETHODIMP tDispatch::GetIDsOfNames(REFIID riid
|
|
, OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID *rgDispID)
|
|
{
|
|
*rgszNames=NULL;
|
|
*rgDispID=NULL;
|
|
return ResultFromScode(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
* tDispatch::Invoke
|
|
*
|
|
* Purpose:
|
|
* Calls a method in the dispatch interface or manipulates a
|
|
* property.
|
|
*
|
|
* Parameters:
|
|
* dispIDMember DISPID of the method or property of interest.
|
|
* riid REFIID reserved, must be NULL.
|
|
* lcid LCID of the locale.
|
|
* wFlags USHORT describing the context of the invocation.
|
|
* pDispParams DISPPARAMS * to the array of arguments.
|
|
* pVarResult VARIANT * in which to store the result. Is
|
|
* NULL if the caller is not interested.
|
|
* pExcepInfo EXCEPINFO * to exception information.
|
|
* puArgErr UINT * in which to store the index of an
|
|
* invalid parameter if DISP_E_TYPEMISMATCH
|
|
* is returned.
|
|
*
|
|
* Return Value:
|
|
* HRESULT NOERROR or a general error code.
|
|
*/
|
|
|
|
|
|
STDMETHODIMP tDispatch::Invoke(DISPID dispIDMember, REFIID riid
|
|
, LCID lcid, unsigned short wFlags, DISPPARAMS *pDispParams
|
|
, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
|
|
{
|
|
HRESULT hr;
|
|
VARIANT varResult;
|
|
|
|
if (IID_NULL!=riid)
|
|
return ResultFromScode(E_INVALIDARG);
|
|
|
|
/*
|
|
* We ignore lcid in this function. A multilingual application
|
|
* might use it to determine the meaning of certain parameters
|
|
* or perhaps as an indication of how to format data like
|
|
* time, date, and currency or any other language or locale-
|
|
* sensitive data.
|
|
*/
|
|
|
|
/*
|
|
* Variable handling: since ambient properties is just a
|
|
* collection of singular read-only values, we don't have to
|
|
* worry about input parameters.
|
|
*/
|
|
|
|
/*
|
|
* If the caller is not interested in the return value, then
|
|
* pVarResult is NULL. But since we're dealing with ambient
|
|
* properties, there should always be an interest. In any case,
|
|
* if we're given a NULL, we'll point it to a dummy structure so
|
|
* the rest of the code can assume that pVarResult is non-NULL.
|
|
*/
|
|
if(NULL==pVarResult)
|
|
pVarResult=&varResult;
|
|
|
|
VariantInit(pVarResult);
|
|
|
|
//The most common case is boolean, use as an initial type
|
|
V_VT(pVarResult)=VT_BOOL;
|
|
|
|
/*
|
|
* Process the requested ambient property. Anything but a
|
|
* request for a property is invalid, so we can check that
|
|
* before looking at the specific ID. We can only get away
|
|
* with this because all properties are read-only.
|
|
*/
|
|
|
|
if (!(DISPATCH_PROPERTYGET & wFlags))
|
|
return ResultFromScode(DISP_E_MEMBERNOTFOUND);
|
|
|
|
hr=NOERROR;
|
|
|
|
switch (dispIDMember)
|
|
{
|
|
case DISPID_AMBIENT_BACKCOLOR:
|
|
V_I4(pVarResult)=m_pTen->m_ambientProp.getBackColor();
|
|
V_VT(pVarResult)=VT_I4;
|
|
break;
|
|
|
|
case DISPID_AMBIENT_FORECOLOR:
|
|
V_I4(pVarResult)=m_pTen->m_ambientProp.getForeColor();
|
|
V_VT(pVarResult)=VT_I4;
|
|
break;
|
|
|
|
case DISPID_AMBIENT_FONT:
|
|
/*
|
|
* If we failed to create the font, act like we
|
|
* don't support it.
|
|
*/
|
|
if (!m_pTen->m_ambientProp.has_font())
|
|
return ResultFromScode(DISP_E_MEMBERNOTFOUND);
|
|
|
|
//The correct type is an IFontDisp pointer
|
|
V_DISPATCH(pVarResult)=m_pTen->m_ambientProp.getFontRef();
|
|
V_VT(pVarResult)=VT_FONT;
|
|
break;
|
|
|
|
case DISPID_AMBIENT_LOCALEID:
|
|
V_I4(pVarResult)=m_pTen->m_ambientProp.getLCID();
|
|
V_VT(pVarResult)=VT_I4;
|
|
break;
|
|
|
|
case DISPID_AMBIENT_USERMODE:
|
|
V_BOOL(pVarResult)=!m_pTen->m_ambientProp.getDesignMode();
|
|
V_VT(pVarResult) = VT_BOOL;
|
|
break;
|
|
|
|
case DISPID_AMBIENT_UIDEAD:
|
|
//V_BOOL(pVarResult)=m_pTen->m_ambientProp.getUIDead();
|
|
V_BOOL(pVarResult)=FALSE;
|
|
V_VT(pVarResult) = VT_BOOL;
|
|
|
|
break;
|
|
|
|
case DISPID_AMBIENT_SUPPORTSMNEMONICS:
|
|
V_BOOL(pVarResult)=TRUE;
|
|
break;
|
|
|
|
case DISPID_AMBIENT_SHOWGRABHANDLES:
|
|
//V_BOOL(pVarResult)=m_pTen->m_ambientProp.m_fHatchHandles;
|
|
V_BOOL(pVarResult)=FALSE;
|
|
V_VT(pVarResult) = VT_BOOL;
|
|
break;
|
|
|
|
case DISPID_AMBIENT_SHOWHATCHING:
|
|
// V_BOOL(pVarResult)=m_pTen->m_ambientProp.m_fHatchHandles;
|
|
V_BOOL(pVarResult)=FALSE;
|
|
V_VT(pVarResult) = VT_BOOL;
|
|
break;
|
|
|
|
default:
|
|
hr=ResultFromScode(DISP_E_MEMBERNOTFOUND);
|
|
break;
|
|
}
|
|
|
|
return hr;
|
|
}
|