/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __RPCNDR_H_VERSION__
#error this stub requires an updated version of <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif

#ifndef __eventsys_h__
#define __eventsys_h__

#ifndef __IEventSystem_FWD_DEFINED__
#define __IEventSystem_FWD_DEFINED__
typedef struct IEventSystem IEventSystem;
#endif

#ifndef __IEventPublisher_FWD_DEFINED__
#define __IEventPublisher_FWD_DEFINED__
typedef struct IEventPublisher IEventPublisher;
#endif

#ifndef __IEventClass_FWD_DEFINED__
#define __IEventClass_FWD_DEFINED__
typedef struct IEventClass IEventClass;
#endif

#ifndef __IEventClass2_FWD_DEFINED__
#define __IEventClass2_FWD_DEFINED__
typedef struct IEventClass2 IEventClass2;
#endif

#ifndef __IEventSubscription_FWD_DEFINED__
#define __IEventSubscription_FWD_DEFINED__
typedef struct IEventSubscription IEventSubscription;
#endif

#ifndef __IFiringControl_FWD_DEFINED__
#define __IFiringControl_FWD_DEFINED__
typedef struct IFiringControl IFiringControl;
#endif

#ifndef __IPublisherFilter_FWD_DEFINED__
#define __IPublisherFilter_FWD_DEFINED__
typedef struct IPublisherFilter IPublisherFilter;
#endif

#ifndef __IMultiInterfacePublisherFilter_FWD_DEFINED__
#define __IMultiInterfacePublisherFilter_FWD_DEFINED__
typedef struct IMultiInterfacePublisherFilter IMultiInterfacePublisherFilter;
#endif

#ifndef __IEventObjectChange_FWD_DEFINED__
#define __IEventObjectChange_FWD_DEFINED__
typedef struct IEventObjectChange IEventObjectChange;
#endif

#ifndef __IEventObjectChange2_FWD_DEFINED__
#define __IEventObjectChange2_FWD_DEFINED__
typedef struct IEventObjectChange2 IEventObjectChange2;
#endif

#ifndef __IEnumEventObject_FWD_DEFINED__
#define __IEnumEventObject_FWD_DEFINED__
typedef struct IEnumEventObject IEnumEventObject;
#endif

#ifndef __IEventObjectCollection_FWD_DEFINED__
#define __IEventObjectCollection_FWD_DEFINED__
typedef struct IEventObjectCollection IEventObjectCollection;
#endif

#ifndef __IEventProperty_FWD_DEFINED__
#define __IEventProperty_FWD_DEFINED__
typedef struct IEventProperty IEventProperty;
#endif

#ifndef __IEventControl_FWD_DEFINED__
#define __IEventControl_FWD_DEFINED__
typedef struct IEventControl IEventControl;
#endif

#ifndef __IMultiInterfaceEventControl_FWD_DEFINED__
#define __IMultiInterfaceEventControl_FWD_DEFINED__
typedef struct IMultiInterfaceEventControl IMultiInterfaceEventControl;
#endif

#ifndef __CEventSystem_FWD_DEFINED__
#define __CEventSystem_FWD_DEFINED__
#ifdef __cplusplus
typedef class CEventSystem CEventSystem;
#else
typedef struct CEventSystem CEventSystem;
#endif
#endif

#ifndef __CEventPublisher_FWD_DEFINED__
#define __CEventPublisher_FWD_DEFINED__
#ifdef __cplusplus
typedef class CEventPublisher CEventPublisher;
#else
typedef struct CEventPublisher CEventPublisher;
#endif
#endif

#ifndef __CEventClass_FWD_DEFINED__
#define __CEventClass_FWD_DEFINED__
#ifdef __cplusplus
typedef class CEventClass CEventClass;
#else
typedef struct CEventClass CEventClass;
#endif
#endif

#ifndef __CEventSubscription_FWD_DEFINED__
#define __CEventSubscription_FWD_DEFINED__
#ifdef __cplusplus
typedef class CEventSubscription CEventSubscription;
#else
typedef struct CEventSubscription CEventSubscription;
#endif
#endif

#ifndef __EventObjectChange_FWD_DEFINED__
#define __EventObjectChange_FWD_DEFINED__
#ifdef __cplusplus
typedef class EventObjectChange EventObjectChange;
#else
typedef struct EventObjectChange EventObjectChange;
#endif
#endif

#ifndef __EventObjectChange2_FWD_DEFINED__
#define __EventObjectChange2_FWD_DEFINED__
#ifdef __cplusplus
typedef class EventObjectChange2 EventObjectChange2;
#else
typedef struct EventObjectChange2 EventObjectChange2;
#endif
#endif

#include "oaidl.h"
#include "ocidl.h"

#ifdef __cplusplus
extern "C"{
#endif

#ifndef __MIDL_user_allocate_free_DEFINED__
#define __MIDL_user_allocate_free_DEFINED__
  void *__RPC_API MIDL_user_allocate(size_t);
  void __RPC_API MIDL_user_free(void *);
#endif

#define PROGID_EventSystem OLESTR("EventSystem.EventSystem")
#define PROGID_EventPublisher OLESTR("EventSystem.EventPublisher")
#define PROGID_EventClass OLESTR("EventSystem.EventClass")
#define PROGID_EventSubscription OLESTR("EventSystem.EventSubscription")
#define PROGID_EventPublisherCollection OLESTR("EventSystem.EventPublisherCollection")
#define PROGID_EventClassCollection OLESTR("EventSystem.EventClassCollection")
#define PROGID_EventSubscriptionCollection OLESTR("EventSystem.EventSubscriptionCollection")
#define PROGID_EventSubsystem OLESTR("EventSystem.EventSubsystem")
#define EVENTSYSTEM_PUBLISHER_ID OLESTR("{d0564c30-9df4-11d1-a281-00c04fca0aa7}")
#define EVENTSYSTEM_SUBSYSTEM_CLSID OLESTR("{503c1fd8-b605-11d2-a92d-006008c60e24}")

  extern RPC_IF_HANDLE __MIDL_itf_eventsys_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_eventsys_0000_v0_0_s_ifspec;

#ifndef __IEventSystem_INTERFACE_DEFINED__
#define __IEventSystem_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEventSystem;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEventSystem : public IDispatch {
  public:
    virtual HRESULT WINAPI Query(BSTR progID,BSTR queryCriteria,int *errorIndex,IUnknown **ppInterface) = 0;
    virtual HRESULT WINAPI Store(BSTR ProgID,IUnknown *pInterface) = 0;
    virtual HRESULT WINAPI Remove(BSTR progID,BSTR queryCriteria,int *errorIndex) = 0;
    virtual HRESULT WINAPI get_EventObjectChangeEventClassID(BSTR *pbstrEventClassID) = 0;
    virtual HRESULT WINAPI QueryS(BSTR progID,BSTR queryCriteria,IUnknown **ppInterface) = 0;
    virtual HRESULT WINAPI RemoveS(BSTR progID,BSTR queryCriteria) = 0;
  };
#else
  typedef struct IEventSystemVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEventSystem *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEventSystem *This);
      ULONG (WINAPI *Release)(IEventSystem *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IEventSystem *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IEventSystem *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IEventSystem *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IEventSystem *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *Query)(IEventSystem *This,BSTR progID,BSTR queryCriteria,int *errorIndex,IUnknown **ppInterface);
      HRESULT (WINAPI *Store)(IEventSystem *This,BSTR ProgID,IUnknown *pInterface);
      HRESULT (WINAPI *Remove)(IEventSystem *This,BSTR progID,BSTR queryCriteria,int *errorIndex);
      HRESULT (WINAPI *get_EventObjectChangeEventClassID)(IEventSystem *This,BSTR *pbstrEventClassID);
      HRESULT (WINAPI *QueryS)(IEventSystem *This,BSTR progID,BSTR queryCriteria,IUnknown **ppInterface);
      HRESULT (WINAPI *RemoveS)(IEventSystem *This,BSTR progID,BSTR queryCriteria);
    END_INTERFACE
  } IEventSystemVtbl;
  struct IEventSystem {
    CONST_VTBL struct IEventSystemVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEventSystem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventSystem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventSystem_Release(This) (This)->lpVtbl->Release(This)
#define IEventSystem_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IEventSystem_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IEventSystem_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IEventSystem_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IEventSystem_Query(This,progID,queryCriteria,errorIndex,ppInterface) (This)->lpVtbl->Query(This,progID,queryCriteria,errorIndex,ppInterface)
#define IEventSystem_Store(This,ProgID,pInterface) (This)->lpVtbl->Store(This,ProgID,pInterface)
#define IEventSystem_Remove(This,progID,queryCriteria,errorIndex) (This)->lpVtbl->Remove(This,progID,queryCriteria,errorIndex)
#define IEventSystem_get_EventObjectChangeEventClassID(This,pbstrEventClassID) (This)->lpVtbl->get_EventObjectChangeEventClassID(This,pbstrEventClassID)
#define IEventSystem_QueryS(This,progID,queryCriteria,ppInterface) (This)->lpVtbl->QueryS(This,progID,queryCriteria,ppInterface)
#define IEventSystem_RemoveS(This,progID,queryCriteria) (This)->lpVtbl->RemoveS(This,progID,queryCriteria)
#endif
#endif
  HRESULT WINAPI IEventSystem_Query_Proxy(IEventSystem *This,BSTR progID,BSTR queryCriteria,int *errorIndex,IUnknown **ppInterface);
  void __RPC_STUB IEventSystem_Query_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSystem_Store_Proxy(IEventSystem *This,BSTR ProgID,IUnknown *pInterface);
  void __RPC_STUB IEventSystem_Store_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSystem_Remove_Proxy(IEventSystem *This,BSTR progID,BSTR queryCriteria,int *errorIndex);
  void __RPC_STUB IEventSystem_Remove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSystem_get_EventObjectChangeEventClassID_Proxy(IEventSystem *This,BSTR *pbstrEventClassID);
  void __RPC_STUB IEventSystem_get_EventObjectChangeEventClassID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSystem_QueryS_Proxy(IEventSystem *This,BSTR progID,BSTR queryCriteria,IUnknown **ppInterface);
  void __RPC_STUB IEventSystem_QueryS_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSystem_RemoveS_Proxy(IEventSystem *This,BSTR progID,BSTR queryCriteria);
  void __RPC_STUB IEventSystem_RemoveS_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEventPublisher_INTERFACE_DEFINED__
#define __IEventPublisher_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEventPublisher;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEventPublisher : public IDispatch {
  public:
    virtual HRESULT WINAPI get_PublisherID(BSTR *pbstrPublisherID) = 0;
    virtual HRESULT WINAPI put_PublisherID(BSTR bstrPublisherID) = 0;
    virtual HRESULT WINAPI get_PublisherName(BSTR *pbstrPublisherName) = 0;
    virtual HRESULT WINAPI put_PublisherName(BSTR bstrPublisherName) = 0;
    virtual HRESULT WINAPI get_PublisherType(BSTR *pbstrPublisherType) = 0;
    virtual HRESULT WINAPI put_PublisherType(BSTR bstrPublisherType) = 0;
    virtual HRESULT WINAPI get_OwnerSID(BSTR *pbstrOwnerSID) = 0;
    virtual HRESULT WINAPI put_OwnerSID(BSTR bstrOwnerSID) = 0;
    virtual HRESULT WINAPI get_Description(BSTR *pbstrDescription) = 0;
    virtual HRESULT WINAPI put_Description(BSTR bstrDescription) = 0;
    virtual HRESULT WINAPI GetDefaultProperty(BSTR bstrPropertyName,VARIANT *propertyValue) = 0;
    virtual HRESULT WINAPI PutDefaultProperty(BSTR bstrPropertyName,VARIANT *propertyValue) = 0;
    virtual HRESULT WINAPI RemoveDefaultProperty(BSTR bstrPropertyName) = 0;
    virtual HRESULT WINAPI GetDefaultPropertyCollection(IEventObjectCollection **collection) = 0;
  };
#else
  typedef struct IEventPublisherVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEventPublisher *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEventPublisher *This);
      ULONG (WINAPI *Release)(IEventPublisher *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IEventPublisher *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IEventPublisher *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IEventPublisher *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IEventPublisher *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_PublisherID)(IEventPublisher *This,BSTR *pbstrPublisherID);
      HRESULT (WINAPI *put_PublisherID)(IEventPublisher *This,BSTR bstrPublisherID);
      HRESULT (WINAPI *get_PublisherName)(IEventPublisher *This,BSTR *pbstrPublisherName);
      HRESULT (WINAPI *put_PublisherName)(IEventPublisher *This,BSTR bstrPublisherName);
      HRESULT (WINAPI *get_PublisherType)(IEventPublisher *This,BSTR *pbstrPublisherType);
      HRESULT (WINAPI *put_PublisherType)(IEventPublisher *This,BSTR bstrPublisherType);
      HRESULT (WINAPI *get_OwnerSID)(IEventPublisher *This,BSTR *pbstrOwnerSID);
      HRESULT (WINAPI *put_OwnerSID)(IEventPublisher *This,BSTR bstrOwnerSID);
      HRESULT (WINAPI *get_Description)(IEventPublisher *This,BSTR *pbstrDescription);
      HRESULT (WINAPI *put_Description)(IEventPublisher *This,BSTR bstrDescription);
      HRESULT (WINAPI *GetDefaultProperty)(IEventPublisher *This,BSTR bstrPropertyName,VARIANT *propertyValue);
      HRESULT (WINAPI *PutDefaultProperty)(IEventPublisher *This,BSTR bstrPropertyName,VARIANT *propertyValue);
      HRESULT (WINAPI *RemoveDefaultProperty)(IEventPublisher *This,BSTR bstrPropertyName);
      HRESULT (WINAPI *GetDefaultPropertyCollection)(IEventPublisher *This,IEventObjectCollection **collection);
    END_INTERFACE
  } IEventPublisherVtbl;
  struct IEventPublisher {
    CONST_VTBL struct IEventPublisherVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEventPublisher_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventPublisher_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventPublisher_Release(This) (This)->lpVtbl->Release(This)
#define IEventPublisher_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IEventPublisher_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IEventPublisher_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IEventPublisher_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IEventPublisher_get_PublisherID(This,pbstrPublisherID) (This)->lpVtbl->get_PublisherID(This,pbstrPublisherID)
#define IEventPublisher_put_PublisherID(This,bstrPublisherID) (This)->lpVtbl->put_PublisherID(This,bstrPublisherID)
#define IEventPublisher_get_PublisherName(This,pbstrPublisherName) (This)->lpVtbl->get_PublisherName(This,pbstrPublisherName)
#define IEventPublisher_put_PublisherName(This,bstrPublisherName) (This)->lpVtbl->put_PublisherName(This,bstrPublisherName)
#define IEventPublisher_get_PublisherType(This,pbstrPublisherType) (This)->lpVtbl->get_PublisherType(This,pbstrPublisherType)
#define IEventPublisher_put_PublisherType(This,bstrPublisherType) (This)->lpVtbl->put_PublisherType(This,bstrPublisherType)
#define IEventPublisher_get_OwnerSID(This,pbstrOwnerSID) (This)->lpVtbl->get_OwnerSID(This,pbstrOwnerSID)
#define IEventPublisher_put_OwnerSID(This,bstrOwnerSID) (This)->lpVtbl->put_OwnerSID(This,bstrOwnerSID)
#define IEventPublisher_get_Description(This,pbstrDescription) (This)->lpVtbl->get_Description(This,pbstrDescription)
#define IEventPublisher_put_Description(This,bstrDescription) (This)->lpVtbl->put_Description(This,bstrDescription)
#define IEventPublisher_GetDefaultProperty(This,bstrPropertyName,propertyValue) (This)->lpVtbl->GetDefaultProperty(This,bstrPropertyName,propertyValue)
#define IEventPublisher_PutDefaultProperty(This,bstrPropertyName,propertyValue) (This)->lpVtbl->PutDefaultProperty(This,bstrPropertyName,propertyValue)
#define IEventPublisher_RemoveDefaultProperty(This,bstrPropertyName) (This)->lpVtbl->RemoveDefaultProperty(This,bstrPropertyName)
#define IEventPublisher_GetDefaultPropertyCollection(This,collection) (This)->lpVtbl->GetDefaultPropertyCollection(This,collection)
#endif
#endif
  HRESULT WINAPI IEventPublisher_get_PublisherID_Proxy(IEventPublisher *This,BSTR *pbstrPublisherID);
  void __RPC_STUB IEventPublisher_get_PublisherID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_put_PublisherID_Proxy(IEventPublisher *This,BSTR bstrPublisherID);
  void __RPC_STUB IEventPublisher_put_PublisherID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_get_PublisherName_Proxy(IEventPublisher *This,BSTR *pbstrPublisherName);
  void __RPC_STUB IEventPublisher_get_PublisherName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_put_PublisherName_Proxy(IEventPublisher *This,BSTR bstrPublisherName);
  void __RPC_STUB IEventPublisher_put_PublisherName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_get_PublisherType_Proxy(IEventPublisher *This,BSTR *pbstrPublisherType);
  void __RPC_STUB IEventPublisher_get_PublisherType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_put_PublisherType_Proxy(IEventPublisher *This,BSTR bstrPublisherType);
  void __RPC_STUB IEventPublisher_put_PublisherType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_get_OwnerSID_Proxy(IEventPublisher *This,BSTR *pbstrOwnerSID);
  void __RPC_STUB IEventPublisher_get_OwnerSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_put_OwnerSID_Proxy(IEventPublisher *This,BSTR bstrOwnerSID);
  void __RPC_STUB IEventPublisher_put_OwnerSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_get_Description_Proxy(IEventPublisher *This,BSTR *pbstrDescription);
  void __RPC_STUB IEventPublisher_get_Description_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_put_Description_Proxy(IEventPublisher *This,BSTR bstrDescription);
  void __RPC_STUB IEventPublisher_put_Description_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_GetDefaultProperty_Proxy(IEventPublisher *This,BSTR bstrPropertyName,VARIANT *propertyValue);
  void __RPC_STUB IEventPublisher_GetDefaultProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_PutDefaultProperty_Proxy(IEventPublisher *This,BSTR bstrPropertyName,VARIANT *propertyValue);
  void __RPC_STUB IEventPublisher_PutDefaultProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_RemoveDefaultProperty_Proxy(IEventPublisher *This,BSTR bstrPropertyName);
  void __RPC_STUB IEventPublisher_RemoveDefaultProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventPublisher_GetDefaultPropertyCollection_Proxy(IEventPublisher *This,IEventObjectCollection **collection);
  void __RPC_STUB IEventPublisher_GetDefaultPropertyCollection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEventClass_INTERFACE_DEFINED__
#define __IEventClass_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEventClass;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEventClass : public IDispatch {
  public:
    virtual HRESULT WINAPI get_EventClassID(BSTR *pbstrEventClassID) = 0;
    virtual HRESULT WINAPI put_EventClassID(BSTR bstrEventClassID) = 0;
    virtual HRESULT WINAPI get_EventClassName(BSTR *pbstrEventClassName) = 0;
    virtual HRESULT WINAPI put_EventClassName(BSTR bstrEventClassName) = 0;
    virtual HRESULT WINAPI get_OwnerSID(BSTR *pbstrOwnerSID) = 0;
    virtual HRESULT WINAPI put_OwnerSID(BSTR bstrOwnerSID) = 0;
    virtual HRESULT WINAPI get_FiringInterfaceID(BSTR *pbstrFiringInterfaceID) = 0;
    virtual HRESULT WINAPI put_FiringInterfaceID(BSTR bstrFiringInterfaceID) = 0;
    virtual HRESULT WINAPI get_Description(BSTR *pbstrDescription) = 0;
    virtual HRESULT WINAPI put_Description(BSTR bstrDescription) = 0;
    virtual HRESULT WINAPI get_CustomConfigCLSID(BSTR *pbstrCustomConfigCLSID) = 0;
    virtual HRESULT WINAPI put_CustomConfigCLSID(BSTR bstrCustomConfigCLSID) = 0;
    virtual HRESULT WINAPI get_TypeLib(BSTR *pbstrTypeLib) = 0;
    virtual HRESULT WINAPI put_TypeLib(BSTR bstrTypeLib) = 0;
  };
#else
  typedef struct IEventClassVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEventClass *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEventClass *This);
      ULONG (WINAPI *Release)(IEventClass *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IEventClass *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IEventClass *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IEventClass *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IEventClass *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_EventClassID)(IEventClass *This,BSTR *pbstrEventClassID);
      HRESULT (WINAPI *put_EventClassID)(IEventClass *This,BSTR bstrEventClassID);
      HRESULT (WINAPI *get_EventClassName)(IEventClass *This,BSTR *pbstrEventClassName);
      HRESULT (WINAPI *put_EventClassName)(IEventClass *This,BSTR bstrEventClassName);
      HRESULT (WINAPI *get_OwnerSID)(IEventClass *This,BSTR *pbstrOwnerSID);
      HRESULT (WINAPI *put_OwnerSID)(IEventClass *This,BSTR bstrOwnerSID);
      HRESULT (WINAPI *get_FiringInterfaceID)(IEventClass *This,BSTR *pbstrFiringInterfaceID);
      HRESULT (WINAPI *put_FiringInterfaceID)(IEventClass *This,BSTR bstrFiringInterfaceID);
      HRESULT (WINAPI *get_Description)(IEventClass *This,BSTR *pbstrDescription);
      HRESULT (WINAPI *put_Description)(IEventClass *This,BSTR bstrDescription);
      HRESULT (WINAPI *get_CustomConfigCLSID)(IEventClass *This,BSTR *pbstrCustomConfigCLSID);
      HRESULT (WINAPI *put_CustomConfigCLSID)(IEventClass *This,BSTR bstrCustomConfigCLSID);
      HRESULT (WINAPI *get_TypeLib)(IEventClass *This,BSTR *pbstrTypeLib);
      HRESULT (WINAPI *put_TypeLib)(IEventClass *This,BSTR bstrTypeLib);
    END_INTERFACE
  } IEventClassVtbl;
  struct IEventClass {
    CONST_VTBL struct IEventClassVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEventClass_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventClass_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventClass_Release(This) (This)->lpVtbl->Release(This)
#define IEventClass_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IEventClass_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IEventClass_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IEventClass_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IEventClass_get_EventClassID(This,pbstrEventClassID) (This)->lpVtbl->get_EventClassID(This,pbstrEventClassID)
#define IEventClass_put_EventClassID(This,bstrEventClassID) (This)->lpVtbl->put_EventClassID(This,bstrEventClassID)
#define IEventClass_get_EventClassName(This,pbstrEventClassName) (This)->lpVtbl->get_EventClassName(This,pbstrEventClassName)
#define IEventClass_put_EventClassName(This,bstrEventClassName) (This)->lpVtbl->put_EventClassName(This,bstrEventClassName)
#define IEventClass_get_OwnerSID(This,pbstrOwnerSID) (This)->lpVtbl->get_OwnerSID(This,pbstrOwnerSID)
#define IEventClass_put_OwnerSID(This,bstrOwnerSID) (This)->lpVtbl->put_OwnerSID(This,bstrOwnerSID)
#define IEventClass_get_FiringInterfaceID(This,pbstrFiringInterfaceID) (This)->lpVtbl->get_FiringInterfaceID(This,pbstrFiringInterfaceID)
#define IEventClass_put_FiringInterfaceID(This,bstrFiringInterfaceID) (This)->lpVtbl->put_FiringInterfaceID(This,bstrFiringInterfaceID)
#define IEventClass_get_Description(This,pbstrDescription) (This)->lpVtbl->get_Description(This,pbstrDescription)
#define IEventClass_put_Description(This,bstrDescription) (This)->lpVtbl->put_Description(This,bstrDescription)
#define IEventClass_get_CustomConfigCLSID(This,pbstrCustomConfigCLSID) (This)->lpVtbl->get_CustomConfigCLSID(This,pbstrCustomConfigCLSID)
#define IEventClass_put_CustomConfigCLSID(This,bstrCustomConfigCLSID) (This)->lpVtbl->put_CustomConfigCLSID(This,bstrCustomConfigCLSID)
#define IEventClass_get_TypeLib(This,pbstrTypeLib) (This)->lpVtbl->get_TypeLib(This,pbstrTypeLib)
#define IEventClass_put_TypeLib(This,bstrTypeLib) (This)->lpVtbl->put_TypeLib(This,bstrTypeLib)
#endif
#endif
  HRESULT WINAPI IEventClass_get_EventClassID_Proxy(IEventClass *This,BSTR *pbstrEventClassID);
  void __RPC_STUB IEventClass_get_EventClassID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_put_EventClassID_Proxy(IEventClass *This,BSTR bstrEventClassID);
  void __RPC_STUB IEventClass_put_EventClassID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_get_EventClassName_Proxy(IEventClass *This,BSTR *pbstrEventClassName);
  void __RPC_STUB IEventClass_get_EventClassName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_put_EventClassName_Proxy(IEventClass *This,BSTR bstrEventClassName);
  void __RPC_STUB IEventClass_put_EventClassName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_get_OwnerSID_Proxy(IEventClass *This,BSTR *pbstrOwnerSID);
  void __RPC_STUB IEventClass_get_OwnerSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_put_OwnerSID_Proxy(IEventClass *This,BSTR bstrOwnerSID);
  void __RPC_STUB IEventClass_put_OwnerSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_get_FiringInterfaceID_Proxy(IEventClass *This,BSTR *pbstrFiringInterfaceID);
  void __RPC_STUB IEventClass_get_FiringInterfaceID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_put_FiringInterfaceID_Proxy(IEventClass *This,BSTR bstrFiringInterfaceID);
  void __RPC_STUB IEventClass_put_FiringInterfaceID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_get_Description_Proxy(IEventClass *This,BSTR *pbstrDescription);
  void __RPC_STUB IEventClass_get_Description_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_put_Description_Proxy(IEventClass *This,BSTR bstrDescription);
  void __RPC_STUB IEventClass_put_Description_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_get_CustomConfigCLSID_Proxy(IEventClass *This,BSTR *pbstrCustomConfigCLSID);
  void __RPC_STUB IEventClass_get_CustomConfigCLSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_put_CustomConfigCLSID_Proxy(IEventClass *This,BSTR bstrCustomConfigCLSID);
  void __RPC_STUB IEventClass_put_CustomConfigCLSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_get_TypeLib_Proxy(IEventClass *This,BSTR *pbstrTypeLib);
  void __RPC_STUB IEventClass_get_TypeLib_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass_put_TypeLib_Proxy(IEventClass *This,BSTR bstrTypeLib);
  void __RPC_STUB IEventClass_put_TypeLib_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEventClass2_INTERFACE_DEFINED__
#define __IEventClass2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEventClass2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEventClass2 : public IEventClass {
  public:
    virtual HRESULT WINAPI get_PublisherID(BSTR *pbstrPublisherID) = 0;
    virtual HRESULT WINAPI put_PublisherID(BSTR bstrPublisherID) = 0;
    virtual HRESULT WINAPI get_MultiInterfacePublisherFilterCLSID(BSTR *pbstrPubFilCLSID) = 0;
    virtual HRESULT WINAPI put_MultiInterfacePublisherFilterCLSID(BSTR bstrPubFilCLSID) = 0;
    virtual HRESULT WINAPI get_AllowInprocActivation(WINBOOL *pfAllowInprocActivation) = 0;
    virtual HRESULT WINAPI put_AllowInprocActivation(WINBOOL fAllowInprocActivation) = 0;
    virtual HRESULT WINAPI get_FireInParallel(WINBOOL *pfFireInParallel) = 0;
    virtual HRESULT WINAPI put_FireInParallel(WINBOOL fFireInParallel) = 0;
  };
#else
  typedef struct IEventClass2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEventClass2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEventClass2 *This);
      ULONG (WINAPI *Release)(IEventClass2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IEventClass2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IEventClass2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IEventClass2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IEventClass2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_EventClassID)(IEventClass2 *This,BSTR *pbstrEventClassID);
      HRESULT (WINAPI *put_EventClassID)(IEventClass2 *This,BSTR bstrEventClassID);
      HRESULT (WINAPI *get_EventClassName)(IEventClass2 *This,BSTR *pbstrEventClassName);
      HRESULT (WINAPI *put_EventClassName)(IEventClass2 *This,BSTR bstrEventClassName);
      HRESULT (WINAPI *get_OwnerSID)(IEventClass2 *This,BSTR *pbstrOwnerSID);
      HRESULT (WINAPI *put_OwnerSID)(IEventClass2 *This,BSTR bstrOwnerSID);
      HRESULT (WINAPI *get_FiringInterfaceID)(IEventClass2 *This,BSTR *pbstrFiringInterfaceID);
      HRESULT (WINAPI *put_FiringInterfaceID)(IEventClass2 *This,BSTR bstrFiringInterfaceID);
      HRESULT (WINAPI *get_Description)(IEventClass2 *This,BSTR *pbstrDescription);
      HRESULT (WINAPI *put_Description)(IEventClass2 *This,BSTR bstrDescription);
      HRESULT (WINAPI *get_CustomConfigCLSID)(IEventClass2 *This,BSTR *pbstrCustomConfigCLSID);
      HRESULT (WINAPI *put_CustomConfigCLSID)(IEventClass2 *This,BSTR bstrCustomConfigCLSID);
      HRESULT (WINAPI *get_TypeLib)(IEventClass2 *This,BSTR *pbstrTypeLib);
      HRESULT (WINAPI *put_TypeLib)(IEventClass2 *This,BSTR bstrTypeLib);
      HRESULT (WINAPI *get_PublisherID)(IEventClass2 *This,BSTR *pbstrPublisherID);
      HRESULT (WINAPI *put_PublisherID)(IEventClass2 *This,BSTR bstrPublisherID);
      HRESULT (WINAPI *get_MultiInterfacePublisherFilterCLSID)(IEventClass2 *This,BSTR *pbstrPubFilCLSID);
      HRESULT (WINAPI *put_MultiInterfacePublisherFilterCLSID)(IEventClass2 *This,BSTR bstrPubFilCLSID);
      HRESULT (WINAPI *get_AllowInprocActivation)(IEventClass2 *This,WINBOOL *pfAllowInprocActivation);
      HRESULT (WINAPI *put_AllowInprocActivation)(IEventClass2 *This,WINBOOL fAllowInprocActivation);
      HRESULT (WINAPI *get_FireInParallel)(IEventClass2 *This,WINBOOL *pfFireInParallel);
      HRESULT (WINAPI *put_FireInParallel)(IEventClass2 *This,WINBOOL fFireInParallel);
    END_INTERFACE
  } IEventClass2Vtbl;
  struct IEventClass2 {
    CONST_VTBL struct IEventClass2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEventClass2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventClass2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventClass2_Release(This) (This)->lpVtbl->Release(This)
#define IEventClass2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IEventClass2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IEventClass2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IEventClass2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IEventClass2_get_EventClassID(This,pbstrEventClassID) (This)->lpVtbl->get_EventClassID(This,pbstrEventClassID)
#define IEventClass2_put_EventClassID(This,bstrEventClassID) (This)->lpVtbl->put_EventClassID(This,bstrEventClassID)
#define IEventClass2_get_EventClassName(This,pbstrEventClassName) (This)->lpVtbl->get_EventClassName(This,pbstrEventClassName)
#define IEventClass2_put_EventClassName(This,bstrEventClassName) (This)->lpVtbl->put_EventClassName(This,bstrEventClassName)
#define IEventClass2_get_OwnerSID(This,pbstrOwnerSID) (This)->lpVtbl->get_OwnerSID(This,pbstrOwnerSID)
#define IEventClass2_put_OwnerSID(This,bstrOwnerSID) (This)->lpVtbl->put_OwnerSID(This,bstrOwnerSID)
#define IEventClass2_get_FiringInterfaceID(This,pbstrFiringInterfaceID) (This)->lpVtbl->get_FiringInterfaceID(This,pbstrFiringInterfaceID)
#define IEventClass2_put_FiringInterfaceID(This,bstrFiringInterfaceID) (This)->lpVtbl->put_FiringInterfaceID(This,bstrFiringInterfaceID)
#define IEventClass2_get_Description(This,pbstrDescription) (This)->lpVtbl->get_Description(This,pbstrDescription)
#define IEventClass2_put_Description(This,bstrDescription) (This)->lpVtbl->put_Description(This,bstrDescription)
#define IEventClass2_get_CustomConfigCLSID(This,pbstrCustomConfigCLSID) (This)->lpVtbl->get_CustomConfigCLSID(This,pbstrCustomConfigCLSID)
#define IEventClass2_put_CustomConfigCLSID(This,bstrCustomConfigCLSID) (This)->lpVtbl->put_CustomConfigCLSID(This,bstrCustomConfigCLSID)
#define IEventClass2_get_TypeLib(This,pbstrTypeLib) (This)->lpVtbl->get_TypeLib(This,pbstrTypeLib)
#define IEventClass2_put_TypeLib(This,bstrTypeLib) (This)->lpVtbl->put_TypeLib(This,bstrTypeLib)
#define IEventClass2_get_PublisherID(This,pbstrPublisherID) (This)->lpVtbl->get_PublisherID(This,pbstrPublisherID)
#define IEventClass2_put_PublisherID(This,bstrPublisherID) (This)->lpVtbl->put_PublisherID(This,bstrPublisherID)
#define IEventClass2_get_MultiInterfacePublisherFilterCLSID(This,pbstrPubFilCLSID) (This)->lpVtbl->get_MultiInterfacePublisherFilterCLSID(This,pbstrPubFilCLSID)
#define IEventClass2_put_MultiInterfacePublisherFilterCLSID(This,bstrPubFilCLSID) (This)->lpVtbl->put_MultiInterfacePublisherFilterCLSID(This,bstrPubFilCLSID)
#define IEventClass2_get_AllowInprocActivation(This,pfAllowInprocActivation) (This)->lpVtbl->get_AllowInprocActivation(This,pfAllowInprocActivation)
#define IEventClass2_put_AllowInprocActivation(This,fAllowInprocActivation) (This)->lpVtbl->put_AllowInprocActivation(This,fAllowInprocActivation)
#define IEventClass2_get_FireInParallel(This,pfFireInParallel) (This)->lpVtbl->get_FireInParallel(This,pfFireInParallel)
#define IEventClass2_put_FireInParallel(This,fFireInParallel) (This)->lpVtbl->put_FireInParallel(This,fFireInParallel)
#endif
#endif
  HRESULT WINAPI IEventClass2_get_PublisherID_Proxy(IEventClass2 *This,BSTR *pbstrPublisherID);
  void __RPC_STUB IEventClass2_get_PublisherID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass2_put_PublisherID_Proxy(IEventClass2 *This,BSTR bstrPublisherID);
  void __RPC_STUB IEventClass2_put_PublisherID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass2_get_MultiInterfacePublisherFilterCLSID_Proxy(IEventClass2 *This,BSTR *pbstrPubFilCLSID);
  void __RPC_STUB IEventClass2_get_MultiInterfacePublisherFilterCLSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass2_put_MultiInterfacePublisherFilterCLSID_Proxy(IEventClass2 *This,BSTR bstrPubFilCLSID);
  void __RPC_STUB IEventClass2_put_MultiInterfacePublisherFilterCLSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass2_get_AllowInprocActivation_Proxy(IEventClass2 *This,WINBOOL *pfAllowInprocActivation);
  void __RPC_STUB IEventClass2_get_AllowInprocActivation_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass2_put_AllowInprocActivation_Proxy(IEventClass2 *This,WINBOOL fAllowInprocActivation);
  void __RPC_STUB IEventClass2_put_AllowInprocActivation_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass2_get_FireInParallel_Proxy(IEventClass2 *This,WINBOOL *pfFireInParallel);
  void __RPC_STUB IEventClass2_get_FireInParallel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventClass2_put_FireInParallel_Proxy(IEventClass2 *This,WINBOOL fFireInParallel);
  void __RPC_STUB IEventClass2_put_FireInParallel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEventSubscription_INTERFACE_DEFINED__
#define __IEventSubscription_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEventSubscription;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEventSubscription : public IDispatch {
  public:
    virtual HRESULT WINAPI get_SubscriptionID(BSTR *pbstrSubscriptionID) = 0;
    virtual HRESULT WINAPI put_SubscriptionID(BSTR bstrSubscriptionID) = 0;
    virtual HRESULT WINAPI get_SubscriptionName(BSTR *pbstrSubscriptionName) = 0;
    virtual HRESULT WINAPI put_SubscriptionName(BSTR bstrSubscriptionName) = 0;
    virtual HRESULT WINAPI get_PublisherID(BSTR *pbstrPublisherID) = 0;
    virtual HRESULT WINAPI put_PublisherID(BSTR bstrPublisherID) = 0;
    virtual HRESULT WINAPI get_EventClassID(BSTR *pbstrEventClassID) = 0;
    virtual HRESULT WINAPI put_EventClassID(BSTR bstrEventClassID) = 0;
    virtual HRESULT WINAPI get_MethodName(BSTR *pbstrMethodName) = 0;
    virtual HRESULT WINAPI put_MethodName(BSTR bstrMethodName) = 0;
    virtual HRESULT WINAPI get_SubscriberCLSID(BSTR *pbstrSubscriberCLSID) = 0;
    virtual HRESULT WINAPI put_SubscriberCLSID(BSTR bstrSubscriberCLSID) = 0;
    virtual HRESULT WINAPI get_SubscriberInterface(IUnknown **ppSubscriberInterface) = 0;
    virtual HRESULT WINAPI put_SubscriberInterface(IUnknown *pSubscriberInterface) = 0;
    virtual HRESULT WINAPI get_PerUser(WINBOOL *pfPerUser) = 0;
    virtual HRESULT WINAPI put_PerUser(WINBOOL fPerUser) = 0;
    virtual HRESULT WINAPI get_OwnerSID(BSTR *pbstrOwnerSID) = 0;
    virtual HRESULT WINAPI put_OwnerSID(BSTR bstrOwnerSID) = 0;
    virtual HRESULT WINAPI get_Enabled(WINBOOL *pfEnabled) = 0;
    virtual HRESULT WINAPI put_Enabled(WINBOOL fEnabled) = 0;
    virtual HRESULT WINAPI get_Description(BSTR *pbstrDescription) = 0;
    virtual HRESULT WINAPI put_Description(BSTR bstrDescription) = 0;
    virtual HRESULT WINAPI get_MachineName(BSTR *pbstrMachineName) = 0;
    virtual HRESULT WINAPI put_MachineName(BSTR bstrMachineName) = 0;
    virtual HRESULT WINAPI GetPublisherProperty(BSTR bstrPropertyName,VARIANT *propertyValue) = 0;
    virtual HRESULT WINAPI PutPublisherProperty(BSTR bstrPropertyName,VARIANT *propertyValue) = 0;
    virtual HRESULT WINAPI RemovePublisherProperty(BSTR bstrPropertyName) = 0;
    virtual HRESULT WINAPI GetPublisherPropertyCollection(IEventObjectCollection **collection) = 0;
    virtual HRESULT WINAPI GetSubscriberProperty(BSTR bstrPropertyName,VARIANT *propertyValue) = 0;
    virtual HRESULT WINAPI PutSubscriberProperty(BSTR bstrPropertyName,VARIANT *propertyValue) = 0;
    virtual HRESULT WINAPI RemoveSubscriberProperty(BSTR bstrPropertyName) = 0;
    virtual HRESULT WINAPI GetSubscriberPropertyCollection(IEventObjectCollection **collection) = 0;
    virtual HRESULT WINAPI get_InterfaceID(BSTR *pbstrInterfaceID) = 0;
    virtual HRESULT WINAPI put_InterfaceID(BSTR bstrInterfaceID) = 0;
  };
#else
  typedef struct IEventSubscriptionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEventSubscription *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEventSubscription *This);
      ULONG (WINAPI *Release)(IEventSubscription *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IEventSubscription *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IEventSubscription *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IEventSubscription *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IEventSubscription *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_SubscriptionID)(IEventSubscription *This,BSTR *pbstrSubscriptionID);
      HRESULT (WINAPI *put_SubscriptionID)(IEventSubscription *This,BSTR bstrSubscriptionID);
      HRESULT (WINAPI *get_SubscriptionName)(IEventSubscription *This,BSTR *pbstrSubscriptionName);
      HRESULT (WINAPI *put_SubscriptionName)(IEventSubscription *This,BSTR bstrSubscriptionName);
      HRESULT (WINAPI *get_PublisherID)(IEventSubscription *This,BSTR *pbstrPublisherID);
      HRESULT (WINAPI *put_PublisherID)(IEventSubscription *This,BSTR bstrPublisherID);
      HRESULT (WINAPI *get_EventClassID)(IEventSubscription *This,BSTR *pbstrEventClassID);
      HRESULT (WINAPI *put_EventClassID)(IEventSubscription *This,BSTR bstrEventClassID);
      HRESULT (WINAPI *get_MethodName)(IEventSubscription *This,BSTR *pbstrMethodName);
      HRESULT (WINAPI *put_MethodName)(IEventSubscription *This,BSTR bstrMethodName);
      HRESULT (WINAPI *get_SubscriberCLSID)(IEventSubscription *This,BSTR *pbstrSubscriberCLSID);
      HRESULT (WINAPI *put_SubscriberCLSID)(IEventSubscription *This,BSTR bstrSubscriberCLSID);
      HRESULT (WINAPI *get_SubscriberInterface)(IEventSubscription *This,IUnknown **ppSubscriberInterface);
      HRESULT (WINAPI *put_SubscriberInterface)(IEventSubscription *This,IUnknown *pSubscriberInterface);
      HRESULT (WINAPI *get_PerUser)(IEventSubscription *This,WINBOOL *pfPerUser);
      HRESULT (WINAPI *put_PerUser)(IEventSubscription *This,WINBOOL fPerUser);
      HRESULT (WINAPI *get_OwnerSID)(IEventSubscription *This,BSTR *pbstrOwnerSID);
      HRESULT (WINAPI *put_OwnerSID)(IEventSubscription *This,BSTR bstrOwnerSID);
      HRESULT (WINAPI *get_Enabled)(IEventSubscription *This,WINBOOL *pfEnabled);
      HRESULT (WINAPI *put_Enabled)(IEventSubscription *This,WINBOOL fEnabled);
      HRESULT (WINAPI *get_Description)(IEventSubscription *This,BSTR *pbstrDescription);
      HRESULT (WINAPI *put_Description)(IEventSubscription *This,BSTR bstrDescription);
      HRESULT (WINAPI *get_MachineName)(IEventSubscription *This,BSTR *pbstrMachineName);
      HRESULT (WINAPI *put_MachineName)(IEventSubscription *This,BSTR bstrMachineName);
      HRESULT (WINAPI *GetPublisherProperty)(IEventSubscription *This,BSTR bstrPropertyName,VARIANT *propertyValue);
      HRESULT (WINAPI *PutPublisherProperty)(IEventSubscription *This,BSTR bstrPropertyName,VARIANT *propertyValue);
      HRESULT (WINAPI *RemovePublisherProperty)(IEventSubscription *This,BSTR bstrPropertyName);
      HRESULT (WINAPI *GetPublisherPropertyCollection)(IEventSubscription *This,IEventObjectCollection **collection);
      HRESULT (WINAPI *GetSubscriberProperty)(IEventSubscription *This,BSTR bstrPropertyName,VARIANT *propertyValue);
      HRESULT (WINAPI *PutSubscriberProperty)(IEventSubscription *This,BSTR bstrPropertyName,VARIANT *propertyValue);
      HRESULT (WINAPI *RemoveSubscriberProperty)(IEventSubscription *This,BSTR bstrPropertyName);
      HRESULT (WINAPI *GetSubscriberPropertyCollection)(IEventSubscription *This,IEventObjectCollection **collection);
      HRESULT (WINAPI *get_InterfaceID)(IEventSubscription *This,BSTR *pbstrInterfaceID);
      HRESULT (WINAPI *put_InterfaceID)(IEventSubscription *This,BSTR bstrInterfaceID);
    END_INTERFACE
  } IEventSubscriptionVtbl;
  struct IEventSubscription {
    CONST_VTBL struct IEventSubscriptionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEventSubscription_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventSubscription_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventSubscription_Release(This) (This)->lpVtbl->Release(This)
#define IEventSubscription_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IEventSubscription_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IEventSubscription_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IEventSubscription_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IEventSubscription_get_SubscriptionID(This,pbstrSubscriptionID) (This)->lpVtbl->get_SubscriptionID(This,pbstrSubscriptionID)
#define IEventSubscription_put_SubscriptionID(This,bstrSubscriptionID) (This)->lpVtbl->put_SubscriptionID(This,bstrSubscriptionID)
#define IEventSubscription_get_SubscriptionName(This,pbstrSubscriptionName) (This)->lpVtbl->get_SubscriptionName(This,pbstrSubscriptionName)
#define IEventSubscription_put_SubscriptionName(This,bstrSubscriptionName) (This)->lpVtbl->put_SubscriptionName(This,bstrSubscriptionName)
#define IEventSubscription_get_PublisherID(This,pbstrPublisherID) (This)->lpVtbl->get_PublisherID(This,pbstrPublisherID)
#define IEventSubscription_put_PublisherID(This,bstrPublisherID) (This)->lpVtbl->put_PublisherID(This,bstrPublisherID)
#define IEventSubscription_get_EventClassID(This,pbstrEventClassID) (This)->lpVtbl->get_EventClassID(This,pbstrEventClassID)
#define IEventSubscription_put_EventClassID(This,bstrEventClassID) (This)->lpVtbl->put_EventClassID(This,bstrEventClassID)
#define IEventSubscription_get_MethodName(This,pbstrMethodName) (This)->lpVtbl->get_MethodName(This,pbstrMethodName)
#define IEventSubscription_put_MethodName(This,bstrMethodName) (This)->lpVtbl->put_MethodName(This,bstrMethodName)
#define IEventSubscription_get_SubscriberCLSID(This,pbstrSubscriberCLSID) (This)->lpVtbl->get_SubscriberCLSID(This,pbstrSubscriberCLSID)
#define IEventSubscription_put_SubscriberCLSID(This,bstrSubscriberCLSID) (This)->lpVtbl->put_SubscriberCLSID(This,bstrSubscriberCLSID)
#define IEventSubscription_get_SubscriberInterface(This,ppSubscriberInterface) (This)->lpVtbl->get_SubscriberInterface(This,ppSubscriberInterface)
#define IEventSubscription_put_SubscriberInterface(This,pSubscriberInterface) (This)->lpVtbl->put_SubscriberInterface(This,pSubscriberInterface)
#define IEventSubscription_get_PerUser(This,pfPerUser) (This)->lpVtbl->get_PerUser(This,pfPerUser)
#define IEventSubscription_put_PerUser(This,fPerUser) (This)->lpVtbl->put_PerUser(This,fPerUser)
#define IEventSubscription_get_OwnerSID(This,pbstrOwnerSID) (This)->lpVtbl->get_OwnerSID(This,pbstrOwnerSID)
#define IEventSubscription_put_OwnerSID(This,bstrOwnerSID) (This)->lpVtbl->put_OwnerSID(This,bstrOwnerSID)
#define IEventSubscription_get_Enabled(This,pfEnabled) (This)->lpVtbl->get_Enabled(This,pfEnabled)
#define IEventSubscription_put_Enabled(This,fEnabled) (This)->lpVtbl->put_Enabled(This,fEnabled)
#define IEventSubscription_get_Description(This,pbstrDescription) (This)->lpVtbl->get_Description(This,pbstrDescription)
#define IEventSubscription_put_Description(This,bstrDescription) (This)->lpVtbl->put_Description(This,bstrDescription)
#define IEventSubscription_get_MachineName(This,pbstrMachineName) (This)->lpVtbl->get_MachineName(This,pbstrMachineName)
#define IEventSubscription_put_MachineName(This,bstrMachineName) (This)->lpVtbl->put_MachineName(This,bstrMachineName)
#define IEventSubscription_GetPublisherProperty(This,bstrPropertyName,propertyValue) (This)->lpVtbl->GetPublisherProperty(This,bstrPropertyName,propertyValue)
#define IEventSubscription_PutPublisherProperty(This,bstrPropertyName,propertyValue) (This)->lpVtbl->PutPublisherProperty(This,bstrPropertyName,propertyValue)
#define IEventSubscription_RemovePublisherProperty(This,bstrPropertyName) (This)->lpVtbl->RemovePublisherProperty(This,bstrPropertyName)
#define IEventSubscription_GetPublisherPropertyCollection(This,collection) (This)->lpVtbl->GetPublisherPropertyCollection(This,collection)
#define IEventSubscription_GetSubscriberProperty(This,bstrPropertyName,propertyValue) (This)->lpVtbl->GetSubscriberProperty(This,bstrPropertyName,propertyValue)
#define IEventSubscription_PutSubscriberProperty(This,bstrPropertyName,propertyValue) (This)->lpVtbl->PutSubscriberProperty(This,bstrPropertyName,propertyValue)
#define IEventSubscription_RemoveSubscriberProperty(This,bstrPropertyName) (This)->lpVtbl->RemoveSubscriberProperty(This,bstrPropertyName)
#define IEventSubscription_GetSubscriberPropertyCollection(This,collection) (This)->lpVtbl->GetSubscriberPropertyCollection(This,collection)
#define IEventSubscription_get_InterfaceID(This,pbstrInterfaceID) (This)->lpVtbl->get_InterfaceID(This,pbstrInterfaceID)
#define IEventSubscription_put_InterfaceID(This,bstrInterfaceID) (This)->lpVtbl->put_InterfaceID(This,bstrInterfaceID)
#endif
#endif
  HRESULT WINAPI IEventSubscription_get_SubscriptionID_Proxy(IEventSubscription *This,BSTR *pbstrSubscriptionID);
  void __RPC_STUB IEventSubscription_get_SubscriptionID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_SubscriptionID_Proxy(IEventSubscription *This,BSTR bstrSubscriptionID);
  void __RPC_STUB IEventSubscription_put_SubscriptionID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_get_SubscriptionName_Proxy(IEventSubscription *This,BSTR *pbstrSubscriptionName);
  void __RPC_STUB IEventSubscription_get_SubscriptionName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_SubscriptionName_Proxy(IEventSubscription *This,BSTR bstrSubscriptionName);
  void __RPC_STUB IEventSubscription_put_SubscriptionName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_get_PublisherID_Proxy(IEventSubscription *This,BSTR *pbstrPublisherID);
  void __RPC_STUB IEventSubscription_get_PublisherID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_PublisherID_Proxy(IEventSubscription *This,BSTR bstrPublisherID);
  void __RPC_STUB IEventSubscription_put_PublisherID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_get_EventClassID_Proxy(IEventSubscription *This,BSTR *pbstrEventClassID);
  void __RPC_STUB IEventSubscription_get_EventClassID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_EventClassID_Proxy(IEventSubscription *This,BSTR bstrEventClassID);
  void __RPC_STUB IEventSubscription_put_EventClassID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_get_MethodName_Proxy(IEventSubscription *This,BSTR *pbstrMethodName);
  void __RPC_STUB IEventSubscription_get_MethodName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_MethodName_Proxy(IEventSubscription *This,BSTR bstrMethodName);
  void __RPC_STUB IEventSubscription_put_MethodName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_get_SubscriberCLSID_Proxy(IEventSubscription *This,BSTR *pbstrSubscriberCLSID);
  void __RPC_STUB IEventSubscription_get_SubscriberCLSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_SubscriberCLSID_Proxy(IEventSubscription *This,BSTR bstrSubscriberCLSID);
  void __RPC_STUB IEventSubscription_put_SubscriberCLSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_get_SubscriberInterface_Proxy(IEventSubscription *This,IUnknown **ppSubscriberInterface);
  void __RPC_STUB IEventSubscription_get_SubscriberInterface_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_SubscriberInterface_Proxy(IEventSubscription *This,IUnknown *pSubscriberInterface);
  void __RPC_STUB IEventSubscription_put_SubscriberInterface_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_get_PerUser_Proxy(IEventSubscription *This,WINBOOL *pfPerUser);
  void __RPC_STUB IEventSubscription_get_PerUser_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_PerUser_Proxy(IEventSubscription *This,WINBOOL fPerUser);
  void __RPC_STUB IEventSubscription_put_PerUser_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_get_OwnerSID_Proxy(IEventSubscription *This,BSTR *pbstrOwnerSID);
  void __RPC_STUB IEventSubscription_get_OwnerSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_OwnerSID_Proxy(IEventSubscription *This,BSTR bstrOwnerSID);
  void __RPC_STUB IEventSubscription_put_OwnerSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_get_Enabled_Proxy(IEventSubscription *This,WINBOOL *pfEnabled);
  void __RPC_STUB IEventSubscription_get_Enabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_Enabled_Proxy(IEventSubscription *This,WINBOOL fEnabled);
  void __RPC_STUB IEventSubscription_put_Enabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_get_Description_Proxy(IEventSubscription *This,BSTR *pbstrDescription);
  void __RPC_STUB IEventSubscription_get_Description_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_Description_Proxy(IEventSubscription *This,BSTR bstrDescription);
  void __RPC_STUB IEventSubscription_put_Description_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_get_MachineName_Proxy(IEventSubscription *This,BSTR *pbstrMachineName);
  void __RPC_STUB IEventSubscription_get_MachineName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_MachineName_Proxy(IEventSubscription *This,BSTR bstrMachineName);
  void __RPC_STUB IEventSubscription_put_MachineName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_GetPublisherProperty_Proxy(IEventSubscription *This,BSTR bstrPropertyName,VARIANT *propertyValue);
  void __RPC_STUB IEventSubscription_GetPublisherProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_PutPublisherProperty_Proxy(IEventSubscription *This,BSTR bstrPropertyName,VARIANT *propertyValue);
  void __RPC_STUB IEventSubscription_PutPublisherProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_RemovePublisherProperty_Proxy(IEventSubscription *This,BSTR bstrPropertyName);
  void __RPC_STUB IEventSubscription_RemovePublisherProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_GetPublisherPropertyCollection_Proxy(IEventSubscription *This,IEventObjectCollection **collection);
  void __RPC_STUB IEventSubscription_GetPublisherPropertyCollection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_GetSubscriberProperty_Proxy(IEventSubscription *This,BSTR bstrPropertyName,VARIANT *propertyValue);
  void __RPC_STUB IEventSubscription_GetSubscriberProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_PutSubscriberProperty_Proxy(IEventSubscription *This,BSTR bstrPropertyName,VARIANT *propertyValue);
  void __RPC_STUB IEventSubscription_PutSubscriberProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_RemoveSubscriberProperty_Proxy(IEventSubscription *This,BSTR bstrPropertyName);
  void __RPC_STUB IEventSubscription_RemoveSubscriberProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_GetSubscriberPropertyCollection_Proxy(IEventSubscription *This,IEventObjectCollection **collection);
  void __RPC_STUB IEventSubscription_GetSubscriberPropertyCollection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_get_InterfaceID_Proxy(IEventSubscription *This,BSTR *pbstrInterfaceID);
  void __RPC_STUB IEventSubscription_get_InterfaceID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventSubscription_put_InterfaceID_Proxy(IEventSubscription *This,BSTR bstrInterfaceID);
  void __RPC_STUB IEventSubscription_put_InterfaceID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IFiringControl_INTERFACE_DEFINED__
#define __IFiringControl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IFiringControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IFiringControl : public IDispatch {
  public:
    virtual HRESULT WINAPI FireSubscription(IEventSubscription *subscription) = 0;
  };
#else
  typedef struct IFiringControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IFiringControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IFiringControl *This);
      ULONG (WINAPI *Release)(IFiringControl *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IFiringControl *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IFiringControl *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IFiringControl *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IFiringControl *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *FireSubscription)(IFiringControl *This,IEventSubscription *subscription);
    END_INTERFACE
  } IFiringControlVtbl;
  struct IFiringControl {
    CONST_VTBL struct IFiringControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IFiringControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFiringControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFiringControl_Release(This) (This)->lpVtbl->Release(This)
#define IFiringControl_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFiringControl_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFiringControl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFiringControl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IFiringControl_FireSubscription(This,subscription) (This)->lpVtbl->FireSubscription(This,subscription)
#endif
#endif
  HRESULT WINAPI IFiringControl_FireSubscription_Proxy(IFiringControl *This,IEventSubscription *subscription);
  void __RPC_STUB IFiringControl_FireSubscription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPublisherFilter_INTERFACE_DEFINED__
#define __IPublisherFilter_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IPublisherFilter;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPublisherFilter : public IUnknown {
  public:
    virtual HRESULT WINAPI Initialize(BSTR methodName,IDispatch *dispUserDefined) = 0;
    virtual HRESULT WINAPI PrepareToFire(BSTR methodName,IFiringControl *firingControl) = 0;
  };
#else
  typedef struct IPublisherFilterVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPublisherFilter *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPublisherFilter *This);
      ULONG (WINAPI *Release)(IPublisherFilter *This);
      HRESULT (WINAPI *Initialize)(IPublisherFilter *This,BSTR methodName,IDispatch *dispUserDefined);
      HRESULT (WINAPI *PrepareToFire)(IPublisherFilter *This,BSTR methodName,IFiringControl *firingControl);
    END_INTERFACE
  } IPublisherFilterVtbl;
  struct IPublisherFilter {
    CONST_VTBL struct IPublisherFilterVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPublisherFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPublisherFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPublisherFilter_Release(This) (This)->lpVtbl->Release(This)
#define IPublisherFilter_Initialize(This,methodName,dispUserDefined) (This)->lpVtbl->Initialize(This,methodName,dispUserDefined)
#define IPublisherFilter_PrepareToFire(This,methodName,firingControl) (This)->lpVtbl->PrepareToFire(This,methodName,firingControl)
#endif
#endif
  HRESULT WINAPI IPublisherFilter_Initialize_Proxy(IPublisherFilter *This,BSTR methodName,IDispatch *dispUserDefined);
  void __RPC_STUB IPublisherFilter_Initialize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPublisherFilter_PrepareToFire_Proxy(IPublisherFilter *This,BSTR methodName,IFiringControl *firingControl);
  void __RPC_STUB IPublisherFilter_PrepareToFire_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMultiInterfacePublisherFilter_INTERFACE_DEFINED__
#define __IMultiInterfacePublisherFilter_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IMultiInterfacePublisherFilter;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IMultiInterfacePublisherFilter : public IUnknown {
  public:
    virtual HRESULT WINAPI Initialize(IMultiInterfaceEventControl *pEIC) = 0;
    virtual HRESULT WINAPI PrepareToFire(REFIID iid,BSTR methodName,IFiringControl *firingControl) = 0;
  };
#else
  typedef struct IMultiInterfacePublisherFilterVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IMultiInterfacePublisherFilter *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IMultiInterfacePublisherFilter *This);
      ULONG (WINAPI *Release)(IMultiInterfacePublisherFilter *This);
      HRESULT (WINAPI *Initialize)(IMultiInterfacePublisherFilter *This,IMultiInterfaceEventControl *pEIC);
      HRESULT (WINAPI *PrepareToFire)(IMultiInterfacePublisherFilter *This,REFIID iid,BSTR methodName,IFiringControl *firingControl);
    END_INTERFACE
  } IMultiInterfacePublisherFilterVtbl;
  struct IMultiInterfacePublisherFilter {
    CONST_VTBL struct IMultiInterfacePublisherFilterVtbl *lpVtbl;
  };
#ifdef COBJMACROS
  define IMultiInterfacePublisherFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMultiInterfacePublisherFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMultiInterfacePublisherFilter_Release(This) (This)->lpVtbl->Release(This)
#define IMultiInterfacePublisherFilter_Initialize(This,pEIC) (This)->lpVtbl->Initialize(This,pEIC)
#define IMultiInterfacePublisherFilter_PrepareToFire(This,iid,methodName,firingControl) (This)->lpVtbl->PrepareToFire(This,iid,methodName,firingControl)
#endif
#endif
    HRESULT WINAPI IMultiInterfacePublisherFilter_Initialize_Proxy(IMultiInterfacePublisherFilter *This,IMultiInterfaceEventControl *pEIC);
  void __RPC_STUB IMultiInterfacePublisherFilter_Initialize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMultiInterfacePublisherFilter_PrepareToFire_Proxy(IMultiInterfacePublisherFilter *This,REFIID iid,BSTR methodName,IFiringControl *firingControl);
  void __RPC_STUB IMultiInterfacePublisherFilter_PrepareToFire_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEventObjectChange_INTERFACE_DEFINED__
#define __IEventObjectChange_INTERFACE_DEFINED__
  typedef
    enum __MIDL_IEventObjectChange_0001 {
      EOC_NewObject = 0,EOC_ModifiedObject = EOC_NewObject + 1,EOC_DeletedObject = EOC_ModifiedObject + 1
  } EOC_ChangeType;
  EXTERN_C const IID IID_IEventObjectChange;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEventObjectChange : public IUnknown {
  public:
    virtual HRESULT WINAPI ChangedSubscription(EOC_ChangeType changeType,BSTR bstrSubscriptionID) = 0;
    virtual HRESULT WINAPI ChangedEventClass(EOC_ChangeType changeType,BSTR bstrEventClassID) = 0;
    virtual HRESULT WINAPI ChangedPublisher(EOC_ChangeType changeType,BSTR bstrPublisherID) = 0;
  };
#else
  typedef struct IEventObjectChangeVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEventObjectChange *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEventObjectChange *This);
      ULONG (WINAPI *Release)(IEventObjectChange *This);
      HRESULT (WINAPI *ChangedSubscription)(IEventObjectChange *This,EOC_ChangeType changeType,BSTR bstrSubscriptionID);
      HRESULT (WINAPI *ChangedEventClass)(IEventObjectChange *This,EOC_ChangeType changeType,BSTR bstrEventClassID);
      HRESULT (WINAPI *ChangedPublisher)(IEventObjectChange *This,EOC_ChangeType changeType,BSTR bstrPublisherID);
    END_INTERFACE
  } IEventObjectChangeVtbl;
  struct IEventObjectChange {
    CONST_VTBL struct IEventObjectChangeVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEventObjectChange_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventObjectChange_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventObjectChange_Release(This) (This)->lpVtbl->Release(This)
#define IEventObjectChange_ChangedSubscription(This,changeType,bstrSubscriptionID) (This)->lpVtbl->ChangedSubscription(This,changeType,bstrSubscriptionID)
#define IEventObjectChange_ChangedEventClass(This,changeType,bstrEventClassID) (This)->lpVtbl->ChangedEventClass(This,changeType,bstrEventClassID)
#define IEventObjectChange_ChangedPublisher(This,changeType,bstrPublisherID) (This)->lpVtbl->ChangedPublisher(This,changeType,bstrPublisherID)
#endif
#endif
  HRESULT WINAPI IEventObjectChange_ChangedSubscription_Proxy(IEventObjectChange *This,EOC_ChangeType changeType,BSTR bstrSubscriptionID);
  void __RPC_STUB IEventObjectChange_ChangedSubscription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventObjectChange_ChangedEventClass_Proxy(IEventObjectChange *This,EOC_ChangeType changeType,BSTR bstrEventClassID);
  void __RPC_STUB IEventObjectChange_ChangedEventClass_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventObjectChange_ChangedPublisher_Proxy(IEventObjectChange *This,EOC_ChangeType changeType,BSTR bstrPublisherID);
  void __RPC_STUB IEventObjectChange_ChangedPublisher_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef _COMEVENTSYSCHANGEINFO_
#define _COMEVENTSYSCHANGEINFO_
  typedef struct __MIDL___MIDL_itf_eventsys_0270_0001 {
    DWORD cbSize;
    EOC_ChangeType changeType;
    BSTR objectId;
    BSTR partitionId;
    BSTR applicationId;
    GUID reserved[10 ];
  } COMEVENTSYSCHANGEINFO;
#endif

  extern RPC_IF_HANDLE __MIDL_itf_eventsys_0270_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_eventsys_0270_v0_0_s_ifspec;
#ifndef __IEventObjectChange2_INTERFACE_DEFINED__
#define __IEventObjectChange2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEventObjectChange2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEventObjectChange2 : public IUnknown {
  public:
    virtual HRESULT WINAPI ChangedSubscription(COMEVENTSYSCHANGEINFO *pInfo) = 0;
    virtual HRESULT WINAPI ChangedEventClass(COMEVENTSYSCHANGEINFO *pInfo) = 0;
  };
#else
  typedef struct IEventObjectChange2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEventObjectChange2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEventObjectChange2 *This);
      ULONG (WINAPI *Release)(IEventObjectChange2 *This);
      HRESULT (WINAPI *ChangedSubscription)(IEventObjectChange2 *This,COMEVENTSYSCHANGEINFO *pInfo);
      HRESULT (WINAPI *ChangedEventClass)(IEventObjectChange2 *This,COMEVENTSYSCHANGEINFO *pInfo);
    END_INTERFACE
  } IEventObjectChange2Vtbl;
  struct IEventObjectChange2 {
    CONST_VTBL struct IEventObjectChange2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEventObjectChange2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventObjectChange2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventObjectChange2_Release(This) (This)->lpVtbl->Release(This)
#define IEventObjectChange2_ChangedSubscription(This,pInfo) (This)->lpVtbl->ChangedSubscription(This,pInfo)
#define IEventObjectChange2_ChangedEventClass(This,pInfo) (This)->lpVtbl->ChangedEventClass(This,pInfo)
#endif
#endif
  HRESULT WINAPI IEventObjectChange2_ChangedSubscription_Proxy(IEventObjectChange2 *This,COMEVENTSYSCHANGEINFO *pInfo);
  void __RPC_STUB IEventObjectChange2_ChangedSubscription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventObjectChange2_ChangedEventClass_Proxy(IEventObjectChange2 *This,COMEVENTSYSCHANGEINFO *pInfo);
  void __RPC_STUB IEventObjectChange2_ChangedEventClass_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEnumEventObject_INTERFACE_DEFINED__
#define __IEnumEventObject_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEnumEventObject;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEnumEventObject : public IUnknown {
  public:
    virtual HRESULT WINAPI Clone(IEnumEventObject **ppInterface) = 0;
    virtual HRESULT WINAPI Next(ULONG cReqElem,IUnknown **ppInterface,ULONG *cRetElem) = 0;
    virtual HRESULT WINAPI Reset(void) = 0;
    virtual HRESULT WINAPI Skip(ULONG cSkipElem) = 0;
  };
#else
  typedef struct IEnumEventObjectVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEnumEventObject *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEnumEventObject *This);
      ULONG (WINAPI *Release)(IEnumEventObject *This);
      HRESULT (WINAPI *Clone)(IEnumEventObject *This,IEnumEventObject **ppInterface);
      HRESULT (WINAPI *Next)(IEnumEventObject *This,ULONG cReqElem,IUnknown **ppInterface,ULONG *cRetElem);
      HRESULT (WINAPI *Reset)(IEnumEventObject *This);
      HRESULT (WINAPI *Skip)(IEnumEventObject *This,ULONG cSkipElem);
    END_INTERFACE
  } IEnumEventObjectVtbl;
  struct IEnumEventObject {
    CONST_VTBL struct IEnumEventObjectVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEnumEventObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumEventObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumEventObject_Release(This) (This)->lpVtbl->Release(This)
#define IEnumEventObject_Clone(This,ppInterface) (This)->lpVtbl->Clone(This,ppInterface)
#define IEnumEventObject_Next(This,cReqElem,ppInterface,cRetElem) (This)->lpVtbl->Next(This,cReqElem,ppInterface,cRetElem)
#define IEnumEventObject_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumEventObject_Skip(This,cSkipElem) (This)->lpVtbl->Skip(This,cSkipElem)
#endif
#endif
  HRESULT WINAPI IEnumEventObject_Clone_Proxy(IEnumEventObject *This,IEnumEventObject **ppInterface);
  void __RPC_STUB IEnumEventObject_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumEventObject_Next_Proxy(IEnumEventObject *This,ULONG cReqElem,IUnknown **ppInterface,ULONG *cRetElem);
  void __RPC_STUB IEnumEventObject_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumEventObject_Reset_Proxy(IEnumEventObject *This);
  void __RPC_STUB IEnumEventObject_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumEventObject_Skip_Proxy(IEnumEventObject *This,ULONG cSkipElem);
  void __RPC_STUB IEnumEventObject_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEventObjectCollection_INTERFACE_DEFINED__
#define __IEventObjectCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEventObjectCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEventObjectCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get__NewEnum(IUnknown **ppUnkEnum) = 0;
    virtual HRESULT WINAPI get_Item(BSTR objectID,VARIANT *pItem) = 0;
    virtual HRESULT WINAPI get_NewEnum(IEnumEventObject **ppEnum) = 0;
    virtual HRESULT WINAPI get_Count(long *pCount) = 0;
    virtual HRESULT WINAPI Add(VARIANT *item,BSTR objectID) = 0;
    virtual HRESULT WINAPI Remove(BSTR objectID) = 0;
  };
#else
  typedef struct IEventObjectCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEventObjectCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEventObjectCollection *This);
      ULONG (WINAPI *Release)(IEventObjectCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IEventObjectCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IEventObjectCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IEventObjectCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IEventObjectCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get__NewEnum)(IEventObjectCollection *This,IUnknown **ppUnkEnum);
      HRESULT (WINAPI *get_Item)(IEventObjectCollection *This,BSTR objectID,VARIANT *pItem);
      HRESULT (WINAPI *get_NewEnum)(IEventObjectCollection *This,IEnumEventObject **ppEnum);
      HRESULT (WINAPI *get_Count)(IEventObjectCollection *This,long *pCount);
      HRESULT (WINAPI *Add)(IEventObjectCollection *This,VARIANT *item,BSTR objectID);
      HRESULT (WINAPI *Remove)(IEventObjectCollection *This,BSTR objectID);
    END_INTERFACE
  } IEventObjectCollectionVtbl;
  struct IEventObjectCollection {
    CONST_VTBL struct IEventObjectCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEventObjectCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventObjectCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventObjectCollection_Release(This) (This)->lpVtbl->Release(This)
#define IEventObjectCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IEventObjectCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IEventObjectCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IEventObjectCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IEventObjectCollection_get__NewEnum(This,ppUnkEnum) (This)->lpVtbl->get__NewEnum(This,ppUnkEnum)
#define IEventObjectCollection_get_Item(This,objectID,pItem) (This)->lpVtbl->get_Item(This,objectID,pItem)
#define IEventObjectCollection_get_NewEnum(This,ppEnum) (This)->lpVtbl->get_NewEnum(This,ppEnum)
#define IEventObjectCollection_get_Count(This,pCount) (This)->lpVtbl->get_Count(This,pCount)
#define IEventObjectCollection_Add(This,item,objectID) (This)->lpVtbl->Add(This,item,objectID)
#define IEventObjectCollection_Remove(This,objectID) (This)->lpVtbl->Remove(This,objectID)
#endif
#endif
  HRESULT WINAPI IEventObjectCollection_get__NewEnum_Proxy(IEventObjectCollection *This,IUnknown **ppUnkEnum);
  void __RPC_STUB IEventObjectCollection_get__NewEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventObjectCollection_get_Item_Proxy(IEventObjectCollection *This,BSTR objectID,VARIANT *pItem);
  void __RPC_STUB IEventObjectCollection_get_Item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventObjectCollection_get_NewEnum_Proxy(IEventObjectCollection *This,IEnumEventObject **ppEnum);
  void __RPC_STUB IEventObjectCollection_get_NewEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventObjectCollection_get_Count_Proxy(IEventObjectCollection *This,long *pCount);
  void __RPC_STUB IEventObjectCollection_get_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventObjectCollection_Add_Proxy(IEventObjectCollection *This,VARIANT *item,BSTR objectID);
  void __RPC_STUB IEventObjectCollection_Add_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventObjectCollection_Remove_Proxy(IEventObjectCollection *This,BSTR objectID);
  void __RPC_STUB IEventObjectCollection_Remove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEventProperty_INTERFACE_DEFINED__
#define __IEventProperty_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEventProperty;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEventProperty : public IDispatch {
  public:
    virtual HRESULT WINAPI get_Name(BSTR *propertyName) = 0;
    virtual HRESULT WINAPI put_Name(BSTR propertyName) = 0;
    virtual HRESULT WINAPI get_Value(VARIANT *propertyValue) = 0;
    virtual HRESULT WINAPI put_Value(VARIANT *propertyValue) = 0;
  };
#else
  typedef struct IEventPropertyVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEventProperty *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEventProperty *This);
      ULONG (WINAPI *Release)(IEventProperty *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IEventProperty *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IEventProperty *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IEventProperty *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IEventProperty *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_Name)(IEventProperty *This,BSTR *propertyName);
      HRESULT (WINAPI *put_Name)(IEventProperty *This,BSTR propertyName);
      HRESULT (WINAPI *get_Value)(IEventProperty *This,VARIANT *propertyValue);
      HRESULT (WINAPI *put_Value)(IEventProperty *This,VARIANT *propertyValue);
    END_INTERFACE
  } IEventPropertyVtbl;
  struct IEventProperty {
    CONST_VTBL struct IEventPropertyVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEventProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventProperty_Release(This) (This)->lpVtbl->Release(This)
#define IEventProperty_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IEventProperty_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IEventProperty_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IEventProperty_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IEventProperty_get_Name(This,propertyName) (This)->lpVtbl->get_Name(This,propertyName)
#define IEventProperty_put_Name(This,propertyName) (This)->lpVtbl->put_Name(This,propertyName)
#define IEventProperty_get_Value(This,propertyValue) (This)->lpVtbl->get_Value(This,propertyValue)
#define IEventProperty_put_Value(This,propertyValue) (This)->lpVtbl->put_Value(This,propertyValue)
#endif
#endif
  HRESULT WINAPI IEventProperty_get_Name_Proxy(IEventProperty *This,BSTR *propertyName);
  void __RPC_STUB IEventProperty_get_Name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventProperty_put_Name_Proxy(IEventProperty *This,BSTR propertyName);
  void __RPC_STUB IEventProperty_put_Name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventProperty_get_Value_Proxy(IEventProperty *This,VARIANT *propertyValue);
  void __RPC_STUB IEventProperty_get_Value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventProperty_put_Value_Proxy(IEventProperty *This,VARIANT *propertyValue);
  void __RPC_STUB IEventProperty_put_Value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEventControl_INTERFACE_DEFINED__
#define __IEventControl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEventControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEventControl : public IDispatch {
  public:
    virtual HRESULT WINAPI SetPublisherFilter(BSTR methodName,IPublisherFilter *pPublisherFilter) = 0;
    virtual HRESULT WINAPI get_AllowInprocActivation(WINBOOL *pfAllowInprocActivation) = 0;
    virtual HRESULT WINAPI put_AllowInprocActivation(WINBOOL fAllowInprocActivation) = 0;
    virtual HRESULT WINAPI GetSubscriptions(BSTR methodName,BSTR optionalCriteria,int *optionalErrorIndex,IEventObjectCollection **ppCollection) = 0;
    virtual HRESULT WINAPI SetDefaultQuery(BSTR methodName,BSTR criteria,int *errorIndex) = 0;
  };
#else
  typedef struct IEventControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEventControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEventControl *This);
      ULONG (WINAPI *Release)(IEventControl *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IEventControl *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IEventControl *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IEventControl *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IEventControl *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *SetPublisherFilter)(IEventControl *This,BSTR methodName,IPublisherFilter *pPublisherFilter);
      HRESULT (WINAPI *get_AllowInprocActivation)(IEventControl *This,WINBOOL *pfAllowInprocActivation);
      HRESULT (WINAPI *put_AllowInprocActivation)(IEventControl *This,WINBOOL fAllowInprocActivation);
      HRESULT (WINAPI *GetSubscriptions)(IEventControl *This,BSTR methodName,BSTR optionalCriteria,int *optionalErrorIndex,IEventObjectCollection **ppCollection);
      HRESULT (WINAPI *SetDefaultQuery)(IEventControl *This,BSTR methodName,BSTR criteria,int *errorIndex);
    END_INTERFACE
  } IEventControlVtbl;
  struct IEventControl {
    CONST_VTBL struct IEventControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEventControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventControl_Release(This) (This)->lpVtbl->Release(This)
#define IEventControl_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IEventControl_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IEventControl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IEventControl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IEventControl_SetPublisherFilter(This,methodName,pPublisherFilter) (This)->lpVtbl->SetPublisherFilter(This,methodName,pPublisherFilter)
#define IEventControl_get_AllowInprocActivation(This,pfAllowInprocActivation) (This)->lpVtbl->get_AllowInprocActivation(This,pfAllowInprocActivation)
#define IEventControl_put_AllowInprocActivation(This,fAllowInprocActivation) (This)->lpVtbl->put_AllowInprocActivation(This,fAllowInprocActivation)
#define IEventControl_GetSubscriptions(This,methodName,optionalCriteria,optionalErrorIndex,ppCollection) (This)->lpVtbl->GetSubscriptions(This,methodName,optionalCriteria,optionalErrorIndex,ppCollection)
#define IEventControl_SetDefaultQuery(This,methodName,criteria,errorIndex) (This)->lpVtbl->SetDefaultQuery(This,methodName,criteria,errorIndex)
#endif
#endif
  HRESULT WINAPI IEventControl_SetPublisherFilter_Proxy(IEventControl *This,BSTR methodName,IPublisherFilter *pPublisherFilter);
  void __RPC_STUB IEventControl_SetPublisherFilter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventControl_get_AllowInprocActivation_Proxy(IEventControl *This,WINBOOL *pfAllowInprocActivation);
  void __RPC_STUB IEventControl_get_AllowInprocActivation_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventControl_put_AllowInprocActivation_Proxy(IEventControl *This,WINBOOL fAllowInprocActivation);
  void __RPC_STUB IEventControl_put_AllowInprocActivation_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventControl_GetSubscriptions_Proxy(IEventControl *This,BSTR methodName,BSTR optionalCriteria,int *optionalErrorIndex,IEventObjectCollection **ppCollection);
  void __RPC_STUB IEventControl_GetSubscriptions_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventControl_SetDefaultQuery_Proxy(IEventControl *This,BSTR methodName,BSTR criteria,int *errorIndex);
  void __RPC_STUB IEventControl_SetDefaultQuery_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMultiInterfaceEventControl_INTERFACE_DEFINED__
#define __IMultiInterfaceEventControl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IMultiInterfaceEventControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IMultiInterfaceEventControl : public IUnknown {
  public:
    virtual HRESULT WINAPI SetMultiInterfacePublisherFilter(IMultiInterfacePublisherFilter *classFilter) = 0;
    virtual HRESULT WINAPI GetSubscriptions(REFIID eventIID,BSTR bstrMethodName,BSTR optionalCriteria,int *optionalErrorIndex,IEventObjectCollection **ppCollection) = 0;
    virtual HRESULT WINAPI SetDefaultQuery(REFIID eventIID,BSTR bstrMethodName,BSTR bstrCriteria,int *errorIndex) = 0;
    virtual HRESULT WINAPI get_AllowInprocActivation(WINBOOL *pfAllowInprocActivation) = 0;
    virtual HRESULT WINAPI put_AllowInprocActivation(WINBOOL fAllowInprocActivation) = 0;
    virtual HRESULT WINAPI get_FireInParallel(WINBOOL *pfFireInParallel) = 0;
    virtual HRESULT WINAPI put_FireInParallel(WINBOOL fFireInParallel) = 0;
  };
#else
  typedef struct IMultiInterfaceEventControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IMultiInterfaceEventControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IMultiInterfaceEventControl *This);
      ULONG (WINAPI *Release)(IMultiInterfaceEventControl *This);
      HRESULT (WINAPI *SetMultiInterfacePublisherFilter)(IMultiInterfaceEventControl *This,IMultiInterfacePublisherFilter *classFilter);
      HRESULT (WINAPI *GetSubscriptions)(IMultiInterfaceEventControl *This,REFIID eventIID,BSTR bstrMethodName,BSTR optionalCriteria,int *optionalErrorIndex,IEventObjectCollection **ppCollection);
      HRESULT (WINAPI *SetDefaultQuery)(IMultiInterfaceEventControl *This,REFIID eventIID,BSTR bstrMethodName,BSTR bstrCriteria,int *errorIndex);
      HRESULT (WINAPI *get_AllowInprocActivation)(IMultiInterfaceEventControl *This,WINBOOL *pfAllowInprocActivation);
      HRESULT (WINAPI *put_AllowInprocActivation)(IMultiInterfaceEventControl *This,WINBOOL fAllowInprocActivation);
      HRESULT (WINAPI *get_FireInParallel)(IMultiInterfaceEventControl *This,WINBOOL *pfFireInParallel);
      HRESULT (WINAPI *put_FireInParallel)(IMultiInterfaceEventControl *This,WINBOOL fFireInParallel);
    END_INTERFACE
  } IMultiInterfaceEventControlVtbl;
  struct IMultiInterfaceEventControl {
    CONST_VTBL struct IMultiInterfaceEventControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IMultiInterfaceEventControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMultiInterfaceEventControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMultiInterfaceEventControl_Release(This) (This)->lpVtbl->Release(This)
#define IMultiInterfaceEventControl_SetMultiInterfacePublisherFilter(This,classFilter) (This)->lpVtbl->SetMultiInterfacePublisherFilter(This,classFilter)
#define IMultiInterfaceEventControl_GetSubscriptions(This,eventIID,bstrMethodName,optionalCriteria,optionalErrorIndex,ppCollection) (This)->lpVtbl->GetSubscriptions(This,eventIID,bstrMethodName,optionalCriteria,optionalErrorIndex,ppCollection)
#define IMultiInterfaceEventControl_SetDefaultQuery(This,eventIID,bstrMethodName,bstrCriteria,errorIndex) (This)->lpVtbl->SetDefaultQuery(This,eventIID,bstrMethodName,bstrCriteria,errorIndex)
#define IMultiInterfaceEventControl_get_AllowInprocActivation(This,pfAllowInprocActivation) (This)->lpVtbl->get_AllowInprocActivation(This,pfAllowInprocActivation)
#define IMultiInterfaceEventControl_put_AllowInprocActivation(This,fAllowInprocActivation) (This)->lpVtbl->put_AllowInprocActivation(This,fAllowInprocActivation)
#define IMultiInterfaceEventControl_get_FireInParallel(This,pfFireInParallel) (This)->lpVtbl->get_FireInParallel(This,pfFireInParallel)
#define IMultiInterfaceEventControl_put_FireInParallel(This,fFireInParallel) (This)->lpVtbl->put_FireInParallel(This,fFireInParallel)
#endif
#endif
  HRESULT WINAPI IMultiInterfaceEventControl_SetMultiInterfacePublisherFilter_Proxy(IMultiInterfaceEventControl *This,IMultiInterfacePublisherFilter *classFilter);
  void __RPC_STUB IMultiInterfaceEventControl_SetMultiInterfacePublisherFilter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMultiInterfaceEventControl_GetSubscriptions_Proxy(IMultiInterfaceEventControl *This,REFIID eventIID,BSTR bstrMethodName,BSTR optionalCriteria,int *optionalErrorIndex,IEventObjectCollection **ppCollection);
  void __RPC_STUB IMultiInterfaceEventControl_GetSubscriptions_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMultiInterfaceEventControl_SetDefaultQuery_Proxy(IMultiInterfaceEventControl *This,REFIID eventIID,BSTR bstrMethodName,BSTR bstrCriteria,int *errorIndex);
  void __RPC_STUB IMultiInterfaceEventControl_SetDefaultQuery_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMultiInterfaceEventControl_get_AllowInprocActivation_Proxy(IMultiInterfaceEventControl *This,WINBOOL *pfAllowInprocActivation);
  void __RPC_STUB IMultiInterfaceEventControl_get_AllowInprocActivation_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMultiInterfaceEventControl_put_AllowInprocActivation_Proxy(IMultiInterfaceEventControl *This,WINBOOL fAllowInprocActivation);
  void __RPC_STUB IMultiInterfaceEventControl_put_AllowInprocActivation_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMultiInterfaceEventControl_get_FireInParallel_Proxy(IMultiInterfaceEventControl *This,WINBOOL *pfFireInParallel);
  void __RPC_STUB IMultiInterfaceEventControl_get_FireInParallel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMultiInterfaceEventControl_put_FireInParallel_Proxy(IMultiInterfaceEventControl *This,WINBOOL fFireInParallel);
  void __RPC_STUB IMultiInterfaceEventControl_put_FireInParallel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DummyEventSystemLib_LIBRARY_DEFINED__
#define __DummyEventSystemLib_LIBRARY_DEFINED__
  EXTERN_C const IID LIBID_DummyEventSystemLib;
  EXTERN_C const CLSID CLSID_CEventSystem;
#ifdef __cplusplus
  class CEventSystem;
#endif
  EXTERN_C const CLSID CLSID_CEventPublisher;
#ifdef __cplusplus
  class CEventPublisher;
#endif
  EXTERN_C const CLSID CLSID_CEventClass;
#ifdef __cplusplus
  class CEventClass;
#endif
  EXTERN_C const CLSID CLSID_CEventSubscription;
#ifdef __cplusplus
  class CEventSubscription;
#endif
  EXTERN_C const CLSID CLSID_EventObjectChange;
#ifdef __cplusplus
  class EventObjectChange;
#endif
  EXTERN_C const CLSID CLSID_EventObjectChange2;
#ifdef __cplusplus
  class EventObjectChange2;
#endif
#endif

  unsigned long __RPC_API BSTR_UserSize(unsigned long *,unsigned long,BSTR *);
  unsigned char *__RPC_API BSTR_UserMarshal(unsigned long *,unsigned char *,BSTR *);
  unsigned char *__RPC_API BSTR_UserUnmarshal(unsigned long *,unsigned char *,BSTR *);
  void __RPC_API BSTR_UserFree(unsigned long *,BSTR *);
  unsigned long __RPC_API VARIANT_UserSize(unsigned long *,unsigned long,VARIANT *);
  unsigned char *__RPC_API VARIANT_UserMarshal(unsigned long *,unsigned char *,VARIANT *);
  unsigned char *__RPC_API VARIANT_UserUnmarshal(unsigned long *,unsigned char *,VARIANT *);
  void __RPC_API VARIANT_UserFree(unsigned long *,VARIANT *);

#ifdef __cplusplus
}
#endif
#endif
