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

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

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

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

#ifndef __fsrmreports_h__
#define __fsrmreports_h__

/* Forward declarations */

#ifndef __IFsrmReport_FWD_DEFINED__
#define __IFsrmReport_FWD_DEFINED__
typedef interface IFsrmReport IFsrmReport;
#endif

#ifndef __IFsrmReportScheduler_FWD_DEFINED__
#define __IFsrmReportScheduler_FWD_DEFINED__
typedef interface IFsrmReportScheduler IFsrmReportScheduler;
#endif

#ifndef __IFsrmFileManagementJobManager_FWD_DEFINED__
#define __IFsrmFileManagementJobManager_FWD_DEFINED__
typedef interface IFsrmFileManagementJobManager IFsrmFileManagementJobManager;
#endif

#ifndef __IFsrmPropertyCondition_FWD_DEFINED__
#define __IFsrmPropertyCondition_FWD_DEFINED__
typedef interface IFsrmPropertyCondition IFsrmPropertyCondition;
#endif

#ifndef __IFsrmReportManager_FWD_DEFINED__
#define __IFsrmReportManager_FWD_DEFINED__
typedef interface IFsrmReportManager IFsrmReportManager;
#endif

#ifndef __IFsrmReportJob_FWD_DEFINED__
#define __IFsrmReportJob_FWD_DEFINED__
typedef interface IFsrmReportJob IFsrmReportJob;
#endif

#ifndef __IFsrmFileManagementJob_FWD_DEFINED__
#define __IFsrmFileManagementJob_FWD_DEFINED__
typedef interface IFsrmFileManagementJob IFsrmFileManagementJob;
#endif

#ifndef __IFsrmFileCondition_FWD_DEFINED__
#define __IFsrmFileCondition_FWD_DEFINED__
typedef interface IFsrmFileCondition IFsrmFileCondition;
#endif

#ifndef __IFsrmFileConditionProperty_FWD_DEFINED__
#define __IFsrmFileConditionProperty_FWD_DEFINED__
typedef interface IFsrmFileConditionProperty IFsrmFileConditionProperty;
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <fsrmenums.h>
#include <fsrm.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#ifndef __IFsrmFileManagementJob_FWD_DEFINED__
#define __IFsrmFileManagementJob_FWD_DEFINED__
typedef interface IFsrmFileManagementJob IFsrmFileManagementJob;
#endif

#ifndef __IFsrmFileManagementJobManager_FWD_DEFINED__
#define __IFsrmFileManagementJobManager_FWD_DEFINED__
typedef interface IFsrmFileManagementJobManager IFsrmFileManagementJobManager;
#endif

#ifndef __IFsrmPropertyCondition_FWD_DEFINED__
#define __IFsrmPropertyCondition_FWD_DEFINED__
typedef interface IFsrmPropertyCondition IFsrmPropertyCondition;
#endif

#ifndef __IFsrmReport_FWD_DEFINED__
#define __IFsrmReport_FWD_DEFINED__
typedef interface IFsrmReport IFsrmReport;
#endif

#ifndef __IFsrmReportJob_FWD_DEFINED__
#define __IFsrmReportJob_FWD_DEFINED__
typedef interface IFsrmReportJob IFsrmReportJob;
#endif

#ifndef __IFsrmReportManager_FWD_DEFINED__
#define __IFsrmReportManager_FWD_DEFINED__
typedef interface IFsrmReportManager IFsrmReportManager;
#endif

#define FSRM_DISPID_REPORT_MANAGER (FSRM_DISPID_FEATURE_REPORTS | 0x100000)

#define FSRM_DISPID_REPORT_JOB (FSRM_DISPID_FEATURE_REPORTS | 0x200000)

#define FSRM_DISPID_REPORT (FSRM_DISPID_FEATURE_REPORTS | 0x300000)

#define FSRM_DISPID_REPORT_SCHEDULER (FSRM_DISPID_FEATURE_REPORTS | 0x400000)

#define FSRM_DISPID_FILE_MANAGEMENT_JOB_MANAGER (FSRM_DISPID_FEATURE_REPORTS | 0x500000)

#define FSRM_DISPID_FILE_MANAGEMENT_JOB (FSRM_DISPID_FEATURE_REPORTS | 0x600000)

#define FSRM_DISPID_FILE_MANAGEMENT_NOTIFICATION (FSRM_DISPID_FEATURE_REPORTS | 0x700000)

#define FSRM_DISPID_PROPERTY_CONDITION (FSRM_DISPID_FEATURE_REPORTS | 0x800000)

#define FSRM_DISPID_FILE_CONDITION (FSRM_DISPID_FEATURE_REPORTS | 0x900000)

#define FSRM_DISPID_FILE_CONDITION_PROPERTY (FSRM_DISPID_FEATURE_REPORTS | 0xa00000)

#define FSRM_DISPID_FILE_MANAGEMENT_JOB_2 (FSRM_DISPID_FEATURE_REPORTS | 0xb00000)

/*****************************************************************************
 * IFsrmReport interface
 */
#ifndef __IFsrmReport_INTERFACE_DEFINED__
#define __IFsrmReport_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmReport, 0xd8cc81d9, 0x46b8, 0x4fa4, 0xbf,0xa5, 0x4a,0xa9,0xde,0xc9,0xb6,0x38);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d8cc81d9-46b8-4fa4-bfa5-4aa9dec9b638")
IFsrmReport : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Type(
        FsrmReportType *reportType) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_Name(
        BSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Description(
        BSTR *description) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Description(
        BSTR description) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LastGeneratedFileNamePrefix(
        BSTR *prefix) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFilter(
        FsrmReportFilter filter,
        VARIANT *filterValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFilter(
        FsrmReportFilter filter,
        VARIANT filterValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmReport, 0xd8cc81d9, 0x46b8, 0x4fa4, 0xbf,0xa5, 0x4a,0xa9,0xde,0xc9,0xb6,0x38)
#endif
#else
typedef struct IFsrmReportVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmReport methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Type)(
        IFsrmReport* This,
        FsrmReportType *reportType);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IFsrmReport* This,
        BSTR *name);

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

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmReport* This,
        BSTR *description);

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

    HRESULT (STDMETHODCALLTYPE *get_LastGeneratedFileNamePrefix)(
        IFsrmReport* This,
        BSTR *prefix);

    HRESULT (STDMETHODCALLTYPE *GetFilter)(
        IFsrmReport* This,
        FsrmReportFilter filter,
        VARIANT *filterValue);

    HRESULT (STDMETHODCALLTYPE *SetFilter)(
        IFsrmReport* This,
        FsrmReportFilter filter,
        VARIANT filterValue);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmReport* This);

    END_INTERFACE
} IFsrmReportVtbl;
interface IFsrmReport {
    CONST_VTBL IFsrmReportVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmReport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmReport_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmReport_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmReport_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmReport_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmReport_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmReport_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmReport methods ***/
#define IFsrmReport_get_Type(This,reportType) (This)->lpVtbl->get_Type(This,reportType)
#define IFsrmReport_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
#define IFsrmReport_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
#define IFsrmReport_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmReport_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmReport_get_LastGeneratedFileNamePrefix(This,prefix) (This)->lpVtbl->get_LastGeneratedFileNamePrefix(This,prefix)
#define IFsrmReport_GetFilter(This,filter,filterValue) (This)->lpVtbl->GetFilter(This,filter,filterValue)
#define IFsrmReport_SetFilter(This,filter,filterValue) (This)->lpVtbl->SetFilter(This,filter,filterValue)
#define IFsrmReport_Delete(This) (This)->lpVtbl->Delete(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFsrmReport_QueryInterface(IFsrmReport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFsrmReport_AddRef(IFsrmReport* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFsrmReport_Release(IFsrmReport* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IFsrmReport_GetTypeInfoCount(IFsrmReport* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IFsrmReport_GetTypeInfo(IFsrmReport* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IFsrmReport_GetIDsOfNames(IFsrmReport* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IFsrmReport_Invoke(IFsrmReport* 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);
}
/*** IFsrmReport methods ***/
static FORCEINLINE HRESULT IFsrmReport_get_Type(IFsrmReport* This,FsrmReportType *reportType) {
    return This->lpVtbl->get_Type(This,reportType);
}
static FORCEINLINE HRESULT IFsrmReport_get_Name(IFsrmReport* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static FORCEINLINE HRESULT IFsrmReport_put_Name(IFsrmReport* This,BSTR name) {
    return This->lpVtbl->put_Name(This,name);
}
static FORCEINLINE HRESULT IFsrmReport_get_Description(IFsrmReport* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static FORCEINLINE HRESULT IFsrmReport_put_Description(IFsrmReport* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static FORCEINLINE HRESULT IFsrmReport_get_LastGeneratedFileNamePrefix(IFsrmReport* This,BSTR *prefix) {
    return This->lpVtbl->get_LastGeneratedFileNamePrefix(This,prefix);
}
static FORCEINLINE HRESULT IFsrmReport_GetFilter(IFsrmReport* This,FsrmReportFilter filter,VARIANT *filterValue) {
    return This->lpVtbl->GetFilter(This,filter,filterValue);
}
static FORCEINLINE HRESULT IFsrmReport_SetFilter(IFsrmReport* This,FsrmReportFilter filter,VARIANT filterValue) {
    return This->lpVtbl->SetFilter(This,filter,filterValue);
}
static FORCEINLINE HRESULT IFsrmReport_Delete(IFsrmReport* This) {
    return This->lpVtbl->Delete(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IFsrmReport_get_Type_Proxy(
    IFsrmReport* This,
    FsrmReportType *reportType);
void __RPC_STUB IFsrmReport_get_Type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReport_get_Name_Proxy(
    IFsrmReport* This,
    BSTR *name);
void __RPC_STUB IFsrmReport_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReport_put_Name_Proxy(
    IFsrmReport* This,
    BSTR name);
void __RPC_STUB IFsrmReport_put_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReport_get_Description_Proxy(
    IFsrmReport* This,
    BSTR *description);
void __RPC_STUB IFsrmReport_get_Description_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReport_put_Description_Proxy(
    IFsrmReport* This,
    BSTR description);
void __RPC_STUB IFsrmReport_put_Description_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReport_get_LastGeneratedFileNamePrefix_Proxy(
    IFsrmReport* This,
    BSTR *prefix);
void __RPC_STUB IFsrmReport_get_LastGeneratedFileNamePrefix_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReport_GetFilter_Proxy(
    IFsrmReport* This,
    FsrmReportFilter filter,
    VARIANT *filterValue);
void __RPC_STUB IFsrmReport_GetFilter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReport_SetFilter_Proxy(
    IFsrmReport* This,
    FsrmReportFilter filter,
    VARIANT filterValue);
void __RPC_STUB IFsrmReport_SetFilter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReport_Delete_Proxy(
    IFsrmReport* This);
void __RPC_STUB IFsrmReport_Delete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IFsrmReport_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmReportScheduler interface
 */
#ifndef __IFsrmReportScheduler_INTERFACE_DEFINED__
#define __IFsrmReportScheduler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmReportScheduler, 0x6879caf9, 0x6617, 0x4484, 0x87,0x19, 0x71,0xc3,0xd8,0x64,0x5f,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6879caf9-6617-4484-8719-71c3d8645f94")
IFsrmReportScheduler : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE VerifyNamespaces(
        VARIANT *namespacesSafeArray) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateScheduleTask(
        BSTR taskName,
        VARIANT *namespacesSafeArray,
        BSTR serializedTask) = 0;

    virtual HRESULT STDMETHODCALLTYPE ModifyScheduleTask(
        BSTR taskName,
        VARIANT *namespacesSafeArray,
        BSTR serializedTask) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteScheduleTask(
        BSTR taskName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmReportScheduler, 0x6879caf9, 0x6617, 0x4484, 0x87,0x19, 0x71,0xc3,0xd8,0x64,0x5f,0x94)
#endif
#else
typedef struct IFsrmReportSchedulerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmReportScheduler methods ***/
    HRESULT (STDMETHODCALLTYPE *VerifyNamespaces)(
        IFsrmReportScheduler* This,
        VARIANT *namespacesSafeArray);

    HRESULT (STDMETHODCALLTYPE *CreateScheduleTask)(
        IFsrmReportScheduler* This,
        BSTR taskName,
        VARIANT *namespacesSafeArray,
        BSTR serializedTask);

    HRESULT (STDMETHODCALLTYPE *ModifyScheduleTask)(
        IFsrmReportScheduler* This,
        BSTR taskName,
        VARIANT *namespacesSafeArray,
        BSTR serializedTask);

    HRESULT (STDMETHODCALLTYPE *DeleteScheduleTask)(
        IFsrmReportScheduler* This,
        BSTR taskName);

    END_INTERFACE
} IFsrmReportSchedulerVtbl;
interface IFsrmReportScheduler {
    CONST_VTBL IFsrmReportSchedulerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmReportScheduler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmReportScheduler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmReportScheduler_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmReportScheduler_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmReportScheduler_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmReportScheduler_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmReportScheduler_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmReportScheduler methods ***/
#define IFsrmReportScheduler_VerifyNamespaces(This,namespacesSafeArray) (This)->lpVtbl->VerifyNamespaces(This,namespacesSafeArray)
#define IFsrmReportScheduler_CreateScheduleTask(This,taskName,namespacesSafeArray,serializedTask) (This)->lpVtbl->CreateScheduleTask(This,taskName,namespacesSafeArray,serializedTask)
#define IFsrmReportScheduler_ModifyScheduleTask(This,taskName,namespacesSafeArray,serializedTask) (This)->lpVtbl->ModifyScheduleTask(This,taskName,namespacesSafeArray,serializedTask)
#define IFsrmReportScheduler_DeleteScheduleTask(This,taskName) (This)->lpVtbl->DeleteScheduleTask(This,taskName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFsrmReportScheduler_QueryInterface(IFsrmReportScheduler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFsrmReportScheduler_AddRef(IFsrmReportScheduler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFsrmReportScheduler_Release(IFsrmReportScheduler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IFsrmReportScheduler_GetTypeInfoCount(IFsrmReportScheduler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IFsrmReportScheduler_GetTypeInfo(IFsrmReportScheduler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IFsrmReportScheduler_GetIDsOfNames(IFsrmReportScheduler* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IFsrmReportScheduler_Invoke(IFsrmReportScheduler* 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);
}
/*** IFsrmReportScheduler methods ***/
static FORCEINLINE HRESULT IFsrmReportScheduler_VerifyNamespaces(IFsrmReportScheduler* This,VARIANT *namespacesSafeArray) {
    return This->lpVtbl->VerifyNamespaces(This,namespacesSafeArray);
}
static FORCEINLINE HRESULT IFsrmReportScheduler_CreateScheduleTask(IFsrmReportScheduler* This,BSTR taskName,VARIANT *namespacesSafeArray,BSTR serializedTask) {
    return This->lpVtbl->CreateScheduleTask(This,taskName,namespacesSafeArray,serializedTask);
}
static FORCEINLINE HRESULT IFsrmReportScheduler_ModifyScheduleTask(IFsrmReportScheduler* This,BSTR taskName,VARIANT *namespacesSafeArray,BSTR serializedTask) {
    return This->lpVtbl->ModifyScheduleTask(This,taskName,namespacesSafeArray,serializedTask);
}
static FORCEINLINE HRESULT IFsrmReportScheduler_DeleteScheduleTask(IFsrmReportScheduler* This,BSTR taskName) {
    return This->lpVtbl->DeleteScheduleTask(This,taskName);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IFsrmReportScheduler_VerifyNamespaces_Proxy(
    IFsrmReportScheduler* This,
    VARIANT *namespacesSafeArray);
void __RPC_STUB IFsrmReportScheduler_VerifyNamespaces_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportScheduler_CreateScheduleTask_Proxy(
    IFsrmReportScheduler* This,
    BSTR taskName,
    VARIANT *namespacesSafeArray,
    BSTR serializedTask);
void __RPC_STUB IFsrmReportScheduler_CreateScheduleTask_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportScheduler_ModifyScheduleTask_Proxy(
    IFsrmReportScheduler* This,
    BSTR taskName,
    VARIANT *namespacesSafeArray,
    BSTR serializedTask);
void __RPC_STUB IFsrmReportScheduler_ModifyScheduleTask_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportScheduler_DeleteScheduleTask_Proxy(
    IFsrmReportScheduler* This,
    BSTR taskName);
void __RPC_STUB IFsrmReportScheduler_DeleteScheduleTask_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IFsrmReportScheduler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmFileManagementJobManager interface
 */
#ifndef __IFsrmFileManagementJobManager_INTERFACE_DEFINED__
#define __IFsrmFileManagementJobManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmFileManagementJobManager, 0xee321ecb, 0xd95e, 0x48e9, 0x90,0x7c, 0xc7,0x68,0x5a,0x01,0x32,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ee321ecb-d95e-48e9-907c-c7685a013235")
IFsrmFileManagementJobManager : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_ActionVariables(
        SAFEARRAY **variables) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ActionVariableDescriptions(
        SAFEARRAY **descriptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumFileManagementJobs(
        FsrmEnumOptions options = FsrmEnumOptions_None,
        IFsrmCollection **fileManagementJobs) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFileManagementJob(
        IFsrmFileManagementJob **fileManagementJob) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileManagementJob(
        BSTR name,
        IFsrmFileManagementJob **fileManagementJob) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmFileManagementJobManager, 0xee321ecb, 0xd95e, 0x48e9, 0x90,0x7c, 0xc7,0x68,0x5a,0x01,0x32,0x35)
#endif
#else
typedef struct IFsrmFileManagementJobManagerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmFileManagementJobManager methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ActionVariables)(
        IFsrmFileManagementJobManager* This,
        SAFEARRAY **variables);

    HRESULT (STDMETHODCALLTYPE *get_ActionVariableDescriptions)(
        IFsrmFileManagementJobManager* This,
        SAFEARRAY **descriptions);

    HRESULT (STDMETHODCALLTYPE *EnumFileManagementJobs)(
        IFsrmFileManagementJobManager* This,
        FsrmEnumOptions options,
        IFsrmCollection **fileManagementJobs);

    HRESULT (STDMETHODCALLTYPE *CreateFileManagementJob)(
        IFsrmFileManagementJobManager* This,
        IFsrmFileManagementJob **fileManagementJob);

    HRESULT (STDMETHODCALLTYPE *GetFileManagementJob)(
        IFsrmFileManagementJobManager* This,
        BSTR name,
        IFsrmFileManagementJob **fileManagementJob);

    END_INTERFACE
} IFsrmFileManagementJobManagerVtbl;
interface IFsrmFileManagementJobManager {
    CONST_VTBL IFsrmFileManagementJobManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmFileManagementJobManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmFileManagementJobManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmFileManagementJobManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmFileManagementJobManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmFileManagementJobManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmFileManagementJobManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmFileManagementJobManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmFileManagementJobManager methods ***/
#define IFsrmFileManagementJobManager_get_ActionVariables(This,variables) (This)->lpVtbl->get_ActionVariables(This,variables)
#define IFsrmFileManagementJobManager_get_ActionVariableDescriptions(This,descriptions) (This)->lpVtbl->get_ActionVariableDescriptions(This,descriptions)
#define IFsrmFileManagementJobManager_EnumFileManagementJobs(This,options,fileManagementJobs) (This)->lpVtbl->EnumFileManagementJobs(This,options,fileManagementJobs)
#define IFsrmFileManagementJobManager_CreateFileManagementJob(This,fileManagementJob) (This)->lpVtbl->CreateFileManagementJob(This,fileManagementJob)
#define IFsrmFileManagementJobManager_GetFileManagementJob(This,name,fileManagementJob) (This)->lpVtbl->GetFileManagementJob(This,name,fileManagementJob)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFsrmFileManagementJobManager_QueryInterface(IFsrmFileManagementJobManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFsrmFileManagementJobManager_AddRef(IFsrmFileManagementJobManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFsrmFileManagementJobManager_Release(IFsrmFileManagementJobManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IFsrmFileManagementJobManager_GetTypeInfoCount(IFsrmFileManagementJobManager* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IFsrmFileManagementJobManager_GetTypeInfo(IFsrmFileManagementJobManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IFsrmFileManagementJobManager_GetIDsOfNames(IFsrmFileManagementJobManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IFsrmFileManagementJobManager_Invoke(IFsrmFileManagementJobManager* 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);
}
/*** IFsrmFileManagementJobManager methods ***/
static FORCEINLINE HRESULT IFsrmFileManagementJobManager_get_ActionVariables(IFsrmFileManagementJobManager* This,SAFEARRAY **variables) {
    return This->lpVtbl->get_ActionVariables(This,variables);
}
static FORCEINLINE HRESULT IFsrmFileManagementJobManager_get_ActionVariableDescriptions(IFsrmFileManagementJobManager* This,SAFEARRAY **descriptions) {
    return This->lpVtbl->get_ActionVariableDescriptions(This,descriptions);
}
static FORCEINLINE HRESULT IFsrmFileManagementJobManager_EnumFileManagementJobs(IFsrmFileManagementJobManager* This,FsrmEnumOptions options,IFsrmCollection **fileManagementJobs) {
    return This->lpVtbl->EnumFileManagementJobs(This,options,fileManagementJobs);
}
static FORCEINLINE HRESULT IFsrmFileManagementJobManager_CreateFileManagementJob(IFsrmFileManagementJobManager* This,IFsrmFileManagementJob **fileManagementJob) {
    return This->lpVtbl->CreateFileManagementJob(This,fileManagementJob);
}
static FORCEINLINE HRESULT IFsrmFileManagementJobManager_GetFileManagementJob(IFsrmFileManagementJobManager* This,BSTR name,IFsrmFileManagementJob **fileManagementJob) {
    return This->lpVtbl->GetFileManagementJob(This,name,fileManagementJob);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IFsrmFileManagementJobManager_get_ActionVariables_Proxy(
    IFsrmFileManagementJobManager* This,
    SAFEARRAY **variables);
void __RPC_STUB IFsrmFileManagementJobManager_get_ActionVariables_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJobManager_get_ActionVariableDescriptions_Proxy(
    IFsrmFileManagementJobManager* This,
    SAFEARRAY **descriptions);
void __RPC_STUB IFsrmFileManagementJobManager_get_ActionVariableDescriptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJobManager_EnumFileManagementJobs_Proxy(
    IFsrmFileManagementJobManager* This,
    FsrmEnumOptions options,
    IFsrmCollection **fileManagementJobs);
void __RPC_STUB IFsrmFileManagementJobManager_EnumFileManagementJobs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJobManager_CreateFileManagementJob_Proxy(
    IFsrmFileManagementJobManager* This,
    IFsrmFileManagementJob **fileManagementJob);
void __RPC_STUB IFsrmFileManagementJobManager_CreateFileManagementJob_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJobManager_GetFileManagementJob_Proxy(
    IFsrmFileManagementJobManager* This,
    BSTR name,
    IFsrmFileManagementJob **fileManagementJob);
void __RPC_STUB IFsrmFileManagementJobManager_GetFileManagementJob_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IFsrmFileManagementJobManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmPropertyCondition interface
 */
#ifndef __IFsrmPropertyCondition_INTERFACE_DEFINED__
#define __IFsrmPropertyCondition_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmPropertyCondition, 0x326af66f, 0x2ac0, 0x4f68, 0xbf,0x8c, 0x47,0x59,0xf0,0x54,0xfa,0x29);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("326af66f-2ac0-4f68-bf8c-4759f054fa29")
IFsrmPropertyCondition : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Name(
        BSTR name) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_Type(
        FsrmPropertyConditionType type) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Value(
        BSTR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Value(
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmPropertyCondition, 0x326af66f, 0x2ac0, 0x4f68, 0xbf,0x8c, 0x47,0x59,0xf0,0x54,0xfa,0x29)
#endif
#else
typedef struct IFsrmPropertyConditionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *get_Type)(
        IFsrmPropertyCondition* This,
        FsrmPropertyConditionType *type);

    HRESULT (STDMETHODCALLTYPE *put_Type)(
        IFsrmPropertyCondition* This,
        FsrmPropertyConditionType type);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        IFsrmPropertyCondition* This,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *put_Value)(
        IFsrmPropertyCondition* This,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmPropertyCondition* This);

    END_INTERFACE
} IFsrmPropertyConditionVtbl;
interface IFsrmPropertyCondition {
    CONST_VTBL IFsrmPropertyConditionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmPropertyCondition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmPropertyCondition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmPropertyCondition_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmPropertyCondition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmPropertyCondition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmPropertyCondition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmPropertyCondition_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmPropertyCondition methods ***/
#define IFsrmPropertyCondition_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
#define IFsrmPropertyCondition_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
#define IFsrmPropertyCondition_get_Type(This,type) (This)->lpVtbl->get_Type(This,type)
#define IFsrmPropertyCondition_put_Type(This,type) (This)->lpVtbl->put_Type(This,type)
#define IFsrmPropertyCondition_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#define IFsrmPropertyCondition_put_Value(This,value) (This)->lpVtbl->put_Value(This,value)
#define IFsrmPropertyCondition_Delete(This) (This)->lpVtbl->Delete(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFsrmPropertyCondition_QueryInterface(IFsrmPropertyCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFsrmPropertyCondition_AddRef(IFsrmPropertyCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFsrmPropertyCondition_Release(IFsrmPropertyCondition* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IFsrmPropertyCondition_GetTypeInfoCount(IFsrmPropertyCondition* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IFsrmPropertyCondition_GetTypeInfo(IFsrmPropertyCondition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IFsrmPropertyCondition_GetIDsOfNames(IFsrmPropertyCondition* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IFsrmPropertyCondition_Invoke(IFsrmPropertyCondition* 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);
}
/*** IFsrmPropertyCondition methods ***/
static FORCEINLINE HRESULT IFsrmPropertyCondition_get_Name(IFsrmPropertyCondition* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static FORCEINLINE HRESULT IFsrmPropertyCondition_put_Name(IFsrmPropertyCondition* This,BSTR name) {
    return This->lpVtbl->put_Name(This,name);
}
static FORCEINLINE HRESULT IFsrmPropertyCondition_get_Type(IFsrmPropertyCondition* This,FsrmPropertyConditionType *type) {
    return This->lpVtbl->get_Type(This,type);
}
static FORCEINLINE HRESULT IFsrmPropertyCondition_put_Type(IFsrmPropertyCondition* This,FsrmPropertyConditionType type) {
    return This->lpVtbl->put_Type(This,type);
}
static FORCEINLINE HRESULT IFsrmPropertyCondition_get_Value(IFsrmPropertyCondition* This,BSTR *value) {
    return This->lpVtbl->get_Value(This,value);
}
static FORCEINLINE HRESULT IFsrmPropertyCondition_put_Value(IFsrmPropertyCondition* This,BSTR value) {
    return This->lpVtbl->put_Value(This,value);
}
static FORCEINLINE HRESULT IFsrmPropertyCondition_Delete(IFsrmPropertyCondition* This) {
    return This->lpVtbl->Delete(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_get_Name_Proxy(
    IFsrmPropertyCondition* This,
    BSTR *name);
void __RPC_STUB IFsrmPropertyCondition_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_put_Name_Proxy(
    IFsrmPropertyCondition* This,
    BSTR name);
void __RPC_STUB IFsrmPropertyCondition_put_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_get_Type_Proxy(
    IFsrmPropertyCondition* This,
    FsrmPropertyConditionType *type);
void __RPC_STUB IFsrmPropertyCondition_get_Type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_put_Type_Proxy(
    IFsrmPropertyCondition* This,
    FsrmPropertyConditionType type);
void __RPC_STUB IFsrmPropertyCondition_put_Type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_get_Value_Proxy(
    IFsrmPropertyCondition* This,
    BSTR *value);
void __RPC_STUB IFsrmPropertyCondition_get_Value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_put_Value_Proxy(
    IFsrmPropertyCondition* This,
    BSTR value);
void __RPC_STUB IFsrmPropertyCondition_put_Value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_Delete_Proxy(
    IFsrmPropertyCondition* This);
void __RPC_STUB IFsrmPropertyCondition_Delete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IFsrmPropertyCondition_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmReportManager interface
 */
#ifndef __IFsrmReportManager_INTERFACE_DEFINED__
#define __IFsrmReportManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmReportManager, 0x27b899fe, 0x6ffa, 0x4481, 0xa1,0x84, 0xd3,0xda,0xad,0xe8,0xa0,0x2b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("27b899fe-6ffa-4481-a184-d3daade8a02b")
IFsrmReportManager : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE EnumReportJobs(
        FsrmEnumOptions options = FsrmEnumOptions_None,
        IFsrmCollection **reportJobs) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateReportJob(
        IFsrmReportJob **reportJob) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReportJob(
        BSTR taskName,
        IFsrmReportJob **reportJob) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputDirectory(
        FsrmReportGenerationContext context,
        BSTR *path) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputDirectory(
        FsrmReportGenerationContext context,
        BSTR path) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsFilterValidForReportType(
        FsrmReportType reportType,
        FsrmReportFilter filter,
        VARIANT_BOOL *valid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultFilter(
        FsrmReportType reportType,
        FsrmReportFilter filter,
        VARIANT *filterValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultFilter(
        FsrmReportType reportType,
        FsrmReportFilter filter,
        VARIANT filterValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReportSizeLimit(
        FsrmReportLimit limit,
        VARIANT *limitValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetReportSizeLimit(
        FsrmReportLimit limit,
        VARIANT limitValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmReportManager, 0x27b899fe, 0x6ffa, 0x4481, 0xa1,0x84, 0xd3,0xda,0xad,0xe8,0xa0,0x2b)
#endif
#else
typedef struct IFsrmReportManagerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmReportManager methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumReportJobs)(
        IFsrmReportManager* This,
        FsrmEnumOptions options,
        IFsrmCollection **reportJobs);

    HRESULT (STDMETHODCALLTYPE *CreateReportJob)(
        IFsrmReportManager* This,
        IFsrmReportJob **reportJob);

    HRESULT (STDMETHODCALLTYPE *GetReportJob)(
        IFsrmReportManager* This,
        BSTR taskName,
        IFsrmReportJob **reportJob);

    HRESULT (STDMETHODCALLTYPE *GetOutputDirectory)(
        IFsrmReportManager* This,
        FsrmReportGenerationContext context,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *SetOutputDirectory)(
        IFsrmReportManager* This,
        FsrmReportGenerationContext context,
        BSTR path);

    HRESULT (STDMETHODCALLTYPE *IsFilterValidForReportType)(
        IFsrmReportManager* This,
        FsrmReportType reportType,
        FsrmReportFilter filter,
        VARIANT_BOOL *valid);

    HRESULT (STDMETHODCALLTYPE *GetDefaultFilter)(
        IFsrmReportManager* This,
        FsrmReportType reportType,
        FsrmReportFilter filter,
        VARIANT *filterValue);

    HRESULT (STDMETHODCALLTYPE *SetDefaultFilter)(
        IFsrmReportManager* This,
        FsrmReportType reportType,
        FsrmReportFilter filter,
        VARIANT filterValue);

    HRESULT (STDMETHODCALLTYPE *GetReportSizeLimit)(
        IFsrmReportManager* This,
        FsrmReportLimit limit,
        VARIANT *limitValue);

    HRESULT (STDMETHODCALLTYPE *SetReportSizeLimit)(
        IFsrmReportManager* This,
        FsrmReportLimit limit,
        VARIANT limitValue);

    END_INTERFACE
} IFsrmReportManagerVtbl;
interface IFsrmReportManager {
    CONST_VTBL IFsrmReportManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmReportManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmReportManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmReportManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmReportManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmReportManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmReportManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmReportManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmReportManager methods ***/
#define IFsrmReportManager_EnumReportJobs(This,options,reportJobs) (This)->lpVtbl->EnumReportJobs(This,options,reportJobs)
#define IFsrmReportManager_CreateReportJob(This,reportJob) (This)->lpVtbl->CreateReportJob(This,reportJob)
#define IFsrmReportManager_GetReportJob(This,taskName,reportJob) (This)->lpVtbl->GetReportJob(This,taskName,reportJob)
#define IFsrmReportManager_GetOutputDirectory(This,context,path) (This)->lpVtbl->GetOutputDirectory(This,context,path)
#define IFsrmReportManager_SetOutputDirectory(This,context,path) (This)->lpVtbl->SetOutputDirectory(This,context,path)
#define IFsrmReportManager_IsFilterValidForReportType(This,reportType,filter,valid) (This)->lpVtbl->IsFilterValidForReportType(This,reportType,filter,valid)
#define IFsrmReportManager_GetDefaultFilter(This,reportType,filter,filterValue) (This)->lpVtbl->GetDefaultFilter(This,reportType,filter,filterValue)
#define IFsrmReportManager_SetDefaultFilter(This,reportType,filter,filterValue) (This)->lpVtbl->SetDefaultFilter(This,reportType,filter,filterValue)
#define IFsrmReportManager_GetReportSizeLimit(This,limit,limitValue) (This)->lpVtbl->GetReportSizeLimit(This,limit,limitValue)
#define IFsrmReportManager_SetReportSizeLimit(This,limit,limitValue) (This)->lpVtbl->SetReportSizeLimit(This,limit,limitValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFsrmReportManager_QueryInterface(IFsrmReportManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFsrmReportManager_AddRef(IFsrmReportManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFsrmReportManager_Release(IFsrmReportManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IFsrmReportManager_GetTypeInfoCount(IFsrmReportManager* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IFsrmReportManager_GetTypeInfo(IFsrmReportManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IFsrmReportManager_GetIDsOfNames(IFsrmReportManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IFsrmReportManager_Invoke(IFsrmReportManager* 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);
}
/*** IFsrmReportManager methods ***/
static FORCEINLINE HRESULT IFsrmReportManager_EnumReportJobs(IFsrmReportManager* This,FsrmEnumOptions options,IFsrmCollection **reportJobs) {
    return This->lpVtbl->EnumReportJobs(This,options,reportJobs);
}
static FORCEINLINE HRESULT IFsrmReportManager_CreateReportJob(IFsrmReportManager* This,IFsrmReportJob **reportJob) {
    return This->lpVtbl->CreateReportJob(This,reportJob);
}
static FORCEINLINE HRESULT IFsrmReportManager_GetReportJob(IFsrmReportManager* This,BSTR taskName,IFsrmReportJob **reportJob) {
    return This->lpVtbl->GetReportJob(This,taskName,reportJob);
}
static FORCEINLINE HRESULT IFsrmReportManager_GetOutputDirectory(IFsrmReportManager* This,FsrmReportGenerationContext context,BSTR *path) {
    return This->lpVtbl->GetOutputDirectory(This,context,path);
}
static FORCEINLINE HRESULT IFsrmReportManager_SetOutputDirectory(IFsrmReportManager* This,FsrmReportGenerationContext context,BSTR path) {
    return This->lpVtbl->SetOutputDirectory(This,context,path);
}
static FORCEINLINE HRESULT IFsrmReportManager_IsFilterValidForReportType(IFsrmReportManager* This,FsrmReportType reportType,FsrmReportFilter filter,VARIANT_BOOL *valid) {
    return This->lpVtbl->IsFilterValidForReportType(This,reportType,filter,valid);
}
static FORCEINLINE HRESULT IFsrmReportManager_GetDefaultFilter(IFsrmReportManager* This,FsrmReportType reportType,FsrmReportFilter filter,VARIANT *filterValue) {
    return This->lpVtbl->GetDefaultFilter(This,reportType,filter,filterValue);
}
static FORCEINLINE HRESULT IFsrmReportManager_SetDefaultFilter(IFsrmReportManager* This,FsrmReportType reportType,FsrmReportFilter filter,VARIANT filterValue) {
    return This->lpVtbl->SetDefaultFilter(This,reportType,filter,filterValue);
}
static FORCEINLINE HRESULT IFsrmReportManager_GetReportSizeLimit(IFsrmReportManager* This,FsrmReportLimit limit,VARIANT *limitValue) {
    return This->lpVtbl->GetReportSizeLimit(This,limit,limitValue);
}
static FORCEINLINE HRESULT IFsrmReportManager_SetReportSizeLimit(IFsrmReportManager* This,FsrmReportLimit limit,VARIANT limitValue) {
    return This->lpVtbl->SetReportSizeLimit(This,limit,limitValue);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IFsrmReportManager_EnumReportJobs_Proxy(
    IFsrmReportManager* This,
    FsrmEnumOptions options,
    IFsrmCollection **reportJobs);
void __RPC_STUB IFsrmReportManager_EnumReportJobs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportManager_CreateReportJob_Proxy(
    IFsrmReportManager* This,
    IFsrmReportJob **reportJob);
void __RPC_STUB IFsrmReportManager_CreateReportJob_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportManager_GetReportJob_Proxy(
    IFsrmReportManager* This,
    BSTR taskName,
    IFsrmReportJob **reportJob);
void __RPC_STUB IFsrmReportManager_GetReportJob_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportManager_GetOutputDirectory_Proxy(
    IFsrmReportManager* This,
    FsrmReportGenerationContext context,
    BSTR *path);
void __RPC_STUB IFsrmReportManager_GetOutputDirectory_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportManager_SetOutputDirectory_Proxy(
    IFsrmReportManager* This,
    FsrmReportGenerationContext context,
    BSTR path);
void __RPC_STUB IFsrmReportManager_SetOutputDirectory_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportManager_IsFilterValidForReportType_Proxy(
    IFsrmReportManager* This,
    FsrmReportType reportType,
    FsrmReportFilter filter,
    VARIANT_BOOL *valid);
void __RPC_STUB IFsrmReportManager_IsFilterValidForReportType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportManager_GetDefaultFilter_Proxy(
    IFsrmReportManager* This,
    FsrmReportType reportType,
    FsrmReportFilter filter,
    VARIANT *filterValue);
void __RPC_STUB IFsrmReportManager_GetDefaultFilter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportManager_SetDefaultFilter_Proxy(
    IFsrmReportManager* This,
    FsrmReportType reportType,
    FsrmReportFilter filter,
    VARIANT filterValue);
void __RPC_STUB IFsrmReportManager_SetDefaultFilter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportManager_GetReportSizeLimit_Proxy(
    IFsrmReportManager* This,
    FsrmReportLimit limit,
    VARIANT *limitValue);
void __RPC_STUB IFsrmReportManager_GetReportSizeLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportManager_SetReportSizeLimit_Proxy(
    IFsrmReportManager* This,
    FsrmReportLimit limit,
    VARIANT limitValue);
void __RPC_STUB IFsrmReportManager_SetReportSizeLimit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IFsrmReportManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmReportJob interface
 */
#ifndef __IFsrmReportJob_INTERFACE_DEFINED__
#define __IFsrmReportJob_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmReportJob, 0x38e87280, 0x715c, 0x4c7d, 0xa2,0x80, 0xea,0x16,0x51,0xa1,0x9f,0xef);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("38e87280-715c-4c7d-a280-ea1651a19fef")
IFsrmReportJob : public IFsrmObject
{
    virtual HRESULT STDMETHODCALLTYPE get_Task(
        BSTR *taskName) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Task(
        BSTR taskName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_NamespaceRoots(
        SAFEARRAY **namespaceRoots) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_NamespaceRoots(
        SAFEARRAY *namespaceRoots) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Formats(
        SAFEARRAY **formats) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Formats(
        SAFEARRAY *formats) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MailTo(
        BSTR *mailTo) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MailTo(
        BSTR mailTo) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RunningStatus(
        FsrmReportRunningStatus *runningStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LastRun(
        DATE *lastRun) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LastError(
        BSTR *lastError) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE EnumReports(
        IFsrmCollection **reports) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateReport(
        FsrmReportType reportType,
        IFsrmReport **report) = 0;

    virtual HRESULT STDMETHODCALLTYPE Run(
        FsrmReportGenerationContext context) = 0;

    virtual HRESULT STDMETHODCALLTYPE WaitForCompletion(
        LONG waitSeconds,
        VARIANT_BOOL *completed) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmReportJob, 0x38e87280, 0x715c, 0x4c7d, 0xa2,0x80, 0xea,0x16,0x51,0xa1,0x9f,0xef)
#endif
#else
typedef struct IFsrmReportJobVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmReportJob* This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmReportJob* This,
        BSTR *description);

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

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmReportJob* This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmReportJob* This);

    /*** IFsrmReportJob methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Task)(
        IFsrmReportJob* This,
        BSTR *taskName);

    HRESULT (STDMETHODCALLTYPE *put_Task)(
        IFsrmReportJob* This,
        BSTR taskName);

    HRESULT (STDMETHODCALLTYPE *get_NamespaceRoots)(
        IFsrmReportJob* This,
        SAFEARRAY **namespaceRoots);

    HRESULT (STDMETHODCALLTYPE *put_NamespaceRoots)(
        IFsrmReportJob* This,
        SAFEARRAY *namespaceRoots);

    HRESULT (STDMETHODCALLTYPE *get_Formats)(
        IFsrmReportJob* This,
        SAFEARRAY **formats);

    HRESULT (STDMETHODCALLTYPE *put_Formats)(
        IFsrmReportJob* This,
        SAFEARRAY *formats);

    HRESULT (STDMETHODCALLTYPE *get_MailTo)(
        IFsrmReportJob* This,
        BSTR *mailTo);

    HRESULT (STDMETHODCALLTYPE *put_MailTo)(
        IFsrmReportJob* This,
        BSTR mailTo);

    HRESULT (STDMETHODCALLTYPE *get_RunningStatus)(
        IFsrmReportJob* This,
        FsrmReportRunningStatus *runningStatus);

    HRESULT (STDMETHODCALLTYPE *get_LastRun)(
        IFsrmReportJob* This,
        DATE *lastRun);

    HRESULT (STDMETHODCALLTYPE *get_LastError)(
        IFsrmReportJob* This,
        BSTR *lastError);

    HRESULT (STDMETHODCALLTYPE *get_LastGeneratedInDirectory)(
        IFsrmReportJob* This,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *EnumReports)(
        IFsrmReportJob* This,
        IFsrmCollection **reports);

    HRESULT (STDMETHODCALLTYPE *CreateReport)(
        IFsrmReportJob* This,
        FsrmReportType reportType,
        IFsrmReport **report);

    HRESULT (STDMETHODCALLTYPE *Run)(
        IFsrmReportJob* This,
        FsrmReportGenerationContext context);

    HRESULT (STDMETHODCALLTYPE *WaitForCompletion)(
        IFsrmReportJob* This,
        LONG waitSeconds,
        VARIANT_BOOL *completed);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IFsrmReportJob* This);

    END_INTERFACE
} IFsrmReportJobVtbl;
interface IFsrmReportJob {
    CONST_VTBL IFsrmReportJobVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmReportJob_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmReportJob_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmReportJob_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmReportJob_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmReportJob_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmReportJob_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmReportJob_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmReportJob_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmReportJob_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmReportJob_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmReportJob_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmReportJob_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmReportJob methods ***/
#define IFsrmReportJob_get_Task(This,taskName) (This)->lpVtbl->get_Task(This,taskName)
#define IFsrmReportJob_put_Task(This,taskName) (This)->lpVtbl->put_Task(This,taskName)
#define IFsrmReportJob_get_NamespaceRoots(This,namespaceRoots) (This)->lpVtbl->get_NamespaceRoots(This,namespaceRoots)
#define IFsrmReportJob_put_NamespaceRoots(This,namespaceRoots) (This)->lpVtbl->put_NamespaceRoots(This,namespaceRoots)
#define IFsrmReportJob_get_Formats(This,formats) (This)->lpVtbl->get_Formats(This,formats)
#define IFsrmReportJob_put_Formats(This,formats) (This)->lpVtbl->put_Formats(This,formats)
#define IFsrmReportJob_get_MailTo(This,mailTo) (This)->lpVtbl->get_MailTo(This,mailTo)
#define IFsrmReportJob_put_MailTo(This,mailTo) (This)->lpVtbl->put_MailTo(This,mailTo)
#define IFsrmReportJob_get_RunningStatus(This,runningStatus) (This)->lpVtbl->get_RunningStatus(This,runningStatus)
#define IFsrmReportJob_get_LastRun(This,lastRun) (This)->lpVtbl->get_LastRun(This,lastRun)
#define IFsrmReportJob_get_LastError(This,lastError) (This)->lpVtbl->get_LastError(This,lastError)
#define IFsrmReportJob_get_LastGeneratedInDirectory(This,path) (This)->lpVtbl->get_LastGeneratedInDirectory(This,path)
#define IFsrmReportJob_EnumReports(This,reports) (This)->lpVtbl->EnumReports(This,reports)
#define IFsrmReportJob_CreateReport(This,reportType,report) (This)->lpVtbl->CreateReport(This,reportType,report)
#define IFsrmReportJob_Run(This,context) (This)->lpVtbl->Run(This,context)
#define IFsrmReportJob_WaitForCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForCompletion(This,waitSeconds,completed)
#define IFsrmReportJob_Cancel(This) (This)->lpVtbl->Cancel(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFsrmReportJob_QueryInterface(IFsrmReportJob* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFsrmReportJob_AddRef(IFsrmReportJob* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFsrmReportJob_Release(IFsrmReportJob* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IFsrmReportJob_GetTypeInfoCount(IFsrmReportJob* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IFsrmReportJob_GetTypeInfo(IFsrmReportJob* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IFsrmReportJob_GetIDsOfNames(IFsrmReportJob* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IFsrmReportJob_Invoke(IFsrmReportJob* 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);
}
/*** IFsrmObject methods ***/
static FORCEINLINE HRESULT IFsrmReportJob_get_Id(IFsrmReportJob* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static FORCEINLINE HRESULT IFsrmReportJob_get_Description(IFsrmReportJob* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static FORCEINLINE HRESULT IFsrmReportJob_put_Description(IFsrmReportJob* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static FORCEINLINE HRESULT IFsrmReportJob_Delete(IFsrmReportJob* This) {
    return This->lpVtbl->Delete(This);
}
static FORCEINLINE HRESULT IFsrmReportJob_Commit(IFsrmReportJob* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmReportJob methods ***/
static FORCEINLINE HRESULT IFsrmReportJob_get_Task(IFsrmReportJob* This,BSTR *taskName) {
    return This->lpVtbl->get_Task(This,taskName);
}
static FORCEINLINE HRESULT IFsrmReportJob_put_Task(IFsrmReportJob* This,BSTR taskName) {
    return This->lpVtbl->put_Task(This,taskName);
}
static FORCEINLINE HRESULT IFsrmReportJob_get_NamespaceRoots(IFsrmReportJob* This,SAFEARRAY **namespaceRoots) {
    return This->lpVtbl->get_NamespaceRoots(This,namespaceRoots);
}
static FORCEINLINE HRESULT IFsrmReportJob_put_NamespaceRoots(IFsrmReportJob* This,SAFEARRAY *namespaceRoots) {
    return This->lpVtbl->put_NamespaceRoots(This,namespaceRoots);
}
static FORCEINLINE HRESULT IFsrmReportJob_get_Formats(IFsrmReportJob* This,SAFEARRAY **formats) {
    return This->lpVtbl->get_Formats(This,formats);
}
static FORCEINLINE HRESULT IFsrmReportJob_put_Formats(IFsrmReportJob* This,SAFEARRAY *formats) {
    return This->lpVtbl->put_Formats(This,formats);
}
static FORCEINLINE HRESULT IFsrmReportJob_get_MailTo(IFsrmReportJob* This,BSTR *mailTo) {
    return This->lpVtbl->get_MailTo(This,mailTo);
}
static FORCEINLINE HRESULT IFsrmReportJob_put_MailTo(IFsrmReportJob* This,BSTR mailTo) {
    return This->lpVtbl->put_MailTo(This,mailTo);
}
static FORCEINLINE HRESULT IFsrmReportJob_get_RunningStatus(IFsrmReportJob* This,FsrmReportRunningStatus *runningStatus) {
    return This->lpVtbl->get_RunningStatus(This,runningStatus);
}
static FORCEINLINE HRESULT IFsrmReportJob_get_LastRun(IFsrmReportJob* This,DATE *lastRun) {
    return This->lpVtbl->get_LastRun(This,lastRun);
}
static FORCEINLINE HRESULT IFsrmReportJob_get_LastError(IFsrmReportJob* This,BSTR *lastError) {
    return This->lpVtbl->get_LastError(This,lastError);
}
static FORCEINLINE HRESULT IFsrmReportJob_get_LastGeneratedInDirectory(IFsrmReportJob* This,BSTR *path) {
    return This->lpVtbl->get_LastGeneratedInDirectory(This,path);
}
static FORCEINLINE HRESULT IFsrmReportJob_EnumReports(IFsrmReportJob* This,IFsrmCollection **reports) {
    return This->lpVtbl->EnumReports(This,reports);
}
static FORCEINLINE HRESULT IFsrmReportJob_CreateReport(IFsrmReportJob* This,FsrmReportType reportType,IFsrmReport **report) {
    return This->lpVtbl->CreateReport(This,reportType,report);
}
static FORCEINLINE HRESULT IFsrmReportJob_Run(IFsrmReportJob* This,FsrmReportGenerationContext context) {
    return This->lpVtbl->Run(This,context);
}
static FORCEINLINE HRESULT IFsrmReportJob_WaitForCompletion(IFsrmReportJob* This,LONG waitSeconds,VARIANT_BOOL *completed) {
    return This->lpVtbl->WaitForCompletion(This,waitSeconds,completed);
}
static FORCEINLINE HRESULT IFsrmReportJob_Cancel(IFsrmReportJob* This) {
    return This->lpVtbl->Cancel(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_Task_Proxy(
    IFsrmReportJob* This,
    BSTR *taskName);
void __RPC_STUB IFsrmReportJob_get_Task_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_put_Task_Proxy(
    IFsrmReportJob* This,
    BSTR taskName);
void __RPC_STUB IFsrmReportJob_put_Task_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_NamespaceRoots_Proxy(
    IFsrmReportJob* This,
    SAFEARRAY **namespaceRoots);
void __RPC_STUB IFsrmReportJob_get_NamespaceRoots_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_put_NamespaceRoots_Proxy(
    IFsrmReportJob* This,
    SAFEARRAY *namespaceRoots);
void __RPC_STUB IFsrmReportJob_put_NamespaceRoots_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_Formats_Proxy(
    IFsrmReportJob* This,
    SAFEARRAY **formats);
void __RPC_STUB IFsrmReportJob_get_Formats_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_put_Formats_Proxy(
    IFsrmReportJob* This,
    SAFEARRAY *formats);
void __RPC_STUB IFsrmReportJob_put_Formats_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_MailTo_Proxy(
    IFsrmReportJob* This,
    BSTR *mailTo);
void __RPC_STUB IFsrmReportJob_get_MailTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_put_MailTo_Proxy(
    IFsrmReportJob* This,
    BSTR mailTo);
void __RPC_STUB IFsrmReportJob_put_MailTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_RunningStatus_Proxy(
    IFsrmReportJob* This,
    FsrmReportRunningStatus *runningStatus);
void __RPC_STUB IFsrmReportJob_get_RunningStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_LastRun_Proxy(
    IFsrmReportJob* This,
    DATE *lastRun);
void __RPC_STUB IFsrmReportJob_get_LastRun_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_LastError_Proxy(
    IFsrmReportJob* This,
    BSTR *lastError);
void __RPC_STUB IFsrmReportJob_get_LastError_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_LastGeneratedInDirectory_Proxy(
    IFsrmReportJob* This,
    BSTR *path);
void __RPC_STUB IFsrmReportJob_get_LastGeneratedInDirectory_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_EnumReports_Proxy(
    IFsrmReportJob* This,
    IFsrmCollection **reports);
void __RPC_STUB IFsrmReportJob_EnumReports_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_CreateReport_Proxy(
    IFsrmReportJob* This,
    FsrmReportType reportType,
    IFsrmReport **report);
void __RPC_STUB IFsrmReportJob_CreateReport_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_Run_Proxy(
    IFsrmReportJob* This,
    FsrmReportGenerationContext context);
void __RPC_STUB IFsrmReportJob_Run_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_WaitForCompletion_Proxy(
    IFsrmReportJob* This,
    LONG waitSeconds,
    VARIANT_BOOL *completed);
void __RPC_STUB IFsrmReportJob_WaitForCompletion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmReportJob_Cancel_Proxy(
    IFsrmReportJob* This);
void __RPC_STUB IFsrmReportJob_Cancel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IFsrmReportJob_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmFileManagementJob interface
 */
#ifndef __IFsrmFileManagementJob_INTERFACE_DEFINED__
#define __IFsrmFileManagementJob_INTERFACE_DEFINED__

#define FsrmDaysNotSpecified (-1)

#define FsrmDateNotSpecified ((DATE)-1)

DEFINE_GUID(IID_IFsrmFileManagementJob, 0x0770687e, 0x9f36, 0x4d6f, 0x87,0x78, 0x59,0x9d,0x18,0x84,0x61,0xc9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0770687e-9f36-4d6f-8778-599d188461c9")
IFsrmFileManagementJob : public IFsrmObject
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Name(
        BSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_NamespaceRoots(
        SAFEARRAY **namespaceRoots) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_NamespaceRoots(
        SAFEARRAY *namespaceRoots) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_Enabled(
        VARIANT_BOOL enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_OperationType(
        FsrmFileManagementType *operationType) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_OperationType(
        FsrmFileManagementType operationType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ExpirationDirectory(
        BSTR *expirationDirectory) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ExpirationDirectory(
        BSTR expirationDirectory) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CustomAction(
        IFsrmActionCommand **action) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Notifications(
        SAFEARRAY **notifications) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Logging(
        LONG *loggingFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Logging(
        LONG loggingFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ReportEnabled(
        VARIANT_BOOL *reportEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ReportEnabled(
        VARIANT_BOOL reportEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Formats(
        SAFEARRAY **formats) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Formats(
        SAFEARRAY *formats) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MailTo(
        BSTR *mailTo) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MailTo(
        BSTR mailTo) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DaysSinceFileCreated(
        LONG *daysSinceCreation) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DaysSinceFileCreated(
        LONG daysSinceCreation) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DaysSinceFileLastAccessed(
        LONG *daysSinceAccess) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DaysSinceFileLastAccessed(
        LONG daysSinceAccess) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DaysSinceFileLastModified(
        LONG *daysSinceModify) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DaysSinceFileLastModified(
        LONG daysSinceModify) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PropertyConditions(
        IFsrmCollection **propertyConditions) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FromDate(
        DATE *fromDate) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_FromDate(
        DATE fromDate) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Task(
        BSTR *taskName) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Task(
        BSTR taskName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Parameters(
        SAFEARRAY **parameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Parameters(
        SAFEARRAY *parameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RunningStatus(
        FsrmReportRunningStatus *runningStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LastError(
        BSTR *lastError) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_LastRun(
        DATE *lastRun) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FileNamePattern(
        BSTR *fileNamePattern) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_FileNamePattern(
        BSTR fileNamePattern) = 0;

    virtual HRESULT STDMETHODCALLTYPE Run(
        FsrmReportGenerationContext context) = 0;

    virtual HRESULT STDMETHODCALLTYPE WaitForCompletion(
        LONG waitSeconds,
        VARIANT_BOOL *completed) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddNotification(
        LONG days) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteNotification(
        LONG days) = 0;

    virtual HRESULT STDMETHODCALLTYPE ModifyNotification(
        LONG days,
        LONG newDays) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateNotificationAction(
        LONG days,
        FsrmActionType actionType,
        IFsrmAction **action) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumNotificationActions(
        LONG days,
        IFsrmCollection **actions) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePropertyCondition(
        BSTR name,
        IFsrmPropertyCondition **propertyCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCustomAction(
        IFsrmActionCommand **customAction) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmFileManagementJob, 0x0770687e, 0x9f36, 0x4d6f, 0x87,0x78, 0x59,0x9d,0x18,0x84,0x61,0xc9)
#endif
#else
typedef struct IFsrmFileManagementJobVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmFileManagementJob* This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmFileManagementJob* This,
        BSTR *description);

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

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmFileManagementJob* This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmFileManagementJob* This);

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

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

    HRESULT (STDMETHODCALLTYPE *get_NamespaceRoots)(
        IFsrmFileManagementJob* This,
        SAFEARRAY **namespaceRoots);

    HRESULT (STDMETHODCALLTYPE *put_NamespaceRoots)(
        IFsrmFileManagementJob* This,
        SAFEARRAY *namespaceRoots);

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

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

    HRESULT (STDMETHODCALLTYPE *get_OperationType)(
        IFsrmFileManagementJob* This,
        FsrmFileManagementType *operationType);

    HRESULT (STDMETHODCALLTYPE *put_OperationType)(
        IFsrmFileManagementJob* This,
        FsrmFileManagementType operationType);

    HRESULT (STDMETHODCALLTYPE *get_ExpirationDirectory)(
        IFsrmFileManagementJob* This,
        BSTR *expirationDirectory);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationDirectory)(
        IFsrmFileManagementJob* This,
        BSTR expirationDirectory);

    HRESULT (STDMETHODCALLTYPE *get_CustomAction)(
        IFsrmFileManagementJob* This,
        IFsrmActionCommand **action);

    HRESULT (STDMETHODCALLTYPE *get_Notifications)(
        IFsrmFileManagementJob* This,
        SAFEARRAY **notifications);

    HRESULT (STDMETHODCALLTYPE *get_Logging)(
        IFsrmFileManagementJob* This,
        LONG *loggingFlags);

    HRESULT (STDMETHODCALLTYPE *put_Logging)(
        IFsrmFileManagementJob* This,
        LONG loggingFlags);

    HRESULT (STDMETHODCALLTYPE *get_ReportEnabled)(
        IFsrmFileManagementJob* This,
        VARIANT_BOOL *reportEnabled);

    HRESULT (STDMETHODCALLTYPE *put_ReportEnabled)(
        IFsrmFileManagementJob* This,
        VARIANT_BOOL reportEnabled);

    HRESULT (STDMETHODCALLTYPE *get_Formats)(
        IFsrmFileManagementJob* This,
        SAFEARRAY **formats);

    HRESULT (STDMETHODCALLTYPE *put_Formats)(
        IFsrmFileManagementJob* This,
        SAFEARRAY *formats);

    HRESULT (STDMETHODCALLTYPE *get_MailTo)(
        IFsrmFileManagementJob* This,
        BSTR *mailTo);

    HRESULT (STDMETHODCALLTYPE *put_MailTo)(
        IFsrmFileManagementJob* This,
        BSTR mailTo);

    HRESULT (STDMETHODCALLTYPE *get_DaysSinceFileCreated)(
        IFsrmFileManagementJob* This,
        LONG *daysSinceCreation);

    HRESULT (STDMETHODCALLTYPE *put_DaysSinceFileCreated)(
        IFsrmFileManagementJob* This,
        LONG daysSinceCreation);

    HRESULT (STDMETHODCALLTYPE *get_DaysSinceFileLastAccessed)(
        IFsrmFileManagementJob* This,
        LONG *daysSinceAccess);

    HRESULT (STDMETHODCALLTYPE *put_DaysSinceFileLastAccessed)(
        IFsrmFileManagementJob* This,
        LONG daysSinceAccess);

    HRESULT (STDMETHODCALLTYPE *get_DaysSinceFileLastModified)(
        IFsrmFileManagementJob* This,
        LONG *daysSinceModify);

    HRESULT (STDMETHODCALLTYPE *put_DaysSinceFileLastModified)(
        IFsrmFileManagementJob* This,
        LONG daysSinceModify);

    HRESULT (STDMETHODCALLTYPE *get_PropertyConditions)(
        IFsrmFileManagementJob* This,
        IFsrmCollection **propertyConditions);

    HRESULT (STDMETHODCALLTYPE *get_FromDate)(
        IFsrmFileManagementJob* This,
        DATE *fromDate);

    HRESULT (STDMETHODCALLTYPE *put_FromDate)(
        IFsrmFileManagementJob* This,
        DATE fromDate);

    HRESULT (STDMETHODCALLTYPE *get_Task)(
        IFsrmFileManagementJob* This,
        BSTR *taskName);

    HRESULT (STDMETHODCALLTYPE *put_Task)(
        IFsrmFileManagementJob* This,
        BSTR taskName);

    HRESULT (STDMETHODCALLTYPE *get_Parameters)(
        IFsrmFileManagementJob* This,
        SAFEARRAY **parameters);

    HRESULT (STDMETHODCALLTYPE *put_Parameters)(
        IFsrmFileManagementJob* This,
        SAFEARRAY *parameters);

    HRESULT (STDMETHODCALLTYPE *get_RunningStatus)(
        IFsrmFileManagementJob* This,
        FsrmReportRunningStatus *runningStatus);

    HRESULT (STDMETHODCALLTYPE *get_LastError)(
        IFsrmFileManagementJob* This,
        BSTR *lastError);

    HRESULT (STDMETHODCALLTYPE *get_LastReportPathWithoutExtension)(
        IFsrmFileManagementJob* This,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *get_LastRun)(
        IFsrmFileManagementJob* This,
        DATE *lastRun);

    HRESULT (STDMETHODCALLTYPE *get_FileNamePattern)(
        IFsrmFileManagementJob* This,
        BSTR *fileNamePattern);

    HRESULT (STDMETHODCALLTYPE *put_FileNamePattern)(
        IFsrmFileManagementJob* This,
        BSTR fileNamePattern);

    HRESULT (STDMETHODCALLTYPE *Run)(
        IFsrmFileManagementJob* This,
        FsrmReportGenerationContext context);

    HRESULT (STDMETHODCALLTYPE *WaitForCompletion)(
        IFsrmFileManagementJob* This,
        LONG waitSeconds,
        VARIANT_BOOL *completed);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IFsrmFileManagementJob* This);

    HRESULT (STDMETHODCALLTYPE *AddNotification)(
        IFsrmFileManagementJob* This,
        LONG days);

    HRESULT (STDMETHODCALLTYPE *DeleteNotification)(
        IFsrmFileManagementJob* This,
        LONG days);

    HRESULT (STDMETHODCALLTYPE *ModifyNotification)(
        IFsrmFileManagementJob* This,
        LONG days,
        LONG newDays);

    HRESULT (STDMETHODCALLTYPE *CreateNotificationAction)(
        IFsrmFileManagementJob* This,
        LONG days,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumNotificationActions)(
        IFsrmFileManagementJob* This,
        LONG days,
        IFsrmCollection **actions);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyCondition)(
        IFsrmFileManagementJob* This,
        BSTR name,
        IFsrmPropertyCondition **propertyCondition);

    HRESULT (STDMETHODCALLTYPE *CreateCustomAction)(
        IFsrmFileManagementJob* This,
        IFsrmActionCommand **customAction);

    END_INTERFACE
} IFsrmFileManagementJobVtbl;
interface IFsrmFileManagementJob {
    CONST_VTBL IFsrmFileManagementJobVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmFileManagementJob_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmFileManagementJob_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmFileManagementJob_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmFileManagementJob_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmFileManagementJob_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmFileManagementJob_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmFileManagementJob_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmFileManagementJob_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmFileManagementJob_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmFileManagementJob_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmFileManagementJob_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmFileManagementJob_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmFileManagementJob methods ***/
#define IFsrmFileManagementJob_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
#define IFsrmFileManagementJob_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
#define IFsrmFileManagementJob_get_NamespaceRoots(This,namespaceRoots) (This)->lpVtbl->get_NamespaceRoots(This,namespaceRoots)
#define IFsrmFileManagementJob_put_NamespaceRoots(This,namespaceRoots) (This)->lpVtbl->put_NamespaceRoots(This,namespaceRoots)
#define IFsrmFileManagementJob_get_Enabled(This,enabled) (This)->lpVtbl->get_Enabled(This,enabled)
#define IFsrmFileManagementJob_put_Enabled(This,enabled) (This)->lpVtbl->put_Enabled(This,enabled)
#define IFsrmFileManagementJob_get_OperationType(This,operationType) (This)->lpVtbl->get_OperationType(This,operationType)
#define IFsrmFileManagementJob_put_OperationType(This,operationType) (This)->lpVtbl->put_OperationType(This,operationType)
#define IFsrmFileManagementJob_get_ExpirationDirectory(This,expirationDirectory) (This)->lpVtbl->get_ExpirationDirectory(This,expirationDirectory)
#define IFsrmFileManagementJob_put_ExpirationDirectory(This,expirationDirectory) (This)->lpVtbl->put_ExpirationDirectory(This,expirationDirectory)
#define IFsrmFileManagementJob_get_CustomAction(This,action) (This)->lpVtbl->get_CustomAction(This,action)
#define IFsrmFileManagementJob_get_Notifications(This,notifications) (This)->lpVtbl->get_Notifications(This,notifications)
#define IFsrmFileManagementJob_get_Logging(This,loggingFlags) (This)->lpVtbl->get_Logging(This,loggingFlags)
#define IFsrmFileManagementJob_put_Logging(This,loggingFlags) (This)->lpVtbl->put_Logging(This,loggingFlags)
#define IFsrmFileManagementJob_get_ReportEnabled(This,reportEnabled) (This)->lpVtbl->get_ReportEnabled(This,reportEnabled)
#define IFsrmFileManagementJob_put_ReportEnabled(This,reportEnabled) (This)->lpVtbl->put_ReportEnabled(This,reportEnabled)
#define IFsrmFileManagementJob_get_Formats(This,formats) (This)->lpVtbl->get_Formats(This,formats)
#define IFsrmFileManagementJob_put_Formats(This,formats) (This)->lpVtbl->put_Formats(This,formats)
#define IFsrmFileManagementJob_get_MailTo(This,mailTo) (This)->lpVtbl->get_MailTo(This,mailTo)
#define IFsrmFileManagementJob_put_MailTo(This,mailTo) (This)->lpVtbl->put_MailTo(This,mailTo)
#define IFsrmFileManagementJob_get_DaysSinceFileCreated(This,daysSinceCreation) (This)->lpVtbl->get_DaysSinceFileCreated(This,daysSinceCreation)
#define IFsrmFileManagementJob_put_DaysSinceFileCreated(This,daysSinceCreation) (This)->lpVtbl->put_DaysSinceFileCreated(This,daysSinceCreation)
#define IFsrmFileManagementJob_get_DaysSinceFileLastAccessed(This,daysSinceAccess) (This)->lpVtbl->get_DaysSinceFileLastAccessed(This,daysSinceAccess)
#define IFsrmFileManagementJob_put_DaysSinceFileLastAccessed(This,daysSinceAccess) (This)->lpVtbl->put_DaysSinceFileLastAccessed(This,daysSinceAccess)
#define IFsrmFileManagementJob_get_DaysSinceFileLastModified(This,daysSinceModify) (This)->lpVtbl->get_DaysSinceFileLastModified(This,daysSinceModify)
#define IFsrmFileManagementJob_put_DaysSinceFileLastModified(This,daysSinceModify) (This)->lpVtbl->put_DaysSinceFileLastModified(This,daysSinceModify)
#define IFsrmFileManagementJob_get_PropertyConditions(This,propertyConditions) (This)->lpVtbl->get_PropertyConditions(This,propertyConditions)
#define IFsrmFileManagementJob_get_FromDate(This,fromDate) (This)->lpVtbl->get_FromDate(This,fromDate)
#define IFsrmFileManagementJob_put_FromDate(This,fromDate) (This)->lpVtbl->put_FromDate(This,fromDate)
#define IFsrmFileManagementJob_get_Task(This,taskName) (This)->lpVtbl->get_Task(This,taskName)
#define IFsrmFileManagementJob_put_Task(This,taskName) (This)->lpVtbl->put_Task(This,taskName)
#define IFsrmFileManagementJob_get_Parameters(This,parameters) (This)->lpVtbl->get_Parameters(This,parameters)
#define IFsrmFileManagementJob_put_Parameters(This,parameters) (This)->lpVtbl->put_Parameters(This,parameters)
#define IFsrmFileManagementJob_get_RunningStatus(This,runningStatus) (This)->lpVtbl->get_RunningStatus(This,runningStatus)
#define IFsrmFileManagementJob_get_LastError(This,lastError) (This)->lpVtbl->get_LastError(This,lastError)
#define IFsrmFileManagementJob_get_LastReportPathWithoutExtension(This,path) (This)->lpVtbl->get_LastReportPathWithoutExtension(This,path)
#define IFsrmFileManagementJob_get_LastRun(This,lastRun) (This)->lpVtbl->get_LastRun(This,lastRun)
#define IFsrmFileManagementJob_get_FileNamePattern(This,fileNamePattern) (This)->lpVtbl->get_FileNamePattern(This,fileNamePattern)
#define IFsrmFileManagementJob_put_FileNamePattern(This,fileNamePattern) (This)->lpVtbl->put_FileNamePattern(This,fileNamePattern)
#define IFsrmFileManagementJob_Run(This,context) (This)->lpVtbl->Run(This,context)
#define IFsrmFileManagementJob_WaitForCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForCompletion(This,waitSeconds,completed)
#define IFsrmFileManagementJob_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IFsrmFileManagementJob_AddNotification(This,days) (This)->lpVtbl->AddNotification(This,days)
#define IFsrmFileManagementJob_DeleteNotification(This,days) (This)->lpVtbl->DeleteNotification(This,days)
#define IFsrmFileManagementJob_ModifyNotification(This,days,newDays) (This)->lpVtbl->ModifyNotification(This,days,newDays)
#define IFsrmFileManagementJob_CreateNotificationAction(This,days,actionType,action) (This)->lpVtbl->CreateNotificationAction(This,days,actionType,action)
#define IFsrmFileManagementJob_EnumNotificationActions(This,days,actions) (This)->lpVtbl->EnumNotificationActions(This,days,actions)
#define IFsrmFileManagementJob_CreatePropertyCondition(This,name,propertyCondition) (This)->lpVtbl->CreatePropertyCondition(This,name,propertyCondition)
#define IFsrmFileManagementJob_CreateCustomAction(This,customAction) (This)->lpVtbl->CreateCustomAction(This,customAction)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFsrmFileManagementJob_QueryInterface(IFsrmFileManagementJob* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFsrmFileManagementJob_AddRef(IFsrmFileManagementJob* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFsrmFileManagementJob_Release(IFsrmFileManagementJob* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IFsrmFileManagementJob_GetTypeInfoCount(IFsrmFileManagementJob* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_GetTypeInfo(IFsrmFileManagementJob* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_GetIDsOfNames(IFsrmFileManagementJob* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_Invoke(IFsrmFileManagementJob* 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);
}
/*** IFsrmObject methods ***/
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Id(IFsrmFileManagementJob* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Description(IFsrmFileManagementJob* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Description(IFsrmFileManagementJob* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_Delete(IFsrmFileManagementJob* This) {
    return This->lpVtbl->Delete(This);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_Commit(IFsrmFileManagementJob* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmFileManagementJob methods ***/
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Name(IFsrmFileManagementJob* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Name(IFsrmFileManagementJob* This,BSTR name) {
    return This->lpVtbl->put_Name(This,name);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_NamespaceRoots(IFsrmFileManagementJob* This,SAFEARRAY **namespaceRoots) {
    return This->lpVtbl->get_NamespaceRoots(This,namespaceRoots);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_NamespaceRoots(IFsrmFileManagementJob* This,SAFEARRAY *namespaceRoots) {
    return This->lpVtbl->put_NamespaceRoots(This,namespaceRoots);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Enabled(IFsrmFileManagementJob* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->get_Enabled(This,enabled);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Enabled(IFsrmFileManagementJob* This,VARIANT_BOOL enabled) {
    return This->lpVtbl->put_Enabled(This,enabled);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_OperationType(IFsrmFileManagementJob* This,FsrmFileManagementType *operationType) {
    return This->lpVtbl->get_OperationType(This,operationType);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_OperationType(IFsrmFileManagementJob* This,FsrmFileManagementType operationType) {
    return This->lpVtbl->put_OperationType(This,operationType);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_ExpirationDirectory(IFsrmFileManagementJob* This,BSTR *expirationDirectory) {
    return This->lpVtbl->get_ExpirationDirectory(This,expirationDirectory);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_ExpirationDirectory(IFsrmFileManagementJob* This,BSTR expirationDirectory) {
    return This->lpVtbl->put_ExpirationDirectory(This,expirationDirectory);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_CustomAction(IFsrmFileManagementJob* This,IFsrmActionCommand **action) {
    return This->lpVtbl->get_CustomAction(This,action);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Notifications(IFsrmFileManagementJob* This,SAFEARRAY **notifications) {
    return This->lpVtbl->get_Notifications(This,notifications);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Logging(IFsrmFileManagementJob* This,LONG *loggingFlags) {
    return This->lpVtbl->get_Logging(This,loggingFlags);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Logging(IFsrmFileManagementJob* This,LONG loggingFlags) {
    return This->lpVtbl->put_Logging(This,loggingFlags);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_ReportEnabled(IFsrmFileManagementJob* This,VARIANT_BOOL *reportEnabled) {
    return This->lpVtbl->get_ReportEnabled(This,reportEnabled);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_ReportEnabled(IFsrmFileManagementJob* This,VARIANT_BOOL reportEnabled) {
    return This->lpVtbl->put_ReportEnabled(This,reportEnabled);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Formats(IFsrmFileManagementJob* This,SAFEARRAY **formats) {
    return This->lpVtbl->get_Formats(This,formats);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Formats(IFsrmFileManagementJob* This,SAFEARRAY *formats) {
    return This->lpVtbl->put_Formats(This,formats);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_MailTo(IFsrmFileManagementJob* This,BSTR *mailTo) {
    return This->lpVtbl->get_MailTo(This,mailTo);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_MailTo(IFsrmFileManagementJob* This,BSTR mailTo) {
    return This->lpVtbl->put_MailTo(This,mailTo);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_DaysSinceFileCreated(IFsrmFileManagementJob* This,LONG *daysSinceCreation) {
    return This->lpVtbl->get_DaysSinceFileCreated(This,daysSinceCreation);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_DaysSinceFileCreated(IFsrmFileManagementJob* This,LONG daysSinceCreation) {
    return This->lpVtbl->put_DaysSinceFileCreated(This,daysSinceCreation);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_DaysSinceFileLastAccessed(IFsrmFileManagementJob* This,LONG *daysSinceAccess) {
    return This->lpVtbl->get_DaysSinceFileLastAccessed(This,daysSinceAccess);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_DaysSinceFileLastAccessed(IFsrmFileManagementJob* This,LONG daysSinceAccess) {
    return This->lpVtbl->put_DaysSinceFileLastAccessed(This,daysSinceAccess);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_DaysSinceFileLastModified(IFsrmFileManagementJob* This,LONG *daysSinceModify) {
    return This->lpVtbl->get_DaysSinceFileLastModified(This,daysSinceModify);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_DaysSinceFileLastModified(IFsrmFileManagementJob* This,LONG daysSinceModify) {
    return This->lpVtbl->put_DaysSinceFileLastModified(This,daysSinceModify);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_PropertyConditions(IFsrmFileManagementJob* This,IFsrmCollection **propertyConditions) {
    return This->lpVtbl->get_PropertyConditions(This,propertyConditions);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_FromDate(IFsrmFileManagementJob* This,DATE *fromDate) {
    return This->lpVtbl->get_FromDate(This,fromDate);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_FromDate(IFsrmFileManagementJob* This,DATE fromDate) {
    return This->lpVtbl->put_FromDate(This,fromDate);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Task(IFsrmFileManagementJob* This,BSTR *taskName) {
    return This->lpVtbl->get_Task(This,taskName);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Task(IFsrmFileManagementJob* This,BSTR taskName) {
    return This->lpVtbl->put_Task(This,taskName);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Parameters(IFsrmFileManagementJob* This,SAFEARRAY **parameters) {
    return This->lpVtbl->get_Parameters(This,parameters);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Parameters(IFsrmFileManagementJob* This,SAFEARRAY *parameters) {
    return This->lpVtbl->put_Parameters(This,parameters);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_RunningStatus(IFsrmFileManagementJob* This,FsrmReportRunningStatus *runningStatus) {
    return This->lpVtbl->get_RunningStatus(This,runningStatus);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_LastError(IFsrmFileManagementJob* This,BSTR *lastError) {
    return This->lpVtbl->get_LastError(This,lastError);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_LastReportPathWithoutExtension(IFsrmFileManagementJob* This,BSTR *path) {
    return This->lpVtbl->get_LastReportPathWithoutExtension(This,path);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_LastRun(IFsrmFileManagementJob* This,DATE *lastRun) {
    return This->lpVtbl->get_LastRun(This,lastRun);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_get_FileNamePattern(IFsrmFileManagementJob* This,BSTR *fileNamePattern) {
    return This->lpVtbl->get_FileNamePattern(This,fileNamePattern);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_put_FileNamePattern(IFsrmFileManagementJob* This,BSTR fileNamePattern) {
    return This->lpVtbl->put_FileNamePattern(This,fileNamePattern);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_Run(IFsrmFileManagementJob* This,FsrmReportGenerationContext context) {
    return This->lpVtbl->Run(This,context);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_WaitForCompletion(IFsrmFileManagementJob* This,LONG waitSeconds,VARIANT_BOOL *completed) {
    return This->lpVtbl->WaitForCompletion(This,waitSeconds,completed);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_Cancel(IFsrmFileManagementJob* This) {
    return This->lpVtbl->Cancel(This);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_AddNotification(IFsrmFileManagementJob* This,LONG days) {
    return This->lpVtbl->AddNotification(This,days);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_DeleteNotification(IFsrmFileManagementJob* This,LONG days) {
    return This->lpVtbl->DeleteNotification(This,days);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_ModifyNotification(IFsrmFileManagementJob* This,LONG days,LONG newDays) {
    return This->lpVtbl->ModifyNotification(This,days,newDays);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_CreateNotificationAction(IFsrmFileManagementJob* This,LONG days,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateNotificationAction(This,days,actionType,action);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_EnumNotificationActions(IFsrmFileManagementJob* This,LONG days,IFsrmCollection **actions) {
    return This->lpVtbl->EnumNotificationActions(This,days,actions);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_CreatePropertyCondition(IFsrmFileManagementJob* This,BSTR name,IFsrmPropertyCondition **propertyCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,name,propertyCondition);
}
static FORCEINLINE HRESULT IFsrmFileManagementJob_CreateCustomAction(IFsrmFileManagementJob* This,IFsrmActionCommand **customAction) {
    return This->lpVtbl->CreateCustomAction(This,customAction);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Name_Proxy(
    IFsrmFileManagementJob* This,
    BSTR *name);
void __RPC_STUB IFsrmFileManagementJob_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_Name_Proxy(
    IFsrmFileManagementJob* This,
    BSTR name);
void __RPC_STUB IFsrmFileManagementJob_put_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_NamespaceRoots_Proxy(
    IFsrmFileManagementJob* This,
    SAFEARRAY **namespaceRoots);
void __RPC_STUB IFsrmFileManagementJob_get_NamespaceRoots_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_NamespaceRoots_Proxy(
    IFsrmFileManagementJob* This,
    SAFEARRAY *namespaceRoots);
void __RPC_STUB IFsrmFileManagementJob_put_NamespaceRoots_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Enabled_Proxy(
    IFsrmFileManagementJob* This,
    VARIANT_BOOL *enabled);
void __RPC_STUB IFsrmFileManagementJob_get_Enabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_Enabled_Proxy(
    IFsrmFileManagementJob* This,
    VARIANT_BOOL enabled);
void __RPC_STUB IFsrmFileManagementJob_put_Enabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_OperationType_Proxy(
    IFsrmFileManagementJob* This,
    FsrmFileManagementType *operationType);
void __RPC_STUB IFsrmFileManagementJob_get_OperationType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_OperationType_Proxy(
    IFsrmFileManagementJob* This,
    FsrmFileManagementType operationType);
void __RPC_STUB IFsrmFileManagementJob_put_OperationType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_ExpirationDirectory_Proxy(
    IFsrmFileManagementJob* This,
    BSTR *expirationDirectory);
void __RPC_STUB IFsrmFileManagementJob_get_ExpirationDirectory_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_ExpirationDirectory_Proxy(
    IFsrmFileManagementJob* This,
    BSTR expirationDirectory);
void __RPC_STUB IFsrmFileManagementJob_put_ExpirationDirectory_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_CustomAction_Proxy(
    IFsrmFileManagementJob* This,
    IFsrmActionCommand **action);
void __RPC_STUB IFsrmFileManagementJob_get_CustomAction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Notifications_Proxy(
    IFsrmFileManagementJob* This,
    SAFEARRAY **notifications);
void __RPC_STUB IFsrmFileManagementJob_get_Notifications_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Logging_Proxy(
    IFsrmFileManagementJob* This,
    LONG *loggingFlags);
void __RPC_STUB IFsrmFileManagementJob_get_Logging_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_Logging_Proxy(
    IFsrmFileManagementJob* This,
    LONG loggingFlags);
void __RPC_STUB IFsrmFileManagementJob_put_Logging_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_ReportEnabled_Proxy(
    IFsrmFileManagementJob* This,
    VARIANT_BOOL *reportEnabled);
void __RPC_STUB IFsrmFileManagementJob_get_ReportEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_ReportEnabled_Proxy(
    IFsrmFileManagementJob* This,
    VARIANT_BOOL reportEnabled);
void __RPC_STUB IFsrmFileManagementJob_put_ReportEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Formats_Proxy(
    IFsrmFileManagementJob* This,
    SAFEARRAY **formats);
void __RPC_STUB IFsrmFileManagementJob_get_Formats_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_Formats_Proxy(
    IFsrmFileManagementJob* This,
    SAFEARRAY *formats);
void __RPC_STUB IFsrmFileManagementJob_put_Formats_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_MailTo_Proxy(
    IFsrmFileManagementJob* This,
    BSTR *mailTo);
void __RPC_STUB IFsrmFileManagementJob_get_MailTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_MailTo_Proxy(
    IFsrmFileManagementJob* This,
    BSTR mailTo);
void __RPC_STUB IFsrmFileManagementJob_put_MailTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_DaysSinceFileCreated_Proxy(
    IFsrmFileManagementJob* This,
    LONG *daysSinceCreation);
void __RPC_STUB IFsrmFileManagementJob_get_DaysSinceFileCreated_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_DaysSinceFileCreated_Proxy(
    IFsrmFileManagementJob* This,
    LONG daysSinceCreation);
void __RPC_STUB IFsrmFileManagementJob_put_DaysSinceFileCreated_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_DaysSinceFileLastAccessed_Proxy(
    IFsrmFileManagementJob* This,
    LONG *daysSinceAccess);
void __RPC_STUB IFsrmFileManagementJob_get_DaysSinceFileLastAccessed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_DaysSinceFileLastAccessed_Proxy(
    IFsrmFileManagementJob* This,
    LONG daysSinceAccess);
void __RPC_STUB IFsrmFileManagementJob_put_DaysSinceFileLastAccessed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_DaysSinceFileLastModified_Proxy(
    IFsrmFileManagementJob* This,
    LONG *daysSinceModify);
void __RPC_STUB IFsrmFileManagementJob_get_DaysSinceFileLastModified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_DaysSinceFileLastModified_Proxy(
    IFsrmFileManagementJob* This,
    LONG daysSinceModify);
void __RPC_STUB IFsrmFileManagementJob_put_DaysSinceFileLastModified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_PropertyConditions_Proxy(
    IFsrmFileManagementJob* This,
    IFsrmCollection **propertyConditions);
void __RPC_STUB IFsrmFileManagementJob_get_PropertyConditions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_FromDate_Proxy(
    IFsrmFileManagementJob* This,
    DATE *fromDate);
void __RPC_STUB IFsrmFileManagementJob_get_FromDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_FromDate_Proxy(
    IFsrmFileManagementJob* This,
    DATE fromDate);
void __RPC_STUB IFsrmFileManagementJob_put_FromDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Task_Proxy(
    IFsrmFileManagementJob* This,
    BSTR *taskName);
void __RPC_STUB IFsrmFileManagementJob_get_Task_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_Task_Proxy(
    IFsrmFileManagementJob* This,
    BSTR taskName);
void __RPC_STUB IFsrmFileManagementJob_put_Task_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Parameters_Proxy(
    IFsrmFileManagementJob* This,
    SAFEARRAY **parameters);
void __RPC_STUB IFsrmFileManagementJob_get_Parameters_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_Parameters_Proxy(
    IFsrmFileManagementJob* This,
    SAFEARRAY *parameters);
void __RPC_STUB IFsrmFileManagementJob_put_Parameters_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_RunningStatus_Proxy(
    IFsrmFileManagementJob* This,
    FsrmReportRunningStatus *runningStatus);
void __RPC_STUB IFsrmFileManagementJob_get_RunningStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_LastError_Proxy(
    IFsrmFileManagementJob* This,
    BSTR *lastError);
void __RPC_STUB IFsrmFileManagementJob_get_LastError_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_LastReportPathWithoutExtension_Proxy(
    IFsrmFileManagementJob* This,
    BSTR *path);
void __RPC_STUB IFsrmFileManagementJob_get_LastReportPathWithoutExtension_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_LastRun_Proxy(
    IFsrmFileManagementJob* This,
    DATE *lastRun);
void __RPC_STUB IFsrmFileManagementJob_get_LastRun_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_FileNamePattern_Proxy(
    IFsrmFileManagementJob* This,
    BSTR *fileNamePattern);
void __RPC_STUB IFsrmFileManagementJob_get_FileNamePattern_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_FileNamePattern_Proxy(
    IFsrmFileManagementJob* This,
    BSTR fileNamePattern);
void __RPC_STUB IFsrmFileManagementJob_put_FileNamePattern_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_Run_Proxy(
    IFsrmFileManagementJob* This,
    FsrmReportGenerationContext context);
void __RPC_STUB IFsrmFileManagementJob_Run_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_WaitForCompletion_Proxy(
    IFsrmFileManagementJob* This,
    LONG waitSeconds,
    VARIANT_BOOL *completed);
void __RPC_STUB IFsrmFileManagementJob_WaitForCompletion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_Cancel_Proxy(
    IFsrmFileManagementJob* This);
void __RPC_STUB IFsrmFileManagementJob_Cancel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_AddNotification_Proxy(
    IFsrmFileManagementJob* This,
    LONG days);
void __RPC_STUB IFsrmFileManagementJob_AddNotification_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_DeleteNotification_Proxy(
    IFsrmFileManagementJob* This,
    LONG days);
void __RPC_STUB IFsrmFileManagementJob_DeleteNotification_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_ModifyNotification_Proxy(
    IFsrmFileManagementJob* This,
    LONG days,
    LONG newDays);
void __RPC_STUB IFsrmFileManagementJob_ModifyNotification_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_CreateNotificationAction_Proxy(
    IFsrmFileManagementJob* This,
    LONG days,
    FsrmActionType actionType,
    IFsrmAction **action);
void __RPC_STUB IFsrmFileManagementJob_CreateNotificationAction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_EnumNotificationActions_Proxy(
    IFsrmFileManagementJob* This,
    LONG days,
    IFsrmCollection **actions);
void __RPC_STUB IFsrmFileManagementJob_EnumNotificationActions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_CreatePropertyCondition_Proxy(
    IFsrmFileManagementJob* This,
    BSTR name,
    IFsrmPropertyCondition **propertyCondition);
void __RPC_STUB IFsrmFileManagementJob_CreatePropertyCondition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_CreateCustomAction_Proxy(
    IFsrmFileManagementJob* This,
    IFsrmActionCommand **customAction);
void __RPC_STUB IFsrmFileManagementJob_CreateCustomAction_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IFsrmFileManagementJob_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmFileCondition interface
 */
#ifndef __IFsrmFileCondition_INTERFACE_DEFINED__
#define __IFsrmFileCondition_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmFileCondition, 0x70684ffc, 0x691a, 0x4a1a, 0xb9,0x22, 0x97,0x75,0x2e,0x13,0x8c,0xc1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("70684ffc-691a-4a1a-b922-97752e138cc1")
IFsrmFileCondition : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Type(
        FsrmFileConditionType *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmFileCondition, 0x70684ffc, 0x691a, 0x4a1a, 0xb9,0x22, 0x97,0x75,0x2e,0x13,0x8c,0xc1)
#endif
#else
typedef struct IFsrmFileConditionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmFileCondition methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Type)(
        IFsrmFileCondition* This,
        FsrmFileConditionType *pVal);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmFileCondition* This);

    END_INTERFACE
} IFsrmFileConditionVtbl;
interface IFsrmFileCondition {
    CONST_VTBL IFsrmFileConditionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmFileCondition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmFileCondition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmFileCondition_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmFileCondition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmFileCondition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmFileCondition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmFileCondition_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmFileCondition methods ***/
#define IFsrmFileCondition_get_Type(This,pVal) (This)->lpVtbl->get_Type(This,pVal)
#define IFsrmFileCondition_Delete(This) (This)->lpVtbl->Delete(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFsrmFileCondition_QueryInterface(IFsrmFileCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFsrmFileCondition_AddRef(IFsrmFileCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFsrmFileCondition_Release(IFsrmFileCondition* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IFsrmFileCondition_GetTypeInfoCount(IFsrmFileCondition* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IFsrmFileCondition_GetTypeInfo(IFsrmFileCondition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IFsrmFileCondition_GetIDsOfNames(IFsrmFileCondition* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IFsrmFileCondition_Invoke(IFsrmFileCondition* 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);
}
/*** IFsrmFileCondition methods ***/
static FORCEINLINE HRESULT IFsrmFileCondition_get_Type(IFsrmFileCondition* This,FsrmFileConditionType *pVal) {
    return This->lpVtbl->get_Type(This,pVal);
}
static FORCEINLINE HRESULT IFsrmFileCondition_Delete(IFsrmFileCondition* This) {
    return This->lpVtbl->Delete(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IFsrmFileCondition_get_Type_Proxy(
    IFsrmFileCondition* This,
    FsrmFileConditionType *pVal);
void __RPC_STUB IFsrmFileCondition_get_Type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileCondition_Delete_Proxy(
    IFsrmFileCondition* This);
void __RPC_STUB IFsrmFileCondition_Delete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IFsrmFileCondition_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmFileConditionProperty interface
 */
#ifndef __IFsrmFileConditionProperty_INTERFACE_DEFINED__
#define __IFsrmFileConditionProperty_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmFileConditionProperty, 0x81926775, 0xb981, 0x4479, 0x98,0x8f, 0xda,0x17,0x1d,0x62,0x73,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("81926775-b981-4479-988f-da171d627360")
IFsrmFileConditionProperty : public IFsrmFileCondition
{
    virtual HRESULT STDMETHODCALLTYPE get_PropertyName(
        BSTR *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PropertyName(
        BSTR newVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PropertyId(
        FsrmFileSystemPropertyId *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PropertyId(
        FsrmFileSystemPropertyId newVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Operator(
        FsrmPropertyConditionType *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Operator(
        FsrmPropertyConditionType newVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ValueType(
        FsrmPropertyValueType *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ValueType(
        FsrmPropertyValueType newVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Value(
        VARIANT *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Value(
        VARIANT newVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmFileConditionProperty, 0x81926775, 0xb981, 0x4479, 0x98,0x8f, 0xda,0x17,0x1d,0x62,0x73,0x60)
#endif
#else
typedef struct IFsrmFileConditionPropertyVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmFileCondition methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Type)(
        IFsrmFileConditionProperty* This,
        FsrmFileConditionType *pVal);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmFileConditionProperty* This);

    /*** IFsrmFileConditionProperty methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PropertyName)(
        IFsrmFileConditionProperty* This,
        BSTR *pVal);

    HRESULT (STDMETHODCALLTYPE *put_PropertyName)(
        IFsrmFileConditionProperty* This,
        BSTR newVal);

    HRESULT (STDMETHODCALLTYPE *get_PropertyId)(
        IFsrmFileConditionProperty* This,
        FsrmFileSystemPropertyId *pVal);

    HRESULT (STDMETHODCALLTYPE *put_PropertyId)(
        IFsrmFileConditionProperty* This,
        FsrmFileSystemPropertyId newVal);

    HRESULT (STDMETHODCALLTYPE *get_Operator)(
        IFsrmFileConditionProperty* This,
        FsrmPropertyConditionType *pVal);

    HRESULT (STDMETHODCALLTYPE *put_Operator)(
        IFsrmFileConditionProperty* This,
        FsrmPropertyConditionType newVal);

    HRESULT (STDMETHODCALLTYPE *get_ValueType)(
        IFsrmFileConditionProperty* This,
        FsrmPropertyValueType *pVal);

    HRESULT (STDMETHODCALLTYPE *put_ValueType)(
        IFsrmFileConditionProperty* This,
        FsrmPropertyValueType newVal);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        IFsrmFileConditionProperty* This,
        VARIANT *pVal);

    HRESULT (STDMETHODCALLTYPE *put_Value)(
        IFsrmFileConditionProperty* This,
        VARIANT newVal);

    END_INTERFACE
} IFsrmFileConditionPropertyVtbl;
interface IFsrmFileConditionProperty {
    CONST_VTBL IFsrmFileConditionPropertyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmFileConditionProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmFileConditionProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmFileConditionProperty_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmFileConditionProperty_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmFileConditionProperty_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmFileConditionProperty_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmFileConditionProperty_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmFileCondition methods ***/
#define IFsrmFileConditionProperty_get_Type(This,pVal) (This)->lpVtbl->get_Type(This,pVal)
#define IFsrmFileConditionProperty_Delete(This) (This)->lpVtbl->Delete(This)
/*** IFsrmFileConditionProperty methods ***/
#define IFsrmFileConditionProperty_get_PropertyName(This,pVal) (This)->lpVtbl->get_PropertyName(This,pVal)
#define IFsrmFileConditionProperty_put_PropertyName(This,newVal) (This)->lpVtbl->put_PropertyName(This,newVal)
#define IFsrmFileConditionProperty_get_PropertyId(This,pVal) (This)->lpVtbl->get_PropertyId(This,pVal)
#define IFsrmFileConditionProperty_put_PropertyId(This,newVal) (This)->lpVtbl->put_PropertyId(This,newVal)
#define IFsrmFileConditionProperty_get_Operator(This,pVal) (This)->lpVtbl->get_Operator(This,pVal)
#define IFsrmFileConditionProperty_put_Operator(This,newVal) (This)->lpVtbl->put_Operator(This,newVal)
#define IFsrmFileConditionProperty_get_ValueType(This,pVal) (This)->lpVtbl->get_ValueType(This,pVal)
#define IFsrmFileConditionProperty_put_ValueType(This,newVal) (This)->lpVtbl->put_ValueType(This,newVal)
#define IFsrmFileConditionProperty_get_Value(This,pVal) (This)->lpVtbl->get_Value(This,pVal)
#define IFsrmFileConditionProperty_put_Value(This,newVal) (This)->lpVtbl->put_Value(This,newVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFsrmFileConditionProperty_QueryInterface(IFsrmFileConditionProperty* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFsrmFileConditionProperty_AddRef(IFsrmFileConditionProperty* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFsrmFileConditionProperty_Release(IFsrmFileConditionProperty* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IFsrmFileConditionProperty_GetTypeInfoCount(IFsrmFileConditionProperty* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_GetTypeInfo(IFsrmFileConditionProperty* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_GetIDsOfNames(IFsrmFileConditionProperty* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_Invoke(IFsrmFileConditionProperty* 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);
}
/*** IFsrmFileCondition methods ***/
static FORCEINLINE HRESULT IFsrmFileConditionProperty_get_Type(IFsrmFileConditionProperty* This,FsrmFileConditionType *pVal) {
    return This->lpVtbl->get_Type(This,pVal);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_Delete(IFsrmFileConditionProperty* This) {
    return This->lpVtbl->Delete(This);
}
/*** IFsrmFileConditionProperty methods ***/
static FORCEINLINE HRESULT IFsrmFileConditionProperty_get_PropertyName(IFsrmFileConditionProperty* This,BSTR *pVal) {
    return This->lpVtbl->get_PropertyName(This,pVal);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_put_PropertyName(IFsrmFileConditionProperty* This,BSTR newVal) {
    return This->lpVtbl->put_PropertyName(This,newVal);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_get_PropertyId(IFsrmFileConditionProperty* This,FsrmFileSystemPropertyId *pVal) {
    return This->lpVtbl->get_PropertyId(This,pVal);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_put_PropertyId(IFsrmFileConditionProperty* This,FsrmFileSystemPropertyId newVal) {
    return This->lpVtbl->put_PropertyId(This,newVal);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_get_Operator(IFsrmFileConditionProperty* This,FsrmPropertyConditionType *pVal) {
    return This->lpVtbl->get_Operator(This,pVal);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_put_Operator(IFsrmFileConditionProperty* This,FsrmPropertyConditionType newVal) {
    return This->lpVtbl->put_Operator(This,newVal);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_get_ValueType(IFsrmFileConditionProperty* This,FsrmPropertyValueType *pVal) {
    return This->lpVtbl->get_ValueType(This,pVal);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_put_ValueType(IFsrmFileConditionProperty* This,FsrmPropertyValueType newVal) {
    return This->lpVtbl->put_ValueType(This,newVal);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_get_Value(IFsrmFileConditionProperty* This,VARIANT *pVal) {
    return This->lpVtbl->get_Value(This,pVal);
}
static FORCEINLINE HRESULT IFsrmFileConditionProperty_put_Value(IFsrmFileConditionProperty* This,VARIANT newVal) {
    return This->lpVtbl->put_Value(This,newVal);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_get_PropertyName_Proxy(
    IFsrmFileConditionProperty* This,
    BSTR *pVal);
void __RPC_STUB IFsrmFileConditionProperty_get_PropertyName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_put_PropertyName_Proxy(
    IFsrmFileConditionProperty* This,
    BSTR newVal);
void __RPC_STUB IFsrmFileConditionProperty_put_PropertyName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_get_PropertyId_Proxy(
    IFsrmFileConditionProperty* This,
    FsrmFileSystemPropertyId *pVal);
void __RPC_STUB IFsrmFileConditionProperty_get_PropertyId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_put_PropertyId_Proxy(
    IFsrmFileConditionProperty* This,
    FsrmFileSystemPropertyId newVal);
void __RPC_STUB IFsrmFileConditionProperty_put_PropertyId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_get_Operator_Proxy(
    IFsrmFileConditionProperty* This,
    FsrmPropertyConditionType *pVal);
void __RPC_STUB IFsrmFileConditionProperty_get_Operator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_put_Operator_Proxy(
    IFsrmFileConditionProperty* This,
    FsrmPropertyConditionType newVal);
void __RPC_STUB IFsrmFileConditionProperty_put_Operator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_get_ValueType_Proxy(
    IFsrmFileConditionProperty* This,
    FsrmPropertyValueType *pVal);
void __RPC_STUB IFsrmFileConditionProperty_get_ValueType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_put_ValueType_Proxy(
    IFsrmFileConditionProperty* This,
    FsrmPropertyValueType newVal);
void __RPC_STUB IFsrmFileConditionProperty_put_ValueType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_get_Value_Proxy(
    IFsrmFileConditionProperty* This,
    VARIANT *pVal);
void __RPC_STUB IFsrmFileConditionProperty_get_Value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_put_Value_Proxy(
    IFsrmFileConditionProperty* This,
    VARIANT newVal);
void __RPC_STUB IFsrmFileConditionProperty_put_Value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IFsrmFileConditionProperty_INTERFACE_DEFINED__ */

#endif
/* Begin additional prototypes for all interfaces */

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

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __fsrmreports_h__ */
