Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

142 lines
3.3 KiB

/*++
Copyright (C) 1996-1999 Microsoft Corporation
Module Name:
dispatch.cpp
Abstract:
<abstract>
--*/
#include "polyline.h"
#include "unkhlpr.h"
extern ITypeLib *g_pITypeLib;
extern DWORD g_dwScriptPolicy;
//IDispatch interface implementation
IMPLEMENT_CONTAINED_INTERFACE(IUnknown, CImpIDispatch)
/*
* CImpIDispatch::GetTypeInfoCount
* CImpIDispatch::GetTypeInfo
* CImpIDispatch::GetIDsOfNames
*
* The usual
*/
void CImpIDispatch::SetInterface(REFIID riid, LPUNKNOWN pIUnk)
{
m_DIID = riid;
m_pInterface = pIUnk;
}
STDMETHODIMP CImpIDispatch::GetTypeInfoCount(UINT *pctInfo)
{
//We implement GetTypeInfo so return 1
*pctInfo=1;
return NOERROR;
}
STDMETHODIMP CImpIDispatch::GetTypeInfo(UINT itInfo, LCID /* lcid */
, ITypeInfo **ppITypeInfo)
{
if (0!=itInfo)
return ResultFromScode(TYPE_E_ELEMENTNOTFOUND);
if (NULL==ppITypeInfo)
return ResultFromScode(E_POINTER);
*ppITypeInfo=NULL;
//We ignore the LCID
return g_pITypeLib->GetTypeInfoOfGuid(m_DIID, ppITypeInfo);
}
STDMETHODIMP CImpIDispatch::GetIDsOfNames(REFIID riid
, OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID *rgDispID)
{
HRESULT hr;
ITypeInfo *pTI;
if (IID_NULL!=riid)
return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
hr=GetTypeInfo(0, lcid, &pTI);
if (SUCCEEDED(hr))
{
hr = DispGetIDsOfNames(pTI, rgszNames, cNames, rgDispID);
pTI->Release();
}
return hr;
}
/*
* CImpIDispatch::Invoke
*
* Purpose:
* Calls a method in the dispatch interface or manipulates a
* property.
*
* Parameters:
* dispID DISPID of the method or property of interest.
* riid REFIID reserved, must be IID_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 CImpIDispatch::Invoke(DISPID dispID, REFIID riid
, LCID lcid, unsigned short wFlags, DISPPARAMS *pDispParams
, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HRESULT hr;
ITypeInfo *pTI;
//riid is supposed to be IID_NULL always
if (IID_NULL != riid)
return ResultFromScode(DISP_E_UNKNOWNINTERFACE);
if (g_dwScriptPolicy == URLPOLICY_DISALLOW) {
if (m_DIID == DIID_DISystemMonitor)
return E_ACCESSDENIED;
}
// if dispatching to the graph control, use our internal interface
// that is generated from the direct interface (see smonctrl.odl)
if (m_DIID == DIID_DISystemMonitor)
hr = g_pITypeLib->GetTypeInfoOfGuid(DIID_DISystemMonitorInternal, &pTI);
else
hr = GetTypeInfo(0, lcid, &pTI);
if (FAILED(hr))
return hr;
hr = pTI->Invoke(m_pInterface, dispID, wFlags
, pDispParams, pVarResult, pExcepInfo, puArgErr);
pTI->Release();
return hr;
}