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

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

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

#ifndef __taskschd_h__
#define __taskschd_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __ITaskService_FWD_DEFINED__
#define __ITaskService_FWD_DEFINED__
typedef interface ITaskService ITaskService;
#ifdef __cplusplus
interface ITaskService;
#endif /* __cplusplus */
#endif

#ifndef __IRegisteredTask_FWD_DEFINED__
#define __IRegisteredTask_FWD_DEFINED__
typedef interface IRegisteredTask IRegisteredTask;
#ifdef __cplusplus
interface IRegisteredTask;
#endif /* __cplusplus */
#endif

#ifndef __IRegisteredTaskCollection_FWD_DEFINED__
#define __IRegisteredTaskCollection_FWD_DEFINED__
typedef interface IRegisteredTaskCollection IRegisteredTaskCollection;
#ifdef __cplusplus
interface IRegisteredTaskCollection;
#endif /* __cplusplus */
#endif

#ifndef __IRegistrationInfo_FWD_DEFINED__
#define __IRegistrationInfo_FWD_DEFINED__
typedef interface IRegistrationInfo IRegistrationInfo;
#ifdef __cplusplus
interface IRegistrationInfo;
#endif /* __cplusplus */
#endif

#ifndef __ITaskFolder_FWD_DEFINED__
#define __ITaskFolder_FWD_DEFINED__
typedef interface ITaskFolder ITaskFolder;
#ifdef __cplusplus
interface ITaskFolder;
#endif /* __cplusplus */
#endif

#ifndef __ITaskFolderCollection_FWD_DEFINED__
#define __ITaskFolderCollection_FWD_DEFINED__
typedef interface ITaskFolderCollection ITaskFolderCollection;
#ifdef __cplusplus
interface ITaskFolderCollection;
#endif /* __cplusplus */
#endif

#ifndef __ITaskDefinition_FWD_DEFINED__
#define __ITaskDefinition_FWD_DEFINED__
typedef interface ITaskDefinition ITaskDefinition;
#ifdef __cplusplus
interface ITaskDefinition;
#endif /* __cplusplus */
#endif

#ifndef __ITaskSettings_FWD_DEFINED__
#define __ITaskSettings_FWD_DEFINED__
typedef interface ITaskSettings ITaskSettings;
#ifdef __cplusplus
interface ITaskSettings;
#endif /* __cplusplus */
#endif

#ifndef __IIdleSettings_FWD_DEFINED__
#define __IIdleSettings_FWD_DEFINED__
typedef interface IIdleSettings IIdleSettings;
#ifdef __cplusplus
interface IIdleSettings;
#endif /* __cplusplus */
#endif

#ifndef __IRunningTask_FWD_DEFINED__
#define __IRunningTask_FWD_DEFINED__
typedef interface IRunningTask IRunningTask;
#ifdef __cplusplus
interface IRunningTask;
#endif /* __cplusplus */
#endif

#ifndef __IRunningTaskCollection_FWD_DEFINED__
#define __IRunningTaskCollection_FWD_DEFINED__
typedef interface IRunningTaskCollection IRunningTaskCollection;
#ifdef __cplusplus
interface IRunningTaskCollection;
#endif /* __cplusplus */
#endif

#ifndef __ITrigger_FWD_DEFINED__
#define __ITrigger_FWD_DEFINED__
typedef interface ITrigger ITrigger;
#ifdef __cplusplus
interface ITrigger;
#endif /* __cplusplus */
#endif

#ifndef __IDailyTrigger_FWD_DEFINED__
#define __IDailyTrigger_FWD_DEFINED__
typedef interface IDailyTrigger IDailyTrigger;
#ifdef __cplusplus
interface IDailyTrigger;
#endif /* __cplusplus */
#endif

#ifndef __ITriggerCollection_FWD_DEFINED__
#define __ITriggerCollection_FWD_DEFINED__
typedef interface ITriggerCollection ITriggerCollection;
#ifdef __cplusplus
interface ITriggerCollection;
#endif /* __cplusplus */
#endif

#ifndef __ITimeTrigger_FWD_DEFINED__
#define __ITimeTrigger_FWD_DEFINED__
typedef interface ITimeTrigger ITimeTrigger;
#ifdef __cplusplus
interface ITimeTrigger;
#endif /* __cplusplus */
#endif

#ifndef __IRepetitionPattern_FWD_DEFINED__
#define __IRepetitionPattern_FWD_DEFINED__
typedef interface IRepetitionPattern IRepetitionPattern;
#ifdef __cplusplus
interface IRepetitionPattern;
#endif /* __cplusplus */
#endif

#ifndef __IAction_FWD_DEFINED__
#define __IAction_FWD_DEFINED__
typedef interface IAction IAction;
#ifdef __cplusplus
interface IAction;
#endif /* __cplusplus */
#endif

#ifndef __IActionCollection_FWD_DEFINED__
#define __IActionCollection_FWD_DEFINED__
typedef interface IActionCollection IActionCollection;
#ifdef __cplusplus
interface IActionCollection;
#endif /* __cplusplus */
#endif

#ifndef __IExecAction_FWD_DEFINED__
#define __IExecAction_FWD_DEFINED__
typedef interface IExecAction IExecAction;
#ifdef __cplusplus
interface IExecAction;
#endif /* __cplusplus */
#endif

#ifndef __INetworkSettings_FWD_DEFINED__
#define __INetworkSettings_FWD_DEFINED__
typedef interface INetworkSettings INetworkSettings;
#ifdef __cplusplus
interface INetworkSettings;
#endif /* __cplusplus */
#endif

#ifndef __IPrincipal_FWD_DEFINED__
#define __IPrincipal_FWD_DEFINED__
typedef interface IPrincipal IPrincipal;
#ifdef __cplusplus
interface IPrincipal;
#endif /* __cplusplus */
#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

#ifndef __TaskScheduler_LIBRARY_DEFINED__
#define __TaskScheduler_LIBRARY_DEFINED__

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;
#ifdef __cplusplus
interface ITaskService;
#endif /* __cplusplus */
#endif

#ifndef __IRegisteredTask_FWD_DEFINED__
#define __IRegisteredTask_FWD_DEFINED__
typedef interface IRegisteredTask IRegisteredTask;
#ifdef __cplusplus
interface IRegisteredTask;
#endif /* __cplusplus */
#endif

#ifndef __IRegisteredTaskCollection_FWD_DEFINED__
#define __IRegisteredTaskCollection_FWD_DEFINED__
typedef interface IRegisteredTaskCollection IRegisteredTaskCollection;
#ifdef __cplusplus
interface IRegisteredTaskCollection;
#endif /* __cplusplus */
#endif

#ifndef __IRegistrationInfo_FWD_DEFINED__
#define __IRegistrationInfo_FWD_DEFINED__
typedef interface IRegistrationInfo IRegistrationInfo;
#ifdef __cplusplus
interface IRegistrationInfo;
#endif /* __cplusplus */
#endif

#ifndef __ITaskFolder_FWD_DEFINED__
#define __ITaskFolder_FWD_DEFINED__
typedef interface ITaskFolder ITaskFolder;
#ifdef __cplusplus
interface ITaskFolder;
#endif /* __cplusplus */
#endif

#ifndef __ITaskFolderCollection_FWD_DEFINED__
#define __ITaskFolderCollection_FWD_DEFINED__
typedef interface ITaskFolderCollection ITaskFolderCollection;
#ifdef __cplusplus
interface ITaskFolderCollection;
#endif /* __cplusplus */
#endif

#ifndef __ITaskDefinition_FWD_DEFINED__
#define __ITaskDefinition_FWD_DEFINED__
typedef interface ITaskDefinition ITaskDefinition;
#ifdef __cplusplus
interface ITaskDefinition;
#endif /* __cplusplus */
#endif

#ifndef __ITaskSettings_FWD_DEFINED__
#define __ITaskSettings_FWD_DEFINED__
typedef interface ITaskSettings ITaskSettings;
#ifdef __cplusplus
interface ITaskSettings;
#endif /* __cplusplus */
#endif

#ifndef __IIdleSettings_FWD_DEFINED__
#define __IIdleSettings_FWD_DEFINED__
typedef interface IIdleSettings IIdleSettings;
#ifdef __cplusplus
interface IIdleSettings;
#endif /* __cplusplus */
#endif

#ifndef __IRunningTask_FWD_DEFINED__
#define __IRunningTask_FWD_DEFINED__
typedef interface IRunningTask IRunningTask;
#ifdef __cplusplus
interface IRunningTask;
#endif /* __cplusplus */
#endif

#ifndef __IRunningTaskCollection_FWD_DEFINED__
#define __IRunningTaskCollection_FWD_DEFINED__
typedef interface IRunningTaskCollection IRunningTaskCollection;
#ifdef __cplusplus
interface IRunningTaskCollection;
#endif /* __cplusplus */
#endif

#ifndef __ITrigger_FWD_DEFINED__
#define __ITrigger_FWD_DEFINED__
typedef interface ITrigger ITrigger;
#ifdef __cplusplus
interface ITrigger;
#endif /* __cplusplus */
#endif

#ifndef __ITriggerCollection_FWD_DEFINED__
#define __ITriggerCollection_FWD_DEFINED__
typedef interface ITriggerCollection ITriggerCollection;
#ifdef __cplusplus
interface ITriggerCollection;
#endif /* __cplusplus */
#endif

#ifndef __ITimeTrigger_FWD_DEFINED__
#define __ITimeTrigger_FWD_DEFINED__
typedef interface ITimeTrigger ITimeTrigger;
#ifdef __cplusplus
interface ITimeTrigger;
#endif /* __cplusplus */
#endif

#ifndef __IRepetitionPattern_FWD_DEFINED__
#define __IRepetitionPattern_FWD_DEFINED__
typedef interface IRepetitionPattern IRepetitionPattern;
#ifdef __cplusplus
interface IRepetitionPattern;
#endif /* __cplusplus */
#endif

#ifndef __IAction_FWD_DEFINED__
#define __IAction_FWD_DEFINED__
typedef interface IAction IAction;
#ifdef __cplusplus
interface IAction;
#endif /* __cplusplus */
#endif

#ifndef __IActionCollection_FWD_DEFINED__
#define __IActionCollection_FWD_DEFINED__
typedef interface IActionCollection IActionCollection;
#ifdef __cplusplus
interface IActionCollection;
#endif /* __cplusplus */
#endif

#ifndef __IExecAction_FWD_DEFINED__
#define __IExecAction_FWD_DEFINED__
typedef interface IExecAction IExecAction;
#ifdef __cplusplus
interface IExecAction;
#endif /* __cplusplus */
#endif

#ifndef __INetworkSettings_FWD_DEFINED__
#define __INetworkSettings_FWD_DEFINED__
typedef interface INetworkSettings INetworkSettings;
#ifdef __cplusplus
interface INetworkSettings;
#endif /* __cplusplus */
#endif

#ifndef __IPrincipal_FWD_DEFINED__
#define __IPrincipal_FWD_DEFINED__
typedef interface IPrincipal IPrincipal;
#ifdef __cplusplus
interface IPrincipal;
#endif /* __cplusplus */
#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 __WIDL_INLINE HRESULT ITaskService_QueryInterface(ITaskService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITaskService_AddRef(ITaskService* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITaskService_Release(ITaskService* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITaskService_GetTypeInfoCount(ITaskService* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITaskService_GetTypeInfo(ITaskService* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITaskService_GetFolder(ITaskService* This,BSTR path,ITaskFolder **folder) {
    return This->lpVtbl->GetFolder(This,path,folder);
}
static __WIDL_INLINE HRESULT ITaskService_GetRunningTasks(ITaskService* This,LONG flags,IRunningTaskCollection **tasks) {
    return This->lpVtbl->GetRunningTasks(This,flags,tasks);
}
static __WIDL_INLINE HRESULT ITaskService_NewTask(ITaskService* This,DWORD flags,ITaskDefinition **definition) {
    return This->lpVtbl->NewTask(This,flags,definition);
}
static __WIDL_INLINE HRESULT ITaskService_Connect(ITaskService* This,VARIANT server,VARIANT user,VARIANT domain,VARIANT password) {
    return This->lpVtbl->Connect(This,server,user,domain,password);
}
static __WIDL_INLINE HRESULT ITaskService_get_Connected(ITaskService* This,VARIANT_BOOL *connected) {
    return This->lpVtbl->get_Connected(This,connected);
}
static __WIDL_INLINE HRESULT ITaskService_get_TargetServer(ITaskService* This,BSTR *server) {
    return This->lpVtbl->get_TargetServer(This,server);
}
static __WIDL_INLINE HRESULT ITaskService_get_ConnectedUser(ITaskService* This,BSTR *user) {
    return This->lpVtbl->get_ConnectedUser(This,user);
}
static __WIDL_INLINE HRESULT ITaskService_get_ConnectedDomain(ITaskService* This,BSTR *domain) {
    return This->lpVtbl->get_ConnectedDomain(This,domain);
}
static __WIDL_INLINE HRESULT ITaskService_get_HighestVersion(ITaskService* This,DWORD *version) {
    return This->lpVtbl->get_HighestVersion(This,version);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IRegisteredTask_QueryInterface(IRegisteredTask* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRegisteredTask_AddRef(IRegisteredTask* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRegisteredTask_Release(IRegisteredTask* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IRegisteredTask_GetTypeInfoCount(IRegisteredTask* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IRegisteredTask_GetTypeInfo(IRegisteredTask* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRegisteredTask_get_Name(IRegisteredTask* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static __WIDL_INLINE HRESULT IRegisteredTask_get_Path(IRegisteredTask* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static __WIDL_INLINE HRESULT IRegisteredTask_get_State(IRegisteredTask* This,TASK_STATE *state) {
    return This->lpVtbl->get_State(This,state);
}
static __WIDL_INLINE HRESULT IRegisteredTask_get_Enabled(IRegisteredTask* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->get_Enabled(This,enabled);
}
static __WIDL_INLINE HRESULT IRegisteredTask_put_Enabled(IRegisteredTask* This,VARIANT_BOOL enabled) {
    return This->lpVtbl->put_Enabled(This,enabled);
}
static __WIDL_INLINE HRESULT IRegisteredTask_Run(IRegisteredTask* This,VARIANT params,IRunningTask **task) {
    return This->lpVtbl->Run(This,params,task);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRegisteredTask_GetInstances(IRegisteredTask* This,LONG flags,IRunningTaskCollection **tasks) {
    return This->lpVtbl->GetInstances(This,flags,tasks);
}
static __WIDL_INLINE HRESULT IRegisteredTask_get_LastRunTime(IRegisteredTask* This,DATE *date) {
    return This->lpVtbl->get_LastRunTime(This,date);
}
static __WIDL_INLINE HRESULT IRegisteredTask_get_LastTaskResult(IRegisteredTask* This,LONG *result) {
    return This->lpVtbl->get_LastTaskResult(This,result);
}
static __WIDL_INLINE HRESULT IRegisteredTask_get_NumberOfMissedRuns(IRegisteredTask* This,LONG *runs) {
    return This->lpVtbl->get_NumberOfMissedRuns(This,runs);
}
static __WIDL_INLINE HRESULT IRegisteredTask_get_NextRunTime(IRegisteredTask* This,DATE *date) {
    return This->lpVtbl->get_NextRunTime(This,date);
}
static __WIDL_INLINE HRESULT IRegisteredTask_get_Definition(IRegisteredTask* This,ITaskDefinition **task) {
    return This->lpVtbl->get_Definition(This,task);
}
static __WIDL_INLINE HRESULT IRegisteredTask_get_Xml(IRegisteredTask* This,BSTR *xml) {
    return This->lpVtbl->get_Xml(This,xml);
}
static __WIDL_INLINE HRESULT IRegisteredTask_GetSecurityDescriptor(IRegisteredTask* This,LONG info,BSTR *sddl) {
    return This->lpVtbl->GetSecurityDescriptor(This,info,sddl);
}
static __WIDL_INLINE HRESULT IRegisteredTask_SetSecurityDescriptor(IRegisteredTask* This,BSTR sddl,LONG flags) {
    return This->lpVtbl->SetSecurityDescriptor(This,sddl,flags);
}
static __WIDL_INLINE HRESULT IRegisteredTask_Stop(IRegisteredTask* This,LONG flags) {
    return This->lpVtbl->Stop(This,flags);
}
static __WIDL_INLINE 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


#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 __WIDL_INLINE HRESULT IRegisteredTaskCollection_QueryInterface(IRegisteredTaskCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRegisteredTaskCollection_AddRef(IRegisteredTaskCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRegisteredTaskCollection_Release(IRegisteredTaskCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IRegisteredTaskCollection_GetTypeInfoCount(IRegisteredTaskCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IRegisteredTaskCollection_GetTypeInfo(IRegisteredTaskCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRegisteredTaskCollection_get_Count(IRegisteredTaskCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static __WIDL_INLINE HRESULT IRegisteredTaskCollection_get_Item(IRegisteredTaskCollection* This,VARIANT index,IRegisteredTask **task) {
    return This->lpVtbl->get_Item(This,index,task);
}
static __WIDL_INLINE HRESULT IRegisteredTaskCollection_get__NewEnum(IRegisteredTaskCollection* This,IUnknown **penum) {
    return This->lpVtbl->get__NewEnum(This,penum);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IRegistrationInfo_QueryInterface(IRegistrationInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRegistrationInfo_AddRef(IRegistrationInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRegistrationInfo_Release(IRegistrationInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IRegistrationInfo_GetTypeInfoCount(IRegistrationInfo* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_GetTypeInfo(IRegistrationInfo* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRegistrationInfo_get_Description(IRegistrationInfo* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_put_Description(IRegistrationInfo* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_get_Author(IRegistrationInfo* This,BSTR *author) {
    return This->lpVtbl->get_Author(This,author);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_put_Author(IRegistrationInfo* This,BSTR author) {
    return This->lpVtbl->put_Author(This,author);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_get_Version(IRegistrationInfo* This,BSTR *version) {
    return This->lpVtbl->get_Version(This,version);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_put_Version(IRegistrationInfo* This,BSTR version) {
    return This->lpVtbl->put_Version(This,version);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_get_Date(IRegistrationInfo* This,BSTR *date) {
    return This->lpVtbl->get_Date(This,date);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_put_Date(IRegistrationInfo* This,BSTR date) {
    return This->lpVtbl->put_Date(This,date);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_get_Documentation(IRegistrationInfo* This,BSTR *doc) {
    return This->lpVtbl->get_Documentation(This,doc);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_put_Documentation(IRegistrationInfo* This,BSTR doc) {
    return This->lpVtbl->put_Documentation(This,doc);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_get_XmlText(IRegistrationInfo* This,BSTR *xml) {
    return This->lpVtbl->get_XmlText(This,xml);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_put_XmlText(IRegistrationInfo* This,BSTR xml) {
    return This->lpVtbl->put_XmlText(This,xml);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_get_URI(IRegistrationInfo* This,BSTR *uri) {
    return This->lpVtbl->get_URI(This,uri);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_put_URI(IRegistrationInfo* This,BSTR uri) {
    return This->lpVtbl->put_URI(This,uri);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_get_SecurityDescriptor(IRegistrationInfo* This,VARIANT *sddl) {
    return This->lpVtbl->get_SecurityDescriptor(This,sddl);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_put_SecurityDescriptor(IRegistrationInfo* This,VARIANT sddl) {
    return This->lpVtbl->put_SecurityDescriptor(This,sddl);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_get_Source(IRegistrationInfo* This,BSTR *source) {
    return This->lpVtbl->get_Source(This,source);
}
static __WIDL_INLINE HRESULT IRegistrationInfo_put_Source(IRegistrationInfo* This,BSTR source) {
    return This->lpVtbl->put_Source(This,source);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ITaskFolder_QueryInterface(ITaskFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITaskFolder_AddRef(ITaskFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITaskFolder_Release(ITaskFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITaskFolder_GetTypeInfoCount(ITaskFolder* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITaskFolder_GetTypeInfo(ITaskFolder* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITaskFolder_get_Name(ITaskFolder* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static __WIDL_INLINE HRESULT ITaskFolder_get_Path(ITaskFolder* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static __WIDL_INLINE HRESULT ITaskFolder_GetFolder(ITaskFolder* This,BSTR path,ITaskFolder **folder) {
    return This->lpVtbl->GetFolder(This,path,folder);
}
static __WIDL_INLINE HRESULT ITaskFolder_GetFolders(ITaskFolder* This,LONG flags,ITaskFolderCollection **folders) {
    return This->lpVtbl->GetFolders(This,flags,folders);
}
static __WIDL_INLINE HRESULT ITaskFolder_CreateFolder(ITaskFolder* This,BSTR name,VARIANT sddl,ITaskFolder **folder) {
    return This->lpVtbl->CreateFolder(This,name,sddl,folder);
}
static __WIDL_INLINE HRESULT ITaskFolder_DeleteFolder(ITaskFolder* This,BSTR name,LONG flags) {
    return This->lpVtbl->DeleteFolder(This,name,flags);
}
static __WIDL_INLINE HRESULT ITaskFolder_GetTask(ITaskFolder* This,BSTR path,IRegisteredTask **task) {
    return This->lpVtbl->GetTask(This,path,task);
}
static __WIDL_INLINE HRESULT ITaskFolder_GetTasks(ITaskFolder* This,LONG flags,IRegisteredTaskCollection **tasks) {
    return This->lpVtbl->GetTasks(This,flags,tasks);
}
static __WIDL_INLINE HRESULT ITaskFolder_DeleteTask(ITaskFolder* This,BSTR name,LONG flags) {
    return This->lpVtbl->DeleteTask(This,name,flags);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITaskFolder_GetSecurityDescriptor(ITaskFolder* This,LONG info,BSTR *sddl) {
    return This->lpVtbl->GetSecurityDescriptor(This,info,sddl);
}
static __WIDL_INLINE HRESULT ITaskFolder_SetSecurityDescriptor(ITaskFolder* This,BSTR sddl,LONG flags) {
    return This->lpVtbl->SetSecurityDescriptor(This,sddl,flags);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ITaskFolderCollection_QueryInterface(ITaskFolderCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITaskFolderCollection_AddRef(ITaskFolderCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITaskFolderCollection_Release(ITaskFolderCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITaskFolderCollection_GetTypeInfoCount(ITaskFolderCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITaskFolderCollection_GetTypeInfo(ITaskFolderCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITaskFolderCollection_get_Count(ITaskFolderCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static __WIDL_INLINE HRESULT ITaskFolderCollection_get_Item(ITaskFolderCollection* This,VARIANT index,ITaskFolder **folder) {
    return This->lpVtbl->get_Item(This,index,folder);
}
static __WIDL_INLINE HRESULT ITaskFolderCollection_get__NewEnum(ITaskFolderCollection* This,IUnknown **penum) {
    return This->lpVtbl->get__NewEnum(This,penum);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ITaskDefinition_QueryInterface(ITaskDefinition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITaskDefinition_AddRef(ITaskDefinition* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITaskDefinition_Release(ITaskDefinition* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITaskDefinition_GetTypeInfoCount(ITaskDefinition* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITaskDefinition_GetTypeInfo(ITaskDefinition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITaskDefinition_get_RegistrationInfo(ITaskDefinition* This,IRegistrationInfo **info) {
    return This->lpVtbl->get_RegistrationInfo(This,info);
}
static __WIDL_INLINE HRESULT ITaskDefinition_put_RegistrationInfo(ITaskDefinition* This,IRegistrationInfo *info) {
    return This->lpVtbl->put_RegistrationInfo(This,info);
}
static __WIDL_INLINE HRESULT ITaskDefinition_get_Triggers(ITaskDefinition* This,ITriggerCollection **triggers) {
    return This->lpVtbl->get_Triggers(This,triggers);
}
static __WIDL_INLINE HRESULT ITaskDefinition_put_Triggers(ITaskDefinition* This,ITriggerCollection *triggers) {
    return This->lpVtbl->put_Triggers(This,triggers);
}
static __WIDL_INLINE HRESULT ITaskDefinition_get_Settings(ITaskDefinition* This,ITaskSettings **settings) {
    return This->lpVtbl->get_Settings(This,settings);
}
static __WIDL_INLINE HRESULT ITaskDefinition_put_Settings(ITaskDefinition* This,ITaskSettings *settings) {
    return This->lpVtbl->put_Settings(This,settings);
}
static __WIDL_INLINE HRESULT ITaskDefinition_get_Data(ITaskDefinition* This,BSTR *data) {
    return This->lpVtbl->get_Data(This,data);
}
static __WIDL_INLINE HRESULT ITaskDefinition_put_Data(ITaskDefinition* This,BSTR data) {
    return This->lpVtbl->put_Data(This,data);
}
static __WIDL_INLINE HRESULT ITaskDefinition_get_Principal(ITaskDefinition* This,IPrincipal **principal) {
    return This->lpVtbl->get_Principal(This,principal);
}
static __WIDL_INLINE HRESULT ITaskDefinition_put_Principal(ITaskDefinition* This,IPrincipal *principal) {
    return This->lpVtbl->put_Principal(This,principal);
}
static __WIDL_INLINE HRESULT ITaskDefinition_get_Actions(ITaskDefinition* This,IActionCollection **actions) {
    return This->lpVtbl->get_Actions(This,actions);
}
static __WIDL_INLINE HRESULT ITaskDefinition_put_Actions(ITaskDefinition* This,IActionCollection *actions) {
    return This->lpVtbl->put_Actions(This,actions);
}
static __WIDL_INLINE HRESULT ITaskDefinition_get_XmlText(ITaskDefinition* This,BSTR *xml) {
    return This->lpVtbl->get_XmlText(This,xml);
}
static __WIDL_INLINE HRESULT ITaskDefinition_put_XmlText(ITaskDefinition* This,BSTR xml) {
    return This->lpVtbl->put_XmlText(This,xml);
}
#endif
#endif

#endif


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

#endif


#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 __WIDL_INLINE HRESULT IIdleSettings_QueryInterface(IIdleSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IIdleSettings_AddRef(IIdleSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IIdleSettings_Release(IIdleSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IIdleSettings_GetTypeInfoCount(IIdleSettings* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IIdleSettings_GetTypeInfo(IIdleSettings* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IIdleSettings_get_IdleDuration(IIdleSettings* This,BSTR *delay) {
    return This->lpVtbl->get_IdleDuration(This,delay);
}
static __WIDL_INLINE HRESULT IIdleSettings_put_IdleDuration(IIdleSettings* This,BSTR delay) {
    return This->lpVtbl->put_IdleDuration(This,delay);
}
static __WIDL_INLINE HRESULT IIdleSettings_get_WaitTimeout(IIdleSettings* This,BSTR *timeout) {
    return This->lpVtbl->get_WaitTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IIdleSettings_put_WaitTimeout(IIdleSettings* This,BSTR timeout) {
    return This->lpVtbl->put_WaitTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IIdleSettings_get_StopOnIdleEnd(IIdleSettings* This,VARIANT_BOOL *stop) {
    return This->lpVtbl->get_StopOnIdleEnd(This,stop);
}
static __WIDL_INLINE HRESULT IIdleSettings_put_StopOnIdleEnd(IIdleSettings* This,VARIANT_BOOL stop) {
    return This->lpVtbl->put_StopOnIdleEnd(This,stop);
}
static __WIDL_INLINE HRESULT IIdleSettings_get_RestartOnIdle(IIdleSettings* This,VARIANT_BOOL *restart) {
    return This->lpVtbl->get_RestartOnIdle(This,restart);
}
static __WIDL_INLINE HRESULT IIdleSettings_put_RestartOnIdle(IIdleSettings* This,VARIANT_BOOL restart) {
    return This->lpVtbl->put_RestartOnIdle(This,restart);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IRunningTask_QueryInterface(IRunningTask* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRunningTask_AddRef(IRunningTask* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRunningTask_Release(IRunningTask* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IRunningTask_GetTypeInfoCount(IRunningTask* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IRunningTask_GetTypeInfo(IRunningTask* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRunningTask_get_Name(IRunningTask* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static __WIDL_INLINE HRESULT IRunningTask_get_InstanceGuid(IRunningTask* This,BSTR *guid) {
    return This->lpVtbl->get_InstanceGuid(This,guid);
}
static __WIDL_INLINE HRESULT IRunningTask_get_Path(IRunningTask* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static __WIDL_INLINE HRESULT IRunningTask_get_State(IRunningTask* This,TASK_STATE *state) {
    return This->lpVtbl->get_State(This,state);
}
static __WIDL_INLINE HRESULT IRunningTask_get_CurrentAction(IRunningTask* This,BSTR *name) {
    return This->lpVtbl->get_CurrentAction(This,name);
}
static __WIDL_INLINE HRESULT IRunningTask_Stop(IRunningTask* This) {
    return This->lpVtbl->Stop(This);
}
static __WIDL_INLINE HRESULT IRunningTask_Refresh(IRunningTask* This) {
    return This->lpVtbl->Refresh(This);
}
static __WIDL_INLINE HRESULT IRunningTask_get_EnginePID(IRunningTask* This,DWORD *pid) {
    return This->lpVtbl->get_EnginePID(This,pid);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IRunningTaskCollection_QueryInterface(IRunningTaskCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRunningTaskCollection_AddRef(IRunningTaskCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRunningTaskCollection_Release(IRunningTaskCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IRunningTaskCollection_GetTypeInfoCount(IRunningTaskCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IRunningTaskCollection_GetTypeInfo(IRunningTaskCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRunningTaskCollection_get_Count(IRunningTaskCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static __WIDL_INLINE HRESULT IRunningTaskCollection_get_Item(IRunningTaskCollection* This,VARIANT index,IRunningTask **task) {
    return This->lpVtbl->get_Item(This,index,task);
}
static __WIDL_INLINE HRESULT IRunningTaskCollection_get__NewEnum(IRunningTaskCollection* This,IUnknown **penum) {
    return This->lpVtbl->get__NewEnum(This,penum);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ITrigger_QueryInterface(ITrigger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITrigger_AddRef(ITrigger* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITrigger_Release(ITrigger* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITrigger_GetTypeInfoCount(ITrigger* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITrigger_GetTypeInfo(ITrigger* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITrigger_get_Type(ITrigger* This,TASK_TRIGGER_TYPE2 *type) {
    return This->lpVtbl->get_Type(This,type);
}
static __WIDL_INLINE HRESULT ITrigger_get_Id(ITrigger* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT ITrigger_put_Id(ITrigger* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
static __WIDL_INLINE HRESULT ITrigger_get_Repetition(ITrigger* This,IRepetitionPattern **repeat) {
    return This->lpVtbl->get_Repetition(This,repeat);
}
static __WIDL_INLINE HRESULT ITrigger_put_Repetition(ITrigger* This,IRepetitionPattern *repeat) {
    return This->lpVtbl->put_Repetition(This,repeat);
}
static __WIDL_INLINE HRESULT ITrigger_get_ExecutionTimeLimit(ITrigger* This,BSTR *limit) {
    return This->lpVtbl->get_ExecutionTimeLimit(This,limit);
}
static __WIDL_INLINE HRESULT ITrigger_put_ExecutionTimeLimit(ITrigger* This,BSTR limit) {
    return This->lpVtbl->put_ExecutionTimeLimit(This,limit);
}
static __WIDL_INLINE HRESULT ITrigger_get_StartBoundary(ITrigger* This,BSTR *start) {
    return This->lpVtbl->get_StartBoundary(This,start);
}
static __WIDL_INLINE HRESULT ITrigger_put_StartBoundary(ITrigger* This,BSTR start) {
    return This->lpVtbl->put_StartBoundary(This,start);
}
static __WIDL_INLINE HRESULT ITrigger_get_EndBoundary(ITrigger* This,BSTR *end) {
    return This->lpVtbl->get_EndBoundary(This,end);
}
static __WIDL_INLINE HRESULT ITrigger_put_EndBoundary(ITrigger* This,BSTR end) {
    return This->lpVtbl->put_EndBoundary(This,end);
}
static __WIDL_INLINE HRESULT ITrigger_get_Enabled(ITrigger* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->get_Enabled(This,enabled);
}
static __WIDL_INLINE HRESULT ITrigger_put_Enabled(ITrigger* This,VARIANT_BOOL enabled) {
    return This->lpVtbl->put_Enabled(This,enabled);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IDailyTrigger_QueryInterface(IDailyTrigger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDailyTrigger_AddRef(IDailyTrigger* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDailyTrigger_Release(IDailyTrigger* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDailyTrigger_GetTypeInfoCount(IDailyTrigger* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDailyTrigger_GetTypeInfo(IDailyTrigger* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDailyTrigger_get_Type(IDailyTrigger* This,TASK_TRIGGER_TYPE2 *type) {
    return This->lpVtbl->get_Type(This,type);
}
static __WIDL_INLINE HRESULT IDailyTrigger_get_Id(IDailyTrigger* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IDailyTrigger_put_Id(IDailyTrigger* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
static __WIDL_INLINE HRESULT IDailyTrigger_get_Repetition(IDailyTrigger* This,IRepetitionPattern **repeat) {
    return This->lpVtbl->get_Repetition(This,repeat);
}
static __WIDL_INLINE HRESULT IDailyTrigger_put_Repetition(IDailyTrigger* This,IRepetitionPattern *repeat) {
    return This->lpVtbl->put_Repetition(This,repeat);
}
static __WIDL_INLINE HRESULT IDailyTrigger_get_ExecutionTimeLimit(IDailyTrigger* This,BSTR *limit) {
    return This->lpVtbl->get_ExecutionTimeLimit(This,limit);
}
static __WIDL_INLINE HRESULT IDailyTrigger_put_ExecutionTimeLimit(IDailyTrigger* This,BSTR limit) {
    return This->lpVtbl->put_ExecutionTimeLimit(This,limit);
}
static __WIDL_INLINE HRESULT IDailyTrigger_get_StartBoundary(IDailyTrigger* This,BSTR *start) {
    return This->lpVtbl->get_StartBoundary(This,start);
}
static __WIDL_INLINE HRESULT IDailyTrigger_put_StartBoundary(IDailyTrigger* This,BSTR start) {
    return This->lpVtbl->put_StartBoundary(This,start);
}
static __WIDL_INLINE HRESULT IDailyTrigger_get_EndBoundary(IDailyTrigger* This,BSTR *end) {
    return This->lpVtbl->get_EndBoundary(This,end);
}
static __WIDL_INLINE HRESULT IDailyTrigger_put_EndBoundary(IDailyTrigger* This,BSTR end) {
    return This->lpVtbl->put_EndBoundary(This,end);
}
static __WIDL_INLINE HRESULT IDailyTrigger_get_Enabled(IDailyTrigger* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->get_Enabled(This,enabled);
}
static __WIDL_INLINE HRESULT IDailyTrigger_put_Enabled(IDailyTrigger* This,VARIANT_BOOL enabled) {
    return This->lpVtbl->put_Enabled(This,enabled);
}
/*** IDailyTrigger methods ***/
static __WIDL_INLINE HRESULT IDailyTrigger_get_DaysInterval(IDailyTrigger* This,short *pDays) {
    return This->lpVtbl->get_DaysInterval(This,pDays);
}
static __WIDL_INLINE HRESULT IDailyTrigger_put_DaysInterval(IDailyTrigger* This,short days) {
    return This->lpVtbl->put_DaysInterval(This,days);
}
static __WIDL_INLINE HRESULT IDailyTrigger_get_RandomDelay(IDailyTrigger* This,BSTR *pRandomDelay) {
    return This->lpVtbl->get_RandomDelay(This,pRandomDelay);
}
static __WIDL_INLINE HRESULT IDailyTrigger_put_RandomDelay(IDailyTrigger* This,BSTR randomDelay) {
    return This->lpVtbl->put_RandomDelay(This,randomDelay);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ITriggerCollection_QueryInterface(ITriggerCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITriggerCollection_AddRef(ITriggerCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITriggerCollection_Release(ITriggerCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITriggerCollection_GetTypeInfoCount(ITriggerCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITriggerCollection_GetTypeInfo(ITriggerCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITriggerCollection_get_Count(ITriggerCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static __WIDL_INLINE HRESULT ITriggerCollection_get_Item(ITriggerCollection* This,LONG index,ITrigger **trigger) {
    return This->lpVtbl->get_Item(This,index,trigger);
}
static __WIDL_INLINE HRESULT ITriggerCollection_get__NewEnum(ITriggerCollection* This,IUnknown **penum) {
    return This->lpVtbl->get__NewEnum(This,penum);
}
static __WIDL_INLINE HRESULT ITriggerCollection_Create(ITriggerCollection* This,TASK_TRIGGER_TYPE2 type,ITrigger **trigger) {
    return This->lpVtbl->Create(This,type,trigger);
}
static __WIDL_INLINE HRESULT ITriggerCollection_Remove(ITriggerCollection* This,VARIANT index) {
    return This->lpVtbl->Remove(This,index);
}
static __WIDL_INLINE HRESULT ITriggerCollection_Clear(ITriggerCollection* This) {
    return This->lpVtbl->Clear(This);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ITimeTrigger_QueryInterface(ITimeTrigger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITimeTrigger_AddRef(ITimeTrigger* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITimeTrigger_Release(ITimeTrigger* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITimeTrigger_GetTypeInfoCount(ITimeTrigger* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITimeTrigger_GetTypeInfo(ITimeTrigger* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITimeTrigger_get_Type(ITimeTrigger* This,TASK_TRIGGER_TYPE2 *type) {
    return This->lpVtbl->get_Type(This,type);
}
static __WIDL_INLINE HRESULT ITimeTrigger_get_Id(ITimeTrigger* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT ITimeTrigger_put_Id(ITimeTrigger* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
static __WIDL_INLINE HRESULT ITimeTrigger_get_Repetition(ITimeTrigger* This,IRepetitionPattern **repeat) {
    return This->lpVtbl->get_Repetition(This,repeat);
}
static __WIDL_INLINE HRESULT ITimeTrigger_put_Repetition(ITimeTrigger* This,IRepetitionPattern *repeat) {
    return This->lpVtbl->put_Repetition(This,repeat);
}
static __WIDL_INLINE HRESULT ITimeTrigger_get_ExecutionTimeLimit(ITimeTrigger* This,BSTR *limit) {
    return This->lpVtbl->get_ExecutionTimeLimit(This,limit);
}
static __WIDL_INLINE HRESULT ITimeTrigger_put_ExecutionTimeLimit(ITimeTrigger* This,BSTR limit) {
    return This->lpVtbl->put_ExecutionTimeLimit(This,limit);
}
static __WIDL_INLINE HRESULT ITimeTrigger_get_StartBoundary(ITimeTrigger* This,BSTR *start) {
    return This->lpVtbl->get_StartBoundary(This,start);
}
static __WIDL_INLINE HRESULT ITimeTrigger_put_StartBoundary(ITimeTrigger* This,BSTR start) {
    return This->lpVtbl->put_StartBoundary(This,start);
}
static __WIDL_INLINE HRESULT ITimeTrigger_get_EndBoundary(ITimeTrigger* This,BSTR *end) {
    return This->lpVtbl->get_EndBoundary(This,end);
}
static __WIDL_INLINE HRESULT ITimeTrigger_put_EndBoundary(ITimeTrigger* This,BSTR end) {
    return This->lpVtbl->put_EndBoundary(This,end);
}
static __WIDL_INLINE HRESULT ITimeTrigger_get_Enabled(ITimeTrigger* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->get_Enabled(This,enabled);
}
static __WIDL_INLINE HRESULT ITimeTrigger_put_Enabled(ITimeTrigger* This,VARIANT_BOOL enabled) {
    return This->lpVtbl->put_Enabled(This,enabled);
}
/*** ITimeTrigger methods ***/
static __WIDL_INLINE HRESULT ITimeTrigger_get_RandomDelay(ITimeTrigger* This,BSTR *delay) {
    return This->lpVtbl->get_RandomDelay(This,delay);
}
static __WIDL_INLINE HRESULT ITimeTrigger_put_RandomDelay(ITimeTrigger* This,BSTR delay) {
    return This->lpVtbl->put_RandomDelay(This,delay);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IRepetitionPattern_QueryInterface(IRepetitionPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRepetitionPattern_AddRef(IRepetitionPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRepetitionPattern_Release(IRepetitionPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IRepetitionPattern_GetTypeInfoCount(IRepetitionPattern* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IRepetitionPattern_GetTypeInfo(IRepetitionPattern* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRepetitionPattern_get_Interval(IRepetitionPattern* This,BSTR *interval) {
    return This->lpVtbl->get_Interval(This,interval);
}
static __WIDL_INLINE HRESULT IRepetitionPattern_put_Interval(IRepetitionPattern* This,BSTR interval) {
    return This->lpVtbl->put_Interval(This,interval);
}
static __WIDL_INLINE HRESULT IRepetitionPattern_get_Duration(IRepetitionPattern* This,BSTR *duration) {
    return This->lpVtbl->get_Duration(This,duration);
}
static __WIDL_INLINE HRESULT IRepetitionPattern_put_Duration(IRepetitionPattern* This,BSTR duration) {
    return This->lpVtbl->put_Duration(This,duration);
}
static __WIDL_INLINE HRESULT IRepetitionPattern_get_StopAtDurationEnd(IRepetitionPattern* This,VARIANT_BOOL *stop) {
    return This->lpVtbl->get_StopAtDurationEnd(This,stop);
}
static __WIDL_INLINE HRESULT IRepetitionPattern_put_StopAtDurationEnd(IRepetitionPattern* This,VARIANT_BOOL sop) {
    return This->lpVtbl->put_StopAtDurationEnd(This,sop);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IAction_QueryInterface(IAction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAction_AddRef(IAction* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAction_Release(IAction* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IAction_GetTypeInfoCount(IAction* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IAction_GetTypeInfo(IAction* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAction_get_Id(IAction* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IAction_put_Id(IAction* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
static __WIDL_INLINE HRESULT IAction_get_Type(IAction* This,TASK_ACTION_TYPE *type) {
    return This->lpVtbl->get_Type(This,type);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IActionCollection_QueryInterface(IActionCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IActionCollection_AddRef(IActionCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IActionCollection_Release(IActionCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IActionCollection_GetTypeInfoCount(IActionCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IActionCollection_GetTypeInfo(IActionCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IActionCollection_get_Count(IActionCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static __WIDL_INLINE HRESULT IActionCollection_get_Item(IActionCollection* This,LONG index,IAction **action) {
    return This->lpVtbl->get_Item(This,index,action);
}
static __WIDL_INLINE HRESULT IActionCollection_get__NewEnum(IActionCollection* This,IUnknown **penum) {
    return This->lpVtbl->get__NewEnum(This,penum);
}
static __WIDL_INLINE HRESULT IActionCollection_get_XmlText(IActionCollection* This,BSTR *xml) {
    return This->lpVtbl->get_XmlText(This,xml);
}
static __WIDL_INLINE HRESULT IActionCollection_put_XmlText(IActionCollection* This,BSTR xml) {
    return This->lpVtbl->put_XmlText(This,xml);
}
static __WIDL_INLINE HRESULT IActionCollection_Create(IActionCollection* This,TASK_ACTION_TYPE Type,IAction **action) {
    return This->lpVtbl->Create(This,Type,action);
}
static __WIDL_INLINE HRESULT IActionCollection_Remove(IActionCollection* This,VARIANT index) {
    return This->lpVtbl->Remove(This,index);
}
static __WIDL_INLINE HRESULT IActionCollection_Clear(IActionCollection* This) {
    return This->lpVtbl->Clear(This);
}
static __WIDL_INLINE HRESULT IActionCollection_get_Context(IActionCollection* This,BSTR *ctx) {
    return This->lpVtbl->get_Context(This,ctx);
}
static __WIDL_INLINE HRESULT IActionCollection_put_Context(IActionCollection* This,BSTR ctx) {
    return This->lpVtbl->put_Context(This,ctx);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IExecAction_QueryInterface(IExecAction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IExecAction_AddRef(IExecAction* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IExecAction_Release(IExecAction* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IExecAction_GetTypeInfoCount(IExecAction* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IExecAction_GetTypeInfo(IExecAction* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IExecAction_get_Id(IExecAction* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IExecAction_put_Id(IExecAction* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
static __WIDL_INLINE HRESULT IExecAction_get_Type(IExecAction* This,TASK_ACTION_TYPE *type) {
    return This->lpVtbl->get_Type(This,type);
}
/*** IExecAction methods ***/
static __WIDL_INLINE HRESULT IExecAction_get_Path(IExecAction* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static __WIDL_INLINE HRESULT IExecAction_put_Path(IExecAction* This,BSTR path) {
    return This->lpVtbl->put_Path(This,path);
}
static __WIDL_INLINE HRESULT IExecAction_get_Arguments(IExecAction* This,BSTR *argument) {
    return This->lpVtbl->get_Arguments(This,argument);
}
static __WIDL_INLINE HRESULT IExecAction_put_Arguments(IExecAction* This,BSTR argument) {
    return This->lpVtbl->put_Arguments(This,argument);
}
static __WIDL_INLINE HRESULT IExecAction_get_WorkingDirectory(IExecAction* This,BSTR *directory) {
    return This->lpVtbl->get_WorkingDirectory(This,directory);
}
static __WIDL_INLINE HRESULT IExecAction_put_WorkingDirectory(IExecAction* This,BSTR directory) {
    return This->lpVtbl->put_WorkingDirectory(This,directory);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT INetworkSettings_QueryInterface(INetworkSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG INetworkSettings_AddRef(INetworkSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG INetworkSettings_Release(INetworkSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT INetworkSettings_GetTypeInfoCount(INetworkSettings* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT INetworkSettings_GetTypeInfo(INetworkSettings* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT INetworkSettings_get_Name(INetworkSettings* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static __WIDL_INLINE HRESULT INetworkSettings_put_Name(INetworkSettings* This,BSTR name) {
    return This->lpVtbl->put_Name(This,name);
}
static __WIDL_INLINE HRESULT INetworkSettings_get_Id(INetworkSettings* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT INetworkSettings_put_Id(INetworkSettings* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IPrincipal_QueryInterface(IPrincipal* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPrincipal_AddRef(IPrincipal* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPrincipal_Release(IPrincipal* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IPrincipal_GetTypeInfoCount(IPrincipal* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IPrincipal_GetTypeInfo(IPrincipal* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IPrincipal_get_Id(IPrincipal* This,BSTR *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IPrincipal_put_Id(IPrincipal* This,BSTR id) {
    return This->lpVtbl->put_Id(This,id);
}
static __WIDL_INLINE HRESULT IPrincipal_get_DisplayName(IPrincipal* This,BSTR *name) {
    return This->lpVtbl->get_DisplayName(This,name);
}
static __WIDL_INLINE HRESULT IPrincipal_put_DisplayName(IPrincipal* This,BSTR name) {
    return This->lpVtbl->put_DisplayName(This,name);
}
static __WIDL_INLINE HRESULT IPrincipal_get_UserId(IPrincipal* This,BSTR *user) {
    return This->lpVtbl->get_UserId(This,user);
}
static __WIDL_INLINE HRESULT IPrincipal_put_UserId(IPrincipal* This,BSTR user) {
    return This->lpVtbl->put_UserId(This,user);
}
static __WIDL_INLINE HRESULT IPrincipal_get_LogonType(IPrincipal* This,TASK_LOGON_TYPE *logon) {
    return This->lpVtbl->get_LogonType(This,logon);
}
static __WIDL_INLINE HRESULT IPrincipal_put_LogonType(IPrincipal* This,TASK_LOGON_TYPE logon) {
    return This->lpVtbl->put_LogonType(This,logon);
}
static __WIDL_INLINE HRESULT IPrincipal_get_GroupId(IPrincipal* This,BSTR *group) {
    return This->lpVtbl->get_GroupId(This,group);
}
static __WIDL_INLINE HRESULT IPrincipal_put_GroupId(IPrincipal* This,BSTR group) {
    return This->lpVtbl->put_GroupId(This,group);
}
static __WIDL_INLINE HRESULT IPrincipal_get_RunLevel(IPrincipal* This,TASK_RUNLEVEL_TYPE *level) {
    return This->lpVtbl->get_RunLevel(This,level);
}
static __WIDL_INLINE HRESULT IPrincipal_put_RunLevel(IPrincipal* This,TASK_RUNLEVEL_TYPE level) {
    return This->lpVtbl->put_RunLevel(This,level);
}
#endif
#endif

#endif


#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

#endif /* __TaskScheduler_LIBRARY_DEFINED__ */
/* 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__ */
