/**
 * 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 __autosvcs_h__
#define __autosvcs_h__

#ifndef __ISecurityIdentityColl_FWD_DEFINED__
#define __ISecurityIdentityColl_FWD_DEFINED__
typedef interface ISecurityIdentityColl ISecurityIdentityColl;
#endif

#ifndef __ISecurityCallersColl_FWD_DEFINED__
#define __ISecurityCallersColl_FWD_DEFINED__
typedef interface ISecurityCallersColl ISecurityCallersColl;
#endif

#ifndef __ISecurityCallContext_FWD_DEFINED__
#define __ISecurityCallContext_FWD_DEFINED__
typedef interface ISecurityCallContext ISecurityCallContext;
#endif

#ifndef __IGetSecurityCallContext_FWD_DEFINED__
#define __IGetSecurityCallContext_FWD_DEFINED__
typedef interface IGetSecurityCallContext IGetSecurityCallContext;
#endif

#ifndef __SecurityProperty_FWD_DEFINED__
#define __SecurityProperty_FWD_DEFINED__
typedef interface SecurityProperty SecurityProperty;
#endif

#ifndef __ContextInfo_FWD_DEFINED__
#define __ContextInfo_FWD_DEFINED__
typedef interface ContextInfo ContextInfo;
#endif

#ifndef __ContextInfo2_FWD_DEFINED__
#define __ContextInfo2_FWD_DEFINED__
typedef interface ContextInfo2 ContextInfo2;
#endif

#ifndef __ObjectContext_FWD_DEFINED__
#define __ObjectContext_FWD_DEFINED__
typedef interface ObjectContext ObjectContext;
#endif

#ifndef __ITransactionContextEx_FWD_DEFINED__
#define __ITransactionContextEx_FWD_DEFINED__
typedef interface ITransactionContextEx ITransactionContextEx;
#endif

#ifndef __ITransactionContext_FWD_DEFINED__
#define __ITransactionContext_FWD_DEFINED__
typedef interface ITransactionContext ITransactionContext;
#endif

#ifndef __ICreateWithTransactionEx_FWD_DEFINED__
#define __ICreateWithTransactionEx_FWD_DEFINED__
typedef interface ICreateWithTransactionEx ICreateWithTransactionEx;
#endif

#ifndef __ICreateWithTipTransactionEx_FWD_DEFINED__
#define __ICreateWithTipTransactionEx_FWD_DEFINED__
typedef interface ICreateWithTipTransactionEx ICreateWithTipTransactionEx;
#endif

#ifndef __IComUserEvent_FWD_DEFINED__
#define __IComUserEvent_FWD_DEFINED__
typedef interface IComUserEvent IComUserEvent;
#endif

#ifndef __IComThreadEvents_FWD_DEFINED__
#define __IComThreadEvents_FWD_DEFINED__
typedef interface IComThreadEvents IComThreadEvents;
#endif

#ifndef __IComAppEvents_FWD_DEFINED__
#define __IComAppEvents_FWD_DEFINED__
typedef interface IComAppEvents IComAppEvents;
#endif

#ifndef __IComInstanceEvents_FWD_DEFINED__
#define __IComInstanceEvents_FWD_DEFINED__
typedef interface IComInstanceEvents IComInstanceEvents;
#endif

#ifndef __IComTransactionEvents_FWD_DEFINED__
#define __IComTransactionEvents_FWD_DEFINED__
typedef interface IComTransactionEvents IComTransactionEvents;
#endif

#ifndef __IComMethodEvents_FWD_DEFINED__
#define __IComMethodEvents_FWD_DEFINED__
typedef interface IComMethodEvents IComMethodEvents;
#endif

#ifndef __IComObjectEvents_FWD_DEFINED__
#define __IComObjectEvents_FWD_DEFINED__
typedef interface IComObjectEvents IComObjectEvents;
#endif

#ifndef __IComResourceEvents_FWD_DEFINED__
#define __IComResourceEvents_FWD_DEFINED__
typedef interface IComResourceEvents IComResourceEvents;
#endif

#ifndef __IComSecurityEvents_FWD_DEFINED__
#define __IComSecurityEvents_FWD_DEFINED__
typedef interface IComSecurityEvents IComSecurityEvents;
#endif

#ifndef __IComObjectPoolEvents_FWD_DEFINED__
#define __IComObjectPoolEvents_FWD_DEFINED__
typedef interface IComObjectPoolEvents IComObjectPoolEvents;
#endif

#ifndef __IComObjectPoolEvents2_FWD_DEFINED__
#define __IComObjectPoolEvents2_FWD_DEFINED__
typedef interface IComObjectPoolEvents2 IComObjectPoolEvents2;
#endif

#ifndef __IComObjectConstructionEvents_FWD_DEFINED__
#define __IComObjectConstructionEvents_FWD_DEFINED__
typedef interface IComObjectConstructionEvents IComObjectConstructionEvents;
#endif

#ifndef __IComActivityEvents_FWD_DEFINED__
#define __IComActivityEvents_FWD_DEFINED__
typedef interface IComActivityEvents IComActivityEvents;
#endif

#ifndef __IComIdentityEvents_FWD_DEFINED__
#define __IComIdentityEvents_FWD_DEFINED__
typedef interface IComIdentityEvents IComIdentityEvents;
#endif

#ifndef __IComQCEvents_FWD_DEFINED__
#define __IComQCEvents_FWD_DEFINED__
typedef interface IComQCEvents IComQCEvents;
#endif

#ifndef __IComExceptionEvents_FWD_DEFINED__
#define __IComExceptionEvents_FWD_DEFINED__
typedef interface IComExceptionEvents IComExceptionEvents;
#endif

#ifndef __ILBEvents_FWD_DEFINED__
#define __ILBEvents_FWD_DEFINED__
typedef interface ILBEvents ILBEvents;
#endif

#ifndef __IComCRMEvents_FWD_DEFINED__
#define __IComCRMEvents_FWD_DEFINED__
typedef interface IComCRMEvents IComCRMEvents;
#endif

#ifndef __IComMethod2Events_FWD_DEFINED__
#define __IComMethod2Events_FWD_DEFINED__
typedef interface IComMethod2Events IComMethod2Events;
#endif

#ifndef __IComTrackingInfoEvents_FWD_DEFINED__
#define __IComTrackingInfoEvents_FWD_DEFINED__
typedef interface IComTrackingInfoEvents IComTrackingInfoEvents;
#endif

#ifndef __IComTrackingInfoCollection_FWD_DEFINED__
#define __IComTrackingInfoCollection_FWD_DEFINED__
typedef interface IComTrackingInfoCollection IComTrackingInfoCollection;
#endif

#ifndef __IComTrackingInfoObject_FWD_DEFINED__
#define __IComTrackingInfoObject_FWD_DEFINED__
typedef interface IComTrackingInfoObject IComTrackingInfoObject;
#endif

#ifndef __IComTrackingInfoProperties_FWD_DEFINED__
#define __IComTrackingInfoProperties_FWD_DEFINED__
typedef interface IComTrackingInfoProperties IComTrackingInfoProperties;
#endif

#ifndef __IComApp2Events_FWD_DEFINED__
#define __IComApp2Events_FWD_DEFINED__
typedef interface IComApp2Events IComApp2Events;
#endif

#ifndef __IComTransaction2Events_FWD_DEFINED__
#define __IComTransaction2Events_FWD_DEFINED__
typedef interface IComTransaction2Events IComTransaction2Events;
#endif

#ifndef __IComInstance2Events_FWD_DEFINED__
#define __IComInstance2Events_FWD_DEFINED__
typedef interface IComInstance2Events IComInstance2Events;
#endif

#ifndef __IComObjectPool2Events_FWD_DEFINED__
#define __IComObjectPool2Events_FWD_DEFINED__
typedef interface IComObjectPool2Events IComObjectPool2Events;
#endif

#ifndef __IComObjectConstruction2Events_FWD_DEFINED__
#define __IComObjectConstruction2Events_FWD_DEFINED__
typedef interface IComObjectConstruction2Events IComObjectConstruction2Events;
#endif

#ifndef __ISystemAppEventData_FWD_DEFINED__
#define __ISystemAppEventData_FWD_DEFINED__
typedef interface ISystemAppEventData ISystemAppEventData;
#endif

#ifndef __IMtsEvents_FWD_DEFINED__
#define __IMtsEvents_FWD_DEFINED__
typedef interface IMtsEvents IMtsEvents;
#endif

#ifndef __IMtsEventInfo_FWD_DEFINED__
#define __IMtsEventInfo_FWD_DEFINED__
typedef interface IMtsEventInfo IMtsEventInfo;
#endif

#ifndef __IMTSLocator_FWD_DEFINED__
#define __IMTSLocator_FWD_DEFINED__
typedef interface IMTSLocator IMTSLocator;
#endif

#ifndef __IMtsGrp_FWD_DEFINED__
#define __IMtsGrp_FWD_DEFINED__
typedef interface IMtsGrp IMtsGrp;
#endif

#ifndef __IMessageMover_FWD_DEFINED__
#define __IMessageMover_FWD_DEFINED__
typedef interface IMessageMover IMessageMover;
#endif

#ifndef __IEventServerTrace_FWD_DEFINED__
#define __IEventServerTrace_FWD_DEFINED__
typedef interface IEventServerTrace IEventServerTrace;
#endif

#ifndef __IDispenserManager_FWD_DEFINED__
#define __IDispenserManager_FWD_DEFINED__
typedef interface IDispenserManager IDispenserManager;
#endif

#ifndef __IHolder_FWD_DEFINED__
#define __IHolder_FWD_DEFINED__
typedef interface IHolder IHolder;
#endif

#ifndef __IDispenserDriver_FWD_DEFINED__
#define __IDispenserDriver_FWD_DEFINED__
typedef interface IDispenserDriver IDispenserDriver;
#endif

#ifndef __IObjectContext_FWD_DEFINED__
#define __IObjectContext_FWD_DEFINED__
typedef interface IObjectContext IObjectContext;
#endif

#ifndef __IObjectControl_FWD_DEFINED__
#define __IObjectControl_FWD_DEFINED__
typedef interface IObjectControl IObjectControl;
#endif

#ifndef __IEnumNames_FWD_DEFINED__
#define __IEnumNames_FWD_DEFINED__
typedef interface IEnumNames IEnumNames;
#endif

#ifndef __ISecurityProperty_FWD_DEFINED__
#define __ISecurityProperty_FWD_DEFINED__
typedef interface ISecurityProperty ISecurityProperty;
#endif

#ifndef __ObjectControl_FWD_DEFINED__
#define __ObjectControl_FWD_DEFINED__
typedef interface ObjectControl ObjectControl;
#endif

#ifndef __ISharedProperty_FWD_DEFINED__
#define __ISharedProperty_FWD_DEFINED__
typedef interface ISharedProperty ISharedProperty;
#endif

#ifndef __ISharedPropertyGroup_FWD_DEFINED__
#define __ISharedPropertyGroup_FWD_DEFINED__
typedef interface ISharedPropertyGroup ISharedPropertyGroup;
#endif

#ifndef __ISharedPropertyGroupManager_FWD_DEFINED__
#define __ISharedPropertyGroupManager_FWD_DEFINED__
typedef interface ISharedPropertyGroupManager ISharedPropertyGroupManager;
#endif

#ifndef __IObjectConstruct_FWD_DEFINED__
#define __IObjectConstruct_FWD_DEFINED__
typedef interface IObjectConstruct IObjectConstruct;
#endif

#ifndef __IObjectConstructString_FWD_DEFINED__
#define __IObjectConstructString_FWD_DEFINED__
typedef interface IObjectConstructString IObjectConstructString;
#endif

#ifndef __IObjectContextActivity_FWD_DEFINED__
#define __IObjectContextActivity_FWD_DEFINED__
typedef interface IObjectContextActivity IObjectContextActivity;
#endif

#ifndef __IObjectContextInfo_FWD_DEFINED__
#define __IObjectContextInfo_FWD_DEFINED__
typedef interface IObjectContextInfo IObjectContextInfo;
#endif

#ifndef __IObjectContextInfo2_FWD_DEFINED__
#define __IObjectContextInfo2_FWD_DEFINED__
typedef interface IObjectContextInfo2 IObjectContextInfo2;
#endif

#ifndef __ITransactionStatus_FWD_DEFINED__
#define __ITransactionStatus_FWD_DEFINED__
typedef interface ITransactionStatus ITransactionStatus;
#endif

#ifndef __IObjectContextTip_FWD_DEFINED__
#define __IObjectContextTip_FWD_DEFINED__
typedef interface IObjectContextTip IObjectContextTip;
#endif

#ifndef __IPlaybackControl_FWD_DEFINED__
#define __IPlaybackControl_FWD_DEFINED__
typedef interface IPlaybackControl IPlaybackControl;
#endif

#ifndef __IGetContextProperties_FWD_DEFINED__
#define __IGetContextProperties_FWD_DEFINED__
typedef interface IGetContextProperties IGetContextProperties;
#endif

#ifndef __IContextState_FWD_DEFINED__
#define __IContextState_FWD_DEFINED__
typedef interface IContextState IContextState;
#endif

#ifndef __IPoolManager_FWD_DEFINED__
#define __IPoolManager_FWD_DEFINED__
typedef interface IPoolManager IPoolManager;
#endif

#ifndef __ISelectCOMLBServer_FWD_DEFINED__
#define __ISelectCOMLBServer_FWD_DEFINED__
typedef interface ISelectCOMLBServer ISelectCOMLBServer;
#endif

#ifndef __ICOMLBArguments_FWD_DEFINED__
#define __ICOMLBArguments_FWD_DEFINED__
typedef interface ICOMLBArguments ICOMLBArguments;
#endif

#ifndef __ICrmLogControl_FWD_DEFINED__
#define __ICrmLogControl_FWD_DEFINED__
typedef interface ICrmLogControl ICrmLogControl;
#endif

#ifndef __ICrmCompensatorVariants_FWD_DEFINED__
#define __ICrmCompensatorVariants_FWD_DEFINED__
typedef interface ICrmCompensatorVariants ICrmCompensatorVariants;
#endif

#ifndef __ICrmCompensator_FWD_DEFINED__
#define __ICrmCompensator_FWD_DEFINED__
typedef interface ICrmCompensator ICrmCompensator;
#endif

#ifndef __ICrmMonitorLogRecords_FWD_DEFINED__
#define __ICrmMonitorLogRecords_FWD_DEFINED__
typedef interface ICrmMonitorLogRecords ICrmMonitorLogRecords;
#endif

#ifndef __ICrmMonitorClerks_FWD_DEFINED__
#define __ICrmMonitorClerks_FWD_DEFINED__
typedef interface ICrmMonitorClerks ICrmMonitorClerks;
#endif

#ifndef __ICrmMonitor_FWD_DEFINED__
#define __ICrmMonitor_FWD_DEFINED__
typedef interface ICrmMonitor ICrmMonitor;
#endif

#ifndef __ICrmFormatLogRecords_FWD_DEFINED__
#define __ICrmFormatLogRecords_FWD_DEFINED__
typedef interface ICrmFormatLogRecords ICrmFormatLogRecords;
#endif

#ifndef __IServiceIISIntrinsicsConfig_FWD_DEFINED__
#define __IServiceIISIntrinsicsConfig_FWD_DEFINED__
typedef interface IServiceIISIntrinsicsConfig IServiceIISIntrinsicsConfig;
#endif

#ifndef __IServiceComTIIntrinsicsConfig_FWD_DEFINED__
#define __IServiceComTIIntrinsicsConfig_FWD_DEFINED__
typedef interface IServiceComTIIntrinsicsConfig IServiceComTIIntrinsicsConfig;
#endif

#ifndef __IServiceSxsConfig_FWD_DEFINED__
#define __IServiceSxsConfig_FWD_DEFINED__
typedef interface IServiceSxsConfig IServiceSxsConfig;
#endif

#ifndef __ICheckSxsConfig_FWD_DEFINED__
#define __ICheckSxsConfig_FWD_DEFINED__
typedef interface ICheckSxsConfig ICheckSxsConfig;
#endif

#ifndef __IServiceInheritanceConfig_FWD_DEFINED__
#define __IServiceInheritanceConfig_FWD_DEFINED__
typedef interface IServiceInheritanceConfig IServiceInheritanceConfig;
#endif

#ifndef __IServiceThreadPoolConfig_FWD_DEFINED__
#define __IServiceThreadPoolConfig_FWD_DEFINED__
typedef interface IServiceThreadPoolConfig IServiceThreadPoolConfig;
#endif

#ifndef __IServiceTransactionConfigBase_FWD_DEFINED__
#define __IServiceTransactionConfigBase_FWD_DEFINED__
typedef interface IServiceTransactionConfigBase IServiceTransactionConfigBase;
#endif

#ifndef __IServiceTransactionConfig_FWD_DEFINED__
#define __IServiceTransactionConfig_FWD_DEFINED__
typedef interface IServiceTransactionConfig IServiceTransactionConfig;
#endif

#ifndef __IServiceSynchronizationConfig_FWD_DEFINED__
#define __IServiceSynchronizationConfig_FWD_DEFINED__
typedef interface IServiceSynchronizationConfig IServiceSynchronizationConfig;
#endif

#ifndef __IServiceTrackerConfig_FWD_DEFINED__
#define __IServiceTrackerConfig_FWD_DEFINED__
typedef interface IServiceTrackerConfig IServiceTrackerConfig;
#endif

#ifndef __IServicePartitionConfig_FWD_DEFINED__
#define __IServicePartitionConfig_FWD_DEFINED__
typedef interface IServicePartitionConfig IServicePartitionConfig;
#endif

#ifndef __IServiceCall_FWD_DEFINED__
#define __IServiceCall_FWD_DEFINED__
typedef interface IServiceCall IServiceCall;
#endif

#ifndef __IAsyncErrorNotify_FWD_DEFINED__
#define __IAsyncErrorNotify_FWD_DEFINED__
typedef interface IAsyncErrorNotify IAsyncErrorNotify;
#endif

#ifndef __IServiceActivity_FWD_DEFINED__
#define __IServiceActivity_FWD_DEFINED__
typedef interface IServiceActivity IServiceActivity;
#endif

#ifndef __IThreadPoolKnobs_FWD_DEFINED__
#define __IThreadPoolKnobs_FWD_DEFINED__
typedef interface IThreadPoolKnobs IThreadPoolKnobs;
#endif

#ifndef __IComStaThreadPoolKnobs_FWD_DEFINED__
#define __IComStaThreadPoolKnobs_FWD_DEFINED__
typedef interface IComStaThreadPoolKnobs IComStaThreadPoolKnobs;
#endif

#ifndef __IComMtaThreadPoolKnobs_FWD_DEFINED__
#define __IComMtaThreadPoolKnobs_FWD_DEFINED__
typedef interface IComMtaThreadPoolKnobs IComMtaThreadPoolKnobs;
#endif

#ifndef __IComStaThreadPoolKnobs2_FWD_DEFINED__
#define __IComStaThreadPoolKnobs2_FWD_DEFINED__
typedef interface IComStaThreadPoolKnobs2 IComStaThreadPoolKnobs2;
#endif

#ifndef __IProcessInitializer_FWD_DEFINED__
#define __IProcessInitializer_FWD_DEFINED__
typedef interface IProcessInitializer IProcessInitializer;
#endif

#ifndef __IServicePoolConfig_FWD_DEFINED__
#define __IServicePoolConfig_FWD_DEFINED__
typedef interface IServicePoolConfig IServicePoolConfig;
#endif

#ifndef __IServicePool_FWD_DEFINED__
#define __IServicePool_FWD_DEFINED__
typedef interface IServicePool IServicePool;
#endif

#ifndef __IManagedPooledObj_FWD_DEFINED__
#define __IManagedPooledObj_FWD_DEFINED__
typedef interface IManagedPooledObj IManagedPooledObj;
#endif

#ifndef __IManagedPoolAction_FWD_DEFINED__
#define __IManagedPoolAction_FWD_DEFINED__
typedef interface IManagedPoolAction IManagedPoolAction;
#endif

#ifndef __IManagedObjectInfo_FWD_DEFINED__
#define __IManagedObjectInfo_FWD_DEFINED__
typedef interface IManagedObjectInfo IManagedObjectInfo;
#endif

#ifndef __IAppDomainHelper_FWD_DEFINED__
#define __IAppDomainHelper_FWD_DEFINED__
typedef interface IAppDomainHelper IAppDomainHelper;
#endif

#ifndef __IAssemblyLocator_FWD_DEFINED__
#define __IAssemblyLocator_FWD_DEFINED__
typedef interface IAssemblyLocator IAssemblyLocator;
#endif

#ifndef __IManagedActivationEvents_FWD_DEFINED__
#define __IManagedActivationEvents_FWD_DEFINED__
typedef interface IManagedActivationEvents IManagedActivationEvents;
#endif

#ifndef __ISendMethodEvents_FWD_DEFINED__
#define __ISendMethodEvents_FWD_DEFINED__
typedef interface ISendMethodEvents ISendMethodEvents;
#endif

#ifndef __ITransactionResourcePool_FWD_DEFINED__
#define __ITransactionResourcePool_FWD_DEFINED__
typedef interface ITransactionResourcePool ITransactionResourcePool;
#endif

#ifndef __IMTSCall_FWD_DEFINED__
#define __IMTSCall_FWD_DEFINED__
typedef interface IMTSCall IMTSCall;
#endif

#ifndef __IContextProperties_FWD_DEFINED__
#define __IContextProperties_FWD_DEFINED__
typedef interface IContextProperties IContextProperties;
#endif

#ifndef __IObjPool_FWD_DEFINED__
#define __IObjPool_FWD_DEFINED__
typedef interface IObjPool IObjPool;
#endif

#ifndef __ITransactionProperty_FWD_DEFINED__
#define __ITransactionProperty_FWD_DEFINED__
typedef interface ITransactionProperty ITransactionProperty;
#endif

#ifndef __IMTSActivity_FWD_DEFINED__
#define __IMTSActivity_FWD_DEFINED__
typedef interface IMTSActivity IMTSActivity;
#endif

#ifndef __SecurityIdentity_FWD_DEFINED__
#define __SecurityIdentity_FWD_DEFINED__
#ifdef __cplusplus
typedef class SecurityIdentity SecurityIdentity;
#else
typedef struct SecurityIdentity SecurityIdentity;
#endif
#endif

#ifndef __SecurityCallers_FWD_DEFINED__
#define __SecurityCallers_FWD_DEFINED__
#ifdef __cplusplus
typedef class SecurityCallers SecurityCallers;
#else
typedef struct SecurityCallers SecurityCallers;
#endif
#endif

#ifndef __SecurityCallContext_FWD_DEFINED__
#define __SecurityCallContext_FWD_DEFINED__
#ifdef __cplusplus
typedef class SecurityCallContext SecurityCallContext;
#else
typedef struct SecurityCallContext SecurityCallContext;
#endif
#endif

#ifndef __GetSecurityCallContextAppObject_FWD_DEFINED__
#define __GetSecurityCallContextAppObject_FWD_DEFINED__
#ifdef __cplusplus
typedef class GetSecurityCallContextAppObject GetSecurityCallContextAppObject;
#else
typedef struct GetSecurityCallContextAppObject GetSecurityCallContextAppObject;
#endif
#endif

#ifndef __IContextState_FWD_DEFINED__
#define __IContextState_FWD_DEFINED__
typedef interface IContextState IContextState;
#endif

#ifndef __Dummy30040732_FWD_DEFINED__
#define __Dummy30040732_FWD_DEFINED__
#ifdef __cplusplus
typedef class Dummy30040732 Dummy30040732;
#else
typedef struct Dummy30040732 Dummy30040732;
#endif
#endif

#ifndef __ContextInfo_FWD_DEFINED__
#define __ContextInfo_FWD_DEFINED__
typedef interface ContextInfo ContextInfo;
#endif

#ifndef __ContextInfo2_FWD_DEFINED__
#define __ContextInfo2_FWD_DEFINED__
typedef interface ContextInfo2 ContextInfo2;
#endif

#ifndef __ObjectControl_FWD_DEFINED__
#define __ObjectControl_FWD_DEFINED__
typedef interface ObjectControl ObjectControl;
#endif

#ifndef __TransactionContext_FWD_DEFINED__
#define __TransactionContext_FWD_DEFINED__
#ifdef __cplusplus
typedef class TransactionContext TransactionContext;
#else
typedef struct TransactionContext TransactionContext;
#endif
#endif

#ifndef __TransactionContextEx_FWD_DEFINED__
#define __TransactionContextEx_FWD_DEFINED__
#ifdef __cplusplus
typedef class TransactionContextEx TransactionContextEx;
#else
typedef struct TransactionContextEx TransactionContextEx;
#endif
#endif

#ifndef __ByotServerEx_FWD_DEFINED__
#define __ByotServerEx_FWD_DEFINED__
#ifdef __cplusplus
typedef class ByotServerEx ByotServerEx;
#else
typedef struct ByotServerEx ByotServerEx;
#endif
#endif

#ifndef __CServiceConfig_FWD_DEFINED__
#define __CServiceConfig_FWD_DEFINED__
#ifdef __cplusplus
typedef class CServiceConfig CServiceConfig;
#else
typedef struct CServiceConfig CServiceConfig;
#endif
#endif

#ifndef __ServicePool_FWD_DEFINED__
#define __ServicePool_FWD_DEFINED__
#ifdef __cplusplus
typedef class ServicePool ServicePool;
#else
typedef struct ServicePool ServicePool;
#endif
#endif

#ifndef __ServicePoolConfig_FWD_DEFINED__
#define __ServicePoolConfig_FWD_DEFINED__
#ifdef __cplusplus
typedef class ServicePoolConfig ServicePoolConfig;
#else
typedef struct ServicePoolConfig ServicePoolConfig;
#endif
#endif

#ifndef __SharedProperty_FWD_DEFINED__
#define __SharedProperty_FWD_DEFINED__
#ifdef __cplusplus
typedef class SharedProperty SharedProperty;
#else
typedef struct SharedProperty SharedProperty;
#endif
#endif

#ifndef __SharedPropertyGroup_FWD_DEFINED__
#define __SharedPropertyGroup_FWD_DEFINED__
#ifdef __cplusplus
typedef class SharedPropertyGroup SharedPropertyGroup;
#else
typedef struct SharedPropertyGroup SharedPropertyGroup;
#endif
#endif

#ifndef __SharedPropertyGroupManager_FWD_DEFINED__
#define __SharedPropertyGroupManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class SharedPropertyGroupManager SharedPropertyGroupManager;
#else
typedef struct SharedPropertyGroupManager SharedPropertyGroupManager;
#endif
#endif

#ifndef __COMEvents_FWD_DEFINED__
#define __COMEvents_FWD_DEFINED__
#ifdef __cplusplus
typedef class COMEvents COMEvents;
#else
typedef struct COMEvents COMEvents;
#endif
#endif

#ifndef __CoMTSLocator_FWD_DEFINED__
#define __CoMTSLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class CoMTSLocator CoMTSLocator;
#else
typedef struct CoMTSLocator CoMTSLocator;
#endif
#endif

#ifndef __MtsGrp_FWD_DEFINED__
#define __MtsGrp_FWD_DEFINED__
#ifdef __cplusplus
typedef class MtsGrp MtsGrp;
#else
typedef struct MtsGrp MtsGrp;
#endif
#endif

#ifndef __ComServiceEvents_FWD_DEFINED__
#define __ComServiceEvents_FWD_DEFINED__
#ifdef __cplusplus
typedef class ComServiceEvents ComServiceEvents;
#else
typedef struct ComServiceEvents ComServiceEvents;
#endif
#endif

#ifndef __ComSystemAppEventData_FWD_DEFINED__
#define __ComSystemAppEventData_FWD_DEFINED__
#ifdef __cplusplus
typedef class ComSystemAppEventData ComSystemAppEventData;
#else
typedef struct ComSystemAppEventData ComSystemAppEventData;
#endif
#endif

#ifndef __CRMClerk_FWD_DEFINED__
#define __CRMClerk_FWD_DEFINED__
#ifdef __cplusplus
typedef class CRMClerk CRMClerk;
#else
typedef struct CRMClerk CRMClerk;
#endif
#endif

#ifndef __CRMRecoveryClerk_FWD_DEFINED__
#define __CRMRecoveryClerk_FWD_DEFINED__
#ifdef __cplusplus
typedef class CRMRecoveryClerk CRMRecoveryClerk;
#else
typedef struct CRMRecoveryClerk CRMRecoveryClerk;
#endif
#endif

#ifndef __LBEvents_FWD_DEFINED__
#define __LBEvents_FWD_DEFINED__
#ifdef __cplusplus
typedef class LBEvents LBEvents;
#else
typedef struct LBEvents LBEvents;
#endif
#endif

#ifndef __MessageMover_FWD_DEFINED__
#define __MessageMover_FWD_DEFINED__
#ifdef __cplusplus
typedef class MessageMover MessageMover;
#else
typedef struct MessageMover MessageMover;
#endif
#endif

#ifndef __DispenserManager_FWD_DEFINED__
#define __DispenserManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class DispenserManager DispenserManager;
#else
typedef struct DispenserManager DispenserManager;
#endif
#endif

#ifndef __PoolMgr_FWD_DEFINED__
#define __PoolMgr_FWD_DEFINED__
#ifdef __cplusplus
typedef class PoolMgr PoolMgr;
#else
typedef struct PoolMgr PoolMgr;
#endif
#endif

#ifndef __EventServer_FWD_DEFINED__
#define __EventServer_FWD_DEFINED__
#ifdef __cplusplus
typedef class EventServer EventServer;
#else
typedef struct EventServer EventServer;
#endif
#endif

#ifndef __AppDomainHelper_FWD_DEFINED__
#define __AppDomainHelper_FWD_DEFINED__
#ifdef __cplusplus
typedef class AppDomainHelper AppDomainHelper;
#else
typedef struct AppDomainHelper AppDomainHelper;
#endif
#endif

#ifndef __ClrAssemblyLocator_FWD_DEFINED__
#define __ClrAssemblyLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class ClrAssemblyLocator ClrAssemblyLocator;
#else
typedef struct ClrAssemblyLocator ClrAssemblyLocator;
#endif
#endif

#include "unknwn.h"
#include "oaidl.h"
#include "ocidl.h"
#include "comadmin.h"
#include "transact.h"

#ifdef __cplusplus
extern "C"{
#endif

  void *__RPC_API MIDL_user_allocate(size_t);
  void __RPC_API MIDL_user_free(void *);

#include <objbase.h>

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0000_v0_0_s_ifspec;

#ifndef __ISecurityIdentityColl_INTERFACE_DEFINED__
#define __ISecurityIdentityColl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISecurityIdentityColl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISecurityIdentityColl : public IDispatch {
  public:
    virtual HRESULT WINAPI get_Count(long *plCount) = 0;
    virtual HRESULT WINAPI get_Item(BSTR name,VARIANT *pItem) = 0;
    virtual HRESULT WINAPI get__NewEnum(IUnknown **ppEnum) = 0;
  };
#else
  typedef struct ISecurityIdentityCollVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISecurityIdentityColl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISecurityIdentityColl *This);
      ULONG (WINAPI *Release)(ISecurityIdentityColl *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ISecurityIdentityColl *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ISecurityIdentityColl *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ISecurityIdentityColl *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ISecurityIdentityColl *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_Count)(ISecurityIdentityColl *This,long *plCount);
      HRESULT (WINAPI *get_Item)(ISecurityIdentityColl *This,BSTR name,VARIANT *pItem);
      HRESULT (WINAPI *get__NewEnum)(ISecurityIdentityColl *This,IUnknown **ppEnum);
    END_INTERFACE
  } ISecurityIdentityCollVtbl;
  interface ISecurityIdentityColl {
    CONST_VTBL struct ISecurityIdentityCollVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISecurityIdentityColl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISecurityIdentityColl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISecurityIdentityColl_Release(This) (This)->lpVtbl->Release(This)
#define ISecurityIdentityColl_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISecurityIdentityColl_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISecurityIdentityColl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISecurityIdentityColl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ISecurityIdentityColl_get_Count(This,plCount) (This)->lpVtbl->get_Count(This,plCount)
#define ISecurityIdentityColl_get_Item(This,name,pItem) (This)->lpVtbl->get_Item(This,name,pItem)
#define ISecurityIdentityColl_get__NewEnum(This,ppEnum) (This)->lpVtbl->get__NewEnum(This,ppEnum)
#endif
#endif
  HRESULT WINAPI ISecurityIdentityColl_get_Count_Proxy(ISecurityIdentityColl *This,long *plCount);
  void __RPC_STUB ISecurityIdentityColl_get_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityIdentityColl_get_Item_Proxy(ISecurityIdentityColl *This,BSTR name,VARIANT *pItem);
  void __RPC_STUB ISecurityIdentityColl_get_Item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityIdentityColl_get__NewEnum_Proxy(ISecurityIdentityColl *This,IUnknown **ppEnum);
  void __RPC_STUB ISecurityIdentityColl_get__NewEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISecurityCallersColl_INTERFACE_DEFINED__
#define __ISecurityCallersColl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISecurityCallersColl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISecurityCallersColl : public IDispatch {
  public:
    virtual HRESULT WINAPI get_Count(long *plCount) = 0;
    virtual HRESULT WINAPI get_Item(long lIndex,ISecurityIdentityColl **pObj) = 0;
    virtual HRESULT WINAPI get__NewEnum(IUnknown **ppEnum) = 0;
  };
#else
  typedef struct ISecurityCallersCollVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISecurityCallersColl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISecurityCallersColl *This);
      ULONG (WINAPI *Release)(ISecurityCallersColl *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ISecurityCallersColl *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ISecurityCallersColl *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ISecurityCallersColl *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ISecurityCallersColl *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_Count)(ISecurityCallersColl *This,long *plCount);
      HRESULT (WINAPI *get_Item)(ISecurityCallersColl *This,long lIndex,ISecurityIdentityColl **pObj);
      HRESULT (WINAPI *get__NewEnum)(ISecurityCallersColl *This,IUnknown **ppEnum);
    END_INTERFACE
  } ISecurityCallersCollVtbl;
  interface ISecurityCallersColl {
    CONST_VTBL struct ISecurityCallersCollVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISecurityCallersColl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISecurityCallersColl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISecurityCallersColl_Release(This) (This)->lpVtbl->Release(This)
#define ISecurityCallersColl_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISecurityCallersColl_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISecurityCallersColl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISecurityCallersColl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ISecurityCallersColl_get_Count(This,plCount) (This)->lpVtbl->get_Count(This,plCount)
#define ISecurityCallersColl_get_Item(This,lIndex,pObj) (This)->lpVtbl->get_Item(This,lIndex,pObj)
#define ISecurityCallersColl_get__NewEnum(This,ppEnum) (This)->lpVtbl->get__NewEnum(This,ppEnum)
#endif
#endif
  HRESULT WINAPI ISecurityCallersColl_get_Count_Proxy(ISecurityCallersColl *This,long *plCount);
  void __RPC_STUB ISecurityCallersColl_get_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityCallersColl_get_Item_Proxy(ISecurityCallersColl *This,long lIndex,ISecurityIdentityColl **pObj);
  void __RPC_STUB ISecurityCallersColl_get_Item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityCallersColl_get__NewEnum_Proxy(ISecurityCallersColl *This,IUnknown **ppEnum);
  void __RPC_STUB ISecurityCallersColl_get__NewEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISecurityCallContext_INTERFACE_DEFINED__
#define __ISecurityCallContext_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISecurityCallContext;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISecurityCallContext : public IDispatch {
  public:
    virtual HRESULT WINAPI get_Count(long *plCount) = 0;
    virtual HRESULT WINAPI get_Item(BSTR name,VARIANT *pItem) = 0;
    virtual HRESULT WINAPI get__NewEnum(IUnknown **ppEnum) = 0;
    virtual HRESULT WINAPI IsCallerInRole(BSTR bstrRole,VARIANT_BOOL *pfInRole) = 0;
    virtual HRESULT WINAPI IsSecurityEnabled(VARIANT_BOOL *pfIsEnabled) = 0;
    virtual HRESULT WINAPI IsUserInRole(VARIANT *pUser,BSTR bstrRole,VARIANT_BOOL *pfInRole) = 0;
  };
#else
  typedef struct ISecurityCallContextVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISecurityCallContext *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISecurityCallContext *This);
      ULONG (WINAPI *Release)(ISecurityCallContext *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ISecurityCallContext *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ISecurityCallContext *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ISecurityCallContext *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ISecurityCallContext *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_Count)(ISecurityCallContext *This,long *plCount);
      HRESULT (WINAPI *get_Item)(ISecurityCallContext *This,BSTR name,VARIANT *pItem);
      HRESULT (WINAPI *get__NewEnum)(ISecurityCallContext *This,IUnknown **ppEnum);
      HRESULT (WINAPI *IsCallerInRole)(ISecurityCallContext *This,BSTR bstrRole,VARIANT_BOOL *pfInRole);
      HRESULT (WINAPI *IsSecurityEnabled)(ISecurityCallContext *This,VARIANT_BOOL *pfIsEnabled);
      HRESULT (WINAPI *IsUserInRole)(ISecurityCallContext *This,VARIANT *pUser,BSTR bstrRole,VARIANT_BOOL *pfInRole);
    END_INTERFACE
  } ISecurityCallContextVtbl;
  interface ISecurityCallContext {
    CONST_VTBL struct ISecurityCallContextVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISecurityCallContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISecurityCallContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISecurityCallContext_Release(This) (This)->lpVtbl->Release(This)
#define ISecurityCallContext_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISecurityCallContext_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISecurityCallContext_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISecurityCallContext_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ISecurityCallContext_get_Count(This,plCount) (This)->lpVtbl->get_Count(This,plCount)
#define ISecurityCallContext_get_Item(This,name,pItem) (This)->lpVtbl->get_Item(This,name,pItem)
#define ISecurityCallContext_get__NewEnum(This,ppEnum) (This)->lpVtbl->get__NewEnum(This,ppEnum)
#define ISecurityCallContext_IsCallerInRole(This,bstrRole,pfInRole) (This)->lpVtbl->IsCallerInRole(This,bstrRole,pfInRole)
#define ISecurityCallContext_IsSecurityEnabled(This,pfIsEnabled) (This)->lpVtbl->IsSecurityEnabled(This,pfIsEnabled)
#define ISecurityCallContext_IsUserInRole(This,pUser,bstrRole,pfInRole) (This)->lpVtbl->IsUserInRole(This,pUser,bstrRole,pfInRole)
#endif
#endif
  HRESULT WINAPI ISecurityCallContext_get_Count_Proxy(ISecurityCallContext *This,long *plCount);
  void __RPC_STUB ISecurityCallContext_get_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityCallContext_get_Item_Proxy(ISecurityCallContext *This,BSTR name,VARIANT *pItem);
  void __RPC_STUB ISecurityCallContext_get_Item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityCallContext_get__NewEnum_Proxy(ISecurityCallContext *This,IUnknown **ppEnum);
  void __RPC_STUB ISecurityCallContext_get__NewEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityCallContext_IsCallerInRole_Proxy(ISecurityCallContext *This,BSTR bstrRole,VARIANT_BOOL *pfInRole);
  void __RPC_STUB ISecurityCallContext_IsCallerInRole_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityCallContext_IsSecurityEnabled_Proxy(ISecurityCallContext *This,VARIANT_BOOL *pfIsEnabled);
  void __RPC_STUB ISecurityCallContext_IsSecurityEnabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityCallContext_IsUserInRole_Proxy(ISecurityCallContext *This,VARIANT *pUser,BSTR bstrRole,VARIANT_BOOL *pfInRole);
  void __RPC_STUB ISecurityCallContext_IsUserInRole_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IGetSecurityCallContext_INTERFACE_DEFINED__
#define __IGetSecurityCallContext_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IGetSecurityCallContext;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IGetSecurityCallContext : public IDispatch {
  public:
    virtual HRESULT WINAPI GetSecurityCallContext(ISecurityCallContext **ppObject) = 0;
  };
#else
  typedef struct IGetSecurityCallContextVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IGetSecurityCallContext *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IGetSecurityCallContext *This);
      ULONG (WINAPI *Release)(IGetSecurityCallContext *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IGetSecurityCallContext *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IGetSecurityCallContext *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IGetSecurityCallContext *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IGetSecurityCallContext *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *GetSecurityCallContext)(IGetSecurityCallContext *This,ISecurityCallContext **ppObject);
    END_INTERFACE
  } IGetSecurityCallContextVtbl;
  interface IGetSecurityCallContext {
    CONST_VTBL struct IGetSecurityCallContextVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IGetSecurityCallContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IGetSecurityCallContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IGetSecurityCallContext_Release(This) (This)->lpVtbl->Release(This)
#define IGetSecurityCallContext_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IGetSecurityCallContext_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IGetSecurityCallContext_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IGetSecurityCallContext_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IGetSecurityCallContext_GetSecurityCallContext(This,ppObject) (This)->lpVtbl->GetSecurityCallContext(This,ppObject)
#endif
#endif
  HRESULT WINAPI IGetSecurityCallContext_GetSecurityCallContext_Proxy(IGetSecurityCallContext *This,ISecurityCallContext **ppObject);
  void __RPC_STUB IGetSecurityCallContext_GetSecurityCallContext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __SecurityProperty_INTERFACE_DEFINED__
#define __SecurityProperty_INTERFACE_DEFINED__
  EXTERN_C const IID IID_SecurityProperty;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct SecurityProperty : public IDispatch {
  public:
    virtual HRESULT WINAPI GetDirectCallerName(BSTR *bstrUserName) = 0;
    virtual HRESULT WINAPI GetDirectCreatorName(BSTR *bstrUserName) = 0;
    virtual HRESULT WINAPI GetOriginalCallerName(BSTR *bstrUserName) = 0;
    virtual HRESULT WINAPI GetOriginalCreatorName(BSTR *bstrUserName) = 0;
  };
#else
  typedef struct SecurityPropertyVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(SecurityProperty *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(SecurityProperty *This);
      ULONG (WINAPI *Release)(SecurityProperty *This);
      HRESULT (WINAPI *GetTypeInfoCount)(SecurityProperty *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(SecurityProperty *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(SecurityProperty *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(SecurityProperty *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *GetDirectCallerName)(SecurityProperty *This,BSTR *bstrUserName);
      HRESULT (WINAPI *GetDirectCreatorName)(SecurityProperty *This,BSTR *bstrUserName);
      HRESULT (WINAPI *GetOriginalCallerName)(SecurityProperty *This,BSTR *bstrUserName);
      HRESULT (WINAPI *GetOriginalCreatorName)(SecurityProperty *This,BSTR *bstrUserName);
    END_INTERFACE
  } SecurityPropertyVtbl;
  interface SecurityProperty {
    CONST_VTBL struct SecurityPropertyVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define SecurityProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define SecurityProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define SecurityProperty_Release(This) (This)->lpVtbl->Release(This)
#define SecurityProperty_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define SecurityProperty_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define SecurityProperty_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define SecurityProperty_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define SecurityProperty_GetDirectCallerName(This,bstrUserName) (This)->lpVtbl->GetDirectCallerName(This,bstrUserName)
#define SecurityProperty_GetDirectCreatorName(This,bstrUserName) (This)->lpVtbl->GetDirectCreatorName(This,bstrUserName)
#define SecurityProperty_GetOriginalCallerName(This,bstrUserName) (This)->lpVtbl->GetOriginalCallerName(This,bstrUserName)
#define SecurityProperty_GetOriginalCreatorName(This,bstrUserName) (This)->lpVtbl->GetOriginalCreatorName(This,bstrUserName)
#endif
#endif
  HRESULT WINAPI SecurityProperty_GetDirectCallerName_Proxy(SecurityProperty *This,BSTR *bstrUserName);
  void __RPC_STUB SecurityProperty_GetDirectCallerName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI SecurityProperty_GetDirectCreatorName_Proxy(SecurityProperty *This,BSTR *bstrUserName);
  void __RPC_STUB SecurityProperty_GetDirectCreatorName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI SecurityProperty_GetOriginalCallerName_Proxy(SecurityProperty *This,BSTR *bstrUserName);
  void __RPC_STUB SecurityProperty_GetOriginalCallerName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI SecurityProperty_GetOriginalCreatorName_Proxy(SecurityProperty *This,BSTR *bstrUserName);
  void __RPC_STUB SecurityProperty_GetOriginalCreatorName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ContextInfo_INTERFACE_DEFINED__
#define __ContextInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ContextInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ContextInfo : public IDispatch {
  public:
    virtual HRESULT WINAPI IsInTransaction(VARIANT_BOOL *pbIsInTx) = 0;
    virtual HRESULT WINAPI GetTransaction(IUnknown **ppTx) = 0;
    virtual HRESULT WINAPI GetTransactionId(BSTR *pbstrTxId) = 0;
    virtual HRESULT WINAPI GetActivityId(BSTR *pbstrActivityId) = 0;
    virtual HRESULT WINAPI GetContextId(BSTR *pbstrCtxId) = 0;
  };
#else
  typedef struct ContextInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ContextInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ContextInfo *This);
      ULONG (WINAPI *Release)(ContextInfo *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ContextInfo *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ContextInfo *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ContextInfo *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ContextInfo *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *IsInTransaction)(ContextInfo *This,VARIANT_BOOL *pbIsInTx);
      HRESULT (WINAPI *GetTransaction)(ContextInfo *This,IUnknown **ppTx);
      HRESULT (WINAPI *GetTransactionId)(ContextInfo *This,BSTR *pbstrTxId);
      HRESULT (WINAPI *GetActivityId)(ContextInfo *This,BSTR *pbstrActivityId);
      HRESULT (WINAPI *GetContextId)(ContextInfo *This,BSTR *pbstrCtxId);
    END_INTERFACE
  } ContextInfoVtbl;
  interface ContextInfo {
    CONST_VTBL struct ContextInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ContextInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ContextInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ContextInfo_Release(This) (This)->lpVtbl->Release(This)
#define ContextInfo_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ContextInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ContextInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ContextInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ContextInfo_IsInTransaction(This,pbIsInTx) (This)->lpVtbl->IsInTransaction(This,pbIsInTx)
#define ContextInfo_GetTransaction(This,ppTx) (This)->lpVtbl->GetTransaction(This,ppTx)
#define ContextInfo_GetTransactionId(This,pbstrTxId) (This)->lpVtbl->GetTransactionId(This,pbstrTxId)
#define ContextInfo_GetActivityId(This,pbstrActivityId) (This)->lpVtbl->GetActivityId(This,pbstrActivityId)
#define ContextInfo_GetContextId(This,pbstrCtxId) (This)->lpVtbl->GetContextId(This,pbstrCtxId)
#endif
#endif
  HRESULT WINAPI ContextInfo_IsInTransaction_Proxy(ContextInfo *This,VARIANT_BOOL *pbIsInTx);
  void __RPC_STUB ContextInfo_IsInTransaction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ContextInfo_GetTransaction_Proxy(ContextInfo *This,IUnknown **ppTx);
  void __RPC_STUB ContextInfo_GetTransaction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ContextInfo_GetTransactionId_Proxy(ContextInfo *This,BSTR *pbstrTxId);
  void __RPC_STUB ContextInfo_GetTransactionId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ContextInfo_GetActivityId_Proxy(ContextInfo *This,BSTR *pbstrActivityId);
  void __RPC_STUB ContextInfo_GetActivityId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ContextInfo_GetContextId_Proxy(ContextInfo *This,BSTR *pbstrCtxId);
  void __RPC_STUB ContextInfo_GetContextId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ContextInfo2_INTERFACE_DEFINED__
#define __ContextInfo2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ContextInfo2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ContextInfo2 : public ContextInfo {
  public:
    virtual HRESULT WINAPI GetPartitionId(BSTR *__MIDL_0011) = 0;
    virtual HRESULT WINAPI GetApplicationId(BSTR *__MIDL_0012) = 0;
    virtual HRESULT WINAPI GetApplicationInstanceId(BSTR *__MIDL_0013) = 0;
  };
#else
  typedef struct ContextInfo2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ContextInfo2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ContextInfo2 *This);
      ULONG (WINAPI *Release)(ContextInfo2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ContextInfo2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ContextInfo2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ContextInfo2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ContextInfo2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *IsInTransaction)(ContextInfo2 *This,VARIANT_BOOL *pbIsInTx);
      HRESULT (WINAPI *GetTransaction)(ContextInfo2 *This,IUnknown **ppTx);
      HRESULT (WINAPI *GetTransactionId)(ContextInfo2 *This,BSTR *pbstrTxId);
      HRESULT (WINAPI *GetActivityId)(ContextInfo2 *This,BSTR *pbstrActivityId);
      HRESULT (WINAPI *GetContextId)(ContextInfo2 *This,BSTR *pbstrCtxId);
      HRESULT (WINAPI *GetPartitionId)(ContextInfo2 *This,BSTR *__MIDL_0011);
      HRESULT (WINAPI *GetApplicationId)(ContextInfo2 *This,BSTR *__MIDL_0012);
      HRESULT (WINAPI *GetApplicationInstanceId)(ContextInfo2 *This,BSTR *__MIDL_0013);
    END_INTERFACE
  } ContextInfo2Vtbl;
  interface ContextInfo2 {
    CONST_VTBL struct ContextInfo2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ContextInfo2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ContextInfo2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ContextInfo2_Release(This) (This)->lpVtbl->Release(This)
#define ContextInfo2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ContextInfo2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ContextInfo2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ContextInfo2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ContextInfo2_IsInTransaction(This,pbIsInTx) (This)->lpVtbl->IsInTransaction(This,pbIsInTx)
#define ContextInfo2_GetTransaction(This,ppTx) (This)->lpVtbl->GetTransaction(This,ppTx)
#define ContextInfo2_GetTransactionId(This,pbstrTxId) (This)->lpVtbl->GetTransactionId(This,pbstrTxId)
#define ContextInfo2_GetActivityId(This,pbstrActivityId) (This)->lpVtbl->GetActivityId(This,pbstrActivityId)
#define ContextInfo2_GetContextId(This,pbstrCtxId) (This)->lpVtbl->GetContextId(This,pbstrCtxId)
#define ContextInfo2_GetPartitionId(This,__MIDL_0011) (This)->lpVtbl->GetPartitionId(This,__MIDL_0011)
#define ContextInfo2_GetApplicationId(This,__MIDL_0012) (This)->lpVtbl->GetApplicationId(This,__MIDL_0012)
#define ContextInfo2_GetApplicationInstanceId(This,__MIDL_0013) (This)->lpVtbl->GetApplicationInstanceId(This,__MIDL_0013)
#endif
#endif
  HRESULT WINAPI ContextInfo2_GetPartitionId_Proxy(ContextInfo2 *This,BSTR *__MIDL_0011);
  void __RPC_STUB ContextInfo2_GetPartitionId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ContextInfo2_GetApplicationId_Proxy(ContextInfo2 *This,BSTR *__MIDL_0012);
  void __RPC_STUB ContextInfo2_GetApplicationId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ContextInfo2_GetApplicationInstanceId_Proxy(ContextInfo2 *This,BSTR *__MIDL_0013);
  void __RPC_STUB ContextInfo2_GetApplicationInstanceId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ObjectContext_INTERFACE_DEFINED__
#define __ObjectContext_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ObjectContext;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ObjectContext : public IDispatch {
  public:
    virtual HRESULT WINAPI CreateInstance(BSTR bstrProgID,VARIANT *pObject) = 0;
    virtual HRESULT WINAPI SetComplete(void) = 0;
    virtual HRESULT WINAPI SetAbort(void) = 0;
    virtual HRESULT WINAPI EnableCommit(void) = 0;
    virtual HRESULT WINAPI DisableCommit(void) = 0;
    virtual HRESULT WINAPI IsInTransaction(VARIANT_BOOL *pbIsInTx) = 0;
    virtual HRESULT WINAPI IsSecurityEnabled(VARIANT_BOOL *pbIsEnabled) = 0;
    virtual HRESULT WINAPI IsCallerInRole(BSTR bstrRole,VARIANT_BOOL *pbInRole) = 0;
    virtual HRESULT WINAPI get_Count(long *plCount) = 0;
    virtual HRESULT WINAPI get_Item(BSTR name,VARIANT *pItem) = 0;
    virtual HRESULT WINAPI get__NewEnum(IUnknown **ppEnum) = 0;
    virtual HRESULT WINAPI get_Security(SecurityProperty **ppSecurityProperty) = 0;
    virtual HRESULT WINAPI get_ContextInfo(ContextInfo **ppContextInfo) = 0;
  };
#else
  typedef struct ObjectContextVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ObjectContext *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ObjectContext *This);
      ULONG (WINAPI *Release)(ObjectContext *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ObjectContext *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ObjectContext *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ObjectContext *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ObjectContext *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *CreateInstance)(ObjectContext *This,BSTR bstrProgID,VARIANT *pObject);
      HRESULT (WINAPI *SetComplete)(ObjectContext *This);
      HRESULT (WINAPI *SetAbort)(ObjectContext *This);
      HRESULT (WINAPI *EnableCommit)(ObjectContext *This);
      HRESULT (WINAPI *DisableCommit)(ObjectContext *This);
      HRESULT (WINAPI *IsInTransaction)(ObjectContext *This,VARIANT_BOOL *pbIsInTx);
      HRESULT (WINAPI *IsSecurityEnabled)(ObjectContext *This,VARIANT_BOOL *pbIsEnabled);
      HRESULT (WINAPI *IsCallerInRole)(ObjectContext *This,BSTR bstrRole,VARIANT_BOOL *pbInRole);
      HRESULT (WINAPI *get_Count)(ObjectContext *This,long *plCount);
      HRESULT (WINAPI *get_Item)(ObjectContext *This,BSTR name,VARIANT *pItem);
      HRESULT (WINAPI *get__NewEnum)(ObjectContext *This,IUnknown **ppEnum);
      HRESULT (WINAPI *get_Security)(ObjectContext *This,SecurityProperty **ppSecurityProperty);
      HRESULT (WINAPI *get_ContextInfo)(ObjectContext *This,ContextInfo **ppContextInfo);
    END_INTERFACE
  } ObjectContextVtbl;
  interface ObjectContext {
    CONST_VTBL struct ObjectContextVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ObjectContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ObjectContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ObjectContext_Release(This) (This)->lpVtbl->Release(This)
#define ObjectContext_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ObjectContext_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ObjectContext_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ObjectContext_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ObjectContext_CreateInstance(This,bstrProgID,pObject) (This)->lpVtbl->CreateInstance(This,bstrProgID,pObject)
#define ObjectContext_SetComplete(This) (This)->lpVtbl->SetComplete(This)
#define ObjectContext_SetAbort(This) (This)->lpVtbl->SetAbort(This)
#define ObjectContext_EnableCommit(This) (This)->lpVtbl->EnableCommit(This)
#define ObjectContext_DisableCommit(This) (This)->lpVtbl->DisableCommit(This)
#define ObjectContext_IsInTransaction(This,pbIsInTx) (This)->lpVtbl->IsInTransaction(This,pbIsInTx)
#define ObjectContext_IsSecurityEnabled(This,pbIsEnabled) (This)->lpVtbl->IsSecurityEnabled(This,pbIsEnabled)
#define ObjectContext_IsCallerInRole(This,bstrRole,pbInRole) (This)->lpVtbl->IsCallerInRole(This,bstrRole,pbInRole)
#define ObjectContext_get_Count(This,plCount) (This)->lpVtbl->get_Count(This,plCount)
#define ObjectContext_get_Item(This,name,pItem) (This)->lpVtbl->get_Item(This,name,pItem)
#define ObjectContext_get__NewEnum(This,ppEnum) (This)->lpVtbl->get__NewEnum(This,ppEnum)
#define ObjectContext_get_Security(This,ppSecurityProperty) (This)->lpVtbl->get_Security(This,ppSecurityProperty)
#define ObjectContext_get_ContextInfo(This,ppContextInfo) (This)->lpVtbl->get_ContextInfo(This,ppContextInfo)
#endif
#endif
  HRESULT WINAPI ObjectContext_CreateInstance_Proxy(ObjectContext *This,BSTR bstrProgID,VARIANT *pObject);
  void __RPC_STUB ObjectContext_CreateInstance_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectContext_SetComplete_Proxy(ObjectContext *This);
  void __RPC_STUB ObjectContext_SetComplete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectContext_SetAbort_Proxy(ObjectContext *This);
  void __RPC_STUB ObjectContext_SetAbort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectContext_EnableCommit_Proxy(ObjectContext *This);
  void __RPC_STUB ObjectContext_EnableCommit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectContext_DisableCommit_Proxy(ObjectContext *This);
  void __RPC_STUB ObjectContext_DisableCommit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectContext_IsInTransaction_Proxy(ObjectContext *This,VARIANT_BOOL *pbIsInTx);
  void __RPC_STUB ObjectContext_IsInTransaction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectContext_IsSecurityEnabled_Proxy(ObjectContext *This,VARIANT_BOOL *pbIsEnabled);
  void __RPC_STUB ObjectContext_IsSecurityEnabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectContext_IsCallerInRole_Proxy(ObjectContext *This,BSTR bstrRole,VARIANT_BOOL *pbInRole);
  void __RPC_STUB ObjectContext_IsCallerInRole_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectContext_get_Count_Proxy(ObjectContext *This,long *plCount);
  void __RPC_STUB ObjectContext_get_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectContext_get_Item_Proxy(ObjectContext *This,BSTR name,VARIANT *pItem);
  void __RPC_STUB ObjectContext_get_Item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectContext_get__NewEnum_Proxy(ObjectContext *This,IUnknown **ppEnum);
  void __RPC_STUB ObjectContext_get__NewEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectContext_get_Security_Proxy(ObjectContext *This,SecurityProperty **ppSecurityProperty);
  void __RPC_STUB ObjectContext_get_Security_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectContext_get_ContextInfo_Proxy(ObjectContext *This,ContextInfo **ppContextInfo);
  void __RPC_STUB ObjectContext_get_ContextInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ITransactionContextEx_INTERFACE_DEFINED__
#define __ITransactionContextEx_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ITransactionContextEx;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITransactionContextEx : public IUnknown {
  public:
    virtual HRESULT WINAPI CreateInstance(REFCLSID rclsid,REFIID riid,void **pObject) = 0;
    virtual HRESULT WINAPI Commit(void) = 0;
    virtual HRESULT WINAPI Abort(void) = 0;
  };
#else
  typedef struct ITransactionContextExVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITransactionContextEx *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITransactionContextEx *This);
      ULONG (WINAPI *Release)(ITransactionContextEx *This);
      HRESULT (WINAPI *CreateInstance)(ITransactionContextEx *This,REFCLSID rclsid,REFIID riid,void **pObject);
      HRESULT (WINAPI *Commit)(ITransactionContextEx *This);
      HRESULT (WINAPI *Abort)(ITransactionContextEx *This);
    END_INTERFACE
  } ITransactionContextExVtbl;
  interface ITransactionContextEx {
    CONST_VTBL struct ITransactionContextExVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITransactionContextEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITransactionContextEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITransactionContextEx_Release(This) (This)->lpVtbl->Release(This)
#define ITransactionContextEx_CreateInstance(This,rclsid,riid,pObject) (This)->lpVtbl->CreateInstance(This,rclsid,riid,pObject)
#define ITransactionContextEx_Commit(This) (This)->lpVtbl->Commit(This)
#define ITransactionContextEx_Abort(This) (This)->lpVtbl->Abort(This)
#endif
#endif
  HRESULT WINAPI ITransactionContextEx_CreateInstance_Proxy(ITransactionContextEx *This,REFCLSID rclsid,REFIID riid,void **pObject);
  void __RPC_STUB ITransactionContextEx_CreateInstance_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITransactionContextEx_Commit_Proxy(ITransactionContextEx *This);
  void __RPC_STUB ITransactionContextEx_Commit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITransactionContextEx_Abort_Proxy(ITransactionContextEx *This);
  void __RPC_STUB ITransactionContextEx_Abort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ITransactionContext_INTERFACE_DEFINED__
#define __ITransactionContext_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ITransactionContext;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITransactionContext : public IDispatch {
  public:
    virtual HRESULT WINAPI CreateInstance(BSTR pszProgId,VARIANT *pObject) = 0;
    virtual HRESULT WINAPI Commit(void) = 0;
    virtual HRESULT WINAPI Abort(void) = 0;
  };
#else
  typedef struct ITransactionContextVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITransactionContext *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITransactionContext *This);
      ULONG (WINAPI *Release)(ITransactionContext *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ITransactionContext *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ITransactionContext *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ITransactionContext *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ITransactionContext *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *CreateInstance)(ITransactionContext *This,BSTR pszProgId,VARIANT *pObject);
      HRESULT (WINAPI *Commit)(ITransactionContext *This);
      HRESULT (WINAPI *Abort)(ITransactionContext *This);
    END_INTERFACE
  } ITransactionContextVtbl;
  interface ITransactionContext {
    CONST_VTBL struct ITransactionContextVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITransactionContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITransactionContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITransactionContext_Release(This) (This)->lpVtbl->Release(This)
#define ITransactionContext_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITransactionContext_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITransactionContext_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITransactionContext_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ITransactionContext_CreateInstance(This,pszProgId,pObject) (This)->lpVtbl->CreateInstance(This,pszProgId,pObject)
#define ITransactionContext_Commit(This) (This)->lpVtbl->Commit(This)
#define ITransactionContext_Abort(This) (This)->lpVtbl->Abort(This)
#endif
#endif
  HRESULT WINAPI ITransactionContext_CreateInstance_Proxy(ITransactionContext *This,BSTR pszProgId,VARIANT *pObject);
  void __RPC_STUB ITransactionContext_CreateInstance_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITransactionContext_Commit_Proxy(ITransactionContext *This);
  void __RPC_STUB ITransactionContext_Commit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITransactionContext_Abort_Proxy(ITransactionContext *This);
  void __RPC_STUB ITransactionContext_Abort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ICreateWithTransactionEx_INTERFACE_DEFINED__
#define __ICreateWithTransactionEx_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ICreateWithTransactionEx;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ICreateWithTransactionEx : public IUnknown {
  public:
    virtual HRESULT WINAPI CreateInstance(ITransaction *pTransaction,REFCLSID rclsid,REFIID riid,void **pObject) = 0;
  };
#else
  typedef struct ICreateWithTransactionExVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ICreateWithTransactionEx *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ICreateWithTransactionEx *This);
      ULONG (WINAPI *Release)(ICreateWithTransactionEx *This);
      HRESULT (WINAPI *CreateInstance)(ICreateWithTransactionEx *This,ITransaction *pTransaction,REFCLSID rclsid,REFIID riid,void **pObject);
    END_INTERFACE
  } ICreateWithTransactionExVtbl;
  interface ICreateWithTransactionEx {
    CONST_VTBL struct ICreateWithTransactionExVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ICreateWithTransactionEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICreateWithTransactionEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICreateWithTransactionEx_Release(This) (This)->lpVtbl->Release(This)
#define ICreateWithTransactionEx_CreateInstance(This,pTransaction,rclsid,riid,pObject) (This)->lpVtbl->CreateInstance(This,pTransaction,rclsid,riid,pObject)
#endif
#endif
  HRESULT WINAPI ICreateWithTransactionEx_CreateInstance_Proxy(ICreateWithTransactionEx *This,ITransaction *pTransaction,REFCLSID rclsid,REFIID riid,void **pObject);
  void __RPC_STUB ICreateWithTransactionEx_CreateInstance_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ICreateWithTipTransactionEx_INTERFACE_DEFINED__
#define __ICreateWithTipTransactionEx_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ICreateWithTipTransactionEx;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ICreateWithTipTransactionEx : public IUnknown {
  public:
    virtual HRESULT WINAPI CreateInstance(BSTR bstrTipUrl,REFCLSID rclsid,REFIID riid,void **pObject) = 0;
  };
#else
  typedef struct ICreateWithTipTransactionExVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ICreateWithTipTransactionEx *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ICreateWithTipTransactionEx *This);
      ULONG (WINAPI *Release)(ICreateWithTipTransactionEx *This);
      HRESULT (WINAPI *CreateInstance)(ICreateWithTipTransactionEx *This,BSTR bstrTipUrl,REFCLSID rclsid,REFIID riid,void **pObject);
    END_INTERFACE
  } ICreateWithTipTransactionExVtbl;
  interface ICreateWithTipTransactionEx {
    CONST_VTBL struct ICreateWithTipTransactionExVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ICreateWithTipTransactionEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICreateWithTipTransactionEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICreateWithTipTransactionEx_Release(This) (This)->lpVtbl->Release(This)
#define ICreateWithTipTransactionEx_CreateInstance(This,bstrTipUrl,rclsid,riid,pObject) (This)->lpVtbl->CreateInstance(This,bstrTipUrl,rclsid,riid,pObject)
#endif
#endif
  HRESULT WINAPI ICreateWithTipTransactionEx_CreateInstance_Proxy(ICreateWithTipTransactionEx *This,BSTR bstrTipUrl,REFCLSID rclsid,REFIID riid,void **pObject);
  void __RPC_STUB ICreateWithTipTransactionEx_CreateInstance_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  typedef unsigned __int64 MTS_OBJID;
  typedef unsigned __int64 MTS_RESID;
  typedef unsigned __int64 ULONG64;

#ifndef _COMSVCSEVENTINFO_
#define _COMSVCSEVENTINFO_
  typedef struct __MIDL___MIDL_itf_autosvcs_0304_0001 {
    DWORD cbSize;
    DWORD dwPid;
    LONGLONG lTime;
    LONG lMicroTime;
    LONGLONG perfCount;
    GUID guidApp;
    LPOLESTR sMachineName;
  } COMSVCSEVENTINFO;
#endif

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0304_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0304_v0_0_s_ifspec;

#ifndef __IComUserEvent_INTERFACE_DEFINED__
#define __IComUserEvent_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComUserEvent;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComUserEvent : public IUnknown {
  public:
    virtual HRESULT WINAPI OnUserEvent(COMSVCSEVENTINFO *pInfo,VARIANT *pvarEvent) = 0;
  };
#else
  typedef struct IComUserEventVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComUserEvent *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComUserEvent *This);
      ULONG (WINAPI *Release)(IComUserEvent *This);
      HRESULT (WINAPI *OnUserEvent)(IComUserEvent *This,COMSVCSEVENTINFO *pInfo,VARIANT *pvarEvent);
    END_INTERFACE
  } IComUserEventVtbl;
  interface IComUserEvent {
    CONST_VTBL struct IComUserEventVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComUserEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComUserEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComUserEvent_Release(This) (This)->lpVtbl->Release(This)
#define IComUserEvent_OnUserEvent(This,pInfo,pvarEvent) (This)->lpVtbl->OnUserEvent(This,pInfo,pvarEvent)
#endif
#endif
  HRESULT WINAPI IComUserEvent_OnUserEvent_Proxy(IComUserEvent *This,COMSVCSEVENTINFO *pInfo,VARIANT *pvarEvent);
  void __RPC_STUB IComUserEvent_OnUserEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComThreadEvents_INTERFACE_DEFINED__
#define __IComThreadEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComThreadEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComThreadEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnThreadStart(COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,DWORD dwThread,DWORD dwTheadCnt) = 0;
    virtual HRESULT WINAPI OnThreadTerminate(COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,DWORD dwThread,DWORD dwTheadCnt) = 0;
    virtual HRESULT WINAPI OnThreadBindToApartment(COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 AptID,DWORD dwActCnt,DWORD dwLowCnt) = 0;
    virtual HRESULT WINAPI OnThreadUnBind(COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 AptID,DWORD dwActCnt) = 0;
    virtual HRESULT WINAPI OnThreadWorkEnque(COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID,DWORD QueueLen) = 0;
    virtual HRESULT WINAPI OnThreadWorkPrivate(COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID) = 0;
    virtual HRESULT WINAPI OnThreadWorkPublic(COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID,DWORD QueueLen) = 0;
    virtual HRESULT WINAPI OnThreadWorkRedirect(COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID,DWORD QueueLen,ULONG64 ThreadNum) = 0;
    virtual HRESULT WINAPI OnThreadWorkReject(COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID,DWORD QueueLen) = 0;
    virtual HRESULT WINAPI OnThreadAssignApartment(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,ULONG64 AptID) = 0;
    virtual HRESULT WINAPI OnThreadUnassignApartment(COMSVCSEVENTINFO *pInfo,ULONG64 AptID) = 0;
  };
#else
  typedef struct IComThreadEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComThreadEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComThreadEvents *This);
      ULONG (WINAPI *Release)(IComThreadEvents *This);
      HRESULT (WINAPI *OnThreadStart)(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,DWORD dwThread,DWORD dwTheadCnt);
      HRESULT (WINAPI *OnThreadTerminate)(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,DWORD dwThread,DWORD dwTheadCnt);
      HRESULT (WINAPI *OnThreadBindToApartment)(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 AptID,DWORD dwActCnt,DWORD dwLowCnt);
      HRESULT (WINAPI *OnThreadUnBind)(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 AptID,DWORD dwActCnt);
      HRESULT (WINAPI *OnThreadWorkEnque)(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID,DWORD QueueLen);
      HRESULT (WINAPI *OnThreadWorkPrivate)(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID);
      HRESULT (WINAPI *OnThreadWorkPublic)(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID,DWORD QueueLen);
      HRESULT (WINAPI *OnThreadWorkRedirect)(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID,DWORD QueueLen,ULONG64 ThreadNum);
      HRESULT (WINAPI *OnThreadWorkReject)(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID,DWORD QueueLen);
      HRESULT (WINAPI *OnThreadAssignApartment)(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,ULONG64 AptID);
      HRESULT (WINAPI *OnThreadUnassignApartment)(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 AptID);
    END_INTERFACE
  } IComThreadEventsVtbl;
  interface IComThreadEvents {
    CONST_VTBL struct IComThreadEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComThreadEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComThreadEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComThreadEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComThreadEvents_OnThreadStart(This,pInfo,ThreadID,dwThread,dwTheadCnt) (This)->lpVtbl->OnThreadStart(This,pInfo,ThreadID,dwThread,dwTheadCnt)
#define IComThreadEvents_OnThreadTerminate(This,pInfo,ThreadID,dwThread,dwTheadCnt) (This)->lpVtbl->OnThreadTerminate(This,pInfo,ThreadID,dwThread,dwTheadCnt)
#define IComThreadEvents_OnThreadBindToApartment(This,pInfo,ThreadID,AptID,dwActCnt,dwLowCnt) (This)->lpVtbl->OnThreadBindToApartment(This,pInfo,ThreadID,AptID,dwActCnt,dwLowCnt)
#define IComThreadEvents_OnThreadUnBind(This,pInfo,ThreadID,AptID,dwActCnt) (This)->lpVtbl->OnThreadUnBind(This,pInfo,ThreadID,AptID,dwActCnt)
#define IComThreadEvents_OnThreadWorkEnque(This,pInfo,ThreadID,MsgWorkID,QueueLen) (This)->lpVtbl->OnThreadWorkEnque(This,pInfo,ThreadID,MsgWorkID,QueueLen)
#define IComThreadEvents_OnThreadWorkPrivate(This,pInfo,ThreadID,MsgWorkID) (This)->lpVtbl->OnThreadWorkPrivate(This,pInfo,ThreadID,MsgWorkID)
#define IComThreadEvents_OnThreadWorkPublic(This,pInfo,ThreadID,MsgWorkID,QueueLen) (This)->lpVtbl->OnThreadWorkPublic(This,pInfo,ThreadID,MsgWorkID,QueueLen)
#define IComThreadEvents_OnThreadWorkRedirect(This,pInfo,ThreadID,MsgWorkID,QueueLen,ThreadNum) (This)->lpVtbl->OnThreadWorkRedirect(This,pInfo,ThreadID,MsgWorkID,QueueLen,ThreadNum)
#define IComThreadEvents_OnThreadWorkReject(This,pInfo,ThreadID,MsgWorkID,QueueLen) (This)->lpVtbl->OnThreadWorkReject(This,pInfo,ThreadID,MsgWorkID,QueueLen)
#define IComThreadEvents_OnThreadAssignApartment(This,pInfo,guidActivity,AptID) (This)->lpVtbl->OnThreadAssignApartment(This,pInfo,guidActivity,AptID)
#define IComThreadEvents_OnThreadUnassignApartment(This,pInfo,AptID) (This)->lpVtbl->OnThreadUnassignApartment(This,pInfo,AptID)
#endif
#endif
  HRESULT WINAPI IComThreadEvents_OnThreadStart_Proxy(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,DWORD dwThread,DWORD dwTheadCnt);
  void __RPC_STUB IComThreadEvents_OnThreadStart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComThreadEvents_OnThreadTerminate_Proxy(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,DWORD dwThread,DWORD dwTheadCnt);
  void __RPC_STUB IComThreadEvents_OnThreadTerminate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComThreadEvents_OnThreadBindToApartment_Proxy(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 AptID,DWORD dwActCnt,DWORD dwLowCnt);
  void __RPC_STUB IComThreadEvents_OnThreadBindToApartment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComThreadEvents_OnThreadUnBind_Proxy(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 AptID,DWORD dwActCnt);
  void __RPC_STUB IComThreadEvents_OnThreadUnBind_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComThreadEvents_OnThreadWorkEnque_Proxy(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID,DWORD QueueLen);
  void __RPC_STUB IComThreadEvents_OnThreadWorkEnque_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComThreadEvents_OnThreadWorkPrivate_Proxy(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID);
  void __RPC_STUB IComThreadEvents_OnThreadWorkPrivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComThreadEvents_OnThreadWorkPublic_Proxy(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID,DWORD QueueLen);
  void __RPC_STUB IComThreadEvents_OnThreadWorkPublic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComThreadEvents_OnThreadWorkRedirect_Proxy(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID,DWORD QueueLen,ULONG64 ThreadNum);
  void __RPC_STUB IComThreadEvents_OnThreadWorkRedirect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComThreadEvents_OnThreadWorkReject_Proxy(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ThreadID,ULONG64 MsgWorkID,DWORD QueueLen);
  void __RPC_STUB IComThreadEvents_OnThreadWorkReject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComThreadEvents_OnThreadAssignApartment_Proxy(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,ULONG64 AptID);
  void __RPC_STUB IComThreadEvents_OnThreadAssignApartment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComThreadEvents_OnThreadUnassignApartment_Proxy(IComThreadEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 AptID);
  void __RPC_STUB IComThreadEvents_OnThreadUnassignApartment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComAppEvents_INTERFACE_DEFINED__
#define __IComAppEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComAppEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComAppEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnAppActivation(COMSVCSEVENTINFO *pInfo,GUID guidApp) = 0;
    virtual HRESULT WINAPI OnAppShutdown(COMSVCSEVENTINFO *pInfo,GUID guidApp) = 0;
    virtual HRESULT WINAPI OnAppForceShutdown(COMSVCSEVENTINFO *pInfo,GUID guidApp) = 0;
  };
#else
  typedef struct IComAppEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComAppEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComAppEvents *This);
      ULONG (WINAPI *Release)(IComAppEvents *This);
      HRESULT (WINAPI *OnAppActivation)(IComAppEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
      HRESULT (WINAPI *OnAppShutdown)(IComAppEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
      HRESULT (WINAPI *OnAppForceShutdown)(IComAppEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
    END_INTERFACE
  } IComAppEventsVtbl;
  interface IComAppEvents {
    CONST_VTBL struct IComAppEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComAppEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComAppEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComAppEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComAppEvents_OnAppActivation(This,pInfo,guidApp) (This)->lpVtbl->OnAppActivation(This,pInfo,guidApp)
#define IComAppEvents_OnAppShutdown(This,pInfo,guidApp) (This)->lpVtbl->OnAppShutdown(This,pInfo,guidApp)
#define IComAppEvents_OnAppForceShutdown(This,pInfo,guidApp) (This)->lpVtbl->OnAppForceShutdown(This,pInfo,guidApp)
#endif
#endif
  HRESULT WINAPI IComAppEvents_OnAppActivation_Proxy(IComAppEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
  void __RPC_STUB IComAppEvents_OnAppActivation_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComAppEvents_OnAppShutdown_Proxy(IComAppEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
  void __RPC_STUB IComAppEvents_OnAppShutdown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComAppEvents_OnAppForceShutdown_Proxy(IComAppEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
  void __RPC_STUB IComAppEvents_OnAppForceShutdown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComInstanceEvents_INTERFACE_DEFINED__
#define __IComInstanceEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComInstanceEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComInstanceEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnObjectCreate(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFCLSID clsid,REFGUID tsid,ULONG64 CtxtID,ULONG64 ObjectID) = 0;
    virtual HRESULT WINAPI OnObjectDestroy(COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID) = 0;
  };
#else
  typedef struct IComInstanceEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComInstanceEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComInstanceEvents *This);
      ULONG (WINAPI *Release)(IComInstanceEvents *This);
      HRESULT (WINAPI *OnObjectCreate)(IComInstanceEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFCLSID clsid,REFGUID tsid,ULONG64 CtxtID,ULONG64 ObjectID);
      HRESULT (WINAPI *OnObjectDestroy)(IComInstanceEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID);
    END_INTERFACE
  } IComInstanceEventsVtbl;
  interface IComInstanceEvents {
    CONST_VTBL struct IComInstanceEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComInstanceEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComInstanceEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComInstanceEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComInstanceEvents_OnObjectCreate(This,pInfo,guidActivity,clsid,tsid,CtxtID,ObjectID) (This)->lpVtbl->OnObjectCreate(This,pInfo,guidActivity,clsid,tsid,CtxtID,ObjectID)
#define IComInstanceEvents_OnObjectDestroy(This,pInfo,CtxtID) (This)->lpVtbl->OnObjectDestroy(This,pInfo,CtxtID)
#endif
#endif
  HRESULT WINAPI IComInstanceEvents_OnObjectCreate_Proxy(IComInstanceEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFCLSID clsid,REFGUID tsid,ULONG64 CtxtID,ULONG64 ObjectID);
  void __RPC_STUB IComInstanceEvents_OnObjectCreate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComInstanceEvents_OnObjectDestroy_Proxy(IComInstanceEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID);
  void __RPC_STUB IComInstanceEvents_OnObjectDestroy_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComTransactionEvents_INTERFACE_DEFINED__
#define __IComTransactionEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComTransactionEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComTransactionEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnTransactionStart(COMSVCSEVENTINFO *pInfo,REFGUID guidTx,REFGUID tsid,WINBOOL fRoot) = 0;
    virtual HRESULT WINAPI OnTransactionPrepare(COMSVCSEVENTINFO *pInfo,REFGUID guidTx,WINBOOL fVoteYes) = 0;
    virtual HRESULT WINAPI OnTransactionAbort(COMSVCSEVENTINFO *pInfo,REFGUID guidTx) = 0;
    virtual HRESULT WINAPI OnTransactionCommit(COMSVCSEVENTINFO *pInfo,REFGUID guidTx) = 0;
  };
#else
  typedef struct IComTransactionEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComTransactionEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComTransactionEvents *This);
      ULONG (WINAPI *Release)(IComTransactionEvents *This);
      HRESULT (WINAPI *OnTransactionStart)(IComTransactionEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx,REFGUID tsid,WINBOOL fRoot);
      HRESULT (WINAPI *OnTransactionPrepare)(IComTransactionEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx,WINBOOL fVoteYes);
      HRESULT (WINAPI *OnTransactionAbort)(IComTransactionEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx);
      HRESULT (WINAPI *OnTransactionCommit)(IComTransactionEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx);
    END_INTERFACE
  } IComTransactionEventsVtbl;
  interface IComTransactionEvents {
    CONST_VTBL struct IComTransactionEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComTransactionEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComTransactionEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComTransactionEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComTransactionEvents_OnTransactionStart(This,pInfo,guidTx,tsid,fRoot) (This)->lpVtbl->OnTransactionStart(This,pInfo,guidTx,tsid,fRoot)
#define IComTransactionEvents_OnTransactionPrepare(This,pInfo,guidTx,fVoteYes) (This)->lpVtbl->OnTransactionPrepare(This,pInfo,guidTx,fVoteYes)
#define IComTransactionEvents_OnTransactionAbort(This,pInfo,guidTx) (This)->lpVtbl->OnTransactionAbort(This,pInfo,guidTx)
#define IComTransactionEvents_OnTransactionCommit(This,pInfo,guidTx) (This)->lpVtbl->OnTransactionCommit(This,pInfo,guidTx)
#endif
#endif
  HRESULT WINAPI IComTransactionEvents_OnTransactionStart_Proxy(IComTransactionEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx,REFGUID tsid,WINBOOL fRoot);
  void __RPC_STUB IComTransactionEvents_OnTransactionStart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComTransactionEvents_OnTransactionPrepare_Proxy(IComTransactionEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx,WINBOOL fVoteYes);
  void __RPC_STUB IComTransactionEvents_OnTransactionPrepare_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComTransactionEvents_OnTransactionAbort_Proxy(IComTransactionEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx);
  void __RPC_STUB IComTransactionEvents_OnTransactionAbort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComTransactionEvents_OnTransactionCommit_Proxy(IComTransactionEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx);
  void __RPC_STUB IComTransactionEvents_OnTransactionCommit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComMethodEvents_INTERFACE_DEFINED__
#define __IComMethodEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComMethodEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComMethodEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnMethodCall(COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,ULONG iMeth) = 0;
    virtual HRESULT WINAPI OnMethodReturn(COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,ULONG iMeth,HRESULT hresult) = 0;
    virtual HRESULT WINAPI OnMethodException(COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,ULONG iMeth) = 0;
  };
#else
  typedef struct IComMethodEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComMethodEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComMethodEvents *This);
      ULONG (WINAPI *Release)(IComMethodEvents *This);
      HRESULT (WINAPI *OnMethodCall)(IComMethodEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,ULONG iMeth);
      HRESULT (WINAPI *OnMethodReturn)(IComMethodEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,ULONG iMeth,HRESULT hresult);
      HRESULT (WINAPI *OnMethodException)(IComMethodEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,ULONG iMeth);
    END_INTERFACE
  } IComMethodEventsVtbl;
  interface IComMethodEvents {
    CONST_VTBL struct IComMethodEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComMethodEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComMethodEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComMethodEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComMethodEvents_OnMethodCall(This,pInfo,oid,guidCid,guidRid,iMeth) (This)->lpVtbl->OnMethodCall(This,pInfo,oid,guidCid,guidRid,iMeth)
#define IComMethodEvents_OnMethodReturn(This,pInfo,oid,guidCid,guidRid,iMeth,hresult) (This)->lpVtbl->OnMethodReturn(This,pInfo,oid,guidCid,guidRid,iMeth,hresult)
#define IComMethodEvents_OnMethodException(This,pInfo,oid,guidCid,guidRid,iMeth) (This)->lpVtbl->OnMethodException(This,pInfo,oid,guidCid,guidRid,iMeth)
#endif
#endif
  HRESULT WINAPI IComMethodEvents_OnMethodCall_Proxy(IComMethodEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,ULONG iMeth);
  void __RPC_STUB IComMethodEvents_OnMethodCall_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComMethodEvents_OnMethodReturn_Proxy(IComMethodEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,ULONG iMeth,HRESULT hresult);
  void __RPC_STUB IComMethodEvents_OnMethodReturn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComMethodEvents_OnMethodException_Proxy(IComMethodEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,ULONG iMeth);
  void __RPC_STUB IComMethodEvents_OnMethodException_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComObjectEvents_INTERFACE_DEFINED__
#define __IComObjectEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComObjectEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComObjectEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnObjectActivate(COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID,ULONG64 ObjectID) = 0;
    virtual HRESULT WINAPI OnObjectDeactivate(COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID,ULONG64 ObjectID) = 0;
    virtual HRESULT WINAPI OnDisableCommit(COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID) = 0;
    virtual HRESULT WINAPI OnEnableCommit(COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID) = 0;
    virtual HRESULT WINAPI OnSetComplete(COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID) = 0;
    virtual HRESULT WINAPI OnSetAbort(COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID) = 0;
  };
#else
  typedef struct IComObjectEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComObjectEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComObjectEvents *This);
      ULONG (WINAPI *Release)(IComObjectEvents *This);
      HRESULT (WINAPI *OnObjectActivate)(IComObjectEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID,ULONG64 ObjectID);
      HRESULT (WINAPI *OnObjectDeactivate)(IComObjectEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID,ULONG64 ObjectID);
      HRESULT (WINAPI *OnDisableCommit)(IComObjectEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID);
      HRESULT (WINAPI *OnEnableCommit)(IComObjectEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID);
      HRESULT (WINAPI *OnSetComplete)(IComObjectEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID);
      HRESULT (WINAPI *OnSetAbort)(IComObjectEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID);
    END_INTERFACE
  } IComObjectEventsVtbl;
  interface IComObjectEvents {
    CONST_VTBL struct IComObjectEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComObjectEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComObjectEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComObjectEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComObjectEvents_OnObjectActivate(This,pInfo,CtxtID,ObjectID) (This)->lpVtbl->OnObjectActivate(This,pInfo,CtxtID,ObjectID)
#define IComObjectEvents_OnObjectDeactivate(This,pInfo,CtxtID,ObjectID) (This)->lpVtbl->OnObjectDeactivate(This,pInfo,CtxtID,ObjectID)
#define IComObjectEvents_OnDisableCommit(This,pInfo,CtxtID) (This)->lpVtbl->OnDisableCommit(This,pInfo,CtxtID)
#define IComObjectEvents_OnEnableCommit(This,pInfo,CtxtID) (This)->lpVtbl->OnEnableCommit(This,pInfo,CtxtID)
#define IComObjectEvents_OnSetComplete(This,pInfo,CtxtID) (This)->lpVtbl->OnSetComplete(This,pInfo,CtxtID)
#define IComObjectEvents_OnSetAbort(This,pInfo,CtxtID) (This)->lpVtbl->OnSetAbort(This,pInfo,CtxtID)
#endif
#endif
  HRESULT WINAPI IComObjectEvents_OnObjectActivate_Proxy(IComObjectEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID,ULONG64 ObjectID);
  void __RPC_STUB IComObjectEvents_OnObjectActivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectEvents_OnObjectDeactivate_Proxy(IComObjectEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID,ULONG64 ObjectID);
  void __RPC_STUB IComObjectEvents_OnObjectDeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectEvents_OnDisableCommit_Proxy(IComObjectEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID);
  void __RPC_STUB IComObjectEvents_OnDisableCommit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectEvents_OnEnableCommit_Proxy(IComObjectEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID);
  void __RPC_STUB IComObjectEvents_OnEnableCommit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectEvents_OnSetComplete_Proxy(IComObjectEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID);
  void __RPC_STUB IComObjectEvents_OnSetComplete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectEvents_OnSetAbort_Proxy(IComObjectEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID);
  void __RPC_STUB IComObjectEvents_OnSetAbort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComResourceEvents_INTERFACE_DEFINED__
#define __IComResourceEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComResourceEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComResourceEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnResourceCreate(COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,LPCOLESTR pszType,ULONG64 resId,WINBOOL enlisted) = 0;
    virtual HRESULT WINAPI OnResourceAllocate(COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,LPCOLESTR pszType,ULONG64 resId,WINBOOL enlisted,DWORD NumRated,DWORD Rating) = 0;
    virtual HRESULT WINAPI OnResourceRecycle(COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,LPCOLESTR pszType,ULONG64 resId) = 0;
    virtual HRESULT WINAPI OnResourceDestroy(COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,HRESULT hr,LPCOLESTR pszType,ULONG64 resId) = 0;
    virtual HRESULT WINAPI OnResourceTrack(COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,LPCOLESTR pszType,ULONG64 resId,WINBOOL enlisted) = 0;
  };
#else
  typedef struct IComResourceEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComResourceEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComResourceEvents *This);
      ULONG (WINAPI *Release)(IComResourceEvents *This);
      HRESULT (WINAPI *OnResourceCreate)(IComResourceEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,LPCOLESTR pszType,ULONG64 resId,WINBOOL enlisted);
      HRESULT (WINAPI *OnResourceAllocate)(IComResourceEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,LPCOLESTR pszType,ULONG64 resId,WINBOOL enlisted,DWORD NumRated,DWORD Rating);
      HRESULT (WINAPI *OnResourceRecycle)(IComResourceEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,LPCOLESTR pszType,ULONG64 resId);
      HRESULT (WINAPI *OnResourceDestroy)(IComResourceEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,HRESULT hr,LPCOLESTR pszType,ULONG64 resId);
      HRESULT (WINAPI *OnResourceTrack)(IComResourceEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,LPCOLESTR pszType,ULONG64 resId,WINBOOL enlisted);
    END_INTERFACE
  } IComResourceEventsVtbl;
  interface IComResourceEvents {
    CONST_VTBL struct IComResourceEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComResourceEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComResourceEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComResourceEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComResourceEvents_OnResourceCreate(This,pInfo,ObjectID,pszType,resId,enlisted) (This)->lpVtbl->OnResourceCreate(This,pInfo,ObjectID,pszType,resId,enlisted)
#define IComResourceEvents_OnResourceAllocate(This,pInfo,ObjectID,pszType,resId,enlisted,NumRated,Rating) (This)->lpVtbl->OnResourceAllocate(This,pInfo,ObjectID,pszType,resId,enlisted,NumRated,Rating)
#define IComResourceEvents_OnResourceRecycle(This,pInfo,ObjectID,pszType,resId) (This)->lpVtbl->OnResourceRecycle(This,pInfo,ObjectID,pszType,resId)
#define IComResourceEvents_OnResourceDestroy(This,pInfo,ObjectID,hr,pszType,resId) (This)->lpVtbl->OnResourceDestroy(This,pInfo,ObjectID,hr,pszType,resId)
#define IComResourceEvents_OnResourceTrack(This,pInfo,ObjectID,pszType,resId,enlisted) (This)->lpVtbl->OnResourceTrack(This,pInfo,ObjectID,pszType,resId,enlisted)
#endif
#endif
  HRESULT WINAPI IComResourceEvents_OnResourceCreate_Proxy(IComResourceEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,LPCOLESTR pszType,ULONG64 resId,WINBOOL enlisted);
  void __RPC_STUB IComResourceEvents_OnResourceCreate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComResourceEvents_OnResourceAllocate_Proxy(IComResourceEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,LPCOLESTR pszType,ULONG64 resId,WINBOOL enlisted,DWORD NumRated,DWORD Rating);
  void __RPC_STUB IComResourceEvents_OnResourceAllocate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComResourceEvents_OnResourceRecycle_Proxy(IComResourceEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,LPCOLESTR pszType,ULONG64 resId);
  void __RPC_STUB IComResourceEvents_OnResourceRecycle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComResourceEvents_OnResourceDestroy_Proxy(IComResourceEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,HRESULT hr,LPCOLESTR pszType,ULONG64 resId);
  void __RPC_STUB IComResourceEvents_OnResourceDestroy_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComResourceEvents_OnResourceTrack_Proxy(IComResourceEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ObjectID,LPCOLESTR pszType,ULONG64 resId,WINBOOL enlisted);
  void __RPC_STUB IComResourceEvents_OnResourceTrack_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComSecurityEvents_INTERFACE_DEFINED__
#define __IComSecurityEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComSecurityEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComSecurityEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnAuthenticate(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,ULONG64 ObjectID,REFGUID guidIID,ULONG iMeth,ULONG cbByteOrig,BYTE *pSidOriginalUser,ULONG cbByteCur,BYTE *pSidCurrentUser,WINBOOL bCurrentUserInpersonatingInProc) = 0;
    virtual HRESULT WINAPI OnAuthenticateFail(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,ULONG64 ObjectID,REFGUID guidIID,ULONG iMeth,ULONG cbByteOrig,BYTE *pSidOriginalUser,ULONG cbByteCur,BYTE *pSidCurrentUser,WINBOOL bCurrentUserInpersonatingInProc) = 0;
  };
#else
  typedef struct IComSecurityEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComSecurityEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComSecurityEvents *This);
      ULONG (WINAPI *Release)(IComSecurityEvents *This);
      HRESULT (WINAPI *OnAuthenticate)(IComSecurityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,ULONG64 ObjectID,REFGUID guidIID,ULONG iMeth,ULONG cbByteOrig,BYTE *pSidOriginalUser,ULONG cbByteCur,BYTE *pSidCurrentUser,WINBOOL bCurrentUserInpersonatingInProc);
      HRESULT (WINAPI *OnAuthenticateFail)(IComSecurityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,ULONG64 ObjectID,REFGUID guidIID,ULONG iMeth,ULONG cbByteOrig,BYTE *pSidOriginalUser,ULONG cbByteCur,BYTE *pSidCurrentUser,WINBOOL bCurrentUserInpersonatingInProc);
    END_INTERFACE
  } IComSecurityEventsVtbl;
  interface IComSecurityEvents {
    CONST_VTBL struct IComSecurityEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComSecurityEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComSecurityEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComSecurityEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComSecurityEvents_OnAuthenticate(This,pInfo,guidActivity,ObjectID,guidIID,iMeth,cbByteOrig,pSidOriginalUser,cbByteCur,pSidCurrentUser,bCurrentUserInpersonatingInProc) (This)->lpVtbl->OnAuthenticate(This,pInfo,guidActivity,ObjectID,guidIID,iMeth,cbByteOrig,pSidOriginalUser,cbByteCur,pSidCurrentUser,bCurrentUserInpersonatingInProc)
#define IComSecurityEvents_OnAuthenticateFail(This,pInfo,guidActivity,ObjectID,guidIID,iMeth,cbByteOrig,pSidOriginalUser,cbByteCur,pSidCurrentUser,bCurrentUserInpersonatingInProc) (This)->lpVtbl->OnAuthenticateFail(This,pInfo,guidActivity,ObjectID,guidIID,iMeth,cbByteOrig,pSidOriginalUser,cbByteCur,pSidCurrentUser,bCurrentUserInpersonatingInProc)
#endif
#endif
  HRESULT WINAPI IComSecurityEvents_OnAuthenticate_Proxy(IComSecurityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,ULONG64 ObjectID,REFGUID guidIID,ULONG iMeth,ULONG cbByteOrig,BYTE *pSidOriginalUser,ULONG cbByteCur,BYTE *pSidCurrentUser,WINBOOL bCurrentUserInpersonatingInProc);
  void __RPC_STUB IComSecurityEvents_OnAuthenticate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComSecurityEvents_OnAuthenticateFail_Proxy(IComSecurityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,ULONG64 ObjectID,REFGUID guidIID,ULONG iMeth,ULONG cbByteOrig,BYTE *pSidOriginalUser,ULONG cbByteCur,BYTE *pSidCurrentUser,WINBOOL bCurrentUserInpersonatingInProc);
  void __RPC_STUB IComSecurityEvents_OnAuthenticateFail_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComObjectPoolEvents_INTERFACE_DEFINED__
#define __IComObjectPoolEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComObjectPoolEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComObjectPoolEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnObjPoolPutObject(COMSVCSEVENTINFO *pInfo,REFGUID guidObject,int nReason,DWORD dwAvailable,ULONG64 oid) = 0;
    virtual HRESULT WINAPI OnObjPoolGetObject(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,DWORD dwAvailable,ULONG64 oid) = 0;
    virtual HRESULT WINAPI OnObjPoolRecycleToTx(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,REFGUID guidTx,ULONG64 objid) = 0;
    virtual HRESULT WINAPI OnObjPoolGetFromTx(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,REFGUID guidTx,ULONG64 objid) = 0;
  };
#else
  typedef struct IComObjectPoolEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComObjectPoolEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComObjectPoolEvents *This);
      ULONG (WINAPI *Release)(IComObjectPoolEvents *This);
      HRESULT (WINAPI *OnObjPoolPutObject)(IComObjectPoolEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,int nReason,DWORD dwAvailable,ULONG64 oid);
      HRESULT (WINAPI *OnObjPoolGetObject)(IComObjectPoolEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,DWORD dwAvailable,ULONG64 oid);
      HRESULT (WINAPI *OnObjPoolRecycleToTx)(IComObjectPoolEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,REFGUID guidTx,ULONG64 objid);
      HRESULT (WINAPI *OnObjPoolGetFromTx)(IComObjectPoolEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,REFGUID guidTx,ULONG64 objid);
    END_INTERFACE
  } IComObjectPoolEventsVtbl;
  interface IComObjectPoolEvents {
    CONST_VTBL struct IComObjectPoolEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComObjectPoolEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComObjectPoolEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComObjectPoolEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComObjectPoolEvents_OnObjPoolPutObject(This,pInfo,guidObject,nReason,dwAvailable,oid) (This)->lpVtbl->OnObjPoolPutObject(This,pInfo,guidObject,nReason,dwAvailable,oid)
#define IComObjectPoolEvents_OnObjPoolGetObject(This,pInfo,guidActivity,guidObject,dwAvailable,oid) (This)->lpVtbl->OnObjPoolGetObject(This,pInfo,guidActivity,guidObject,dwAvailable,oid)
#define IComObjectPoolEvents_OnObjPoolRecycleToTx(This,pInfo,guidActivity,guidObject,guidTx,objid) (This)->lpVtbl->OnObjPoolRecycleToTx(This,pInfo,guidActivity,guidObject,guidTx,objid)
#define IComObjectPoolEvents_OnObjPoolGetFromTx(This,pInfo,guidActivity,guidObject,guidTx,objid) (This)->lpVtbl->OnObjPoolGetFromTx(This,pInfo,guidActivity,guidObject,guidTx,objid)
#endif
#endif
  HRESULT WINAPI IComObjectPoolEvents_OnObjPoolPutObject_Proxy(IComObjectPoolEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,int nReason,DWORD dwAvailable,ULONG64 oid);
  void __RPC_STUB IComObjectPoolEvents_OnObjPoolPutObject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectPoolEvents_OnObjPoolGetObject_Proxy(IComObjectPoolEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,DWORD dwAvailable,ULONG64 oid);
  void __RPC_STUB IComObjectPoolEvents_OnObjPoolGetObject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectPoolEvents_OnObjPoolRecycleToTx_Proxy(IComObjectPoolEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,REFGUID guidTx,ULONG64 objid);
  void __RPC_STUB IComObjectPoolEvents_OnObjPoolRecycleToTx_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectPoolEvents_OnObjPoolGetFromTx_Proxy(IComObjectPoolEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,REFGUID guidTx,ULONG64 objid);
  void __RPC_STUB IComObjectPoolEvents_OnObjPoolGetFromTx_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComObjectPoolEvents2_INTERFACE_DEFINED__
#define __IComObjectPoolEvents2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComObjectPoolEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComObjectPoolEvents2 : public IUnknown {
  public:
    virtual HRESULT WINAPI OnObjPoolCreateObject(COMSVCSEVENTINFO *pInfo,REFGUID guidObject,DWORD dwObjsCreated,ULONG64 oid) = 0;
    virtual HRESULT WINAPI OnObjPoolDestroyObject(COMSVCSEVENTINFO *pInfo,REFGUID guidObject,DWORD dwObjsCreated,ULONG64 oid) = 0;
    virtual HRESULT WINAPI OnObjPoolCreateDecision(COMSVCSEVENTINFO *pInfo,DWORD dwThreadsWaiting,DWORD dwAvail,DWORD dwCreated,DWORD dwMin,DWORD dwMax) = 0;
    virtual HRESULT WINAPI OnObjPoolTimeout(COMSVCSEVENTINFO *pInfo,REFGUID guidObject,REFGUID guidActivity,DWORD dwTimeout) = 0;
    virtual HRESULT WINAPI OnObjPoolCreatePool(COMSVCSEVENTINFO *pInfo,REFGUID guidObject,DWORD dwMin,DWORD dwMax,DWORD dwTimeout) = 0;
  };
#else
  typedef struct IComObjectPoolEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComObjectPoolEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComObjectPoolEvents2 *This);
      ULONG (WINAPI *Release)(IComObjectPoolEvents2 *This);
      HRESULT (WINAPI *OnObjPoolCreateObject)(IComObjectPoolEvents2 *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,DWORD dwObjsCreated,ULONG64 oid);
      HRESULT (WINAPI *OnObjPoolDestroyObject)(IComObjectPoolEvents2 *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,DWORD dwObjsCreated,ULONG64 oid);
      HRESULT (WINAPI *OnObjPoolCreateDecision)(IComObjectPoolEvents2 *This,COMSVCSEVENTINFO *pInfo,DWORD dwThreadsWaiting,DWORD dwAvail,DWORD dwCreated,DWORD dwMin,DWORD dwMax);
      HRESULT (WINAPI *OnObjPoolTimeout)(IComObjectPoolEvents2 *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,REFGUID guidActivity,DWORD dwTimeout);
      HRESULT (WINAPI *OnObjPoolCreatePool)(IComObjectPoolEvents2 *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,DWORD dwMin,DWORD dwMax,DWORD dwTimeout);
    END_INTERFACE
  } IComObjectPoolEvents2Vtbl;
  interface IComObjectPoolEvents2 {
    CONST_VTBL struct IComObjectPoolEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComObjectPoolEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComObjectPoolEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComObjectPoolEvents2_Release(This) (This)->lpVtbl->Release(This)
#define IComObjectPoolEvents2_OnObjPoolCreateObject(This,pInfo,guidObject,dwObjsCreated,oid) (This)->lpVtbl->OnObjPoolCreateObject(This,pInfo,guidObject,dwObjsCreated,oid)
#define IComObjectPoolEvents2_OnObjPoolDestroyObject(This,pInfo,guidObject,dwObjsCreated,oid) (This)->lpVtbl->OnObjPoolDestroyObject(This,pInfo,guidObject,dwObjsCreated,oid)
#define IComObjectPoolEvents2_OnObjPoolCreateDecision(This,pInfo,dwThreadsWaiting,dwAvail,dwCreated,dwMin,dwMax) (This)->lpVtbl->OnObjPoolCreateDecision(This,pInfo,dwThreadsWaiting,dwAvail,dwCreated,dwMin,dwMax)
#define IComObjectPoolEvents2_OnObjPoolTimeout(This,pInfo,guidObject,guidActivity,dwTimeout) (This)->lpVtbl->OnObjPoolTimeout(This,pInfo,guidObject,guidActivity,dwTimeout)
#define IComObjectPoolEvents2_OnObjPoolCreatePool(This,pInfo,guidObject,dwMin,dwMax,dwTimeout) (This)->lpVtbl->OnObjPoolCreatePool(This,pInfo,guidObject,dwMin,dwMax,dwTimeout)
#endif
#endif
  HRESULT WINAPI IComObjectPoolEvents2_OnObjPoolCreateObject_Proxy(IComObjectPoolEvents2 *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,DWORD dwObjsCreated,ULONG64 oid);
  void __RPC_STUB IComObjectPoolEvents2_OnObjPoolCreateObject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectPoolEvents2_OnObjPoolDestroyObject_Proxy(IComObjectPoolEvents2 *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,DWORD dwObjsCreated,ULONG64 oid);
  void __RPC_STUB IComObjectPoolEvents2_OnObjPoolDestroyObject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectPoolEvents2_OnObjPoolCreateDecision_Proxy(IComObjectPoolEvents2 *This,COMSVCSEVENTINFO *pInfo,DWORD dwThreadsWaiting,DWORD dwAvail,DWORD dwCreated,DWORD dwMin,DWORD dwMax);
  void __RPC_STUB IComObjectPoolEvents2_OnObjPoolCreateDecision_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectPoolEvents2_OnObjPoolTimeout_Proxy(IComObjectPoolEvents2 *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,REFGUID guidActivity,DWORD dwTimeout);
  void __RPC_STUB IComObjectPoolEvents2_OnObjPoolTimeout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectPoolEvents2_OnObjPoolCreatePool_Proxy(IComObjectPoolEvents2 *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,DWORD dwMin,DWORD dwMax,DWORD dwTimeout);
  void __RPC_STUB IComObjectPoolEvents2_OnObjPoolCreatePool_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComObjectConstructionEvents_INTERFACE_DEFINED__
#define __IComObjectConstructionEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComObjectConstructionEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComObjectConstructionEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnObjectConstruct(COMSVCSEVENTINFO *pInfo,REFGUID guidObject,LPCOLESTR sConstructString,ULONG64 oid) = 0;
  };
#else
  typedef struct IComObjectConstructionEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComObjectConstructionEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComObjectConstructionEvents *This);
      ULONG (WINAPI *Release)(IComObjectConstructionEvents *This);
      HRESULT (WINAPI *OnObjectConstruct)(IComObjectConstructionEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,LPCOLESTR sConstructString,ULONG64 oid);
    END_INTERFACE
  } IComObjectConstructionEventsVtbl;
  interface IComObjectConstructionEvents {
    CONST_VTBL struct IComObjectConstructionEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComObjectConstructionEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComObjectConstructionEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComObjectConstructionEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComObjectConstructionEvents_OnObjectConstruct(This,pInfo,guidObject,sConstructString,oid) (This)->lpVtbl->OnObjectConstruct(This,pInfo,guidObject,sConstructString,oid)
#endif
#endif
  HRESULT WINAPI IComObjectConstructionEvents_OnObjectConstruct_Proxy(IComObjectConstructionEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,LPCOLESTR sConstructString,ULONG64 oid);
  void __RPC_STUB IComObjectConstructionEvents_OnObjectConstruct_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComActivityEvents_INTERFACE_DEFINED__
#define __IComActivityEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComActivityEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComActivityEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnActivityCreate(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity) = 0;
    virtual HRESULT WINAPI OnActivityDestroy(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity) = 0;
    virtual HRESULT WINAPI OnActivityEnter(COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,REFGUID guidEntered,DWORD dwThread) = 0;
    virtual HRESULT WINAPI OnActivityTimeout(COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,REFGUID guidEntered,DWORD dwThread,DWORD dwTimeout) = 0;
    virtual HRESULT WINAPI OnActivityReenter(COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,DWORD dwThread,DWORD dwCallDepth) = 0;
    virtual HRESULT WINAPI OnActivityLeave(COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,REFGUID guidLeft) = 0;
    virtual HRESULT WINAPI OnActivityLeaveSame(COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,DWORD dwCallDepth) = 0;
  };
#else
  typedef struct IComActivityEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComActivityEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComActivityEvents *This);
      ULONG (WINAPI *Release)(IComActivityEvents *This);
      HRESULT (WINAPI *OnActivityCreate)(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity);
      HRESULT (WINAPI *OnActivityDestroy)(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity);
      HRESULT (WINAPI *OnActivityEnter)(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,REFGUID guidEntered,DWORD dwThread);
      HRESULT (WINAPI *OnActivityTimeout)(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,REFGUID guidEntered,DWORD dwThread,DWORD dwTimeout);
      HRESULT (WINAPI *OnActivityReenter)(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,DWORD dwThread,DWORD dwCallDepth);
      HRESULT (WINAPI *OnActivityLeave)(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,REFGUID guidLeft);
      HRESULT (WINAPI *OnActivityLeaveSame)(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,DWORD dwCallDepth);
    END_INTERFACE
  } IComActivityEventsVtbl;
  interface IComActivityEvents {
    CONST_VTBL struct IComActivityEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComActivityEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComActivityEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComActivityEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComActivityEvents_OnActivityCreate(This,pInfo,guidActivity) (This)->lpVtbl->OnActivityCreate(This,pInfo,guidActivity)
#define IComActivityEvents_OnActivityDestroy(This,pInfo,guidActivity) (This)->lpVtbl->OnActivityDestroy(This,pInfo,guidActivity)
#define IComActivityEvents_OnActivityEnter(This,pInfo,guidCurrent,guidEntered,dwThread) (This)->lpVtbl->OnActivityEnter(This,pInfo,guidCurrent,guidEntered,dwThread)
#define IComActivityEvents_OnActivityTimeout(This,pInfo,guidCurrent,guidEntered,dwThread,dwTimeout) (This)->lpVtbl->OnActivityTimeout(This,pInfo,guidCurrent,guidEntered,dwThread,dwTimeout)
#define IComActivityEvents_OnActivityReenter(This,pInfo,guidCurrent,dwThread,dwCallDepth) (This)->lpVtbl->OnActivityReenter(This,pInfo,guidCurrent,dwThread,dwCallDepth)
#define IComActivityEvents_OnActivityLeave(This,pInfo,guidCurrent,guidLeft) (This)->lpVtbl->OnActivityLeave(This,pInfo,guidCurrent,guidLeft)
#define IComActivityEvents_OnActivityLeaveSame(This,pInfo,guidCurrent,dwCallDepth) (This)->lpVtbl->OnActivityLeaveSame(This,pInfo,guidCurrent,dwCallDepth)
#endif
#endif
  HRESULT WINAPI IComActivityEvents_OnActivityCreate_Proxy(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity);
  void __RPC_STUB IComActivityEvents_OnActivityCreate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComActivityEvents_OnActivityDestroy_Proxy(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity);
  void __RPC_STUB IComActivityEvents_OnActivityDestroy_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComActivityEvents_OnActivityEnter_Proxy(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,REFGUID guidEntered,DWORD dwThread);
  void __RPC_STUB IComActivityEvents_OnActivityEnter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComActivityEvents_OnActivityTimeout_Proxy(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,REFGUID guidEntered,DWORD dwThread,DWORD dwTimeout);
  void __RPC_STUB IComActivityEvents_OnActivityTimeout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComActivityEvents_OnActivityReenter_Proxy(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,DWORD dwThread,DWORD dwCallDepth);
  void __RPC_STUB IComActivityEvents_OnActivityReenter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComActivityEvents_OnActivityLeave_Proxy(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,REFGUID guidLeft);
  void __RPC_STUB IComActivityEvents_OnActivityLeave_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComActivityEvents_OnActivityLeaveSame_Proxy(IComActivityEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidCurrent,DWORD dwCallDepth);
  void __RPC_STUB IComActivityEvents_OnActivityLeaveSame_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComIdentityEvents_INTERFACE_DEFINED__
#define __IComIdentityEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComIdentityEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComIdentityEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnIISRequestInfo(COMSVCSEVENTINFO *pInfo,ULONG64 ObjId,LPCOLESTR pszClientIP,LPCOLESTR pszServerIP,LPCOLESTR pszURL) = 0;
  };
#else
  typedef struct IComIdentityEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComIdentityEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComIdentityEvents *This);
      ULONG (WINAPI *Release)(IComIdentityEvents *This);
      HRESULT (WINAPI *OnIISRequestInfo)(IComIdentityEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ObjId,LPCOLESTR pszClientIP,LPCOLESTR pszServerIP,LPCOLESTR pszURL);
    END_INTERFACE
  } IComIdentityEventsVtbl;
  interface IComIdentityEvents {
    CONST_VTBL struct IComIdentityEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComIdentityEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComIdentityEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComIdentityEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComIdentityEvents_OnIISRequestInfo(This,pInfo,ObjId,pszClientIP,pszServerIP,pszURL) (This)->lpVtbl->OnIISRequestInfo(This,pInfo,ObjId,pszClientIP,pszServerIP,pszURL)
#endif
#endif
  HRESULT WINAPI IComIdentityEvents_OnIISRequestInfo_Proxy(IComIdentityEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 ObjId,LPCOLESTR pszClientIP,LPCOLESTR pszServerIP,LPCOLESTR pszURL);
  void __RPC_STUB IComIdentityEvents_OnIISRequestInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComQCEvents_INTERFACE_DEFINED__
#define __IComQCEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComQCEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComQCEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnQCRecord(COMSVCSEVENTINFO *pInfo,ULONG64 objid,WCHAR szQueue[60],REFGUID guidMsgId,REFGUID guidWorkFlowId,HRESULT msmqhr) = 0;
    virtual HRESULT WINAPI OnQCQueueOpen(COMSVCSEVENTINFO *pInfo,WCHAR szQueue[60],ULONG64 QueueID,HRESULT hr) = 0;
    virtual HRESULT WINAPI OnQCReceive(COMSVCSEVENTINFO *pInfo,ULONG64 QueueID,REFGUID guidMsgId,REFGUID guidWorkFlowId,HRESULT hr) = 0;
    virtual HRESULT WINAPI OnQCReceiveFail(COMSVCSEVENTINFO *pInfo,ULONG64 QueueID,HRESULT msmqhr) = 0;
    virtual HRESULT WINAPI OnQCMoveToReTryQueue(COMSVCSEVENTINFO *pInfo,REFGUID guidMsgId,REFGUID guidWorkFlowId,ULONG RetryIndex) = 0;
    virtual HRESULT WINAPI OnQCMoveToDeadQueue(COMSVCSEVENTINFO *pInfo,REFGUID guidMsgId,REFGUID guidWorkFlowId) = 0;
    virtual HRESULT WINAPI OnQCPlayback(COMSVCSEVENTINFO *pInfo,ULONG64 objid,REFGUID guidMsgId,REFGUID guidWorkFlowId,HRESULT hr) = 0;
  };
#else
  typedef struct IComQCEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComQCEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComQCEvents *This);
      ULONG (WINAPI *Release)(IComQCEvents *This);
      HRESULT (WINAPI *OnQCRecord)(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 objid,WCHAR szQueue[60],REFGUID guidMsgId,REFGUID guidWorkFlowId,HRESULT msmqhr);
      HRESULT (WINAPI *OnQCQueueOpen)(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,WCHAR szQueue[60],ULONG64 QueueID,HRESULT hr);
      HRESULT (WINAPI *OnQCReceive)(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 QueueID,REFGUID guidMsgId,REFGUID guidWorkFlowId,HRESULT hr);
      HRESULT (WINAPI *OnQCReceiveFail)(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 QueueID,HRESULT msmqhr);
      HRESULT (WINAPI *OnQCMoveToReTryQueue)(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidMsgId,REFGUID guidWorkFlowId,ULONG RetryIndex);
      HRESULT (WINAPI *OnQCMoveToDeadQueue)(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidMsgId,REFGUID guidWorkFlowId);
      HRESULT (WINAPI *OnQCPlayback)(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 objid,REFGUID guidMsgId,REFGUID guidWorkFlowId,HRESULT hr);
    END_INTERFACE
  } IComQCEventsVtbl;
  interface IComQCEvents {
    CONST_VTBL struct IComQCEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComQCEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComQCEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComQCEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComQCEvents_OnQCRecord(This,pInfo,objid,szQueue,guidMsgId,guidWorkFlowId,msmqhr) (This)->lpVtbl->OnQCRecord(This,pInfo,objid,szQueue,guidMsgId,guidWorkFlowId,msmqhr)
#define IComQCEvents_OnQCQueueOpen(This,pInfo,szQueue,QueueID,hr) (This)->lpVtbl->OnQCQueueOpen(This,pInfo,szQueue,QueueID,hr)
#define IComQCEvents_OnQCReceive(This,pInfo,QueueID,guidMsgId,guidWorkFlowId,hr) (This)->lpVtbl->OnQCReceive(This,pInfo,QueueID,guidMsgId,guidWorkFlowId,hr)
#define IComQCEvents_OnQCReceiveFail(This,pInfo,QueueID,msmqhr) (This)->lpVtbl->OnQCReceiveFail(This,pInfo,QueueID,msmqhr)
#define IComQCEvents_OnQCMoveToReTryQueue(This,pInfo,guidMsgId,guidWorkFlowId,RetryIndex) (This)->lpVtbl->OnQCMoveToReTryQueue(This,pInfo,guidMsgId,guidWorkFlowId,RetryIndex)
#define IComQCEvents_OnQCMoveToDeadQueue(This,pInfo,guidMsgId,guidWorkFlowId) (This)->lpVtbl->OnQCMoveToDeadQueue(This,pInfo,guidMsgId,guidWorkFlowId)
#define IComQCEvents_OnQCPlayback(This,pInfo,objid,guidMsgId,guidWorkFlowId,hr) (This)->lpVtbl->OnQCPlayback(This,pInfo,objid,guidMsgId,guidWorkFlowId,hr)
#endif
#endif
  HRESULT WINAPI IComQCEvents_OnQCRecord_Proxy(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 objid,WCHAR szQueue[60],REFGUID guidMsgId,REFGUID guidWorkFlowId,HRESULT msmqhr);
  void __RPC_STUB IComQCEvents_OnQCRecord_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComQCEvents_OnQCQueueOpen_Proxy(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,WCHAR szQueue[60],ULONG64 QueueID,HRESULT hr);
  void __RPC_STUB IComQCEvents_OnQCQueueOpen_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComQCEvents_OnQCReceive_Proxy(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 QueueID,REFGUID guidMsgId,REFGUID guidWorkFlowId,HRESULT hr);
  void __RPC_STUB IComQCEvents_OnQCReceive_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComQCEvents_OnQCReceiveFail_Proxy(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 QueueID,HRESULT msmqhr);
  void __RPC_STUB IComQCEvents_OnQCReceiveFail_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComQCEvents_OnQCMoveToReTryQueue_Proxy(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidMsgId,REFGUID guidWorkFlowId,ULONG RetryIndex);
  void __RPC_STUB IComQCEvents_OnQCMoveToReTryQueue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComQCEvents_OnQCMoveToDeadQueue_Proxy(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,REFGUID guidMsgId,REFGUID guidWorkFlowId);
  void __RPC_STUB IComQCEvents_OnQCMoveToDeadQueue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComQCEvents_OnQCPlayback_Proxy(IComQCEvents *This,COMSVCSEVENTINFO *pInfo,ULONG64 objid,REFGUID guidMsgId,REFGUID guidWorkFlowId,HRESULT hr);
  void __RPC_STUB IComQCEvents_OnQCPlayback_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComExceptionEvents_INTERFACE_DEFINED__
#define __IComExceptionEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComExceptionEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComExceptionEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnExceptionUser(COMSVCSEVENTINFO *pInfo,ULONG code,ULONG64 address,LPCOLESTR pszStackTrace) = 0;
  };
#else
  typedef struct IComExceptionEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComExceptionEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComExceptionEvents *This);
      ULONG (WINAPI *Release)(IComExceptionEvents *This);
      HRESULT (WINAPI *OnExceptionUser)(IComExceptionEvents *This,COMSVCSEVENTINFO *pInfo,ULONG code,ULONG64 address,LPCOLESTR pszStackTrace);
    END_INTERFACE
  } IComExceptionEventsVtbl;
  interface IComExceptionEvents {
    CONST_VTBL struct IComExceptionEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComExceptionEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComExceptionEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComExceptionEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComExceptionEvents_OnExceptionUser(This,pInfo,code,address,pszStackTrace) (This)->lpVtbl->OnExceptionUser(This,pInfo,code,address,pszStackTrace)
#endif
#endif
  HRESULT WINAPI IComExceptionEvents_OnExceptionUser_Proxy(IComExceptionEvents *This,COMSVCSEVENTINFO *pInfo,ULONG code,ULONG64 address,LPCOLESTR pszStackTrace);
  void __RPC_STUB IComExceptionEvents_OnExceptionUser_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ILBEvents_INTERFACE_DEFINED__
#define __ILBEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ILBEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ILBEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI TargetUp(BSTR bstrServerName,BSTR bstrClsidEng) = 0;
    virtual HRESULT WINAPI TargetDown(BSTR bstrServerName,BSTR bstrClsidEng) = 0;
    virtual HRESULT WINAPI EngineDefined(BSTR bstrPropName,VARIANT *varPropValue,BSTR bstrClsidEng) = 0;
  };
#else
  typedef struct ILBEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ILBEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ILBEvents *This);
      ULONG (WINAPI *Release)(ILBEvents *This);
      HRESULT (WINAPI *TargetUp)(ILBEvents *This,BSTR bstrServerName,BSTR bstrClsidEng);
      HRESULT (WINAPI *TargetDown)(ILBEvents *This,BSTR bstrServerName,BSTR bstrClsidEng);
      HRESULT (WINAPI *EngineDefined)(ILBEvents *This,BSTR bstrPropName,VARIANT *varPropValue,BSTR bstrClsidEng);
    END_INTERFACE
  } ILBEventsVtbl;
  interface ILBEvents {
    CONST_VTBL struct ILBEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ILBEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ILBEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ILBEvents_Release(This) (This)->lpVtbl->Release(This)
#define ILBEvents_TargetUp(This,bstrServerName,bstrClsidEng) (This)->lpVtbl->TargetUp(This,bstrServerName,bstrClsidEng)
#define ILBEvents_TargetDown(This,bstrServerName,bstrClsidEng) (This)->lpVtbl->TargetDown(This,bstrServerName,bstrClsidEng)
#define ILBEvents_EngineDefined(This,bstrPropName,varPropValue,bstrClsidEng) (This)->lpVtbl->EngineDefined(This,bstrPropName,varPropValue,bstrClsidEng)
#endif
#endif
  HRESULT WINAPI ILBEvents_TargetUp_Proxy(ILBEvents *This,BSTR bstrServerName,BSTR bstrClsidEng);
  void __RPC_STUB ILBEvents_TargetUp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ILBEvents_TargetDown_Proxy(ILBEvents *This,BSTR bstrServerName,BSTR bstrClsidEng);
  void __RPC_STUB ILBEvents_TargetDown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ILBEvents_EngineDefined_Proxy(ILBEvents *This,BSTR bstrPropName,VARIANT *varPropValue,BSTR bstrClsidEng);
  void __RPC_STUB ILBEvents_EngineDefined_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComCRMEvents_INTERFACE_DEFINED__
#define __IComCRMEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComCRMEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComCRMEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnCRMRecoveryStart(COMSVCSEVENTINFO *pInfo,GUID guidApp) = 0;
    virtual HRESULT WINAPI OnCRMRecoveryDone(COMSVCSEVENTINFO *pInfo,GUID guidApp) = 0;
    virtual HRESULT WINAPI OnCRMCheckpoint(COMSVCSEVENTINFO *pInfo,GUID guidApp) = 0;
    virtual HRESULT WINAPI OnCRMBegin(COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID,GUID guidActivity,GUID guidTx,WCHAR szProgIdCompensator[64],WCHAR szDescription[64]) = 0;
    virtual HRESULT WINAPI OnCRMPrepare(COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID) = 0;
    virtual HRESULT WINAPI OnCRMCommit(COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID) = 0;
    virtual HRESULT WINAPI OnCRMAbort(COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID) = 0;
    virtual HRESULT WINAPI OnCRMIndoubt(COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID) = 0;
    virtual HRESULT WINAPI OnCRMDone(COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID) = 0;
    virtual HRESULT WINAPI OnCRMRelease(COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID) = 0;
    virtual HRESULT WINAPI OnCRMAnalyze(COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID,DWORD dwCrmRecordType,DWORD dwRecordSize) = 0;
    virtual HRESULT WINAPI OnCRMWrite(COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID,WINBOOL fVariants,DWORD dwRecordSize) = 0;
    virtual HRESULT WINAPI OnCRMForget(COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID) = 0;
    virtual HRESULT WINAPI OnCRMForce(COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID) = 0;
    virtual HRESULT WINAPI OnCRMDeliver(COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID,WINBOOL fVariants,DWORD dwRecordSize) = 0;
  };
#else
  typedef struct IComCRMEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComCRMEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComCRMEvents *This);
      ULONG (WINAPI *Release)(IComCRMEvents *This);
      HRESULT (WINAPI *OnCRMRecoveryStart)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
      HRESULT (WINAPI *OnCRMRecoveryDone)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
      HRESULT (WINAPI *OnCRMCheckpoint)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
      HRESULT (WINAPI *OnCRMBegin)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID,GUID guidActivity,GUID guidTx,WCHAR szProgIdCompensator[64],WCHAR szDescription[64]);
      HRESULT (WINAPI *OnCRMPrepare)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
      HRESULT (WINAPI *OnCRMCommit)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
      HRESULT (WINAPI *OnCRMAbort)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
      HRESULT (WINAPI *OnCRMIndoubt)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
      HRESULT (WINAPI *OnCRMDone)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
      HRESULT (WINAPI *OnCRMRelease)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
      HRESULT (WINAPI *OnCRMAnalyze)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID,DWORD dwCrmRecordType,DWORD dwRecordSize);
      HRESULT (WINAPI *OnCRMWrite)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID,WINBOOL fVariants,DWORD dwRecordSize);
      HRESULT (WINAPI *OnCRMForget)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
      HRESULT (WINAPI *OnCRMForce)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
      HRESULT (WINAPI *OnCRMDeliver)(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID,WINBOOL fVariants,DWORD dwRecordSize);
    END_INTERFACE
  } IComCRMEventsVtbl;
  interface IComCRMEvents {
    CONST_VTBL struct IComCRMEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComCRMEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComCRMEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComCRMEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComCRMEvents_OnCRMRecoveryStart(This,pInfo,guidApp) (This)->lpVtbl->OnCRMRecoveryStart(This,pInfo,guidApp)
#define IComCRMEvents_OnCRMRecoveryDone(This,pInfo,guidApp) (This)->lpVtbl->OnCRMRecoveryDone(This,pInfo,guidApp)
#define IComCRMEvents_OnCRMCheckpoint(This,pInfo,guidApp) (This)->lpVtbl->OnCRMCheckpoint(This,pInfo,guidApp)
#define IComCRMEvents_OnCRMBegin(This,pInfo,guidClerkCLSID,guidActivity,guidTx,szProgIdCompensator,szDescription) (This)->lpVtbl->OnCRMBegin(This,pInfo,guidClerkCLSID,guidActivity,guidTx,szProgIdCompensator,szDescription)
#define IComCRMEvents_OnCRMPrepare(This,pInfo,guidClerkCLSID) (This)->lpVtbl->OnCRMPrepare(This,pInfo,guidClerkCLSID)
#define IComCRMEvents_OnCRMCommit(This,pInfo,guidClerkCLSID) (This)->lpVtbl->OnCRMCommit(This,pInfo,guidClerkCLSID)
#define IComCRMEvents_OnCRMAbort(This,pInfo,guidClerkCLSID) (This)->lpVtbl->OnCRMAbort(This,pInfo,guidClerkCLSID)
#define IComCRMEvents_OnCRMIndoubt(This,pInfo,guidClerkCLSID) (This)->lpVtbl->OnCRMIndoubt(This,pInfo,guidClerkCLSID)
#define IComCRMEvents_OnCRMDone(This,pInfo,guidClerkCLSID) (This)->lpVtbl->OnCRMDone(This,pInfo,guidClerkCLSID)
#define IComCRMEvents_OnCRMRelease(This,pInfo,guidClerkCLSID) (This)->lpVtbl->OnCRMRelease(This,pInfo,guidClerkCLSID)
#define IComCRMEvents_OnCRMAnalyze(This,pInfo,guidClerkCLSID,dwCrmRecordType,dwRecordSize) (This)->lpVtbl->OnCRMAnalyze(This,pInfo,guidClerkCLSID,dwCrmRecordType,dwRecordSize)
#define IComCRMEvents_OnCRMWrite(This,pInfo,guidClerkCLSID,fVariants,dwRecordSize) (This)->lpVtbl->OnCRMWrite(This,pInfo,guidClerkCLSID,fVariants,dwRecordSize)
#define IComCRMEvents_OnCRMForget(This,pInfo,guidClerkCLSID) (This)->lpVtbl->OnCRMForget(This,pInfo,guidClerkCLSID)
#define IComCRMEvents_OnCRMForce(This,pInfo,guidClerkCLSID) (This)->lpVtbl->OnCRMForce(This,pInfo,guidClerkCLSID)
#define IComCRMEvents_OnCRMDeliver(This,pInfo,guidClerkCLSID,fVariants,dwRecordSize) (This)->lpVtbl->OnCRMDeliver(This,pInfo,guidClerkCLSID,fVariants,dwRecordSize)
#endif
#endif
  HRESULT WINAPI IComCRMEvents_OnCRMRecoveryStart_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
  void __RPC_STUB IComCRMEvents_OnCRMRecoveryStart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMRecoveryDone_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
  void __RPC_STUB IComCRMEvents_OnCRMRecoveryDone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMCheckpoint_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
  void __RPC_STUB IComCRMEvents_OnCRMCheckpoint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMBegin_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID,GUID guidActivity,GUID guidTx,WCHAR szProgIdCompensator[64],WCHAR szDescription[64]);
  void __RPC_STUB IComCRMEvents_OnCRMBegin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMPrepare_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
  void __RPC_STUB IComCRMEvents_OnCRMPrepare_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMCommit_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
  void __RPC_STUB IComCRMEvents_OnCRMCommit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMAbort_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
  void __RPC_STUB IComCRMEvents_OnCRMAbort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMIndoubt_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
  void __RPC_STUB IComCRMEvents_OnCRMIndoubt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMDone_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
  void __RPC_STUB IComCRMEvents_OnCRMDone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMRelease_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
  void __RPC_STUB IComCRMEvents_OnCRMRelease_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMAnalyze_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID,DWORD dwCrmRecordType,DWORD dwRecordSize);
  void __RPC_STUB IComCRMEvents_OnCRMAnalyze_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMWrite_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID,WINBOOL fVariants,DWORD dwRecordSize);
  void __RPC_STUB IComCRMEvents_OnCRMWrite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMForget_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
  void __RPC_STUB IComCRMEvents_OnCRMForget_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMForce_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID);
  void __RPC_STUB IComCRMEvents_OnCRMForce_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComCRMEvents_OnCRMDeliver_Proxy(IComCRMEvents *This,COMSVCSEVENTINFO *pInfo,GUID guidClerkCLSID,WINBOOL fVariants,DWORD dwRecordSize);
  void __RPC_STUB IComCRMEvents_OnCRMDeliver_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComMethod2Events_INTERFACE_DEFINED__
#define __IComMethod2Events_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComMethod2Events;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComMethod2Events : public IUnknown {
  public:
    virtual HRESULT WINAPI OnMethodCall2(COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,DWORD dwThread,ULONG iMeth) = 0;
    virtual HRESULT WINAPI OnMethodReturn2(COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,DWORD dwThread,ULONG iMeth,HRESULT hresult) = 0;
    virtual HRESULT WINAPI OnMethodException2(COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,DWORD dwThread,ULONG iMeth) = 0;
  };
#else
  typedef struct IComMethod2EventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComMethod2Events *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComMethod2Events *This);
      ULONG (WINAPI *Release)(IComMethod2Events *This);
      HRESULT (WINAPI *OnMethodCall2)(IComMethod2Events *This,COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,DWORD dwThread,ULONG iMeth);
      HRESULT (WINAPI *OnMethodReturn2)(IComMethod2Events *This,COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,DWORD dwThread,ULONG iMeth,HRESULT hresult);
      HRESULT (WINAPI *OnMethodException2)(IComMethod2Events *This,COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,DWORD dwThread,ULONG iMeth);
    END_INTERFACE
  } IComMethod2EventsVtbl;
  interface IComMethod2Events {
    CONST_VTBL struct IComMethod2EventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComMethod2Events_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComMethod2Events_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComMethod2Events_Release(This) (This)->lpVtbl->Release(This)
#define IComMethod2Events_OnMethodCall2(This,pInfo,oid,guidCid,guidRid,dwThread,iMeth) (This)->lpVtbl->OnMethodCall2(This,pInfo,oid,guidCid,guidRid,dwThread,iMeth)
#define IComMethod2Events_OnMethodReturn2(This,pInfo,oid,guidCid,guidRid,dwThread,iMeth,hresult) (This)->lpVtbl->OnMethodReturn2(This,pInfo,oid,guidCid,guidRid,dwThread,iMeth,hresult)
#define IComMethod2Events_OnMethodException2(This,pInfo,oid,guidCid,guidRid,dwThread,iMeth) (This)->lpVtbl->OnMethodException2(This,pInfo,oid,guidCid,guidRid,dwThread,iMeth)
#endif
#endif
  HRESULT WINAPI IComMethod2Events_OnMethodCall2_Proxy(IComMethod2Events *This,COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,DWORD dwThread,ULONG iMeth);
  void __RPC_STUB IComMethod2Events_OnMethodCall2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComMethod2Events_OnMethodReturn2_Proxy(IComMethod2Events *This,COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,DWORD dwThread,ULONG iMeth,HRESULT hresult);
  void __RPC_STUB IComMethod2Events_OnMethodReturn2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComMethod2Events_OnMethodException2_Proxy(IComMethod2Events *This,COMSVCSEVENTINFO *pInfo,ULONG64 oid,REFCLSID guidCid,REFIID guidRid,DWORD dwThread,ULONG iMeth);
  void __RPC_STUB IComMethod2Events_OnMethodException2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComTrackingInfoEvents_INTERFACE_DEFINED__
#define __IComTrackingInfoEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComTrackingInfoEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComTrackingInfoEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI OnNewTrackingInfo(IUnknown *pToplevelCollection) = 0;
  };
#else
  typedef struct IComTrackingInfoEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComTrackingInfoEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComTrackingInfoEvents *This);
      ULONG (WINAPI *Release)(IComTrackingInfoEvents *This);
      HRESULT (WINAPI *OnNewTrackingInfo)(IComTrackingInfoEvents *This,IUnknown *pToplevelCollection);
    END_INTERFACE
  } IComTrackingInfoEventsVtbl;
  interface IComTrackingInfoEvents {
    CONST_VTBL struct IComTrackingInfoEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComTrackingInfoEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComTrackingInfoEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComTrackingInfoEvents_Release(This) (This)->lpVtbl->Release(This)
#define IComTrackingInfoEvents_OnNewTrackingInfo(This,pToplevelCollection) (This)->lpVtbl->OnNewTrackingInfo(This,pToplevelCollection)
#endif
#endif
  HRESULT WINAPI IComTrackingInfoEvents_OnNewTrackingInfo_Proxy(IComTrackingInfoEvents *This,IUnknown *pToplevelCollection);
  void __RPC_STUB IComTrackingInfoEvents_OnNewTrackingInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  typedef enum __MIDL___MIDL_itf_autosvcs_0325_0001 {
    TRKCOLL_PROCESSES = 0,TRKCOLL_APPLICATIONS = TRKCOLL_PROCESSES + 1,TRKCOLL_COMPONENTS = TRKCOLL_APPLICATIONS + 1
  } TRACKING_COLL_TYPE;

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0325_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0325_v0_0_s_ifspec;

#ifndef __IComTrackingInfoCollection_INTERFACE_DEFINED__
#define __IComTrackingInfoCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComTrackingInfoCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComTrackingInfoCollection : public IUnknown {
  public:
    virtual HRESULT WINAPI Type(TRACKING_COLL_TYPE *pType) = 0;
    virtual HRESULT WINAPI Count(ULONG *pCount) = 0;
    virtual HRESULT WINAPI Item(ULONG ulIndex,REFIID riid,void **ppv) = 0;
  };
#else
  typedef struct IComTrackingInfoCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComTrackingInfoCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComTrackingInfoCollection *This);
      ULONG (WINAPI *Release)(IComTrackingInfoCollection *This);
      HRESULT (WINAPI *Type)(IComTrackingInfoCollection *This,TRACKING_COLL_TYPE *pType);
      HRESULT (WINAPI *Count)(IComTrackingInfoCollection *This,ULONG *pCount);
      HRESULT (WINAPI *Item)(IComTrackingInfoCollection *This,ULONG ulIndex,REFIID riid,void **ppv);
    END_INTERFACE
  } IComTrackingInfoCollectionVtbl;
  interface IComTrackingInfoCollection {
    CONST_VTBL struct IComTrackingInfoCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComTrackingInfoCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComTrackingInfoCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComTrackingInfoCollection_Release(This) (This)->lpVtbl->Release(This)
#define IComTrackingInfoCollection_Type(This,pType) (This)->lpVtbl->Type(This,pType)
#define IComTrackingInfoCollection_Count(This,pCount) (This)->lpVtbl->Count(This,pCount)
#define IComTrackingInfoCollection_Item(This,ulIndex,riid,ppv) (This)->lpVtbl->Item(This,ulIndex,riid,ppv)
#endif
#endif
  HRESULT WINAPI IComTrackingInfoCollection_Type_Proxy(IComTrackingInfoCollection *This,TRACKING_COLL_TYPE *pType);
  void __RPC_STUB IComTrackingInfoCollection_Type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComTrackingInfoCollection_Count_Proxy(IComTrackingInfoCollection *This,ULONG *pCount);
  void __RPC_STUB IComTrackingInfoCollection_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComTrackingInfoCollection_Item_Proxy(IComTrackingInfoCollection *This,ULONG ulIndex,REFIID riid,void **ppv);
  void __RPC_STUB IComTrackingInfoCollection_Item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComTrackingInfoObject_INTERFACE_DEFINED__
#define __IComTrackingInfoObject_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComTrackingInfoObject;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComTrackingInfoObject : public IUnknown {
  public:
    virtual HRESULT WINAPI GetValue(LPOLESTR szPropertyName,VARIANT *pvarOut) = 0;
  };
#else
  typedef struct IComTrackingInfoObjectVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComTrackingInfoObject *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComTrackingInfoObject *This);
      ULONG (WINAPI *Release)(IComTrackingInfoObject *This);
      HRESULT (WINAPI *GetValue)(IComTrackingInfoObject *This,LPOLESTR szPropertyName,VARIANT *pvarOut);
    END_INTERFACE
  } IComTrackingInfoObjectVtbl;
  interface IComTrackingInfoObject {
    CONST_VTBL struct IComTrackingInfoObjectVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComTrackingInfoObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComTrackingInfoObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComTrackingInfoObject_Release(This) (This)->lpVtbl->Release(This)
#define IComTrackingInfoObject_GetValue(This,szPropertyName,pvarOut) (This)->lpVtbl->GetValue(This,szPropertyName,pvarOut)
#endif
#endif
  HRESULT WINAPI IComTrackingInfoObject_GetValue_Proxy(IComTrackingInfoObject *This,LPOLESTR szPropertyName,VARIANT *pvarOut);
  void __RPC_STUB IComTrackingInfoObject_GetValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComTrackingInfoProperties_INTERFACE_DEFINED__
#define __IComTrackingInfoProperties_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComTrackingInfoProperties;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComTrackingInfoProperties : public IUnknown {
  public:
    virtual HRESULT WINAPI PropCount(ULONG *pCount) = 0;
    virtual HRESULT WINAPI GetPropName(ULONG ulIndex,LPOLESTR *ppszPropName) = 0;
  };
#else
  typedef struct IComTrackingInfoPropertiesVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComTrackingInfoProperties *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComTrackingInfoProperties *This);
      ULONG (WINAPI *Release)(IComTrackingInfoProperties *This);
      HRESULT (WINAPI *PropCount)(IComTrackingInfoProperties *This,ULONG *pCount);
      HRESULT (WINAPI *GetPropName)(IComTrackingInfoProperties *This,ULONG ulIndex,LPOLESTR *ppszPropName);
    END_INTERFACE
  } IComTrackingInfoPropertiesVtbl;
  interface IComTrackingInfoProperties {
    CONST_VTBL struct IComTrackingInfoPropertiesVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComTrackingInfoProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComTrackingInfoProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComTrackingInfoProperties_Release(This) (This)->lpVtbl->Release(This)
#define IComTrackingInfoProperties_PropCount(This,pCount) (This)->lpVtbl->PropCount(This,pCount)
#define IComTrackingInfoProperties_GetPropName(This,ulIndex,ppszPropName) (This)->lpVtbl->GetPropName(This,ulIndex,ppszPropName)
#endif
#endif
  HRESULT WINAPI IComTrackingInfoProperties_PropCount_Proxy(IComTrackingInfoProperties *This,ULONG *pCount);
  void __RPC_STUB IComTrackingInfoProperties_PropCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComTrackingInfoProperties_GetPropName_Proxy(IComTrackingInfoProperties *This,ULONG ulIndex,LPOLESTR *ppszPropName);
  void __RPC_STUB IComTrackingInfoProperties_GetPropName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComApp2Events_INTERFACE_DEFINED__
#define __IComApp2Events_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComApp2Events;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComApp2Events : public IUnknown {
  public:
    virtual HRESULT WINAPI OnAppActivation2(COMSVCSEVENTINFO *pInfo,GUID guidApp,GUID guidProcess) = 0;
    virtual HRESULT WINAPI OnAppShutdown2(COMSVCSEVENTINFO *pInfo,GUID guidApp) = 0;
    virtual HRESULT WINAPI OnAppForceShutdown2(COMSVCSEVENTINFO *pInfo,GUID guidApp) = 0;
    virtual HRESULT WINAPI OnAppPaused2(COMSVCSEVENTINFO *pInfo,GUID guidApp,WINBOOL bPaused) = 0;
    virtual HRESULT WINAPI OnAppRecycle2(COMSVCSEVENTINFO *pInfo,GUID guidApp,GUID guidProcess,long lReason) = 0;
  };
#else
  typedef struct IComApp2EventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComApp2Events *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComApp2Events *This);
      ULONG (WINAPI *Release)(IComApp2Events *This);
      HRESULT (WINAPI *OnAppActivation2)(IComApp2Events *This,COMSVCSEVENTINFO *pInfo,GUID guidApp,GUID guidProcess);
      HRESULT (WINAPI *OnAppShutdown2)(IComApp2Events *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
      HRESULT (WINAPI *OnAppForceShutdown2)(IComApp2Events *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
      HRESULT (WINAPI *OnAppPaused2)(IComApp2Events *This,COMSVCSEVENTINFO *pInfo,GUID guidApp,WINBOOL bPaused);
      HRESULT (WINAPI *OnAppRecycle2)(IComApp2Events *This,COMSVCSEVENTINFO *pInfo,GUID guidApp,GUID guidProcess,long lReason);
    END_INTERFACE
  } IComApp2EventsVtbl;
  interface IComApp2Events {
    CONST_VTBL struct IComApp2EventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComApp2Events_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComApp2Events_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComApp2Events_Release(This) (This)->lpVtbl->Release(This)
#define IComApp2Events_OnAppActivation2(This,pInfo,guidApp,guidProcess) (This)->lpVtbl->OnAppActivation2(This,pInfo,guidApp,guidProcess)
#define IComApp2Events_OnAppShutdown2(This,pInfo,guidApp) (This)->lpVtbl->OnAppShutdown2(This,pInfo,guidApp)
#define IComApp2Events_OnAppForceShutdown2(This,pInfo,guidApp) (This)->lpVtbl->OnAppForceShutdown2(This,pInfo,guidApp)
#define IComApp2Events_OnAppPaused2(This,pInfo,guidApp,bPaused) (This)->lpVtbl->OnAppPaused2(This,pInfo,guidApp,bPaused)
#define IComApp2Events_OnAppRecycle2(This,pInfo,guidApp,guidProcess,lReason) (This)->lpVtbl->OnAppRecycle2(This,pInfo,guidApp,guidProcess,lReason)
#endif
#endif
  HRESULT WINAPI IComApp2Events_OnAppActivation2_Proxy(IComApp2Events *This,COMSVCSEVENTINFO *pInfo,GUID guidApp,GUID guidProcess);
  void __RPC_STUB IComApp2Events_OnAppActivation2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComApp2Events_OnAppShutdown2_Proxy(IComApp2Events *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
  void __RPC_STUB IComApp2Events_OnAppShutdown2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComApp2Events_OnAppForceShutdown2_Proxy(IComApp2Events *This,COMSVCSEVENTINFO *pInfo,GUID guidApp);
  void __RPC_STUB IComApp2Events_OnAppForceShutdown2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComApp2Events_OnAppPaused2_Proxy(IComApp2Events *This,COMSVCSEVENTINFO *pInfo,GUID guidApp,WINBOOL bPaused);
  void __RPC_STUB IComApp2Events_OnAppPaused2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComApp2Events_OnAppRecycle2_Proxy(IComApp2Events *This,COMSVCSEVENTINFO *pInfo,GUID guidApp,GUID guidProcess,long lReason);
  void __RPC_STUB IComApp2Events_OnAppRecycle2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComTransaction2Events_INTERFACE_DEFINED__
#define __IComTransaction2Events_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComTransaction2Events;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComTransaction2Events : public IUnknown {
  public:
    virtual HRESULT WINAPI OnTransactionStart2(COMSVCSEVENTINFO *pInfo,REFGUID guidTx,REFGUID tsid,WINBOOL fRoot,int nIsolationLevel) = 0;
    virtual HRESULT WINAPI OnTransactionPrepare2(COMSVCSEVENTINFO *pInfo,REFGUID guidTx,WINBOOL fVoteYes) = 0;
    virtual HRESULT WINAPI OnTransactionAbort2(COMSVCSEVENTINFO *pInfo,REFGUID guidTx) = 0;
    virtual HRESULT WINAPI OnTransactionCommit2(COMSVCSEVENTINFO *pInfo,REFGUID guidTx) = 0;
  };
#else
  typedef struct IComTransaction2EventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComTransaction2Events *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComTransaction2Events *This);
      ULONG (WINAPI *Release)(IComTransaction2Events *This);
      HRESULT (WINAPI *OnTransactionStart2)(IComTransaction2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx,REFGUID tsid,WINBOOL fRoot,int nIsolationLevel);
      HRESULT (WINAPI *OnTransactionPrepare2)(IComTransaction2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx,WINBOOL fVoteYes);
      HRESULT (WINAPI *OnTransactionAbort2)(IComTransaction2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx);
      HRESULT (WINAPI *OnTransactionCommit2)(IComTransaction2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx);
    END_INTERFACE
  } IComTransaction2EventsVtbl;
  interface IComTransaction2Events {
    CONST_VTBL struct IComTransaction2EventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComTransaction2Events_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComTransaction2Events_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComTransaction2Events_Release(This) (This)->lpVtbl->Release(This)
#define IComTransaction2Events_OnTransactionStart2(This,pInfo,guidTx,tsid,fRoot,nIsolationLevel) (This)->lpVtbl->OnTransactionStart2(This,pInfo,guidTx,tsid,fRoot,nIsolationLevel)
#define IComTransaction2Events_OnTransactionPrepare2(This,pInfo,guidTx,fVoteYes) (This)->lpVtbl->OnTransactionPrepare2(This,pInfo,guidTx,fVoteYes)
#define IComTransaction2Events_OnTransactionAbort2(This,pInfo,guidTx) (This)->lpVtbl->OnTransactionAbort2(This,pInfo,guidTx)
#define IComTransaction2Events_OnTransactionCommit2(This,pInfo,guidTx) (This)->lpVtbl->OnTransactionCommit2(This,pInfo,guidTx)
#endif
#endif
  HRESULT WINAPI IComTransaction2Events_OnTransactionStart2_Proxy(IComTransaction2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx,REFGUID tsid,WINBOOL fRoot,int nIsolationLevel);
  void __RPC_STUB IComTransaction2Events_OnTransactionStart2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComTransaction2Events_OnTransactionPrepare2_Proxy(IComTransaction2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx,WINBOOL fVoteYes);
  void __RPC_STUB IComTransaction2Events_OnTransactionPrepare2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComTransaction2Events_OnTransactionAbort2_Proxy(IComTransaction2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx);
  void __RPC_STUB IComTransaction2Events_OnTransactionAbort2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComTransaction2Events_OnTransactionCommit2_Proxy(IComTransaction2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidTx);
  void __RPC_STUB IComTransaction2Events_OnTransactionCommit2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComInstance2Events_INTERFACE_DEFINED__
#define __IComInstance2Events_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComInstance2Events;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComInstance2Events : public IUnknown {
  public:
    virtual HRESULT WINAPI OnObjectCreate2(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFCLSID clsid,REFGUID tsid,ULONG64 CtxtID,ULONG64 ObjectID,REFGUID guidPartition) = 0;
    virtual HRESULT WINAPI OnObjectDestroy2(COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID) = 0;
  };
#else
  typedef struct IComInstance2EventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComInstance2Events *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComInstance2Events *This);
      ULONG (WINAPI *Release)(IComInstance2Events *This);
      HRESULT (WINAPI *OnObjectCreate2)(IComInstance2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFCLSID clsid,REFGUID tsid,ULONG64 CtxtID,ULONG64 ObjectID,REFGUID guidPartition);
      HRESULT (WINAPI *OnObjectDestroy2)(IComInstance2Events *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID);
    END_INTERFACE
  } IComInstance2EventsVtbl;
  interface IComInstance2Events {
    CONST_VTBL struct IComInstance2EventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComInstance2Events_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComInstance2Events_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComInstance2Events_Release(This) (This)->lpVtbl->Release(This)
#define IComInstance2Events_OnObjectCreate2(This,pInfo,guidActivity,clsid,tsid,CtxtID,ObjectID,guidPartition) (This)->lpVtbl->OnObjectCreate2(This,pInfo,guidActivity,clsid,tsid,CtxtID,ObjectID,guidPartition)
#define IComInstance2Events_OnObjectDestroy2(This,pInfo,CtxtID) (This)->lpVtbl->OnObjectDestroy2(This,pInfo,CtxtID)
#endif
#endif
  HRESULT WINAPI IComInstance2Events_OnObjectCreate2_Proxy(IComInstance2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFCLSID clsid,REFGUID tsid,ULONG64 CtxtID,ULONG64 ObjectID,REFGUID guidPartition);
  void __RPC_STUB IComInstance2Events_OnObjectCreate2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComInstance2Events_OnObjectDestroy2_Proxy(IComInstance2Events *This,COMSVCSEVENTINFO *pInfo,ULONG64 CtxtID);
  void __RPC_STUB IComInstance2Events_OnObjectDestroy2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComObjectPool2Events_INTERFACE_DEFINED__
#define __IComObjectPool2Events_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComObjectPool2Events;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComObjectPool2Events : public IUnknown {
  public:
    virtual HRESULT WINAPI OnObjPoolPutObject2(COMSVCSEVENTINFO *pInfo,REFGUID guidObject,int nReason,DWORD dwAvailable,ULONG64 oid) = 0;
    virtual HRESULT WINAPI OnObjPoolGetObject2(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,DWORD dwAvailable,ULONG64 oid,REFGUID guidPartition) = 0;
    virtual HRESULT WINAPI OnObjPoolRecycleToTx2(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,REFGUID guidTx,ULONG64 objid) = 0;
    virtual HRESULT WINAPI OnObjPoolGetFromTx2(COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,REFGUID guidTx,ULONG64 objid,REFGUID guidPartition) = 0;
  };
#else
  typedef struct IComObjectPool2EventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComObjectPool2Events *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComObjectPool2Events *This);
      ULONG (WINAPI *Release)(IComObjectPool2Events *This);
      HRESULT (WINAPI *OnObjPoolPutObject2)(IComObjectPool2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,int nReason,DWORD dwAvailable,ULONG64 oid);
      HRESULT (WINAPI *OnObjPoolGetObject2)(IComObjectPool2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,DWORD dwAvailable,ULONG64 oid,REFGUID guidPartition);
      HRESULT (WINAPI *OnObjPoolRecycleToTx2)(IComObjectPool2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,REFGUID guidTx,ULONG64 objid);
      HRESULT (WINAPI *OnObjPoolGetFromTx2)(IComObjectPool2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,REFGUID guidTx,ULONG64 objid,REFGUID guidPartition);
    END_INTERFACE
  } IComObjectPool2EventsVtbl;
  interface IComObjectPool2Events {
    CONST_VTBL struct IComObjectPool2EventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComObjectPool2Events_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComObjectPool2Events_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComObjectPool2Events_Release(This) (This)->lpVtbl->Release(This)
#define IComObjectPool2Events_OnObjPoolPutObject2(This,pInfo,guidObject,nReason,dwAvailable,oid) (This)->lpVtbl->OnObjPoolPutObject2(This,pInfo,guidObject,nReason,dwAvailable,oid)
#define IComObjectPool2Events_OnObjPoolGetObject2(This,pInfo,guidActivity,guidObject,dwAvailable,oid,guidPartition) (This)->lpVtbl->OnObjPoolGetObject2(This,pInfo,guidActivity,guidObject,dwAvailable,oid,guidPartition)
#define IComObjectPool2Events_OnObjPoolRecycleToTx2(This,pInfo,guidActivity,guidObject,guidTx,objid) (This)->lpVtbl->OnObjPoolRecycleToTx2(This,pInfo,guidActivity,guidObject,guidTx,objid)
#define IComObjectPool2Events_OnObjPoolGetFromTx2(This,pInfo,guidActivity,guidObject,guidTx,objid,guidPartition) (This)->lpVtbl->OnObjPoolGetFromTx2(This,pInfo,guidActivity,guidObject,guidTx,objid,guidPartition)
#endif
#endif
  HRESULT WINAPI IComObjectPool2Events_OnObjPoolPutObject2_Proxy(IComObjectPool2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,int nReason,DWORD dwAvailable,ULONG64 oid);
  void __RPC_STUB IComObjectPool2Events_OnObjPoolPutObject2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectPool2Events_OnObjPoolGetObject2_Proxy(IComObjectPool2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,DWORD dwAvailable,ULONG64 oid,REFGUID guidPartition);
  void __RPC_STUB IComObjectPool2Events_OnObjPoolGetObject2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectPool2Events_OnObjPoolRecycleToTx2_Proxy(IComObjectPool2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,REFGUID guidTx,ULONG64 objid);
  void __RPC_STUB IComObjectPool2Events_OnObjPoolRecycleToTx2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComObjectPool2Events_OnObjPoolGetFromTx2_Proxy(IComObjectPool2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidActivity,REFGUID guidObject,REFGUID guidTx,ULONG64 objid,REFGUID guidPartition);
  void __RPC_STUB IComObjectPool2Events_OnObjPoolGetFromTx2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComObjectConstruction2Events_INTERFACE_DEFINED__
#define __IComObjectConstruction2Events_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComObjectConstruction2Events;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComObjectConstruction2Events : public IUnknown {
  public:
    virtual HRESULT WINAPI OnObjectConstruct2(COMSVCSEVENTINFO *pInfo,REFGUID guidObject,LPCOLESTR sConstructString,ULONG64 oid,REFGUID guidPartition) = 0;
  };
#else
  typedef struct IComObjectConstruction2EventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComObjectConstruction2Events *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComObjectConstruction2Events *This);
      ULONG (WINAPI *Release)(IComObjectConstruction2Events *This);
      HRESULT (WINAPI *OnObjectConstruct2)(IComObjectConstruction2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,LPCOLESTR sConstructString,ULONG64 oid,REFGUID guidPartition);
    END_INTERFACE
  } IComObjectConstruction2EventsVtbl;
  interface IComObjectConstruction2Events {
    CONST_VTBL struct IComObjectConstruction2EventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComObjectConstruction2Events_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComObjectConstruction2Events_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComObjectConstruction2Events_Release(This) (This)->lpVtbl->Release(This)
#define IComObjectConstruction2Events_OnObjectConstruct2(This,pInfo,guidObject,sConstructString,oid,guidPartition) (This)->lpVtbl->OnObjectConstruct2(This,pInfo,guidObject,sConstructString,oid,guidPartition)
#endif
#endif
  HRESULT WINAPI IComObjectConstruction2Events_OnObjectConstruct2_Proxy(IComObjectConstruction2Events *This,COMSVCSEVENTINFO *pInfo,REFGUID guidObject,LPCOLESTR sConstructString,ULONG64 oid,REFGUID guidPartition);
  void __RPC_STUB IComObjectConstruction2Events_OnObjectConstruct2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISystemAppEventData_INTERFACE_DEFINED__
#define __ISystemAppEventData_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISystemAppEventData;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISystemAppEventData : public IUnknown {
  public:
    virtual HRESULT WINAPI Startup(void) = 0;
    virtual HRESULT WINAPI OnDataChanged(DWORD dwPID,DWORD dwMask,DWORD dwNumberSinks,BSTR bstrDwMethodMask,DWORD dwReason,ULONG64 u64TraceHandle) = 0;
  };
#else
  typedef struct ISystemAppEventDataVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISystemAppEventData *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISystemAppEventData *This);
      ULONG (WINAPI *Release)(ISystemAppEventData *This);
      HRESULT (WINAPI *Startup)(ISystemAppEventData *This);
      HRESULT (WINAPI *OnDataChanged)(ISystemAppEventData *This,DWORD dwPID,DWORD dwMask,DWORD dwNumberSinks,BSTR bstrDwMethodMask,DWORD dwReason,ULONG64 u64TraceHandle);
    END_INTERFACE
  } ISystemAppEventDataVtbl;
  interface ISystemAppEventData {
    CONST_VTBL struct ISystemAppEventDataVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISystemAppEventData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISystemAppEventData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISystemAppEventData_Release(This) (This)->lpVtbl->Release(This)
#define ISystemAppEventData_Startup(This) (This)->lpVtbl->Startup(This)
#define ISystemAppEventData_OnDataChanged(This,dwPID,dwMask,dwNumberSinks,bstrDwMethodMask,dwReason,u64TraceHandle) (This)->lpVtbl->OnDataChanged(This,dwPID,dwMask,dwNumberSinks,bstrDwMethodMask,dwReason,u64TraceHandle)
#endif
#endif
  HRESULT WINAPI ISystemAppEventData_Startup_Proxy(ISystemAppEventData *This);
  void __RPC_STUB ISystemAppEventData_Startup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISystemAppEventData_OnDataChanged_Proxy(ISystemAppEventData *This,DWORD dwPID,DWORD dwMask,DWORD dwNumberSinks,BSTR bstrDwMethodMask,DWORD dwReason,ULONG64 u64TraceHandle);
  void __RPC_STUB ISystemAppEventData_OnDataChanged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMtsEvents_INTERFACE_DEFINED__
#define __IMtsEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IMtsEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IMtsEvents : public IDispatch {
  public:
    virtual HRESULT WINAPI get_PackageName(BSTR *pVal) = 0;
    virtual HRESULT WINAPI get_PackageGuid(BSTR *pVal) = 0;
    virtual HRESULT WINAPI PostEvent(VARIANT *vEvent) = 0;
    virtual HRESULT WINAPI get_FireEvents(VARIANT_BOOL *pVal) = 0;
    virtual HRESULT WINAPI GetProcessID(long *id) = 0;
  };
#else
  typedef struct IMtsEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IMtsEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IMtsEvents *This);
      ULONG (WINAPI *Release)(IMtsEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IMtsEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IMtsEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IMtsEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IMtsEvents *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_PackageName)(IMtsEvents *This,BSTR *pVal);
      HRESULT (WINAPI *get_PackageGuid)(IMtsEvents *This,BSTR *pVal);
      HRESULT (WINAPI *PostEvent)(IMtsEvents *This,VARIANT *vEvent);
      HRESULT (WINAPI *get_FireEvents)(IMtsEvents *This,VARIANT_BOOL *pVal);
      HRESULT (WINAPI *GetProcessID)(IMtsEvents *This,long *id);
    END_INTERFACE
  } IMtsEventsVtbl;
  interface IMtsEvents {
    CONST_VTBL struct IMtsEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IMtsEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMtsEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMtsEvents_Release(This) (This)->lpVtbl->Release(This)
#define IMtsEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMtsEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMtsEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMtsEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IMtsEvents_get_PackageName(This,pVal) (This)->lpVtbl->get_PackageName(This,pVal)
#define IMtsEvents_get_PackageGuid(This,pVal) (This)->lpVtbl->get_PackageGuid(This,pVal)
#define IMtsEvents_PostEvent(This,vEvent) (This)->lpVtbl->PostEvent(This,vEvent)
#define IMtsEvents_get_FireEvents(This,pVal) (This)->lpVtbl->get_FireEvents(This,pVal)
#define IMtsEvents_GetProcessID(This,id) (This)->lpVtbl->GetProcessID(This,id)
#endif
#endif
  HRESULT WINAPI IMtsEvents_get_PackageName_Proxy(IMtsEvents *This,BSTR *pVal);
  void __RPC_STUB IMtsEvents_get_PackageName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMtsEvents_get_PackageGuid_Proxy(IMtsEvents *This,BSTR *pVal);
  void __RPC_STUB IMtsEvents_get_PackageGuid_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMtsEvents_PostEvent_Proxy(IMtsEvents *This,VARIANT *vEvent);
  void __RPC_STUB IMtsEvents_PostEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMtsEvents_get_FireEvents_Proxy(IMtsEvents *This,VARIANT_BOOL *pVal);
  void __RPC_STUB IMtsEvents_get_FireEvents_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMtsEvents_GetProcessID_Proxy(IMtsEvents *This,long *id);
  void __RPC_STUB IMtsEvents_GetProcessID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMtsEventInfo_INTERFACE_DEFINED__
#define __IMtsEventInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IMtsEventInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IMtsEventInfo : public IDispatch {
  public:
    virtual HRESULT WINAPI get_Names(IUnknown **pUnk) = 0;
    virtual HRESULT WINAPI get_DisplayName(BSTR *sDisplayName) = 0;
    virtual HRESULT WINAPI get_EventID(BSTR *sGuidEventID) = 0;
    virtual HRESULT WINAPI get_Count(long *lCount) = 0;
    virtual HRESULT WINAPI get_Value(BSTR sKey,VARIANT *pVal) = 0;
  };
#else
  typedef struct IMtsEventInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IMtsEventInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IMtsEventInfo *This);
      ULONG (WINAPI *Release)(IMtsEventInfo *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IMtsEventInfo *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IMtsEventInfo *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IMtsEventInfo *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IMtsEventInfo *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_Names)(IMtsEventInfo *This,IUnknown **pUnk);
      HRESULT (WINAPI *get_DisplayName)(IMtsEventInfo *This,BSTR *sDisplayName);
      HRESULT (WINAPI *get_EventID)(IMtsEventInfo *This,BSTR *sGuidEventID);
      HRESULT (WINAPI *get_Count)(IMtsEventInfo *This,long *lCount);
      HRESULT (WINAPI *get_Value)(IMtsEventInfo *This,BSTR sKey,VARIANT *pVal);
    END_INTERFACE
  } IMtsEventInfoVtbl;
  interface IMtsEventInfo {
    CONST_VTBL struct IMtsEventInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IMtsEventInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMtsEventInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMtsEventInfo_Release(This) (This)->lpVtbl->Release(This)
#define IMtsEventInfo_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMtsEventInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMtsEventInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMtsEventInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IMtsEventInfo_get_Names(This,pUnk) (This)->lpVtbl->get_Names(This,pUnk)
#define IMtsEventInfo_get_DisplayName(This,sDisplayName) (This)->lpVtbl->get_DisplayName(This,sDisplayName)
#define IMtsEventInfo_get_EventID(This,sGuidEventID) (This)->lpVtbl->get_EventID(This,sGuidEventID)
#define IMtsEventInfo_get_Count(This,lCount) (This)->lpVtbl->get_Count(This,lCount)
#define IMtsEventInfo_get_Value(This,sKey,pVal) (This)->lpVtbl->get_Value(This,sKey,pVal)
#endif
#endif
  HRESULT WINAPI IMtsEventInfo_get_Names_Proxy(IMtsEventInfo *This,IUnknown **pUnk);
  void __RPC_STUB IMtsEventInfo_get_Names_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMtsEventInfo_get_DisplayName_Proxy(IMtsEventInfo *This,BSTR *sDisplayName);
  void __RPC_STUB IMtsEventInfo_get_DisplayName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMtsEventInfo_get_EventID_Proxy(IMtsEventInfo *This,BSTR *sGuidEventID);
  void __RPC_STUB IMtsEventInfo_get_EventID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMtsEventInfo_get_Count_Proxy(IMtsEventInfo *This,long *lCount);
  void __RPC_STUB IMtsEventInfo_get_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMtsEventInfo_get_Value_Proxy(IMtsEventInfo *This,BSTR sKey,VARIANT *pVal);
  void __RPC_STUB IMtsEventInfo_get_Value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMTSLocator_INTERFACE_DEFINED__
#define __IMTSLocator_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IMTSLocator;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IMTSLocator : public IDispatch {
  public:
    virtual HRESULT WINAPI GetEventDispatcher(IUnknown **pUnk) = 0;
  };
#else
  typedef struct IMTSLocatorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IMTSLocator *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IMTSLocator *This);
      ULONG (WINAPI *Release)(IMTSLocator *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IMTSLocator *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IMTSLocator *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IMTSLocator *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IMTSLocator *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *GetEventDispatcher)(IMTSLocator *This,IUnknown **pUnk);
    END_INTERFACE
  } IMTSLocatorVtbl;
  interface IMTSLocator {
    CONST_VTBL struct IMTSLocatorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IMTSLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMTSLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMTSLocator_Release(This) (This)->lpVtbl->Release(This)
#define IMTSLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMTSLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMTSLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMTSLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IMTSLocator_GetEventDispatcher(This,pUnk) (This)->lpVtbl->GetEventDispatcher(This,pUnk)
#endif
#endif
  HRESULT WINAPI IMTSLocator_GetEventDispatcher_Proxy(IMTSLocator *This,IUnknown **pUnk);
  void __RPC_STUB IMTSLocator_GetEventDispatcher_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMtsGrp_INTERFACE_DEFINED__
#define __IMtsGrp_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IMtsGrp;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IMtsGrp : public IDispatch {
  public:
    virtual HRESULT WINAPI get_Count(long *pVal) = 0;
    virtual HRESULT WINAPI Item(long lIndex,IUnknown **ppUnkDispatcher) = 0;
    virtual HRESULT WINAPI Refresh(void) = 0;
  };
#else
  typedef struct IMtsGrpVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IMtsGrp *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IMtsGrp *This);
      ULONG (WINAPI *Release)(IMtsGrp *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IMtsGrp *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IMtsGrp *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IMtsGrp *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IMtsGrp *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_Count)(IMtsGrp *This,long *pVal);
      HRESULT (WINAPI *Item)(IMtsGrp *This,long lIndex,IUnknown **ppUnkDispatcher);
      HRESULT (WINAPI *Refresh)(IMtsGrp *This);
    END_INTERFACE
  } IMtsGrpVtbl;
  interface IMtsGrp {
    CONST_VTBL struct IMtsGrpVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IMtsGrp_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMtsGrp_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMtsGrp_Release(This) (This)->lpVtbl->Release(This)
#define IMtsGrp_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMtsGrp_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMtsGrp_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMtsGrp_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IMtsGrp_get_Count(This,pVal) (This)->lpVtbl->get_Count(This,pVal)
#define IMtsGrp_Item(This,lIndex,ppUnkDispatcher) (This)->lpVtbl->Item(This,lIndex,ppUnkDispatcher)
#define IMtsGrp_Refresh(This) (This)->lpVtbl->Refresh(This)
#endif
#endif
  HRESULT WINAPI IMtsGrp_get_Count_Proxy(IMtsGrp *This,long *pVal);
  void __RPC_STUB IMtsGrp_get_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMtsGrp_Item_Proxy(IMtsGrp *This,long lIndex,IUnknown **ppUnkDispatcher);
  void __RPC_STUB IMtsGrp_Item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMtsGrp_Refresh_Proxy(IMtsGrp *This);
  void __RPC_STUB IMtsGrp_Refresh_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMessageMover_INTERFACE_DEFINED__
#define __IMessageMover_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IMessageMover;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IMessageMover : public IDispatch {
  public:
    virtual HRESULT WINAPI get_SourcePath(BSTR *pVal) = 0;
    virtual HRESULT WINAPI put_SourcePath(BSTR newVal) = 0;
    virtual HRESULT WINAPI get_DestPath(BSTR *pVal) = 0;
    virtual HRESULT WINAPI put_DestPath(BSTR newVal) = 0;
    virtual HRESULT WINAPI get_CommitBatchSize(long *pVal) = 0;
    virtual HRESULT WINAPI put_CommitBatchSize(long newVal) = 0;
    virtual HRESULT WINAPI MoveMessages(long *plMessagesMoved) = 0;
  };
#else
  typedef struct IMessageMoverVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IMessageMover *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IMessageMover *This);
      ULONG (WINAPI *Release)(IMessageMover *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IMessageMover *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IMessageMover *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IMessageMover *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IMessageMover *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_SourcePath)(IMessageMover *This,BSTR *pVal);
      HRESULT (WINAPI *put_SourcePath)(IMessageMover *This,BSTR newVal);
      HRESULT (WINAPI *get_DestPath)(IMessageMover *This,BSTR *pVal);
      HRESULT (WINAPI *put_DestPath)(IMessageMover *This,BSTR newVal);
      HRESULT (WINAPI *get_CommitBatchSize)(IMessageMover *This,long *pVal);
      HRESULT (WINAPI *put_CommitBatchSize)(IMessageMover *This,long newVal);
      HRESULT (WINAPI *MoveMessages)(IMessageMover *This,long *plMessagesMoved);
    END_INTERFACE
  } IMessageMoverVtbl;
  interface IMessageMover {
    CONST_VTBL struct IMessageMoverVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IMessageMover_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMessageMover_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMessageMover_Release(This) (This)->lpVtbl->Release(This)
#define IMessageMover_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMessageMover_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMessageMover_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMessageMover_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IMessageMover_get_SourcePath(This,pVal) (This)->lpVtbl->get_SourcePath(This,pVal)
#define IMessageMover_put_SourcePath(This,newVal) (This)->lpVtbl->put_SourcePath(This,newVal)
#define IMessageMover_get_DestPath(This,pVal) (This)->lpVtbl->get_DestPath(This,pVal)
#define IMessageMover_put_DestPath(This,newVal) (This)->lpVtbl->put_DestPath(This,newVal)
#define IMessageMover_get_CommitBatchSize(This,pVal) (This)->lpVtbl->get_CommitBatchSize(This,pVal)
#define IMessageMover_put_CommitBatchSize(This,newVal) (This)->lpVtbl->put_CommitBatchSize(This,newVal)
#define IMessageMover_MoveMessages(This,plMessagesMoved) (This)->lpVtbl->MoveMessages(This,plMessagesMoved)
#endif
#endif
  HRESULT WINAPI IMessageMover_get_SourcePath_Proxy(IMessageMover *This,BSTR *pVal);
  void __RPC_STUB IMessageMover_get_SourcePath_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMessageMover_put_SourcePath_Proxy(IMessageMover *This,BSTR newVal);
  void __RPC_STUB IMessageMover_put_SourcePath_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMessageMover_get_DestPath_Proxy(IMessageMover *This,BSTR *pVal);
  void __RPC_STUB IMessageMover_get_DestPath_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMessageMover_put_DestPath_Proxy(IMessageMover *This,BSTR newVal);
  void __RPC_STUB IMessageMover_put_DestPath_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMessageMover_get_CommitBatchSize_Proxy(IMessageMover *This,long *pVal);
  void __RPC_STUB IMessageMover_get_CommitBatchSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMessageMover_put_CommitBatchSize_Proxy(IMessageMover *This,long newVal);
  void __RPC_STUB IMessageMover_put_CommitBatchSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMessageMover_MoveMessages_Proxy(IMessageMover *This,long *plMessagesMoved);
  void __RPC_STUB IMessageMover_MoveMessages_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEventServerTrace_INTERFACE_DEFINED__
#define __IEventServerTrace_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEventServerTrace;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEventServerTrace : public IDispatch {
  public:
    virtual HRESULT WINAPI StartTraceGuid(BSTR bstrguidEvent,BSTR bstrguidFilter,LONG lPidFilter) = 0;
    virtual HRESULT WINAPI StopTraceGuid(BSTR bstrguidEvent,BSTR bstrguidFilter,LONG lPidFilter) = 0;
    virtual HRESULT WINAPI EnumTraceGuid(LONG *plCntGuids,BSTR *pbstrGuidList) = 0;
  };
#else
  typedef struct IEventServerTraceVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEventServerTrace *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEventServerTrace *This);
      ULONG (WINAPI *Release)(IEventServerTrace *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IEventServerTrace *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IEventServerTrace *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IEventServerTrace *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IEventServerTrace *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *StartTraceGuid)(IEventServerTrace *This,BSTR bstrguidEvent,BSTR bstrguidFilter,LONG lPidFilter);
      HRESULT (WINAPI *StopTraceGuid)(IEventServerTrace *This,BSTR bstrguidEvent,BSTR bstrguidFilter,LONG lPidFilter);
      HRESULT (WINAPI *EnumTraceGuid)(IEventServerTrace *This,LONG *plCntGuids,BSTR *pbstrGuidList);
    END_INTERFACE
  } IEventServerTraceVtbl;
  interface IEventServerTrace {
    CONST_VTBL struct IEventServerTraceVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEventServerTrace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEventServerTrace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEventServerTrace_Release(This) (This)->lpVtbl->Release(This)
#define IEventServerTrace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IEventServerTrace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IEventServerTrace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IEventServerTrace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IEventServerTrace_StartTraceGuid(This,bstrguidEvent,bstrguidFilter,lPidFilter) (This)->lpVtbl->StartTraceGuid(This,bstrguidEvent,bstrguidFilter,lPidFilter)
#define IEventServerTrace_StopTraceGuid(This,bstrguidEvent,bstrguidFilter,lPidFilter) (This)->lpVtbl->StopTraceGuid(This,bstrguidEvent,bstrguidFilter,lPidFilter)
#define IEventServerTrace_EnumTraceGuid(This,plCntGuids,pbstrGuidList) (This)->lpVtbl->EnumTraceGuid(This,plCntGuids,pbstrGuidList)
#endif
#endif
  HRESULT WINAPI IEventServerTrace_StartTraceGuid_Proxy(IEventServerTrace *This,BSTR bstrguidEvent,BSTR bstrguidFilter,LONG lPidFilter);
  void __RPC_STUB IEventServerTrace_StartTraceGuid_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventServerTrace_StopTraceGuid_Proxy(IEventServerTrace *This,BSTR bstrguidEvent,BSTR bstrguidFilter,LONG lPidFilter);
  void __RPC_STUB IEventServerTrace_StopTraceGuid_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEventServerTrace_EnumTraceGuid_Proxy(IEventServerTrace *This,LONG *plCntGuids,BSTR *pbstrGuidList);
  void __RPC_STUB IEventServerTrace_EnumTraceGuid_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  typedef struct _RECYCLE_INFO {
    GUID guidCombaseProcessIdentifier;
    LONGLONG ProcessStartTime;
    DWORD dwRecycleLifetimeLimit;
    DWORD dwRecycleMemoryLimit;
    DWORD dwRecycleExpirationTimeout;
  } RECYCLE_INFO;

  typedef enum tagCOMPLUS_APPTYPE {
    APPTYPE_UNKNOWN = 0xffffffff,APPTYPE_SERVER = 1,APPTYPE_LIBRARY = 0,APPTYPE_SWC = 2
  } COMPLUS_APPTYPE;

#define TRACKER_STARTSTOP_EVENT L"Global\\COM+ Tracker Push Event"
#define TRACKER_INIT_EVENT L"Global\\COM+ Tracker Init Event"

#ifndef GUID_STRING_SIZE
#define GUID_STRING_SIZE 40
#endif
  typedef struct CAppStatistics {
    DWORD m_cTotalCalls;
    DWORD m_cTotalInstances;
    DWORD m_cTotalClasses;
    DWORD m_cCallsPerSecond;
  } APPSTATISTICS;

  typedef struct CAppData {
    DWORD m_idApp;
    WCHAR m_szAppGuid[40];
    DWORD m_dwAppProcessId;
    APPSTATISTICS m_AppStatistics;
  } APPDATA;

  typedef struct CCLSIDData {
    CLSID m_clsid;
    DWORD m_cReferences;
    DWORD m_cBound;
    DWORD m_cPooled;
    DWORD m_cInCall;
    DWORD m_dwRespTime;
    DWORD m_cCallsCompleted;
    DWORD m_cCallsFailed;
  } CLSIDDATA;

  typedef struct CCLSIDData2 {
    CLSID m_clsid;
    GUID m_appid;
    GUID m_partid;
    WCHAR *m_pwszAppName;
    WCHAR *m_pwszCtxName;
    COMPLUS_APPTYPE m_eAppType;
    DWORD m_cReferences;
    DWORD m_cBound;
    DWORD m_cPooled;
    DWORD m_cInCall;
    DWORD m_dwRespTime;
    DWORD m_cCallsCompleted;
    DWORD m_cCallsFailed;
  } CLSIDDATA2;

  typedef DWORD_PTR RESTYPID;
  typedef DWORD_PTR RESID;
  typedef LPOLESTR SRESID;
  typedef LPCOLESTR constSRESID;
  typedef DWORD RESOURCERATING;
  typedef long TIMEINSECS;
  typedef DWORD_PTR INSTID;
  typedef DWORD_PTR TRANSID;

#define MTXDM_E_ENLISTRESOURCEFAILED 0x8004E100

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0342_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0342_v0_0_s_ifspec;

#ifndef __IDispenserManager_INTERFACE_DEFINED__
#define __IDispenserManager_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IDispenserManager;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IDispenserManager : public IUnknown {
  public:
    virtual HRESULT WINAPI RegisterDispenser(IDispenserDriver *__MIDL_0014,LPCOLESTR szDispenserName,IHolder **__MIDL_0015) = 0;
    virtual HRESULT WINAPI GetContext(INSTID *__MIDL_0016,TRANSID *__MIDL_0017) = 0;
  };
#else
  typedef struct IDispenserManagerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IDispenserManager *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IDispenserManager *This);
      ULONG (WINAPI *Release)(IDispenserManager *This);
      HRESULT (WINAPI *RegisterDispenser)(IDispenserManager *This,IDispenserDriver *__MIDL_0014,LPCOLESTR szDispenserName,IHolder **__MIDL_0015);
      HRESULT (WINAPI *GetContext)(IDispenserManager *This,INSTID *__MIDL_0016,TRANSID *__MIDL_0017);
    END_INTERFACE
  } IDispenserManagerVtbl;
  interface IDispenserManager {
    CONST_VTBL struct IDispenserManagerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IDispenserManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDispenserManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDispenserManager_Release(This) (This)->lpVtbl->Release(This)
#define IDispenserManager_RegisterDispenser(This,__MIDL_0014,szDispenserName,__MIDL_0015) (This)->lpVtbl->RegisterDispenser(This,__MIDL_0014,szDispenserName,__MIDL_0015)
#define IDispenserManager_GetContext(This,__MIDL_0016,__MIDL_0017) (This)->lpVtbl->GetContext(This,__MIDL_0016,__MIDL_0017)
#endif
#endif
  HRESULT WINAPI IDispenserManager_RegisterDispenser_Proxy(IDispenserManager *This,IDispenserDriver *__MIDL_0014,LPCOLESTR szDispenserName,IHolder **__MIDL_0015);
  void __RPC_STUB IDispenserManager_RegisterDispenser_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IDispenserManager_GetContext_Proxy(IDispenserManager *This,INSTID *__MIDL_0016,TRANSID *__MIDL_0017);
  void __RPC_STUB IDispenserManager_GetContext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0347_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0347_v0_0_s_ifspec;

#ifndef __IHolder_INTERFACE_DEFINED__
#define __IHolder_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHolder;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHolder : public IUnknown {
  public:
    virtual HRESULT WINAPI AllocResource(const RESTYPID __MIDL_0018,RESID *__MIDL_0019) = 0;
    virtual HRESULT WINAPI FreeResource(const RESID __MIDL_0020) = 0;
    virtual HRESULT WINAPI TrackResource(const RESID __MIDL_0021) = 0;
    virtual HRESULT WINAPI TrackResourceS(constSRESID __MIDL_0022) = 0;
    virtual HRESULT WINAPI UntrackResource(const RESID __MIDL_0023,const WINBOOL __MIDL_0024) = 0;
    virtual HRESULT WINAPI UntrackResourceS(constSRESID __MIDL_0025,const WINBOOL __MIDL_0026) = 0;
    virtual HRESULT WINAPI Close(void) = 0;
    virtual HRESULT WINAPI RequestDestroyResource(const RESID __MIDL_0027) = 0;
  };
#else
  typedef struct IHolderVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHolder *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHolder *This);
      ULONG (WINAPI *Release)(IHolder *This);
      HRESULT (WINAPI *AllocResource)(IHolder *This,const RESTYPID __MIDL_0018,RESID *__MIDL_0019);
      HRESULT (WINAPI *FreeResource)(IHolder *This,const RESID __MIDL_0020);
      HRESULT (WINAPI *TrackResource)(IHolder *This,const RESID __MIDL_0021);
      HRESULT (WINAPI *TrackResourceS)(IHolder *This,constSRESID __MIDL_0022);
      HRESULT (WINAPI *UntrackResource)(IHolder *This,const RESID __MIDL_0023,const WINBOOL __MIDL_0024);
      HRESULT (WINAPI *UntrackResourceS)(IHolder *This,constSRESID __MIDL_0025,const WINBOOL __MIDL_0026);
      HRESULT (WINAPI *Close)(IHolder *This);
      HRESULT (WINAPI *RequestDestroyResource)(IHolder *This,const RESID __MIDL_0027);
    END_INTERFACE
  } IHolderVtbl;
  interface IHolder {
    CONST_VTBL struct IHolderVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IHolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHolder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHolder_Release(This) (This)->lpVtbl->Release(This)
#define IHolder_AllocResource(This,__MIDL_0018,__MIDL_0019) (This)->lpVtbl->AllocResource(This,__MIDL_0018,__MIDL_0019)
#define IHolder_FreeResource(This,__MIDL_0020) (This)->lpVtbl->FreeResource(This,__MIDL_0020)
#define IHolder_TrackResource(This,__MIDL_0021) (This)->lpVtbl->TrackResource(This,__MIDL_0021)
#define IHolder_TrackResourceS(This,__MIDL_0022) (This)->lpVtbl->TrackResourceS(This,__MIDL_0022)
#define IHolder_UntrackResource(This,__MIDL_0023,__MIDL_0024) (This)->lpVtbl->UntrackResource(This,__MIDL_0023,__MIDL_0024)
#define IHolder_UntrackResourceS(This,__MIDL_0025,__MIDL_0026) (This)->lpVtbl->UntrackResourceS(This,__MIDL_0025,__MIDL_0026)
#define IHolder_Close(This) (This)->lpVtbl->Close(This)
#define IHolder_RequestDestroyResource(This,__MIDL_0027) (This)->lpVtbl->RequestDestroyResource(This,__MIDL_0027)
#endif
#endif
  HRESULT WINAPI IHolder_AllocResource_Proxy(IHolder *This,const RESTYPID __MIDL_0018,RESID *__MIDL_0019);
  void __RPC_STUB IHolder_AllocResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHolder_FreeResource_Proxy(IHolder *This,const RESID __MIDL_0020);
  void __RPC_STUB IHolder_FreeResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHolder_TrackResource_Proxy(IHolder *This,const RESID __MIDL_0021);
  void __RPC_STUB IHolder_TrackResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHolder_TrackResourceS_Proxy(IHolder *This,constSRESID __MIDL_0022);
  void __RPC_STUB IHolder_TrackResourceS_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHolder_UntrackResource_Proxy(IHolder *This,const RESID __MIDL_0023,const WINBOOL __MIDL_0024);
  void __RPC_STUB IHolder_UntrackResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHolder_UntrackResourceS_Proxy(IHolder *This,constSRESID __MIDL_0025,const WINBOOL __MIDL_0026);
  void __RPC_STUB IHolder_UntrackResourceS_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHolder_Close_Proxy(IHolder *This);
  void __RPC_STUB IHolder_Close_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHolder_RequestDestroyResource_Proxy(IHolder *This,const RESID __MIDL_0027);
  void __RPC_STUB IHolder_RequestDestroyResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0348_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0348_v0_0_s_ifspec;

#ifndef __IDispenserDriver_INTERFACE_DEFINED__
#define __IDispenserDriver_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IDispenserDriver;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IDispenserDriver : public IUnknown {
  public:
    virtual HRESULT WINAPI CreateResource(const RESTYPID ResTypId,RESID *pResId,TIMEINSECS *pSecsFreeBeforeDestroy) = 0;
    virtual HRESULT WINAPI RateResource(const RESTYPID ResTypId,const RESID ResId,const WINBOOL fRequiresTransactionEnlistment,RESOURCERATING *pRating) = 0;
    virtual HRESULT WINAPI EnlistResource(const RESID ResId,const TRANSID TransId) = 0;
    virtual HRESULT WINAPI ResetResource(const RESID ResId) = 0;
    virtual HRESULT WINAPI DestroyResource(const RESID ResId) = 0;
    virtual HRESULT WINAPI DestroyResourceS(constSRESID ResId) = 0;
  };
#else
  typedef struct IDispenserDriverVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IDispenserDriver *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IDispenserDriver *This);
      ULONG (WINAPI *Release)(IDispenserDriver *This);
      HRESULT (WINAPI *CreateResource)(IDispenserDriver *This,const RESTYPID ResTypId,RESID *pResId,TIMEINSECS *pSecsFreeBeforeDestroy);
      HRESULT (WINAPI *RateResource)(IDispenserDriver *This,const RESTYPID ResTypId,const RESID ResId,const WINBOOL fRequiresTransactionEnlistment,RESOURCERATING *pRating);
      HRESULT (WINAPI *EnlistResource)(IDispenserDriver *This,const RESID ResId,const TRANSID TransId);
      HRESULT (WINAPI *ResetResource)(IDispenserDriver *This,const RESID ResId);
      HRESULT (WINAPI *DestroyResource)(IDispenserDriver *This,const RESID ResId);
      HRESULT (WINAPI *DestroyResourceS)(IDispenserDriver *This,constSRESID ResId);
    END_INTERFACE
  } IDispenserDriverVtbl;
  interface IDispenserDriver {
    CONST_VTBL struct IDispenserDriverVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IDispenserDriver_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDispenserDriver_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDispenserDriver_Release(This) (This)->lpVtbl->Release(This)
#define IDispenserDriver_CreateResource(This,ResTypId,pResId,pSecsFreeBeforeDestroy) (This)->lpVtbl->CreateResource(This,ResTypId,pResId,pSecsFreeBeforeDestroy)
#define IDispenserDriver_RateResource(This,ResTypId,ResId,fRequiresTransactionEnlistment,pRating) (This)->lpVtbl->RateResource(This,ResTypId,ResId,fRequiresTransactionEnlistment,pRating)
#define IDispenserDriver_EnlistResource(This,ResId,TransId) (This)->lpVtbl->EnlistResource(This,ResId,TransId)
#define IDispenserDriver_ResetResource(This,ResId) (This)->lpVtbl->ResetResource(This,ResId)
#define IDispenserDriver_DestroyResource(This,ResId) (This)->lpVtbl->DestroyResource(This,ResId)
#define IDispenserDriver_DestroyResourceS(This,ResId) (This)->lpVtbl->DestroyResourceS(This,ResId)
#endif
#endif
  HRESULT WINAPI IDispenserDriver_CreateResource_Proxy(IDispenserDriver *This,const RESTYPID ResTypId,RESID *pResId,TIMEINSECS *pSecsFreeBeforeDestroy);
  void __RPC_STUB IDispenserDriver_CreateResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IDispenserDriver_RateResource_Proxy(IDispenserDriver *This,const RESTYPID ResTypId,const RESID ResId,const WINBOOL fRequiresTransactionEnlistment,RESOURCERATING *pRating);
  void __RPC_STUB IDispenserDriver_RateResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IDispenserDriver_EnlistResource_Proxy(IDispenserDriver *This,const RESID ResId,const TRANSID TransId);
  void __RPC_STUB IDispenserDriver_EnlistResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IDispenserDriver_ResetResource_Proxy(IDispenserDriver *This,const RESID ResId);
  void __RPC_STUB IDispenserDriver_ResetResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IDispenserDriver_DestroyResource_Proxy(IDispenserDriver *This,const RESID ResId);
  void __RPC_STUB IDispenserDriver_DestroyResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IDispenserDriver_DestroyResourceS_Proxy(IDispenserDriver *This,constSRESID ResId);
  void __RPC_STUB IDispenserDriver_DestroyResourceS_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifdef USE_UUIDOF_FOR_IID_
#define IID_IHolder __uuidof(IIHolder)
#define IID_IDispenserManager __uuidof(IDispenserManager)
#define IID_IDispenserDriver __uuidof(IDispenserDriver)
#endif

#define CRR_NO_REASON_SUPPLIED 0x00000000
#define CRR_LIFETIME_LIMIT 0xFFFFFFFF
#define CRR_ACTIVATION_LIMIT 0xFFFFFFFE
#define CRR_CALL_LIMIT 0xFFFFFFFD
#define CRR_MEMORY_LIMIT 0xFFFFFFFC
#define CRR_RECYCLED_FROM_UI 0xFFFFFFFB

  EXTERN_C const CLSID CLSID_MTSPackage;
  EXTERN_C const GUID GUID_DefaultAppPartition;
  EXTERN_C const GUID GUID_FinalizerCID;
  EXTERN_C const GUID IID_IEnterActivityWithNoLock;

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0349_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0349_v0_0_s_ifspec;

#ifndef __IObjectContext_INTERFACE_DEFINED__
#define __IObjectContext_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IObjectContext;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IObjectContext : public IUnknown {
  public:
    virtual HRESULT WINAPI CreateInstance(REFCLSID rclsid,REFIID riid,LPVOID *ppv) = 0;
    virtual HRESULT WINAPI SetComplete(void) = 0;
    virtual HRESULT WINAPI SetAbort(void) = 0;
    virtual HRESULT WINAPI EnableCommit(void) = 0;
    virtual HRESULT WINAPI DisableCommit(void) = 0;
    virtual WINBOOL WINAPI IsInTransaction(void) = 0;
    virtual WINBOOL WINAPI IsSecurityEnabled(void) = 0;
    virtual HRESULT WINAPI IsCallerInRole(BSTR bstrRole,WINBOOL *pfIsInRole) = 0;
  };
#else
  typedef struct IObjectContextVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IObjectContext *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IObjectContext *This);
      ULONG (WINAPI *Release)(IObjectContext *This);
      HRESULT (WINAPI *CreateInstance)(IObjectContext *This,REFCLSID rclsid,REFIID riid,LPVOID *ppv);
      HRESULT (WINAPI *SetComplete)(IObjectContext *This);
      HRESULT (WINAPI *SetAbort)(IObjectContext *This);
      HRESULT (WINAPI *EnableCommit)(IObjectContext *This);
      HRESULT (WINAPI *DisableCommit)(IObjectContext *This);
      WINBOOL (WINAPI *IsInTransaction)(IObjectContext *This);
      WINBOOL (WINAPI *IsSecurityEnabled)(IObjectContext *This);
      HRESULT (WINAPI *IsCallerInRole)(IObjectContext *This,BSTR bstrRole,WINBOOL *pfIsInRole);
    END_INTERFACE
  } IObjectContextVtbl;
  interface IObjectContext {
    CONST_VTBL struct IObjectContextVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IObjectContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectContext_Release(This) (This)->lpVtbl->Release(This)
#define IObjectContext_CreateInstance(This,rclsid,riid,ppv) (This)->lpVtbl->CreateInstance(This,rclsid,riid,ppv)
#define IObjectContext_SetComplete(This) (This)->lpVtbl->SetComplete(This)
#define IObjectContext_SetAbort(This) (This)->lpVtbl->SetAbort(This)
#define IObjectContext_EnableCommit(This) (This)->lpVtbl->EnableCommit(This)
#define IObjectContext_DisableCommit(This) (This)->lpVtbl->DisableCommit(This)
#define IObjectContext_IsInTransaction(This) (This)->lpVtbl->IsInTransaction(This)
#define IObjectContext_IsSecurityEnabled(This) (This)->lpVtbl->IsSecurityEnabled(This)
#define IObjectContext_IsCallerInRole(This,bstrRole,pfIsInRole) (This)->lpVtbl->IsCallerInRole(This,bstrRole,pfIsInRole)
#endif
#endif
  HRESULT WINAPI IObjectContext_CreateInstance_Proxy(IObjectContext *This,REFCLSID rclsid,REFIID riid,LPVOID *ppv);
  void __RPC_STUB IObjectContext_CreateInstance_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IObjectContext_SetComplete_Proxy(IObjectContext *This);
  void __RPC_STUB IObjectContext_SetComplete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IObjectContext_SetAbort_Proxy(IObjectContext *This);
  void __RPC_STUB IObjectContext_SetAbort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IObjectContext_EnableCommit_Proxy(IObjectContext *This);
  void __RPC_STUB IObjectContext_EnableCommit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IObjectContext_DisableCommit_Proxy(IObjectContext *This);
  void __RPC_STUB IObjectContext_DisableCommit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  WINBOOL WINAPI IObjectContext_IsInTransaction_Proxy(IObjectContext *This);
  void __RPC_STUB IObjectContext_IsInTransaction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  WINBOOL WINAPI IObjectContext_IsSecurityEnabled_Proxy(IObjectContext *This);
  void __RPC_STUB IObjectContext_IsSecurityEnabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IObjectContext_IsCallerInRole_Proxy(IObjectContext *This,BSTR bstrRole,WINBOOL *pfIsInRole);
  void __RPC_STUB IObjectContext_IsCallerInRole_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IObjectControl_INTERFACE_DEFINED__
#define __IObjectControl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IObjectControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IObjectControl : public IUnknown {
  public:
    virtual HRESULT WINAPI Activate(void) = 0;
    virtual void WINAPI Deactivate(void) = 0;
    virtual WINBOOL WINAPI CanBePooled(void) = 0;
  };
#else
  typedef struct IObjectControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IObjectControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IObjectControl *This);
      ULONG (WINAPI *Release)(IObjectControl *This);
      HRESULT (WINAPI *Activate)(IObjectControl *This);
      void (WINAPI *Deactivate)(IObjectControl *This);
      WINBOOL (WINAPI *CanBePooled)(IObjectControl *This);
    END_INTERFACE
  } IObjectControlVtbl;
  interface IObjectControl {
    CONST_VTBL struct IObjectControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IObjectControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectControl_Release(This) (This)->lpVtbl->Release(This)
#define IObjectControl_Activate(This) (This)->lpVtbl->Activate(This)
#define IObjectControl_Deactivate(This) (This)->lpVtbl->Deactivate(This)
#define IObjectControl_CanBePooled(This) (This)->lpVtbl->CanBePooled(This)
#endif
#endif
  HRESULT WINAPI IObjectControl_Activate_Proxy(IObjectControl *This);
  void __RPC_STUB IObjectControl_Activate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI IObjectControl_Deactivate_Proxy(IObjectControl *This);
  void __RPC_STUB IObjectControl_Deactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  WINBOOL WINAPI IObjectControl_CanBePooled_Proxy(IObjectControl *This);
  void __RPC_STUB IObjectControl_CanBePooled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEnumNames_INTERFACE_DEFINED__
#define __IEnumNames_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEnumNames;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEnumNames : public IUnknown {
  public:
    virtual HRESULT WINAPI Next(unsigned long celt,BSTR *rgname,unsigned long *pceltFetched) = 0;
    virtual HRESULT WINAPI Skip(unsigned long celt) = 0;
    virtual HRESULT WINAPI Reset(void) = 0;
    virtual HRESULT WINAPI Clone(IEnumNames **ppenum) = 0;
  };
#else
  typedef struct IEnumNamesVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEnumNames *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEnumNames *This);
      ULONG (WINAPI *Release)(IEnumNames *This);
      HRESULT (WINAPI *Next)(IEnumNames *This,unsigned long celt,BSTR *rgname,unsigned long *pceltFetched);
      HRESULT (WINAPI *Skip)(IEnumNames *This,unsigned long celt);
      HRESULT (WINAPI *Reset)(IEnumNames *This);
      HRESULT (WINAPI *Clone)(IEnumNames *This,IEnumNames **ppenum);
    END_INTERFACE
  } IEnumNamesVtbl;
  interface IEnumNames {
    CONST_VTBL struct IEnumNamesVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEnumNames_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumNames_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumNames_Release(This) (This)->lpVtbl->Release(This)
#define IEnumNames_Next(This,celt,rgname,pceltFetched) (This)->lpVtbl->Next(This,celt,rgname,pceltFetched)
#define IEnumNames_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumNames_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumNames_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
#endif
#endif
  HRESULT WINAPI IEnumNames_Next_Proxy(IEnumNames *This,unsigned long celt,BSTR *rgname,unsigned long *pceltFetched);
  void __RPC_STUB IEnumNames_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumNames_Skip_Proxy(IEnumNames *This,unsigned long celt);
  void __RPC_STUB IEnumNames_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumNames_Reset_Proxy(IEnumNames *This);
  void __RPC_STUB IEnumNames_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumNames_Clone_Proxy(IEnumNames *This,IEnumNames **ppenum);
  void __RPC_STUB IEnumNames_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISecurityProperty_INTERFACE_DEFINED__
#define __ISecurityProperty_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISecurityProperty;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISecurityProperty : public IUnknown {
  public:
    virtual HRESULT WINAPI GetDirectCreatorSID(PSID *pSID) = 0;
    virtual HRESULT WINAPI GetOriginalCreatorSID(PSID *pSID) = 0;
    virtual HRESULT WINAPI GetDirectCallerSID(PSID *pSID) = 0;
    virtual HRESULT WINAPI GetOriginalCallerSID(PSID *pSID) = 0;
    virtual HRESULT WINAPI ReleaseSID(PSID pSID) = 0;
  };
#else
  typedef struct ISecurityPropertyVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISecurityProperty *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISecurityProperty *This);
      ULONG (WINAPI *Release)(ISecurityProperty *This);
      HRESULT (WINAPI *GetDirectCreatorSID)(ISecurityProperty *This,PSID *pSID);
      HRESULT (WINAPI *GetOriginalCreatorSID)(ISecurityProperty *This,PSID *pSID);
      HRESULT (WINAPI *GetDirectCallerSID)(ISecurityProperty *This,PSID *pSID);
      HRESULT (WINAPI *GetOriginalCallerSID)(ISecurityProperty *This,PSID *pSID);
      HRESULT (WINAPI *ReleaseSID)(ISecurityProperty *This,PSID pSID);
    END_INTERFACE
  } ISecurityPropertyVtbl;
  interface ISecurityProperty {
    CONST_VTBL struct ISecurityPropertyVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISecurityProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISecurityProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISecurityProperty_Release(This) (This)->lpVtbl->Release(This)
#define ISecurityProperty_GetDirectCreatorSID(This,pSID) (This)->lpVtbl->GetDirectCreatorSID(This,pSID)
#define ISecurityProperty_GetOriginalCreatorSID(This,pSID) (This)->lpVtbl->GetOriginalCreatorSID(This,pSID)
#define ISecurityProperty_GetDirectCallerSID(This,pSID) (This)->lpVtbl->GetDirectCallerSID(This,pSID)
#define ISecurityProperty_GetOriginalCallerSID(This,pSID) (This)->lpVtbl->GetOriginalCallerSID(This,pSID)
#define ISecurityProperty_ReleaseSID(This,pSID) (This)->lpVtbl->ReleaseSID(This,pSID)
#endif
#endif
  HRESULT WINAPI ISecurityProperty_GetDirectCreatorSID_Proxy(ISecurityProperty *This,PSID *pSID);
  void __RPC_STUB ISecurityProperty_GetDirectCreatorSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityProperty_GetOriginalCreatorSID_Proxy(ISecurityProperty *This,PSID *pSID);
  void __RPC_STUB ISecurityProperty_GetOriginalCreatorSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityProperty_GetDirectCallerSID_Proxy(ISecurityProperty *This,PSID *pSID);
  void __RPC_STUB ISecurityProperty_GetDirectCallerSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityProperty_GetOriginalCallerSID_Proxy(ISecurityProperty *This,PSID *pSID);
  void __RPC_STUB ISecurityProperty_GetOriginalCallerSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISecurityProperty_ReleaseSID_Proxy(ISecurityProperty *This,PSID pSID);
  void __RPC_STUB ISecurityProperty_ReleaseSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ObjectControl_INTERFACE_DEFINED__
#define __ObjectControl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ObjectControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ObjectControl : public IUnknown {
  public:
    virtual HRESULT WINAPI Activate(void) = 0;
    virtual HRESULT WINAPI Deactivate(void) = 0;
    virtual HRESULT WINAPI CanBePooled(VARIANT_BOOL *pbPoolable) = 0;
  };
#else
  typedef struct ObjectControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ObjectControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ObjectControl *This);
      ULONG (WINAPI *Release)(ObjectControl *This);
      HRESULT (WINAPI *Activate)(ObjectControl *This);
      HRESULT (WINAPI *Deactivate)(ObjectControl *This);
      HRESULT (WINAPI *CanBePooled)(ObjectControl *This,VARIANT_BOOL *pbPoolable);
    END_INTERFACE
  } ObjectControlVtbl;
  interface ObjectControl {
    CONST_VTBL struct ObjectControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ObjectControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ObjectControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ObjectControl_Release(This) (This)->lpVtbl->Release(This)
#define ObjectControl_Activate(This) (This)->lpVtbl->Activate(This)
#define ObjectControl_Deactivate(This) (This)->lpVtbl->Deactivate(This)
#define ObjectControl_CanBePooled(This,pbPoolable) (This)->lpVtbl->CanBePooled(This,pbPoolable)
#endif
#endif
  HRESULT WINAPI ObjectControl_Activate_Proxy(ObjectControl *This);
  void __RPC_STUB ObjectControl_Activate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectControl_Deactivate_Proxy(ObjectControl *This);
  void __RPC_STUB ObjectControl_Deactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ObjectControl_CanBePooled_Proxy(ObjectControl *This,VARIANT_BOOL *pbPoolable);
  void __RPC_STUB ObjectControl_CanBePooled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISharedProperty_INTERFACE_DEFINED__
#define __ISharedProperty_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISharedProperty;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISharedProperty : public IDispatch {
  public:
    virtual HRESULT WINAPI get_Value(VARIANT *pVal) = 0;
    virtual HRESULT WINAPI put_Value(VARIANT val) = 0;
  };
#else
  typedef struct ISharedPropertyVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISharedProperty *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISharedProperty *This);
      ULONG (WINAPI *Release)(ISharedProperty *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ISharedProperty *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ISharedProperty *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ISharedProperty *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ISharedProperty *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_Value)(ISharedProperty *This,VARIANT *pVal);
      HRESULT (WINAPI *put_Value)(ISharedProperty *This,VARIANT val);
    END_INTERFACE
  } ISharedPropertyVtbl;
  interface ISharedProperty {
    CONST_VTBL struct ISharedPropertyVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISharedProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISharedProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISharedProperty_Release(This) (This)->lpVtbl->Release(This)
#define ISharedProperty_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISharedProperty_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISharedProperty_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISharedProperty_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ISharedProperty_get_Value(This,pVal) (This)->lpVtbl->get_Value(This,pVal)
#define ISharedProperty_put_Value(This,val) (This)->lpVtbl->put_Value(This,val)
#endif
#endif
  HRESULT WINAPI ISharedProperty_get_Value_Proxy(ISharedProperty *This,VARIANT *pVal);
  void __RPC_STUB ISharedProperty_get_Value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISharedProperty_put_Value_Proxy(ISharedProperty *This,VARIANT val);
  void __RPC_STUB ISharedProperty_put_Value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISharedPropertyGroup_INTERFACE_DEFINED__
#define __ISharedPropertyGroup_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISharedPropertyGroup;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISharedPropertyGroup : public IDispatch {
  public:
    virtual HRESULT WINAPI CreatePropertyByPosition(int Index,VARIANT_BOOL *fExists,ISharedProperty **ppProp) = 0;
    virtual HRESULT WINAPI get_PropertyByPosition(int Index,ISharedProperty **ppProperty) = 0;
    virtual HRESULT WINAPI CreateProperty(BSTR Name,VARIANT_BOOL *fExists,ISharedProperty **ppProp) = 0;
    virtual HRESULT WINAPI get_Property(BSTR Name,ISharedProperty **ppProperty) = 0;
  };
#else
  typedef struct ISharedPropertyGroupVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISharedPropertyGroup *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISharedPropertyGroup *This);
      ULONG (WINAPI *Release)(ISharedPropertyGroup *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ISharedPropertyGroup *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ISharedPropertyGroup *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ISharedPropertyGroup *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ISharedPropertyGroup *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *CreatePropertyByPosition)(ISharedPropertyGroup *This,int Index,VARIANT_BOOL *fExists,ISharedProperty **ppProp);
      HRESULT (WINAPI *get_PropertyByPosition)(ISharedPropertyGroup *This,int Index,ISharedProperty **ppProperty);
      HRESULT (WINAPI *CreateProperty)(ISharedPropertyGroup *This,BSTR Name,VARIANT_BOOL *fExists,ISharedProperty **ppProp);
      HRESULT (WINAPI *get_Property)(ISharedPropertyGroup *This,BSTR Name,ISharedProperty **ppProperty);
    END_INTERFACE
  } ISharedPropertyGroupVtbl;
  interface ISharedPropertyGroup {
    CONST_VTBL struct ISharedPropertyGroupVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISharedPropertyGroup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISharedPropertyGroup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISharedPropertyGroup_Release(This) (This)->lpVtbl->Release(This)
#define ISharedPropertyGroup_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISharedPropertyGroup_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISharedPropertyGroup_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISharedPropertyGroup_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ISharedPropertyGroup_CreatePropertyByPosition(This,Index,fExists,ppProp) (This)->lpVtbl->CreatePropertyByPosition(This,Index,fExists,ppProp)
#define ISharedPropertyGroup_get_PropertyByPosition(This,Index,ppProperty) (This)->lpVtbl->get_PropertyByPosition(This,Index,ppProperty)
#define ISharedPropertyGroup_CreateProperty(This,Name,fExists,ppProp) (This)->lpVtbl->CreateProperty(This,Name,fExists,ppProp)
#define ISharedPropertyGroup_get_Property(This,Name,ppProperty) (This)->lpVtbl->get_Property(This,Name,ppProperty)
#endif
#endif
  HRESULT WINAPI ISharedPropertyGroup_CreatePropertyByPosition_Proxy(ISharedPropertyGroup *This,int Index,VARIANT_BOOL *fExists,ISharedProperty **ppProp);
  void __RPC_STUB ISharedPropertyGroup_CreatePropertyByPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISharedPropertyGroup_get_PropertyByPosition_Proxy(ISharedPropertyGroup *This,int Index,ISharedProperty **ppProperty);
  void __RPC_STUB ISharedPropertyGroup_get_PropertyByPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISharedPropertyGroup_CreateProperty_Proxy(ISharedPropertyGroup *This,BSTR Name,VARIANT_BOOL *fExists,ISharedProperty **ppProp);
  void __RPC_STUB ISharedPropertyGroup_CreateProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISharedPropertyGroup_get_Property_Proxy(ISharedPropertyGroup *This,BSTR Name,ISharedProperty **ppProperty);
  void __RPC_STUB ISharedPropertyGroup_get_Property_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISharedPropertyGroupManager_INTERFACE_DEFINED__
#define __ISharedPropertyGroupManager_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISharedPropertyGroupManager;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISharedPropertyGroupManager : public IDispatch {
  public:
    virtual HRESULT WINAPI CreatePropertyGroup(BSTR Name,LONG *dwIsoMode,LONG *dwRelMode,VARIANT_BOOL *fExists,ISharedPropertyGroup **ppGroup) = 0;
    virtual HRESULT WINAPI get_Group(BSTR Name,ISharedPropertyGroup **ppGroup) = 0;
    virtual HRESULT WINAPI get__NewEnum(IUnknown **retval) = 0;
  };
#else
  typedef struct ISharedPropertyGroupManagerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISharedPropertyGroupManager *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISharedPropertyGroupManager *This);
      ULONG (WINAPI *Release)(ISharedPropertyGroupManager *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ISharedPropertyGroupManager *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ISharedPropertyGroupManager *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ISharedPropertyGroupManager *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ISharedPropertyGroupManager *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *CreatePropertyGroup)(ISharedPropertyGroupManager *This,BSTR Name,LONG *dwIsoMode,LONG *dwRelMode,VARIANT_BOOL *fExists,ISharedPropertyGroup **ppGroup);
      HRESULT (WINAPI *get_Group)(ISharedPropertyGroupManager *This,BSTR Name,ISharedPropertyGroup **ppGroup);
      HRESULT (WINAPI *get__NewEnum)(ISharedPropertyGroupManager *This,IUnknown **retval);
    END_INTERFACE
  } ISharedPropertyGroupManagerVtbl;
  interface ISharedPropertyGroupManager {
    CONST_VTBL struct ISharedPropertyGroupManagerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISharedPropertyGroupManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISharedPropertyGroupManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISharedPropertyGroupManager_Release(This) (This)->lpVtbl->Release(This)
#define ISharedPropertyGroupManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISharedPropertyGroupManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISharedPropertyGroupManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISharedPropertyGroupManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ISharedPropertyGroupManager_CreatePropertyGroup(This,Name,dwIsoMode,dwRelMode,fExists,ppGroup) (This)->lpVtbl->CreatePropertyGroup(This,Name,dwIsoMode,dwRelMode,fExists,ppGroup)
#define ISharedPropertyGroupManager_get_Group(This,Name,ppGroup) (This)->lpVtbl->get_Group(This,Name,ppGroup)
#define ISharedPropertyGroupManager_get__NewEnum(This,retval) (This)->lpVtbl->get__NewEnum(This,retval)
#endif
#endif
  HRESULT WINAPI ISharedPropertyGroupManager_CreatePropertyGroup_Proxy(ISharedPropertyGroupManager *This,BSTR Name,LONG *dwIsoMode,LONG *dwRelMode,VARIANT_BOOL *fExists,ISharedPropertyGroup **ppGroup);
  void __RPC_STUB ISharedPropertyGroupManager_CreatePropertyGroup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISharedPropertyGroupManager_get_Group_Proxy(ISharedPropertyGroupManager *This,BSTR Name,ISharedPropertyGroup **ppGroup);
  void __RPC_STUB ISharedPropertyGroupManager_get_Group_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISharedPropertyGroupManager_get__NewEnum_Proxy(ISharedPropertyGroupManager *This,IUnknown **retval);
  void __RPC_STUB ISharedPropertyGroupManager_get__NewEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IObjectConstruct_INTERFACE_DEFINED__
#define __IObjectConstruct_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IObjectConstruct;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IObjectConstruct : public IUnknown {
  public:
    virtual HRESULT WINAPI Construct(IDispatch *pCtorObj) = 0;
  };
#else
  typedef struct IObjectConstructVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IObjectConstruct *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IObjectConstruct *This);
      ULONG (WINAPI *Release)(IObjectConstruct *This);
      HRESULT (WINAPI *Construct)(IObjectConstruct *This,IDispatch *pCtorObj);
    END_INTERFACE
  } IObjectConstructVtbl;
  interface IObjectConstruct {
    CONST_VTBL struct IObjectConstructVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IObjectConstruct_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectConstruct_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectConstruct_Release(This) (This)->lpVtbl->Release(This)
#define IObjectConstruct_Construct(This,pCtorObj) (This)->lpVtbl->Construct(This,pCtorObj)
#endif
#endif
  HRESULT WINAPI IObjectConstruct_Construct_Proxy(IObjectConstruct *This,IDispatch *pCtorObj);
  void __RPC_STUB IObjectConstruct_Construct_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IObjectConstructString_INTERFACE_DEFINED__
#define __IObjectConstructString_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IObjectConstructString;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IObjectConstructString : public IDispatch {
  public:
    virtual HRESULT WINAPI get_ConstructString(BSTR *pVal) = 0;
  };
#else
  typedef struct IObjectConstructStringVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IObjectConstructString *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IObjectConstructString *This);
      ULONG (WINAPI *Release)(IObjectConstructString *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IObjectConstructString *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IObjectConstructString *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IObjectConstructString *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IObjectConstructString *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_ConstructString)(IObjectConstructString *This,BSTR *pVal);
    END_INTERFACE
  } IObjectConstructStringVtbl;
  interface IObjectConstructString {
    CONST_VTBL struct IObjectConstructStringVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IObjectConstructString_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectConstructString_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectConstructString_Release(This) (This)->lpVtbl->Release(This)
#define IObjectConstructString_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IObjectConstructString_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IObjectConstructString_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IObjectConstructString_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IObjectConstructString_get_ConstructString(This,pVal) (This)->lpVtbl->get_ConstructString(This,pVal)
#endif
#endif
  HRESULT WINAPI IObjectConstructString_get_ConstructString_Proxy(IObjectConstructString *This,BSTR *pVal);
  void __RPC_STUB IObjectConstructString_get_ConstructString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IObjectContextActivity_INTERFACE_DEFINED__
#define __IObjectContextActivity_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IObjectContextActivity;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IObjectContextActivity : public IUnknown {
  public:
    virtual HRESULT WINAPI GetActivityId(GUID *pGUID) = 0;
  };
#else
  typedef struct IObjectContextActivityVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IObjectContextActivity *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IObjectContextActivity *This);
      ULONG (WINAPI *Release)(IObjectContextActivity *This);
      HRESULT (WINAPI *GetActivityId)(IObjectContextActivity *This,GUID *pGUID);
    END_INTERFACE
  } IObjectContextActivityVtbl;
  interface IObjectContextActivity {
    CONST_VTBL struct IObjectContextActivityVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IObjectContextActivity_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectContextActivity_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectContextActivity_Release(This) (This)->lpVtbl->Release(This)
#define IObjectContextActivity_GetActivityId(This,pGUID) (This)->lpVtbl->GetActivityId(This,pGUID)
#endif
#endif
  HRESULT WINAPI IObjectContextActivity_GetActivityId_Proxy(IObjectContextActivity *This,GUID *pGUID);
  void __RPC_STUB IObjectContextActivity_GetActivityId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IObjectContextInfo_INTERFACE_DEFINED__
#define __IObjectContextInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IObjectContextInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IObjectContextInfo : public IUnknown {
  public:
    virtual WINBOOL WINAPI IsInTransaction(void) = 0;
    virtual HRESULT WINAPI GetTransaction(IUnknown **pptrans) = 0;
    virtual HRESULT WINAPI GetTransactionId(GUID *pGuid) = 0;
    virtual HRESULT WINAPI GetActivityId(GUID *pGUID) = 0;
    virtual HRESULT WINAPI GetContextId(GUID *pGuid) = 0;
  };
#else
  typedef struct IObjectContextInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IObjectContextInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IObjectContextInfo *This);
      ULONG (WINAPI *Release)(IObjectContextInfo *This);
      WINBOOL (WINAPI *IsInTransaction)(IObjectContextInfo *This);
      HRESULT (WINAPI *GetTransaction)(IObjectContextInfo *This,IUnknown **pptrans);
      HRESULT (WINAPI *GetTransactionId)(IObjectContextInfo *This,GUID *pGuid);
      HRESULT (WINAPI *GetActivityId)(IObjectContextInfo *This,GUID *pGUID);
      HRESULT (WINAPI *GetContextId)(IObjectContextInfo *This,GUID *pGuid);
    END_INTERFACE
  } IObjectContextInfoVtbl;
  interface IObjectContextInfo {
    CONST_VTBL struct IObjectContextInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IObjectContextInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectContextInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectContextInfo_Release(This) (This)->lpVtbl->Release(This)
#define IObjectContextInfo_IsInTransaction(This) (This)->lpVtbl->IsInTransaction(This)
#define IObjectContextInfo_GetTransaction(This,pptrans) (This)->lpVtbl->GetTransaction(This,pptrans)
#define IObjectContextInfo_GetTransactionId(This,pGuid) (This)->lpVtbl->GetTransactionId(This,pGuid)
#define IObjectContextInfo_GetActivityId(This,pGUID) (This)->lpVtbl->GetActivityId(This,pGUID)
#define IObjectContextInfo_GetContextId(This,pGuid) (This)->lpVtbl->GetContextId(This,pGuid)
#endif
#endif
  WINBOOL WINAPI IObjectContextInfo_IsInTransaction_Proxy(IObjectContextInfo *This);
  void __RPC_STUB IObjectContextInfo_IsInTransaction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IObjectContextInfo_GetTransaction_Proxy(IObjectContextInfo *This,IUnknown **pptrans);
  void __RPC_STUB IObjectContextInfo_GetTransaction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IObjectContextInfo_GetTransactionId_Proxy(IObjectContextInfo *This,GUID *pGuid);
  void __RPC_STUB IObjectContextInfo_GetTransactionId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IObjectContextInfo_GetActivityId_Proxy(IObjectContextInfo *This,GUID *pGUID);
  void __RPC_STUB IObjectContextInfo_GetActivityId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IObjectContextInfo_GetContextId_Proxy(IObjectContextInfo *This,GUID *pGuid);
  void __RPC_STUB IObjectContextInfo_GetContextId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IObjectContextInfo2_INTERFACE_DEFINED__
#define __IObjectContextInfo2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IObjectContextInfo2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IObjectContextInfo2 : public IObjectContextInfo {
  public:
    virtual HRESULT WINAPI GetPartitionId(GUID *pGuid) = 0;
    virtual HRESULT WINAPI GetApplicationId(GUID *pGuid) = 0;
    virtual HRESULT WINAPI GetApplicationInstanceId(GUID *pGuid) = 0;
  };
#else
  typedef struct IObjectContextInfo2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IObjectContextInfo2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IObjectContextInfo2 *This);
      ULONG (WINAPI *Release)(IObjectContextInfo2 *This);
      WINBOOL (WINAPI *IsInTransaction)(IObjectContextInfo2 *This);
      HRESULT (WINAPI *GetTransaction)(IObjectContextInfo2 *This,IUnknown **pptrans);
      HRESULT (WINAPI *GetTransactionId)(IObjectContextInfo2 *This,GUID *pGuid);
      HRESULT (WINAPI *GetActivityId)(IObjectContextInfo2 *This,GUID *pGUID);
      HRESULT (WINAPI *GetContextId)(IObjectContextInfo2 *This,GUID *pGuid);
      HRESULT (WINAPI *GetPartitionId)(IObjectContextInfo2 *This,GUID *pGuid);
      HRESULT (WINAPI *GetApplicationId)(IObjectContextInfo2 *This,GUID *pGuid);
      HRESULT (WINAPI *GetApplicationInstanceId)(IObjectContextInfo2 *This,GUID *pGuid);
    END_INTERFACE
  } IObjectContextInfo2Vtbl;
  interface IObjectContextInfo2 {
    CONST_VTBL struct IObjectContextInfo2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IObjectContextInfo2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectContextInfo2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectContextInfo2_Release(This) (This)->lpVtbl->Release(This)
#define IObjectContextInfo2_IsInTransaction(This) (This)->lpVtbl->IsInTransaction(This)
#define IObjectContextInfo2_GetTransaction(This,pptrans) (This)->lpVtbl->GetTransaction(This,pptrans)
#define IObjectContextInfo2_GetTransactionId(This,pGuid) (This)->lpVtbl->GetTransactionId(This,pGuid)
#define IObjectContextInfo2_GetActivityId(This,pGUID) (This)->lpVtbl->GetActivityId(This,pGUID)
#define IObjectContextInfo2_GetContextId(This,pGuid) (This)->lpVtbl->GetContextId(This,pGuid)
#define IObjectContextInfo2_GetPartitionId(This,pGuid) (This)->lpVtbl->GetPartitionId(This,pGuid)
#define IObjectContextInfo2_GetApplicationId(This,pGuid) (This)->lpVtbl->GetApplicationId(This,pGuid)
#define IObjectContextInfo2_GetApplicationInstanceId(This,pGuid) (This)->lpVtbl->GetApplicationInstanceId(This,pGuid)
#endif
#endif
  HRESULT WINAPI IObjectContextInfo2_GetPartitionId_Proxy(IObjectContextInfo2 *This,GUID *pGuid);
  void __RPC_STUB IObjectContextInfo2_GetPartitionId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IObjectContextInfo2_GetApplicationId_Proxy(IObjectContextInfo2 *This,GUID *pGuid);
  void __RPC_STUB IObjectContextInfo2_GetApplicationId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IObjectContextInfo2_GetApplicationInstanceId_Proxy(IObjectContextInfo2 *This,GUID *pGuid);
  void __RPC_STUB IObjectContextInfo2_GetApplicationInstanceId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ITransactionStatus_INTERFACE_DEFINED__
#define __ITransactionStatus_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ITransactionStatus;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITransactionStatus : public IUnknown {
  public:
    virtual HRESULT WINAPI SetTransactionStatus(HRESULT hrStatus) = 0;
    virtual HRESULT WINAPI GetTransactionStatus(HRESULT *pHrStatus) = 0;
  };
#else
  typedef struct ITransactionStatusVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITransactionStatus *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITransactionStatus *This);
      ULONG (WINAPI *Release)(ITransactionStatus *This);
      HRESULT (WINAPI *SetTransactionStatus)(ITransactionStatus *This,HRESULT hrStatus);
      HRESULT (WINAPI *GetTransactionStatus)(ITransactionStatus *This,HRESULT *pHrStatus);
    END_INTERFACE
  } ITransactionStatusVtbl;
  interface ITransactionStatus {
    CONST_VTBL struct ITransactionStatusVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITransactionStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITransactionStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITransactionStatus_Release(This) (This)->lpVtbl->Release(This)
#define ITransactionStatus_SetTransactionStatus(This,hrStatus) (This)->lpVtbl->SetTransactionStatus(This,hrStatus)
#define ITransactionStatus_GetTransactionStatus(This,pHrStatus) (This)->lpVtbl->GetTransactionStatus(This,pHrStatus)
#endif
#endif
  HRESULT WINAPI ITransactionStatus_SetTransactionStatus_Proxy(ITransactionStatus *This,HRESULT hrStatus);
  void __RPC_STUB ITransactionStatus_SetTransactionStatus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITransactionStatus_GetTransactionStatus_Proxy(ITransactionStatus *This,HRESULT *pHrStatus);
  void __RPC_STUB ITransactionStatus_GetTransactionStatus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IObjectContextTip_INTERFACE_DEFINED__
#define __IObjectContextTip_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IObjectContextTip;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IObjectContextTip : public IUnknown {
  public:
    virtual HRESULT WINAPI GetTipUrl(BSTR *pTipUrl) = 0;
  };
#else
  typedef struct IObjectContextTipVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IObjectContextTip *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IObjectContextTip *This);
      ULONG (WINAPI *Release)(IObjectContextTip *This);
      HRESULT (WINAPI *GetTipUrl)(IObjectContextTip *This,BSTR *pTipUrl);
    END_INTERFACE
  } IObjectContextTipVtbl;
  interface IObjectContextTip {
    CONST_VTBL struct IObjectContextTipVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IObjectContextTip_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectContextTip_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectContextTip_Release(This) (This)->lpVtbl->Release(This)
#define IObjectContextTip_GetTipUrl(This,pTipUrl) (This)->lpVtbl->GetTipUrl(This,pTipUrl)
#endif
#endif
  HRESULT WINAPI IObjectContextTip_GetTipUrl_Proxy(IObjectContextTip *This,BSTR *pTipUrl);
  void __RPC_STUB IObjectContextTip_GetTipUrl_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPlaybackControl_INTERFACE_DEFINED__
#define __IPlaybackControl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IPlaybackControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPlaybackControl : public IUnknown {
  public:
    virtual HRESULT WINAPI FinalClientRetry(void) = 0;
    virtual HRESULT WINAPI FinalServerRetry(void) = 0;
  };
#else
  typedef struct IPlaybackControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPlaybackControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPlaybackControl *This);
      ULONG (WINAPI *Release)(IPlaybackControl *This);
      HRESULT (WINAPI *FinalClientRetry)(IPlaybackControl *This);
      HRESULT (WINAPI *FinalServerRetry)(IPlaybackControl *This);
    END_INTERFACE
  } IPlaybackControlVtbl;
  interface IPlaybackControl {
    CONST_VTBL struct IPlaybackControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPlaybackControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPlaybackControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPlaybackControl_Release(This) (This)->lpVtbl->Release(This)
#define IPlaybackControl_FinalClientRetry(This) (This)->lpVtbl->FinalClientRetry(This)
#define IPlaybackControl_FinalServerRetry(This) (This)->lpVtbl->FinalServerRetry(This)
#endif
#endif
  HRESULT WINAPI IPlaybackControl_FinalClientRetry_Proxy(IPlaybackControl *This);
  void __RPC_STUB IPlaybackControl_FinalClientRetry_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IPlaybackControl_FinalServerRetry_Proxy(IPlaybackControl *This);
  void __RPC_STUB IPlaybackControl_FinalServerRetry_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IGetContextProperties_INTERFACE_DEFINED__
#define __IGetContextProperties_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IGetContextProperties;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IGetContextProperties : public IUnknown {
  public:
    virtual HRESULT WINAPI Count(long *plCount) = 0;
    virtual HRESULT WINAPI GetProperty(BSTR name,VARIANT *pProperty) = 0;
    virtual HRESULT WINAPI EnumNames(IEnumNames **ppenum) = 0;
  };
#else
  typedef struct IGetContextPropertiesVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IGetContextProperties *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IGetContextProperties *This);
      ULONG (WINAPI *Release)(IGetContextProperties *This);
      HRESULT (WINAPI *Count)(IGetContextProperties *This,long *plCount);
      HRESULT (WINAPI *GetProperty)(IGetContextProperties *This,BSTR name,VARIANT *pProperty);
      HRESULT (WINAPI *EnumNames)(IGetContextProperties *This,IEnumNames **ppenum);
    END_INTERFACE
  } IGetContextPropertiesVtbl;
  interface IGetContextProperties {
    CONST_VTBL struct IGetContextPropertiesVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IGetContextProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IGetContextProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IGetContextProperties_Release(This) (This)->lpVtbl->Release(This)
#define IGetContextProperties_Count(This,plCount) (This)->lpVtbl->Count(This,plCount)
#define IGetContextProperties_GetProperty(This,name,pProperty) (This)->lpVtbl->GetProperty(This,name,pProperty)
#define IGetContextProperties_EnumNames(This,ppenum) (This)->lpVtbl->EnumNames(This,ppenum)
#endif
#endif
  HRESULT WINAPI IGetContextProperties_Count_Proxy(IGetContextProperties *This,long *plCount);
  void __RPC_STUB IGetContextProperties_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IGetContextProperties_GetProperty_Proxy(IGetContextProperties *This,BSTR name,VARIANT *pProperty);
  void __RPC_STUB IGetContextProperties_GetProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IGetContextProperties_EnumNames_Proxy(IGetContextProperties *This,IEnumNames **ppenum);
  void __RPC_STUB IGetContextProperties_EnumNames_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  typedef enum tagTransactionVote {
    TxCommit = 0,TxAbort = TxCommit + 1
  } TransactionVote;

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0367_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0367_v0_0_s_ifspec;

#ifndef __IContextState_INTERFACE_DEFINED__
#define __IContextState_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IContextState;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IContextState : public IUnknown {
  public:
    virtual HRESULT WINAPI SetDeactivateOnReturn(VARIANT_BOOL bDeactivate) = 0;
    virtual HRESULT WINAPI GetDeactivateOnReturn(VARIANT_BOOL *pbDeactivate) = 0;
    virtual HRESULT WINAPI SetMyTransactionVote(TransactionVote txVote) = 0;
    virtual HRESULT WINAPI GetMyTransactionVote(TransactionVote *ptxVote) = 0;
  };
#else
  typedef struct IContextStateVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IContextState *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IContextState *This);
      ULONG (WINAPI *Release)(IContextState *This);
      HRESULT (WINAPI *SetDeactivateOnReturn)(IContextState *This,VARIANT_BOOL bDeactivate);
      HRESULT (WINAPI *GetDeactivateOnReturn)(IContextState *This,VARIANT_BOOL *pbDeactivate);
      HRESULT (WINAPI *SetMyTransactionVote)(IContextState *This,TransactionVote txVote);
      HRESULT (WINAPI *GetMyTransactionVote)(IContextState *This,TransactionVote *ptxVote);
    END_INTERFACE
  } IContextStateVtbl;
  interface IContextState {
    CONST_VTBL struct IContextStateVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IContextState_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IContextState_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IContextState_Release(This) (This)->lpVtbl->Release(This)
#define IContextState_SetDeactivateOnReturn(This,bDeactivate) (This)->lpVtbl->SetDeactivateOnReturn(This,bDeactivate)
#define IContextState_GetDeactivateOnReturn(This,pbDeactivate) (This)->lpVtbl->GetDeactivateOnReturn(This,pbDeactivate)
#define IContextState_SetMyTransactionVote(This,txVote) (This)->lpVtbl->SetMyTransactionVote(This,txVote)
#define IContextState_GetMyTransactionVote(This,ptxVote) (This)->lpVtbl->GetMyTransactionVote(This,ptxVote)
#endif
#endif
  HRESULT WINAPI IContextState_SetDeactivateOnReturn_Proxy(IContextState *This,VARIANT_BOOL bDeactivate);
  void __RPC_STUB IContextState_SetDeactivateOnReturn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IContextState_GetDeactivateOnReturn_Proxy(IContextState *This,VARIANT_BOOL *pbDeactivate);
  void __RPC_STUB IContextState_GetDeactivateOnReturn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IContextState_SetMyTransactionVote_Proxy(IContextState *This,TransactionVote txVote);
  void __RPC_STUB IContextState_SetMyTransactionVote_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IContextState_GetMyTransactionVote_Proxy(IContextState *This,TransactionVote *ptxVote);
  void __RPC_STUB IContextState_GetMyTransactionVote_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IPoolManager_INTERFACE_DEFINED__
#define __IPoolManager_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IPoolManager;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IPoolManager : public IDispatch {
  public:
    virtual HRESULT WINAPI ShutdownPool(BSTR CLSIDOrProgID) = 0;
  };
#else
  typedef struct IPoolManagerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IPoolManager *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IPoolManager *This);
      ULONG (WINAPI *Release)(IPoolManager *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IPoolManager *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IPoolManager *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IPoolManager *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IPoolManager *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *ShutdownPool)(IPoolManager *This,BSTR CLSIDOrProgID);
    END_INTERFACE
  } IPoolManagerVtbl;
  interface IPoolManager {
    CONST_VTBL struct IPoolManagerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IPoolManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPoolManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPoolManager_Release(This) (This)->lpVtbl->Release(This)
#define IPoolManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IPoolManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IPoolManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IPoolManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IPoolManager_ShutdownPool(This,CLSIDOrProgID) (This)->lpVtbl->ShutdownPool(This,CLSIDOrProgID)
#endif
#endif
  HRESULT WINAPI IPoolManager_ShutdownPool_Proxy(IPoolManager *This,BSTR CLSIDOrProgID);
  void __RPC_STUB IPoolManager_ShutdownPool_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISelectCOMLBServer_INTERFACE_DEFINED__
#define __ISelectCOMLBServer_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISelectCOMLBServer;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISelectCOMLBServer : public IUnknown {
  public:
    virtual HRESULT WINAPI Init(void) = 0;
    virtual HRESULT WINAPI GetLBServer(IUnknown *pUnk) = 0;
  };
#else
  typedef struct ISelectCOMLBServerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISelectCOMLBServer *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISelectCOMLBServer *This);
      ULONG (WINAPI *Release)(ISelectCOMLBServer *This);
      HRESULT (WINAPI *Init)(ISelectCOMLBServer *This);
      HRESULT (WINAPI *GetLBServer)(ISelectCOMLBServer *This,IUnknown *pUnk);
    END_INTERFACE
  } ISelectCOMLBServerVtbl;
  interface ISelectCOMLBServer {
    CONST_VTBL struct ISelectCOMLBServerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISelectCOMLBServer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISelectCOMLBServer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISelectCOMLBServer_Release(This) (This)->lpVtbl->Release(This)
#define ISelectCOMLBServer_Init(This) (This)->lpVtbl->Init(This)
#define ISelectCOMLBServer_GetLBServer(This,pUnk) (This)->lpVtbl->GetLBServer(This,pUnk)
#endif
#endif
  HRESULT WINAPI ISelectCOMLBServer_Init_Proxy(ISelectCOMLBServer *This);
  void __RPC_STUB ISelectCOMLBServer_Init_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISelectCOMLBServer_GetLBServer_Proxy(ISelectCOMLBServer *This,IUnknown *pUnk);
  void __RPC_STUB ISelectCOMLBServer_GetLBServer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ICOMLBArguments_INTERFACE_DEFINED__
#define __ICOMLBArguments_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ICOMLBArguments;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ICOMLBArguments : public IUnknown {
  public:
    virtual HRESULT WINAPI GetCLSID(CLSID *pCLSID) = 0;
    virtual HRESULT WINAPI SetCLSID(CLSID *pCLSID) = 0;
    virtual HRESULT WINAPI GetMachineName(ULONG cchSvr,WCHAR szServerName[]) = 0;
    virtual HRESULT WINAPI SetMachineName(ULONG cchSvr,WCHAR szServerName[]) = 0;
  };
#else
  typedef struct ICOMLBArgumentsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ICOMLBArguments *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ICOMLBArguments *This);
      ULONG (WINAPI *Release)(ICOMLBArguments *This);
      HRESULT (WINAPI *GetCLSID)(ICOMLBArguments *This,CLSID *pCLSID);
      HRESULT (WINAPI *SetCLSID)(ICOMLBArguments *This,CLSID *pCLSID);
      HRESULT (WINAPI *GetMachineName)(ICOMLBArguments *This,ULONG cchSvr,WCHAR szServerName[]);
      HRESULT (WINAPI *SetMachineName)(ICOMLBArguments *This,ULONG cchSvr,WCHAR szServerName[]);
    END_INTERFACE
  } ICOMLBArgumentsVtbl;
  interface ICOMLBArguments {
    CONST_VTBL struct ICOMLBArgumentsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ICOMLBArguments_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICOMLBArguments_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICOMLBArguments_Release(This) (This)->lpVtbl->Release(This)
#define ICOMLBArguments_GetCLSID(This,pCLSID) (This)->lpVtbl->GetCLSID(This,pCLSID)
#define ICOMLBArguments_SetCLSID(This,pCLSID) (This)->lpVtbl->SetCLSID(This,pCLSID)
#define ICOMLBArguments_GetMachineName(This,cchSvr,szServerName) (This)->lpVtbl->GetMachineName(This,cchSvr,szServerName)
#define ICOMLBArguments_SetMachineName(This,cchSvr,szServerName) (This)->lpVtbl->SetMachineName(This,cchSvr,szServerName)
#endif
#endif
  HRESULT WINAPI ICOMLBArguments_GetCLSID_Proxy(ICOMLBArguments *This,CLSID *pCLSID);
  void __RPC_STUB ICOMLBArguments_GetCLSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICOMLBArguments_SetCLSID_Proxy(ICOMLBArguments *This,CLSID *pCLSID);
  void __RPC_STUB ICOMLBArguments_SetCLSID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICOMLBArguments_GetMachineName_Proxy(ICOMLBArguments *This,ULONG cchSvr,WCHAR szServerName[]);
  void __RPC_STUB ICOMLBArguments_GetMachineName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICOMLBArguments_SetMachineName_Proxy(ICOMLBArguments *This,ULONG cchSvr,WCHAR szServerName[]);
  void __RPC_STUB ICOMLBArguments_SetMachineName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#define GetObjectContext(ppIOC) (CoGetObjectContext(IID_IObjectContext,(void **) (ppIOC))==S_OK ? S_OK : CONTEXT_E_NOCONTEXT)

  EXTERN_C HRESULT WINAPI CoCreateActivity(IUnknown *pIUnknown,REFIID riid,void **ppObj);
  EXTERN_C HRESULT WINAPI CoEnterServiceDomain(IUnknown *pConfigObject);
  EXTERN_C void WINAPI CoLeaveServiceDomain(IUnknown *pUnkStatus);
  EXTERN_C HRESULT WINAPI GetManagedExtensions(DWORD *dwExts);
  extern void *__cdecl SafeRef(REFIID rid,IUnknown *pUnk);
  extern HRESULT __cdecl RecycleSurrogate(long lReasonCode);

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0371_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0371_v0_0_s_ifspec;

#ifndef __ICrmLogControl_INTERFACE_DEFINED__
#define __ICrmLogControl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ICrmLogControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ICrmLogControl : public IUnknown {
  public:
    virtual HRESULT WINAPI get_TransactionUOW(BSTR *pVal) = 0;
    virtual HRESULT WINAPI RegisterCompensator(LPCWSTR lpcwstrProgIdCompensator,LPCWSTR lpcwstrDescription,LONG lCrmRegFlags) = 0;
    virtual HRESULT WINAPI WriteLogRecordVariants(VARIANT *pLogRecord) = 0;
    virtual HRESULT WINAPI ForceLog(void) = 0;
    virtual HRESULT WINAPI ForgetLogRecord(void) = 0;
    virtual HRESULT WINAPI ForceTransactionToAbort(void) = 0;
    virtual HRESULT WINAPI WriteLogRecord(BLOB rgBlob[],ULONG cBlob) = 0;
  };
#else
  typedef struct ICrmLogControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ICrmLogControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ICrmLogControl *This);
      ULONG (WINAPI *Release)(ICrmLogControl *This);
      HRESULT (WINAPI *get_TransactionUOW)(ICrmLogControl *This,BSTR *pVal);
      HRESULT (WINAPI *RegisterCompensator)(ICrmLogControl *This,LPCWSTR lpcwstrProgIdCompensator,LPCWSTR lpcwstrDescription,LONG lCrmRegFlags);
      HRESULT (WINAPI *WriteLogRecordVariants)(ICrmLogControl *This,VARIANT *pLogRecord);
      HRESULT (WINAPI *ForceLog)(ICrmLogControl *This);
      HRESULT (WINAPI *ForgetLogRecord)(ICrmLogControl *This);
      HRESULT (WINAPI *ForceTransactionToAbort)(ICrmLogControl *This);
      HRESULT (WINAPI *WriteLogRecord)(ICrmLogControl *This,BLOB rgBlob[],ULONG cBlob);
    END_INTERFACE
  } ICrmLogControlVtbl;
  interface ICrmLogControl {
    CONST_VTBL struct ICrmLogControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ICrmLogControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICrmLogControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICrmLogControl_Release(This) (This)->lpVtbl->Release(This)
#define ICrmLogControl_get_TransactionUOW(This,pVal) (This)->lpVtbl->get_TransactionUOW(This,pVal)
#define ICrmLogControl_RegisterCompensator(This,lpcwstrProgIdCompensator,lpcwstrDescription,lCrmRegFlags) (This)->lpVtbl->RegisterCompensator(This,lpcwstrProgIdCompensator,lpcwstrDescription,lCrmRegFlags)
#define ICrmLogControl_WriteLogRecordVariants(This,pLogRecord) (This)->lpVtbl->WriteLogRecordVariants(This,pLogRecord)
#define ICrmLogControl_ForceLog(This) (This)->lpVtbl->ForceLog(This)
#define ICrmLogControl_ForgetLogRecord(This) (This)->lpVtbl->ForgetLogRecord(This)
#define ICrmLogControl_ForceTransactionToAbort(This) (This)->lpVtbl->ForceTransactionToAbort(This)
#define ICrmLogControl_WriteLogRecord(This,rgBlob,cBlob) (This)->lpVtbl->WriteLogRecord(This,rgBlob,cBlob)
#endif
#endif
  HRESULT WINAPI ICrmLogControl_get_TransactionUOW_Proxy(ICrmLogControl *This,BSTR *pVal);
  void __RPC_STUB ICrmLogControl_get_TransactionUOW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmLogControl_RegisterCompensator_Proxy(ICrmLogControl *This,LPCWSTR lpcwstrProgIdCompensator,LPCWSTR lpcwstrDescription,LONG lCrmRegFlags);
  void __RPC_STUB ICrmLogControl_RegisterCompensator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmLogControl_WriteLogRecordVariants_Proxy(ICrmLogControl *This,VARIANT *pLogRecord);
  void __RPC_STUB ICrmLogControl_WriteLogRecordVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmLogControl_ForceLog_Proxy(ICrmLogControl *This);
  void __RPC_STUB ICrmLogControl_ForceLog_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmLogControl_ForgetLogRecord_Proxy(ICrmLogControl *This);
  void __RPC_STUB ICrmLogControl_ForgetLogRecord_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmLogControl_ForceTransactionToAbort_Proxy(ICrmLogControl *This);
  void __RPC_STUB ICrmLogControl_ForceTransactionToAbort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmLogControl_WriteLogRecord_Proxy(ICrmLogControl *This,BLOB rgBlob[],ULONG cBlob);
  void __RPC_STUB ICrmLogControl_WriteLogRecord_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ICrmCompensatorVariants_INTERFACE_DEFINED__
#define __ICrmCompensatorVariants_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ICrmCompensatorVariants;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ICrmCompensatorVariants : public IUnknown {
  public:
    virtual HRESULT WINAPI SetLogControlVariants(ICrmLogControl *pLogControl) = 0;
    virtual HRESULT WINAPI BeginPrepareVariants(void) = 0;
    virtual HRESULT WINAPI PrepareRecordVariants(VARIANT *pLogRecord,VARIANT_BOOL *pbForget) = 0;
    virtual HRESULT WINAPI EndPrepareVariants(VARIANT_BOOL *pbOkToPrepare) = 0;
    virtual HRESULT WINAPI BeginCommitVariants(VARIANT_BOOL bRecovery) = 0;
    virtual HRESULT WINAPI CommitRecordVariants(VARIANT *pLogRecord,VARIANT_BOOL *pbForget) = 0;
    virtual HRESULT WINAPI EndCommitVariants(void) = 0;
    virtual HRESULT WINAPI BeginAbortVariants(VARIANT_BOOL bRecovery) = 0;
    virtual HRESULT WINAPI AbortRecordVariants(VARIANT *pLogRecord,VARIANT_BOOL *pbForget) = 0;
    virtual HRESULT WINAPI EndAbortVariants(void) = 0;
  };
#else
  typedef struct ICrmCompensatorVariantsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ICrmCompensatorVariants *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ICrmCompensatorVariants *This);
      ULONG (WINAPI *Release)(ICrmCompensatorVariants *This);
      HRESULT (WINAPI *SetLogControlVariants)(ICrmCompensatorVariants *This,ICrmLogControl *pLogControl);
      HRESULT (WINAPI *BeginPrepareVariants)(ICrmCompensatorVariants *This);
      HRESULT (WINAPI *PrepareRecordVariants)(ICrmCompensatorVariants *This,VARIANT *pLogRecord,VARIANT_BOOL *pbForget);
      HRESULT (WINAPI *EndPrepareVariants)(ICrmCompensatorVariants *This,VARIANT_BOOL *pbOkToPrepare);
      HRESULT (WINAPI *BeginCommitVariants)(ICrmCompensatorVariants *This,VARIANT_BOOL bRecovery);
      HRESULT (WINAPI *CommitRecordVariants)(ICrmCompensatorVariants *This,VARIANT *pLogRecord,VARIANT_BOOL *pbForget);
      HRESULT (WINAPI *EndCommitVariants)(ICrmCompensatorVariants *This);
      HRESULT (WINAPI *BeginAbortVariants)(ICrmCompensatorVariants *This,VARIANT_BOOL bRecovery);
      HRESULT (WINAPI *AbortRecordVariants)(ICrmCompensatorVariants *This,VARIANT *pLogRecord,VARIANT_BOOL *pbForget);
      HRESULT (WINAPI *EndAbortVariants)(ICrmCompensatorVariants *This);
    END_INTERFACE
  } ICrmCompensatorVariantsVtbl;
  interface ICrmCompensatorVariants {
    CONST_VTBL struct ICrmCompensatorVariantsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ICrmCompensatorVariants_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICrmCompensatorVariants_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICrmCompensatorVariants_Release(This) (This)->lpVtbl->Release(This)
#define ICrmCompensatorVariants_SetLogControlVariants(This,pLogControl) (This)->lpVtbl->SetLogControlVariants(This,pLogControl)
#define ICrmCompensatorVariants_BeginPrepareVariants(This) (This)->lpVtbl->BeginPrepareVariants(This)
#define ICrmCompensatorVariants_PrepareRecordVariants(This,pLogRecord,pbForget) (This)->lpVtbl->PrepareRecordVariants(This,pLogRecord,pbForget)
#define ICrmCompensatorVariants_EndPrepareVariants(This,pbOkToPrepare) (This)->lpVtbl->EndPrepareVariants(This,pbOkToPrepare)
#define ICrmCompensatorVariants_BeginCommitVariants(This,bRecovery) (This)->lpVtbl->BeginCommitVariants(This,bRecovery)
#define ICrmCompensatorVariants_CommitRecordVariants(This,pLogRecord,pbForget) (This)->lpVtbl->CommitRecordVariants(This,pLogRecord,pbForget)
#define ICrmCompensatorVariants_EndCommitVariants(This) (This)->lpVtbl->EndCommitVariants(This)
#define ICrmCompensatorVariants_BeginAbortVariants(This,bRecovery) (This)->lpVtbl->BeginAbortVariants(This,bRecovery)
#define ICrmCompensatorVariants_AbortRecordVariants(This,pLogRecord,pbForget) (This)->lpVtbl->AbortRecordVariants(This,pLogRecord,pbForget)
#define ICrmCompensatorVariants_EndAbortVariants(This) (This)->lpVtbl->EndAbortVariants(This)
#endif
#endif
  HRESULT WINAPI ICrmCompensatorVariants_SetLogControlVariants_Proxy(ICrmCompensatorVariants *This,ICrmLogControl *pLogControl);
  void __RPC_STUB ICrmCompensatorVariants_SetLogControlVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensatorVariants_BeginPrepareVariants_Proxy(ICrmCompensatorVariants *This);
  void __RPC_STUB ICrmCompensatorVariants_BeginPrepareVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensatorVariants_PrepareRecordVariants_Proxy(ICrmCompensatorVariants *This,VARIANT *pLogRecord,VARIANT_BOOL *pbForget);
  void __RPC_STUB ICrmCompensatorVariants_PrepareRecordVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensatorVariants_EndPrepareVariants_Proxy(ICrmCompensatorVariants *This,VARIANT_BOOL *pbOkToPrepare);
  void __RPC_STUB ICrmCompensatorVariants_EndPrepareVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensatorVariants_BeginCommitVariants_Proxy(ICrmCompensatorVariants *This,VARIANT_BOOL bRecovery);
  void __RPC_STUB ICrmCompensatorVariants_BeginCommitVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensatorVariants_CommitRecordVariants_Proxy(ICrmCompensatorVariants *This,VARIANT *pLogRecord,VARIANT_BOOL *pbForget);
  void __RPC_STUB ICrmCompensatorVariants_CommitRecordVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensatorVariants_EndCommitVariants_Proxy(ICrmCompensatorVariants *This);
  void __RPC_STUB ICrmCompensatorVariants_EndCommitVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensatorVariants_BeginAbortVariants_Proxy(ICrmCompensatorVariants *This,VARIANT_BOOL bRecovery);
  void __RPC_STUB ICrmCompensatorVariants_BeginAbortVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensatorVariants_AbortRecordVariants_Proxy(ICrmCompensatorVariants *This,VARIANT *pLogRecord,VARIANT_BOOL *pbForget);
  void __RPC_STUB ICrmCompensatorVariants_AbortRecordVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensatorVariants_EndAbortVariants_Proxy(ICrmCompensatorVariants *This);
  void __RPC_STUB ICrmCompensatorVariants_EndAbortVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef _tagCrmLogRecordRead_
#define _tagCrmLogRecordRead_
  typedef struct tagCrmLogRecordRead {
    DWORD dwCrmFlags;
    DWORD dwSequenceNumber;
    BLOB blobUserData;
  } CrmLogRecordRead;
#endif

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0373_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0373_v0_0_s_ifspec;

#ifndef __ICrmCompensator_INTERFACE_DEFINED__
#define __ICrmCompensator_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ICrmCompensator;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ICrmCompensator : public IUnknown {
  public:
    virtual HRESULT WINAPI SetLogControl(ICrmLogControl *pLogControl) = 0;
    virtual HRESULT WINAPI BeginPrepare(void) = 0;
    virtual HRESULT WINAPI PrepareRecord(CrmLogRecordRead crmLogRec,WINBOOL *pfForget) = 0;
    virtual HRESULT WINAPI EndPrepare(WINBOOL *pfOkToPrepare) = 0;
    virtual HRESULT WINAPI BeginCommit(WINBOOL fRecovery) = 0;
    virtual HRESULT WINAPI CommitRecord(CrmLogRecordRead crmLogRec,WINBOOL *pfForget) = 0;
    virtual HRESULT WINAPI EndCommit(void) = 0;
    virtual HRESULT WINAPI BeginAbort(WINBOOL fRecovery) = 0;
    virtual HRESULT WINAPI AbortRecord(CrmLogRecordRead crmLogRec,WINBOOL *pfForget) = 0;
    virtual HRESULT WINAPI EndAbort(void) = 0;
  };
#else
  typedef struct ICrmCompensatorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ICrmCompensator *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ICrmCompensator *This);
      ULONG (WINAPI *Release)(ICrmCompensator *This);
      HRESULT (WINAPI *SetLogControl)(ICrmCompensator *This,ICrmLogControl *pLogControl);
      HRESULT (WINAPI *BeginPrepare)(ICrmCompensator *This);
      HRESULT (WINAPI *PrepareRecord)(ICrmCompensator *This,CrmLogRecordRead crmLogRec,WINBOOL *pfForget);
      HRESULT (WINAPI *EndPrepare)(ICrmCompensator *This,WINBOOL *pfOkToPrepare);
      HRESULT (WINAPI *BeginCommit)(ICrmCompensator *This,WINBOOL fRecovery);
      HRESULT (WINAPI *CommitRecord)(ICrmCompensator *This,CrmLogRecordRead crmLogRec,WINBOOL *pfForget);
      HRESULT (WINAPI *EndCommit)(ICrmCompensator *This);
      HRESULT (WINAPI *BeginAbort)(ICrmCompensator *This,WINBOOL fRecovery);
      HRESULT (WINAPI *AbortRecord)(ICrmCompensator *This,CrmLogRecordRead crmLogRec,WINBOOL *pfForget);
      HRESULT (WINAPI *EndAbort)(ICrmCompensator *This);
    END_INTERFACE
  } ICrmCompensatorVtbl;
  interface ICrmCompensator {
    CONST_VTBL struct ICrmCompensatorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ICrmCompensator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICrmCompensator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICrmCompensator_Release(This) (This)->lpVtbl->Release(This)
#define ICrmCompensator_SetLogControl(This,pLogControl) (This)->lpVtbl->SetLogControl(This,pLogControl)
#define ICrmCompensator_BeginPrepare(This) (This)->lpVtbl->BeginPrepare(This)
#define ICrmCompensator_PrepareRecord(This,crmLogRec,pfForget) (This)->lpVtbl->PrepareRecord(This,crmLogRec,pfForget)
#define ICrmCompensator_EndPrepare(This,pfOkToPrepare) (This)->lpVtbl->EndPrepare(This,pfOkToPrepare)
#define ICrmCompensator_BeginCommit(This,fRecovery) (This)->lpVtbl->BeginCommit(This,fRecovery)
#define ICrmCompensator_CommitRecord(This,crmLogRec,pfForget) (This)->lpVtbl->CommitRecord(This,crmLogRec,pfForget)
#define ICrmCompensator_EndCommit(This) (This)->lpVtbl->EndCommit(This)
#define ICrmCompensator_BeginAbort(This,fRecovery) (This)->lpVtbl->BeginAbort(This,fRecovery)
#define ICrmCompensator_AbortRecord(This,crmLogRec,pfForget) (This)->lpVtbl->AbortRecord(This,crmLogRec,pfForget)
#define ICrmCompensator_EndAbort(This) (This)->lpVtbl->EndAbort(This)
#endif
#endif
  HRESULT WINAPI ICrmCompensator_SetLogControl_Proxy(ICrmCompensator *This,ICrmLogControl *pLogControl);
  void __RPC_STUB ICrmCompensator_SetLogControl_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensator_BeginPrepare_Proxy(ICrmCompensator *This);
  void __RPC_STUB ICrmCompensator_BeginPrepare_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensator_PrepareRecord_Proxy(ICrmCompensator *This,CrmLogRecordRead crmLogRec,WINBOOL *pfForget);
  void __RPC_STUB ICrmCompensator_PrepareRecord_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensator_EndPrepare_Proxy(ICrmCompensator *This,WINBOOL *pfOkToPrepare);
  void __RPC_STUB ICrmCompensator_EndPrepare_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensator_BeginCommit_Proxy(ICrmCompensator *This,WINBOOL fRecovery);
  void __RPC_STUB ICrmCompensator_BeginCommit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensator_CommitRecord_Proxy(ICrmCompensator *This,CrmLogRecordRead crmLogRec,WINBOOL *pfForget);
  void __RPC_STUB ICrmCompensator_CommitRecord_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensator_EndCommit_Proxy(ICrmCompensator *This);
  void __RPC_STUB ICrmCompensator_EndCommit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensator_BeginAbort_Proxy(ICrmCompensator *This,WINBOOL fRecovery);
  void __RPC_STUB ICrmCompensator_BeginAbort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensator_AbortRecord_Proxy(ICrmCompensator *This,CrmLogRecordRead crmLogRec,WINBOOL *pfForget);
  void __RPC_STUB ICrmCompensator_AbortRecord_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmCompensator_EndAbort_Proxy(ICrmCompensator *This);
  void __RPC_STUB ICrmCompensator_EndAbort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef _tagCrmTransactionState_
#define _tagCrmTransactionState_
  typedef enum tagCrmTransactionState {
    TxState_Active = 0,TxState_Committed = TxState_Active + 1,TxState_Aborted = TxState_Committed + 1,TxState_Indoubt = TxState_Aborted + 1
  } CrmTransactionState;
#endif

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0374_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0374_v0_0_s_ifspec;

#ifndef __ICrmMonitorLogRecords_INTERFACE_DEFINED__
#define __ICrmMonitorLogRecords_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ICrmMonitorLogRecords;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ICrmMonitorLogRecords : public IUnknown {
  public:
    virtual HRESULT WINAPI get_Count(long *pVal) = 0;
    virtual HRESULT WINAPI get_TransactionState(CrmTransactionState *pVal) = 0;
    virtual HRESULT WINAPI get_StructuredRecords(VARIANT_BOOL *pVal) = 0;
    virtual HRESULT WINAPI GetLogRecord(DWORD dwIndex,CrmLogRecordRead *pCrmLogRec) = 0;
    virtual HRESULT WINAPI GetLogRecordVariants(VARIANT IndexNumber,LPVARIANT pLogRecord) = 0;
  };
#else
  typedef struct ICrmMonitorLogRecordsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ICrmMonitorLogRecords *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ICrmMonitorLogRecords *This);
      ULONG (WINAPI *Release)(ICrmMonitorLogRecords *This);
      HRESULT (WINAPI *get_Count)(ICrmMonitorLogRecords *This,long *pVal);
      HRESULT (WINAPI *get_TransactionState)(ICrmMonitorLogRecords *This,CrmTransactionState *pVal);
      HRESULT (WINAPI *get_StructuredRecords)(ICrmMonitorLogRecords *This,VARIANT_BOOL *pVal);
      HRESULT (WINAPI *GetLogRecord)(ICrmMonitorLogRecords *This,DWORD dwIndex,CrmLogRecordRead *pCrmLogRec);
      HRESULT (WINAPI *GetLogRecordVariants)(ICrmMonitorLogRecords *This,VARIANT IndexNumber,LPVARIANT pLogRecord);
    END_INTERFACE
  } ICrmMonitorLogRecordsVtbl;
  interface ICrmMonitorLogRecords {
    CONST_VTBL struct ICrmMonitorLogRecordsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ICrmMonitorLogRecords_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICrmMonitorLogRecords_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICrmMonitorLogRecords_Release(This) (This)->lpVtbl->Release(This)
#define ICrmMonitorLogRecords_get_Count(This,pVal) (This)->lpVtbl->get_Count(This,pVal)
#define ICrmMonitorLogRecords_get_TransactionState(This,pVal) (This)->lpVtbl->get_TransactionState(This,pVal)
#define ICrmMonitorLogRecords_get_StructuredRecords(This,pVal) (This)->lpVtbl->get_StructuredRecords(This,pVal)
#define ICrmMonitorLogRecords_GetLogRecord(This,dwIndex,pCrmLogRec) (This)->lpVtbl->GetLogRecord(This,dwIndex,pCrmLogRec)
#define ICrmMonitorLogRecords_GetLogRecordVariants(This,IndexNumber,pLogRecord) (This)->lpVtbl->GetLogRecordVariants(This,IndexNumber,pLogRecord)
#endif
#endif
  HRESULT WINAPI ICrmMonitorLogRecords_get_Count_Proxy(ICrmMonitorLogRecords *This,long *pVal);
  void __RPC_STUB ICrmMonitorLogRecords_get_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmMonitorLogRecords_get_TransactionState_Proxy(ICrmMonitorLogRecords *This,CrmTransactionState *pVal);
  void __RPC_STUB ICrmMonitorLogRecords_get_TransactionState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmMonitorLogRecords_get_StructuredRecords_Proxy(ICrmMonitorLogRecords *This,VARIANT_BOOL *pVal);
  void __RPC_STUB ICrmMonitorLogRecords_get_StructuredRecords_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmMonitorLogRecords_GetLogRecord_Proxy(ICrmMonitorLogRecords *This,DWORD dwIndex,CrmLogRecordRead *pCrmLogRec);
  void __RPC_STUB ICrmMonitorLogRecords_GetLogRecord_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmMonitorLogRecords_GetLogRecordVariants_Proxy(ICrmMonitorLogRecords *This,VARIANT IndexNumber,LPVARIANT pLogRecord);
  void __RPC_STUB ICrmMonitorLogRecords_GetLogRecordVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ICrmMonitorClerks_INTERFACE_DEFINED__
#define __ICrmMonitorClerks_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ICrmMonitorClerks;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ICrmMonitorClerks : public IDispatch {
  public:
    virtual HRESULT WINAPI Item(VARIANT Index,LPVARIANT pItem) = 0;
    virtual HRESULT WINAPI get__NewEnum(LPUNKNOWN *pVal) = 0;
    virtual HRESULT WINAPI get_Count(long *pVal) = 0;
    virtual HRESULT WINAPI ProgIdCompensator(VARIANT Index,LPVARIANT pItem) = 0;
    virtual HRESULT WINAPI Description(VARIANT Index,LPVARIANT pItem) = 0;
    virtual HRESULT WINAPI TransactionUOW(VARIANT Index,LPVARIANT pItem) = 0;
    virtual HRESULT WINAPI ActivityId(VARIANT Index,LPVARIANT pItem) = 0;
  };
#else
  typedef struct ICrmMonitorClerksVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ICrmMonitorClerks *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ICrmMonitorClerks *This);
      ULONG (WINAPI *Release)(ICrmMonitorClerks *This);
      HRESULT (WINAPI *GetTypeInfoCount)(ICrmMonitorClerks *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(ICrmMonitorClerks *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(ICrmMonitorClerks *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(ICrmMonitorClerks *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *Item)(ICrmMonitorClerks *This,VARIANT Index,LPVARIANT pItem);
      HRESULT (WINAPI *get__NewEnum)(ICrmMonitorClerks *This,LPUNKNOWN *pVal);
      HRESULT (WINAPI *get_Count)(ICrmMonitorClerks *This,long *pVal);
      HRESULT (WINAPI *ProgIdCompensator)(ICrmMonitorClerks *This,VARIANT Index,LPVARIANT pItem);
      HRESULT (WINAPI *Description)(ICrmMonitorClerks *This,VARIANT Index,LPVARIANT pItem);
      HRESULT (WINAPI *TransactionUOW)(ICrmMonitorClerks *This,VARIANT Index,LPVARIANT pItem);
      HRESULT (WINAPI *ActivityId)(ICrmMonitorClerks *This,VARIANT Index,LPVARIANT pItem);
    END_INTERFACE
  } ICrmMonitorClerksVtbl;
  interface ICrmMonitorClerks {
    CONST_VTBL struct ICrmMonitorClerksVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ICrmMonitorClerks_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICrmMonitorClerks_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICrmMonitorClerks_Release(This) (This)->lpVtbl->Release(This)
#define ICrmMonitorClerks_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICrmMonitorClerks_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICrmMonitorClerks_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICrmMonitorClerks_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ICrmMonitorClerks_Item(This,Index,pItem) (This)->lpVtbl->Item(This,Index,pItem)
#define ICrmMonitorClerks_get__NewEnum(This,pVal) (This)->lpVtbl->get__NewEnum(This,pVal)
#define ICrmMonitorClerks_get_Count(This,pVal) (This)->lpVtbl->get_Count(This,pVal)
#define ICrmMonitorClerks_ProgIdCompensator(This,Index,pItem) (This)->lpVtbl->ProgIdCompensator(This,Index,pItem)
#define ICrmMonitorClerks_Description(This,Index,pItem) (This)->lpVtbl->Description(This,Index,pItem)
#define ICrmMonitorClerks_TransactionUOW(This,Index,pItem) (This)->lpVtbl->TransactionUOW(This,Index,pItem)
#define ICrmMonitorClerks_ActivityId(This,Index,pItem) (This)->lpVtbl->ActivityId(This,Index,pItem)
#endif
#endif
  HRESULT WINAPI ICrmMonitorClerks_Item_Proxy(ICrmMonitorClerks *This,VARIANT Index,LPVARIANT pItem);
  void __RPC_STUB ICrmMonitorClerks_Item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmMonitorClerks_get__NewEnum_Proxy(ICrmMonitorClerks *This,LPUNKNOWN *pVal);
  void __RPC_STUB ICrmMonitorClerks_get__NewEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmMonitorClerks_get_Count_Proxy(ICrmMonitorClerks *This,long *pVal);
  void __RPC_STUB ICrmMonitorClerks_get_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmMonitorClerks_ProgIdCompensator_Proxy(ICrmMonitorClerks *This,VARIANT Index,LPVARIANT pItem);
  void __RPC_STUB ICrmMonitorClerks_ProgIdCompensator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmMonitorClerks_Description_Proxy(ICrmMonitorClerks *This,VARIANT Index,LPVARIANT pItem);
  void __RPC_STUB ICrmMonitorClerks_Description_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmMonitorClerks_TransactionUOW_Proxy(ICrmMonitorClerks *This,VARIANT Index,LPVARIANT pItem);
  void __RPC_STUB ICrmMonitorClerks_TransactionUOW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmMonitorClerks_ActivityId_Proxy(ICrmMonitorClerks *This,VARIANT Index,LPVARIANT pItem);
  void __RPC_STUB ICrmMonitorClerks_ActivityId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ICrmMonitor_INTERFACE_DEFINED__
#define __ICrmMonitor_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ICrmMonitor;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ICrmMonitor : public IUnknown {
  public:
    virtual HRESULT WINAPI GetClerks(ICrmMonitorClerks **pClerks) = 0;
    virtual HRESULT WINAPI HoldClerk(VARIANT Index,LPVARIANT pItem) = 0;
  };
#else
  typedef struct ICrmMonitorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ICrmMonitor *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ICrmMonitor *This);
      ULONG (WINAPI *Release)(ICrmMonitor *This);
      HRESULT (WINAPI *GetClerks)(ICrmMonitor *This,ICrmMonitorClerks **pClerks);
      HRESULT (WINAPI *HoldClerk)(ICrmMonitor *This,VARIANT Index,LPVARIANT pItem);
    END_INTERFACE
  } ICrmMonitorVtbl;
  interface ICrmMonitor {
    CONST_VTBL struct ICrmMonitorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ICrmMonitor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICrmMonitor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICrmMonitor_Release(This) (This)->lpVtbl->Release(This)
#define ICrmMonitor_GetClerks(This,pClerks) (This)->lpVtbl->GetClerks(This,pClerks)
#define ICrmMonitor_HoldClerk(This,Index,pItem) (This)->lpVtbl->HoldClerk(This,Index,pItem)
#endif
#endif
  HRESULT WINAPI ICrmMonitor_GetClerks_Proxy(ICrmMonitor *This,ICrmMonitorClerks **pClerks);
  void __RPC_STUB ICrmMonitor_GetClerks_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmMonitor_HoldClerk_Proxy(ICrmMonitor *This,VARIANT Index,LPVARIANT pItem);
  void __RPC_STUB ICrmMonitor_HoldClerk_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ICrmFormatLogRecords_INTERFACE_DEFINED__
#define __ICrmFormatLogRecords_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ICrmFormatLogRecords;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ICrmFormatLogRecords : public IUnknown {
  public:
    virtual HRESULT WINAPI GetColumnCount(long *plColumnCount) = 0;
    virtual HRESULT WINAPI GetColumnHeaders(LPVARIANT pHeaders) = 0;
    virtual HRESULT WINAPI GetColumn(CrmLogRecordRead CrmLogRec,LPVARIANT pFormattedLogRecord) = 0;
    virtual HRESULT WINAPI GetColumnVariants(VARIANT LogRecord,LPVARIANT pFormattedLogRecord) = 0;
  };
#else
  typedef struct ICrmFormatLogRecordsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ICrmFormatLogRecords *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ICrmFormatLogRecords *This);
      ULONG (WINAPI *Release)(ICrmFormatLogRecords *This);
      HRESULT (WINAPI *GetColumnCount)(ICrmFormatLogRecords *This,long *plColumnCount);
      HRESULT (WINAPI *GetColumnHeaders)(ICrmFormatLogRecords *This,LPVARIANT pHeaders);
      HRESULT (WINAPI *GetColumn)(ICrmFormatLogRecords *This,CrmLogRecordRead CrmLogRec,LPVARIANT pFormattedLogRecord);
      HRESULT (WINAPI *GetColumnVariants)(ICrmFormatLogRecords *This,VARIANT LogRecord,LPVARIANT pFormattedLogRecord);
    END_INTERFACE
  } ICrmFormatLogRecordsVtbl;
  interface ICrmFormatLogRecords {
    CONST_VTBL struct ICrmFormatLogRecordsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ICrmFormatLogRecords_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICrmFormatLogRecords_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICrmFormatLogRecords_Release(This) (This)->lpVtbl->Release(This)
#define ICrmFormatLogRecords_GetColumnCount(This,plColumnCount) (This)->lpVtbl->GetColumnCount(This,plColumnCount)
#define ICrmFormatLogRecords_GetColumnHeaders(This,pHeaders) (This)->lpVtbl->GetColumnHeaders(This,pHeaders)
#define ICrmFormatLogRecords_GetColumn(This,CrmLogRec,pFormattedLogRecord) (This)->lpVtbl->GetColumn(This,CrmLogRec,pFormattedLogRecord)
#define ICrmFormatLogRecords_GetColumnVariants(This,LogRecord,pFormattedLogRecord) (This)->lpVtbl->GetColumnVariants(This,LogRecord,pFormattedLogRecord)
#endif
#endif
  HRESULT WINAPI ICrmFormatLogRecords_GetColumnCount_Proxy(ICrmFormatLogRecords *This,long *plColumnCount);
  void __RPC_STUB ICrmFormatLogRecords_GetColumnCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmFormatLogRecords_GetColumnHeaders_Proxy(ICrmFormatLogRecords *This,LPVARIANT pHeaders);
  void __RPC_STUB ICrmFormatLogRecords_GetColumnHeaders_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmFormatLogRecords_GetColumn_Proxy(ICrmFormatLogRecords *This,CrmLogRecordRead CrmLogRec,LPVARIANT pFormattedLogRecord);
  void __RPC_STUB ICrmFormatLogRecords_GetColumn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ICrmFormatLogRecords_GetColumnVariants_Proxy(ICrmFormatLogRecords *This,VARIANT LogRecord,LPVARIANT pFormattedLogRecord);
  void __RPC_STUB ICrmFormatLogRecords_GetColumnVariants_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  typedef enum tagCSC_InheritanceConfig {
    CSC_Inherit = 0,CSC_Ignore = CSC_Inherit + 1
  } CSC_InheritanceConfig;

  typedef enum tagCSC_ThreadPool {
    CSC_ThreadPoolNone = 0,CSC_ThreadPoolInherit = CSC_ThreadPoolNone + 1,CSC_STAThreadPool = CSC_ThreadPoolInherit + 1,
    CSC_MTAThreadPool = CSC_STAThreadPool + 1
  } CSC_ThreadPool;

  typedef enum tagCSC_Binding {
    CSC_NoBinding = 0,CSC_BindToPoolThread = CSC_NoBinding + 1
  } CSC_Binding;

  typedef enum tagCSC_TransactionConfig {
    CSC_NoTransaction = 0,CSC_IfContainerIsTransactional = CSC_NoTransaction + 1,CSC_CreateTransactionIfNecessary = CSC_IfContainerIsTransactional + 1,CSC_NewTransaction = CSC_CreateTransactionIfNecessary + 1
  } CSC_TransactionConfig;

  typedef enum tagCSC_SynchronizationConfig {
    CSC_NoSynchronization = 0,CSC_IfContainerIsSynchronized = CSC_NoSynchronization + 1,
    CSC_NewSynchronizationIfNecessary = CSC_IfContainerIsSynchronized + 1,CSC_NewSynchronization = CSC_NewSynchronizationIfNecessary + 1
  } CSC_SynchronizationConfig;

  typedef enum tagCSC_TrackerConfig {
    CSC_DontUseTracker = 0,CSC_UseTracker = CSC_DontUseTracker + 1
  } CSC_TrackerConfig;

  typedef enum tagCSC_PartitionConfig {
    CSC_NoPartition = 0,CSC_InheritPartition = CSC_NoPartition + 1,CSC_NewPartition = CSC_InheritPartition + 1
  } CSC_PartitionConfig;

  typedef enum tagCSC_IISIntrinsicsConfig {
    CSC_NoIISIntrinsics = 0,CSC_InheritIISIntrinsics = CSC_NoIISIntrinsics + 1
  } CSC_IISIntrinsicsConfig;

  typedef enum tagCSC_COMTIIntrinsicsConfig {
    CSC_NoCOMTIIntrinsics = 0,CSC_InheritCOMTIIntrinsics = CSC_NoCOMTIIntrinsics + 1
  } CSC_COMTIIntrinsicsConfig;

  typedef enum tagCSC_SxsConfig {
    CSC_NoSxs = 0,CSC_InheritSxs = CSC_NoSxs + 1,CSC_NewSxs = CSC_InheritSxs + 1
  } CSC_SxsConfig;

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0378_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0378_v0_0_s_ifspec;

#ifndef __IServiceIISIntrinsicsConfig_INTERFACE_DEFINED__
#define __IServiceIISIntrinsicsConfig_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServiceIISIntrinsicsConfig;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServiceIISIntrinsicsConfig : public IUnknown {
  public:
    virtual HRESULT WINAPI IISIntrinsicsConfig(CSC_IISIntrinsicsConfig iisIntrinsicsConfig) = 0;
  };
#else
  typedef struct IServiceIISIntrinsicsConfigVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServiceIISIntrinsicsConfig *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServiceIISIntrinsicsConfig *This);
      ULONG (WINAPI *Release)(IServiceIISIntrinsicsConfig *This);
      HRESULT (WINAPI *IISIntrinsicsConfig)(IServiceIISIntrinsicsConfig *This,CSC_IISIntrinsicsConfig iisIntrinsicsConfig);
    END_INTERFACE
  } IServiceIISIntrinsicsConfigVtbl;
  interface IServiceIISIntrinsicsConfig {
    CONST_VTBL struct IServiceIISIntrinsicsConfigVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServiceIISIntrinsicsConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServiceIISIntrinsicsConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServiceIISIntrinsicsConfig_Release(This) (This)->lpVtbl->Release(This)
#define IServiceIISIntrinsicsConfig_IISIntrinsicsConfig(This,iisIntrinsicsConfig) (This)->lpVtbl->IISIntrinsicsConfig(This,iisIntrinsicsConfig)
#endif
#endif
  HRESULT WINAPI IServiceIISIntrinsicsConfig_IISIntrinsicsConfig_Proxy(IServiceIISIntrinsicsConfig *This,CSC_IISIntrinsicsConfig iisIntrinsicsConfig);
  void __RPC_STUB IServiceIISIntrinsicsConfig_IISIntrinsicsConfig_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServiceComTIIntrinsicsConfig_INTERFACE_DEFINED__
#define __IServiceComTIIntrinsicsConfig_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServiceComTIIntrinsicsConfig;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServiceComTIIntrinsicsConfig : public IUnknown {
  public:
    virtual HRESULT WINAPI ComTIIntrinsicsConfig(CSC_COMTIIntrinsicsConfig comtiIntrinsicsConfig) = 0;
  };
#else
  typedef struct IServiceComTIIntrinsicsConfigVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServiceComTIIntrinsicsConfig *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServiceComTIIntrinsicsConfig *This);
      ULONG (WINAPI *Release)(IServiceComTIIntrinsicsConfig *This);
      HRESULT (WINAPI *ComTIIntrinsicsConfig)(IServiceComTIIntrinsicsConfig *This,CSC_COMTIIntrinsicsConfig comtiIntrinsicsConfig);
    END_INTERFACE
  } IServiceComTIIntrinsicsConfigVtbl;
  interface IServiceComTIIntrinsicsConfig {
    CONST_VTBL struct IServiceComTIIntrinsicsConfigVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServiceComTIIntrinsicsConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServiceComTIIntrinsicsConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServiceComTIIntrinsicsConfig_Release(This) (This)->lpVtbl->Release(This)
#define IServiceComTIIntrinsicsConfig_ComTIIntrinsicsConfig(This,comtiIntrinsicsConfig) (This)->lpVtbl->ComTIIntrinsicsConfig(This,comtiIntrinsicsConfig)
#endif
#endif
  HRESULT WINAPI IServiceComTIIntrinsicsConfig_ComTIIntrinsicsConfig_Proxy(IServiceComTIIntrinsicsConfig *This,CSC_COMTIIntrinsicsConfig comtiIntrinsicsConfig);
  void __RPC_STUB IServiceComTIIntrinsicsConfig_ComTIIntrinsicsConfig_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServiceSxsConfig_INTERFACE_DEFINED__
#define __IServiceSxsConfig_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServiceSxsConfig;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServiceSxsConfig : public IUnknown {
  public:
    virtual HRESULT WINAPI SxsConfig(CSC_SxsConfig scsConfig) = 0;
    virtual HRESULT WINAPI SxsName(LPCWSTR szSxsName) = 0;
    virtual HRESULT WINAPI SxsDirectory(LPCWSTR szSxsDirectory) = 0;
  };
#else
  typedef struct IServiceSxsConfigVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServiceSxsConfig *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServiceSxsConfig *This);
      ULONG (WINAPI *Release)(IServiceSxsConfig *This);
      HRESULT (WINAPI *SxsConfig)(IServiceSxsConfig *This,CSC_SxsConfig scsConfig);
      HRESULT (WINAPI *SxsName)(IServiceSxsConfig *This,LPCWSTR szSxsName);
      HRESULT (WINAPI *SxsDirectory)(IServiceSxsConfig *This,LPCWSTR szSxsDirectory);
    END_INTERFACE
  } IServiceSxsConfigVtbl;
  interface IServiceSxsConfig {
    CONST_VTBL struct IServiceSxsConfigVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServiceSxsConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServiceSxsConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServiceSxsConfig_Release(This) (This)->lpVtbl->Release(This)
#define IServiceSxsConfig_SxsConfig(This,scsConfig) (This)->lpVtbl->SxsConfig(This,scsConfig)
#define IServiceSxsConfig_SxsName(This,szSxsName) (This)->lpVtbl->SxsName(This,szSxsName)
#define IServiceSxsConfig_SxsDirectory(This,szSxsDirectory) (This)->lpVtbl->SxsDirectory(This,szSxsDirectory)
#endif
#endif
  HRESULT WINAPI IServiceSxsConfig_SxsConfig_Proxy(IServiceSxsConfig *This,CSC_SxsConfig scsConfig);
  void __RPC_STUB IServiceSxsConfig_SxsConfig_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServiceSxsConfig_SxsName_Proxy(IServiceSxsConfig *This,LPCWSTR szSxsName);
  void __RPC_STUB IServiceSxsConfig_SxsName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServiceSxsConfig_SxsDirectory_Proxy(IServiceSxsConfig *This,LPCWSTR szSxsDirectory);
  void __RPC_STUB IServiceSxsConfig_SxsDirectory_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ICheckSxsConfig_INTERFACE_DEFINED__
#define __ICheckSxsConfig_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ICheckSxsConfig;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ICheckSxsConfig : public IUnknown {
  public:
    virtual HRESULT WINAPI IsSameSxsConfig(LPCWSTR wszSxsName,LPCWSTR wszSxsDirectory,LPCWSTR wszSxsAppName) = 0;
  };
#else
  typedef struct ICheckSxsConfigVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ICheckSxsConfig *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ICheckSxsConfig *This);
      ULONG (WINAPI *Release)(ICheckSxsConfig *This);
      HRESULT (WINAPI *IsSameSxsConfig)(ICheckSxsConfig *This,LPCWSTR wszSxsName,LPCWSTR wszSxsDirectory,LPCWSTR wszSxsAppName);
    END_INTERFACE
  } ICheckSxsConfigVtbl;
  interface ICheckSxsConfig {
    CONST_VTBL struct ICheckSxsConfigVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ICheckSxsConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICheckSxsConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICheckSxsConfig_Release(This) (This)->lpVtbl->Release(This)
#define ICheckSxsConfig_IsSameSxsConfig(This,wszSxsName,wszSxsDirectory,wszSxsAppName) (This)->lpVtbl->IsSameSxsConfig(This,wszSxsName,wszSxsDirectory,wszSxsAppName)
#endif
#endif
  HRESULT WINAPI ICheckSxsConfig_IsSameSxsConfig_Proxy(ICheckSxsConfig *This,LPCWSTR wszSxsName,LPCWSTR wszSxsDirectory,LPCWSTR wszSxsAppName);
  void __RPC_STUB ICheckSxsConfig_IsSameSxsConfig_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServiceInheritanceConfig_INTERFACE_DEFINED__
#define __IServiceInheritanceConfig_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServiceInheritanceConfig;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServiceInheritanceConfig : public IUnknown {
  public:
    virtual HRESULT WINAPI ContainingContextTreatment(CSC_InheritanceConfig inheritanceConfig) = 0;
  };
#else
  typedef struct IServiceInheritanceConfigVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServiceInheritanceConfig *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServiceInheritanceConfig *This);
      ULONG (WINAPI *Release)(IServiceInheritanceConfig *This);
      HRESULT (WINAPI *ContainingContextTreatment)(IServiceInheritanceConfig *This,CSC_InheritanceConfig inheritanceConfig);
    END_INTERFACE
  } IServiceInheritanceConfigVtbl;
  interface IServiceInheritanceConfig {
    CONST_VTBL struct IServiceInheritanceConfigVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServiceInheritanceConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServiceInheritanceConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServiceInheritanceConfig_Release(This) (This)->lpVtbl->Release(This)
#define IServiceInheritanceConfig_ContainingContextTreatment(This,inheritanceConfig) (This)->lpVtbl->ContainingContextTreatment(This,inheritanceConfig)
#endif
#endif
  HRESULT WINAPI IServiceInheritanceConfig_ContainingContextTreatment_Proxy(IServiceInheritanceConfig *This,CSC_InheritanceConfig inheritanceConfig);
  void __RPC_STUB IServiceInheritanceConfig_ContainingContextTreatment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServiceThreadPoolConfig_INTERFACE_DEFINED__
#define __IServiceThreadPoolConfig_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServiceThreadPoolConfig;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServiceThreadPoolConfig : public IUnknown {
  public:
    virtual HRESULT WINAPI SelectThreadPool(CSC_ThreadPool threadPool) = 0;
    virtual HRESULT WINAPI SetBindingInfo(CSC_Binding binding) = 0;
  };
#else
  typedef struct IServiceThreadPoolConfigVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServiceThreadPoolConfig *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServiceThreadPoolConfig *This);
      ULONG (WINAPI *Release)(IServiceThreadPoolConfig *This);
      HRESULT (WINAPI *SelectThreadPool)(IServiceThreadPoolConfig *This,CSC_ThreadPool threadPool);
      HRESULT (WINAPI *SetBindingInfo)(IServiceThreadPoolConfig *This,CSC_Binding binding);
    END_INTERFACE
  } IServiceThreadPoolConfigVtbl;
  interface IServiceThreadPoolConfig {
    CONST_VTBL struct IServiceThreadPoolConfigVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServiceThreadPoolConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServiceThreadPoolConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServiceThreadPoolConfig_Release(This) (This)->lpVtbl->Release(This)
#define IServiceThreadPoolConfig_SelectThreadPool(This,threadPool) (This)->lpVtbl->SelectThreadPool(This,threadPool)
#define IServiceThreadPoolConfig_SetBindingInfo(This,binding) (This)->lpVtbl->SetBindingInfo(This,binding)
#endif
#endif
  HRESULT WINAPI IServiceThreadPoolConfig_SelectThreadPool_Proxy(IServiceThreadPoolConfig *This,CSC_ThreadPool threadPool);
  void __RPC_STUB IServiceThreadPoolConfig_SelectThreadPool_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServiceThreadPoolConfig_SetBindingInfo_Proxy(IServiceThreadPoolConfig *This,CSC_Binding binding);
  void __RPC_STUB IServiceThreadPoolConfig_SetBindingInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServiceTransactionConfigBase_INTERFACE_DEFINED__
#define __IServiceTransactionConfigBase_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServiceTransactionConfigBase;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServiceTransactionConfigBase : public IUnknown {
  public:
    virtual HRESULT WINAPI ConfigureTransaction(CSC_TransactionConfig transactionConfig) = 0;
    virtual HRESULT WINAPI IsolationLevel(COMAdminTxIsolationLevelOptions option) = 0;
    virtual HRESULT WINAPI TransactionTimeout(ULONG ulTimeoutSec) = 0;
    virtual HRESULT WINAPI BringYourOwnTransaction(LPCWSTR szTipURL) = 0;
    virtual HRESULT WINAPI NewTransactionDescription(LPCWSTR szTxDesc) = 0;
  };
#else
  typedef struct IServiceTransactionConfigBaseVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServiceTransactionConfigBase *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServiceTransactionConfigBase *This);
      ULONG (WINAPI *Release)(IServiceTransactionConfigBase *This);
      HRESULT (WINAPI *ConfigureTransaction)(IServiceTransactionConfigBase *This,CSC_TransactionConfig transactionConfig);
      HRESULT (WINAPI *IsolationLevel)(IServiceTransactionConfigBase *This,COMAdminTxIsolationLevelOptions option);
      HRESULT (WINAPI *TransactionTimeout)(IServiceTransactionConfigBase *This,ULONG ulTimeoutSec);
      HRESULT (WINAPI *BringYourOwnTransaction)(IServiceTransactionConfigBase *This,LPCWSTR szTipURL);
      HRESULT (WINAPI *NewTransactionDescription)(IServiceTransactionConfigBase *This,LPCWSTR szTxDesc);
    END_INTERFACE
  } IServiceTransactionConfigBaseVtbl;
  interface IServiceTransactionConfigBase {
    CONST_VTBL struct IServiceTransactionConfigBaseVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServiceTransactionConfigBase_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServiceTransactionConfigBase_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServiceTransactionConfigBase_Release(This) (This)->lpVtbl->Release(This)
#define IServiceTransactionConfigBase_ConfigureTransaction(This,transactionConfig) (This)->lpVtbl->ConfigureTransaction(This,transactionConfig)
#define IServiceTransactionConfigBase_IsolationLevel(This,option) (This)->lpVtbl->IsolationLevel(This,option)
#define IServiceTransactionConfigBase_TransactionTimeout(This,ulTimeoutSec) (This)->lpVtbl->TransactionTimeout(This,ulTimeoutSec)
#define IServiceTransactionConfigBase_BringYourOwnTransaction(This,szTipURL) (This)->lpVtbl->BringYourOwnTransaction(This,szTipURL)
#define IServiceTransactionConfigBase_NewTransactionDescription(This,szTxDesc) (This)->lpVtbl->NewTransactionDescription(This,szTxDesc)
#endif
#endif
  HRESULT WINAPI IServiceTransactionConfigBase_ConfigureTransaction_Proxy(IServiceTransactionConfigBase *This,CSC_TransactionConfig transactionConfig);
  void __RPC_STUB IServiceTransactionConfigBase_ConfigureTransaction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServiceTransactionConfigBase_IsolationLevel_Proxy(IServiceTransactionConfigBase *This,COMAdminTxIsolationLevelOptions option);
  void __RPC_STUB IServiceTransactionConfigBase_IsolationLevel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServiceTransactionConfigBase_TransactionTimeout_Proxy(IServiceTransactionConfigBase *This,ULONG ulTimeoutSec);
  void __RPC_STUB IServiceTransactionConfigBase_TransactionTimeout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServiceTransactionConfigBase_BringYourOwnTransaction_Proxy(IServiceTransactionConfigBase *This,LPCWSTR szTipURL);
  void __RPC_STUB IServiceTransactionConfigBase_BringYourOwnTransaction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServiceTransactionConfigBase_NewTransactionDescription_Proxy(IServiceTransactionConfigBase *This,LPCWSTR szTxDesc);
  void __RPC_STUB IServiceTransactionConfigBase_NewTransactionDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServiceTransactionConfig_INTERFACE_DEFINED__
#define __IServiceTransactionConfig_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServiceTransactionConfig;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServiceTransactionConfig : public IServiceTransactionConfigBase {
  public:
    virtual HRESULT WINAPI ConfigureBYOT(ITransaction *pITxByot) = 0;
  };
#else
  typedef struct IServiceTransactionConfigVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServiceTransactionConfig *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServiceTransactionConfig *This);
      ULONG (WINAPI *Release)(IServiceTransactionConfig *This);
      HRESULT (WINAPI *ConfigureTransaction)(IServiceTransactionConfig *This,CSC_TransactionConfig transactionConfig);
      HRESULT (WINAPI *IsolationLevel)(IServiceTransactionConfig *This,COMAdminTxIsolationLevelOptions option);
      HRESULT (WINAPI *TransactionTimeout)(IServiceTransactionConfig *This,ULONG ulTimeoutSec);
      HRESULT (WINAPI *BringYourOwnTransaction)(IServiceTransactionConfig *This,LPCWSTR szTipURL);
      HRESULT (WINAPI *NewTransactionDescription)(IServiceTransactionConfig *This,LPCWSTR szTxDesc);
      HRESULT (WINAPI *ConfigureBYOT)(IServiceTransactionConfig *This,ITransaction *pITxByot);
    END_INTERFACE
  } IServiceTransactionConfigVtbl;
  interface IServiceTransactionConfig {
    CONST_VTBL struct IServiceTransactionConfigVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServiceTransactionConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServiceTransactionConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServiceTransactionConfig_Release(This) (This)->lpVtbl->Release(This)
#define IServiceTransactionConfig_ConfigureTransaction(This,transactionConfig) (This)->lpVtbl->ConfigureTransaction(This,transactionConfig)
#define IServiceTransactionConfig_IsolationLevel(This,option) (This)->lpVtbl->IsolationLevel(This,option)
#define IServiceTransactionConfig_TransactionTimeout(This,ulTimeoutSec) (This)->lpVtbl->TransactionTimeout(This,ulTimeoutSec)
#define IServiceTransactionConfig_BringYourOwnTransaction(This,szTipURL) (This)->lpVtbl->BringYourOwnTransaction(This,szTipURL)
#define IServiceTransactionConfig_NewTransactionDescription(This,szTxDesc) (This)->lpVtbl->NewTransactionDescription(This,szTxDesc)
#define IServiceTransactionConfig_ConfigureBYOT(This,pITxByot) (This)->lpVtbl->ConfigureBYOT(This,pITxByot)
#endif
#endif
  HRESULT WINAPI IServiceTransactionConfig_ConfigureBYOT_Proxy(IServiceTransactionConfig *This,ITransaction *pITxByot);
  void __RPC_STUB IServiceTransactionConfig_ConfigureBYOT_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServiceSynchronizationConfig_INTERFACE_DEFINED__
#define __IServiceSynchronizationConfig_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServiceSynchronizationConfig;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServiceSynchronizationConfig : public IUnknown {
  public:
    virtual HRESULT WINAPI ConfigureSynchronization(CSC_SynchronizationConfig synchConfig) = 0;
  };
#else
  typedef struct IServiceSynchronizationConfigVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServiceSynchronizationConfig *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServiceSynchronizationConfig *This);
      ULONG (WINAPI *Release)(IServiceSynchronizationConfig *This);
      HRESULT (WINAPI *ConfigureSynchronization)(IServiceSynchronizationConfig *This,CSC_SynchronizationConfig synchConfig);
    END_INTERFACE
  } IServiceSynchronizationConfigVtbl;
  interface IServiceSynchronizationConfig {
    CONST_VTBL struct IServiceSynchronizationConfigVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServiceSynchronizationConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServiceSynchronizationConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServiceSynchronizationConfig_Release(This) (This)->lpVtbl->Release(This)
#define IServiceSynchronizationConfig_ConfigureSynchronization(This,synchConfig) (This)->lpVtbl->ConfigureSynchronization(This,synchConfig)
#endif
#endif
  HRESULT WINAPI IServiceSynchronizationConfig_ConfigureSynchronization_Proxy(IServiceSynchronizationConfig *This,CSC_SynchronizationConfig synchConfig);
  void __RPC_STUB IServiceSynchronizationConfig_ConfigureSynchronization_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServiceTrackerConfig_INTERFACE_DEFINED__
#define __IServiceTrackerConfig_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServiceTrackerConfig;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServiceTrackerConfig : public IUnknown {
  public:
    virtual HRESULT WINAPI TrackerConfig(CSC_TrackerConfig trackerConfig,LPCWSTR szTrackerAppName,LPCWSTR szTrackerCtxName) = 0;
  };
#else
  typedef struct IServiceTrackerConfigVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServiceTrackerConfig *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServiceTrackerConfig *This);
      ULONG (WINAPI *Release)(IServiceTrackerConfig *This);
      HRESULT (WINAPI *TrackerConfig)(IServiceTrackerConfig *This,CSC_TrackerConfig trackerConfig,LPCWSTR szTrackerAppName,LPCWSTR szTrackerCtxName);
    END_INTERFACE
  } IServiceTrackerConfigVtbl;
  interface IServiceTrackerConfig {
    CONST_VTBL struct IServiceTrackerConfigVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServiceTrackerConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServiceTrackerConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServiceTrackerConfig_Release(This) (This)->lpVtbl->Release(This)
#define IServiceTrackerConfig_TrackerConfig(This,trackerConfig,szTrackerAppName,szTrackerCtxName) (This)->lpVtbl->TrackerConfig(This,trackerConfig,szTrackerAppName,szTrackerCtxName)
#endif
#endif
  HRESULT WINAPI IServiceTrackerConfig_TrackerConfig_Proxy(IServiceTrackerConfig *This,CSC_TrackerConfig trackerConfig,LPCWSTR szTrackerAppName,LPCWSTR szTrackerCtxName);
  void __RPC_STUB IServiceTrackerConfig_TrackerConfig_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServicePartitionConfig_INTERFACE_DEFINED__
#define __IServicePartitionConfig_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServicePartitionConfig;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServicePartitionConfig : public IUnknown {
  public:
    virtual HRESULT WINAPI PartitionConfig(CSC_PartitionConfig partitionConfig) = 0;
    virtual HRESULT WINAPI PartitionID(REFGUID guidPartitionID) = 0;
  };
#else
  typedef struct IServicePartitionConfigVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServicePartitionConfig *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServicePartitionConfig *This);
      ULONG (WINAPI *Release)(IServicePartitionConfig *This);
      HRESULT (WINAPI *PartitionConfig)(IServicePartitionConfig *This,CSC_PartitionConfig partitionConfig);
      HRESULT (WINAPI *PartitionID)(IServicePartitionConfig *This,REFGUID guidPartitionID);
    END_INTERFACE
  } IServicePartitionConfigVtbl;
  interface IServicePartitionConfig {
    CONST_VTBL struct IServicePartitionConfigVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServicePartitionConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServicePartitionConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServicePartitionConfig_Release(This) (This)->lpVtbl->Release(This)
#define IServicePartitionConfig_PartitionConfig(This,partitionConfig) (This)->lpVtbl->PartitionConfig(This,partitionConfig)
#define IServicePartitionConfig_PartitionID(This,guidPartitionID) (This)->lpVtbl->PartitionID(This,guidPartitionID)
#endif
#endif
  HRESULT WINAPI IServicePartitionConfig_PartitionConfig_Proxy(IServicePartitionConfig *This,CSC_PartitionConfig partitionConfig);
  void __RPC_STUB IServicePartitionConfig_PartitionConfig_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServicePartitionConfig_PartitionID_Proxy(IServicePartitionConfig *This,REFGUID guidPartitionID);
  void __RPC_STUB IServicePartitionConfig_PartitionID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServiceCall_INTERFACE_DEFINED__
#define __IServiceCall_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServiceCall;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServiceCall : public IUnknown {
  public:
    virtual HRESULT WINAPI OnCall(void) = 0;
  };
#else
  typedef struct IServiceCallVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServiceCall *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServiceCall *This);
      ULONG (WINAPI *Release)(IServiceCall *This);
      HRESULT (WINAPI *OnCall)(IServiceCall *This);
    END_INTERFACE
  } IServiceCallVtbl;
  interface IServiceCall {
    CONST_VTBL struct IServiceCallVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServiceCall_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServiceCall_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServiceCall_Release(This) (This)->lpVtbl->Release(This)
#define IServiceCall_OnCall(This) (This)->lpVtbl->OnCall(This)
#endif
#endif
  HRESULT WINAPI IServiceCall_OnCall_Proxy(IServiceCall *This);
  void __RPC_STUB IServiceCall_OnCall_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IAsyncErrorNotify_INTERFACE_DEFINED__
#define __IAsyncErrorNotify_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IAsyncErrorNotify;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IAsyncErrorNotify : public IUnknown {
  public:
    virtual HRESULT WINAPI OnError(HRESULT hr) = 0;
  };
#else
  typedef struct IAsyncErrorNotifyVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IAsyncErrorNotify *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IAsyncErrorNotify *This);
      ULONG (WINAPI *Release)(IAsyncErrorNotify *This);
      HRESULT (WINAPI *OnError)(IAsyncErrorNotify *This,HRESULT hr);
    END_INTERFACE
  } IAsyncErrorNotifyVtbl;
  interface IAsyncErrorNotify {
    CONST_VTBL struct IAsyncErrorNotifyVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IAsyncErrorNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAsyncErrorNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAsyncErrorNotify_Release(This) (This)->lpVtbl->Release(This)
#define IAsyncErrorNotify_OnError(This,hr) (This)->lpVtbl->OnError(This,hr)
#endif
#endif
  HRESULT WINAPI IAsyncErrorNotify_OnError_Proxy(IAsyncErrorNotify *This,HRESULT hr);
  void __RPC_STUB IAsyncErrorNotify_OnError_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServiceActivity_INTERFACE_DEFINED__
#define __IServiceActivity_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServiceActivity;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServiceActivity : public IUnknown {
  public:
    virtual HRESULT WINAPI SynchronousCall(IServiceCall *pIServiceCall) = 0;
    virtual HRESULT WINAPI AsynchronousCall(IServiceCall *pIServiceCall) = 0;
    virtual HRESULT WINAPI BindToCurrentThread(void) = 0;
    virtual HRESULT WINAPI UnbindFromThread(void) = 0;
  };
#else
  typedef struct IServiceActivityVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServiceActivity *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServiceActivity *This);
      ULONG (WINAPI *Release)(IServiceActivity *This);
      HRESULT (WINAPI *SynchronousCall)(IServiceActivity *This,IServiceCall *pIServiceCall);
      HRESULT (WINAPI *AsynchronousCall)(IServiceActivity *This,IServiceCall *pIServiceCall);
      HRESULT (WINAPI *BindToCurrentThread)(IServiceActivity *This);
      HRESULT (WINAPI *UnbindFromThread)(IServiceActivity *This);
    END_INTERFACE
  } IServiceActivityVtbl;
  interface IServiceActivity {
    CONST_VTBL struct IServiceActivityVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServiceActivity_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServiceActivity_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServiceActivity_Release(This) (This)->lpVtbl->Release(This)
#define IServiceActivity_SynchronousCall(This,pIServiceCall) (This)->lpVtbl->SynchronousCall(This,pIServiceCall)
#define IServiceActivity_AsynchronousCall(This,pIServiceCall) (This)->lpVtbl->AsynchronousCall(This,pIServiceCall)
#define IServiceActivity_BindToCurrentThread(This) (This)->lpVtbl->BindToCurrentThread(This)
#define IServiceActivity_UnbindFromThread(This) (This)->lpVtbl->UnbindFromThread(This)
#endif
#endif
  HRESULT WINAPI IServiceActivity_SynchronousCall_Proxy(IServiceActivity *This,IServiceCall *pIServiceCall);
  void __RPC_STUB IServiceActivity_SynchronousCall_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServiceActivity_AsynchronousCall_Proxy(IServiceActivity *This,IServiceCall *pIServiceCall);
  void __RPC_STUB IServiceActivity_AsynchronousCall_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServiceActivity_BindToCurrentThread_Proxy(IServiceActivity *This);
  void __RPC_STUB IServiceActivity_BindToCurrentThread_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServiceActivity_UnbindFromThread_Proxy(IServiceActivity *This);
  void __RPC_STUB IServiceActivity_UnbindFromThread_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IThreadPoolKnobs_INTERFACE_DEFINED__
#define __IThreadPoolKnobs_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IThreadPoolKnobs;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IThreadPoolKnobs : public IUnknown {
  public:
    virtual HRESULT WINAPI GetMaxThreads(long *plcMaxThreads) = 0;
    virtual HRESULT WINAPI GetCurrentThreads(long *plcCurrentThreads) = 0;
    virtual HRESULT WINAPI SetMaxThreads(long lcMaxThreads) = 0;
    virtual HRESULT WINAPI GetDeleteDelay(long *pmsecDeleteDelay) = 0;
    virtual HRESULT WINAPI SetDeleteDelay(long msecDeleteDelay) = 0;
    virtual HRESULT WINAPI GetMaxQueuedRequests(long *plcMaxQueuedRequests) = 0;
    virtual HRESULT WINAPI GetCurrentQueuedRequests(long *plcCurrentQueuedRequests) = 0;
    virtual HRESULT WINAPI SetMaxQueuedRequests(long lcMaxQueuedRequests) = 0;
    virtual HRESULT WINAPI SetMinThreads(long lcMinThreads) = 0;
    virtual HRESULT WINAPI SetQueueDepth(long lcQueueDepth) = 0;
  };
#else
  typedef struct IThreadPoolKnobsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IThreadPoolKnobs *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IThreadPoolKnobs *This);
      ULONG (WINAPI *Release)(IThreadPoolKnobs *This);
      HRESULT (WINAPI *GetMaxThreads)(IThreadPoolKnobs *This,long *plcMaxThreads);
      HRESULT (WINAPI *GetCurrentThreads)(IThreadPoolKnobs *This,long *plcCurrentThreads);
      HRESULT (WINAPI *SetMaxThreads)(IThreadPoolKnobs *This,long lcMaxThreads);
      HRESULT (WINAPI *GetDeleteDelay)(IThreadPoolKnobs *This,long *pmsecDeleteDelay);
      HRESULT (WINAPI *SetDeleteDelay)(IThreadPoolKnobs *This,long msecDeleteDelay);
      HRESULT (WINAPI *GetMaxQueuedRequests)(IThreadPoolKnobs *This,long *plcMaxQueuedRequests);
      HRESULT (WINAPI *GetCurrentQueuedRequests)(IThreadPoolKnobs *This,long *plcCurrentQueuedRequests);
      HRESULT (WINAPI *SetMaxQueuedRequests)(IThreadPoolKnobs *This,long lcMaxQueuedRequests);
      HRESULT (WINAPI *SetMinThreads)(IThreadPoolKnobs *This,long lcMinThreads);
      HRESULT (WINAPI *SetQueueDepth)(IThreadPoolKnobs *This,long lcQueueDepth);
    END_INTERFACE
  } IThreadPoolKnobsVtbl;
  interface IThreadPoolKnobs {
    CONST_VTBL struct IThreadPoolKnobsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IThreadPoolKnobs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IThreadPoolKnobs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IThreadPoolKnobs_Release(This) (This)->lpVtbl->Release(This)
#define IThreadPoolKnobs_GetMaxThreads(This,plcMaxThreads) (This)->lpVtbl->GetMaxThreads(This,plcMaxThreads)
#define IThreadPoolKnobs_GetCurrentThreads(This,plcCurrentThreads) (This)->lpVtbl->GetCurrentThreads(This,plcCurrentThreads)
#define IThreadPoolKnobs_SetMaxThreads(This,lcMaxThreads) (This)->lpVtbl->SetMaxThreads(This,lcMaxThreads)
#define IThreadPoolKnobs_GetDeleteDelay(This,pmsecDeleteDelay) (This)->lpVtbl->GetDeleteDelay(This,pmsecDeleteDelay)
#define IThreadPoolKnobs_SetDeleteDelay(This,msecDeleteDelay) (This)->lpVtbl->SetDeleteDelay(This,msecDeleteDelay)
#define IThreadPoolKnobs_GetMaxQueuedRequests(This,plcMaxQueuedRequests) (This)->lpVtbl->GetMaxQueuedRequests(This,plcMaxQueuedRequests)
#define IThreadPoolKnobs_GetCurrentQueuedRequests(This,plcCurrentQueuedRequests) (This)->lpVtbl->GetCurrentQueuedRequests(This,plcCurrentQueuedRequests)
#define IThreadPoolKnobs_SetMaxQueuedRequests(This,lcMaxQueuedRequests) (This)->lpVtbl->SetMaxQueuedRequests(This,lcMaxQueuedRequests)
#define IThreadPoolKnobs_SetMinThreads(This,lcMinThreads) (This)->lpVtbl->SetMinThreads(This,lcMinThreads)
#define IThreadPoolKnobs_SetQueueDepth(This,lcQueueDepth) (This)->lpVtbl->SetQueueDepth(This,lcQueueDepth)
#endif
#endif
  HRESULT WINAPI IThreadPoolKnobs_GetMaxThreads_Proxy(IThreadPoolKnobs *This,long *plcMaxThreads);
  void __RPC_STUB IThreadPoolKnobs_GetMaxThreads_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IThreadPoolKnobs_GetCurrentThreads_Proxy(IThreadPoolKnobs *This,long *plcCurrentThreads);
  void __RPC_STUB IThreadPoolKnobs_GetCurrentThreads_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IThreadPoolKnobs_SetMaxThreads_Proxy(IThreadPoolKnobs *This,long lcMaxThreads);
  void __RPC_STUB IThreadPoolKnobs_SetMaxThreads_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IThreadPoolKnobs_GetDeleteDelay_Proxy(IThreadPoolKnobs *This,long *pmsecDeleteDelay);
  void __RPC_STUB IThreadPoolKnobs_GetDeleteDelay_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IThreadPoolKnobs_SetDeleteDelay_Proxy(IThreadPoolKnobs *This,long msecDeleteDelay);
  void __RPC_STUB IThreadPoolKnobs_SetDeleteDelay_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IThreadPoolKnobs_GetMaxQueuedRequests_Proxy(IThreadPoolKnobs *This,long *plcMaxQueuedRequests);
  void __RPC_STUB IThreadPoolKnobs_GetMaxQueuedRequests_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IThreadPoolKnobs_GetCurrentQueuedRequests_Proxy(IThreadPoolKnobs *This,long *plcCurrentQueuedRequests);
  void __RPC_STUB IThreadPoolKnobs_GetCurrentQueuedRequests_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IThreadPoolKnobs_SetMaxQueuedRequests_Proxy(IThreadPoolKnobs *This,long lcMaxQueuedRequests);
  void __RPC_STUB IThreadPoolKnobs_SetMaxQueuedRequests_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IThreadPoolKnobs_SetMinThreads_Proxy(IThreadPoolKnobs *This,long lcMinThreads);
  void __RPC_STUB IThreadPoolKnobs_SetMinThreads_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IThreadPoolKnobs_SetQueueDepth_Proxy(IThreadPoolKnobs *This,long lcQueueDepth);
  void __RPC_STUB IThreadPoolKnobs_SetQueueDepth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComStaThreadPoolKnobs_INTERFACE_DEFINED__
#define __IComStaThreadPoolKnobs_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComStaThreadPoolKnobs;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComStaThreadPoolKnobs : public IUnknown {
  public:
    virtual HRESULT WINAPI SetMinThreadCount(DWORD minThreads) = 0;
    virtual HRESULT WINAPI GetMinThreadCount(DWORD *minThreads) = 0;
    virtual HRESULT WINAPI SetMaxThreadCount(DWORD maxThreads) = 0;
    virtual HRESULT WINAPI GetMaxThreadCount(DWORD *maxThreads) = 0;
    virtual HRESULT WINAPI SetActivityPerThread(DWORD activitiesPerThread) = 0;
    virtual HRESULT WINAPI GetActivityPerThread(DWORD *activitiesPerThread) = 0;
    virtual HRESULT WINAPI SetActivityRatio(DOUBLE activityRatio) = 0;
    virtual HRESULT WINAPI GetActivityRatio(DOUBLE *activityRatio) = 0;
    virtual HRESULT WINAPI GetThreadCount(DWORD *pdwThreads) = 0;
    virtual HRESULT WINAPI GetQueueDepth(DWORD *pdwQDepth) = 0;
    virtual HRESULT WINAPI SetQueueDepth(long dwQDepth) = 0;
  };
#else
  typedef struct IComStaThreadPoolKnobsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComStaThreadPoolKnobs *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComStaThreadPoolKnobs *This);
      ULONG (WINAPI *Release)(IComStaThreadPoolKnobs *This);
      HRESULT (WINAPI *SetMinThreadCount)(IComStaThreadPoolKnobs *This,DWORD minThreads);
      HRESULT (WINAPI *GetMinThreadCount)(IComStaThreadPoolKnobs *This,DWORD *minThreads);
      HRESULT (WINAPI *SetMaxThreadCount)(IComStaThreadPoolKnobs *This,DWORD maxThreads);
      HRESULT (WINAPI *GetMaxThreadCount)(IComStaThreadPoolKnobs *This,DWORD *maxThreads);
      HRESULT (WINAPI *SetActivityPerThread)(IComStaThreadPoolKnobs *This,DWORD activitiesPerThread);
      HRESULT (WINAPI *GetActivityPerThread)(IComStaThreadPoolKnobs *This,DWORD *activitiesPerThread);
      HRESULT (WINAPI *SetActivityRatio)(IComStaThreadPoolKnobs *This,DOUBLE activityRatio);
      HRESULT (WINAPI *GetActivityRatio)(IComStaThreadPoolKnobs *This,DOUBLE *activityRatio);
      HRESULT (WINAPI *GetThreadCount)(IComStaThreadPoolKnobs *This,DWORD *pdwThreads);
      HRESULT (WINAPI *GetQueueDepth)(IComStaThreadPoolKnobs *This,DWORD *pdwQDepth);
      HRESULT (WINAPI *SetQueueDepth)(IComStaThreadPoolKnobs *This,long dwQDepth);
    END_INTERFACE
  } IComStaThreadPoolKnobsVtbl;
  interface IComStaThreadPoolKnobs {
    CONST_VTBL struct IComStaThreadPoolKnobsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComStaThreadPoolKnobs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComStaThreadPoolKnobs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComStaThreadPoolKnobs_Release(This) (This)->lpVtbl->Release(This)
#define IComStaThreadPoolKnobs_SetMinThreadCount(This,minThreads) (This)->lpVtbl->SetMinThreadCount(This,minThreads)
#define IComStaThreadPoolKnobs_GetMinThreadCount(This,minThreads) (This)->lpVtbl->GetMinThreadCount(This,minThreads)
#define IComStaThreadPoolKnobs_SetMaxThreadCount(This,maxThreads) (This)->lpVtbl->SetMaxThreadCount(This,maxThreads)
#define IComStaThreadPoolKnobs_GetMaxThreadCount(This,maxThreads) (This)->lpVtbl->GetMaxThreadCount(This,maxThreads)
#define IComStaThreadPoolKnobs_SetActivityPerThread(This,activitiesPerThread) (This)->lpVtbl->SetActivityPerThread(This,activitiesPerThread)
#define IComStaThreadPoolKnobs_GetActivityPerThread(This,activitiesPerThread) (This)->lpVtbl->GetActivityPerThread(This,activitiesPerThread)
#define IComStaThreadPoolKnobs_SetActivityRatio(This,activityRatio) (This)->lpVtbl->SetActivityRatio(This,activityRatio)
#define IComStaThreadPoolKnobs_GetActivityRatio(This,activityRatio) (This)->lpVtbl->GetActivityRatio(This,activityRatio)
#define IComStaThreadPoolKnobs_GetThreadCount(This,pdwThreads) (This)->lpVtbl->GetThreadCount(This,pdwThreads)
#define IComStaThreadPoolKnobs_GetQueueDepth(This,pdwQDepth) (This)->lpVtbl->GetQueueDepth(This,pdwQDepth)
#define IComStaThreadPoolKnobs_SetQueueDepth(This,dwQDepth) (This)->lpVtbl->SetQueueDepth(This,dwQDepth)
#endif
#endif
  HRESULT WINAPI IComStaThreadPoolKnobs_SetMinThreadCount_Proxy(IComStaThreadPoolKnobs *This,DWORD minThreads);
  void __RPC_STUB IComStaThreadPoolKnobs_SetMinThreadCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs_GetMinThreadCount_Proxy(IComStaThreadPoolKnobs *This,DWORD *minThreads);
  void __RPC_STUB IComStaThreadPoolKnobs_GetMinThreadCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs_SetMaxThreadCount_Proxy(IComStaThreadPoolKnobs *This,DWORD maxThreads);
  void __RPC_STUB IComStaThreadPoolKnobs_SetMaxThreadCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs_GetMaxThreadCount_Proxy(IComStaThreadPoolKnobs *This,DWORD *maxThreads);
  void __RPC_STUB IComStaThreadPoolKnobs_GetMaxThreadCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs_SetActivityPerThread_Proxy(IComStaThreadPoolKnobs *This,DWORD activitiesPerThread);
  void __RPC_STUB IComStaThreadPoolKnobs_SetActivityPerThread_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs_GetActivityPerThread_Proxy(IComStaThreadPoolKnobs *This,DWORD *activitiesPerThread);
  void __RPC_STUB IComStaThreadPoolKnobs_GetActivityPerThread_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs_SetActivityRatio_Proxy(IComStaThreadPoolKnobs *This,DOUBLE activityRatio);
  void __RPC_STUB IComStaThreadPoolKnobs_SetActivityRatio_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs_GetActivityRatio_Proxy(IComStaThreadPoolKnobs *This,DOUBLE *activityRatio);
  void __RPC_STUB IComStaThreadPoolKnobs_GetActivityRatio_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs_GetThreadCount_Proxy(IComStaThreadPoolKnobs *This,DWORD *pdwThreads);
  void __RPC_STUB IComStaThreadPoolKnobs_GetThreadCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs_GetQueueDepth_Proxy(IComStaThreadPoolKnobs *This,DWORD *pdwQDepth);
  void __RPC_STUB IComStaThreadPoolKnobs_GetQueueDepth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs_SetQueueDepth_Proxy(IComStaThreadPoolKnobs *This,long dwQDepth);
  void __RPC_STUB IComStaThreadPoolKnobs_SetQueueDepth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComMtaThreadPoolKnobs_INTERFACE_DEFINED__
#define __IComMtaThreadPoolKnobs_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComMtaThreadPoolKnobs;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComMtaThreadPoolKnobs : public IUnknown {
  public:
    virtual HRESULT WINAPI MTASetMaxThreadCount(DWORD dwMaxThreads) = 0;
    virtual HRESULT WINAPI MTAGetMaxThreadCount(DWORD *pdwMaxThreads) = 0;
    virtual HRESULT WINAPI MTASetThrottleValue(DWORD dwThrottle) = 0;
    virtual HRESULT WINAPI MTAGetThrottleValue(DWORD *pdwThrottle) = 0;
  };
#else
  typedef struct IComMtaThreadPoolKnobsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComMtaThreadPoolKnobs *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComMtaThreadPoolKnobs *This);
      ULONG (WINAPI *Release)(IComMtaThreadPoolKnobs *This);
      HRESULT (WINAPI *MTASetMaxThreadCount)(IComMtaThreadPoolKnobs *This,DWORD dwMaxThreads);
      HRESULT (WINAPI *MTAGetMaxThreadCount)(IComMtaThreadPoolKnobs *This,DWORD *pdwMaxThreads);
      HRESULT (WINAPI *MTASetThrottleValue)(IComMtaThreadPoolKnobs *This,DWORD dwThrottle);
      HRESULT (WINAPI *MTAGetThrottleValue)(IComMtaThreadPoolKnobs *This,DWORD *pdwThrottle);
    END_INTERFACE
  } IComMtaThreadPoolKnobsVtbl;
  interface IComMtaThreadPoolKnobs {
    CONST_VTBL struct IComMtaThreadPoolKnobsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComMtaThreadPoolKnobs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComMtaThreadPoolKnobs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComMtaThreadPoolKnobs_Release(This) (This)->lpVtbl->Release(This)
#define IComMtaThreadPoolKnobs_MTASetMaxThreadCount(This,dwMaxThreads) (This)->lpVtbl->MTASetMaxThreadCount(This,dwMaxThreads)
#define IComMtaThreadPoolKnobs_MTAGetMaxThreadCount(This,pdwMaxThreads) (This)->lpVtbl->MTAGetMaxThreadCount(This,pdwMaxThreads)
#define IComMtaThreadPoolKnobs_MTASetThrottleValue(This,dwThrottle) (This)->lpVtbl->MTASetThrottleValue(This,dwThrottle)
#define IComMtaThreadPoolKnobs_MTAGetThrottleValue(This,pdwThrottle) (This)->lpVtbl->MTAGetThrottleValue(This,pdwThrottle)
#endif
#endif
  HRESULT WINAPI IComMtaThreadPoolKnobs_MTASetMaxThreadCount_Proxy(IComMtaThreadPoolKnobs *This,DWORD dwMaxThreads);
  void __RPC_STUB IComMtaThreadPoolKnobs_MTASetMaxThreadCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComMtaThreadPoolKnobs_MTAGetMaxThreadCount_Proxy(IComMtaThreadPoolKnobs *This,DWORD *pdwMaxThreads);
  void __RPC_STUB IComMtaThreadPoolKnobs_MTAGetMaxThreadCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComMtaThreadPoolKnobs_MTASetThrottleValue_Proxy(IComMtaThreadPoolKnobs *This,DWORD dwThrottle);
  void __RPC_STUB IComMtaThreadPoolKnobs_MTASetThrottleValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComMtaThreadPoolKnobs_MTAGetThrottleValue_Proxy(IComMtaThreadPoolKnobs *This,DWORD *pdwThrottle);
  void __RPC_STUB IComMtaThreadPoolKnobs_MTAGetThrottleValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IComStaThreadPoolKnobs2_INTERFACE_DEFINED__
#define __IComStaThreadPoolKnobs2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IComStaThreadPoolKnobs2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IComStaThreadPoolKnobs2 : public IComStaThreadPoolKnobs {
  public:
    virtual HRESULT WINAPI GetMaxCPULoad(DWORD *pdwLoad) = 0;
    virtual HRESULT WINAPI SetMaxCPULoad(long pdwLoad) = 0;
    virtual HRESULT WINAPI GetCPUMetricEnabled(WINBOOL *pbMetricEnabled) = 0;
    virtual HRESULT WINAPI SetCPUMetricEnabled(WINBOOL bMetricEnabled) = 0;
    virtual HRESULT WINAPI GetCreateThreadsAggressively(WINBOOL *pbMetricEnabled) = 0;
    virtual HRESULT WINAPI SetCreateThreadsAggressively(WINBOOL bMetricEnabled) = 0;
    virtual HRESULT WINAPI GetMaxCSR(DWORD *pdwCSR) = 0;
    virtual HRESULT WINAPI SetMaxCSR(long dwCSR) = 0;
    virtual HRESULT WINAPI GetWaitTimeForThreadCleanup(DWORD *pdwThreadCleanupWaitTime) = 0;
    virtual HRESULT WINAPI SetWaitTimeForThreadCleanup(long dwThreadCleanupWaitTime) = 0;
  };
#else
  typedef struct IComStaThreadPoolKnobs2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IComStaThreadPoolKnobs2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IComStaThreadPoolKnobs2 *This);
      ULONG (WINAPI *Release)(IComStaThreadPoolKnobs2 *This);
      HRESULT (WINAPI *SetMinThreadCount)(IComStaThreadPoolKnobs2 *This,DWORD minThreads);
      HRESULT (WINAPI *GetMinThreadCount)(IComStaThreadPoolKnobs2 *This,DWORD *minThreads);
      HRESULT (WINAPI *SetMaxThreadCount)(IComStaThreadPoolKnobs2 *This,DWORD maxThreads);
      HRESULT (WINAPI *GetMaxThreadCount)(IComStaThreadPoolKnobs2 *This,DWORD *maxThreads);
      HRESULT (WINAPI *SetActivityPerThread)(IComStaThreadPoolKnobs2 *This,DWORD activitiesPerThread);
      HRESULT (WINAPI *GetActivityPerThread)(IComStaThreadPoolKnobs2 *This,DWORD *activitiesPerThread);
      HRESULT (WINAPI *SetActivityRatio)(IComStaThreadPoolKnobs2 *This,DOUBLE activityRatio);
      HRESULT (WINAPI *GetActivityRatio)(IComStaThreadPoolKnobs2 *This,DOUBLE *activityRatio);
      HRESULT (WINAPI *GetThreadCount)(IComStaThreadPoolKnobs2 *This,DWORD *pdwThreads);
      HRESULT (WINAPI *GetQueueDepth)(IComStaThreadPoolKnobs2 *This,DWORD *pdwQDepth);
      HRESULT (WINAPI *SetQueueDepth)(IComStaThreadPoolKnobs2 *This,long dwQDepth);
      HRESULT (WINAPI *GetMaxCPULoad)(IComStaThreadPoolKnobs2 *This,DWORD *pdwLoad);
      HRESULT (WINAPI *SetMaxCPULoad)(IComStaThreadPoolKnobs2 *This,long pdwLoad);
      HRESULT (WINAPI *GetCPUMetricEnabled)(IComStaThreadPoolKnobs2 *This,WINBOOL *pbMetricEnabled);
      HRESULT (WINAPI *SetCPUMetricEnabled)(IComStaThreadPoolKnobs2 *This,WINBOOL bMetricEnabled);
      HRESULT (WINAPI *GetCreateThreadsAggressively)(IComStaThreadPoolKnobs2 *This,WINBOOL *pbMetricEnabled);
      HRESULT (WINAPI *SetCreateThreadsAggressively)(IComStaThreadPoolKnobs2 *This,WINBOOL bMetricEnabled);
      HRESULT (WINAPI *GetMaxCSR)(IComStaThreadPoolKnobs2 *This,DWORD *pdwCSR);
      HRESULT (WINAPI *SetMaxCSR)(IComStaThreadPoolKnobs2 *This,long dwCSR);
      HRESULT (WINAPI *GetWaitTimeForThreadCleanup)(IComStaThreadPoolKnobs2 *This,DWORD *pdwThreadCleanupWaitTime);
      HRESULT (WINAPI *SetWaitTimeForThreadCleanup)(IComStaThreadPoolKnobs2 *This,long dwThreadCleanupWaitTime);
    END_INTERFACE
  } IComStaThreadPoolKnobs2Vtbl;
  interface IComStaThreadPoolKnobs2 {
    CONST_VTBL struct IComStaThreadPoolKnobs2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IComStaThreadPoolKnobs2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComStaThreadPoolKnobs2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComStaThreadPoolKnobs2_Release(This) (This)->lpVtbl->Release(This)
#define IComStaThreadPoolKnobs2_SetMinThreadCount(This,minThreads) (This)->lpVtbl->SetMinThreadCount(This,minThreads)
#define IComStaThreadPoolKnobs2_GetMinThreadCount(This,minThreads) (This)->lpVtbl->GetMinThreadCount(This,minThreads)
#define IComStaThreadPoolKnobs2_SetMaxThreadCount(This,maxThreads) (This)->lpVtbl->SetMaxThreadCount(This,maxThreads)
#define IComStaThreadPoolKnobs2_GetMaxThreadCount(This,maxThreads) (This)->lpVtbl->GetMaxThreadCount(This,maxThreads)
#define IComStaThreadPoolKnobs2_SetActivityPerThread(This,activitiesPerThread) (This)->lpVtbl->SetActivityPerThread(This,activitiesPerThread)
#define IComStaThreadPoolKnobs2_GetActivityPerThread(This,activitiesPerThread) (This)->lpVtbl->GetActivityPerThread(This,activitiesPerThread)
#define IComStaThreadPoolKnobs2_SetActivityRatio(This,activityRatio) (This)->lpVtbl->SetActivityRatio(This,activityRatio)
#define IComStaThreadPoolKnobs2_GetActivityRatio(This,activityRatio) (This)->lpVtbl->GetActivityRatio(This,activityRatio)
#define IComStaThreadPoolKnobs2_GetThreadCount(This,pdwThreads) (This)->lpVtbl->GetThreadCount(This,pdwThreads)
#define IComStaThreadPoolKnobs2_GetQueueDepth(This,pdwQDepth) (This)->lpVtbl->GetQueueDepth(This,pdwQDepth)
#define IComStaThreadPoolKnobs2_SetQueueDepth(This,dwQDepth) (This)->lpVtbl->SetQueueDepth(This,dwQDepth)
#define IComStaThreadPoolKnobs2_GetMaxCPULoad(This,pdwLoad) (This)->lpVtbl->GetMaxCPULoad(This,pdwLoad)
#define IComStaThreadPoolKnobs2_SetMaxCPULoad(This,pdwLoad) (This)->lpVtbl->SetMaxCPULoad(This,pdwLoad)
#define IComStaThreadPoolKnobs2_GetCPUMetricEnabled(This,pbMetricEnabled) (This)->lpVtbl->GetCPUMetricEnabled(This,pbMetricEnabled)
#define IComStaThreadPoolKnobs2_SetCPUMetricEnabled(This,bMetricEnabled) (This)->lpVtbl->SetCPUMetricEnabled(This,bMetricEnabled)
#define IComStaThreadPoolKnobs2_GetCreateThreadsAggressively(This,pbMetricEnabled) (This)->lpVtbl->GetCreateThreadsAggressively(This,pbMetricEnabled)
#define IComStaThreadPoolKnobs2_SetCreateThreadsAggressively(This,bMetricEnabled) (This)->lpVtbl->SetCreateThreadsAggressively(This,bMetricEnabled)
#define IComStaThreadPoolKnobs2_GetMaxCSR(This,pdwCSR) (This)->lpVtbl->GetMaxCSR(This,pdwCSR)
#define IComStaThreadPoolKnobs2_SetMaxCSR(This,dwCSR) (This)->lpVtbl->SetMaxCSR(This,dwCSR)
#define IComStaThreadPoolKnobs2_GetWaitTimeForThreadCleanup(This,pdwThreadCleanupWaitTime) (This)->lpVtbl->GetWaitTimeForThreadCleanup(This,pdwThreadCleanupWaitTime)
#define IComStaThreadPoolKnobs2_SetWaitTimeForThreadCleanup(This,dwThreadCleanupWaitTime) (This)->lpVtbl->SetWaitTimeForThreadCleanup(This,dwThreadCleanupWaitTime)
#endif
#endif
  HRESULT WINAPI IComStaThreadPoolKnobs2_GetMaxCPULoad_Proxy(IComStaThreadPoolKnobs2 *This,DWORD *pdwLoad);
  void __RPC_STUB IComStaThreadPoolKnobs2_GetMaxCPULoad_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs2_SetMaxCPULoad_Proxy(IComStaThreadPoolKnobs2 *This,long pdwLoad);
  void __RPC_STUB IComStaThreadPoolKnobs2_SetMaxCPULoad_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs2_GetCPUMetricEnabled_Proxy(IComStaThreadPoolKnobs2 *This,WINBOOL *pbMetricEnabled);
  void __RPC_STUB IComStaThreadPoolKnobs2_GetCPUMetricEnabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs2_SetCPUMetricEnabled_Proxy(IComStaThreadPoolKnobs2 *This,WINBOOL bMetricEnabled);
  void __RPC_STUB IComStaThreadPoolKnobs2_SetCPUMetricEnabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs2_GetCreateThreadsAggressively_Proxy(IComStaThreadPoolKnobs2 *This,WINBOOL *pbMetricEnabled);
  void __RPC_STUB IComStaThreadPoolKnobs2_GetCreateThreadsAggressively_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs2_SetCreateThreadsAggressively_Proxy(IComStaThreadPoolKnobs2 *This,WINBOOL bMetricEnabled);
  void __RPC_STUB IComStaThreadPoolKnobs2_SetCreateThreadsAggressively_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs2_GetMaxCSR_Proxy(IComStaThreadPoolKnobs2 *This,DWORD *pdwCSR);
  void __RPC_STUB IComStaThreadPoolKnobs2_GetMaxCSR_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs2_SetMaxCSR_Proxy(IComStaThreadPoolKnobs2 *This,long dwCSR);
  void __RPC_STUB IComStaThreadPoolKnobs2_SetMaxCSR_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs2_GetWaitTimeForThreadCleanup_Proxy(IComStaThreadPoolKnobs2 *This,DWORD *pdwThreadCleanupWaitTime);
  void __RPC_STUB IComStaThreadPoolKnobs2_GetWaitTimeForThreadCleanup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IComStaThreadPoolKnobs2_SetWaitTimeForThreadCleanup_Proxy(IComStaThreadPoolKnobs2 *This,long dwThreadCleanupWaitTime);
  void __RPC_STUB IComStaThreadPoolKnobs2_SetWaitTimeForThreadCleanup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IProcessInitializer_INTERFACE_DEFINED__
#define __IProcessInitializer_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IProcessInitializer;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IProcessInitializer : public IUnknown {
  public:
    virtual HRESULT WINAPI Startup(IUnknown *punkProcessControl) = 0;
    virtual HRESULT WINAPI Shutdown(void) = 0;
  };
#else
  typedef struct IProcessInitializerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IProcessInitializer *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IProcessInitializer *This);
      ULONG (WINAPI *Release)(IProcessInitializer *This);
      HRESULT (WINAPI *Startup)(IProcessInitializer *This,IUnknown *punkProcessControl);
      HRESULT (WINAPI *Shutdown)(IProcessInitializer *This);
    END_INTERFACE
  } IProcessInitializerVtbl;
  interface IProcessInitializer {
    CONST_VTBL struct IProcessInitializerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IProcessInitializer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IProcessInitializer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IProcessInitializer_Release(This) (This)->lpVtbl->Release(This)
#define IProcessInitializer_Startup(This,punkProcessControl) (This)->lpVtbl->Startup(This,punkProcessControl)
#define IProcessInitializer_Shutdown(This) (This)->lpVtbl->Shutdown(This)
#endif
#endif
  HRESULT WINAPI IProcessInitializer_Startup_Proxy(IProcessInitializer *This,IUnknown *punkProcessControl);
  void __RPC_STUB IProcessInitializer_Startup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IProcessInitializer_Shutdown_Proxy(IProcessInitializer *This);
  void __RPC_STUB IProcessInitializer_Shutdown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServicePoolConfig_INTERFACE_DEFINED__
#define __IServicePoolConfig_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServicePoolConfig;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServicePoolConfig : public IUnknown {
  public:
    virtual HRESULT WINAPI put_MaxPoolSize(DWORD dwMaxPool) = 0;
    virtual HRESULT WINAPI get_MaxPoolSize(DWORD *pdwMaxPool) = 0;
    virtual HRESULT WINAPI put_MinPoolSize(DWORD dwMinPool) = 0;
    virtual HRESULT WINAPI get_MinPoolSize(DWORD *pdwMinPool) = 0;
    virtual HRESULT WINAPI put_CreationTimeout(DWORD dwCreationTimeout) = 0;
    virtual HRESULT WINAPI get_CreationTimeout(DWORD *pdwCreationTimeout) = 0;
    virtual HRESULT WINAPI put_TransactionAffinity(WINBOOL fTxAffinity) = 0;
    virtual HRESULT WINAPI get_TransactionAffinity(WINBOOL *pfTxAffinity) = 0;
    virtual HRESULT WINAPI put_ClassFactory(IClassFactory *pFactory) = 0;
    virtual HRESULT WINAPI get_ClassFactory(IClassFactory **pFactory) = 0;
  };
#else
  typedef struct IServicePoolConfigVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServicePoolConfig *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServicePoolConfig *This);
      ULONG (WINAPI *Release)(IServicePoolConfig *This);
      HRESULT (WINAPI *put_MaxPoolSize)(IServicePoolConfig *This,DWORD dwMaxPool);
      HRESULT (WINAPI *get_MaxPoolSize)(IServicePoolConfig *This,DWORD *pdwMaxPool);
      HRESULT (WINAPI *put_MinPoolSize)(IServicePoolConfig *This,DWORD dwMinPool);
      HRESULT (WINAPI *get_MinPoolSize)(IServicePoolConfig *This,DWORD *pdwMinPool);
      HRESULT (WINAPI *put_CreationTimeout)(IServicePoolConfig *This,DWORD dwCreationTimeout);
      HRESULT (WINAPI *get_CreationTimeout)(IServicePoolConfig *This,DWORD *pdwCreationTimeout);
      HRESULT (WINAPI *put_TransactionAffinity)(IServicePoolConfig *This,WINBOOL fTxAffinity);
      HRESULT (WINAPI *get_TransactionAffinity)(IServicePoolConfig *This,WINBOOL *pfTxAffinity);
      HRESULT (WINAPI *put_ClassFactory)(IServicePoolConfig *This,IClassFactory *pFactory);
      HRESULT (WINAPI *get_ClassFactory)(IServicePoolConfig *This,IClassFactory **pFactory);
    END_INTERFACE
  } IServicePoolConfigVtbl;
  interface IServicePoolConfig {
    CONST_VTBL struct IServicePoolConfigVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServicePoolConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServicePoolConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServicePoolConfig_Release(This) (This)->lpVtbl->Release(This)
#define IServicePoolConfig_put_MaxPoolSize(This,dwMaxPool) (This)->lpVtbl->put_MaxPoolSize(This,dwMaxPool)
#define IServicePoolConfig_get_MaxPoolSize(This,pdwMaxPool) (This)->lpVtbl->get_MaxPoolSize(This,pdwMaxPool)
#define IServicePoolConfig_put_MinPoolSize(This,dwMinPool) (This)->lpVtbl->put_MinPoolSize(This,dwMinPool)
#define IServicePoolConfig_get_MinPoolSize(This,pdwMinPool) (This)->lpVtbl->get_MinPoolSize(This,pdwMinPool)
#define IServicePoolConfig_put_CreationTimeout(This,dwCreationTimeout) (This)->lpVtbl->put_CreationTimeout(This,dwCreationTimeout)
#define IServicePoolConfig_get_CreationTimeout(This,pdwCreationTimeout) (This)->lpVtbl->get_CreationTimeout(This,pdwCreationTimeout)
#define IServicePoolConfig_put_TransactionAffinity(This,fTxAffinity) (This)->lpVtbl->put_TransactionAffinity(This,fTxAffinity)
#define IServicePoolConfig_get_TransactionAffinity(This,pfTxAffinity) (This)->lpVtbl->get_TransactionAffinity(This,pfTxAffinity)
#define IServicePoolConfig_put_ClassFactory(This,pFactory) (This)->lpVtbl->put_ClassFactory(This,pFactory)
#define IServicePoolConfig_get_ClassFactory(This,pFactory) (This)->lpVtbl->get_ClassFactory(This,pFactory)
#endif
#endif
  HRESULT WINAPI IServicePoolConfig_put_MaxPoolSize_Proxy(IServicePoolConfig *This,DWORD dwMaxPool);
  void __RPC_STUB IServicePoolConfig_put_MaxPoolSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServicePoolConfig_get_MaxPoolSize_Proxy(IServicePoolConfig *This,DWORD *pdwMaxPool);
  void __RPC_STUB IServicePoolConfig_get_MaxPoolSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServicePoolConfig_put_MinPoolSize_Proxy(IServicePoolConfig *This,DWORD dwMinPool);
  void __RPC_STUB IServicePoolConfig_put_MinPoolSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServicePoolConfig_get_MinPoolSize_Proxy(IServicePoolConfig *This,DWORD *pdwMinPool);
  void __RPC_STUB IServicePoolConfig_get_MinPoolSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServicePoolConfig_put_CreationTimeout_Proxy(IServicePoolConfig *This,DWORD dwCreationTimeout);
  void __RPC_STUB IServicePoolConfig_put_CreationTimeout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServicePoolConfig_get_CreationTimeout_Proxy(IServicePoolConfig *This,DWORD *pdwCreationTimeout);
  void __RPC_STUB IServicePoolConfig_get_CreationTimeout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServicePoolConfig_put_TransactionAffinity_Proxy(IServicePoolConfig *This,WINBOOL fTxAffinity);
  void __RPC_STUB IServicePoolConfig_put_TransactionAffinity_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServicePoolConfig_get_TransactionAffinity_Proxy(IServicePoolConfig *This,WINBOOL *pfTxAffinity);
  void __RPC_STUB IServicePoolConfig_get_TransactionAffinity_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServicePoolConfig_put_ClassFactory_Proxy(IServicePoolConfig *This,IClassFactory *pFactory);
  void __RPC_STUB IServicePoolConfig_put_ClassFactory_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServicePoolConfig_get_ClassFactory_Proxy(IServicePoolConfig *This,IClassFactory **pFactory);
  void __RPC_STUB IServicePoolConfig_get_ClassFactory_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IServicePool_INTERFACE_DEFINED__
#define __IServicePool_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IServicePool;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IServicePool : public IUnknown {
  public:
    virtual HRESULT WINAPI Initialize(IUnknown *pPoolConfig) = 0;
    virtual HRESULT WINAPI GetObject(REFIID riid,void **ppv) = 0;
    virtual HRESULT WINAPI Shutdown(void) = 0;
  };
#else
  typedef struct IServicePoolVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IServicePool *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IServicePool *This);
      ULONG (WINAPI *Release)(IServicePool *This);
      HRESULT (WINAPI *Initialize)(IServicePool *This,IUnknown *pPoolConfig);
      HRESULT (WINAPI *GetObject)(IServicePool *This,REFIID riid,void **ppv);
      HRESULT (WINAPI *Shutdown)(IServicePool *This);
    END_INTERFACE
  } IServicePoolVtbl;
  interface IServicePool {
    CONST_VTBL struct IServicePoolVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IServicePool_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServicePool_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServicePool_Release(This) (This)->lpVtbl->Release(This)
#define IServicePool_Initialize(This,pPoolConfig) (This)->lpVtbl->Initialize(This,pPoolConfig)
#define IServicePool_GetObject(This,riid,ppv) (This)->lpVtbl->GetObject(This,riid,ppv)
#define IServicePool_Shutdown(This) (This)->lpVtbl->Shutdown(This)
#endif
#endif
  HRESULT WINAPI IServicePool_Initialize_Proxy(IServicePool *This,IUnknown *pPoolConfig);
  void __RPC_STUB IServicePool_Initialize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServicePool_GetObject_Proxy(IServicePool *This,REFIID riid,void **ppv);
  void __RPC_STUB IServicePool_GetObject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IServicePool_Shutdown_Proxy(IServicePool *This);
  void __RPC_STUB IServicePool_Shutdown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IManagedPooledObj_INTERFACE_DEFINED__
#define __IManagedPooledObj_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IManagedPooledObj;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IManagedPooledObj : public IUnknown {
  public:
    virtual HRESULT WINAPI SetHeld(WINBOOL m_bHeld) = 0;
  };
#else
  typedef struct IManagedPooledObjVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IManagedPooledObj *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IManagedPooledObj *This);
      ULONG (WINAPI *Release)(IManagedPooledObj *This);
      HRESULT (WINAPI *SetHeld)(IManagedPooledObj *This,WINBOOL m_bHeld);
    END_INTERFACE
  } IManagedPooledObjVtbl;
  interface IManagedPooledObj {
    CONST_VTBL struct IManagedPooledObjVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IManagedPooledObj_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IManagedPooledObj_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IManagedPooledObj_Release(This) (This)->lpVtbl->Release(This)
#define IManagedPooledObj_SetHeld(This,m_bHeld) (This)->lpVtbl->SetHeld(This,m_bHeld)
#endif
#endif
  HRESULT WINAPI IManagedPooledObj_SetHeld_Proxy(IManagedPooledObj *This,WINBOOL m_bHeld);
  void __RPC_STUB IManagedPooledObj_SetHeld_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IManagedPoolAction_INTERFACE_DEFINED__
#define __IManagedPoolAction_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IManagedPoolAction;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IManagedPoolAction : public IUnknown {
  public:
    virtual HRESULT WINAPI LastRelease(void) = 0;
  };
#else
  typedef struct IManagedPoolActionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IManagedPoolAction *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IManagedPoolAction *This);
      ULONG (WINAPI *Release)(IManagedPoolAction *This);
      HRESULT (WINAPI *LastRelease)(IManagedPoolAction *This);
    END_INTERFACE
  } IManagedPoolActionVtbl;
  interface IManagedPoolAction {
    CONST_VTBL struct IManagedPoolActionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IManagedPoolAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IManagedPoolAction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IManagedPoolAction_Release(This) (This)->lpVtbl->Release(This)
#define IManagedPoolAction_LastRelease(This) (This)->lpVtbl->LastRelease(This)
#endif
#endif
  HRESULT WINAPI IManagedPoolAction_LastRelease_Proxy(IManagedPoolAction *This);
  void __RPC_STUB IManagedPoolAction_LastRelease_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IManagedObjectInfo_INTERFACE_DEFINED__
#define __IManagedObjectInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IManagedObjectInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IManagedObjectInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI GetIUnknown(IUnknown **pUnk) = 0;
    virtual HRESULT WINAPI GetIObjectControl(IObjectControl **pCtrl) = 0;
    virtual HRESULT WINAPI SetInPool(WINBOOL bInPool,IManagedPooledObj *pPooledObj) = 0;
    virtual HRESULT WINAPI SetWrapperStrength(WINBOOL bStrong) = 0;
  };
#else
  typedef struct IManagedObjectInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IManagedObjectInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IManagedObjectInfo *This);
      ULONG (WINAPI *Release)(IManagedObjectInfo *This);
      HRESULT (WINAPI *GetIUnknown)(IManagedObjectInfo *This,IUnknown **pUnk);
      HRESULT (WINAPI *GetIObjectControl)(IManagedObjectInfo *This,IObjectControl **pCtrl);
      HRESULT (WINAPI *SetInPool)(IManagedObjectInfo *This,WINBOOL bInPool,IManagedPooledObj *pPooledObj);
      HRESULT (WINAPI *SetWrapperStrength)(IManagedObjectInfo *This,WINBOOL bStrong);
    END_INTERFACE
  } IManagedObjectInfoVtbl;
  interface IManagedObjectInfo {
    CONST_VTBL struct IManagedObjectInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IManagedObjectInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IManagedObjectInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IManagedObjectInfo_Release(This) (This)->lpVtbl->Release(This)
#define IManagedObjectInfo_GetIUnknown(This,pUnk) (This)->lpVtbl->GetIUnknown(This,pUnk)
#define IManagedObjectInfo_GetIObjectControl(This,pCtrl) (This)->lpVtbl->GetIObjectControl(This,pCtrl)
#define IManagedObjectInfo_SetInPool(This,bInPool,pPooledObj) (This)->lpVtbl->SetInPool(This,bInPool,pPooledObj)
#define IManagedObjectInfo_SetWrapperStrength(This,bStrong) (This)->lpVtbl->SetWrapperStrength(This,bStrong)
#endif
#endif
  HRESULT WINAPI IManagedObjectInfo_GetIUnknown_Proxy(IManagedObjectInfo *This,IUnknown **pUnk);
  void __RPC_STUB IManagedObjectInfo_GetIUnknown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IManagedObjectInfo_GetIObjectControl_Proxy(IManagedObjectInfo *This,IObjectControl **pCtrl);
  void __RPC_STUB IManagedObjectInfo_GetIObjectControl_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IManagedObjectInfo_SetInPool_Proxy(IManagedObjectInfo *This,WINBOOL bInPool,IManagedPooledObj *pPooledObj);
  void __RPC_STUB IManagedObjectInfo_SetInPool_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IManagedObjectInfo_SetWrapperStrength_Proxy(IManagedObjectInfo *This,WINBOOL bStrong);
  void __RPC_STUB IManagedObjectInfo_SetWrapperStrength_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IAppDomainHelper_INTERFACE_DEFINED__
#define __IAppDomainHelper_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IAppDomainHelper;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IAppDomainHelper : public IDispatch {
  public:
    virtual HRESULT WINAPI Initialize(IUnknown *pUnkAD,HRESULT (WINAPI __MIDL_0028)(void *pv),void *pPool) = 0;
    virtual HRESULT WINAPI DoCallback(IUnknown *pUnkAD,HRESULT (WINAPI __MIDL_0029)(void *pv),void *pPool) = 0;
  };
#else
  typedef struct IAppDomainHelperVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IAppDomainHelper *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IAppDomainHelper *This);
      ULONG (WINAPI *Release)(IAppDomainHelper *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IAppDomainHelper *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IAppDomainHelper *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IAppDomainHelper *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IAppDomainHelper *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *Initialize)(IAppDomainHelper *This,IUnknown *pUnkAD,HRESULT (WINAPI __MIDL_0028)(void *pv),void *pPool);
      HRESULT (WINAPI *DoCallback)(IAppDomainHelper *This,IUnknown *pUnkAD,HRESULT (WINAPI __MIDL_0029)(void *pv),void *pPool);
    END_INTERFACE
  } IAppDomainHelperVtbl;
  interface IAppDomainHelper {
    CONST_VTBL struct IAppDomainHelperVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IAppDomainHelper_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAppDomainHelper_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAppDomainHelper_Release(This) (This)->lpVtbl->Release(This)
#define IAppDomainHelper_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IAppDomainHelper_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IAppDomainHelper_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IAppDomainHelper_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IAppDomainHelper_Initialize(This,pUnkAD,__MIDL_0028,pPool) (This)->lpVtbl->Initialize(This,pUnkAD,__MIDL_0028,pPool)
#define IAppDomainHelper_DoCallback(This,pUnkAD,__MIDL_0029,pPool) (This)->lpVtbl->DoCallback(This,pUnkAD,__MIDL_0029,pPool)
#endif
#endif
  HRESULT WINAPI IAppDomainHelper_Initialize_Proxy(IAppDomainHelper *This,IUnknown *pUnkAD,HRESULT (WINAPI __MIDL_0028)(void *pv),void *pPool);
  void __RPC_STUB IAppDomainHelper_Initialize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IAppDomainHelper_DoCallback_Proxy(IAppDomainHelper *This,IUnknown *pUnkAD,HRESULT (WINAPI __MIDL_0029)(void *pv),void *pPool);
  void __RPC_STUB IAppDomainHelper_DoCallback_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IAssemblyLocator_INTERFACE_DEFINED__
#define __IAssemblyLocator_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IAssemblyLocator;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IAssemblyLocator : public IDispatch {
  public:
    virtual HRESULT WINAPI GetModules(BSTR applicationDir,BSTR applicationName,BSTR assemblyName,SAFEARRAY **pModules) = 0;
  };
#else
  typedef struct IAssemblyLocatorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IAssemblyLocator *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IAssemblyLocator *This);
      ULONG (WINAPI *Release)(IAssemblyLocator *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IAssemblyLocator *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IAssemblyLocator *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IAssemblyLocator *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IAssemblyLocator *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *GetModules)(IAssemblyLocator *This,BSTR applicationDir,BSTR applicationName,BSTR assemblyName,SAFEARRAY **pModules);
    END_INTERFACE
  } IAssemblyLocatorVtbl;
  interface IAssemblyLocator {
    CONST_VTBL struct IAssemblyLocatorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IAssemblyLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAssemblyLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAssemblyLocator_Release(This) (This)->lpVtbl->Release(This)
#define IAssemblyLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IAssemblyLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IAssemblyLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IAssemblyLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IAssemblyLocator_GetModules(This,applicationDir,applicationName,assemblyName,pModules) (This)->lpVtbl->GetModules(This,applicationDir,applicationName,assemblyName,pModules)
#endif
#endif
  HRESULT WINAPI IAssemblyLocator_GetModules_Proxy(IAssemblyLocator *This,BSTR applicationDir,BSTR applicationName,BSTR assemblyName,SAFEARRAY **pModules);
  void __RPC_STUB IAssemblyLocator_GetModules_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IManagedActivationEvents_INTERFACE_DEFINED__
#define __IManagedActivationEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IManagedActivationEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IManagedActivationEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI CreateManagedStub(IManagedObjectInfo *pInfo,WINBOOL fDist) = 0;
    virtual HRESULT WINAPI DestroyManagedStub(IManagedObjectInfo *pInfo) = 0;
  };
#else
  typedef struct IManagedActivationEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IManagedActivationEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IManagedActivationEvents *This);
      ULONG (WINAPI *Release)(IManagedActivationEvents *This);
      HRESULT (WINAPI *CreateManagedStub)(IManagedActivationEvents *This,IManagedObjectInfo *pInfo,WINBOOL fDist);
      HRESULT (WINAPI *DestroyManagedStub)(IManagedActivationEvents *This,IManagedObjectInfo *pInfo);
    END_INTERFACE
  } IManagedActivationEventsVtbl;
  interface IManagedActivationEvents {
    CONST_VTBL struct IManagedActivationEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IManagedActivationEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IManagedActivationEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IManagedActivationEvents_Release(This) (This)->lpVtbl->Release(This)
#define IManagedActivationEvents_CreateManagedStub(This,pInfo,fDist) (This)->lpVtbl->CreateManagedStub(This,pInfo,fDist)
#define IManagedActivationEvents_DestroyManagedStub(This,pInfo) (This)->lpVtbl->DestroyManagedStub(This,pInfo)
#endif
#endif
  HRESULT WINAPI IManagedActivationEvents_CreateManagedStub_Proxy(IManagedActivationEvents *This,IManagedObjectInfo *pInfo,WINBOOL fDist);
  void __RPC_STUB IManagedActivationEvents_CreateManagedStub_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IManagedActivationEvents_DestroyManagedStub_Proxy(IManagedActivationEvents *This,IManagedObjectInfo *pInfo);
  void __RPC_STUB IManagedActivationEvents_DestroyManagedStub_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISendMethodEvents_INTERFACE_DEFINED__
#define __ISendMethodEvents_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISendMethodEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISendMethodEvents : public IUnknown {
  public:
    virtual HRESULT WINAPI SendMethodCall(const void *pIdentity,REFIID riid,DWORD dwMeth) = 0;
    virtual HRESULT WINAPI SendMethodReturn(const void *pIdentity,REFIID riid,DWORD dwMeth,HRESULT hrCall,HRESULT hrServer) = 0;
  };
#else
  typedef struct ISendMethodEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISendMethodEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISendMethodEvents *This);
      ULONG (WINAPI *Release)(ISendMethodEvents *This);
      HRESULT (WINAPI *SendMethodCall)(ISendMethodEvents *This,const void *pIdentity,REFIID riid,DWORD dwMeth);
      HRESULT (WINAPI *SendMethodReturn)(ISendMethodEvents *This,const void *pIdentity,REFIID riid,DWORD dwMeth,HRESULT hrCall,HRESULT hrServer);
    END_INTERFACE
  } ISendMethodEventsVtbl;
  interface ISendMethodEvents {
    CONST_VTBL struct ISendMethodEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISendMethodEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISendMethodEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISendMethodEvents_Release(This) (This)->lpVtbl->Release(This)
#define ISendMethodEvents_SendMethodCall(This,pIdentity,riid,dwMeth) (This)->lpVtbl->SendMethodCall(This,pIdentity,riid,dwMeth)
#define ISendMethodEvents_SendMethodReturn(This,pIdentity,riid,dwMeth,hrCall,hrServer) (This)->lpVtbl->SendMethodReturn(This,pIdentity,riid,dwMeth,hrCall,hrServer)
#endif
#endif
  HRESULT WINAPI ISendMethodEvents_SendMethodCall_Proxy(ISendMethodEvents *This,const void *pIdentity,REFIID riid,DWORD dwMeth);
  void __RPC_STUB ISendMethodEvents_SendMethodCall_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISendMethodEvents_SendMethodReturn_Proxy(ISendMethodEvents *This,const void *pIdentity,REFIID riid,DWORD dwMeth,HRESULT hrCall,HRESULT hrServer);
  void __RPC_STUB ISendMethodEvents_SendMethodReturn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0406_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0406_v0_0_s_ifspec;

#ifndef __ITransactionResourcePool_INTERFACE_DEFINED__
#define __ITransactionResourcePool_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ITransactionResourcePool;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITransactionResourcePool : public IUnknown {
  public:
    virtual HRESULT WINAPI PutResource(IObjPool *pPool,IUnknown *pUnk) = 0;
    virtual HRESULT WINAPI GetResource(IObjPool *pPool,IUnknown **ppUnk) = 0;
  };
#else
  typedef struct ITransactionResourcePoolVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITransactionResourcePool *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITransactionResourcePool *This);
      ULONG (WINAPI *Release)(ITransactionResourcePool *This);
      HRESULT (WINAPI *PutResource)(ITransactionResourcePool *This,IObjPool *pPool,IUnknown *pUnk);
      HRESULT (WINAPI *GetResource)(ITransactionResourcePool *This,IObjPool *pPool,IUnknown **ppUnk);
    END_INTERFACE
  } ITransactionResourcePoolVtbl;
  interface ITransactionResourcePool {
    CONST_VTBL struct ITransactionResourcePoolVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITransactionResourcePool_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITransactionResourcePool_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITransactionResourcePool_Release(This) (This)->lpVtbl->Release(This)
#define ITransactionResourcePool_PutResource(This,pPool,pUnk) (This)->lpVtbl->PutResource(This,pPool,pUnk)
#define ITransactionResourcePool_GetResource(This,pPool,ppUnk) (This)->lpVtbl->GetResource(This,pPool,ppUnk)
#endif
#endif
  HRESULT WINAPI ITransactionResourcePool_PutResource_Proxy(ITransactionResourcePool *This,IObjPool *pPool,IUnknown *pUnk);
  void __RPC_STUB ITransactionResourcePool_PutResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITransactionResourcePool_GetResource_Proxy(ITransactionResourcePool *This,IObjPool *pPool,IUnknown **ppUnk);
  void __RPC_STUB ITransactionResourcePool_GetResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  EXTERN_C HRESULT WINAPI MTSCreateActivity (REFIID riid,void **ppobj);

  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0407_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_autosvcs_0407_v0_0_s_ifspec;

#ifndef __IMTSCall_INTERFACE_DEFINED__
#define __IMTSCall_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IMTSCall;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IMTSCall : public IUnknown {
  public:
    virtual HRESULT WINAPI OnCall(void) = 0;
  };
#else
  typedef struct IMTSCallVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IMTSCall *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IMTSCall *This);
      ULONG (WINAPI *Release)(IMTSCall *This);
      HRESULT (WINAPI *OnCall)(IMTSCall *This);
    END_INTERFACE
  } IMTSCallVtbl;
  interface IMTSCall {
    CONST_VTBL struct IMTSCallVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IMTSCall_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMTSCall_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMTSCall_Release(This) (This)->lpVtbl->Release(This)
#define IMTSCall_OnCall(This) (This)->lpVtbl->OnCall(This)
#endif
#endif
  HRESULT WINAPI IMTSCall_OnCall_Proxy(IMTSCall *This);
  void __RPC_STUB IMTSCall_OnCall_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IContextProperties_INTERFACE_DEFINED__
#define __IContextProperties_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IContextProperties;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IContextProperties : public IUnknown {
  public:
    virtual HRESULT WINAPI Count(long *plCount) = 0;
    virtual HRESULT WINAPI GetProperty(BSTR name,VARIANT *pProperty) = 0;
    virtual HRESULT WINAPI EnumNames(IEnumNames **ppenum) = 0;
    virtual HRESULT WINAPI SetProperty(BSTR name,VARIANT property) = 0;
    virtual HRESULT WINAPI RemoveProperty(BSTR name) = 0;
  };
#else
  typedef struct IContextPropertiesVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IContextProperties *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IContextProperties *This);
      ULONG (WINAPI *Release)(IContextProperties *This);
      HRESULT (WINAPI *Count)(IContextProperties *This,long *plCount);
      HRESULT (WINAPI *GetProperty)(IContextProperties *This,BSTR name,VARIANT *pProperty);
      HRESULT (WINAPI *EnumNames)(IContextProperties *This,IEnumNames **ppenum);
      HRESULT (WINAPI *SetProperty)(IContextProperties *This,BSTR name,VARIANT property);
      HRESULT (WINAPI *RemoveProperty)(IContextProperties *This,BSTR name);
    END_INTERFACE
  } IContextPropertiesVtbl;
  interface IContextProperties {
    CONST_VTBL struct IContextPropertiesVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IContextProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IContextProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IContextProperties_Release(This) (This)->lpVtbl->Release(This)
#define IContextProperties_Count(This,plCount) (This)->lpVtbl->Count(This,plCount)
#define IContextProperties_GetProperty(This,name,pProperty) (This)->lpVtbl->GetProperty(This,name,pProperty)
#define IContextProperties_EnumNames(This,ppenum) (This)->lpVtbl->EnumNames(This,ppenum)
#define IContextProperties_SetProperty(This,name,property) (This)->lpVtbl->SetProperty(This,name,property)
#define IContextProperties_RemoveProperty(This,name) (This)->lpVtbl->RemoveProperty(This,name)
#endif
#endif
  HRESULT WINAPI IContextProperties_Count_Proxy(IContextProperties *This,long *plCount);
  void __RPC_STUB IContextProperties_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IContextProperties_GetProperty_Proxy(IContextProperties *This,BSTR name,VARIANT *pProperty);
  void __RPC_STUB IContextProperties_GetProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IContextProperties_EnumNames_Proxy(IContextProperties *This,IEnumNames **ppenum);
  void __RPC_STUB IContextProperties_EnumNames_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IContextProperties_SetProperty_Proxy(IContextProperties *This,BSTR name,VARIANT property);
  void __RPC_STUB IContextProperties_SetProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IContextProperties_RemoveProperty_Proxy(IContextProperties *This,BSTR name);
  void __RPC_STUB IContextProperties_RemoveProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IObjPool_INTERFACE_DEFINED__
#define __IObjPool_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IObjPool;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IObjPool : public IUnknown {
  public:
    virtual void WINAPI Reserved1(void) = 0;
    virtual void WINAPI Reserved2(void) = 0;
    virtual void WINAPI Reserved3(void) = 0;
    virtual void WINAPI Reserved4(void) = 0;
    virtual void WINAPI PutEndTx(IUnknown *pObj) = 0;
    virtual void WINAPI Reserved5(void) = 0;
    virtual void WINAPI Reserved6(void) = 0;
  };
#else
  typedef struct IObjPoolVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IObjPool *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IObjPool *This);
      ULONG (WINAPI *Release)(IObjPool *This);
      void (WINAPI *Reserved1)(IObjPool *This);
      void (WINAPI *Reserved2)(IObjPool *This);
      void (WINAPI *Reserved3)(IObjPool *This);
      void (WINAPI *Reserved4)(IObjPool *This);
      void (WINAPI *PutEndTx)(IObjPool *This,IUnknown *pObj);
      void (WINAPI *Reserved5)(IObjPool *This);
      void (WINAPI *Reserved6)(IObjPool *This);
    END_INTERFACE
  } IObjPoolVtbl;
  interface IObjPool {
    CONST_VTBL struct IObjPoolVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IObjPool_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjPool_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjPool_Release(This) (This)->lpVtbl->Release(This)
#define IObjPool_Reserved1(This) (This)->lpVtbl->Reserved1(This)
#define IObjPool_Reserved2(This) (This)->lpVtbl->Reserved2(This)
#define IObjPool_Reserved3(This) (This)->lpVtbl->Reserved3(This)
#define IObjPool_Reserved4(This) (This)->lpVtbl->Reserved4(This)
#define IObjPool_PutEndTx(This,pObj) (This)->lpVtbl->PutEndTx(This,pObj)
#define IObjPool_Reserved5(This) (This)->lpVtbl->Reserved5(This)
#define IObjPool_Reserved6(This) (This)->lpVtbl->Reserved6(This)
#endif
#endif
  void WINAPI IObjPool_Reserved1_Proxy(IObjPool *This);
  void __RPC_STUB IObjPool_Reserved1_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI IObjPool_Reserved2_Proxy(IObjPool *This);
  void __RPC_STUB IObjPool_Reserved2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI IObjPool_Reserved3_Proxy(IObjPool *This);
  void __RPC_STUB IObjPool_Reserved3_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI IObjPool_Reserved4_Proxy(IObjPool *This);
  void __RPC_STUB IObjPool_Reserved4_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI IObjPool_PutEndTx_Proxy(IObjPool *This,IUnknown *pObj);
  void __RPC_STUB IObjPool_PutEndTx_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI IObjPool_Reserved5_Proxy(IObjPool *This);
  void __RPC_STUB IObjPool_Reserved5_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI IObjPool_Reserved6_Proxy(IObjPool *This);
  void __RPC_STUB IObjPool_Reserved6_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ITransactionProperty_INTERFACE_DEFINED__
#define __ITransactionProperty_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ITransactionProperty;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITransactionProperty : public IUnknown {
  public:
    virtual void WINAPI Reserved1(void) = 0;
    virtual void WINAPI Reserved2(void) = 0;
    virtual void WINAPI Reserved3(void) = 0;
    virtual void WINAPI Reserved4(void) = 0;
    virtual void WINAPI Reserved5(void) = 0;
    virtual void WINAPI Reserved6(void) = 0;
    virtual void WINAPI Reserved7(void) = 0;
    virtual void WINAPI Reserved8(void) = 0;
    virtual void WINAPI Reserved9(void) = 0;
    virtual HRESULT WINAPI GetTransactionResourcePool(ITransactionResourcePool **ppTxPool) = 0;
    virtual void WINAPI Reserved10(void) = 0;
    virtual void WINAPI Reserved11(void) = 0;
    virtual void WINAPI Reserved12(void) = 0;
    virtual void WINAPI Reserved13(void) = 0;
    virtual void WINAPI Reserved14(void) = 0;
    virtual void WINAPI Reserved15(void) = 0;
    virtual void WINAPI Reserved16(void) = 0;
    virtual void WINAPI Reserved17(void) = 0;
  };
#else
  typedef struct ITransactionPropertyVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITransactionProperty *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITransactionProperty *This);
      ULONG (WINAPI *Release)(ITransactionProperty *This);
      void (WINAPI *Reserved1)(ITransactionProperty *This);
      void (WINAPI *Reserved2)(ITransactionProperty *This);
      void (WINAPI *Reserved3)(ITransactionProperty *This);
      void (WINAPI *Reserved4)(ITransactionProperty *This);
      void (WINAPI *Reserved5)(ITransactionProperty *This);
      void (WINAPI *Reserved6)(ITransactionProperty *This);
      void (WINAPI *Reserved7)(ITransactionProperty *This);
      void (WINAPI *Reserved8)(ITransactionProperty *This);
      void (WINAPI *Reserved9)(ITransactionProperty *This);
      HRESULT (WINAPI *GetTransactionResourcePool)(ITransactionProperty *This,ITransactionResourcePool **ppTxPool);
      void (WINAPI *Reserved10)(ITransactionProperty *This);
      void (WINAPI *Reserved11)(ITransactionProperty *This);
      void (WINAPI *Reserved12)(ITransactionProperty *This);
      void (WINAPI *Reserved13)(ITransactionProperty *This);
      void (WINAPI *Reserved14)(ITransactionProperty *This);
      void (WINAPI *Reserved15)(ITransactionProperty *This);
      void (WINAPI *Reserved16)(ITransactionProperty *This);
      void (WINAPI *Reserved17)(ITransactionProperty *This);
    END_INTERFACE
  } ITransactionPropertyVtbl;
  interface ITransactionProperty {
    CONST_VTBL struct ITransactionPropertyVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITransactionProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITransactionProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITransactionProperty_Release(This) (This)->lpVtbl->Release(This)
#define ITransactionProperty_Reserved1(This) (This)->lpVtbl->Reserved1(This)
#define ITransactionProperty_Reserved2(This) (This)->lpVtbl->Reserved2(This)
#define ITransactionProperty_Reserved3(This) (This)->lpVtbl->Reserved3(This)
#define ITransactionProperty_Reserved4(This) (This)->lpVtbl->Reserved4(This)
#define ITransactionProperty_Reserved5(This) (This)->lpVtbl->Reserved5(This)
#define ITransactionProperty_Reserved6(This) (This)->lpVtbl->Reserved6(This)
#define ITransactionProperty_Reserved7(This) (This)->lpVtbl->Reserved7(This)
#define ITransactionProperty_Reserved8(This) (This)->lpVtbl->Reserved8(This)
#define ITransactionProperty_Reserved9(This) (This)->lpVtbl->Reserved9(This)
#define ITransactionProperty_GetTransactionResourcePool(This,ppTxPool) (This)->lpVtbl->GetTransactionResourcePool(This,ppTxPool)
#define ITransactionProperty_Reserved10(This) (This)->lpVtbl->Reserved10(This)
#define ITransactionProperty_Reserved11(This) (This)->lpVtbl->Reserved11(This)
#define ITransactionProperty_Reserved12(This) (This)->lpVtbl->Reserved12(This)
#define ITransactionProperty_Reserved13(This) (This)->lpVtbl->Reserved13(This)
#define ITransactionProperty_Reserved14(This) (This)->lpVtbl->Reserved14(This)
#define ITransactionProperty_Reserved15(This) (This)->lpVtbl->Reserved15(This)
#define ITransactionProperty_Reserved16(This) (This)->lpVtbl->Reserved16(This)
#define ITransactionProperty_Reserved17(This) (This)->lpVtbl->Reserved17(This)
#endif
#endif
  void WINAPI ITransactionProperty_Reserved1_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved1_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved2_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved3_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved3_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved4_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved4_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved5_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved5_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved6_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved6_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved7_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved7_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved8_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved8_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved9_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved9_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITransactionProperty_GetTransactionResourcePool_Proxy(ITransactionProperty *This,ITransactionResourcePool **ppTxPool);
  void __RPC_STUB ITransactionProperty_GetTransactionResourcePool_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved10_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved10_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved11_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved11_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved12_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved12_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved13_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved13_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved14_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved14_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved15_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved15_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved16_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved16_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI ITransactionProperty_Reserved17_Proxy(ITransactionProperty *This);
  void __RPC_STUB ITransactionProperty_Reserved17_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMTSActivity_INTERFACE_DEFINED__
#define __IMTSActivity_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IMTSActivity;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IMTSActivity : public IUnknown {
  public:
    virtual HRESULT WINAPI SynchronousCall(IMTSCall *pCall) = 0;
    virtual HRESULT WINAPI AsyncCall(IMTSCall *pCall) = 0;
    virtual void WINAPI Reserved1(void) = 0;
    virtual HRESULT WINAPI BindToCurrentThread(void) = 0;
    virtual HRESULT WINAPI UnbindFromThread(void) = 0;
  };
#else
  typedef struct IMTSActivityVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IMTSActivity *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IMTSActivity *This);
      ULONG (WINAPI *Release)(IMTSActivity *This);
      HRESULT (WINAPI *SynchronousCall)(IMTSActivity *This,IMTSCall *pCall);
      HRESULT (WINAPI *AsyncCall)(IMTSActivity *This,IMTSCall *pCall);
      void (WINAPI *Reserved1)(IMTSActivity *This);
      HRESULT (WINAPI *BindToCurrentThread)(IMTSActivity *This);
      HRESULT (WINAPI *UnbindFromThread)(IMTSActivity *This);
    END_INTERFACE
  } IMTSActivityVtbl;
  interface IMTSActivity {
    CONST_VTBL struct IMTSActivityVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IMTSActivity_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMTSActivity_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMTSActivity_Release(This) (This)->lpVtbl->Release(This)
#define IMTSActivity_SynchronousCall(This,pCall) (This)->lpVtbl->SynchronousCall(This,pCall)
#define IMTSActivity_AsyncCall(This,pCall) (This)->lpVtbl->AsyncCall(This,pCall)
#define IMTSActivity_Reserved1(This) (This)->lpVtbl->Reserved1(This)
#define IMTSActivity_BindToCurrentThread(This) (This)->lpVtbl->BindToCurrentThread(This)
#define IMTSActivity_UnbindFromThread(This) (This)->lpVtbl->UnbindFromThread(This)
#endif
#endif
  HRESULT WINAPI IMTSActivity_SynchronousCall_Proxy(IMTSActivity *This,IMTSCall *pCall);
  void __RPC_STUB IMTSActivity_SynchronousCall_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMTSActivity_AsyncCall_Proxy(IMTSActivity *This,IMTSCall *pCall);
  void __RPC_STUB IMTSActivity_AsyncCall_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  void WINAPI IMTSActivity_Reserved1_Proxy(IMTSActivity *This);
  void __RPC_STUB IMTSActivity_Reserved1_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMTSActivity_BindToCurrentThread_Proxy(IMTSActivity *This);
  void __RPC_STUB IMTSActivity_BindToCurrentThread_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IMTSActivity_UnbindFromThread_Proxy(IMTSActivity *This);
  void __RPC_STUB IMTSActivity_UnbindFromThread_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __COMSVCSLib_LIBRARY_DEFINED__
#define __COMSVCSLib_LIBRARY_DEFINED__
  typedef enum __MIDL___MIDL_itf_autosvcs_0412_0001 {
    mtsErrCtxAborted = 0x8004e002,mtsErrCtxAborting = 0x8004e003,mtsErrCtxNoContext = 0x8004e004,mtsErrCtxNotRegistered = 0x8004e005,
    mtsErrCtxSynchTimeout = 0x8004e006,mtsErrCtxOldReference = 0x8004e007,mtsErrCtxRoleNotFound = 0x8004e00c,mtsErrCtxNoSecurity = 0x8004e00d,
    mtsErrCtxWrongThread = 0x8004e00e,mtsErrCtxTMNotAvailable = 0x8004e00f,comQCErrApplicationNotQueued = 0x80110600,
    comQCErrNoQueueableInterfaces = 0x80110601,comQCErrQueuingServiceNotAvailable = 0x80110602,comQCErrQueueTransactMismatch = 0x80110603,
    comqcErrRecorderMarshalled = 0x80110604,comqcErrOutParam = 0x80110605,comqcErrRecorderNotTrusted = 0x80110606,comqcErrPSLoad = 0x80110607,
    comqcErrMarshaledObjSameTxn = 0x80110608,comqcErrInvalidMessage = 0x80110650,comqcErrMsmqSidUnavailable = 0x80110651,
    comqcErrWrongMsgExtension = 0x80110652,comqcErrMsmqServiceUnavailable = 0x80110653,comqcErrMsgNotAuthenticated = 0x80110654,
    comqcErrMsmqConnectorUsed = 0x80110655,comqcErrBadMarshaledObject = 0x80110656
  } Error_Constants;

  typedef enum __MIDL___MIDL_itf_autosvcs_0412_0002 {
    LockSetGet = 0,LockMethod = LockSetGet + 1
  } LockModes;

  typedef enum __MIDL___MIDL_itf_autosvcs_0412_0003 {
    Standard = 0,Process = Standard + 1
  } ReleaseModes;

#ifndef _tagCrmFlags_
#define _tagCrmFlags_
  typedef enum tagCRMFLAGS {
    CRMFLAG_FORGETTARGET = 0x1,CRMFLAG_WRITTENDURINGPREPARE = 0x2,CRMFLAG_WRITTENDURINGCOMMIT = 0x4,CRMFLAG_WRITTENDURINGABORT = 0x8,
    CRMFLAG_WRITTENDURINGRECOVERY = 0x10,CRMFLAG_WRITTENDURINGREPLAY = 0x20,CRMFLAG_REPLAYINPROGRESS = 0x40
  } CRMFLAGS;
#endif
#ifndef _tagCrmRegFlags_
#define _tagCrmRegFlags_
  typedef enum tagCRMREGFLAGS {
    CRMREGFLAG_PREPAREPHASE = 0x1,CRMREGFLAG_COMMITPHASE = 0x2,CRMREGFLAG_ABORTPHASE = 0x4,CRMREGFLAG_ALLPHASES = 0x7,
    CRMREGFLAG_FAILIFINDOUBTSREMAIN = 0x10
  } CRMREGFLAGS;
#endif

  EXTERN_C const IID LIBID_COMSVCSLib;
  EXTERN_C const CLSID CLSID_SecurityIdentity;
#ifdef __cplusplus
  class SecurityIdentity;
#endif
  EXTERN_C const CLSID CLSID_SecurityCallers;
#ifdef __cplusplus
  class SecurityCallers;
#endif
  EXTERN_C const CLSID CLSID_SecurityCallContext;
#ifdef __cplusplus
  class SecurityCallContext;
#endif
  EXTERN_C const CLSID CLSID_GetSecurityCallContextAppObject;
#ifdef __cplusplus
  class GetSecurityCallContextAppObject;
#endif
  EXTERN_C const CLSID CLSID_Dummy30040732;
#ifdef __cplusplus
  class Dummy30040732;
#endif
  EXTERN_C const CLSID CLSID_TransactionContext;
#ifdef __cplusplus
  class TransactionContext;
#endif
  EXTERN_C const CLSID CLSID_TransactionContextEx;
#ifdef __cplusplus
  class TransactionContextEx;
#endif
  EXTERN_C const CLSID CLSID_ByotServerEx;
#ifdef __cplusplus
  class ByotServerEx;
#endif
  EXTERN_C const CLSID CLSID_CServiceConfig;
#ifdef __cplusplus
  class CServiceConfig;
#endif
  EXTERN_C const CLSID CLSID_ServicePool;
#ifdef __cplusplus
  class ServicePool;
#endif
  EXTERN_C const CLSID CLSID_ServicePoolConfig;
#ifdef __cplusplus
  class ServicePoolConfig;
#endif
  EXTERN_C const CLSID CLSID_SharedProperty;
#ifdef __cplusplus
  class SharedProperty;
#endif
  EXTERN_C const CLSID CLSID_SharedPropertyGroup;
#ifdef __cplusplus
  class SharedPropertyGroup;
#endif
  EXTERN_C const CLSID CLSID_SharedPropertyGroupManager;
#ifdef __cplusplus
  class SharedPropertyGroupManager;
#endif
  EXTERN_C const CLSID CLSID_COMEvents;
#ifdef __cplusplus
  class COMEvents;
#endif
  EXTERN_C const CLSID CLSID_CoMTSLocator;
#ifdef __cplusplus
  class CoMTSLocator;
#endif
  EXTERN_C const CLSID CLSID_MtsGrp;
#ifdef __cplusplus
  class MtsGrp;
#endif
  EXTERN_C const CLSID CLSID_ComServiceEvents;
#ifdef __cplusplus
  class ComServiceEvents;
#endif
  EXTERN_C const CLSID CLSID_ComSystemAppEventData;
#ifdef __cplusplus
  class ComSystemAppEventData;
#endif
  EXTERN_C const CLSID CLSID_CRMClerk;
#ifdef __cplusplus
  class CRMClerk;
#endif
  EXTERN_C const CLSID CLSID_CRMRecoveryClerk;
#ifdef __cplusplus
  class CRMRecoveryClerk;
#endif
  EXTERN_C const CLSID CLSID_LBEvents;
#ifdef __cplusplus
  class LBEvents;
#endif
  EXTERN_C const CLSID CLSID_MessageMover;
#ifdef __cplusplus
  class MessageMover;
#endif
  EXTERN_C const CLSID CLSID_DispenserManager;
#ifdef __cplusplus
  class DispenserManager;
#endif
  EXTERN_C const CLSID CLSID_PoolMgr;
#ifdef __cplusplus
  class PoolMgr;
#endif
  EXTERN_C const CLSID CLSID_EventServer;
#ifdef __cplusplus
  class EventServer;
#endif
  EXTERN_C const CLSID CLSID_AppDomainHelper;
#ifdef __cplusplus
  class AppDomainHelper;
#endif
  EXTERN_C const CLSID CLSID_ClrAssemblyLocator;
#ifdef __cplusplus
  class ClrAssemblyLocator;
#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 LPSAFEARRAY_UserSize(unsigned long *,unsigned long,LPSAFEARRAY *);
  unsigned char *__RPC_API LPSAFEARRAY_UserMarshal(unsigned long *,unsigned char *,LPSAFEARRAY *);
  unsigned char *__RPC_API LPSAFEARRAY_UserUnmarshal(unsigned long *,unsigned char *,LPSAFEARRAY *);
  void __RPC_API LPSAFEARRAY_UserFree(unsigned long *,LPSAFEARRAY *);
  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
