OLEAUTO.H
//--------------------------------------------------------------------------- 
// OleAuto.h 
//--------------------------------------------------------------------------- 
// Simple class for doing dual OLE Automation interfaces 
//--------------------------------------------------------------------------- 
// (C) Copyright 1992-1997 by Microsoft Corporation.  All rights reserved. 
// 
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF  
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO  
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A  
// PARTICULAR PURPOSE. 
//--------------------------------------------------------------------------- 
 
//--------------------------------------------------------------------------- 
// A little utility which simplifies firing dispatch events. 
//--------------------------------------------------------------------------- 
HRESULT InvokeEvent 
  ( 
  IDispatch  *pdisp,    // IDispatch of Sink 
  DISPID      dispid,   // DISPID of event 
  VARIANTARG *pvararg,  // Args to event 
  UINT        carg      // # args 
  ); 
 
 
//--------------------------------------------------------------------------- 
// This routine will load a TypeLib and (optionally) find the TypeInfo inside 
// which matches the given clsid.  The TypeLib and TypeInfo pointers are 
// in/out so you can simply: 
//      hr = LoadTypeInfo(..., &g_pMyTypeLib, &m_pMyObjectsTypeInfo); 
// and it will fill in g_pMyTypeLib and m_pMyObjectsTypeInfo, if necessary. 
//--------------------------------------------------------------------------- 
HRESULT LoadTypeInfo 
  ( 
  HINSTANCE   hinst,             // hinst of where to load TypeLib from, if not found 
  UINT        itinfo,            // index of TypeInfo requested, only 0 supported 
  USHORT      dwMaj,             // Maj version # of TypeLib 
  USHORT      dwMin,             // Min version # of TypeLib 
  LCID        lcid,              // Locale of TypeLib to load 
  REFGUID     libid,             // LIBID of TypeLib  to find 
  REFCLSID    clsid,             // CLSID of TypeInfo to find 
  REFIID      iid,               // IID   of TypeInfo to find 
  BOOL        fDispOnly,         // TRUE=ensure *ptinfoIntInOut is a TKIND_DISPATCH, not vtbl 
  ITypeLib  **pptlibInOut,       // Ptr to cache of pTypeLib, typically &g_ptlib 
  ITypeInfo **pptinfoClassInOut, // Ptr to cache of pTypeInfo, typically &m_ptinfoCls 
  ITypeInfo **pptinfoIntInOut    // Ptr to cache of pTypeInfo, typically &m_ptinfoInt 
  ); 
 
 
//--------------------------------------------------------------------------- 
// Derrive from this class to get the standard implementation of IDispatch 
// over a vtable.  Assumes that "this" is the proper vtable, so to use, your 
// class should first derive from IMyCustomDualInterface, then from COleAuto. 
// Then implement GetTypeLibInfo(). 
//--------------------------------------------------------------------------- 
class COleAuto : public IDispatch 
  { 
public: 
  // *** IUnknown methods *** 
  STDMETHOD(QueryInterface)(REFIID riid, void** ppvObj) PURE; 
  STDMETHOD_(ULONG, AddRef)(void) PURE; 
  STDMETHOD_(ULONG, Release)(void) PURE; 
 
  // *** IDispatch methods *** 
  STDMETHOD(GetTypeInfoCount)(UINT* pctinfo); 
  STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo** pptinfoOut); 
  STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* prgdispid); 
  STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr); 
 
  // *** IProvideMultipleClassInfo methods *** 
  STDMETHOD(GetMultiTypeInfoCount)(ULONG *pc); 
  STDMETHOD(GetInfoOfIndex)(ULONG itinfo, DWORD dwFlags, ITypeInfo** pptinfoCoClass, DWORD* pdwTIFlags, ULONG* pcdispidReserved, IID* piidPrimary, IID* piidSource); 
 
  // *** Pure virtual methods for derived class to implement *** 
  virtual ITypeInfo **GetTinfoClsAddr(void) PURE; 
  virtual ITypeInfo **GetTinfoIntAddr(void) PURE; 
  virtual HRESULT GetTypeLibInfo(HINSTANCE *phinstOut, const GUID **pplibidOut,  
                                 SHORT *pwMajLibOut, SHORT *pwMinLibOut, 
                                 const CLSID **ppclsidOut, const IID **ppiidOut,  
                                 ITypeLib ***ppptlOut) PURE; 
  virtual IDispatch *GetPrimary(void) PURE; 
 
  // *** Other methods for derived class to call *** 
  HRESULT CheckTypeInfo(UINT itinfo, LCID lcid); 
  HRESULT SetBaseObject(IDispatch *pdisp); 
 
  // Member Variables 
  IDispatch *m_pdispBaseObject;   // The object this class is extending 
  }; 
 
 
//--------------------------------------------------------------------------- 
// Standard Dispatch 
//--------------------------------------------------------------------------- 
// All objects should declare these in their class definitions so that they 
// get standard implementations of IDispatch and ISupportErrorInfo. 
//--------------------------------------------------------------------------- 
#define DECLARE_STANDARD_DISPATCH() \ 
    STDMETHOD(GetTypeInfoCount)(UINT *pctinfo) \ 
      { return COleAuto::GetTypeInfoCount(pctinfo); } \ 
    STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo **pptinfoOut) \ 
      { return COleAuto::GetTypeInfo(itinfo, lcid, pptinfoOut); } \ 
    STDMETHOD(GetIDsOfNames)(REFIID iid, OLECHAR **rgszNames, UINT cnames, LCID lcid, DISPID *rgdispid) \ 
      { return COleAuto::GetIDsOfNames(iid, rgszNames, cnames, lcid, rgdispid); } \ 
    STDMETHOD(Invoke)(DISPID dispid, REFIID iid, LCID lcid, WORD wFlags, DISPPARAMS *pdispparams, VARIANT *pVarResult, EXCEPINFO *pexcepinfo, UINT *puArgErr) \ 
      { return COleAuto::Invoke(dispid, iid, lcid, wFlags, pdispparams, pVarResult, pexcepinfo, puArgErr); } 
 
//--- EOF -------------------------------------------------------------------