/*** Autogenerated by WIDL 1.6 from include/taskschd.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __taskschd_h__
#define __taskschd_h__

/* Forward declarations */

#ifndef __ITaskService_FWD_DEFINED__
#define __ITaskService_FWD_DEFINED__
typedef interface ITaskService ITaskService;
#endif

#ifndef __IRegisteredTask_FWD_DEFINED__
#define __IRegisteredTask_FWD_DEFINED__
typedef interface IRegisteredTask IRegisteredTask;
#endif

#ifndef __IRegisteredTaskCollection_FWD_DEFINED__
#define __IRegisteredTaskCollection_FWD_DEFINED__
typedef interface IRegisteredTaskCollection IRegisteredTaskCollection;
#endif

#ifndef __IRegistrationInfo_FWD_DEFINED__
#define __IRegistrationInfo_FWD_DEFINED__
typedef interface IRegistrationInfo IRegistrationInfo;
#endif

#ifndef __ITaskFolder_FWD_DEFINED__
#define __ITaskFolder_FWD_DEFINED__
typedef interface ITaskFolder ITaskFolder;
#endif

#ifndef __ITaskFolderCollection_FWD_DEFINED__
#define __ITaskFolderCollection_FWD_DEFINED__
typedef interface ITaskFolderCollection ITaskFolderCollection;
#endif

#ifndef __ITaskDefinition_FWD_DEFINED__
#define __ITaskDefinition_FWD_DEFINED__
typedef interface ITaskDefinition ITaskDefinition;
#endif

#ifndef __ITaskSettings_FWD_DEFINED__
#define __ITaskSettings_FWD_DEFINED__
typedef interface ITaskSettings ITaskSettings;
#endif

#ifndef __IIdleSettings_FWD_DEFINED__
#define __IIdleSettings_FWD_DEFINED__
typedef interface IIdleSettings IIdleSettings;
#endif

#ifndef __IRunningTask_FWD_DEFINED__
#define __IRunningTask_FWD_DEFINED__
typedef interface IRunningTask IRunningTask;
#endif

#ifndef __IRunningTaskCollection_FWD_DEFINED__
#define __IRunningTaskCollection_FWD_DEFINED__
typedef interface IRunningTaskCollection IRunningTaskCollection;
#endif

#ifndef __ITrigger_FWD_DEFINED__
#define __ITrigger_FWD_DEFINED__
typedef interface ITrigger ITrigger;
#endif

#ifndef __IDailyTrigger_FWD_DEFINED__
#define __IDailyTrigger_FWD_DEFINED__
typedef interface IDailyTrigger IDailyTrigger;
#endif

#ifndef __ITriggerCollection_FWD_DEFINED__
#define __ITriggerCollection_FWD_DEFINED__
typedef interface ITriggerCollection ITriggerCollection;
#endif

#ifndef __ITimeTrigger_FWD_DEFINED__
#define __ITimeTrigger_FWD_DEFINED__
typedef interface ITimeTrigger ITimeTrigger;
#endif

#ifndef __IRepetitionPattern_FWD_DEFINED__
#define __IRepetitionPattern_FWD_DEFINED__
typedef interface IRepetitionPattern IRepetitionPattern;
#endif

#ifndef __IAction_FWD_DEFINED__
#define __IAction_FWD_DEFINED__
typedef interface IAction IAction;
#endif

#ifndef __IActionCollection_FWD_DEFINED__
#define __IActionCollection_FWD_DEFINED__
typedef interface IActionCollection IActionCollection;
#endif

#ifndef __IExecAction_FWD_DEFINED__
#define __IExecAction_FWD_DEFINED__
typedef interface IExecAction IExecAction;
#endif

#ifndef __INetworkSettings_FWD_DEFINED__
#define __INetworkSettings_FWD_DEFINED__
typedef interface INetworkSettings INetworkSettings;
#endif

#ifndef __IPrincipal_FWD_DEFINED__
#define __IPrincipal_FWD_DEFINED__
typedef interface IPrincipal IPrincipal;
#endif

#ifndef __TaskScheduler_FWD_DEFINED__
#define __TaskScheduler_FWD_DEFINED__
#ifdef __cplusplus
typedef class TaskScheduler TaskScheduler;
#else
typedef struct TaskScheduler TaskScheduler;
#endif /* defined __cplusplus */
#endif /* defined __TaskScheduler_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>

#ifdef __cplusplus
extern "C" {
#endif


DEFINE_GUID(LIBID_TaskScheduler, 0xe34cb9f1, 0xc7f7, 0x424c, 0xbe,0x29, 0x02,0x7d,0xcc,0x09,0x36,0x3a);

typedef enum _TASK_STATE {
    TASK_STATE_UNKNOWN = 0,
    TASK_STATE_DISABLED = 1,
    TASK_STATE_QUEUED = 2,
    TASK_STATE_READY = 3,
    TASK_STATE_RUNNING = 4
} TASK_STATE;
typedef enum _TASK_ENUM_FLAGS {
    TASK_ENUM_HIDDEN = 0x1
} TASK_ENUM_FLAGS;
typedef enum _TASK_LOGON_TYPE {
    TASK_LOGON_NONE = 0,
    TASK_LOGON_PASSWORD = 1,
    TASK_LOGON_S4U = 2,
    TASK_LOGON_INTERACTIVE_TOKEN = 3,
    TASK_LOGON_GROUP = 4,
    TASK_LOGON_SERVICE_ACCOUNT = 5,
    TASK_LOGON_INTERACTIVE_TOKEN_OR_PASSWORD = 6
} TASK_LOGON_TYPE;
typedef enum _TASK_RUNLEVEL {
    TASK_RUNLEVEL_LUA = 0,
    TASK_RUNLEVEL_HIGHEST = 1
} TASK_RUNLEVEL_TYPE;
typedef enum _TASK_TRIGGER_TYPE2 {
    TASK_TRIGGER_EVENT = 0,
    TASK_TRIGGER_TIME = 1,
    TASK_TRIGGER_DAILY = 2,
    TASK_TRIGGER_WEEKLY = 3,
    TASK_TRIGGER_MONTHLY = 4,
    TASK_TRIGGER_MONTHLYDOW = 5,
    TASK_TRIGGER_IDLE = 6,
    TASK_TRIGGER_REGISTRATION = 7,
    TASK_TRIGGER_BOOT = 8,
    TASK_TRIGGER_LOGON = 9,
    TASK_TRIGGER_SESSION_STATE_CHANGE = 11
} TASK_TRIGGER_TYPE2;
typedef enum _TASK_ACTION_TYPE {
    TASK_ACTION_EXEC = 0,
    TASK_ACTION_COM_HANDLER = 5,
    TASK_ACTION_SEND_EMAIL = 6,
    TASK_ACTION_SHOW_MESSAGE = 7
} TASK_ACTION_TYPE;
typedef enum _TASK_INSTANCES_POLICY {
    TASK_INSTANCES_PARALLEL = 0,
    TASK_INSTANCES_QUEUE = 1,
    TASK_INSTANCES_IGNORE_NEW = 2,
    TASK_INSTANCES_STOP_EXISTING = 3
} TASK_INSTANCES_POLICY;
typedef enum _TASK_COMPATIBILITY {
    TASK_COMPATIBILITY_AT = 0,
    TASK_COMPATIBILITY_V1 = 1,
    TASK_COMPATIBILITY_V2 = 2,
    TASK_COMPATIBILITY_V2_1 = 3
} TASK_COMPATIBILITY;
typedef enum _TASK_CREATION {
    TASK_VALIDATE_ONLY = 1,
    TASK_CREATE = 2,
    TASK_UPDATE = 4,
    TASK_CREATE_OR_UPDATE = 6,
    TASK_DISABLE = 8,
    TASK_DONT_ADD_PRINCIPAL_ACE = 16,
    TASK_IGNORE_REGISTRATION_TRIGGERS = 32
} TASK_CREATION;
#ifndef __ITaskService_FWD_DEFINED__
#define __ITaskService_FWD_DEFINED__
typedef interface ITaskService ITaskService;
#endif

#ifndef __IRegisteredTask_FWD_DEFINED__
#define __IRegisteredTask_FWD_DEFINED__
typedef interface IRegisteredTask IRegisteredTask;
#endif

#ifndef __IRegisteredTaskCollection_FWD_DEFINED__
#define __IRegisteredTaskCollection_FWD_DEFINED__
typedef interface IRegisteredTaskCollection IRegisteredTaskCollection;
#endif

#ifndef __IRegistrationInfo_FWD_DEFINED__
#define __IRegistrationInfo_FWD_DEFINED__
typedef interface IRegistrationInfo IRegistrationInfo;
#endif

#ifndef __ITaskFolder_FWD_DEFINED__
#define __ITaskFolder_FWD_DEFINED__
typedef interface ITaskFolder ITaskFolder;
#endif

#ifndef __ITaskFolderCollection_FWD_DEFINED__
#define __ITaskFolderCollection_FWD_DEFINED__
typedef interface ITaskFolderCollection ITaskFolderCollection;
#endif

#ifndef __ITaskDefinition_FWD_DEFINED__
#define __ITaskDefinition_FWD_DEFINED__
typedef interface ITaskDefinition ITaskDefinition;
#endif

#ifndef __ITaskSettings_FWD_DEFINED__
#define __ITaskSettings_FWD_DEFINED__
typedef interface ITaskSettings ITaskSettings;
#endif

#ifndef __IIdleSettings_FWD_DEFINED__
#define __IIdleSettings_FWD_DEFINED__
typedef interface IIdleSettings IIdleSettings;
#endif

#ifndef __IRunningTask_FWD_DEFINED__
#define __IRunningTask_FWD_DEFINED__
typedef interface IRunningTask IRunningTask;
#endif

#ifndef __IRunningTaskCollection_FWD_DEFINED__
#define __IRunningTaskCollection_FWD_DEFINED__
typedef interface IRunningTaskCollection IRunningTaskCollection;
#endif

#ifndef __ITrigger_FWD_DEFINED__
#define __ITrigger_FWD_DEFINED__
typedef interface ITrigger ITrigger;
#endif

#ifndef __ITriggerCollection_FWD_DEFINED__
#define __ITriggerCollection_FWD_DEFINED__
typedef interface ITriggerCollection ITriggerCollection;
#endif

#ifndef __ITimeTrigger_FWD_DEFINED__
#define __ITimeTrigger_FWD_DEFINED__
typedef interface ITimeTrigger ITimeTrigger;
#endif

#ifndef __IRepetitionPattern_FWD_DEFINED__
#define __IRepetitionPattern_FWD_DEFINED__
typedef interface IRepetitionPattern IRepetitionPattern;
#endif

#ifndef __IAction_FWD_DEFINED__
#define __IAction_FWD_DEFINED__
typedef interface IAction IAction;
#endif

#ifndef __IActionCollection_FWD_DEFINED__
#define __IActionCollection_FWD_DEFINED__
typedef interface IActionCollection IActionCollection;
#endif

#ifndef __IExecAction_FWD_DEFINED__
#define __IExecAction_FWD_DEFINED__
typedef interface IExecAction IExecAction;
#endif

#ifndef __INetworkSettings_FWD_DEFINED__
#define __INetworkSettings_FWD_DEFINED__
typedef interface INetworkSettings INetworkSettings;
#endif

#ifndef __IPrincipal_FWD_DEFINED__
#define __IPrincipal_FWD_DEFINED__
typedef interface IPrincipal IPrincipal;
#endif

/*****************************************************************************
 * ITaskService interface
 */
#ifndef __ITaskService_INTERFACE_DEFINED__
#define __ITaskService_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITaskService, 0x2faba4c7, 0x4da9, 0x4013, 0x96,0x97, 0x20,0xcc,0x3f,0xd4,0x0f,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2faba4c7-4da9-4013-9697-20cc3fd40f85")
ITaskService : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE GetFolder(
        BSTR path,
        ITaskFolder **folder) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRunningTasks(
        LONG flags,
        IRunningTaskCollection **tasks) = 0;

    virtual HRESULT STDMETHODCALLTYPE NewTask(
        DWORD flags,
        ITaskDefinition **definition) = 0;

    virtual HRESULT STDMETHODCALLTYPE Connect(
        VARIANT server,
        VARIANT user,
        VARIANT domain,
        VARIANT password) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Connected(
        VARIANT_BOOL *connected) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TargetServer(
        BSTR *server) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ConnectedUser(
        BSTR *user) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ConnectedDomain(
        BSTR *domain) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HighestVersion(
        DWORD *version) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITaskService, 0x2faba4c7, 0x4da9, 0x4013, 0x96,0x97, 0x20,0xcc,0x3f,0xd4,0x0f,0x85)
#endif
#else
typedef struct ITaskServiceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITaskService* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITaskService* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITaskService* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITaskService* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITaskService* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITaskService* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITaskService* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITaskService methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFolder)(
        ITaskService* This,
        BSTR path,
        ITaskFolder **folder);

    HRESULT (STDMETHODCALLTYPE *GetRunningTasks)(
        ITaskService* This,
        LONG flags,
        IRunningTaskCollection **tasks);

    HRESULT (STDMETHODCALLTYPE *NewTask)(
        ITaskService* This,
        DWORD flags,
        ITaskDefinition **definition);

    HRESULT (STDMETHODCALLTYPE *Connect)(
        ITaskService* This,
        VARIANT server,
        VARIANT user,
        VARIANT domain,
        VARIANT password);

    HRESULT (STDMETHODCALLTYPE *get_Connected)(
        ITaskService* This,
        VARIANT_BOOL *connected);

    HRESULT (STDMETHODCALLTYPE *get_TargetServer)(
        ITaskService* This,
        BSTR *server);

    HRESULT (STDMETHODCALLTYPE *get_ConnectedUser)(
        ITaskService* This,
        BSTR *user);

    HRESULT (STDMETHODCALLTYPE *get_ConnectedDomain)(
        ITaskService* This,
        BSTR *domain);

    HRESULT (STDMETHODCALLTYPE *get_HighestVersion)(
        ITaskService* This,
        DWORD *version);

    END_INTERFACE
} ITaskServiceVtbl;
interface ITaskService {
    CONST_VTBL ITaskServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITaskService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITaskService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITaskService_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITaskService_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITaskService_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITaskService_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITaskService_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITaskService methods ***/
#define ITaskService_GetFolder(This,path,folder) (This)->lpVtbl->GetFolder(This,path,folder)
#define ITaskService_GetRunningTasks(This,flags,tasks) (This)->lpVtbl->GetRunningTasks(This,flags,tasks)
#define ITaskService_NewTask(This,flags,definition) (This)->lpVtbl->NewTask(This,flags,definition)
#define ITaskService_Connect(This,server,user,domain,password) (This)->lpVtbl->Connect(This,server,user,domain,password)
#define ITaskService_get_Connected(This,connected) (This)->lpVtbl->get_Connected(This,connected)
#define ITaskService_get_TargetServer(This,server) (This)->lpVtbl->get_TargetServer(This,server)
#define ITaskService_get_ConnectedUser(This,user) (This)->lpVtbl->get_ConnectedUser(This,user)
#define ITaskService_get_ConnectedDomain(This,domain) (This)->lpVtbl->get_ConnectedDomain(This,domain)
#define ITaskService_get_HighestVersion(This,version) (This)->lpVtbl->get_HighestVersion(This,version)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITaskService_QueryInterface(ITaskService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITaskService_AddRef(ITaskService* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITaskService_Release(ITaskService* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITaskService_GetTypeInfoCount(ITaskService* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITaskService_GetTypeInfo(ITaskService* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITaskService_GetIDsOfNames(ITaskService* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITaskService_Invoke(ITaskService* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITaskService methods ***/
static FORCEINLINE HRESULT ITaskService_GetFolder(ITaskService* This,BSTR path,ITaskFolder **folder) {
    return This->lpVtbl->GetFolder(This,path,folder);
}
static FORCEINLINE HRESULT ITaskService_GetRunningTasks(ITaskService* This,LONG flags,IRunningTaskCollection **tasks) {
    return This->lpVtbl->GetRunningTasks(This,flags,tasks);
}
static FORCEINLINE HRESULT ITaskService_NewTask(ITaskService* This,DWORD flags,ITaskDefinition **definition) {
    return This->lpVtbl->NewTask(This,flags,definition);
}
static FORCEINLINE HRESULT ITaskService_Connect(ITaskService* This,VARIANT server,VARIANT user,VARIANT domain,VARIANT password) {
    return This->lpVtbl->Connect(This,server,user,domain,password);
}
static FORCEINLINE HRESULT ITaskService_get_Connected(ITaskService* This,VARIANT_BOOL *connected) {
    return This->lpVtbl->get_Connected(This,connected);
}
static FORCEINLINE HRESULT ITaskService_get_TargetServer(ITaskService* This,BSTR *server) {
    return This->lpVtbl->get_TargetServer(This,server);
}
static FORCEINLINE HRESULT ITaskService_get_ConnectedUser(ITaskService* This,BSTR *user) {
    return This->lpVtbl->get_ConnectedUser(This,user);
}
static FORCEINLINE HRESULT ITaskService_get_ConnectedDomain(ITaskService* This,BSTR *domain) {
    return This->lpVtbl->get_ConnectedDomain(This,domain);
}
static FORCEINLINE HRESULT ITaskService_get_HighestVersion(ITaskService* This,DWORD *version) {
    return This->lpVtbl->get_HighestVersion(This,version);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITaskService_GetFolder_Proxy(
    ITaskService* This,
    BSTR path,
    ITaskFolder **folder);
void __RPC_STUB ITaskService_GetFolder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskService_GetRunningTasks_Proxy(
    ITaskService* This,
    LONG flags,
    IRunningTaskCollection **tasks);
void __RPC_STUB ITaskService_GetRunningTasks_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskService_NewTask_Proxy(
    ITaskService* This,
    DWORD flags,
    ITaskDefinition **definition);
void __RPC_STUB ITaskService_NewTask_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskService_Connect_Proxy(
    ITaskService* This,
    VARIANT server,
    VARIANT user,
    VARIANT domain,
    VARIANT password);
void __RPC_STUB ITaskService_Connect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskService_get_Connected_Proxy(
    ITaskService* This,
    VARIANT_BOOL *connected);
void __RPC_STUB ITaskService_get_Connected_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskService_get_TargetServer_Proxy(
    ITaskService* This,
    BSTR *server);
void __RPC_STUB ITaskService_get_TargetServer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskService_get_ConnectedUser_Proxy(
    ITaskService* This,
    BSTR *user);
void __RPC_STUB ITaskService_get_ConnectedUser_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskService_get_ConnectedDomain_Proxy(
    ITaskService* This,
    BSTR *domain);
void __RPC_STUB ITaskService_get_ConnectedDomain_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskService_get_HighestVersion_Proxy(
    ITaskService* This,
    DWORD *version);
void __RPC_STUB ITaskService_get_HighestVersion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITaskService_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRegisteredTask interface
 */
#ifndef __IRegisteredTask_INTERFACE_DEFINED__
#define __IRegisteredTask_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRegisteredTask, 0x9c86f320, 0xdee3, 0x4dd1, 0xb9,0x72, 0xa3,0x03,0xf2,0x6b,0x06,0x1e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9c86f320-dee3-4dd1-b972-a303f26b061e")
IRegisteredTask : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Path(
        BSTR *path) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_State(
        TASK_STATE *state) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Enabled(
        VARIANT_BOOL *enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Enabled(
        VARIANT_BOOL enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE Run(
        VARIANT params,
        IRunningTask **task) = 0;

    virtual HRESULT STDMETHODCALLTYPE RunEx(
        VARIANT params,
        LONG flags,
        LONG sessionID,
        BSTR user,
        IRunningTask **task) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInstances(
        LONG flags,
        IRunningTaskCollection **tasks) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LastRunTime(
        DATE *date) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LastTaskResult(
        LONG *result) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_NumberOfMissedRuns(
        LONG *runs) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_NextRunTime(
        DATE *date) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Definition(
        ITaskDefinition **task) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Xml(
        BSTR *xml) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSecurityDescriptor(
        LONG info,
        BSTR *sddl) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSecurityDescriptor(
        BSTR sddl,
        LONG flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        LONG flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRunTimes(
        const LPSYSTEMTIME start,
        const LPSYSTEMTIME end,
        DWORD *count,
        LPSYSTEMTIME *time) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRegisteredTask, 0x9c86f320, 0xdee3, 0x4dd1, 0xb9,0x72, 0xa3,0x03,0xf2,0x6b,0x06,0x1e)
#endif
#else
typedef struct IRegisteredTaskVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRegisteredTask* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRegisteredTask* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRegisteredTask* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRegisteredTask* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRegisteredTask* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRegisteredTask* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRegisteredTask* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRegisteredTask methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IRegisteredTask* This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IRegisteredTask* This,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *get_State)(
        IRegisteredTask* This,
        TASK_STATE *state);

    HRESULT (STDMETHODCALLTYPE *get_Enabled)(
        IRegisteredTask* This,
        VARIANT_BOOL *enabled);

    HRESULT (STDMETHODCALLTYPE *put_Enabled)(
        IRegisteredTask* This,
        VARIANT_BOOL enabled);

    HRESULT (STDMETHODCALLTYPE *Run)(
        IRegisteredTask* This,
        VARIANT params,
        IRunningTask **task);

    HRESULT (STDMETHODCALLTYPE *RunEx)(
        IRegisteredTask* This,
        VARIANT params,
        LONG flags,
        LONG sessionID,
        BSTR user,
        IRunningTask **task);

    HRESULT (STDMETHODCALLTYPE *GetInstances)(
        IRegisteredTask* This,
        LONG flags,
        IRunningTaskCollection **tasks);

    HRESULT (STDMETHODCALLTYPE *get_LastRunTime)(
        IRegisteredTask* This,
        DATE *date);

    HRESULT (STDMETHODCALLTYPE *get_LastTaskResult)(
        IRegisteredTask* This,
        LONG *result);

    HRESULT (STDMETHODCALLTYPE *get_NumberOfMissedRuns)(
        IRegisteredTask* This,
        LONG *runs);

    HRESULT (STDMETHODCALLTYPE *get_NextRunTime)(
        IRegisteredTask* This,
        DATE *date);

    HRESULT (STDMETHODCALLTYPE *get_Definition)(
        IRegisteredTask* This,
        ITaskDefinition **task);

    HRESULT (STDMETHODCALLTYPE *get_Xml)(
        IRegisteredTask* This,
        BSTR *xml);

    HRESULT (STDMETHODCALLTYPE *GetSecurityDescriptor)(
        IRegisteredTask* This,
        LONG info,
        BSTR *sddl);

    HRESULT (STDMETHODCALLTYPE *SetSecurityDescriptor)(
        IRegisteredTask* This,
        BSTR sddl,
        LONG flags);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IRegisteredTask* This,
        LONG flags);

    HRESULT (STDMETHODCALLTYPE *GetRunTimes)(
        IRegisteredTask* This,
        const LPSYSTEMTIME start,
        const LPSYSTEMTIME end,
        DWORD *count,
        LPSYSTEMTIME *time);

    END_INTERFACE
} IRegisteredTaskVtbl;
interface IRegisteredTask {
    CONST_VTBL IRegisteredTaskVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRegisteredTask_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRegisteredTask_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRegisteredTask_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRegisteredTask_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRegisteredTask_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRegisteredTask_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRegisteredTask_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRegisteredTask methods ***/
#define IRegisteredTask_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
#define IRegisteredTask_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
#define IRegisteredTask_get_State(This,state) (This)->lpVtbl->get_State(This,state)
#define IRegisteredTask_get_Enabled(This,enabled) (This)->lpVtbl->get_Enabled(This,enabled)
#define IRegisteredTask_put_Enabled(This,enabled) (This)->lpVtbl->put_Enabled(This,enabled)
#define IRegisteredTask_Run(This,params,task) (This)->lpVtbl->Run(This,params,task)
#define IRegisteredTask_RunEx(This,params,flags,sessionID,user,task) (This)->lpVtbl->RunEx(This,params,flags,sessionID,user,task)
#define IRegisteredTask_GetInstances(This,flags,tasks) (This)->lpVtbl->GetInstances(This,flags,tasks)
#define IRegisteredTask_get_LastRunTime(This,date) (This)->lpVtbl->get_LastRunTime(This,date)
#define IRegisteredTask_get_LastTaskResult(This,result) (This)->lpVtbl->get_LastTaskResult(This,result)
#define IRegisteredTask_get_NumberOfMissedRuns(This,runs) (This)->lpVtbl->get_NumberOfMissedRuns(This,runs)
#define IRegisteredTask_get_NextRunTime(This,date) (This)->lpVtbl->get_NextRunTime(This,date)
#define IRegisteredTask_get_Definition(This,task) (This)->lpVtbl->get_Definition(This,task)
#define IRegisteredTask_get_Xml(This,xml) (This)->lpVtbl->get_Xml(This,xml)
#define IRegisteredTask_GetSecurityDescriptor(This,info,sddl) (This)->lpVtbl->GetSecurityDescriptor(This,info,sddl)
#define IRegisteredTask_SetSecurityDescriptor(This,sddl,flags) (This)->lpVtbl->SetSecurityDescriptor(This,sddl,flags)
#define IRegisteredTask_Stop(This,flags) (This)->lpVtbl->Stop(This,flags)
#define IRegisteredTask_GetRunTimes(This,start,end,count,time) (This)->lpVtbl->GetRunTimes(This,start,end,count,time)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRegisteredTask_QueryInterface(IRegisteredTask* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRegisteredTask_AddRef(IRegisteredTask* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRegisteredTask_Release(IRegisteredTask* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRegisteredTask_GetTypeInfoCount(IRegisteredTask* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRegisteredTask_GetTypeInfo(IRegisteredTask* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRegisteredTask_GetIDsOfNames(IRegisteredTask* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRegisteredTask_Invoke(IRegisteredTask* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRegisteredTask methods ***/
static FORCEINLINE HRESULT IRegisteredTask_get_Name(IRegisteredTask* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static FORCEINLINE HRESULT IRegisteredTask_get_Path(IRegisteredTask* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static FORCEINLINE HRESULT IRegisteredTask_get_State(IRegisteredTask* This,TASK_STATE *state) {
    return This->lpVtbl->get_State(This,state);
}
static FORCEINLINE HRESULT IRegisteredTask_get_Enabled(IRegisteredTask* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->get_Enabled(This,enabled);
}
static FORCEINLINE HRESULT IRegisteredTask_put_Enabled(IRegisteredTask* This,VARIANT_BOOL enabled) {
    return This->lpVtbl->put_Enabled(This,enabled);
}
static FORCEINLINE HRESULT IRegisteredTask_Run(IRegisteredTask* This,VARIANT params,IRunningTask **task) {
    return This->lpVtbl->Run(This,params,task);
}
static FORCEINLINE HRESULT IRegisteredTask_RunEx(IRegisteredTask* This,VARIANT params,LONG flags,LONG sessionID,BSTR user,IRunningTask **task) {
    return This->lpVtbl->RunEx(This,params,flags,sessionID,user,task);
}
static FORCEINLINE HRESULT IRegisteredTask_GetInstances(IRegisteredTask* This,LONG flags,IRunningTaskCollection **tasks) {
    return This->lpVtbl->GetInstances(This,flags,tasks);
}
static FORCEINLINE HRESULT IRegisteredTask_get_LastRunTime(IRegisteredTask* This,DATE *date) {
    return This->lpVtbl->get_LastRunTime(This,date);
}
static FORCEINLINE HRESULT IRegisteredTask_get_LastTaskResult(IRegisteredTask* This,LONG *result) {
    return This->lpVtbl->get_LastTaskResult(This,result);
}
static FORCEINLINE HRESULT IRegisteredTask_get_NumberOfMissedRuns(IRegisteredTask* This,LONG *runs) {
    return This->lpVtbl->get_NumberOfMissedRuns(This,runs);
}
static FORCEINLINE HRESULT IRegisteredTask_get_NextRunTime(IRegisteredTask* This,DATE *date) {
    return This->lpVtbl->get_NextRunTime(This,date);
}
static FORCEINLINE HRESULT IRegisteredTask_get_Definition(IRegisteredTask* This,ITaskDefinition **task) {
    return This->lpVtbl->get_Definition(This,task);
}
static FORCEINLINE HRESULT IRegisteredTask_get_Xml(IRegisteredTask* This,BSTR *xml) {
    return This->lpVtbl->get_Xml(This,xml);
}
static FORCEINLINE HRESULT IRegisteredTask_GetSecurityDescriptor(IRegisteredTask* This,LONG info,BSTR *sddl) {
    return This->lpVtbl->GetSecurityDescriptor(This,info,sddl);
}
static FORCEINLINE HRESULT IRegisteredTask_SetSecurityDescriptor(IRegisteredTask* This,BSTR sddl,LONG flags) {
    return This->lpVtbl->SetSecurityDescriptor(This,sddl,flags);
}
static FORCEINLINE HRESULT IRegisteredTask_Stop(IRegisteredTask* This,LONG flags) {
    return This->lpVtbl->Stop(This,flags);
}
static FORCEINLINE HRESULT IRegisteredTask_GetRunTimes(IRegisteredTask* This,const LPSYSTEMTIME start,const LPSYSTEMTIME end,DWORD *count,LPSYSTEMTIME *time) {
    return This->lpVtbl->GetRunTimes(This,start,end,count,time);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IRegisteredTask_get_Name_Proxy(
    IRegisteredTask* This,
    BSTR *name);
void __RPC_STUB IRegisteredTask_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_get_Path_Proxy(
    IRegisteredTask* This,
    BSTR *path);
void __RPC_STUB IRegisteredTask_get_Path_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_get_State_Proxy(
    IRegisteredTask* This,
    TASK_STATE *state);
void __RPC_STUB IRegisteredTask_get_State_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_get_Enabled_Proxy(
    IRegisteredTask* This,
    VARIANT_BOOL *enabled);
void __RPC_STUB IRegisteredTask_get_Enabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_put_Enabled_Proxy(
    IRegisteredTask* This,
    VARIANT_BOOL enabled);
void __RPC_STUB IRegisteredTask_put_Enabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_Run_Proxy(
    IRegisteredTask* This,
    VARIANT params,
    IRunningTask **task);
void __RPC_STUB IRegisteredTask_Run_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_RunEx_Proxy(
    IRegisteredTask* This,
    VARIANT params,
    LONG flags,
    LONG sessionID,
    BSTR user,
    IRunningTask **task);
void __RPC_STUB IRegisteredTask_RunEx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_GetInstances_Proxy(
    IRegisteredTask* This,
    LONG flags,
    IRunningTaskCollection **tasks);
void __RPC_STUB IRegisteredTask_GetInstances_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_get_LastRunTime_Proxy(
    IRegisteredTask* This,
    DATE *date);
void __RPC_STUB IRegisteredTask_get_LastRunTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_get_LastTaskResult_Proxy(
    IRegisteredTask* This,
    LONG *result);
void __RPC_STUB IRegisteredTask_get_LastTaskResult_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_get_NumberOfMissedRuns_Proxy(
    IRegisteredTask* This,
    LONG *runs);
void __RPC_STUB IRegisteredTask_get_NumberOfMissedRuns_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_get_NextRunTime_Proxy(
    IRegisteredTask* This,
    DATE *date);
void __RPC_STUB IRegisteredTask_get_NextRunTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_get_Definition_Proxy(
    IRegisteredTask* This,
    ITaskDefinition **task);
void __RPC_STUB IRegisteredTask_get_Definition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_get_Xml_Proxy(
    IRegisteredTask* This,
    BSTR *xml);
void __RPC_STUB IRegisteredTask_get_Xml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_GetSecurityDescriptor_Proxy(
    IRegisteredTask* This,
    LONG info,
    BSTR *sddl);
void __RPC_STUB IRegisteredTask_GetSecurityDescriptor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_SetSecurityDescriptor_Proxy(
    IRegisteredTask* This,
    BSTR sddl,
    LONG flags);
void __RPC_STUB IRegisteredTask_SetSecurityDescriptor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_Stop_Proxy(
    IRegisteredTask* This,
    LONG flags);
void __RPC_STUB IRegisteredTask_Stop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTask_GetRunTimes_Proxy(
    IRegisteredTask* This,
    const LPSYSTEMTIME start,
    const LPSYSTEMTIME end,
    DWORD *count,
    LPSYSTEMTIME *time);
void __RPC_STUB IRegisteredTask_GetRunTimes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IRegisteredTask_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRegisteredTaskCollection interface
 */
#ifndef __IRegisteredTaskCollection_INTERFACE_DEFINED__
#define __IRegisteredTaskCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRegisteredTaskCollection, 0x86627eb4, 0x42a7, 0x41e4, 0xa4,0xd9, 0xac,0x33,0xa7,0x2f,0x2d,0x52);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("86627eb4-42a7-41e4-a4d9-ac33a72f2d52")
IRegisteredTaskCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        VARIANT index,
        IRegisteredTask **task) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **penum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRegisteredTaskCollection, 0x86627eb4, 0x42a7, 0x41e4, 0xa4,0xd9, 0xac,0x33,0xa7,0x2f,0x2d,0x52)
#endif
#else
typedef struct IRegisteredTaskCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRegisteredTaskCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRegisteredTaskCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRegisteredTaskCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRegisteredTaskCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRegisteredTaskCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRegisteredTaskCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRegisteredTaskCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRegisteredTaskCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IRegisteredTaskCollection* This,
        LONG *count);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IRegisteredTaskCollection* This,
        VARIANT index,
        IRegisteredTask **task);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IRegisteredTaskCollection* This,
        IUnknown **penum);

    END_INTERFACE
} IRegisteredTaskCollectionVtbl;
interface IRegisteredTaskCollection {
    CONST_VTBL IRegisteredTaskCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRegisteredTaskCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRegisteredTaskCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRegisteredTaskCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRegisteredTaskCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRegisteredTaskCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRegisteredTaskCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRegisteredTaskCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRegisteredTaskCollection methods ***/
#define IRegisteredTaskCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
#define IRegisteredTaskCollection_get_Item(This,index,task) (This)->lpVtbl->get_Item(This,index,task)
#define IRegisteredTaskCollection_get__NewEnum(This,penum) (This)->lpVtbl->get__NewEnum(This,penum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRegisteredTaskCollection_QueryInterface(IRegisteredTaskCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRegisteredTaskCollection_AddRef(IRegisteredTaskCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRegisteredTaskCollection_Release(IRegisteredTaskCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRegisteredTaskCollection_GetTypeInfoCount(IRegisteredTaskCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRegisteredTaskCollection_GetTypeInfo(IRegisteredTaskCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRegisteredTaskCollection_GetIDsOfNames(IRegisteredTaskCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRegisteredTaskCollection_Invoke(IRegisteredTaskCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRegisteredTaskCollection methods ***/
static FORCEINLINE HRESULT IRegisteredTaskCollection_get_Count(IRegisteredTaskCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static FORCEINLINE HRESULT IRegisteredTaskCollection_get_Item(IRegisteredTaskCollection* This,VARIANT index,IRegisteredTask **task) {
    return This->lpVtbl->get_Item(This,index,task);
}
static FORCEINLINE HRESULT IRegisteredTaskCollection_get__NewEnum(IRegisteredTaskCollection* This,IUnknown **penum) {
    return This->lpVtbl->get__NewEnum(This,penum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IRegisteredTaskCollection_get_Count_Proxy(
    IRegisteredTaskCollection* This,
    LONG *count);
void __RPC_STUB IRegisteredTaskCollection_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTaskCollection_get_Item_Proxy(
    IRegisteredTaskCollection* This,
    VARIANT index,
    IRegisteredTask **task);
void __RPC_STUB IRegisteredTaskCollection_get_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisteredTaskCollection_get__NewEnum_Proxy(
    IRegisteredTaskCollection* This,
    IUnknown **penum);
void __RPC_STUB IRegisteredTaskCollection_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IRegisteredTaskCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRegistrationInfo interface
 */
#ifndef __IRegistrationInfo_INTERFACE_DEFINED__
#define __IRegistrationInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRegistrationInfo, 0x416d8b73, 0xcb41, 0x4ea1, 0x80,0x5c, 0x9b,0xe9,0xa5,0xac,0x4a,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("416d8b73-cb41-4ea1-805c-9be9a5ac4a74")
IRegistrationInfo : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Description(
        BSTR *description) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Description(
        BSTR description) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Author(
        BSTR *author) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Author(
        BSTR author) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Version(
        BSTR *version) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Version(
        BSTR version) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Date(
        BSTR *date) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Date(
        BSTR date) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Documentation(
        BSTR *doc) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Documentation(
        BSTR doc) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_XmlText(
        BSTR *xml) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_XmlText(
        BSTR xml) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_URI(
        BSTR *uri) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_URI(
        BSTR uri) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SecurityDescriptor(
        VARIANT *sddl) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SecurityDescriptor(
        VARIANT sddl) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Source(
        BSTR *source) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Source(
        BSTR source) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRegistrationInfo, 0x416d8b73, 0xcb41, 0x4ea1, 0x80,0x5c, 0x9b,0xe9,0xa5,0xac,0x4a,0x74)
#endif
#else
typedef struct IRegistrationInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRegistrationInfo* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRegistrationInfo* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRegistrationInfo* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRegistrationInfo* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRegistrationInfo* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRegistrationInfo* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRegistrationInfo* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRegistrationInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IRegistrationInfo* This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IRegistrationInfo* This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *get_Author)(
        IRegistrationInfo* This,
        BSTR *author);

    HRESULT (STDMETHODCALLTYPE *put_Author)(
        IRegistrationInfo* This,
        BSTR author);

    HRESULT (STDMETHODCALLTYPE *get_Version)(
        IRegistrationInfo* This,
        BSTR *version);

    HRESULT (STDMETHODCALLTYPE *put_Version)(
        IRegistrationInfo* This,
        BSTR version);

    HRESULT (STDMETHODCALLTYPE *get_Date)(
        IRegistrationInfo* This,
        BSTR *date);

    HRESULT (STDMETHODCALLTYPE *put_Date)(
        IRegistrationInfo* This,
        BSTR date);

    HRESULT (STDMETHODCALLTYPE *get_Documentation)(
        IRegistrationInfo* This,
        BSTR *doc);

    HRESULT (STDMETHODCALLTYPE *put_Documentation)(
        IRegistrationInfo* This,
        BSTR doc);

    HRESULT (STDMETHODCALLTYPE *get_XmlText)(
        IRegistrationInfo* This,
        BSTR *xml);

    HRESULT (STDMETHODCALLTYPE *put_XmlText)(
        IRegistrationInfo* This,
        BSTR xml);

    HRESULT (STDMETHODCALLTYPE *get_URI)(
        IRegistrationInfo* This,
        BSTR *uri);

    HRESULT (STDMETHODCALLTYPE *put_URI)(
        IRegistrationInfo* This,
        BSTR uri);

    HRESULT (STDMETHODCALLTYPE *get_SecurityDescriptor)(
        IRegistrationInfo* This,
        VARIANT *sddl);

    HRESULT (STDMETHODCALLTYPE *put_SecurityDescriptor)(
        IRegistrationInfo* This,
        VARIANT sddl);

    HRESULT (STDMETHODCALLTYPE *get_Source)(
        IRegistrationInfo* This,
        BSTR *source);

    HRESULT (STDMETHODCALLTYPE *put_Source)(
        IRegistrationInfo* This,
        BSTR source);

    END_INTERFACE
} IRegistrationInfoVtbl;
interface IRegistrationInfo {
    CONST_VTBL IRegistrationInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRegistrationInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRegistrationInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRegistrationInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRegistrationInfo_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRegistrationInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRegistrationInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRegistrationInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRegistrationInfo methods ***/
#define IRegistrationInfo_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IRegistrationInfo_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IRegistrationInfo_get_Author(This,author) (This)->lpVtbl->get_Author(This,author)
#define IRegistrationInfo_put_Author(This,author) (This)->lpVtbl->put_Author(This,author)
#define IRegistrationInfo_get_Version(This,version) (This)->lpVtbl->get_Version(This,version)
#define IRegistrationInfo_put_Version(This,version) (This)->lpVtbl->put_Version(This,version)
#define IRegistrationInfo_get_Date(This,date) (This)->lpVtbl->get_Date(This,date)
#define IRegistrationInfo_put_Date(This,date) (This)->lpVtbl->put_Date(This,date)
#define IRegistrationInfo_get_Documentation(This,doc) (This)->lpVtbl->get_Documentation(This,doc)
#define IRegistrationInfo_put_Documentation(This,doc) (This)->lpVtbl->put_Documentation(This,doc)
#define IRegistrationInfo_get_XmlText(This,xml) (This)->lpVtbl->get_XmlText(This,xml)
#define IRegistrationInfo_put_XmlText(This,xml) (This)->lpVtbl->put_XmlText(This,xml)
#define IRegistrationInfo_get_URI(This,uri) (This)->lpVtbl->get_URI(This,uri)
#define IRegistrationInfo_put_URI(This,uri) (This)->lpVtbl->put_URI(This,uri)
#define IRegistrationInfo_get_SecurityDescriptor(This,sddl) (This)->lpVtbl->get_SecurityDescriptor(This,sddl)
#define IRegistrationInfo_put_SecurityDescriptor(This,sddl) (This)->lpVtbl->put_SecurityDescriptor(This,sddl)
#define IRegistrationInfo_get_Source(This,source) (This)->lpVtbl->get_Source(This,source)
#define IRegistrationInfo_put_Source(This,source) (This)->lpVtbl->put_Source(This,source)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRegistrationInfo_QueryInterface(IRegistrationInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRegistrationInfo_AddRef(IRegistrationInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRegistrationInfo_Release(IRegistrationInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRegistrationInfo_GetTypeInfoCount(IRegistrationInfo* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRegistrationInfo_GetTypeInfo(IRegistrationInfo* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRegistrationInfo_GetIDsOfNames(IRegistrationInfo* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRegistrationInfo_Invoke(IRegistrationInfo* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRegistrationInfo methods ***/
static FORCEINLINE HRESULT IRegistrationInfo_get_Description(IRegistrationInfo* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static FORCEINLINE HRESULT IRegistrationInfo_put_Description(IRegistrationInfo* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static FORCEINLINE HRESULT IRegistrationInfo_get_Author(IRegistrationInfo* This,BSTR *author) {
    return This->lpVtbl->get_Author(This,author);
}
static FORCEINLINE HRESULT IRegistrationInfo_put_Author(IRegistrationInfo* This,BSTR author) {
    return This->lpVtbl->put_Author(This,author);
}
static FORCEINLINE HRESULT IRegistrationInfo_get_Version(IRegistrationInfo* This,BSTR *version) {
    return This->lpVtbl->get_Version(This,version);
}
static FORCEINLINE HRESULT IRegistrationInfo_put_Version(IRegistrationInfo* This,BSTR version) {
    return This->lpVtbl->put_Version(This,version);
}
static FORCEINLINE HRESULT IRegistrationInfo_get_Date(IRegistrationInfo* This,BSTR *date) {
    return This->lpVtbl->get_Date(This,date);
}
static FORCEINLINE HRESULT IRegistrationInfo_put_Date(IRegistrationInfo* This,BSTR date) {
    return This->lpVtbl->put_Date(This,date);
}
static FORCEINLINE HRESULT IRegistrationInfo_get_Documentation(IRegistrationInfo* This,BSTR *doc) {
    return This->lpVtbl->get_Documentation(This,doc);
}
static FORCEINLINE HRESULT IRegistrationInfo_put_Documentation(IRegistrationInfo* This,BSTR doc) {
    return This->lpVtbl->put_Documentation(This,doc);
}
static FORCEINLINE HRESULT IRegistrationInfo_get_XmlText(IRegistrationInfo* This,BSTR *xml) {
    return This->lpVtbl->get_XmlText(This,xml);
}
static FORCEINLINE HRESULT IRegistrationInfo_put_XmlText(IRegistrationInfo* This,BSTR xml) {
    return This->lpVtbl->put_XmlText(This,xml);
}
static FORCEINLINE HRESULT IRegistrationInfo_get_URI(IRegistrationInfo* This,BSTR *uri) {
    return This->lpVtbl->get_URI(This,uri);
}
static FORCEINLINE HRESULT IRegistrationInfo_put_URI(IRegistrationInfo* This,BSTR uri) {
    return This->lpVtbl->put_URI(This,uri);
}
static FORCEINLINE HRESULT IRegistrationInfo_get_SecurityDescriptor(IRegistrationInfo* This,VARIANT *sddl) {
    return This->lpVtbl->get_SecurityDescriptor(This,sddl);
}
static FORCEINLINE HRESULT IRegistrationInfo_put_SecurityDescriptor(IRegistrationInfo* This,VARIANT sddl) {
    return This->lpVtbl->put_SecurityDescriptor(This,sddl);
}
static FORCEINLINE HRESULT IRegistrationInfo_get_Source(IRegistrationInfo* This,BSTR *source) {
    return This->lpVtbl->get_Source(This,source);
}
static FORCEINLINE HRESULT IRegistrationInfo_put_Source(IRegistrationInfo* This,BSTR source) {
    return This->lpVtbl->put_Source(This,source);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IRegistrationInfo_get_Description_Proxy(
    IRegistrationInfo* This,
    BSTR *description);
void __RPC_STUB IRegistrationInfo_get_Description_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_put_Description_Proxy(
    IRegistrationInfo* This,
    BSTR description);
void __RPC_STUB IRegistrationInfo_put_Description_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_get_Author_Proxy(
    IRegistrationInfo* This,
    BSTR *author);
void __RPC_STUB IRegistrationInfo_get_Author_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_put_Author_Proxy(
    IRegistrationInfo* This,
    BSTR author);
void __RPC_STUB IRegistrationInfo_put_Author_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_get_Version_Proxy(
    IRegistrationInfo* This,
    BSTR *version);
void __RPC_STUB IRegistrationInfo_get_Version_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_put_Version_Proxy(
    IRegistrationInfo* This,
    BSTR version);
void __RPC_STUB IRegistrationInfo_put_Version_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_get_Date_Proxy(
    IRegistrationInfo* This,
    BSTR *date);
void __RPC_STUB IRegistrationInfo_get_Date_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_put_Date_Proxy(
    IRegistrationInfo* This,
    BSTR date);
void __RPC_STUB IRegistrationInfo_put_Date_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_get_Documentation_Proxy(
    IRegistrationInfo* This,
    BSTR *doc);
void __RPC_STUB IRegistrationInfo_get_Documentation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_put_Documentation_Proxy(
    IRegistrationInfo* This,
    BSTR doc);
void __RPC_STUB IRegistrationInfo_put_Documentation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_get_XmlText_Proxy(
    IRegistrationInfo* This,
    BSTR *xml);
void __RPC_STUB IRegistrationInfo_get_XmlText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_put_XmlText_Proxy(
    IRegistrationInfo* This,
    BSTR xml);
void __RPC_STUB IRegistrationInfo_put_XmlText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_get_URI_Proxy(
    IRegistrationInfo* This,
    BSTR *uri);
void __RPC_STUB IRegistrationInfo_get_URI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_put_URI_Proxy(
    IRegistrationInfo* This,
    BSTR uri);
void __RPC_STUB IRegistrationInfo_put_URI_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_get_SecurityDescriptor_Proxy(
    IRegistrationInfo* This,
    VARIANT *sddl);
void __RPC_STUB IRegistrationInfo_get_SecurityDescriptor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_put_SecurityDescriptor_Proxy(
    IRegistrationInfo* This,
    VARIANT sddl);
void __RPC_STUB IRegistrationInfo_put_SecurityDescriptor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_get_Source_Proxy(
    IRegistrationInfo* This,
    BSTR *source);
void __RPC_STUB IRegistrationInfo_get_Source_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegistrationInfo_put_Source_Proxy(
    IRegistrationInfo* This,
    BSTR source);
void __RPC_STUB IRegistrationInfo_put_Source_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IRegistrationInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITaskFolder interface
 */
#ifndef __ITaskFolder_INTERFACE_DEFINED__
#define __ITaskFolder_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITaskFolder, 0x8cfac062, 0xa080, 0x4c15, 0x9a,0x88, 0xaa,0x7c,0x2a,0xf8,0x0d,0xfc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8cfac062-a080-4c15-9a88-aa7c2af80dfc")
ITaskFolder : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Path(
        BSTR *path) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolder(
        BSTR path,
        ITaskFolder **folder) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolders(
        LONG flags,
        ITaskFolderCollection **folders) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFolder(
        BSTR name,
        VARIANT sddl,
        ITaskFolder **folder) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteFolder(
        BSTR name,
        LONG flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTask(
        BSTR path,
        IRegisteredTask **task) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTasks(
        LONG flags,
        IRegisteredTaskCollection **tasks) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteTask(
        BSTR name,
        LONG flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterTask(
        BSTR path,
        BSTR xml,
        LONG flags,
        VARIANT user,
        VARIANT password,
        TASK_LOGON_TYPE logonType,
        VARIANT sddl,
        IRegisteredTask **task) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterTaskDefinition(
        BSTR path,
        ITaskDefinition *definition,
        LONG flags,
        VARIANT user,
        VARIANT password,
        TASK_LOGON_TYPE logon,
        VARIANT sddl,
        IRegisteredTask **task) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSecurityDescriptor(
        LONG info,
        BSTR *sddl) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSecurityDescriptor(
        BSTR sddl,
        LONG flags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITaskFolder, 0x8cfac062, 0xa080, 0x4c15, 0x9a,0x88, 0xaa,0x7c,0x2a,0xf8,0x0d,0xfc)
#endif
#else
typedef struct ITaskFolderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITaskFolder* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITaskFolder* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITaskFolder* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITaskFolder* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITaskFolder* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITaskFolder* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITaskFolder* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITaskFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        ITaskFolder* This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_Path)(
        ITaskFolder* This,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *GetFolder)(
        ITaskFolder* This,
        BSTR path,
        ITaskFolder **folder);

    HRESULT (STDMETHODCALLTYPE *GetFolders)(
        ITaskFolder* This,
        LONG flags,
        ITaskFolderCollection **folders);

    HRESULT (STDMETHODCALLTYPE *CreateFolder)(
        ITaskFolder* This,
        BSTR name,
        VARIANT sddl,
        ITaskFolder **folder);

    HRESULT (STDMETHODCALLTYPE *DeleteFolder)(
        ITaskFolder* This,
        BSTR name,
        LONG flags);

    HRESULT (STDMETHODCALLTYPE *GetTask)(
        ITaskFolder* This,
        BSTR path,
        IRegisteredTask **task);

    HRESULT (STDMETHODCALLTYPE *GetTasks)(
        ITaskFolder* This,
        LONG flags,
        IRegisteredTaskCollection **tasks);

    HRESULT (STDMETHODCALLTYPE *DeleteTask)(
        ITaskFolder* This,
        BSTR name,
        LONG flags);

    HRESULT (STDMETHODCALLTYPE *RegisterTask)(
        ITaskFolder* This,
        BSTR path,
        BSTR xml,
        LONG flags,
        VARIANT user,
        VARIANT password,
        TASK_LOGON_TYPE logonType,
        VARIANT sddl,
        IRegisteredTask **task);

    HRESULT (STDMETHODCALLTYPE *RegisterTaskDefinition)(
        ITaskFolder* This,
        BSTR path,
        ITaskDefinition *definition,
        LONG flags,
        VARIANT user,
        VARIANT password,
        TASK_LOGON_TYPE logon,
        VARIANT sddl,
        IRegisteredTask **task);

    HRESULT (STDMETHODCALLTYPE *GetSecurityDescriptor)(
        ITaskFolder* This,
        LONG info,
        BSTR *sddl);

    HRESULT (STDMETHODCALLTYPE *SetSecurityDescriptor)(
        ITaskFolder* This,
        BSTR sddl,
        LONG flags);

    END_INTERFACE
} ITaskFolderVtbl;
interface ITaskFolder {
    CONST_VTBL ITaskFolderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITaskFolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITaskFolder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITaskFolder_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITaskFolder_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITaskFolder_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITaskFolder_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITaskFolder_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITaskFolder methods ***/
#define ITaskFolder_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
#define ITaskFolder_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
#define ITaskFolder_GetFolder(This,path,folder) (This)->lpVtbl->GetFolder(This,path,folder)
#define ITaskFolder_GetFolders(This,flags,folders) (This)->lpVtbl->GetFolders(This,flags,folders)
#define ITaskFolder_CreateFolder(This,name,sddl,folder) (This)->lpVtbl->CreateFolder(This,name,sddl,folder)
#define ITaskFolder_DeleteFolder(This,name,flags) (This)->lpVtbl->DeleteFolder(This,name,flags)
#define ITaskFolder_GetTask(This,path,task) (This)->lpVtbl->GetTask(This,path,task)
#define ITaskFolder_GetTasks(This,flags,tasks) (This)->lpVtbl->GetTasks(This,flags,tasks)
#define ITaskFolder_DeleteTask(This,name,flags) (This)->lpVtbl->DeleteTask(This,name,flags)
#define ITaskFolder_RegisterTask(This,path,xml,flags,user,password,logonType,sddl,task) (This)->lpVtbl->RegisterTask(This,path,xml,flags,user,password,logonType,sddl,task)
#define ITaskFolder_RegisterTaskDefinition(This,path,definition,flags,user,password,logon,sddl,task) (This)->lpVtbl->RegisterTaskDefinition(This,path,definition,flags,user,password,logon,sddl,task)
#define ITaskFolder_GetSecurityDescriptor(This,info,sddl) (This)->lpVtbl->GetSecurityDescriptor(This,info,sddl)
#define ITaskFolder_SetSecurityDescriptor(This,sddl,flags) (This)->lpVtbl->SetSecurityDescriptor(This,sddl,flags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITaskFolder_QueryInterface(ITaskFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITaskFolder_AddRef(ITaskFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITaskFolder_Release(ITaskFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITaskFolder_GetTypeInfoCount(ITaskFolder* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITaskFolder_GetTypeInfo(ITaskFolder* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITaskFolder_GetIDsOfNames(ITaskFolder* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITaskFolder_Invoke(ITaskFolder* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITaskFolder methods ***/
static FORCEINLINE HRESULT ITaskFolder_get_Name(ITaskFolder* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static FORCEINLINE HRESULT ITaskFolder_get_Path(ITaskFolder* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static FORCEINLINE HRESULT ITaskFolder_GetFolder(ITaskFolder* This,BSTR path,ITaskFolder **folder) {
    return This->lpVtbl->GetFolder(This,path,folder);
}
static FORCEINLINE HRESULT ITaskFolder_GetFolders(ITaskFolder* This,LONG flags,ITaskFolderCollection **folders) {
    return This->lpVtbl->GetFolders(This,flags,folders);
}
static FORCEINLINE HRESULT ITaskFolder_CreateFolder(ITaskFolder* This,BSTR name,VARIANT sddl,ITaskFolder **folder) {
    return This->lpVtbl->CreateFolder(This,name,sddl,folder);
}
static FORCEINLINE HRESULT ITaskFolder_DeleteFolder(ITaskFolder* This,BSTR name,LONG flags) {
    return This->lpVtbl->DeleteFolder(This,name,flags);
}
static FORCEINLINE HRESULT ITaskFolder_GetTask(ITaskFolder* This,BSTR path,IRegisteredTask **task) {
    return This->lpVtbl->GetTask(This,path,task);
}
static FORCEINLINE HRESULT ITaskFolder_GetTasks(ITaskFolder* This,LONG flags,IRegisteredTaskCollection **tasks) {
    return This->lpVtbl->GetTasks(This,flags,tasks);
}
static FORCEINLINE HRESULT ITaskFolder_DeleteTask(ITaskFolder* This,BSTR name,LONG flags) {
    return This->lpVtbl->DeleteTask(This,name,flags);
}
static FORCEINLINE HRESULT ITaskFolder_RegisterTask(ITaskFolder* This,BSTR path,BSTR xml,LONG flags,VARIANT user,VARIANT password,TASK_LOGON_TYPE logonType,VARIANT sddl,IRegisteredTask **task) {
    return This->lpVtbl->RegisterTask(This,path,xml,flags,user,password,logonType,sddl,task);
}
static FORCEINLINE HRESULT ITaskFolder_RegisterTaskDefinition(ITaskFolder* This,BSTR path,ITaskDefinition *definition,LONG flags,VARIANT user,VARIANT password,TASK_LOGON_TYPE logon,VARIANT sddl,IRegisteredTask **task) {
    return This->lpVtbl->RegisterTaskDefinition(This,path,definition,flags,user,password,logon,sddl,task);
}
static FORCEINLINE HRESULT ITaskFolder_GetSecurityDescriptor(ITaskFolder* This,LONG info,BSTR *sddl) {
    return This->lpVtbl->GetSecurityDescriptor(This,info,sddl);
}
static FORCEINLINE HRESULT ITaskFolder_SetSecurityDescriptor(ITaskFolder* This,BSTR sddl,LONG flags) {
    return This->lpVtbl->SetSecurityDescriptor(This,sddl,flags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITaskFolder_get_Name_Proxy(
    ITaskFolder* This,
    BSTR *name);
void __RPC_STUB ITaskFolder_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolder_get_Path_Proxy(
    ITaskFolder* This,
    BSTR *path);
void __RPC_STUB ITaskFolder_get_Path_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolder_GetFolder_Proxy(
    ITaskFolder* This,
    BSTR path,
    ITaskFolder **folder);
void __RPC_STUB ITaskFolder_GetFolder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolder_GetFolders_Proxy(
    ITaskFolder* This,
    LONG flags,
    ITaskFolderCollection **folders);
void __RPC_STUB ITaskFolder_GetFolders_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolder_CreateFolder_Proxy(
    ITaskFolder* This,
    BSTR name,
    VARIANT sddl,
    ITaskFolder **folder);
void __RPC_STUB ITaskFolder_CreateFolder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolder_DeleteFolder_Proxy(
    ITaskFolder* This,
    BSTR name,
    LONG flags);
void __RPC_STUB ITaskFolder_DeleteFolder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolder_GetTask_Proxy(
    ITaskFolder* This,
    BSTR path,
    IRegisteredTask **task);
void __RPC_STUB ITaskFolder_GetTask_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolder_GetTasks_Proxy(
    ITaskFolder* This,
    LONG flags,
    IRegisteredTaskCollection **tasks);
void __RPC_STUB ITaskFolder_GetTasks_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolder_DeleteTask_Proxy(
    ITaskFolder* This,
    BSTR name,
    LONG flags);
void __RPC_STUB ITaskFolder_DeleteTask_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolder_RegisterTask_Proxy(
    ITaskFolder* This,
    BSTR path,
    BSTR xml,
    LONG flags,
    VARIANT user,
    VARIANT password,
    TASK_LOGON_TYPE logonType,
    VARIANT sddl,
    IRegisteredTask **task);
void __RPC_STUB ITaskFolder_RegisterTask_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolder_RegisterTaskDefinition_Proxy(
    ITaskFolder* This,
    BSTR path,
    ITaskDefinition *definition,
    LONG flags,
    VARIANT user,
    VARIANT password,
    TASK_LOGON_TYPE logon,
    VARIANT sddl,
    IRegisteredTask **task);
void __RPC_STUB ITaskFolder_RegisterTaskDefinition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolder_GetSecurityDescriptor_Proxy(
    ITaskFolder* This,
    LONG info,
    BSTR *sddl);
void __RPC_STUB ITaskFolder_GetSecurityDescriptor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolder_SetSecurityDescriptor_Proxy(
    ITaskFolder* This,
    BSTR sddl,
    LONG flags);
void __RPC_STUB ITaskFolder_SetSecurityDescriptor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITaskFolder_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITaskFolderCollection interface
 */
#ifndef __ITaskFolderCollection_INTERFACE_DEFINED__
#define __ITaskFolderCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITaskFolderCollection, 0x79184a66, 0x8664, 0x423f, 0x97,0xf1, 0x63,0x73,0x56,0xa5,0xd8,0x12);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("79184a66-8664-423f-97f1-637356a5d812")
ITaskFolderCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        VARIANT index,
        ITaskFolder **folder) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **penum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITaskFolderCollection, 0x79184a66, 0x8664, 0x423f, 0x97,0xf1, 0x63,0x73,0x56,0xa5,0xd8,0x12)
#endif
#else
typedef struct ITaskFolderCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITaskFolderCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITaskFolderCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITaskFolderCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITaskFolderCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITaskFolderCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITaskFolderCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITaskFolderCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITaskFolderCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ITaskFolderCollection* This,
        LONG *count);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        ITaskFolderCollection* This,
        VARIANT index,
        ITaskFolder **folder);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ITaskFolderCollection* This,
        IUnknown **penum);

    END_INTERFACE
} ITaskFolderCollectionVtbl;
interface ITaskFolderCollection {
    CONST_VTBL ITaskFolderCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITaskFolderCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITaskFolderCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITaskFolderCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITaskFolderCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITaskFolderCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITaskFolderCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITaskFolderCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITaskFolderCollection methods ***/
#define ITaskFolderCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
#define ITaskFolderCollection_get_Item(This,index,folder) (This)->lpVtbl->get_Item(This,index,folder)
#define ITaskFolderCollection_get__NewEnum(This,penum) (This)->lpVtbl->get__NewEnum(This,penum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITaskFolderCollection_QueryInterface(ITaskFolderCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITaskFolderCollection_AddRef(ITaskFolderCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITaskFolderCollection_Release(ITaskFolderCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITaskFolderCollection_GetTypeInfoCount(ITaskFolderCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITaskFolderCollection_GetTypeInfo(ITaskFolderCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITaskFolderCollection_GetIDsOfNames(ITaskFolderCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITaskFolderCollection_Invoke(ITaskFolderCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITaskFolderCollection methods ***/
static FORCEINLINE HRESULT ITaskFolderCollection_get_Count(ITaskFolderCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static FORCEINLINE HRESULT ITaskFolderCollection_get_Item(ITaskFolderCollection* This,VARIANT index,ITaskFolder **folder) {
    return This->lpVtbl->get_Item(This,index,folder);
}
static FORCEINLINE HRESULT ITaskFolderCollection_get__NewEnum(ITaskFolderCollection* This,IUnknown **penum) {
    return This->lpVtbl->get__NewEnum(This,penum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITaskFolderCollection_get_Count_Proxy(
    ITaskFolderCollection* This,
    LONG *count);
void __RPC_STUB ITaskFolderCollection_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolderCollection_get_Item_Proxy(
    ITaskFolderCollection* This,
    VARIANT index,
    ITaskFolder **folder);
void __RPC_STUB ITaskFolderCollection_get_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskFolderCollection_get__NewEnum_Proxy(
    ITaskFolderCollection* This,
    IUnknown **penum);
void __RPC_STUB ITaskFolderCollection_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITaskFolderCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITaskDefinition interface
 */
#ifndef __ITaskDefinition_INTERFACE_DEFINED__
#define __ITaskDefinition_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITaskDefinition, 0xf5bc8fc5, 0x536d, 0x4f77, 0xb8,0x52, 0xfb,0xc1,0x35,0x6f,0xde,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f5bc8fc5-536d-4f77-b852-fbc1356fdeb6")
ITaskDefinition : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_RegistrationInfo(
        IRegistrationInfo **info) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RegistrationInfo(
        IRegistrationInfo *info) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Triggers(
        ITriggerCollection **triggers) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Triggers(
        ITriggerCollection *triggers) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Settings(
        ITaskSettings **settings) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Settings(
        ITaskSettings *settings) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Data(
        BSTR *data) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Data(
        BSTR data) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Principal(
        IPrincipal **principal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Principal(
        IPrincipal *principal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Actions(
        IActionCollection **actions) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Actions(
        IActionCollection *actions) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_XmlText(
        BSTR *xml) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_XmlText(
        BSTR xml) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITaskDefinition, 0xf5bc8fc5, 0x536d, 0x4f77, 0xb8,0x52, 0xfb,0xc1,0x35,0x6f,0xde,0xb6)
#endif
#else
typedef struct ITaskDefinitionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITaskDefinition* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITaskDefinition* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITaskDefinition* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITaskDefinition* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITaskDefinition* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITaskDefinition* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITaskDefinition* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITaskDefinition methods ***/
    HRESULT (STDMETHODCALLTYPE *get_RegistrationInfo)(
        ITaskDefinition* This,
        IRegistrationInfo **info);

    HRESULT (STDMETHODCALLTYPE *put_RegistrationInfo)(
        ITaskDefinition* This,
        IRegistrationInfo *info);

    HRESULT (STDMETHODCALLTYPE *get_Triggers)(
        ITaskDefinition* This,
        ITriggerCollection **triggers);

    HRESULT (STDMETHODCALLTYPE *put_Triggers)(
        ITaskDefinition* This,
        ITriggerCollection *triggers);

    HRESULT (STDMETHODCALLTYPE *get_Settings)(
        ITaskDefinition* This,
        ITaskSettings **settings);

    HRESULT (STDMETHODCALLTYPE *put_Settings)(
        ITaskDefinition* This,
        ITaskSettings *settings);

    HRESULT (STDMETHODCALLTYPE *get_Data)(
        ITaskDefinition* This,
        BSTR *data);

    HRESULT (STDMETHODCALLTYPE *put_Data)(
        ITaskDefinition* This,
        BSTR data);

    HRESULT (STDMETHODCALLTYPE *get_Principal)(
        ITaskDefinition* This,
        IPrincipal **principal);

    HRESULT (STDMETHODCALLTYPE *put_Principal)(
        ITaskDefinition* This,
        IPrincipal *principal);

    HRESULT (STDMETHODCALLTYPE *get_Actions)(
        ITaskDefinition* This,
        IActionCollection **actions);

    HRESULT (STDMETHODCALLTYPE *put_Actions)(
        ITaskDefinition* This,
        IActionCollection *actions);

    HRESULT (STDMETHODCALLTYPE *get_XmlText)(
        ITaskDefinition* This,
        BSTR *xml);

    HRESULT (STDMETHODCALLTYPE *put_XmlText)(
        ITaskDefinition* This,
        BSTR xml);

    END_INTERFACE
} ITaskDefinitionVtbl;
interface ITaskDefinition {
    CONST_VTBL ITaskDefinitionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITaskDefinition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITaskDefinition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITaskDefinition_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITaskDefinition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITaskDefinition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITaskDefinition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITaskDefinition_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITaskDefinition methods ***/
#define ITaskDefinition_get_RegistrationInfo(This,info) (This)->lpVtbl->get_RegistrationInfo(This,info)
#define ITaskDefinition_put_RegistrationInfo(This,info) (This)->lpVtbl->put_RegistrationInfo(This,info)
#define ITaskDefinition_get_Triggers(This,triggers) (This)->lpVtbl->get_Triggers(This,triggers)
#define ITaskDefinition_put_Triggers(This,triggers) (This)->lpVtbl->put_Triggers(This,triggers)
#define ITaskDefinition_get_Settings(This,settings) (This)->lpVtbl->get_Settings(This,settings)
#define ITaskDefinition_put_Settings(This,settings) (This)->lpVtbl->put_Settings(This,settings)
#define ITaskDefinition_get_Data(This,data) (This)->lpVtbl->get_Data(This,data)
#define ITaskDefinition_put_Data(This,data) (This)->lpVtbl->put_Data(This,data)
#define ITaskDefinition_get_Principal(This,principal) (This)->lpVtbl->get_Principal(This,principal)
#define ITaskDefinition_put_Principal(This,principal) (This)->lpVtbl->put_Principal(This,principal)
#define ITaskDefinition_get_Actions(This,actions) (This)->lpVtbl->get_Actions(This,actions)
#define ITaskDefinition_put_Actions(This,actions) (This)->lpVtbl->put_Actions(This,actions)
#define ITaskDefinition_get_XmlText(This,xml) (This)->lpVtbl->get_XmlText(This,xml)
#define ITaskDefinition_put_XmlText(This,xml) (This)->lpVtbl->put_XmlText(This,xml)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITaskDefinition_QueryInterface(ITaskDefinition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITaskDefinition_AddRef(ITaskDefinition* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITaskDefinition_Release(ITaskDefinition* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITaskDefinition_GetTypeInfoCount(ITaskDefinition* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITaskDefinition_GetTypeInfo(ITaskDefinition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITaskDefinition_GetIDsOfNames(ITaskDefinition* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITaskDefinition_Invoke(ITaskDefinition* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITaskDefinition methods ***/
static FORCEINLINE HRESULT ITaskDefinition_get_RegistrationInfo(ITaskDefinition* This,IRegistrationInfo **info) {
    return This->lpVtbl->get_RegistrationInfo(This,info);
}
static FORCEINLINE HRESULT ITaskDefinition_put_RegistrationInfo(ITaskDefinition* This,IRegistrationInfo *info) {
    return This->lpVtbl->put_RegistrationInfo(This,info);
}
static FORCEINLINE HRESULT ITaskDefinition_get_Triggers(ITaskDefinition* This,ITriggerCollection **triggers) {
    return This->lpVtbl->get_Triggers(This,triggers);
}
static FORCEINLINE HRESULT ITaskDefinition_put_Triggers(ITaskDefinition* This,ITriggerCollection *triggers) {
    return This->lpVtbl->put_Triggers(This,triggers);
}
static FORCEINLINE HRESULT ITaskDefinition_get_Settings(ITaskDefinition* This,ITaskSettings **settings) {
    return This->lpVtbl->get_Settings(This,settings);
}
static FORCEINLINE HRESULT ITaskDefinition_put_Settings(ITaskDefinition* This,ITaskSettings *settings) {
    return This->lpVtbl->put_Settings(This,settings);
}
static FORCEINLINE HRESULT ITaskDefinition_get_Data(ITaskDefinition* This,BSTR *data) {
    return This->lpVtbl->get_Data(This,data);
}
static FORCEINLINE HRESULT ITaskDefinition_put_Data(ITaskDefinition* This,BSTR data) {
    return This->lpVtbl->put_Data(This,data);
}
static FORCEINLINE HRESULT ITaskDefinition_get_Principal(ITaskDefinition* This,IPrincipal **principal) {
    return This->lpVtbl->get_Principal(This,principal);
}
static FORCEINLINE HRESULT ITaskDefinition_put_Principal(ITaskDefinition* This,IPrincipal *principal) {
    return This->lpVtbl->put_Principal(This,principal);
}
static FORCEINLINE HRESULT ITaskDefinition_get_Actions(ITaskDefinition* This,IActionCollection **actions) {
    return This->lpVtbl->get_Actions(This,actions);
}
static FORCEINLINE HRESULT ITaskDefinition_put_Actions(ITaskDefinition* This,IActionCollection *actions) {
    return This->lpVtbl->put_Actions(This,actions);
}
static FORCEINLINE HRESULT ITaskDefinition_get_XmlText(ITaskDefinition* This,BSTR *xml) {
    return This->lpVtbl->get_XmlText(This,xml);
}
static FORCEINLINE HRESULT ITaskDefinition_put_XmlText(ITaskDefinition* This,BSTR xml) {
    return This->lpVtbl->put_XmlText(This,xml);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITaskDefinition_get_RegistrationInfo_Proxy(
    ITaskDefinition* This,
    IRegistrationInfo **info);
void __RPC_STUB ITaskDefinition_get_RegistrationInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_put_RegistrationInfo_Proxy(
    ITaskDefinition* This,
    IRegistrationInfo *info);
void __RPC_STUB ITaskDefinition_put_RegistrationInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_get_Triggers_Proxy(
    ITaskDefinition* This,
    ITriggerCollection **triggers);
void __RPC_STUB ITaskDefinition_get_Triggers_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_put_Triggers_Proxy(
    ITaskDefinition* This,
    ITriggerCollection *triggers);
void __RPC_STUB ITaskDefinition_put_Triggers_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_get_Settings_Proxy(
    ITaskDefinition* This,
    ITaskSettings **settings);
void __RPC_STUB ITaskDefinition_get_Settings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_put_Settings_Proxy(
    ITaskDefinition* This,
    ITaskSettings *settings);
void __RPC_STUB ITaskDefinition_put_Settings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_get_Data_Proxy(
    ITaskDefinition* This,
    BSTR *data);
void __RPC_STUB ITaskDefinition_get_Data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_put_Data_Proxy(
    ITaskDefinition* This,
    BSTR data);
void __RPC_STUB ITaskDefinition_put_Data_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_get_Principal_Proxy(
    ITaskDefinition* This,
    IPrincipal **principal);
void __RPC_STUB ITaskDefinition_get_Principal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_put_Principal_Proxy(
    ITaskDefinition* This,
    IPrincipal *principal);
void __RPC_STUB ITaskDefinition_put_Principal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_get_Actions_Proxy(
    ITaskDefinition* This,
    IActionCollection **actions);
void __RPC_STUB ITaskDefinition_get_Actions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_put_Actions_Proxy(
    ITaskDefinition* This,
    IActionCollection *actions);
void __RPC_STUB ITaskDefinition_put_Actions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_get_XmlText_Proxy(
    ITaskDefinition* This,
    BSTR *xml);
void __RPC_STUB ITaskDefinition_get_XmlText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskDefinition_put_XmlText_Proxy(
    ITaskDefinition* This,
    BSTR xml);
void __RPC_STUB ITaskDefinition_put_XmlText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITaskDefinition_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITaskSettings interface
 */
#ifndef __ITaskSettings_INTERFACE_DEFINED__
#define __ITaskSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITaskSettings, 0x8fd4711d, 0x2d02, 0x4c8c, 0x87,0xe3, 0xef,0xf6,0x99,0xde,0x12,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8fd4711d-2d02-4c8c-87e3-eff699de127e")
ITaskSettings : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_AllowDemandStart(
        VARIANT_BOOL *allow) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AllowDemandStart(
        VARIANT_BOOL allow) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RestartInterval(
        BSTR *interval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RestartInterval(
        BSTR interval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RestartCount(
        INT *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RestartCount(
        INT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MultipleInstances(
        TASK_INSTANCES_POLICY *policy) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MultipleInstances(
        TASK_INSTANCES_POLICY policy) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StopIfGoingOnBatteries(
        VARIANT_BOOL *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_StopIfGoingOnBatteries(
        VARIANT_BOOL stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DisallowStartIfOnBatteries(
        VARIANT_BOOL *disallow) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DisallowStartIfOnBatteries(
        VARIANT_BOOL disallow) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AllowHardTerminate(
        VARIANT_BOOL *allow) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AllowHardTerminate(
        VARIANT_BOOL allow) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StartWhenAvailable(
        VARIANT_BOOL *start) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_StartWhenAvailable(
        VARIANT_BOOL start) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_XmlText(
        BSTR *xml) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_XmlText(
        BSTR xml) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RunOnlyIfNetworkAvailable(
        VARIANT_BOOL *run) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RunOnlyIfNetworkAvailable(
        VARIANT_BOOL run) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ExecutionTimeLimit(
        BSTR *limit) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ExecutionTimeLimit(
        BSTR limit) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Enabled(
        VARIANT_BOOL *enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Enabled(
        VARIANT_BOOL enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DeleteExpiredTaskAfter(
        BSTR *delay) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DeleteExpiredTaskAfter(
        BSTR delay) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Priority(
        INT *priority) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Priority(
        INT priority) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Compatibility(
        TASK_COMPATIBILITY *level) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Compatibility(
        TASK_COMPATIBILITY level) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Hidden(
        VARIANT_BOOL *hidden) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Hidden(
        VARIANT_BOOL hidden) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IdleSettings(
        IIdleSettings **settings) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_IdleSettings(
        IIdleSettings *settings) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RunOnlyIfIdle(
        VARIANT_BOOL *run) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RunOnlyIfIdle(
        VARIANT_BOOL run) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_WakeToRun(
        VARIANT_BOOL *wake) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_WakeToRun(
        VARIANT_BOOL wake) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_NetworkSettings(
        INetworkSettings **settings) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_NetworkSettings(
        INetworkSettings *settings) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITaskSettings, 0x8fd4711d, 0x2d02, 0x4c8c, 0x87,0xe3, 0xef,0xf6,0x99,0xde,0x12,0x7e)
#endif
#else
typedef struct ITaskSettingsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITaskSettings* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITaskSettings* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITaskSettings* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITaskSettings* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITaskSettings* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITaskSettings* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITaskSettings* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITaskSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AllowDemandStart)(
        ITaskSettings* This,
        VARIANT_BOOL *allow);

    HRESULT (STDMETHODCALLTYPE *put_AllowDemandStart)(
        ITaskSettings* This,
        VARIANT_BOOL allow);

    HRESULT (STDMETHODCALLTYPE *get_RestartInterval)(
        ITaskSettings* This,
        BSTR *interval);

    HRESULT (STDMETHODCALLTYPE *put_RestartInterval)(
        ITaskSettings* This,
        BSTR interval);

    HRESULT (STDMETHODCALLTYPE *get_RestartCount)(
        ITaskSettings* This,
        INT *count);

    HRESULT (STDMETHODCALLTYPE *put_RestartCount)(
        ITaskSettings* This,
        INT count);

    HRESULT (STDMETHODCALLTYPE *get_MultipleInstances)(
        ITaskSettings* This,
        TASK_INSTANCES_POLICY *policy);

    HRESULT (STDMETHODCALLTYPE *put_MultipleInstances)(
        ITaskSettings* This,
        TASK_INSTANCES_POLICY policy);

    HRESULT (STDMETHODCALLTYPE *get_StopIfGoingOnBatteries)(
        ITaskSettings* This,
        VARIANT_BOOL *stop);

    HRESULT (STDMETHODCALLTYPE *put_StopIfGoingOnBatteries)(
        ITaskSettings* This,
        VARIANT_BOOL stop);

    HRESULT (STDMETHODCALLTYPE *get_DisallowStartIfOnBatteries)(
        ITaskSettings* This,
        VARIANT_BOOL *disallow);

    HRESULT (STDMETHODCALLTYPE *put_DisallowStartIfOnBatteries)(
        ITaskSettings* This,
        VARIANT_BOOL disallow);

    HRESULT (STDMETHODCALLTYPE *get_AllowHardTerminate)(
        ITaskSettings* This,
        VARIANT_BOOL *allow);

    HRESULT (STDMETHODCALLTYPE *put_AllowHardTerminate)(
        ITaskSettings* This,
        VARIANT_BOOL allow);

    HRESULT (STDMETHODCALLTYPE *get_StartWhenAvailable)(
        ITaskSettings* This,
        VARIANT_BOOL *start);

    HRESULT (STDMETHODCALLTYPE *put_StartWhenAvailable)(
        ITaskSettings* This,
        VARIANT_BOOL start);

    HRESULT (STDMETHODCALLTYPE *get_XmlText)(
        ITaskSettings* This,
        BSTR *xml);

    HRESULT (STDMETHODCALLTYPE *put_XmlText)(
        ITaskSettings* This,
        BSTR xml);

    HRESULT (STDMETHODCALLTYPE *get_RunOnlyIfNetworkAvailable)(
        ITaskSettings* This,
        VARIANT_BOOL *run);

    HRESULT (STDMETHODCALLTYPE *put_RunOnlyIfNetworkAvailable)(
        ITaskSettings* This,
        VARIANT_BOOL run);

    HRESULT (STDMETHODCALLTYPE *get_ExecutionTimeLimit)(
        ITaskSettings* This,
        BSTR *limit);

    HRESULT (STDMETHODCALLTYPE *put_ExecutionTimeLimit)(
        ITaskSettings* This,
        BSTR limit);

    HRESULT (STDMETHODCALLTYPE *get_Enabled)(
        ITaskSettings* This,
        VARIANT_BOOL *enabled);

    HRESULT (STDMETHODCALLTYPE *put_Enabled)(
        ITaskSettings* This,
        VARIANT_BOOL enabled);

    HRESULT (STDMETHODCALLTYPE *get_DeleteExpiredTaskAfter)(
        ITaskSettings* This,
        BSTR *delay);

    HRESULT (STDMETHODCALLTYPE *put_DeleteExpiredTaskAfter)(
        ITaskSettings* This,
        BSTR delay);

    HRESULT (STDMETHODCALLTYPE *get_Priority)(
        ITaskSettings* This,
        INT *priority);

    HRESULT (STDMETHODCALLTYPE *put_Priority)(
        ITaskSettings* This,
        INT priority);

    HRESULT (STDMETHODCALLTYPE *get_Compatibility)(
        ITaskSettings* This,
        TASK_COMPATIBILITY *level);

    HRESULT (STDMETHODCALLTYPE *put_Compatibility)(
        ITaskSettings* This,
        TASK_COMPATIBILITY level);

    HRESULT (STDMETHODCALLTYPE *get_Hidden)(
        ITaskSettings* This,
        VARIANT_BOOL *hidden);

    HRESULT (STDMETHODCALLTYPE *put_Hidden)(
        ITaskSettings* This,
        VARIANT_BOOL hidden);

    HRESULT (STDMETHODCALLTYPE *get_IdleSettings)(
        ITaskSettings* This,
        IIdleSettings **settings);

    HRESULT (STDMETHODCALLTYPE *put_IdleSettings)(
        ITaskSettings* This,
        IIdleSettings *settings);

    HRESULT (STDMETHODCALLTYPE *get_RunOnlyIfIdle)(
        ITaskSettings* This,
        VARIANT_BOOL *run);

    HRESULT (STDMETHODCALLTYPE *put_RunOnlyIfIdle)(
        ITaskSettings* This,
        VARIANT_BOOL run);

    HRESULT (STDMETHODCALLTYPE *get_WakeToRun)(
        ITaskSettings* This,
        VARIANT_BOOL *wake);

    HRESULT (STDMETHODCALLTYPE *put_WakeToRun)(
        ITaskSettings* This,
        VARIANT_BOOL wake);

    HRESULT (STDMETHODCALLTYPE *get_NetworkSettings)(
        ITaskSettings* This,
        INetworkSettings **settings);

    HRESULT (STDMETHODCALLTYPE *put_NetworkSettings)(
        ITaskSettings* This,
        INetworkSettings *settings);

    END_INTERFACE
} ITaskSettingsVtbl;
interface ITaskSettings {
    CONST_VTBL ITaskSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITaskSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITaskSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITaskSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITaskSettings_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITaskSettings_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITaskSettings_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITaskSettings_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITaskSettings methods ***/
#define ITaskSettings_get_AllowDemandStart(This,allow) (This)->lpVtbl->get_AllowDemandStart(This,allow)
#define ITaskSettings_put_AllowDemandStart(This,allow) (This)->lpVtbl->put_AllowDemandStart(This,allow)
#define ITaskSettings_get_RestartInterval(This,interval) (This)->lpVtbl->get_RestartInterval(This,interval)
#define ITaskSettings_put_RestartInterval(This,interval) (This)->lpVtbl->put_RestartInterval(This,interval)
#define ITaskSettings_get_RestartCount(This,count) (This)->lpVtbl->get_RestartCount(This,count)
#define ITaskSettings_put_RestartCount(This,count) (This)->lpVtbl->put_RestartCount(This,count)
#define ITaskSettings_get_MultipleInstances(This,policy) (This)->lpVtbl->get_MultipleInstances(This,policy)
#define ITaskSettings_put_MultipleInstances(This,policy) (This)->lpVtbl->put_MultipleInstances(This,policy)
#define ITaskSettings_get_StopIfGoingOnBatteries(This,stop) (This)->lpVtbl->get_StopIfGoingOnBatteries(This,stop)
#define ITaskSettings_put_StopIfGoingOnBatteries(This,stop) (This)->lpVtbl->put_StopIfGoingOnBatteries(This,stop)
#define ITaskSettings_get_DisallowStartIfOnBatteries(This,disallow) (This)->lpVtbl->get_DisallowStartIfOnBatteries(This,disallow)
#define ITaskSettings_put_DisallowStartIfOnBatteries(This,disallow) (This)->lpVtbl->put_DisallowStartIfOnBatteries(This,disallow)
#define ITaskSettings_get_AllowHardTerminate(This,allow) (This)->lpVtbl->get_AllowHardTerminate(This,allow)
#define ITaskSettings_put_AllowHardTerminate(This,allow) (This)->lpVtbl->put_AllowHardTerminate(This,allow)
#define ITaskSettings_get_StartWhenAvailable(This,start) (This)->lpVtbl->get_StartWhenAvailable(This,start)
#define ITaskSettings_put_StartWhenAvailable(This,start) (This)->lpVtbl->put_StartWhenAvailable(This,start)
#define ITaskSettings_get_XmlText(This,xml) (This)->lpVtbl->get_XmlText(This,xml)
#define ITaskSettings_put_XmlText(This,xml) (This)->lpVtbl->put_XmlText(This,xml)
#define ITaskSettings_get_RunOnlyIfNetworkAvailable(This,run) (This)->lpVtbl->get_RunOnlyIfNetworkAvailable(This,run)
#define ITaskSettings_put_RunOnlyIfNetworkAvailable(This,run) (This)->lpVtbl->put_RunOnlyIfNetworkAvailable(This,run)
#define ITaskSettings_get_ExecutionTimeLimit(This,limit) (This)->lpVtbl->get_ExecutionTimeLimit(This,limit)
#define ITaskSettings_put_ExecutionTimeLimit(This,limit) (This)->lpVtbl->put_ExecutionTimeLimit(This,limit)
#define ITaskSettings_get_Enabled(This,enabled) (This)->lpVtbl->get_Enabled(This,enabled)
#define ITaskSettings_put_Enabled(This,enabled) (This)->lpVtbl->put_Enabled(This,enabled)
#define ITaskSettings_get_DeleteExpiredTaskAfter(This,delay) (This)->lpVtbl->get_DeleteExpiredTaskAfter(This,delay)
#define ITaskSettings_put_DeleteExpiredTaskAfter(This,delay) (This)->lpVtbl->put_DeleteExpiredTaskAfter(This,delay)
#define ITaskSettings_get_Priority(This,priority) (This)->lpVtbl->get_Priority(This,priority)
#define ITaskSettings_put_Priority(This,priority) (This)->lpVtbl->put_Priority(This,priority)
#define ITaskSettings_get_Compatibility(This,level) (This)->lpVtbl->get_Compatibility(This,level)
#define ITaskSettings_put_Compatibility(This,level) (This)->lpVtbl->put_Compatibility(This,level)
#define ITaskSettings_get_Hidden(This,hidden) (This)->lpVtbl->get_Hidden(This,hidden)
#define ITaskSettings_put_Hidden(This,hidden) (This)->lpVtbl->put_Hidden(This,hidden)
#define ITaskSettings_get_IdleSettings(This,settings) (This)->lpVtbl->get_IdleSettings(This,settings)
#define ITaskSettings_put_IdleSettings(This,settings) (This)->lpVtbl->put_IdleSettings(This,settings)
#define ITaskSettings_get_RunOnlyIfIdle(This,run) (This)->lpVtbl->get_RunOnlyIfIdle(This,run)
#define ITaskSettings_put_RunOnlyIfIdle(This,run) (This)->lpVtbl->put_RunOnlyIfIdle(This,run)
#define ITaskSettings_get_WakeToRun(This,wake) (This)->lpVtbl->get_WakeToRun(This,wake)
#define ITaskSettings_put_WakeToRun(This,wake) (This)->lpVtbl->put_WakeToRun(This,wake)
#define ITaskSettings_get_NetworkSettings(This,settings) (This)->lpVtbl->get_NetworkSettings(This,settings)
#define ITaskSettings_put_NetworkSettings(This,settings) (This)->lpVtbl->put_NetworkSettings(This,settings)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITaskSettings_QueryInterface(ITaskSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITaskSettings_AddRef(ITaskSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITaskSettings_Release(ITaskSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITaskSettings_GetTypeInfoCount(ITaskSettings* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITaskSettings_GetTypeInfo(ITaskSettings* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITaskSettings_GetIDsOfNames(ITaskSettings* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITaskSettings_Invoke(ITaskSettings* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITaskSettings methods ***/
static FORCEINLINE HRESULT ITaskSettings_get_AllowDemandStart(ITaskSettings* This,VARIANT_BOOL *allow) {
    return This->lpVtbl->get_AllowDemandStart(This,allow);
}
static FORCEINLINE HRESULT ITaskSettings_put_AllowDemandStart(ITaskSettings* This,VARIANT_BOOL allow) {
    return This->lpVtbl->put_AllowDemandStart(This,allow);
}
static FORCEINLINE HRESULT ITaskSettings_get_RestartInterval(ITaskSettings* This,BSTR *interval) {
    return This->lpVtbl->get_RestartInterval(This,interval);
}
static FORCEINLINE HRESULT ITaskSettings_put_RestartInterval(ITaskSettings* This,BSTR interval) {
    return This->lpVtbl->put_RestartInterval(This,interval);
}
static FORCEINLINE HRESULT ITaskSettings_get_RestartCount(ITaskSettings* This,INT *count) {
    return This->lpVtbl->get_RestartCount(This,count);
}
static FORCEINLINE HRESULT ITaskSettings_put_RestartCount(ITaskSettings* This,INT count) {
    return This->lpVtbl->put_RestartCount(This,count);
}
static FORCEINLINE HRESULT ITaskSettings_get_MultipleInstances(ITaskSettings* This,TASK_INSTANCES_POLICY *policy) {
    return This->lpVtbl->get_MultipleInstances(This,policy);
}
static FORCEINLINE HRESULT ITaskSettings_put_MultipleInstances(ITaskSettings* This,TASK_INSTANCES_POLICY policy) {
    return This->lpVtbl->put_MultipleInstances(This,policy);
}
static FORCEINLINE HRESULT ITaskSettings_get_StopIfGoingOnBatteries(ITaskSettings* This,VARIANT_BOOL *stop) {
    return This->lpVtbl->get_StopIfGoingOnBatteries(This,stop);
}
static FORCEINLINE HRESULT ITaskSettings_put_StopIfGoingOnBatteries(ITaskSettings* This,VARIANT_BOOL stop) {
    return This->lpVtbl->put_StopIfGoingOnBatteries(This,stop);
}
static FORCEINLINE HRESULT ITaskSettings_get_DisallowStartIfOnBatteries(ITaskSettings* This,VARIANT_BOOL *disallow) {
    return This->lpVtbl->get_DisallowStartIfOnBatteries(This,disallow);
}
static FORCEINLINE HRESULT ITaskSettings_put_DisallowStartIfOnBatteries(ITaskSettings* This,VARIANT_BOOL disallow) {
    return This->lpVtbl->put_DisallowStartIfOnBatteries(This,disallow);
}
static FORCEINLINE HRESULT ITaskSettings_get_AllowHardTerminate(ITaskSettings* This,VARIANT_BOOL *allow) {
    return This->lpVtbl->get_AllowHardTerminate(This,allow);
}
static FORCEINLINE HRESULT ITaskSettings_put_AllowHardTerminate(ITaskSettings* This,VARIANT_BOOL allow) {
    return This->lpVtbl->put_AllowHardTerminate(This,allow);
}
static FORCEINLINE HRESULT ITaskSettings_get_StartWhenAvailable(ITaskSettings* This,VARIANT_BOOL *start) {
    return This->lpVtbl->get_StartWhenAvailable(This,start);
}
static FORCEINLINE HRESULT ITaskSettings_put_StartWhenAvailable(ITaskSettings* This,VARIANT_BOOL start) {
    return This->lpVtbl->put_StartWhenAvailable(This,start);
}
static FORCEINLINE HRESULT ITaskSettings_get_XmlText(ITaskSettings* This,BSTR *xml) {
    return This->lpVtbl->get_XmlText(This,xml);
}
static FORCEINLINE HRESULT ITaskSettings_put_XmlText(ITaskSettings* This,BSTR xml) {
    return This->lpVtbl->put_XmlText(This,xml);
}
static FORCEINLINE HRESULT ITaskSettings_get_RunOnlyIfNetworkAvailable(ITaskSettings* This,VARIANT_BOOL *run) {
    return This->lpVtbl->get_RunOnlyIfNetworkAvailable(This,run);
}
static FORCEINLINE HRESULT ITaskSettings_put_RunOnlyIfNetworkAvailable(ITaskSettings* This,VARIANT_BOOL run) {
    return This->lpVtbl->put_RunOnlyIfNetworkAvailable(This,run);
}
static FORCEINLINE HRESULT ITaskSettings_get_ExecutionTimeLimit(ITaskSettings* This,BSTR *limit) {
    return This->lpVtbl->get_ExecutionTimeLimit(This,limit);
}
static FORCEINLINE HRESULT ITaskSettings_put_ExecutionTimeLimit(ITaskSettings* This,BSTR limit) {
    return This->lpVtbl->put_ExecutionTimeLimit(This,limit);
}
static FORCEINLINE HRESULT ITaskSettings_get_Enabled(ITaskSettings* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->get_Enabled(This,enabled);
}
static FORCEINLINE HRESULT ITaskSettings_put_Enabled(ITaskSettings* This,VARIANT_BOOL enabled) {
    return This->lpVtbl->put_Enabled(This,enabled);
}
static FORCEINLINE HRESULT ITaskSettings_get_DeleteExpiredTaskAfter(ITaskSettings* This,BSTR *delay) {
    return This->lpVtbl->get_DeleteExpiredTaskAfter(This,delay);
}
static FORCEINLINE HRESULT ITaskSettings_put_DeleteExpiredTaskAfter(ITaskSettings* This,BSTR delay) {
    return This->lpVtbl->put_DeleteExpiredTaskAfter(This,delay);
}
static FORCEINLINE HRESULT ITaskSettings_get_Priority(ITaskSettings* This,INT *priority) {
    return This->lpVtbl->get_Priority(This,priority);
}
static FORCEINLINE HRESULT ITaskSettings_put_Priority(ITaskSettings* This,INT priority) {
    return This->lpVtbl->put_Priority(This,priority);
}
static FORCEINLINE HRESULT ITaskSettings_get_Compatibility(ITaskSettings* This,TASK_COMPATIBILITY *level) {
    return This->lpVtbl->get_Compatibility(This,level);
}
static FORCEINLINE HRESULT ITaskSettings_put_Compatibility(ITaskSettings* This,TASK_COMPATIBILITY level) {
    return This->lpVtbl->put_Compatibility(This,level);
}
static FORCEINLINE HRESULT ITaskSettings_get_Hidden(ITaskSettings* This,VARIANT_BOOL *hidden) {
    return This->lpVtbl->get_Hidden(This,hidden);
}
static FORCEINLINE HRESULT ITaskSettings_put_Hidden(ITaskSettings* This,VARIANT_BOOL hidden) {
    return This->lpVtbl->put_Hidden(This,hidden);
}
static FORCEINLINE HRESULT ITaskSettings_get_IdleSettings(ITaskSettings* This,IIdleSettings **settings) {
    return This->lpVtbl->get_IdleSettings(This,settings);
}
static FORCEINLINE HRESULT ITaskSettings_put_IdleSettings(ITaskSettings* This,IIdleSettings *settings) {
    return This->lpVtbl->put_IdleSettings(This,settings);
}
static FORCEINLINE HRESULT ITaskSettings_get_RunOnlyIfIdle(ITaskSettings* This,VARIANT_BOOL *run) {
    return This->lpVtbl->get_RunOnlyIfIdle(This,run);
}
static FORCEINLINE HRESULT ITaskSettings_put_RunOnlyIfIdle(ITaskSettings* This,VARIANT_BOOL run) {
    return This->lpVtbl->put_RunOnlyIfIdle(This,run);
}
static FORCEINLINE HRESULT ITaskSettings_get_WakeToRun(ITaskSettings* This,VARIANT_BOOL *wake) {
    return This->lpVtbl->get_WakeToRun(This,wake);
}
static FORCEINLINE HRESULT ITaskSettings_put_WakeToRun(ITaskSettings* This,VARIANT_BOOL wake) {
    return This->lpVtbl->put_WakeToRun(This,wake);
}
static FORCEINLINE HRESULT ITaskSettings_get_NetworkSettings(ITaskSettings* This,INetworkSettings **settings) {
    return This->lpVtbl->get_NetworkSettings(This,settings);
}
static FORCEINLINE HRESULT ITaskSettings_put_NetworkSettings(ITaskSettings* This,INetworkSettings *settings) {
    return This->lpVtbl->put_NetworkSettings(This,settings);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITaskSettings_get_AllowDemandStart_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL *allow);
void __RPC_STUB ITaskSettings_get_AllowDemandStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_AllowDemandStart_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL allow);
void __RPC_STUB ITaskSettings_put_AllowDemandStart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_RestartInterval_Proxy(
    ITaskSettings* This,
    BSTR *interval);
void __RPC_STUB ITaskSettings_get_RestartInterval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_RestartInterval_Proxy(
    ITaskSettings* This,
    BSTR interval);
void __RPC_STUB ITaskSettings_put_RestartInterval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_RestartCount_Proxy(
    ITaskSettings* This,
    INT *count);
void __RPC_STUB ITaskSettings_get_RestartCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_RestartCount_Proxy(
    ITaskSettings* This,
    INT count);
void __RPC_STUB ITaskSettings_put_RestartCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_MultipleInstances_Proxy(
    ITaskSettings* This,
    TASK_INSTANCES_POLICY *policy);
void __RPC_STUB ITaskSettings_get_MultipleInstances_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_MultipleInstances_Proxy(
    ITaskSettings* This,
    TASK_INSTANCES_POLICY policy);
void __RPC_STUB ITaskSettings_put_MultipleInstances_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_StopIfGoingOnBatteries_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL *stop);
void __RPC_STUB ITaskSettings_get_StopIfGoingOnBatteries_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_StopIfGoingOnBatteries_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL stop);
void __RPC_STUB ITaskSettings_put_StopIfGoingOnBatteries_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_DisallowStartIfOnBatteries_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL *disallow);
void __RPC_STUB ITaskSettings_get_DisallowStartIfOnBatteries_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_DisallowStartIfOnBatteries_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL disallow);
void __RPC_STUB ITaskSettings_put_DisallowStartIfOnBatteries_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_AllowHardTerminate_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL *allow);
void __RPC_STUB ITaskSettings_get_AllowHardTerminate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_AllowHardTerminate_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL allow);
void __RPC_STUB ITaskSettings_put_AllowHardTerminate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_StartWhenAvailable_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL *start);
void __RPC_STUB ITaskSettings_get_StartWhenAvailable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_StartWhenAvailable_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL start);
void __RPC_STUB ITaskSettings_put_StartWhenAvailable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_XmlText_Proxy(
    ITaskSettings* This,
    BSTR *xml);
void __RPC_STUB ITaskSettings_get_XmlText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_XmlText_Proxy(
    ITaskSettings* This,
    BSTR xml);
void __RPC_STUB ITaskSettings_put_XmlText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_RunOnlyIfNetworkAvailable_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL *run);
void __RPC_STUB ITaskSettings_get_RunOnlyIfNetworkAvailable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_RunOnlyIfNetworkAvailable_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL run);
void __RPC_STUB ITaskSettings_put_RunOnlyIfNetworkAvailable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_ExecutionTimeLimit_Proxy(
    ITaskSettings* This,
    BSTR *limit);
void __RPC_STUB ITaskSettings_get_ExecutionTimeLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_ExecutionTimeLimit_Proxy(
    ITaskSettings* This,
    BSTR limit);
void __RPC_STUB ITaskSettings_put_ExecutionTimeLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_Enabled_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL *enabled);
void __RPC_STUB ITaskSettings_get_Enabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_Enabled_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL enabled);
void __RPC_STUB ITaskSettings_put_Enabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_DeleteExpiredTaskAfter_Proxy(
    ITaskSettings* This,
    BSTR *delay);
void __RPC_STUB ITaskSettings_get_DeleteExpiredTaskAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_DeleteExpiredTaskAfter_Proxy(
    ITaskSettings* This,
    BSTR delay);
void __RPC_STUB ITaskSettings_put_DeleteExpiredTaskAfter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_Priority_Proxy(
    ITaskSettings* This,
    INT *priority);
void __RPC_STUB ITaskSettings_get_Priority_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_Priority_Proxy(
    ITaskSettings* This,
    INT priority);
void __RPC_STUB ITaskSettings_put_Priority_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_Compatibility_Proxy(
    ITaskSettings* This,
    TASK_COMPATIBILITY *level);
void __RPC_STUB ITaskSettings_get_Compatibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_Compatibility_Proxy(
    ITaskSettings* This,
    TASK_COMPATIBILITY level);
void __RPC_STUB ITaskSettings_put_Compatibility_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_Hidden_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL *hidden);
void __RPC_STUB ITaskSettings_get_Hidden_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_Hidden_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL hidden);
void __RPC_STUB ITaskSettings_put_Hidden_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_IdleSettings_Proxy(
    ITaskSettings* This,
    IIdleSettings **settings);
void __RPC_STUB ITaskSettings_get_IdleSettings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_IdleSettings_Proxy(
    ITaskSettings* This,
    IIdleSettings *settings);
void __RPC_STUB ITaskSettings_put_IdleSettings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_RunOnlyIfIdle_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL *run);
void __RPC_STUB ITaskSettings_get_RunOnlyIfIdle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_RunOnlyIfIdle_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL run);
void __RPC_STUB ITaskSettings_put_RunOnlyIfIdle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_WakeToRun_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL *wake);
void __RPC_STUB ITaskSettings_get_WakeToRun_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_WakeToRun_Proxy(
    ITaskSettings* This,
    VARIANT_BOOL wake);
void __RPC_STUB ITaskSettings_put_WakeToRun_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_get_NetworkSettings_Proxy(
    ITaskSettings* This,
    INetworkSettings **settings);
void __RPC_STUB ITaskSettings_get_NetworkSettings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITaskSettings_put_NetworkSettings_Proxy(
    ITaskSettings* This,
    INetworkSettings *settings);
void __RPC_STUB ITaskSettings_put_NetworkSettings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITaskSettings_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIdleSettings interface
 */
#ifndef __IIdleSettings_INTERFACE_DEFINED__
#define __IIdleSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID_IIdleSettings, 0x84594461, 0x0053, 0x4342, 0xa8,0xfd, 0x08,0x8f,0xab,0xf1,0x1f,0x32);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("84594461-0053-4342-a8fd-088fabf11f32")
IIdleSettings : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_IdleDuration(
        BSTR *delay) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_IdleDuration(
        BSTR delay) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_WaitTimeout(
        BSTR *timeout) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_WaitTimeout(
        BSTR timeout) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StopOnIdleEnd(
        VARIANT_BOOL *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_StopOnIdleEnd(
        VARIANT_BOOL stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RestartOnIdle(
        VARIANT_BOOL *restart) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RestartOnIdle(
        VARIANT_BOOL restart) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IIdleSettings, 0x84594461, 0x0053, 0x4342, 0xa8,0xfd, 0x08,0x8f,0xab,0xf1,0x1f,0x32)
#endif
#else
typedef struct IIdleSettingsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IIdleSettings* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IIdleSettings* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IIdleSettings* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IIdleSettings* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IIdleSettings* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IIdleSettings* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IIdleSettings* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IIdleSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IdleDuration)(
        IIdleSettings* This,
        BSTR *delay);

    HRESULT (STDMETHODCALLTYPE *put_IdleDuration)(
        IIdleSettings* This,
        BSTR delay);

    HRESULT (STDMETHODCALLTYPE *get_WaitTimeout)(
        IIdleSettings* This,
        BSTR *timeout);

    HRESULT (STDMETHODCALLTYPE *put_WaitTimeout)(
        IIdleSettings* This,
        BSTR timeout);

    HRESULT (STDMETHODCALLTYPE *get_StopOnIdleEnd)(
        IIdleSettings* This,
        VARIANT_BOOL *stop);

    HRESULT (STDMETHODCALLTYPE *put_StopOnIdleEnd)(
        IIdleSettings* This,
        VARIANT_BOOL stop);

    HRESULT (STDMETHODCALLTYPE *get_RestartOnIdle)(
        IIdleSettings* This,
        VARIANT_BOOL *restart);

    HRESULT (STDMETHODCALLTYPE *put_RestartOnIdle)(
        IIdleSettings* This,
        VARIANT_BOOL restart);

    END_INTERFACE
} IIdleSettingsVtbl;
interface IIdleSettings {
    CONST_VTBL IIdleSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IIdleSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IIdleSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IIdleSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IIdleSettings_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IIdleSettings_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IIdleSettings_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IIdleSettings_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IIdleSettings methods ***/
#define IIdleSettings_get_IdleDuration(This,delay) (This)->lpVtbl->get_IdleDuration(This,delay)
#define IIdleSettings_put_IdleDuration(This,delay) (This)->lpVtbl->put_IdleDuration(This,delay)
#define IIdleSettings_get_WaitTimeout(This,timeout) (This)->lpVtbl->get_WaitTimeout(This,timeout)
#define IIdleSettings_put_WaitTimeout(This,timeout) (This)->lpVtbl->put_WaitTimeout(This,timeout)
#define IIdleSettings_get_StopOnIdleEnd(This,stop) (This)->lpVtbl->get_StopOnIdleEnd(This,stop)
#define IIdleSettings_put_StopOnIdleEnd(This,stop) (This)->lpVtbl->put_StopOnIdleEnd(This,stop)
#define IIdleSettings_get_RestartOnIdle(This,restart) (This)->lpVtbl->get_RestartOnIdle(This,restart)
#define IIdleSettings_put_RestartOnIdle(This,restart) (This)->lpVtbl->put_RestartOnIdle(This,restart)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IIdleSettings_QueryInterface(IIdleSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IIdleSettings_AddRef(IIdleSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IIdleSettings_Release(IIdleSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IIdleSettings_GetTypeInfoCount(IIdleSettings* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IIdleSettings_GetTypeInfo(IIdleSettings* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IIdleSettings_GetIDsOfNames(IIdleSettings* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IIdleSettings_Invoke(IIdleSettings* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IIdleSettings methods ***/
static FORCEINLINE HRESULT IIdleSettings_get_IdleDuration(IIdleSettings* This,BSTR *delay) {
    return This->lpVtbl->get_IdleDuration(This,delay);
}
static FORCEINLINE HRESULT IIdleSettings_put_IdleDuration(IIdleSettings* This,BSTR delay) {
    return This->lpVtbl->put_IdleDuration(This,delay);
}
static FORCEINLINE HRESULT IIdleSettings_get_WaitTimeout(IIdleSettings* This,BSTR *timeout) {
    return This->lpVtbl->get_WaitTimeout(This,timeout);
}
static FORCEINLINE HRESULT IIdleSettings_put_WaitTimeout(IIdleSettings* This,BSTR timeout) {
    return This->lpVtbl->put_WaitTimeout(This,timeout);
}
static FORCEINLINE HRESULT IIdleSettings_get_StopOnIdleEnd(IIdleSettings* This,VARIANT_BOOL *stop) {
    return This->lpVtbl->get_StopOnIdleEnd(This,stop);
}
static FORCEINLINE HRESULT IIdleSettings_put_StopOnIdleEnd(IIdleSettings* This,VARIANT_BOOL stop) {
    return This->lpVtbl->put_StopOnIdleEnd(This,stop);
}
static FORCEINLINE HRESULT IIdleSettings_get_RestartOnIdle(IIdleSettings* This,VARIANT_BOOL *restart) {
    return This->lpVtbl->get_RestartOnIdle(This,restart);
}
static FORCEINLINE HRESULT IIdleSettings_put_RestartOnIdle(IIdleSettings* This,VARIANT_BOOL restart) {
    return This->lpVtbl->put_RestartOnIdle(This,restart);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IIdleSettings_get_IdleDuration_Proxy(
    IIdleSettings* This,
    BSTR *delay);
void __RPC_STUB IIdleSettings_get_IdleDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IIdleSettings_put_IdleDuration_Proxy(
    IIdleSettings* This,
    BSTR delay);
void __RPC_STUB IIdleSettings_put_IdleDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IIdleSettings_get_WaitTimeout_Proxy(
    IIdleSettings* This,
    BSTR *timeout);
void __RPC_STUB IIdleSettings_get_WaitTimeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IIdleSettings_put_WaitTimeout_Proxy(
    IIdleSettings* This,
    BSTR timeout);
void __RPC_STUB IIdleSettings_put_WaitTimeout_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IIdleSettings_get_StopOnIdleEnd_Proxy(
    IIdleSettings* This,
    VARIANT_BOOL *stop);
void __RPC_STUB IIdleSettings_get_StopOnIdleEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IIdleSettings_put_StopOnIdleEnd_Proxy(
    IIdleSettings* This,
    VARIANT_BOOL stop);
void __RPC_STUB IIdleSettings_put_StopOnIdleEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IIdleSettings_get_RestartOnIdle_Proxy(
    IIdleSettings* This,
    VARIANT_BOOL *restart);
void __RPC_STUB IIdleSettings_get_RestartOnIdle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IIdleSettings_put_RestartOnIdle_Proxy(
    IIdleSettings* This,
    VARIANT_BOOL restart);
void __RPC_STUB IIdleSettings_put_RestartOnIdle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IIdleSettings_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRunningTask interface
 */
#ifndef __IRunningTask_INTERFACE_DEFINED__
#define __IRunningTask_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRunningTask, 0x653758fb, 0x7b9a, 0x4f1e, 0xa4,0x71, 0xbe,0xeb,0x8e,0x9b,0x83,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("653758fb-7b9a-4f1e-a471-beeb8e9b834e")
IRunningTask : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_InstanceGuid(
        BSTR *guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Path(
        BSTR *path) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_State(
        TASK_STATE *state) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentAction(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Refresh(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_EnginePID(
        DWORD *pid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRunningTask, 0x653758fb, 0x7b9a, 0x4f1e, 0xa4,0x71, 0xbe,0xeb,0x8e,0x9b,0x83,0x4e)
#endif
#else
typedef struct IRunningTaskVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRunningTask* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRunningTask* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRunningTask* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRunningTask* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRunningTask* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRunningTask* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRunningTask* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRunningTask methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IRunningTask* This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_InstanceGuid)(
        IRunningTask* This,
        BSTR *guid);

    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IRunningTask* This,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *get_State)(
        IRunningTask* This,
        TASK_STATE *state);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAction)(
        IRunningTask* This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IRunningTask* This);

    HRESULT (STDMETHODCALLTYPE *Refresh)(
        IRunningTask* This);

    HRESULT (STDMETHODCALLTYPE *get_EnginePID)(
        IRunningTask* This,
        DWORD *pid);

    END_INTERFACE
} IRunningTaskVtbl;
interface IRunningTask {
    CONST_VTBL IRunningTaskVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRunningTask_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRunningTask_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRunningTask_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRunningTask_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRunningTask_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRunningTask_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRunningTask_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRunningTask methods ***/
#define IRunningTask_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
#define IRunningTask_get_InstanceGuid(This,guid) (This)->lpVtbl->get_InstanceGuid(This,guid)
#define IRunningTask_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
#define IRunningTask_get_State(This,state) (This)->lpVtbl->get_State(This,state)
#define IRunningTask_get_CurrentAction(This,name) (This)->lpVtbl->get_CurrentAction(This,name)
#define IRunningTask_Stop(This) (This)->lpVtbl->Stop(This)
#define IRunningTask_Refresh(This) (This)->lpVtbl->Refresh(This)
#define IRunningTask_get_EnginePID(This,pid) (This)->lpVtbl->get_EnginePID(This,pid)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRunningTask_QueryInterface(IRunningTask* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRunningTask_AddRef(IRunningTask* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRunningTask_Release(IRunningTask* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRunningTask_GetTypeInfoCount(IRunningTask* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRunningTask_GetTypeInfo(IRunningTask* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRunningTask_GetIDsOfNames(IRunningTask* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRunningTask_Invoke(IRunningTask* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRunningTask methods ***/
static FORCEINLINE HRESULT IRunningTask_get_Name(IRunningTask* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static FORCEINLINE HRESULT IRunningTask_get_InstanceGuid(IRunningTask* This,BSTR *guid) {
    return This->lpVtbl->get_InstanceGuid(This,guid);
}
static FORCEINLINE HRESULT IRunningTask_get_Path(IRunningTask* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static FORCEINLINE HRESULT IRunningTask_get_State(IRunningTask* This,TASK_STATE *state) {
    return This->lpVtbl->get_State(This,state);
}
static FORCEINLINE HRESULT IRunningTask_get_CurrentAction(IRunningTask* This,BSTR *name) {
    return This->lpVtbl->get_CurrentAction(This,name);
}
static FORCEINLINE HRESULT IRunningTask_Stop(IRunningTask* This) {
    return This->lpVtbl->Stop(This);
}
static FORCEINLINE HRESULT IRunningTask_Refresh(IRunningTask* This) {
    return This->lpVtbl->Refresh(This);
}
static FORCEINLINE HRESULT IRunningTask_get_EnginePID(IRunningTask* This,DWORD *pid) {
    return This->lpVtbl->get_EnginePID(This,pid);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IRunningTask_get_Name_Proxy(
    IRunningTask* This,
    BSTR *name);
void __RPC_STUB IRunningTask_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRunningTask_get_InstanceGuid_Proxy(
    IRunningTask* This,
    BSTR *guid);
void __RPC_STUB IRunningTask_get_InstanceGuid_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRunningTask_get_Path_Proxy(
    IRunningTask* This,
    BSTR *path);
void __RPC_STUB IRunningTask_get_Path_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRunningTask_get_State_Proxy(
    IRunningTask* This,
    TASK_STATE *state);
void __RPC_STUB IRunningTask_get_State_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRunningTask_get_CurrentAction_Proxy(
    IRunningTask* This,
    BSTR *name);
void __RPC_STUB IRunningTask_get_CurrentAction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRunningTask_Stop_Proxy(
    IRunningTask* This);
void __RPC_STUB IRunningTask_Stop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRunningTask_Refresh_Proxy(
    IRunningTask* This);
void __RPC_STUB IRunningTask_Refresh_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRunningTask_get_EnginePID_Proxy(
    IRunningTask* This,
    DWORD *pid);
void __RPC_STUB IRunningTask_get_EnginePID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IRunningTask_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRunningTaskCollection interface
 */
#ifndef __IRunningTaskCollection_INTERFACE_DEFINED__
#define __IRunningTaskCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRunningTaskCollection, 0x6a67614b, 0x6828, 0x4fec, 0xaa,0x54, 0x6d,0x52,0xe8,0xf1,0xf2,0xdb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6a67614b-6828-4fec-aa54-6d52e8f1f2db")
IRunningTaskCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        VARIANT index,
        IRunningTask **task) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **penum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRunningTaskCollection, 0x6a67614b, 0x6828, 0x4fec, 0xaa,0x54, 0x6d,0x52,0xe8,0xf1,0xf2,0xdb)
#endif
#else
typedef struct IRunningTaskCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRunningTaskCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRunningTaskCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRunningTaskCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRunningTaskCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRunningTaskCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRunningTaskCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRunningTaskCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRunningTaskCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IRunningTaskCollection* This,
        LONG *count);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IRunningTaskCollection* This,
        VARIANT index,
        IRunningTask **task);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IRunningTaskCollection* This,
        IUnknown **penum);

    END_INTERFACE
} IRunningTaskCollectionVtbl;
interface IRunningTaskCollection {
    CONST_VTBL IRunningTaskCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRunningTaskCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRunningTaskCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRunningTaskCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRunningTaskCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRunningTaskCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRunningTaskCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRunningTaskCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRunningTaskCollection methods ***/
#define IRunningTaskCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
#define IRunningTaskCollection_get_Item(This,index,task) (This)->lpVtbl->get_Item(This,index,task)
#define IRunningTaskCollection_get__NewEnum(This,penum) (This)->lpVtbl->get__NewEnum(This,penum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRunningTaskCollection_QueryInterface(IRunningTaskCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRunningTaskCollection_AddRef(IRunningTaskCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRunningTaskCollection_Release(IRunningTaskCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRunningTaskCollection_GetTypeInfoCount(IRunningTaskCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRunningTaskCollection_GetTypeInfo(IRunningTaskCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRunningTaskCollection_GetIDsOfNames(IRunningTaskCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRunningTaskCollection_Invoke(IRunningTaskCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRunningTaskCollection methods ***/
static FORCEINLINE HRESULT IRunningTaskCollection_get_Count(IRunningTaskCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static FORCEINLINE HRESULT IRunningTaskCollection_get_Item(IRunningTaskCollection* This,VARIANT index,IRunningTask **task) {
    return This->lpVtbl->get_Item(This,index,task);
}
static FORCEINLINE HRESULT IRunningTaskCollection_get__NewEnum(IRunningTaskCollection* This,IUnknown **penum) {
    return This->lpVtbl->get__NewEnum(This,penum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IRunningTaskCollection_get_Count_Proxy(
    IRunningTaskCollection* This,
    LONG *count);
void __RPC_STUB IRunningTaskCollection_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRunningTaskCollection_get_Item_Proxy(
    IRunningTaskCollection* This,
    VARIANT index,
    IRunningTask **task);
void __RPC_STUB IRunningTaskCollection_get_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRunningTaskCollection_get__NewEnum_Proxy(
    IRunningTaskCollection* This,
    IUnknown **penum);
void __RPC_STUB IRunningTaskCollection_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IRunningTaskCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITrigger interface
 */
#ifndef __ITrigger_INTERFACE_DEFINED__
#define __ITrigger_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITrigger, 0x09941815, 0xea89, 0x4b5b, 0x89,0xe0, 0x2a,0x77,0x38,0x01,0xfa,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("09941815-ea89-4b5b-89e0-2a773801fac3")
ITrigger : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Type(
        TASK_TRIGGER_TYPE2 *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Id(
        BSTR *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Id(
        BSTR id) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Repetition(
        IRepetitionPattern **repeat) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Repetition(
        IRepetitionPattern *repeat) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ExecutionTimeLimit(
        BSTR *limit) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ExecutionTimeLimit(
        BSTR limit) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StartBoundary(
        BSTR *start) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_StartBoundary(
        BSTR start) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_EndBoundary(
        BSTR *end) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_EndBoundary(
        BSTR end) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Enabled(
        VARIANT_BOOL *enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Enabled(
        VARIANT_BOOL enabled) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITrigger, 0x09941815, 0xea89, 0x4b5b, 0x89,0xe0, 0x2a,0x77,0x38,0x01,0xfa,0xc3)
#endif
#else
typedef struct ITriggerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITrigger* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITrigger* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITrigger* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITrigger* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITrigger* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITrigger* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITrigger* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITrigger methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Type)(
        ITrigger* This,
        TASK_TRIGGER_TYPE2 *type);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        ITrigger* This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *put_Id)(
        ITrigger* This,
        BSTR id);

    HRESULT (STDMETHODCALLTYPE *get_Repetition)(
        ITrigger* This,
        IRepetitionPattern **repeat);

    HRESULT (STDMETHODCALLTYPE *put_Repetition)(
        ITrigger* This,
        IRepetitionPattern *repeat);

    HRESULT (STDMETHODCALLTYPE *get_ExecutionTimeLimit)(
        ITrigger* This,
        BSTR *limit);

    HRESULT (STDMETHODCALLTYPE *put_ExecutionTimeLimit)(
        ITrigger* This,
        BSTR limit);

    HRESULT (STDMETHODCALLTYPE *get_StartBoundary)(
        ITrigger* This,
        BSTR *start);

    HRESULT (STDMETHODCALLTYPE *put_StartBoundary)(
        ITrigger* This,
        BSTR start);

    HRESULT (STDMETHODCALLTYPE *get_EndBoundary)(
        ITrigger* This,
        BSTR *end);

    HRESULT (STDMETHODCALLTYPE *put_EndBoundary)(
        ITrigger* This,
        BSTR end);

    HRESULT (STDMETHODCALLTYPE *get_Enabled)(
        ITrigger* This,
        VARIANT_BOOL *enabled);

    HRESULT (STDMETHODCALLTYPE *put_Enabled)(
        ITrigger* This,
        VARIANT_BOOL enabled);

    END_INTERFACE
} ITriggerVtbl;
interface ITrigger {
    CONST_VTBL ITriggerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITrigger_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITrigger_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITrigger_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITrigger_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITrigger_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITrigger_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITrigger_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITrigger methods ***/
#define ITrigger_get_Type(This,type) (This)->lpVtbl->get_Type(This,type)
#define ITrigger_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define ITrigger_put_Id(This,id) (This)->lpVtbl->put_Id(This,id)
#define ITrigger_get_Repetition(This,repeat) (This)->lpVtbl->get_Repetition(This,repeat)
#define ITrigger_put_Repetition(This,repeat) (This)->lpVtbl->put_Repetition(This,repeat)
#define ITrigger_get_ExecutionTimeLimit(This,limit) (This)->lpVtbl->get_ExecutionTimeLimit(This,limit)
#define ITrigger_put_ExecutionTimeLimit(This,limit) (This)->lpVtbl->put_ExecutionTimeLimit(This,limit)
#define ITrigger_get_StartBoundary(This,start) (This)->lpVtbl->get_StartBoundary(This,start)
#define ITrigger_put_StartBoundary(This,start) (This)->lpVtbl->put_StartBoundary(This,start)
#define ITrigger_get_EndBoundary(This,end) (This)->lpVtbl->get_EndBoundary(This,end)
#define ITrigger_put_EndBoundary(This,end) (This)->lpVtbl->put_EndBoundary(This,end)
#define ITrigger_get_Enabled(This,enabled) (This)->lpVtbl->get_Enabled(This,enabled)
#define ITrigger_put_Enabled(This,enabled) (This)->lpVtbl->put_Enabled(This,enabled)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITrigger_QueryInterface(ITrigger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITrigger_AddRef(ITrigger* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITrigger_Release(ITrigger* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITrigger_GetTypeInfoCount(ITrigger* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITrigger_GetTypeInfo(ITrigger* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITrigger_GetIDsOfNames(ITrigger* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITrigger_Invoke(ITrigger* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITrigger methods ***/
static FORCEINLINE HRESULT ITrigger_get_Type(ITrigger* This,TASK_TRIGGER_TYPE2 *type) {
    return This->lpVtbl->get_Type(This,type);
}
static FORCEINLINE HRESULT ITrigger_get_Id(ITrigger* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static FORCEINLINE HRESULT ITrigger_put_Id(ITrigger* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
static FORCEINLINE HRESULT ITrigger_get_Repetition(ITrigger* This,IRepetitionPattern **repeat) {
    return This->lpVtbl->get_Repetition(This,repeat);
}
static FORCEINLINE HRESULT ITrigger_put_Repetition(ITrigger* This,IRepetitionPattern *repeat) {
    return This->lpVtbl->put_Repetition(This,repeat);
}
static FORCEINLINE HRESULT ITrigger_get_ExecutionTimeLimit(ITrigger* This,BSTR *limit) {
    return This->lpVtbl->get_ExecutionTimeLimit(This,limit);
}
static FORCEINLINE HRESULT ITrigger_put_ExecutionTimeLimit(ITrigger* This,BSTR limit) {
    return This->lpVtbl->put_ExecutionTimeLimit(This,limit);
}
static FORCEINLINE HRESULT ITrigger_get_StartBoundary(ITrigger* This,BSTR *start) {
    return This->lpVtbl->get_StartBoundary(This,start);
}
static FORCEINLINE HRESULT ITrigger_put_StartBoundary(ITrigger* This,BSTR start) {
    return This->lpVtbl->put_StartBoundary(This,start);
}
static FORCEINLINE HRESULT ITrigger_get_EndBoundary(ITrigger* This,BSTR *end) {
    return This->lpVtbl->get_EndBoundary(This,end);
}
static FORCEINLINE HRESULT ITrigger_put_EndBoundary(ITrigger* This,BSTR end) {
    return This->lpVtbl->put_EndBoundary(This,end);
}
static FORCEINLINE HRESULT ITrigger_get_Enabled(ITrigger* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->get_Enabled(This,enabled);
}
static FORCEINLINE HRESULT ITrigger_put_Enabled(ITrigger* This,VARIANT_BOOL enabled) {
    return This->lpVtbl->put_Enabled(This,enabled);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITrigger_get_Type_Proxy(
    ITrigger* This,
    TASK_TRIGGER_TYPE2 *type);
void __RPC_STUB ITrigger_get_Type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrigger_get_Id_Proxy(
    ITrigger* This,
    BSTR *id);
void __RPC_STUB ITrigger_get_Id_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrigger_put_Id_Proxy(
    ITrigger* This,
    BSTR id);
void __RPC_STUB ITrigger_put_Id_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrigger_get_Repetition_Proxy(
    ITrigger* This,
    IRepetitionPattern **repeat);
void __RPC_STUB ITrigger_get_Repetition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrigger_put_Repetition_Proxy(
    ITrigger* This,
    IRepetitionPattern *repeat);
void __RPC_STUB ITrigger_put_Repetition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrigger_get_ExecutionTimeLimit_Proxy(
    ITrigger* This,
    BSTR *limit);
void __RPC_STUB ITrigger_get_ExecutionTimeLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrigger_put_ExecutionTimeLimit_Proxy(
    ITrigger* This,
    BSTR limit);
void __RPC_STUB ITrigger_put_ExecutionTimeLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrigger_get_StartBoundary_Proxy(
    ITrigger* This,
    BSTR *start);
void __RPC_STUB ITrigger_get_StartBoundary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrigger_put_StartBoundary_Proxy(
    ITrigger* This,
    BSTR start);
void __RPC_STUB ITrigger_put_StartBoundary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrigger_get_EndBoundary_Proxy(
    ITrigger* This,
    BSTR *end);
void __RPC_STUB ITrigger_get_EndBoundary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrigger_put_EndBoundary_Proxy(
    ITrigger* This,
    BSTR end);
void __RPC_STUB ITrigger_put_EndBoundary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrigger_get_Enabled_Proxy(
    ITrigger* This,
    VARIANT_BOOL *enabled);
void __RPC_STUB ITrigger_get_Enabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITrigger_put_Enabled_Proxy(
    ITrigger* This,
    VARIANT_BOOL enabled);
void __RPC_STUB ITrigger_put_Enabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITrigger_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDailyTrigger interface
 */
#ifndef __IDailyTrigger_INTERFACE_DEFINED__
#define __IDailyTrigger_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDailyTrigger, 0x126c5cd8, 0xb288, 0x41d5, 0x8d,0xbf, 0xe4,0x91,0x44,0x6a,0xdc,0x5c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("126c5cd8-b288-41d5-8dbf-e491446adc5c")
IDailyTrigger : public ITrigger
{
    virtual HRESULT STDMETHODCALLTYPE get_DaysInterval(
        short *pDays) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DaysInterval(
        short days) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RandomDelay(
        BSTR *pRandomDelay) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RandomDelay(
        BSTR randomDelay) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDailyTrigger, 0x126c5cd8, 0xb288, 0x41d5, 0x8d,0xbf, 0xe4,0x91,0x44,0x6a,0xdc,0x5c)
#endif
#else
typedef struct IDailyTriggerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDailyTrigger* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDailyTrigger* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDailyTrigger* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDailyTrigger* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDailyTrigger* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDailyTrigger* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDailyTrigger* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITrigger methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Type)(
        IDailyTrigger* This,
        TASK_TRIGGER_TYPE2 *type);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IDailyTrigger* This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *put_Id)(
        IDailyTrigger* This,
        BSTR id);

    HRESULT (STDMETHODCALLTYPE *get_Repetition)(
        IDailyTrigger* This,
        IRepetitionPattern **repeat);

    HRESULT (STDMETHODCALLTYPE *put_Repetition)(
        IDailyTrigger* This,
        IRepetitionPattern *repeat);

    HRESULT (STDMETHODCALLTYPE *get_ExecutionTimeLimit)(
        IDailyTrigger* This,
        BSTR *limit);

    HRESULT (STDMETHODCALLTYPE *put_ExecutionTimeLimit)(
        IDailyTrigger* This,
        BSTR limit);

    HRESULT (STDMETHODCALLTYPE *get_StartBoundary)(
        IDailyTrigger* This,
        BSTR *start);

    HRESULT (STDMETHODCALLTYPE *put_StartBoundary)(
        IDailyTrigger* This,
        BSTR start);

    HRESULT (STDMETHODCALLTYPE *get_EndBoundary)(
        IDailyTrigger* This,
        BSTR *end);

    HRESULT (STDMETHODCALLTYPE *put_EndBoundary)(
        IDailyTrigger* This,
        BSTR end);

    HRESULT (STDMETHODCALLTYPE *get_Enabled)(
        IDailyTrigger* This,
        VARIANT_BOOL *enabled);

    HRESULT (STDMETHODCALLTYPE *put_Enabled)(
        IDailyTrigger* This,
        VARIANT_BOOL enabled);

    /*** IDailyTrigger methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DaysInterval)(
        IDailyTrigger* This,
        short *pDays);

    HRESULT (STDMETHODCALLTYPE *put_DaysInterval)(
        IDailyTrigger* This,
        short days);

    HRESULT (STDMETHODCALLTYPE *get_RandomDelay)(
        IDailyTrigger* This,
        BSTR *pRandomDelay);

    HRESULT (STDMETHODCALLTYPE *put_RandomDelay)(
        IDailyTrigger* This,
        BSTR randomDelay);

    END_INTERFACE
} IDailyTriggerVtbl;
interface IDailyTrigger {
    CONST_VTBL IDailyTriggerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDailyTrigger_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDailyTrigger_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDailyTrigger_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDailyTrigger_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDailyTrigger_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDailyTrigger_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDailyTrigger_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITrigger methods ***/
#define IDailyTrigger_get_Type(This,type) (This)->lpVtbl->get_Type(This,type)
#define IDailyTrigger_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IDailyTrigger_put_Id(This,id) (This)->lpVtbl->put_Id(This,id)
#define IDailyTrigger_get_Repetition(This,repeat) (This)->lpVtbl->get_Repetition(This,repeat)
#define IDailyTrigger_put_Repetition(This,repeat) (This)->lpVtbl->put_Repetition(This,repeat)
#define IDailyTrigger_get_ExecutionTimeLimit(This,limit) (This)->lpVtbl->get_ExecutionTimeLimit(This,limit)
#define IDailyTrigger_put_ExecutionTimeLimit(This,limit) (This)->lpVtbl->put_ExecutionTimeLimit(This,limit)
#define IDailyTrigger_get_StartBoundary(This,start) (This)->lpVtbl->get_StartBoundary(This,start)
#define IDailyTrigger_put_StartBoundary(This,start) (This)->lpVtbl->put_StartBoundary(This,start)
#define IDailyTrigger_get_EndBoundary(This,end) (This)->lpVtbl->get_EndBoundary(This,end)
#define IDailyTrigger_put_EndBoundary(This,end) (This)->lpVtbl->put_EndBoundary(This,end)
#define IDailyTrigger_get_Enabled(This,enabled) (This)->lpVtbl->get_Enabled(This,enabled)
#define IDailyTrigger_put_Enabled(This,enabled) (This)->lpVtbl->put_Enabled(This,enabled)
/*** IDailyTrigger methods ***/
#define IDailyTrigger_get_DaysInterval(This,pDays) (This)->lpVtbl->get_DaysInterval(This,pDays)
#define IDailyTrigger_put_DaysInterval(This,days) (This)->lpVtbl->put_DaysInterval(This,days)
#define IDailyTrigger_get_RandomDelay(This,pRandomDelay) (This)->lpVtbl->get_RandomDelay(This,pRandomDelay)
#define IDailyTrigger_put_RandomDelay(This,randomDelay) (This)->lpVtbl->put_RandomDelay(This,randomDelay)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDailyTrigger_QueryInterface(IDailyTrigger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDailyTrigger_AddRef(IDailyTrigger* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDailyTrigger_Release(IDailyTrigger* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDailyTrigger_GetTypeInfoCount(IDailyTrigger* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDailyTrigger_GetTypeInfo(IDailyTrigger* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDailyTrigger_GetIDsOfNames(IDailyTrigger* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDailyTrigger_Invoke(IDailyTrigger* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITrigger methods ***/
static FORCEINLINE HRESULT IDailyTrigger_get_Type(IDailyTrigger* This,TASK_TRIGGER_TYPE2 *type) {
    return This->lpVtbl->get_Type(This,type);
}
static FORCEINLINE HRESULT IDailyTrigger_get_Id(IDailyTrigger* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static FORCEINLINE HRESULT IDailyTrigger_put_Id(IDailyTrigger* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
static FORCEINLINE HRESULT IDailyTrigger_get_Repetition(IDailyTrigger* This,IRepetitionPattern **repeat) {
    return This->lpVtbl->get_Repetition(This,repeat);
}
static FORCEINLINE HRESULT IDailyTrigger_put_Repetition(IDailyTrigger* This,IRepetitionPattern *repeat) {
    return This->lpVtbl->put_Repetition(This,repeat);
}
static FORCEINLINE HRESULT IDailyTrigger_get_ExecutionTimeLimit(IDailyTrigger* This,BSTR *limit) {
    return This->lpVtbl->get_ExecutionTimeLimit(This,limit);
}
static FORCEINLINE HRESULT IDailyTrigger_put_ExecutionTimeLimit(IDailyTrigger* This,BSTR limit) {
    return This->lpVtbl->put_ExecutionTimeLimit(This,limit);
}
static FORCEINLINE HRESULT IDailyTrigger_get_StartBoundary(IDailyTrigger* This,BSTR *start) {
    return This->lpVtbl->get_StartBoundary(This,start);
}
static FORCEINLINE HRESULT IDailyTrigger_put_StartBoundary(IDailyTrigger* This,BSTR start) {
    return This->lpVtbl->put_StartBoundary(This,start);
}
static FORCEINLINE HRESULT IDailyTrigger_get_EndBoundary(IDailyTrigger* This,BSTR *end) {
    return This->lpVtbl->get_EndBoundary(This,end);
}
static FORCEINLINE HRESULT IDailyTrigger_put_EndBoundary(IDailyTrigger* This,BSTR end) {
    return This->lpVtbl->put_EndBoundary(This,end);
}
static FORCEINLINE HRESULT IDailyTrigger_get_Enabled(IDailyTrigger* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->get_Enabled(This,enabled);
}
static FORCEINLINE HRESULT IDailyTrigger_put_Enabled(IDailyTrigger* This,VARIANT_BOOL enabled) {
    return This->lpVtbl->put_Enabled(This,enabled);
}
/*** IDailyTrigger methods ***/
static FORCEINLINE HRESULT IDailyTrigger_get_DaysInterval(IDailyTrigger* This,short *pDays) {
    return This->lpVtbl->get_DaysInterval(This,pDays);
}
static FORCEINLINE HRESULT IDailyTrigger_put_DaysInterval(IDailyTrigger* This,short days) {
    return This->lpVtbl->put_DaysInterval(This,days);
}
static FORCEINLINE HRESULT IDailyTrigger_get_RandomDelay(IDailyTrigger* This,BSTR *pRandomDelay) {
    return This->lpVtbl->get_RandomDelay(This,pRandomDelay);
}
static FORCEINLINE HRESULT IDailyTrigger_put_RandomDelay(IDailyTrigger* This,BSTR randomDelay) {
    return This->lpVtbl->put_RandomDelay(This,randomDelay);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDailyTrigger_get_DaysInterval_Proxy(
    IDailyTrigger* This,
    short *pDays);
void __RPC_STUB IDailyTrigger_get_DaysInterval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDailyTrigger_put_DaysInterval_Proxy(
    IDailyTrigger* This,
    short days);
void __RPC_STUB IDailyTrigger_put_DaysInterval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDailyTrigger_get_RandomDelay_Proxy(
    IDailyTrigger* This,
    BSTR *pRandomDelay);
void __RPC_STUB IDailyTrigger_get_RandomDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDailyTrigger_put_RandomDelay_Proxy(
    IDailyTrigger* This,
    BSTR randomDelay);
void __RPC_STUB IDailyTrigger_put_RandomDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDailyTrigger_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITriggerCollection interface
 */
#ifndef __ITriggerCollection_INTERFACE_DEFINED__
#define __ITriggerCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITriggerCollection, 0x85df5081, 0x1b24, 0x4f32, 0x87,0x8a, 0xd9,0xd1,0x4d,0xf4,0xcb,0x77);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("85df5081-1b24-4f32-878a-d9d14df4cb77")
ITriggerCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG index,
        ITrigger **trigger) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **penum) = 0;

    virtual HRESULT STDMETHODCALLTYPE Create(
        TASK_TRIGGER_TYPE2 type,
        ITrigger **trigger) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        VARIANT index) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clear(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITriggerCollection, 0x85df5081, 0x1b24, 0x4f32, 0x87,0x8a, 0xd9,0xd1,0x4d,0xf4,0xcb,0x77)
#endif
#else
typedef struct ITriggerCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITriggerCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITriggerCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITriggerCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITriggerCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITriggerCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITriggerCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITriggerCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITriggerCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ITriggerCollection* This,
        LONG *count);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        ITriggerCollection* This,
        LONG index,
        ITrigger **trigger);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ITriggerCollection* This,
        IUnknown **penum);

    HRESULT (STDMETHODCALLTYPE *Create)(
        ITriggerCollection* This,
        TASK_TRIGGER_TYPE2 type,
        ITrigger **trigger);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        ITriggerCollection* This,
        VARIANT index);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        ITriggerCollection* This);

    END_INTERFACE
} ITriggerCollectionVtbl;
interface ITriggerCollection {
    CONST_VTBL ITriggerCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITriggerCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITriggerCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITriggerCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITriggerCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITriggerCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITriggerCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITriggerCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITriggerCollection methods ***/
#define ITriggerCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
#define ITriggerCollection_get_Item(This,index,trigger) (This)->lpVtbl->get_Item(This,index,trigger)
#define ITriggerCollection_get__NewEnum(This,penum) (This)->lpVtbl->get__NewEnum(This,penum)
#define ITriggerCollection_Create(This,type,trigger) (This)->lpVtbl->Create(This,type,trigger)
#define ITriggerCollection_Remove(This,index) (This)->lpVtbl->Remove(This,index)
#define ITriggerCollection_Clear(This) (This)->lpVtbl->Clear(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITriggerCollection_QueryInterface(ITriggerCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITriggerCollection_AddRef(ITriggerCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITriggerCollection_Release(ITriggerCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITriggerCollection_GetTypeInfoCount(ITriggerCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITriggerCollection_GetTypeInfo(ITriggerCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITriggerCollection_GetIDsOfNames(ITriggerCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITriggerCollection_Invoke(ITriggerCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITriggerCollection methods ***/
static FORCEINLINE HRESULT ITriggerCollection_get_Count(ITriggerCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static FORCEINLINE HRESULT ITriggerCollection_get_Item(ITriggerCollection* This,LONG index,ITrigger **trigger) {
    return This->lpVtbl->get_Item(This,index,trigger);
}
static FORCEINLINE HRESULT ITriggerCollection_get__NewEnum(ITriggerCollection* This,IUnknown **penum) {
    return This->lpVtbl->get__NewEnum(This,penum);
}
static FORCEINLINE HRESULT ITriggerCollection_Create(ITriggerCollection* This,TASK_TRIGGER_TYPE2 type,ITrigger **trigger) {
    return This->lpVtbl->Create(This,type,trigger);
}
static FORCEINLINE HRESULT ITriggerCollection_Remove(ITriggerCollection* This,VARIANT index) {
    return This->lpVtbl->Remove(This,index);
}
static FORCEINLINE HRESULT ITriggerCollection_Clear(ITriggerCollection* This) {
    return This->lpVtbl->Clear(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITriggerCollection_get_Count_Proxy(
    ITriggerCollection* This,
    LONG *count);
void __RPC_STUB ITriggerCollection_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITriggerCollection_get_Item_Proxy(
    ITriggerCollection* This,
    LONG index,
    ITrigger **trigger);
void __RPC_STUB ITriggerCollection_get_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITriggerCollection_get__NewEnum_Proxy(
    ITriggerCollection* This,
    IUnknown **penum);
void __RPC_STUB ITriggerCollection_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITriggerCollection_Create_Proxy(
    ITriggerCollection* This,
    TASK_TRIGGER_TYPE2 type,
    ITrigger **trigger);
void __RPC_STUB ITriggerCollection_Create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITriggerCollection_Remove_Proxy(
    ITriggerCollection* This,
    VARIANT index);
void __RPC_STUB ITriggerCollection_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITriggerCollection_Clear_Proxy(
    ITriggerCollection* This);
void __RPC_STUB ITriggerCollection_Clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITriggerCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITimeTrigger interface
 */
#ifndef __ITimeTrigger_INTERFACE_DEFINED__
#define __ITimeTrigger_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITimeTrigger, 0xb45747e0, 0xeba7, 0x4276, 0x9f,0x29, 0x85,0xc5,0xbb,0x30,0x00,0x06);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b45747e0-eba7-4276-9f29-85c5bb300006")
ITimeTrigger : public ITrigger
{
    virtual HRESULT STDMETHODCALLTYPE get_RandomDelay(
        BSTR *delay) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RandomDelay(
        BSTR delay) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITimeTrigger, 0xb45747e0, 0xeba7, 0x4276, 0x9f,0x29, 0x85,0xc5,0xbb,0x30,0x00,0x06)
#endif
#else
typedef struct ITimeTriggerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITimeTrigger* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITimeTrigger* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITimeTrigger* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITimeTrigger* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITimeTrigger* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITimeTrigger* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITimeTrigger* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITrigger methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Type)(
        ITimeTrigger* This,
        TASK_TRIGGER_TYPE2 *type);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        ITimeTrigger* This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *put_Id)(
        ITimeTrigger* This,
        BSTR id);

    HRESULT (STDMETHODCALLTYPE *get_Repetition)(
        ITimeTrigger* This,
        IRepetitionPattern **repeat);

    HRESULT (STDMETHODCALLTYPE *put_Repetition)(
        ITimeTrigger* This,
        IRepetitionPattern *repeat);

    HRESULT (STDMETHODCALLTYPE *get_ExecutionTimeLimit)(
        ITimeTrigger* This,
        BSTR *limit);

    HRESULT (STDMETHODCALLTYPE *put_ExecutionTimeLimit)(
        ITimeTrigger* This,
        BSTR limit);

    HRESULT (STDMETHODCALLTYPE *get_StartBoundary)(
        ITimeTrigger* This,
        BSTR *start);

    HRESULT (STDMETHODCALLTYPE *put_StartBoundary)(
        ITimeTrigger* This,
        BSTR start);

    HRESULT (STDMETHODCALLTYPE *get_EndBoundary)(
        ITimeTrigger* This,
        BSTR *end);

    HRESULT (STDMETHODCALLTYPE *put_EndBoundary)(
        ITimeTrigger* This,
        BSTR end);

    HRESULT (STDMETHODCALLTYPE *get_Enabled)(
        ITimeTrigger* This,
        VARIANT_BOOL *enabled);

    HRESULT (STDMETHODCALLTYPE *put_Enabled)(
        ITimeTrigger* This,
        VARIANT_BOOL enabled);

    /*** ITimeTrigger methods ***/
    HRESULT (STDMETHODCALLTYPE *get_RandomDelay)(
        ITimeTrigger* This,
        BSTR *delay);

    HRESULT (STDMETHODCALLTYPE *put_RandomDelay)(
        ITimeTrigger* This,
        BSTR delay);

    END_INTERFACE
} ITimeTriggerVtbl;
interface ITimeTrigger {
    CONST_VTBL ITimeTriggerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITimeTrigger_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITimeTrigger_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITimeTrigger_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITimeTrigger_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITimeTrigger_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITimeTrigger_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITimeTrigger_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITrigger methods ***/
#define ITimeTrigger_get_Type(This,type) (This)->lpVtbl->get_Type(This,type)
#define ITimeTrigger_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define ITimeTrigger_put_Id(This,id) (This)->lpVtbl->put_Id(This,id)
#define ITimeTrigger_get_Repetition(This,repeat) (This)->lpVtbl->get_Repetition(This,repeat)
#define ITimeTrigger_put_Repetition(This,repeat) (This)->lpVtbl->put_Repetition(This,repeat)
#define ITimeTrigger_get_ExecutionTimeLimit(This,limit) (This)->lpVtbl->get_ExecutionTimeLimit(This,limit)
#define ITimeTrigger_put_ExecutionTimeLimit(This,limit) (This)->lpVtbl->put_ExecutionTimeLimit(This,limit)
#define ITimeTrigger_get_StartBoundary(This,start) (This)->lpVtbl->get_StartBoundary(This,start)
#define ITimeTrigger_put_StartBoundary(This,start) (This)->lpVtbl->put_StartBoundary(This,start)
#define ITimeTrigger_get_EndBoundary(This,end) (This)->lpVtbl->get_EndBoundary(This,end)
#define ITimeTrigger_put_EndBoundary(This,end) (This)->lpVtbl->put_EndBoundary(This,end)
#define ITimeTrigger_get_Enabled(This,enabled) (This)->lpVtbl->get_Enabled(This,enabled)
#define ITimeTrigger_put_Enabled(This,enabled) (This)->lpVtbl->put_Enabled(This,enabled)
/*** ITimeTrigger methods ***/
#define ITimeTrigger_get_RandomDelay(This,delay) (This)->lpVtbl->get_RandomDelay(This,delay)
#define ITimeTrigger_put_RandomDelay(This,delay) (This)->lpVtbl->put_RandomDelay(This,delay)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITimeTrigger_QueryInterface(ITimeTrigger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITimeTrigger_AddRef(ITimeTrigger* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITimeTrigger_Release(ITimeTrigger* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITimeTrigger_GetTypeInfoCount(ITimeTrigger* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITimeTrigger_GetTypeInfo(ITimeTrigger* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITimeTrigger_GetIDsOfNames(ITimeTrigger* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITimeTrigger_Invoke(ITimeTrigger* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITrigger methods ***/
static FORCEINLINE HRESULT ITimeTrigger_get_Type(ITimeTrigger* This,TASK_TRIGGER_TYPE2 *type) {
    return This->lpVtbl->get_Type(This,type);
}
static FORCEINLINE HRESULT ITimeTrigger_get_Id(ITimeTrigger* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static FORCEINLINE HRESULT ITimeTrigger_put_Id(ITimeTrigger* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
static FORCEINLINE HRESULT ITimeTrigger_get_Repetition(ITimeTrigger* This,IRepetitionPattern **repeat) {
    return This->lpVtbl->get_Repetition(This,repeat);
}
static FORCEINLINE HRESULT ITimeTrigger_put_Repetition(ITimeTrigger* This,IRepetitionPattern *repeat) {
    return This->lpVtbl->put_Repetition(This,repeat);
}
static FORCEINLINE HRESULT ITimeTrigger_get_ExecutionTimeLimit(ITimeTrigger* This,BSTR *limit) {
    return This->lpVtbl->get_ExecutionTimeLimit(This,limit);
}
static FORCEINLINE HRESULT ITimeTrigger_put_ExecutionTimeLimit(ITimeTrigger* This,BSTR limit) {
    return This->lpVtbl->put_ExecutionTimeLimit(This,limit);
}
static FORCEINLINE HRESULT ITimeTrigger_get_StartBoundary(ITimeTrigger* This,BSTR *start) {
    return This->lpVtbl->get_StartBoundary(This,start);
}
static FORCEINLINE HRESULT ITimeTrigger_put_StartBoundary(ITimeTrigger* This,BSTR start) {
    return This->lpVtbl->put_StartBoundary(This,start);
}
static FORCEINLINE HRESULT ITimeTrigger_get_EndBoundary(ITimeTrigger* This,BSTR *end) {
    return This->lpVtbl->get_EndBoundary(This,end);
}
static FORCEINLINE HRESULT ITimeTrigger_put_EndBoundary(ITimeTrigger* This,BSTR end) {
    return This->lpVtbl->put_EndBoundary(This,end);
}
static FORCEINLINE HRESULT ITimeTrigger_get_Enabled(ITimeTrigger* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->get_Enabled(This,enabled);
}
static FORCEINLINE HRESULT ITimeTrigger_put_Enabled(ITimeTrigger* This,VARIANT_BOOL enabled) {
    return This->lpVtbl->put_Enabled(This,enabled);
}
/*** ITimeTrigger methods ***/
static FORCEINLINE HRESULT ITimeTrigger_get_RandomDelay(ITimeTrigger* This,BSTR *delay) {
    return This->lpVtbl->get_RandomDelay(This,delay);
}
static FORCEINLINE HRESULT ITimeTrigger_put_RandomDelay(ITimeTrigger* This,BSTR delay) {
    return This->lpVtbl->put_RandomDelay(This,delay);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITimeTrigger_get_RandomDelay_Proxy(
    ITimeTrigger* This,
    BSTR *delay);
void __RPC_STUB ITimeTrigger_get_RandomDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITimeTrigger_put_RandomDelay_Proxy(
    ITimeTrigger* This,
    BSTR delay);
void __RPC_STUB ITimeTrigger_put_RandomDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITimeTrigger_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRepetitionPattern interface
 */
#ifndef __IRepetitionPattern_INTERFACE_DEFINED__
#define __IRepetitionPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRepetitionPattern, 0x7fb9acf1, 0x26be, 0x400e, 0x85,0xb5, 0x29,0x4b,0x9c,0x75,0xdf,0xd6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7fb9acf1-26be-400e-85b5-294b9c75dfd6")
IRepetitionPattern : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Interval(
        BSTR *interval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Interval(
        BSTR interval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Duration(
        BSTR *duration) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Duration(
        BSTR duration) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StopAtDurationEnd(
        VARIANT_BOOL *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_StopAtDurationEnd(
        VARIANT_BOOL sop) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRepetitionPattern, 0x7fb9acf1, 0x26be, 0x400e, 0x85,0xb5, 0x29,0x4b,0x9c,0x75,0xdf,0xd6)
#endif
#else
typedef struct IRepetitionPatternVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRepetitionPattern* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRepetitionPattern* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRepetitionPattern* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IRepetitionPattern* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRepetitionPattern* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IRepetitionPattern* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IRepetitionPattern* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IRepetitionPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Interval)(
        IRepetitionPattern* This,
        BSTR *interval);

    HRESULT (STDMETHODCALLTYPE *put_Interval)(
        IRepetitionPattern* This,
        BSTR interval);

    HRESULT (STDMETHODCALLTYPE *get_Duration)(
        IRepetitionPattern* This,
        BSTR *duration);

    HRESULT (STDMETHODCALLTYPE *put_Duration)(
        IRepetitionPattern* This,
        BSTR duration);

    HRESULT (STDMETHODCALLTYPE *get_StopAtDurationEnd)(
        IRepetitionPattern* This,
        VARIANT_BOOL *stop);

    HRESULT (STDMETHODCALLTYPE *put_StopAtDurationEnd)(
        IRepetitionPattern* This,
        VARIANT_BOOL sop);

    END_INTERFACE
} IRepetitionPatternVtbl;
interface IRepetitionPattern {
    CONST_VTBL IRepetitionPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRepetitionPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRepetitionPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRepetitionPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IRepetitionPattern_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IRepetitionPattern_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IRepetitionPattern_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IRepetitionPattern_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IRepetitionPattern methods ***/
#define IRepetitionPattern_get_Interval(This,interval) (This)->lpVtbl->get_Interval(This,interval)
#define IRepetitionPattern_put_Interval(This,interval) (This)->lpVtbl->put_Interval(This,interval)
#define IRepetitionPattern_get_Duration(This,duration) (This)->lpVtbl->get_Duration(This,duration)
#define IRepetitionPattern_put_Duration(This,duration) (This)->lpVtbl->put_Duration(This,duration)
#define IRepetitionPattern_get_StopAtDurationEnd(This,stop) (This)->lpVtbl->get_StopAtDurationEnd(This,stop)
#define IRepetitionPattern_put_StopAtDurationEnd(This,sop) (This)->lpVtbl->put_StopAtDurationEnd(This,sop)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRepetitionPattern_QueryInterface(IRepetitionPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRepetitionPattern_AddRef(IRepetitionPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRepetitionPattern_Release(IRepetitionPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IRepetitionPattern_GetTypeInfoCount(IRepetitionPattern* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IRepetitionPattern_GetTypeInfo(IRepetitionPattern* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IRepetitionPattern_GetIDsOfNames(IRepetitionPattern* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IRepetitionPattern_Invoke(IRepetitionPattern* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IRepetitionPattern methods ***/
static FORCEINLINE HRESULT IRepetitionPattern_get_Interval(IRepetitionPattern* This,BSTR *interval) {
    return This->lpVtbl->get_Interval(This,interval);
}
static FORCEINLINE HRESULT IRepetitionPattern_put_Interval(IRepetitionPattern* This,BSTR interval) {
    return This->lpVtbl->put_Interval(This,interval);
}
static FORCEINLINE HRESULT IRepetitionPattern_get_Duration(IRepetitionPattern* This,BSTR *duration) {
    return This->lpVtbl->get_Duration(This,duration);
}
static FORCEINLINE HRESULT IRepetitionPattern_put_Duration(IRepetitionPattern* This,BSTR duration) {
    return This->lpVtbl->put_Duration(This,duration);
}
static FORCEINLINE HRESULT IRepetitionPattern_get_StopAtDurationEnd(IRepetitionPattern* This,VARIANT_BOOL *stop) {
    return This->lpVtbl->get_StopAtDurationEnd(This,stop);
}
static FORCEINLINE HRESULT IRepetitionPattern_put_StopAtDurationEnd(IRepetitionPattern* This,VARIANT_BOOL sop) {
    return This->lpVtbl->put_StopAtDurationEnd(This,sop);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IRepetitionPattern_get_Interval_Proxy(
    IRepetitionPattern* This,
    BSTR *interval);
void __RPC_STUB IRepetitionPattern_get_Interval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRepetitionPattern_put_Interval_Proxy(
    IRepetitionPattern* This,
    BSTR interval);
void __RPC_STUB IRepetitionPattern_put_Interval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRepetitionPattern_get_Duration_Proxy(
    IRepetitionPattern* This,
    BSTR *duration);
void __RPC_STUB IRepetitionPattern_get_Duration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRepetitionPattern_put_Duration_Proxy(
    IRepetitionPattern* This,
    BSTR duration);
void __RPC_STUB IRepetitionPattern_put_Duration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRepetitionPattern_get_StopAtDurationEnd_Proxy(
    IRepetitionPattern* This,
    VARIANT_BOOL *stop);
void __RPC_STUB IRepetitionPattern_get_StopAtDurationEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRepetitionPattern_put_StopAtDurationEnd_Proxy(
    IRepetitionPattern* This,
    VARIANT_BOOL sop);
void __RPC_STUB IRepetitionPattern_put_StopAtDurationEnd_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IRepetitionPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAction interface
 */
#ifndef __IAction_INTERFACE_DEFINED__
#define __IAction_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAction, 0xbae54997, 0x48b1, 0x4cbe, 0x99,0x65, 0xd6,0xbe,0x26,0x3e,0xbe,0xa4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bae54997-48b1-4cbe-9965-d6be263ebea4")
IAction : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Id(
        BSTR *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Id(
        BSTR id) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Type(
        TASK_ACTION_TYPE *type) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAction, 0xbae54997, 0x48b1, 0x4cbe, 0x99,0x65, 0xd6,0xbe,0x26,0x3e,0xbe,0xa4)
#endif
#else
typedef struct IActionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAction* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAction* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAction* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IAction* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IAction* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IAction* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IAction* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IAction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IAction* This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *put_Id)(
        IAction* This,
        BSTR id);

    HRESULT (STDMETHODCALLTYPE *get_Type)(
        IAction* This,
        TASK_ACTION_TYPE *type);

    END_INTERFACE
} IActionVtbl;
interface IAction {
    CONST_VTBL IActionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAction_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IAction_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IAction_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IAction_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IAction_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IAction methods ***/
#define IAction_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IAction_put_Id(This,id) (This)->lpVtbl->put_Id(This,id)
#define IAction_get_Type(This,type) (This)->lpVtbl->get_Type(This,type)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAction_QueryInterface(IAction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAction_AddRef(IAction* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAction_Release(IAction* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IAction_GetTypeInfoCount(IAction* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IAction_GetTypeInfo(IAction* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IAction_GetIDsOfNames(IAction* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IAction_Invoke(IAction* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IAction methods ***/
static FORCEINLINE HRESULT IAction_get_Id(IAction* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static FORCEINLINE HRESULT IAction_put_Id(IAction* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
static FORCEINLINE HRESULT IAction_get_Type(IAction* This,TASK_ACTION_TYPE *type) {
    return This->lpVtbl->get_Type(This,type);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IAction_get_Id_Proxy(
    IAction* This,
    BSTR *id);
void __RPC_STUB IAction_get_Id_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAction_put_Id_Proxy(
    IAction* This,
    BSTR id);
void __RPC_STUB IAction_put_Id_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAction_get_Type_Proxy(
    IAction* This,
    TASK_ACTION_TYPE *type);
void __RPC_STUB IAction_get_Type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAction_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IActionCollection interface
 */
#ifndef __IActionCollection_INTERFACE_DEFINED__
#define __IActionCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IActionCollection, 0x02820e19, 0x7b98, 0x4ed2, 0xb2,0xe8, 0xfd,0xcc,0xce,0xff,0x61,0x9b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("02820e19-7b98-4ed2-b2e8-fdccceff619b")
IActionCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG index,
        IAction **action) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **penum) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_XmlText(
        BSTR *xml) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_XmlText(
        BSTR xml) = 0;

    virtual HRESULT STDMETHODCALLTYPE Create(
        TASK_ACTION_TYPE Type,
        IAction **action) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        VARIANT index) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Context(
        BSTR *ctx) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Context(
        BSTR ctx) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActionCollection, 0x02820e19, 0x7b98, 0x4ed2, 0xb2,0xe8, 0xfd,0xcc,0xce,0xff,0x61,0x9b)
#endif
#else
typedef struct IActionCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IActionCollection* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IActionCollection* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IActionCollection* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IActionCollection* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IActionCollection* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IActionCollection* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IActionCollection* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IActionCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IActionCollection* This,
        LONG *count);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IActionCollection* This,
        LONG index,
        IAction **action);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IActionCollection* This,
        IUnknown **penum);

    HRESULT (STDMETHODCALLTYPE *get_XmlText)(
        IActionCollection* This,
        BSTR *xml);

    HRESULT (STDMETHODCALLTYPE *put_XmlText)(
        IActionCollection* This,
        BSTR xml);

    HRESULT (STDMETHODCALLTYPE *Create)(
        IActionCollection* This,
        TASK_ACTION_TYPE Type,
        IAction **action);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IActionCollection* This,
        VARIANT index);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        IActionCollection* This);

    HRESULT (STDMETHODCALLTYPE *get_Context)(
        IActionCollection* This,
        BSTR *ctx);

    HRESULT (STDMETHODCALLTYPE *put_Context)(
        IActionCollection* This,
        BSTR ctx);

    END_INTERFACE
} IActionCollectionVtbl;
interface IActionCollection {
    CONST_VTBL IActionCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActionCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActionCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActionCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IActionCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IActionCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IActionCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IActionCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IActionCollection methods ***/
#define IActionCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
#define IActionCollection_get_Item(This,index,action) (This)->lpVtbl->get_Item(This,index,action)
#define IActionCollection_get__NewEnum(This,penum) (This)->lpVtbl->get__NewEnum(This,penum)
#define IActionCollection_get_XmlText(This,xml) (This)->lpVtbl->get_XmlText(This,xml)
#define IActionCollection_put_XmlText(This,xml) (This)->lpVtbl->put_XmlText(This,xml)
#define IActionCollection_Create(This,Type,action) (This)->lpVtbl->Create(This,Type,action)
#define IActionCollection_Remove(This,index) (This)->lpVtbl->Remove(This,index)
#define IActionCollection_Clear(This) (This)->lpVtbl->Clear(This)
#define IActionCollection_get_Context(This,ctx) (This)->lpVtbl->get_Context(This,ctx)
#define IActionCollection_put_Context(This,ctx) (This)->lpVtbl->put_Context(This,ctx)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActionCollection_QueryInterface(IActionCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActionCollection_AddRef(IActionCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActionCollection_Release(IActionCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IActionCollection_GetTypeInfoCount(IActionCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IActionCollection_GetTypeInfo(IActionCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IActionCollection_GetIDsOfNames(IActionCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IActionCollection_Invoke(IActionCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IActionCollection methods ***/
static FORCEINLINE HRESULT IActionCollection_get_Count(IActionCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static FORCEINLINE HRESULT IActionCollection_get_Item(IActionCollection* This,LONG index,IAction **action) {
    return This->lpVtbl->get_Item(This,index,action);
}
static FORCEINLINE HRESULT IActionCollection_get__NewEnum(IActionCollection* This,IUnknown **penum) {
    return This->lpVtbl->get__NewEnum(This,penum);
}
static FORCEINLINE HRESULT IActionCollection_get_XmlText(IActionCollection* This,BSTR *xml) {
    return This->lpVtbl->get_XmlText(This,xml);
}
static FORCEINLINE HRESULT IActionCollection_put_XmlText(IActionCollection* This,BSTR xml) {
    return This->lpVtbl->put_XmlText(This,xml);
}
static FORCEINLINE HRESULT IActionCollection_Create(IActionCollection* This,TASK_ACTION_TYPE Type,IAction **action) {
    return This->lpVtbl->Create(This,Type,action);
}
static FORCEINLINE HRESULT IActionCollection_Remove(IActionCollection* This,VARIANT index) {
    return This->lpVtbl->Remove(This,index);
}
static FORCEINLINE HRESULT IActionCollection_Clear(IActionCollection* This) {
    return This->lpVtbl->Clear(This);
}
static FORCEINLINE HRESULT IActionCollection_get_Context(IActionCollection* This,BSTR *ctx) {
    return This->lpVtbl->get_Context(This,ctx);
}
static FORCEINLINE HRESULT IActionCollection_put_Context(IActionCollection* This,BSTR ctx) {
    return This->lpVtbl->put_Context(This,ctx);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IActionCollection_get_Count_Proxy(
    IActionCollection* This,
    LONG *count);
void __RPC_STUB IActionCollection_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IActionCollection_get_Item_Proxy(
    IActionCollection* This,
    LONG index,
    IAction **action);
void __RPC_STUB IActionCollection_get_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IActionCollection_get__NewEnum_Proxy(
    IActionCollection* This,
    IUnknown **penum);
void __RPC_STUB IActionCollection_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IActionCollection_get_XmlText_Proxy(
    IActionCollection* This,
    BSTR *xml);
void __RPC_STUB IActionCollection_get_XmlText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IActionCollection_put_XmlText_Proxy(
    IActionCollection* This,
    BSTR xml);
void __RPC_STUB IActionCollection_put_XmlText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IActionCollection_Create_Proxy(
    IActionCollection* This,
    TASK_ACTION_TYPE Type,
    IAction **action);
void __RPC_STUB IActionCollection_Create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IActionCollection_Remove_Proxy(
    IActionCollection* This,
    VARIANT index);
void __RPC_STUB IActionCollection_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IActionCollection_Clear_Proxy(
    IActionCollection* This);
void __RPC_STUB IActionCollection_Clear_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IActionCollection_get_Context_Proxy(
    IActionCollection* This,
    BSTR *ctx);
void __RPC_STUB IActionCollection_get_Context_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IActionCollection_put_Context_Proxy(
    IActionCollection* This,
    BSTR ctx);
void __RPC_STUB IActionCollection_put_Context_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IActionCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IExecAction interface
 */
#ifndef __IExecAction_INTERFACE_DEFINED__
#define __IExecAction_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExecAction, 0x4c3d624d, 0xfd6b, 0x49a3, 0xb9,0xb7, 0x09,0xcb,0x3c,0xd3,0xf0,0x47);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4c3d624d-fd6b-49a3-b9b7-09cb3cd3f047")
IExecAction : public IAction
{
    virtual HRESULT STDMETHODCALLTYPE get_Path(
        BSTR *path) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Path(
        BSTR path) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Arguments(
        BSTR *argument) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Arguments(
        BSTR argument) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_WorkingDirectory(
        BSTR *directory) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_WorkingDirectory(
        BSTR directory) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExecAction, 0x4c3d624d, 0xfd6b, 0x49a3, 0xb9,0xb7, 0x09,0xcb,0x3c,0xd3,0xf0,0x47)
#endif
#else
typedef struct IExecActionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IExecAction* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IExecAction* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IExecAction* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IExecAction* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IExecAction* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IExecAction* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IExecAction* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IAction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IExecAction* This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *put_Id)(
        IExecAction* This,
        BSTR id);

    HRESULT (STDMETHODCALLTYPE *get_Type)(
        IExecAction* This,
        TASK_ACTION_TYPE *type);

    /*** IExecAction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IExecAction* This,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *put_Path)(
        IExecAction* This,
        BSTR path);

    HRESULT (STDMETHODCALLTYPE *get_Arguments)(
        IExecAction* This,
        BSTR *argument);

    HRESULT (STDMETHODCALLTYPE *put_Arguments)(
        IExecAction* This,
        BSTR argument);

    HRESULT (STDMETHODCALLTYPE *get_WorkingDirectory)(
        IExecAction* This,
        BSTR *directory);

    HRESULT (STDMETHODCALLTYPE *put_WorkingDirectory)(
        IExecAction* This,
        BSTR directory);

    END_INTERFACE
} IExecActionVtbl;
interface IExecAction {
    CONST_VTBL IExecActionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExecAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExecAction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExecAction_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IExecAction_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IExecAction_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IExecAction_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IExecAction_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IAction methods ***/
#define IExecAction_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IExecAction_put_Id(This,id) (This)->lpVtbl->put_Id(This,id)
#define IExecAction_get_Type(This,type) (This)->lpVtbl->get_Type(This,type)
/*** IExecAction methods ***/
#define IExecAction_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
#define IExecAction_put_Path(This,path) (This)->lpVtbl->put_Path(This,path)
#define IExecAction_get_Arguments(This,argument) (This)->lpVtbl->get_Arguments(This,argument)
#define IExecAction_put_Arguments(This,argument) (This)->lpVtbl->put_Arguments(This,argument)
#define IExecAction_get_WorkingDirectory(This,directory) (This)->lpVtbl->get_WorkingDirectory(This,directory)
#define IExecAction_put_WorkingDirectory(This,directory) (This)->lpVtbl->put_WorkingDirectory(This,directory)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IExecAction_QueryInterface(IExecAction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IExecAction_AddRef(IExecAction* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IExecAction_Release(IExecAction* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IExecAction_GetTypeInfoCount(IExecAction* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IExecAction_GetTypeInfo(IExecAction* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IExecAction_GetIDsOfNames(IExecAction* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IExecAction_Invoke(IExecAction* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IAction methods ***/
static FORCEINLINE HRESULT IExecAction_get_Id(IExecAction* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static FORCEINLINE HRESULT IExecAction_put_Id(IExecAction* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
static FORCEINLINE HRESULT IExecAction_get_Type(IExecAction* This,TASK_ACTION_TYPE *type) {
    return This->lpVtbl->get_Type(This,type);
}
/*** IExecAction methods ***/
static FORCEINLINE HRESULT IExecAction_get_Path(IExecAction* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static FORCEINLINE HRESULT IExecAction_put_Path(IExecAction* This,BSTR path) {
    return This->lpVtbl->put_Path(This,path);
}
static FORCEINLINE HRESULT IExecAction_get_Arguments(IExecAction* This,BSTR *argument) {
    return This->lpVtbl->get_Arguments(This,argument);
}
static FORCEINLINE HRESULT IExecAction_put_Arguments(IExecAction* This,BSTR argument) {
    return This->lpVtbl->put_Arguments(This,argument);
}
static FORCEINLINE HRESULT IExecAction_get_WorkingDirectory(IExecAction* This,BSTR *directory) {
    return This->lpVtbl->get_WorkingDirectory(This,directory);
}
static FORCEINLINE HRESULT IExecAction_put_WorkingDirectory(IExecAction* This,BSTR directory) {
    return This->lpVtbl->put_WorkingDirectory(This,directory);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IExecAction_get_Path_Proxy(
    IExecAction* This,
    BSTR *path);
void __RPC_STUB IExecAction_get_Path_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IExecAction_put_Path_Proxy(
    IExecAction* This,
    BSTR path);
void __RPC_STUB IExecAction_put_Path_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IExecAction_get_Arguments_Proxy(
    IExecAction* This,
    BSTR *argument);
void __RPC_STUB IExecAction_get_Arguments_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IExecAction_put_Arguments_Proxy(
    IExecAction* This,
    BSTR argument);
void __RPC_STUB IExecAction_put_Arguments_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IExecAction_get_WorkingDirectory_Proxy(
    IExecAction* This,
    BSTR *directory);
void __RPC_STUB IExecAction_get_WorkingDirectory_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IExecAction_put_WorkingDirectory_Proxy(
    IExecAction* This,
    BSTR directory);
void __RPC_STUB IExecAction_put_WorkingDirectory_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IExecAction_INTERFACE_DEFINED__ */

/*****************************************************************************
 * INetworkSettings interface
 */
#ifndef __INetworkSettings_INTERFACE_DEFINED__
#define __INetworkSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetworkSettings, 0x9f7dea84, 0xc30b, 0x4245, 0x80,0xb6, 0x00,0xe9,0xf6,0x46,0xf1,0xb4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9f7dea84-c30b-4245-80b6-00e9f646f1b4")
INetworkSettings : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Name(
        BSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Id(
        BSTR *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Id(
        BSTR id) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INetworkSettings, 0x9f7dea84, 0xc30b, 0x4245, 0x80,0xb6, 0x00,0xe9,0xf6,0x46,0xf1,0xb4)
#endif
#else
typedef struct INetworkSettingsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INetworkSettings* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INetworkSettings* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INetworkSettings* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        INetworkSettings* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        INetworkSettings* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        INetworkSettings* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        INetworkSettings* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** INetworkSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        INetworkSettings* This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *put_Name)(
        INetworkSettings* This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        INetworkSettings* This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *put_Id)(
        INetworkSettings* This,
        BSTR id);

    END_INTERFACE
} INetworkSettingsVtbl;
interface INetworkSettings {
    CONST_VTBL INetworkSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetworkSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetworkSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetworkSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define INetworkSettings_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define INetworkSettings_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define INetworkSettings_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define INetworkSettings_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** INetworkSettings methods ***/
#define INetworkSettings_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
#define INetworkSettings_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
#define INetworkSettings_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define INetworkSettings_put_Id(This,id) (This)->lpVtbl->put_Id(This,id)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetworkSettings_QueryInterface(INetworkSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetworkSettings_AddRef(INetworkSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetworkSettings_Release(INetworkSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT INetworkSettings_GetTypeInfoCount(INetworkSettings* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT INetworkSettings_GetTypeInfo(INetworkSettings* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT INetworkSettings_GetIDsOfNames(INetworkSettings* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT INetworkSettings_Invoke(INetworkSettings* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** INetworkSettings methods ***/
static FORCEINLINE HRESULT INetworkSettings_get_Name(INetworkSettings* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static FORCEINLINE HRESULT INetworkSettings_put_Name(INetworkSettings* This,BSTR name) {
    return This->lpVtbl->put_Name(This,name);
}
static FORCEINLINE HRESULT INetworkSettings_get_Id(INetworkSettings* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static FORCEINLINE HRESULT INetworkSettings_put_Id(INetworkSettings* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE INetworkSettings_get_Name_Proxy(
    INetworkSettings* This,
    BSTR *name);
void __RPC_STUB INetworkSettings_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE INetworkSettings_put_Name_Proxy(
    INetworkSettings* This,
    BSTR name);
void __RPC_STUB INetworkSettings_put_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE INetworkSettings_get_Id_Proxy(
    INetworkSettings* This,
    BSTR *id);
void __RPC_STUB INetworkSettings_get_Id_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE INetworkSettings_put_Id_Proxy(
    INetworkSettings* This,
    BSTR id);
void __RPC_STUB INetworkSettings_put_Id_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __INetworkSettings_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPrincipal interface
 */
#ifndef __IPrincipal_INTERFACE_DEFINED__
#define __IPrincipal_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPrincipal, 0xd98d51e5, 0xc9b4, 0x496a, 0xa9,0xc1, 0x18,0x98,0x02,0x61,0xcf,0x0f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d98d51e5-c9b4-496a-a9c1-18980261cf0f")
IPrincipal : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Id(
        BSTR *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Id(
        BSTR id) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DisplayName(
        BSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UserId(
        BSTR *user) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_UserId(
        BSTR user) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LogonType(
        TASK_LOGON_TYPE *logon) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_LogonType(
        TASK_LOGON_TYPE logon) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_GroupId(
        BSTR *group) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_GroupId(
        BSTR group) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RunLevel(
        TASK_RUNLEVEL_TYPE *level) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RunLevel(
        TASK_RUNLEVEL_TYPE level) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPrincipal, 0xd98d51e5, 0xc9b4, 0x496a, 0xa9,0xc1, 0x18,0x98,0x02,0x61,0xcf,0x0f)
#endif
#else
typedef struct IPrincipalVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPrincipal* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPrincipal* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPrincipal* This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IPrincipal* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IPrincipal* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IPrincipal* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IPrincipal* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IPrincipal methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IPrincipal* This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *put_Id)(
        IPrincipal* This,
        BSTR id);

    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        IPrincipal* This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *put_DisplayName)(
        IPrincipal* This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *get_UserId)(
        IPrincipal* This,
        BSTR *user);

    HRESULT (STDMETHODCALLTYPE *put_UserId)(
        IPrincipal* This,
        BSTR user);

    HRESULT (STDMETHODCALLTYPE *get_LogonType)(
        IPrincipal* This,
        TASK_LOGON_TYPE *logon);

    HRESULT (STDMETHODCALLTYPE *put_LogonType)(
        IPrincipal* This,
        TASK_LOGON_TYPE logon);

    HRESULT (STDMETHODCALLTYPE *get_GroupId)(
        IPrincipal* This,
        BSTR *group);

    HRESULT (STDMETHODCALLTYPE *put_GroupId)(
        IPrincipal* This,
        BSTR group);

    HRESULT (STDMETHODCALLTYPE *get_RunLevel)(
        IPrincipal* This,
        TASK_RUNLEVEL_TYPE *level);

    HRESULT (STDMETHODCALLTYPE *put_RunLevel)(
        IPrincipal* This,
        TASK_RUNLEVEL_TYPE level);

    END_INTERFACE
} IPrincipalVtbl;
interface IPrincipal {
    CONST_VTBL IPrincipalVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPrincipal_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPrincipal_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPrincipal_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IPrincipal_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IPrincipal_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IPrincipal_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IPrincipal_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IPrincipal methods ***/
#define IPrincipal_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IPrincipal_put_Id(This,id) (This)->lpVtbl->put_Id(This,id)
#define IPrincipal_get_DisplayName(This,name) (This)->lpVtbl->get_DisplayName(This,name)
#define IPrincipal_put_DisplayName(This,name) (This)->lpVtbl->put_DisplayName(This,name)
#define IPrincipal_get_UserId(This,user) (This)->lpVtbl->get_UserId(This,user)
#define IPrincipal_put_UserId(This,user) (This)->lpVtbl->put_UserId(This,user)
#define IPrincipal_get_LogonType(This,logon) (This)->lpVtbl->get_LogonType(This,logon)
#define IPrincipal_put_LogonType(This,logon) (This)->lpVtbl->put_LogonType(This,logon)
#define IPrincipal_get_GroupId(This,group) (This)->lpVtbl->get_GroupId(This,group)
#define IPrincipal_put_GroupId(This,group) (This)->lpVtbl->put_GroupId(This,group)
#define IPrincipal_get_RunLevel(This,level) (This)->lpVtbl->get_RunLevel(This,level)
#define IPrincipal_put_RunLevel(This,level) (This)->lpVtbl->put_RunLevel(This,level)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPrincipal_QueryInterface(IPrincipal* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPrincipal_AddRef(IPrincipal* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPrincipal_Release(IPrincipal* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IPrincipal_GetTypeInfoCount(IPrincipal* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IPrincipal_GetTypeInfo(IPrincipal* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IPrincipal_GetIDsOfNames(IPrincipal* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IPrincipal_Invoke(IPrincipal* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IPrincipal methods ***/
static FORCEINLINE HRESULT IPrincipal_get_Id(IPrincipal* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static FORCEINLINE HRESULT IPrincipal_put_Id(IPrincipal* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
static FORCEINLINE HRESULT IPrincipal_get_DisplayName(IPrincipal* This,BSTR *name) {
    return This->lpVtbl->get_DisplayName(This,name);
}
static FORCEINLINE HRESULT IPrincipal_put_DisplayName(IPrincipal* This,BSTR name) {
    return This->lpVtbl->put_DisplayName(This,name);
}
static FORCEINLINE HRESULT IPrincipal_get_UserId(IPrincipal* This,BSTR *user) {
    return This->lpVtbl->get_UserId(This,user);
}
static FORCEINLINE HRESULT IPrincipal_put_UserId(IPrincipal* This,BSTR user) {
    return This->lpVtbl->put_UserId(This,user);
}
static FORCEINLINE HRESULT IPrincipal_get_LogonType(IPrincipal* This,TASK_LOGON_TYPE *logon) {
    return This->lpVtbl->get_LogonType(This,logon);
}
static FORCEINLINE HRESULT IPrincipal_put_LogonType(IPrincipal* This,TASK_LOGON_TYPE logon) {
    return This->lpVtbl->put_LogonType(This,logon);
}
static FORCEINLINE HRESULT IPrincipal_get_GroupId(IPrincipal* This,BSTR *group) {
    return This->lpVtbl->get_GroupId(This,group);
}
static FORCEINLINE HRESULT IPrincipal_put_GroupId(IPrincipal* This,BSTR group) {
    return This->lpVtbl->put_GroupId(This,group);
}
static FORCEINLINE HRESULT IPrincipal_get_RunLevel(IPrincipal* This,TASK_RUNLEVEL_TYPE *level) {
    return This->lpVtbl->get_RunLevel(This,level);
}
static FORCEINLINE HRESULT IPrincipal_put_RunLevel(IPrincipal* This,TASK_RUNLEVEL_TYPE level) {
    return This->lpVtbl->put_RunLevel(This,level);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IPrincipal_get_Id_Proxy(
    IPrincipal* This,
    BSTR *id);
void __RPC_STUB IPrincipal_get_Id_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrincipal_put_Id_Proxy(
    IPrincipal* This,
    BSTR id);
void __RPC_STUB IPrincipal_put_Id_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrincipal_get_DisplayName_Proxy(
    IPrincipal* This,
    BSTR *name);
void __RPC_STUB IPrincipal_get_DisplayName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrincipal_put_DisplayName_Proxy(
    IPrincipal* This,
    BSTR name);
void __RPC_STUB IPrincipal_put_DisplayName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrincipal_get_UserId_Proxy(
    IPrincipal* This,
    BSTR *user);
void __RPC_STUB IPrincipal_get_UserId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrincipal_put_UserId_Proxy(
    IPrincipal* This,
    BSTR user);
void __RPC_STUB IPrincipal_put_UserId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrincipal_get_LogonType_Proxy(
    IPrincipal* This,
    TASK_LOGON_TYPE *logon);
void __RPC_STUB IPrincipal_get_LogonType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrincipal_put_LogonType_Proxy(
    IPrincipal* This,
    TASK_LOGON_TYPE logon);
void __RPC_STUB IPrincipal_put_LogonType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrincipal_get_GroupId_Proxy(
    IPrincipal* This,
    BSTR *group);
void __RPC_STUB IPrincipal_get_GroupId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrincipal_put_GroupId_Proxy(
    IPrincipal* This,
    BSTR group);
void __RPC_STUB IPrincipal_put_GroupId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrincipal_get_RunLevel_Proxy(
    IPrincipal* This,
    TASK_RUNLEVEL_TYPE *level);
void __RPC_STUB IPrincipal_get_RunLevel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPrincipal_put_RunLevel_Proxy(
    IPrincipal* This,
    TASK_RUNLEVEL_TYPE level);
void __RPC_STUB IPrincipal_put_RunLevel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IPrincipal_INTERFACE_DEFINED__ */

/*****************************************************************************
 * TaskScheduler coclass
 */

DEFINE_GUID(CLSID_TaskScheduler, 0x0f87369f, 0xa4e5, 0x4cfc, 0xbd,0x3e, 0x73,0xe6,0x15,0x45,0x72,0xdd);

#ifdef __cplusplus
class DECLSPEC_UUID("0f87369f-a4e5-4cfc-bd3e-73e6154572dd") TaskScheduler;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(TaskScheduler, 0x0f87369f, 0xa4e5, 0x4cfc, 0xbd,0x3e, 0x73,0xe6,0x15,0x45,0x72,0xdd)
#endif
#endif

/* Begin additional prototypes for all interfaces */

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

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __taskschd_h__ */
