#ifndef __InvokeArgs_h__
#define __InvokeArgs_h__

/////////////////////////////////////////////////////////////////////////////
// InvokeArgs.h | Declaration of the classes used in the for_each
// statements of the connection point sinks.

#ifndef _INC_STDARG
  #include <stdarg.h>
#endif // !_INC_STDARG


/////////////////////////////////////////////////////////////////////////////  
// TCInvokeArgs is used to maintains the set of arguments passed to an
// IDispatch::Invoke method.
//
class TCInvokeArgs : public tagDISPPARAMS
{
// Construction / Destruction
public:
  TCInvokeArgs();
  TCInvokeArgs(DISPID dispid, UINT nArgs, ...);
  virtual ~TCInvokeArgs();
  void CommonConstruct();

// Disallow copy constructor
private:
  TCInvokeArgs(const TCInvokeArgs&);

// Attributes
public:
  void SetDispParams(DISPID dispid, UINT nArgs, ...);
  void SetDispParamsV(DISPID dispid, UINT nArgs, va_list argptr);

// Operators
public:
  HRESULT Invoke(IDispatch* pdisp, VARIANT* pvarResult = NULL);
  void Empty();

// Group=Data Members
protected:
  // A dispatch ID used in subsequent calls to *IDispatch::Invoke*.
  //
  // See Also: TCInvokeArgs::Invoke, TCInvokeArgs::SetDispParams
  DISPID m_dispid;
};


/////////////////////////////////////////////////////////////////////////////
// Group=Construction / Destruction

/////////////////////////////////////////////////////////////////////////////
// Initializes the instance by setting m_dispid to *DISPID_UNKNOWN* and
// clearing the base structure to zeroes.
inline TCInvokeArgs::TCInvokeArgs()
{
  CommonConstruct();
}

inline TCInvokeArgs::TCInvokeArgs(DISPID dispid, UINT nArgs, ...)
{
  CommonConstruct();
  va_list argptr;
  va_start(argptr, nArgs);
  SetDispParamsV(dispid, nArgs, argptr);
  va_end(argptr);
}

inline void TCInvokeArgs::CommonConstruct()
{
  // Reset the DISPID
  m_dispid = DISPID_UNKNOWN;

  // Initialize the DISPPARAMS structure
  ZeroMemory(static_cast<tagDISPPARAMS*>(this), sizeof(tagDISPPARAMS));
}

/////////////////////////////////////////////////////////////////////////////
// Group=Attributes

/////////////////////////////////////////////////////////////////////////////
// Description: Sets the dispatch ID and dispatch parameters for subsequent
// *Invoke* calls.
//
// Sets the dispatch ID and dispatch parameters for subsequent
// *Invoke* calls. This method simply accesses the variable argument list and
// passes it to SetDispParamsV. Please see that method for more information.
//
// Parameters:
//   dispid - The dispatch ID used in subsequent *Invoke* calls.
//   cArgs - The number of dispatch arguments specified in the variable
// argument list.
//
// See Also: TCInvokeArgs::SetDispParamsV, TCInvokeArgs::Invoke,
// TCInvokeArgs::OnCreateDispParams, TCInvokeArgs::m_dispid
inline void TCInvokeArgs::SetDispParams(DISPID dispid, UINT nArgs, ...)
{
  va_list argptr;
  va_start(argptr, nArgs);
  SetDispParamsV(dispid, nArgs, argptr);
  va_end(argptr);
}


/////////////////////////////////////////////////////////////////////////////
// Group=Operations

/////////////////////////////////////////////////////////////////////////////
// Empties the instance by setting m_dispid to *DISPID_UNKNOWN* and clearing
// the base structure, releasing any memory previously allocated.
inline void TCInvokeArgs::Empty()
{
  // Release any previously allocated memory
  if (NULL != rgvarg)
  {
    delete [] rgvarg;
    CommonConstruct();
  }
}


/////////////////////////////////////////////////////////////////////////////

#endif // !__InvokeArgs_h__