132 lines
3.6 KiB
C++
132 lines
3.6 KiB
C++
// Copyright (c) 1999 Microsoft Corporation. All rights reserved.
|
|
//
|
|
// Implements a script's global dispatch object.
|
|
//
|
|
|
|
#include "stdinc.h"
|
|
#include "globaldisp.h"
|
|
#include "autconstants.h"
|
|
#include "autperformance.h"
|
|
|
|
// We need to shift the DISPID's of the performance, constants, and contained
|
|
// content so that they can be assembled into one range. The performance will be first,
|
|
// followed by the others, which are shifted.
|
|
const DISPID g_dispidShiftConstants = 1000;
|
|
const DISPID g_dispidShiftContent = g_dispidShiftConstants + 1000;
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// IUnknown
|
|
|
|
STDMETHODIMP
|
|
CGlobalDispatch::QueryInterface(const IID &iid, void **ppv)
|
|
{
|
|
V_INAME(CGlobalDispatch::QueryInterface);
|
|
V_PTRPTR_WRITE(ppv);
|
|
V_REFGUID(iid);
|
|
|
|
if (iid == IID_IUnknown || iid == IID_IDispatch)
|
|
{
|
|
*ppv = static_cast<IDispatch*>(this);
|
|
}
|
|
else
|
|
{
|
|
*ppv = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
reinterpret_cast<IUnknown*>(this)->AddRef();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// IDispatch
|
|
|
|
STDMETHODIMP
|
|
CGlobalDispatch::GetTypeInfoCount(UINT *pctinfo)
|
|
{
|
|
V_INAME(CGlobalDispatch::GetTypeInfoCount);
|
|
V_PTR_WRITE(pctinfo, UINT);
|
|
|
|
*pctinfo = 0;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CGlobalDispatch::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo)
|
|
{
|
|
*ppTInfo = NULL;
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CGlobalDispatch::GetIDsOfNames(
|
|
REFIID riid,
|
|
LPOLESTR __RPC_FAR *rgszNames,
|
|
UINT cNames,
|
|
LCID lcid,
|
|
DISPID __RPC_FAR *rgDispId)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = AutConstantsGetIDsOfNames(riid, rgszNames, cNames, lcid, rgDispId);
|
|
if (hr != DISP_E_UNKNOWNNAME)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
rgDispId[0] += g_dispidShiftConstants;
|
|
return hr;
|
|
}
|
|
|
|
// Try the performance next. Conceptually we're doing this:
|
|
// hr = m_pParentScript->m_pDispPerformance->GetIDsOfNames(riid, rgszNames, cNames, lcid, rgDispId);
|
|
// However, because AudioVBScript may try and resolve names during parsing (before a performance is set by Init),
|
|
// we will won't use a live perfomance object for this. Instead we'll use the dispatch helper and the
|
|
// performance's table to return the ID.
|
|
hr = AutDispatchGetIDsOfNames(CAutDirectMusicPerformance::ms_Methods, riid, rgszNames, cNames, lcid, rgDispId);
|
|
if (hr != DISP_E_UNKNOWNNAME)
|
|
return hr;
|
|
|
|
hr = m_pParentScript->m_pContainerDispatch->GetIDsOfNames(riid, rgszNames, cNames, lcid, rgDispId);
|
|
if (SUCCEEDED(hr))
|
|
rgDispId[0] += g_dispidShiftContent;
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CGlobalDispatch::Invoke(
|
|
DISPID dispIdMember,
|
|
REFIID riid,
|
|
LCID lcid,
|
|
WORD wFlags,
|
|
DISPPARAMS __RPC_FAR *pDispParams,
|
|
VARIANT __RPC_FAR *pVarResult,
|
|
EXCEPINFO __RPC_FAR *pExcepInfo,
|
|
UINT __RPC_FAR *puArgErr)
|
|
{
|
|
// If script functions are being called, it is an error if the script has not been
|
|
// initialized with a performance.
|
|
if (!m_pParentScript->m_pDispPerformance)
|
|
{
|
|
Trace(1, "Error: IDirectMusicScript::Init must be called before the script can be used.\n");
|
|
return DMUS_E_NOT_INIT;
|
|
}
|
|
|
|
if (dispIdMember < g_dispidShiftConstants)
|
|
{
|
|
// Performance method
|
|
return m_pParentScript->m_pDispPerformance->Invoke(dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
|
|
}
|
|
else if (dispIdMember < g_dispidShiftContent)
|
|
{
|
|
// Constants
|
|
return AutConstantsInvoke(dispIdMember - g_dispidShiftConstants, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
|
|
}
|
|
else
|
|
{
|
|
// Contained content item
|
|
return m_pParentScript->m_pContainerDispatch->Invoke(dispIdMember - g_dispidShiftContent, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
|
|
}
|
|
}
|