windows-nt/Source/XPSP1/NT/multimedia/directx/dmusic/dmscript/autbaseimp.h
2020-09-26 16:20:57 +08:00

83 lines
2.3 KiB
C++

// Copyright (c) 1999 Microsoft Corporation. All rights reserved.
//
// Templated base class CAutBaseImp for constructing automation interfaces.
// Implements aggregation and IDispatched based on a table of method information.
//
#pragma once
#include "authelper.h"
// Inherit your class from CAutBaseImp with the following template types:
// * T_derived is the type of your class itself.
// * T_ITarget is the DirectMusic interface you are implemention automation for.
// * T_piid is the address of the IID of T_ITarget.
// Your class must have the following public static members:
// * static const AutDispatchMethod ms_Methods[];
// This table describes your methods and their parameters.
// * static const DispatchHandlerEntry<T_derived> ms_Handlers[];
// This table designates member functions on your class that will be called when
// your methods are invoked.
// * static const WCHAR ms_wszClassName[];
// This is the name of your class that will be output in the debug log
// as your functions are called.
// See autperformance.h and autperformance.cpp for an example of using this base class.
template <class T_derived>
struct DispatchHandlerEntry
{
typedef HRESULT (T_derived::* pmfnDispatchHandler)(AutDispatchDecodedParams *paddp);
DISPID dispid;
pmfnDispatchHandler pmfn;
};
template <class T_derived, class T_ITarget, const IID *T_piid>
class CAutBaseImp
: public CAutUnknown::CAutUnknownParent,
public IDispatch
{
public:
// IUnknown
STDMETHOD(QueryInterface)(const IID &iid, void **ppv);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
// IDispatch
STDMETHOD(GetTypeInfoCount)(UINT *pctinfo);
STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo);
STDMETHOD(GetIDsOfNames)(
REFIID riid,
LPOLESTR __RPC_FAR *rgszNames,
UINT cNames,
LCID lcid,
DISPID __RPC_FAR *rgDispId);
STDMETHOD(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);
protected:
CAutBaseImp(
IUnknown* pUnknownOuter,
const IID& iid,
void** ppv,
HRESULT *phr);
virtual ~CAutBaseImp() {}
T_ITarget *m_pITarget;
private:
CAutUnknown m_UnkControl;
virtual void Destroy();
};
#include "autbaseimp.inl"