iup-stack/iup/srcole/tDispatch.cpp

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;
}