/*** Autogenerated by WIDL 9.8 from include/fsrm.idl - Do not edit ***/

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

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

#ifndef __fsrm_h__
#define __fsrm_h__

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

/* Forward declarations */

#ifndef __IFsrmCommittableCollection_FWD_DEFINED__
#define __IFsrmCommittableCollection_FWD_DEFINED__
typedef interface IFsrmCommittableCollection IFsrmCommittableCollection;
#ifdef __cplusplus
interface IFsrmCommittableCollection;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmAccessDeniedRemediationClient_FWD_DEFINED__
#define __IFsrmAccessDeniedRemediationClient_FWD_DEFINED__
typedef interface IFsrmAccessDeniedRemediationClient IFsrmAccessDeniedRemediationClient;
#ifdef __cplusplus
interface IFsrmAccessDeniedRemediationClient;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmAction_FWD_DEFINED__
#define __IFsrmAction_FWD_DEFINED__
typedef interface IFsrmAction IFsrmAction;
#ifdef __cplusplus
interface IFsrmAction;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmActionCommand_FWD_DEFINED__
#define __IFsrmActionCommand_FWD_DEFINED__
typedef interface IFsrmActionCommand IFsrmActionCommand;
#ifdef __cplusplus
interface IFsrmActionCommand;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmActionEventLog_FWD_DEFINED__
#define __IFsrmActionEventLog_FWD_DEFINED__
typedef interface IFsrmActionEventLog IFsrmActionEventLog;
#ifdef __cplusplus
interface IFsrmActionEventLog;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmActionReport_FWD_DEFINED__
#define __IFsrmActionReport_FWD_DEFINED__
typedef interface IFsrmActionReport IFsrmActionReport;
#ifdef __cplusplus
interface IFsrmActionReport;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmCollection_FWD_DEFINED__
#define __IFsrmCollection_FWD_DEFINED__
typedef interface IFsrmCollection IFsrmCollection;
#ifdef __cplusplus
interface IFsrmCollection;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmDerivedObjectsResult_FWD_DEFINED__
#define __IFsrmDerivedObjectsResult_FWD_DEFINED__
typedef interface IFsrmDerivedObjectsResult IFsrmDerivedObjectsResult;
#ifdef __cplusplus
interface IFsrmDerivedObjectsResult;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmExportImport_FWD_DEFINED__
#define __IFsrmExportImport_FWD_DEFINED__
typedef interface IFsrmExportImport IFsrmExportImport;
#ifdef __cplusplus
interface IFsrmExportImport;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmObject_FWD_DEFINED__
#define __IFsrmObject_FWD_DEFINED__
typedef interface IFsrmObject IFsrmObject;
#ifdef __cplusplus
interface IFsrmObject;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmPathMapper_FWD_DEFINED__
#define __IFsrmPathMapper_FWD_DEFINED__
typedef interface IFsrmPathMapper IFsrmPathMapper;
#ifdef __cplusplus
interface IFsrmPathMapper;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmSetting_FWD_DEFINED__
#define __IFsrmSetting_FWD_DEFINED__
typedef interface IFsrmSetting IFsrmSetting;
#ifdef __cplusplus
interface IFsrmSetting;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmActionEmail_FWD_DEFINED__
#define __IFsrmActionEmail_FWD_DEFINED__
typedef interface IFsrmActionEmail IFsrmActionEmail;
#ifdef __cplusplus
interface IFsrmActionEmail;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmActionEmail2_FWD_DEFINED__
#define __IFsrmActionEmail2_FWD_DEFINED__
typedef interface IFsrmActionEmail2 IFsrmActionEmail2;
#ifdef __cplusplus
interface IFsrmActionEmail2;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmMutableCollection_FWD_DEFINED__
#define __IFsrmMutableCollection_FWD_DEFINED__
typedef interface IFsrmMutableCollection IFsrmMutableCollection;
#ifdef __cplusplus
interface IFsrmMutableCollection;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#ifndef __IFsrmObject_FWD_DEFINED__
#define __IFsrmObject_FWD_DEFINED__
typedef interface IFsrmObject IFsrmObject;
#ifdef __cplusplus
interface IFsrmObject;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmCollection_FWD_DEFINED__
#define __IFsrmCollection_FWD_DEFINED__
typedef interface IFsrmCollection IFsrmCollection;
#ifdef __cplusplus
interface IFsrmCollection;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmMutableCollection_FWD_DEFINED__
#define __IFsrmMutableCollection_FWD_DEFINED__
typedef interface IFsrmMutableCollection IFsrmMutableCollection;
#ifdef __cplusplus
interface IFsrmMutableCollection;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmCommittableCollection_FWD_DEFINED__
#define __IFsrmCommittableCollection_FWD_DEFINED__
typedef interface IFsrmCommittableCollection IFsrmCommittableCollection;
#ifdef __cplusplus
interface IFsrmCommittableCollection;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmAction_FWD_DEFINED__
#define __IFsrmAction_FWD_DEFINED__
typedef interface IFsrmAction IFsrmAction;
#ifdef __cplusplus
interface IFsrmAction;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmActionEmail_FWD_DEFINED__
#define __IFsrmActionEmail_FWD_DEFINED__
typedef interface IFsrmActionEmail IFsrmActionEmail;
#ifdef __cplusplus
interface IFsrmActionEmail;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmActionReport_FWD_DEFINED__
#define __IFsrmActionReport_FWD_DEFINED__
typedef interface IFsrmActionReport IFsrmActionReport;
#ifdef __cplusplus
interface IFsrmActionReport;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmActionEventLog_FWD_DEFINED__
#define __IFsrmActionEventLog_FWD_DEFINED__
typedef interface IFsrmActionEventLog IFsrmActionEventLog;
#ifdef __cplusplus
interface IFsrmActionEventLog;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmActionCommand_FWD_DEFINED__
#define __IFsrmActionCommand_FWD_DEFINED__
typedef interface IFsrmActionCommand IFsrmActionCommand;
#ifdef __cplusplus
interface IFsrmActionCommand;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmSetting_FWD_DEFINED__
#define __IFsrmSetting_FWD_DEFINED__
typedef interface IFsrmSetting IFsrmSetting;
#ifdef __cplusplus
interface IFsrmSetting;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmPathMapper_FWD_DEFINED__
#define __IFsrmPathMapper_FWD_DEFINED__
typedef interface IFsrmPathMapper IFsrmPathMapper;
#ifdef __cplusplus
interface IFsrmPathMapper;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmExportImport_FWD_DEFINED__
#define __IFsrmExportImport_FWD_DEFINED__
typedef interface IFsrmExportImport IFsrmExportImport;
#ifdef __cplusplus
interface IFsrmExportImport;
#endif /* __cplusplus */
#endif

#define FSRM_DISPID_FEATURE_MASK (0xf000000)

#define FSRM_DISPID_INTERFACE_A_MASK (0xf00000)

#define FSRM_DISPID_INTERFACE_B_MASK (0xf0000)

#define FSRM_DISPID_INTERFACE_C_MASK (0xf000)

#define FSRM_DISPID_INTERFACE_D_MASK (0xf00)

#define FSRM_DISPID_INTERFACE_MASK (0xffff00)

#define FSRM_DISPID_IS_PROPERTY (0x80)

#define FSRM_DISPID_METHOD_NUM_MASK (0x7f)

#define FSRM_DISPID_METHOD_MASK (0xff)

#define FSRM_DISPID_FEATURE_GENERAL (0x1000000)

#define FSRM_DISPID_FEATURE_QUOTA (0x2000000)

#define FSRM_DISPID_FEATURE_FILESCREEN (0x3000000)

#define FSRM_DISPID_FEATURE_REPORTS (0x4000000)

#define FSRM_DISPID_FEATURE_CLASSIFICATION (0x5000000)

#define FSRM_DISPID_FEATURE_PIPELINE (0x6000000)

#define FSRM_DISPID_OBJECT (FSRM_DISPID_FEATURE_GENERAL | 0x100000)

#define FSRM_DISPID_COLLECTION (FSRM_DISPID_FEATURE_GENERAL | 0x200000)

#define FSRM_DISPID_COLLECTION_MUTABLE (FSRM_DISPID_COLLECTION | 0x10000)

#define FSRM_DISPID_COLLECTION_COMMITTABLE (FSRM_DISPID_COLLECTION_MUTABLE | 0x1000)

#define FSRM_DISPID_ACTION (FSRM_DISPID_FEATURE_GENERAL | 0x300000)

#define FSRM_DISPID_ACTION_EMAIL (FSRM_DISPID_ACTION | 0x10000)

#define FSRM_DISPID_ACTION_REPORT (FSRM_DISPID_ACTION | 0x20000)

#define FSRM_DISPID_ACTION_EVENTLOG (FSRM_DISPID_ACTION | 0x30000)

#define FSRM_DISPID_ACTION_COMMAND (FSRM_DISPID_ACTION | 0x40000)

#define FSRM_DISPID_ACTION_EMAIL2 (FSRM_DISPID_ACTION | 0x50000)

#define FSRM_DISPID_SETTING (FSRM_DISPID_FEATURE_GENERAL | 0x400000)

#define FSRM_DISPID_PATHMAPPER (FSRM_DISPID_FEATURE_GENERAL | 0x500000)

#define FSRM_DISPID_EXPORTIMPORT (FSRM_DISPID_FEATURE_GENERAL | 0x600000)

#define FSRM_DISPID_DERIVEDOBJECTSRESULT (FSRM_DISPID_FEATURE_GENERAL | 0x700000)

#define FSRM_DISPID_ADR (FSRM_DISPID_FEATURE_GENERAL | 0x800000)

/*****************************************************************************
 * IFsrmCommittableCollection interface
 */
#ifndef __IFsrmCommittableCollection_INTERFACE_DEFINED__
#define __IFsrmCommittableCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmCommittableCollection, 0x96deb3b5, 0x8b91, 0x4a2a, 0x9d,0x93, 0x80,0xa3,0x5d,0x8a,0xa8,0x47);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96deb3b5-8b91-4a2a-9d93-80a35d8aa847")
IFsrmCommittableCollection : public IFsrmMutableCollection
{
    virtual HRESULT STDMETHODCALLTYPE Commit(
        FsrmCommitOptions options,
        IFsrmCollection **results) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmCommittableCollection, 0x96deb3b5, 0x8b91, 0x4a2a, 0x9d,0x93, 0x80,0xa3,0x5d,0x8a,0xa8,0x47)
#endif
#else
typedef struct IFsrmCommittableCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IFsrmCommittableCollection *This,
        IUnknown **unknown);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IFsrmCommittableCollection *This,
        LONG index,
        VARIANT *item);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IFsrmCommittableCollection *This,
        LONG *count);

    HRESULT (STDMETHODCALLTYPE *get_State)(
        IFsrmCommittableCollection *This,
        FsrmCollectionState *state);

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

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

    HRESULT (STDMETHODCALLTYPE *GetById)(
        IFsrmCommittableCollection *This,
        FSRM_OBJECT_ID id,
        VARIANT *entry);

    /*** IFsrmMutableCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *Add)(
        IFsrmCommittableCollection *This,
        VARIANT item);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IFsrmCommittableCollection *This,
        LONG index);

    HRESULT (STDMETHODCALLTYPE *RemoveById)(
        IFsrmCommittableCollection *This,
        FSRM_OBJECT_ID id);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IFsrmCommittableCollection *This,
        IFsrmMutableCollection **collection);

    /*** IFsrmCommittableCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmCommittableCollection *This,
        FsrmCommitOptions options,
        IFsrmCollection **results);

    END_INTERFACE
} IFsrmCommittableCollectionVtbl;

interface IFsrmCommittableCollection {
    CONST_VTBL IFsrmCommittableCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmCommittableCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmCommittableCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmCommittableCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmCommittableCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmCommittableCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmCommittableCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmCommittableCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmCollection methods ***/
#define IFsrmCommittableCollection_get__NewEnum(This,unknown) (This)->lpVtbl->get__NewEnum(This,unknown)
#define IFsrmCommittableCollection_get_Item(This,index,item) (This)->lpVtbl->get_Item(This,index,item)
#define IFsrmCommittableCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
#define IFsrmCommittableCollection_get_State(This,state) (This)->lpVtbl->get_State(This,state)
#define IFsrmCommittableCollection_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IFsrmCommittableCollection_WaitForCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForCompletion(This,waitSeconds,completed)
#define IFsrmCommittableCollection_GetById(This,id,entry) (This)->lpVtbl->GetById(This,id,entry)
/*** IFsrmMutableCollection methods ***/
#define IFsrmCommittableCollection_Add(This,item) (This)->lpVtbl->Add(This,item)
#define IFsrmCommittableCollection_Remove(This,index) (This)->lpVtbl->Remove(This,index)
#define IFsrmCommittableCollection_RemoveById(This,id) (This)->lpVtbl->RemoveById(This,id)
#define IFsrmCommittableCollection_Clone(This,collection) (This)->lpVtbl->Clone(This,collection)
/*** IFsrmCommittableCollection methods ***/
#define IFsrmCommittableCollection_Commit(This,options,results) (This)->lpVtbl->Commit(This,options,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_QueryInterface(IFsrmCommittableCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmCommittableCollection_AddRef(IFsrmCommittableCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmCommittableCollection_Release(IFsrmCommittableCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_GetTypeInfoCount(IFsrmCommittableCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_GetTypeInfo(IFsrmCommittableCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_GetIDsOfNames(IFsrmCommittableCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_Invoke(IFsrmCommittableCollection* 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);
}
/*** IFsrmCollection methods ***/
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_get__NewEnum(IFsrmCommittableCollection* This,IUnknown **unknown) {
    return This->lpVtbl->get__NewEnum(This,unknown);
}
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_get_Item(IFsrmCommittableCollection* This,LONG index,VARIANT *item) {
    return This->lpVtbl->get_Item(This,index,item);
}
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_get_Count(IFsrmCommittableCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_get_State(IFsrmCommittableCollection* This,FsrmCollectionState *state) {
    return This->lpVtbl->get_State(This,state);
}
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_Cancel(IFsrmCommittableCollection* This) {
    return This->lpVtbl->Cancel(This);
}
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_WaitForCompletion(IFsrmCommittableCollection* This,LONG waitSeconds,VARIANT_BOOL *completed) {
    return This->lpVtbl->WaitForCompletion(This,waitSeconds,completed);
}
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_GetById(IFsrmCommittableCollection* This,FSRM_OBJECT_ID id,VARIANT *entry) {
    return This->lpVtbl->GetById(This,id,entry);
}
/*** IFsrmMutableCollection methods ***/
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_Add(IFsrmCommittableCollection* This,VARIANT item) {
    return This->lpVtbl->Add(This,item);
}
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_Remove(IFsrmCommittableCollection* This,LONG index) {
    return This->lpVtbl->Remove(This,index);
}
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_RemoveById(IFsrmCommittableCollection* This,FSRM_OBJECT_ID id) {
    return This->lpVtbl->RemoveById(This,id);
}
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_Clone(IFsrmCommittableCollection* This,IFsrmMutableCollection **collection) {
    return This->lpVtbl->Clone(This,collection);
}
/*** IFsrmCommittableCollection methods ***/
static __WIDL_INLINE HRESULT IFsrmCommittableCollection_Commit(IFsrmCommittableCollection* This,FsrmCommitOptions options,IFsrmCollection **results) {
    return This->lpVtbl->Commit(This,options,results);
}
#endif
#endif

#endif


#endif  /* __IFsrmCommittableCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmAccessDeniedRemediationClient interface
 */
#ifndef __IFsrmAccessDeniedRemediationClient_INTERFACE_DEFINED__
#define __IFsrmAccessDeniedRemediationClient_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmAccessDeniedRemediationClient, 0x40002314, 0x590b, 0x45a5, 0x8e,0x1b, 0x8c,0x05,0xda,0x52,0x7e,0x52);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("40002314-590b-45a5-8e1b-8c05da527e52")
IFsrmAccessDeniedRemediationClient : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE Show(
        ULONG_PTR parentWnd,
        BSTR accessPath,
        AdrClientErrorType errorType,
        LONG flags,
        BSTR windowTitle,
        BSTR windowMessage,
        LONG *result) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmAccessDeniedRemediationClient, 0x40002314, 0x590b, 0x45a5, 0x8e,0x1b, 0x8c,0x05,0xda,0x52,0x7e,0x52)
#endif
#else
typedef struct IFsrmAccessDeniedRemediationClientVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmAccessDeniedRemediationClient methods ***/
    HRESULT (STDMETHODCALLTYPE *Show)(
        IFsrmAccessDeniedRemediationClient *This,
        ULONG_PTR parentWnd,
        BSTR accessPath,
        AdrClientErrorType errorType,
        LONG flags,
        BSTR windowTitle,
        BSTR windowMessage,
        LONG *result);

    END_INTERFACE
} IFsrmAccessDeniedRemediationClientVtbl;

interface IFsrmAccessDeniedRemediationClient {
    CONST_VTBL IFsrmAccessDeniedRemediationClientVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmAccessDeniedRemediationClient_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmAccessDeniedRemediationClient_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmAccessDeniedRemediationClient_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmAccessDeniedRemediationClient_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmAccessDeniedRemediationClient_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmAccessDeniedRemediationClient_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmAccessDeniedRemediationClient_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmAccessDeniedRemediationClient methods ***/
#define IFsrmAccessDeniedRemediationClient_Show(This,parentWnd,accessPath,errorType,flags,windowTitle,windowMessage,result) (This)->lpVtbl->Show(This,parentWnd,accessPath,errorType,flags,windowTitle,windowMessage,result)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmAccessDeniedRemediationClient_QueryInterface(IFsrmAccessDeniedRemediationClient* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmAccessDeniedRemediationClient_AddRef(IFsrmAccessDeniedRemediationClient* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmAccessDeniedRemediationClient_Release(IFsrmAccessDeniedRemediationClient* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmAccessDeniedRemediationClient_GetTypeInfoCount(IFsrmAccessDeniedRemediationClient* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmAccessDeniedRemediationClient_GetTypeInfo(IFsrmAccessDeniedRemediationClient* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmAccessDeniedRemediationClient_GetIDsOfNames(IFsrmAccessDeniedRemediationClient* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmAccessDeniedRemediationClient_Invoke(IFsrmAccessDeniedRemediationClient* 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);
}
/*** IFsrmAccessDeniedRemediationClient methods ***/
static __WIDL_INLINE HRESULT IFsrmAccessDeniedRemediationClient_Show(IFsrmAccessDeniedRemediationClient* This,ULONG_PTR parentWnd,BSTR accessPath,AdrClientErrorType errorType,LONG flags,BSTR windowTitle,BSTR windowMessage,LONG *result) {
    return This->lpVtbl->Show(This,parentWnd,accessPath,errorType,flags,windowTitle,windowMessage,result);
}
#endif
#endif

#endif


#endif  /* __IFsrmAccessDeniedRemediationClient_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmAction interface
 */
#ifndef __IFsrmAction_INTERFACE_DEFINED__
#define __IFsrmAction_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmAction, 0x6cd6408a, 0xae60, 0x463b, 0x9e,0xf1, 0xe1,0x17,0x53,0x4d,0x69,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6cd6408a-ae60-463b-9ef1-e117534d69dc")
IFsrmAction : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Id(
        FSRM_OBJECT_ID *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ActionType(
        FsrmActionType *actionType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RunLimitInterval(
        LONG *minutes) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RunLimitInterval(
        LONG minutes) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmAction, 0x6cd6408a, 0xae60, 0x463b, 0x9e,0xf1, 0xe1,0x17,0x53,0x4d,0x69,0xdc)
#endif
#else
typedef struct IFsrmActionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *get_ActionType)(
        IFsrmAction *This,
        FsrmActionType *actionType);

    HRESULT (STDMETHODCALLTYPE *get_RunLimitInterval)(
        IFsrmAction *This,
        LONG *minutes);

    HRESULT (STDMETHODCALLTYPE *put_RunLimitInterval)(
        IFsrmAction *This,
        LONG minutes);

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

    END_INTERFACE
} IFsrmActionVtbl;

interface IFsrmAction {
    CONST_VTBL IFsrmActionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmAction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmAction_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmAction_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmAction_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmAction_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmAction_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmAction methods ***/
#define IFsrmAction_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmAction_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
#define IFsrmAction_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
#define IFsrmAction_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
#define IFsrmAction_Delete(This) (This)->lpVtbl->Delete(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmAction_QueryInterface(IFsrmAction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmAction_AddRef(IFsrmAction* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmAction_Release(IFsrmAction* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmAction_GetTypeInfoCount(IFsrmAction* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmAction_GetTypeInfo(IFsrmAction* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmAction_GetIDsOfNames(IFsrmAction* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmAction_Invoke(IFsrmAction* 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);
}
/*** IFsrmAction methods ***/
static __WIDL_INLINE HRESULT IFsrmAction_get_Id(IFsrmAction* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmAction_get_ActionType(IFsrmAction* This,FsrmActionType *actionType) {
    return This->lpVtbl->get_ActionType(This,actionType);
}
static __WIDL_INLINE HRESULT IFsrmAction_get_RunLimitInterval(IFsrmAction* This,LONG *minutes) {
    return This->lpVtbl->get_RunLimitInterval(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmAction_put_RunLimitInterval(IFsrmAction* This,LONG minutes) {
    return This->lpVtbl->put_RunLimitInterval(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmAction_Delete(IFsrmAction* This) {
    return This->lpVtbl->Delete(This);
}
#endif
#endif

#endif


#endif  /* __IFsrmAction_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmActionCommand interface
 */
#ifndef __IFsrmActionCommand_INTERFACE_DEFINED__
#define __IFsrmActionCommand_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmActionCommand, 0x12937789, 0xe247, 0x4917, 0x9c,0x20, 0xf3,0xee,0x9c,0x7e,0xe7,0x83);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("12937789-e247-4917-9c20-f3ee9c7ee783")
IFsrmActionCommand : public IFsrmAction
{
    virtual HRESULT STDMETHODCALLTYPE get_ExecutablePath(
        BSTR *executablePath) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ExecutablePath(
        BSTR executablePath) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_Arguments(
        BSTR arguments) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Account(
        FsrmAccountType *account) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Account(
        FsrmAccountType account) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_WorkingDirectory(
        BSTR workingDirectory) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MonitorCommand(
        VARIANT_BOOL *monitorCommand) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MonitorCommand(
        VARIANT_BOOL monitorCommand) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_KillTimeOut(
        LONG *minutes) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_KillTimeOut(
        LONG minutes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LogResult(
        VARIANT_BOOL *logResults) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_LogResult(
        VARIANT_BOOL logResults) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmActionCommand, 0x12937789, 0xe247, 0x4917, 0x9c,0x20, 0xf3,0xee,0x9c,0x7e,0xe7,0x83)
#endif
#else
typedef struct IFsrmActionCommandVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmAction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmActionCommand *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_ActionType)(
        IFsrmActionCommand *This,
        FsrmActionType *actionType);

    HRESULT (STDMETHODCALLTYPE *get_RunLimitInterval)(
        IFsrmActionCommand *This,
        LONG *minutes);

    HRESULT (STDMETHODCALLTYPE *put_RunLimitInterval)(
        IFsrmActionCommand *This,
        LONG minutes);

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

    /*** IFsrmActionCommand methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ExecutablePath)(
        IFsrmActionCommand *This,
        BSTR *executablePath);

    HRESULT (STDMETHODCALLTYPE *put_ExecutablePath)(
        IFsrmActionCommand *This,
        BSTR executablePath);

    HRESULT (STDMETHODCALLTYPE *get_Arguments)(
        IFsrmActionCommand *This,
        BSTR *arguments);

    HRESULT (STDMETHODCALLTYPE *put_Arguments)(
        IFsrmActionCommand *This,
        BSTR arguments);

    HRESULT (STDMETHODCALLTYPE *get_Account)(
        IFsrmActionCommand *This,
        FsrmAccountType *account);

    HRESULT (STDMETHODCALLTYPE *put_Account)(
        IFsrmActionCommand *This,
        FsrmAccountType account);

    HRESULT (STDMETHODCALLTYPE *get_WorkingDirectory)(
        IFsrmActionCommand *This,
        BSTR *workingDirectory);

    HRESULT (STDMETHODCALLTYPE *put_WorkingDirectory)(
        IFsrmActionCommand *This,
        BSTR workingDirectory);

    HRESULT (STDMETHODCALLTYPE *get_MonitorCommand)(
        IFsrmActionCommand *This,
        VARIANT_BOOL *monitorCommand);

    HRESULT (STDMETHODCALLTYPE *put_MonitorCommand)(
        IFsrmActionCommand *This,
        VARIANT_BOOL monitorCommand);

    HRESULT (STDMETHODCALLTYPE *get_KillTimeOut)(
        IFsrmActionCommand *This,
        LONG *minutes);

    HRESULT (STDMETHODCALLTYPE *put_KillTimeOut)(
        IFsrmActionCommand *This,
        LONG minutes);

    HRESULT (STDMETHODCALLTYPE *get_LogResult)(
        IFsrmActionCommand *This,
        VARIANT_BOOL *logResults);

    HRESULT (STDMETHODCALLTYPE *put_LogResult)(
        IFsrmActionCommand *This,
        VARIANT_BOOL logResults);

    END_INTERFACE
} IFsrmActionCommandVtbl;

interface IFsrmActionCommand {
    CONST_VTBL IFsrmActionCommandVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmActionCommand_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmActionCommand_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmActionCommand_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmActionCommand_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmActionCommand_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmActionCommand_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmActionCommand_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmAction methods ***/
#define IFsrmActionCommand_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmActionCommand_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
#define IFsrmActionCommand_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
#define IFsrmActionCommand_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
#define IFsrmActionCommand_Delete(This) (This)->lpVtbl->Delete(This)
/*** IFsrmActionCommand methods ***/
#define IFsrmActionCommand_get_ExecutablePath(This,executablePath) (This)->lpVtbl->get_ExecutablePath(This,executablePath)
#define IFsrmActionCommand_put_ExecutablePath(This,executablePath) (This)->lpVtbl->put_ExecutablePath(This,executablePath)
#define IFsrmActionCommand_get_Arguments(This,arguments) (This)->lpVtbl->get_Arguments(This,arguments)
#define IFsrmActionCommand_put_Arguments(This,arguments) (This)->lpVtbl->put_Arguments(This,arguments)
#define IFsrmActionCommand_get_Account(This,account) (This)->lpVtbl->get_Account(This,account)
#define IFsrmActionCommand_put_Account(This,account) (This)->lpVtbl->put_Account(This,account)
#define IFsrmActionCommand_get_WorkingDirectory(This,workingDirectory) (This)->lpVtbl->get_WorkingDirectory(This,workingDirectory)
#define IFsrmActionCommand_put_WorkingDirectory(This,workingDirectory) (This)->lpVtbl->put_WorkingDirectory(This,workingDirectory)
#define IFsrmActionCommand_get_MonitorCommand(This,monitorCommand) (This)->lpVtbl->get_MonitorCommand(This,monitorCommand)
#define IFsrmActionCommand_put_MonitorCommand(This,monitorCommand) (This)->lpVtbl->put_MonitorCommand(This,monitorCommand)
#define IFsrmActionCommand_get_KillTimeOut(This,minutes) (This)->lpVtbl->get_KillTimeOut(This,minutes)
#define IFsrmActionCommand_put_KillTimeOut(This,minutes) (This)->lpVtbl->put_KillTimeOut(This,minutes)
#define IFsrmActionCommand_get_LogResult(This,logResults) (This)->lpVtbl->get_LogResult(This,logResults)
#define IFsrmActionCommand_put_LogResult(This,logResults) (This)->lpVtbl->put_LogResult(This,logResults)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmActionCommand_QueryInterface(IFsrmActionCommand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmActionCommand_AddRef(IFsrmActionCommand* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmActionCommand_Release(IFsrmActionCommand* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmActionCommand_GetTypeInfoCount(IFsrmActionCommand* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_GetTypeInfo(IFsrmActionCommand* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_GetIDsOfNames(IFsrmActionCommand* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_Invoke(IFsrmActionCommand* 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);
}
/*** IFsrmAction methods ***/
static __WIDL_INLINE HRESULT IFsrmActionCommand_get_Id(IFsrmActionCommand* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_get_ActionType(IFsrmActionCommand* This,FsrmActionType *actionType) {
    return This->lpVtbl->get_ActionType(This,actionType);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_get_RunLimitInterval(IFsrmActionCommand* This,LONG *minutes) {
    return This->lpVtbl->get_RunLimitInterval(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_put_RunLimitInterval(IFsrmActionCommand* This,LONG minutes) {
    return This->lpVtbl->put_RunLimitInterval(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_Delete(IFsrmActionCommand* This) {
    return This->lpVtbl->Delete(This);
}
/*** IFsrmActionCommand methods ***/
static __WIDL_INLINE HRESULT IFsrmActionCommand_get_ExecutablePath(IFsrmActionCommand* This,BSTR *executablePath) {
    return This->lpVtbl->get_ExecutablePath(This,executablePath);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_put_ExecutablePath(IFsrmActionCommand* This,BSTR executablePath) {
    return This->lpVtbl->put_ExecutablePath(This,executablePath);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_get_Arguments(IFsrmActionCommand* This,BSTR *arguments) {
    return This->lpVtbl->get_Arguments(This,arguments);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_put_Arguments(IFsrmActionCommand* This,BSTR arguments) {
    return This->lpVtbl->put_Arguments(This,arguments);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_get_Account(IFsrmActionCommand* This,FsrmAccountType *account) {
    return This->lpVtbl->get_Account(This,account);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_put_Account(IFsrmActionCommand* This,FsrmAccountType account) {
    return This->lpVtbl->put_Account(This,account);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_get_WorkingDirectory(IFsrmActionCommand* This,BSTR *workingDirectory) {
    return This->lpVtbl->get_WorkingDirectory(This,workingDirectory);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_put_WorkingDirectory(IFsrmActionCommand* This,BSTR workingDirectory) {
    return This->lpVtbl->put_WorkingDirectory(This,workingDirectory);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_get_MonitorCommand(IFsrmActionCommand* This,VARIANT_BOOL *monitorCommand) {
    return This->lpVtbl->get_MonitorCommand(This,monitorCommand);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_put_MonitorCommand(IFsrmActionCommand* This,VARIANT_BOOL monitorCommand) {
    return This->lpVtbl->put_MonitorCommand(This,monitorCommand);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_get_KillTimeOut(IFsrmActionCommand* This,LONG *minutes) {
    return This->lpVtbl->get_KillTimeOut(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_put_KillTimeOut(IFsrmActionCommand* This,LONG minutes) {
    return This->lpVtbl->put_KillTimeOut(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_get_LogResult(IFsrmActionCommand* This,VARIANT_BOOL *logResults) {
    return This->lpVtbl->get_LogResult(This,logResults);
}
static __WIDL_INLINE HRESULT IFsrmActionCommand_put_LogResult(IFsrmActionCommand* This,VARIANT_BOOL logResults) {
    return This->lpVtbl->put_LogResult(This,logResults);
}
#endif
#endif

#endif


#endif  /* __IFsrmActionCommand_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmActionEventLog interface
 */
#ifndef __IFsrmActionEventLog_INTERFACE_DEFINED__
#define __IFsrmActionEventLog_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmActionEventLog, 0x4c8f96c3, 0x5d94, 0x4f37, 0xa4,0xf4, 0xf5,0x6a,0xb4,0x63,0x54,0x6f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4c8f96c3-5d94-4f37-a4f4-f56ab463546f")
IFsrmActionEventLog : public IFsrmAction
{
    virtual HRESULT STDMETHODCALLTYPE get_EventType(
        FsrmEventType *eventType) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_EventType(
        FsrmEventType eventType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MessageText(
        BSTR *messageText) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MessageText(
        BSTR messageText) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmActionEventLog, 0x4c8f96c3, 0x5d94, 0x4f37, 0xa4,0xf4, 0xf5,0x6a,0xb4,0x63,0x54,0x6f)
#endif
#else
typedef struct IFsrmActionEventLogVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmAction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmActionEventLog *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_ActionType)(
        IFsrmActionEventLog *This,
        FsrmActionType *actionType);

    HRESULT (STDMETHODCALLTYPE *get_RunLimitInterval)(
        IFsrmActionEventLog *This,
        LONG *minutes);

    HRESULT (STDMETHODCALLTYPE *put_RunLimitInterval)(
        IFsrmActionEventLog *This,
        LONG minutes);

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

    /*** IFsrmActionEventLog methods ***/
    HRESULT (STDMETHODCALLTYPE *get_EventType)(
        IFsrmActionEventLog *This,
        FsrmEventType *eventType);

    HRESULT (STDMETHODCALLTYPE *put_EventType)(
        IFsrmActionEventLog *This,
        FsrmEventType eventType);

    HRESULT (STDMETHODCALLTYPE *get_MessageText)(
        IFsrmActionEventLog *This,
        BSTR *messageText);

    HRESULT (STDMETHODCALLTYPE *put_MessageText)(
        IFsrmActionEventLog *This,
        BSTR messageText);

    END_INTERFACE
} IFsrmActionEventLogVtbl;

interface IFsrmActionEventLog {
    CONST_VTBL IFsrmActionEventLogVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmActionEventLog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmActionEventLog_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmActionEventLog_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmActionEventLog_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmActionEventLog_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmActionEventLog_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmActionEventLog_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmAction methods ***/
#define IFsrmActionEventLog_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmActionEventLog_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
#define IFsrmActionEventLog_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
#define IFsrmActionEventLog_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
#define IFsrmActionEventLog_Delete(This) (This)->lpVtbl->Delete(This)
/*** IFsrmActionEventLog methods ***/
#define IFsrmActionEventLog_get_EventType(This,eventType) (This)->lpVtbl->get_EventType(This,eventType)
#define IFsrmActionEventLog_put_EventType(This,eventType) (This)->lpVtbl->put_EventType(This,eventType)
#define IFsrmActionEventLog_get_MessageText(This,messageText) (This)->lpVtbl->get_MessageText(This,messageText)
#define IFsrmActionEventLog_put_MessageText(This,messageText) (This)->lpVtbl->put_MessageText(This,messageText)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEventLog_QueryInterface(IFsrmActionEventLog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmActionEventLog_AddRef(IFsrmActionEventLog* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmActionEventLog_Release(IFsrmActionEventLog* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEventLog_GetTypeInfoCount(IFsrmActionEventLog* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmActionEventLog_GetTypeInfo(IFsrmActionEventLog* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmActionEventLog_GetIDsOfNames(IFsrmActionEventLog* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmActionEventLog_Invoke(IFsrmActionEventLog* 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);
}
/*** IFsrmAction methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEventLog_get_Id(IFsrmActionEventLog* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmActionEventLog_get_ActionType(IFsrmActionEventLog* This,FsrmActionType *actionType) {
    return This->lpVtbl->get_ActionType(This,actionType);
}
static __WIDL_INLINE HRESULT IFsrmActionEventLog_get_RunLimitInterval(IFsrmActionEventLog* This,LONG *minutes) {
    return This->lpVtbl->get_RunLimitInterval(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmActionEventLog_put_RunLimitInterval(IFsrmActionEventLog* This,LONG minutes) {
    return This->lpVtbl->put_RunLimitInterval(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmActionEventLog_Delete(IFsrmActionEventLog* This) {
    return This->lpVtbl->Delete(This);
}
/*** IFsrmActionEventLog methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEventLog_get_EventType(IFsrmActionEventLog* This,FsrmEventType *eventType) {
    return This->lpVtbl->get_EventType(This,eventType);
}
static __WIDL_INLINE HRESULT IFsrmActionEventLog_put_EventType(IFsrmActionEventLog* This,FsrmEventType eventType) {
    return This->lpVtbl->put_EventType(This,eventType);
}
static __WIDL_INLINE HRESULT IFsrmActionEventLog_get_MessageText(IFsrmActionEventLog* This,BSTR *messageText) {
    return This->lpVtbl->get_MessageText(This,messageText);
}
static __WIDL_INLINE HRESULT IFsrmActionEventLog_put_MessageText(IFsrmActionEventLog* This,BSTR messageText) {
    return This->lpVtbl->put_MessageText(This,messageText);
}
#endif
#endif

#endif


#endif  /* __IFsrmActionEventLog_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmActionReport interface
 */
#ifndef __IFsrmActionReport_INTERFACE_DEFINED__
#define __IFsrmActionReport_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmActionReport, 0x2dbe63c4, 0xb340, 0x48a0, 0xa5,0xb0, 0x15,0x8e,0x07,0xfc,0x56,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2dbe63c4-b340-48a0-a5b0-158e07fc567e")
IFsrmActionReport : public IFsrmAction
{
    virtual HRESULT STDMETHODCALLTYPE get_ReportTypes(
        SAFEARRAY **reportTypes) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ReportTypes(
        SAFEARRAY *reportTypes) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_MailTo(
        BSTR mailTo) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmActionReport, 0x2dbe63c4, 0xb340, 0x48a0, 0xa5,0xb0, 0x15,0x8e,0x07,0xfc,0x56,0x7e)
#endif
#else
typedef struct IFsrmActionReportVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmAction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmActionReport *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_ActionType)(
        IFsrmActionReport *This,
        FsrmActionType *actionType);

    HRESULT (STDMETHODCALLTYPE *get_RunLimitInterval)(
        IFsrmActionReport *This,
        LONG *minutes);

    HRESULT (STDMETHODCALLTYPE *put_RunLimitInterval)(
        IFsrmActionReport *This,
        LONG minutes);

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

    /*** IFsrmActionReport methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ReportTypes)(
        IFsrmActionReport *This,
        SAFEARRAY **reportTypes);

    HRESULT (STDMETHODCALLTYPE *put_ReportTypes)(
        IFsrmActionReport *This,
        SAFEARRAY *reportTypes);

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

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

    END_INTERFACE
} IFsrmActionReportVtbl;

interface IFsrmActionReport {
    CONST_VTBL IFsrmActionReportVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmActionReport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmActionReport_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmActionReport_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmActionReport_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmActionReport_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmActionReport_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmActionReport_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmAction methods ***/
#define IFsrmActionReport_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmActionReport_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
#define IFsrmActionReport_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
#define IFsrmActionReport_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
#define IFsrmActionReport_Delete(This) (This)->lpVtbl->Delete(This)
/*** IFsrmActionReport methods ***/
#define IFsrmActionReport_get_ReportTypes(This,reportTypes) (This)->lpVtbl->get_ReportTypes(This,reportTypes)
#define IFsrmActionReport_put_ReportTypes(This,reportTypes) (This)->lpVtbl->put_ReportTypes(This,reportTypes)
#define IFsrmActionReport_get_MailTo(This,mailTo) (This)->lpVtbl->get_MailTo(This,mailTo)
#define IFsrmActionReport_put_MailTo(This,mailTo) (This)->lpVtbl->put_MailTo(This,mailTo)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmActionReport_QueryInterface(IFsrmActionReport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmActionReport_AddRef(IFsrmActionReport* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmActionReport_Release(IFsrmActionReport* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmActionReport_GetTypeInfoCount(IFsrmActionReport* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmActionReport_GetTypeInfo(IFsrmActionReport* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmActionReport_GetIDsOfNames(IFsrmActionReport* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmActionReport_Invoke(IFsrmActionReport* 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);
}
/*** IFsrmAction methods ***/
static __WIDL_INLINE HRESULT IFsrmActionReport_get_Id(IFsrmActionReport* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmActionReport_get_ActionType(IFsrmActionReport* This,FsrmActionType *actionType) {
    return This->lpVtbl->get_ActionType(This,actionType);
}
static __WIDL_INLINE HRESULT IFsrmActionReport_get_RunLimitInterval(IFsrmActionReport* This,LONG *minutes) {
    return This->lpVtbl->get_RunLimitInterval(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmActionReport_put_RunLimitInterval(IFsrmActionReport* This,LONG minutes) {
    return This->lpVtbl->put_RunLimitInterval(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmActionReport_Delete(IFsrmActionReport* This) {
    return This->lpVtbl->Delete(This);
}
/*** IFsrmActionReport methods ***/
static __WIDL_INLINE HRESULT IFsrmActionReport_get_ReportTypes(IFsrmActionReport* This,SAFEARRAY **reportTypes) {
    return This->lpVtbl->get_ReportTypes(This,reportTypes);
}
static __WIDL_INLINE HRESULT IFsrmActionReport_put_ReportTypes(IFsrmActionReport* This,SAFEARRAY *reportTypes) {
    return This->lpVtbl->put_ReportTypes(This,reportTypes);
}
static __WIDL_INLINE HRESULT IFsrmActionReport_get_MailTo(IFsrmActionReport* This,BSTR *mailTo) {
    return This->lpVtbl->get_MailTo(This,mailTo);
}
static __WIDL_INLINE HRESULT IFsrmActionReport_put_MailTo(IFsrmActionReport* This,BSTR mailTo) {
    return This->lpVtbl->put_MailTo(This,mailTo);
}
#endif
#endif

#endif


#endif  /* __IFsrmActionReport_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmCollection interface
 */
#ifndef __IFsrmCollection_INTERFACE_DEFINED__
#define __IFsrmCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmCollection, 0xf76fbf3b, 0x8ddd, 0x4b42, 0xb0,0x5a, 0xcb,0x1c,0x3f,0xf1,0xfe,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f76fbf3b-8ddd-4b42-b05a-cb1c3ff1fee8")
IFsrmCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **unknown) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG index,
        VARIANT *item) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *count) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetById(
        FSRM_OBJECT_ID id,
        VARIANT *entry) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmCollection, 0xf76fbf3b, 0x8ddd, 0x4b42, 0xb0,0x5a, 0xcb,0x1c,0x3f,0xf1,0xfe,0xe8)
#endif
#else
typedef struct IFsrmCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IFsrmCollection *This,
        IUnknown **unknown);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IFsrmCollection *This,
        LONG index,
        VARIANT *item);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IFsrmCollection *This,
        LONG *count);

    HRESULT (STDMETHODCALLTYPE *get_State)(
        IFsrmCollection *This,
        FsrmCollectionState *state);

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

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

    HRESULT (STDMETHODCALLTYPE *GetById)(
        IFsrmCollection *This,
        FSRM_OBJECT_ID id,
        VARIANT *entry);

    END_INTERFACE
} IFsrmCollectionVtbl;

interface IFsrmCollection {
    CONST_VTBL IFsrmCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmCollection methods ***/
#define IFsrmCollection_get__NewEnum(This,unknown) (This)->lpVtbl->get__NewEnum(This,unknown)
#define IFsrmCollection_get_Item(This,index,item) (This)->lpVtbl->get_Item(This,index,item)
#define IFsrmCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
#define IFsrmCollection_get_State(This,state) (This)->lpVtbl->get_State(This,state)
#define IFsrmCollection_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IFsrmCollection_WaitForCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForCompletion(This,waitSeconds,completed)
#define IFsrmCollection_GetById(This,id,entry) (This)->lpVtbl->GetById(This,id,entry)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmCollection_QueryInterface(IFsrmCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmCollection_AddRef(IFsrmCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmCollection_Release(IFsrmCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmCollection_GetTypeInfoCount(IFsrmCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmCollection_GetTypeInfo(IFsrmCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmCollection_GetIDsOfNames(IFsrmCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmCollection_Invoke(IFsrmCollection* 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);
}
/*** IFsrmCollection methods ***/
static __WIDL_INLINE HRESULT IFsrmCollection_get__NewEnum(IFsrmCollection* This,IUnknown **unknown) {
    return This->lpVtbl->get__NewEnum(This,unknown);
}
static __WIDL_INLINE HRESULT IFsrmCollection_get_Item(IFsrmCollection* This,LONG index,VARIANT *item) {
    return This->lpVtbl->get_Item(This,index,item);
}
static __WIDL_INLINE HRESULT IFsrmCollection_get_Count(IFsrmCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static __WIDL_INLINE HRESULT IFsrmCollection_get_State(IFsrmCollection* This,FsrmCollectionState *state) {
    return This->lpVtbl->get_State(This,state);
}
static __WIDL_INLINE HRESULT IFsrmCollection_Cancel(IFsrmCollection* This) {
    return This->lpVtbl->Cancel(This);
}
static __WIDL_INLINE HRESULT IFsrmCollection_WaitForCompletion(IFsrmCollection* This,LONG waitSeconds,VARIANT_BOOL *completed) {
    return This->lpVtbl->WaitForCompletion(This,waitSeconds,completed);
}
static __WIDL_INLINE HRESULT IFsrmCollection_GetById(IFsrmCollection* This,FSRM_OBJECT_ID id,VARIANT *entry) {
    return This->lpVtbl->GetById(This,id,entry);
}
#endif
#endif

#endif


#endif  /* __IFsrmCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmDerivedObjectsResult interface
 */
#ifndef __IFsrmDerivedObjectsResult_INTERFACE_DEFINED__
#define __IFsrmDerivedObjectsResult_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmDerivedObjectsResult, 0x39322a2d, 0x38ee, 0x4d0d, 0x80,0x95, 0x42,0x1a,0x80,0x84,0x9a,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("39322a2d-38ee-4d0d-8095-421a80849a82")
IFsrmDerivedObjectsResult : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_DerivedObjects(
        IFsrmCollection **derivedObjects) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Results(
        IFsrmCollection **results) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmDerivedObjectsResult, 0x39322a2d, 0x38ee, 0x4d0d, 0x80,0x95, 0x42,0x1a,0x80,0x84,0x9a,0x82)
#endif
#else
typedef struct IFsrmDerivedObjectsResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmDerivedObjectsResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DerivedObjects)(
        IFsrmDerivedObjectsResult *This,
        IFsrmCollection **derivedObjects);

    HRESULT (STDMETHODCALLTYPE *get_Results)(
        IFsrmDerivedObjectsResult *This,
        IFsrmCollection **results);

    END_INTERFACE
} IFsrmDerivedObjectsResultVtbl;

interface IFsrmDerivedObjectsResult {
    CONST_VTBL IFsrmDerivedObjectsResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmDerivedObjectsResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmDerivedObjectsResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmDerivedObjectsResult_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmDerivedObjectsResult_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmDerivedObjectsResult_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmDerivedObjectsResult_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmDerivedObjectsResult_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmDerivedObjectsResult methods ***/
#define IFsrmDerivedObjectsResult_get_DerivedObjects(This,derivedObjects) (This)->lpVtbl->get_DerivedObjects(This,derivedObjects)
#define IFsrmDerivedObjectsResult_get_Results(This,results) (This)->lpVtbl->get_Results(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmDerivedObjectsResult_QueryInterface(IFsrmDerivedObjectsResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmDerivedObjectsResult_AddRef(IFsrmDerivedObjectsResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmDerivedObjectsResult_Release(IFsrmDerivedObjectsResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmDerivedObjectsResult_GetTypeInfoCount(IFsrmDerivedObjectsResult* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmDerivedObjectsResult_GetTypeInfo(IFsrmDerivedObjectsResult* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmDerivedObjectsResult_GetIDsOfNames(IFsrmDerivedObjectsResult* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmDerivedObjectsResult_Invoke(IFsrmDerivedObjectsResult* 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);
}
/*** IFsrmDerivedObjectsResult methods ***/
static __WIDL_INLINE HRESULT IFsrmDerivedObjectsResult_get_DerivedObjects(IFsrmDerivedObjectsResult* This,IFsrmCollection **derivedObjects) {
    return This->lpVtbl->get_DerivedObjects(This,derivedObjects);
}
static __WIDL_INLINE HRESULT IFsrmDerivedObjectsResult_get_Results(IFsrmDerivedObjectsResult* This,IFsrmCollection **results) {
    return This->lpVtbl->get_Results(This,results);
}
#endif
#endif

#endif


#endif  /* __IFsrmDerivedObjectsResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmExportImport interface
 */
#ifndef __IFsrmExportImport_INTERFACE_DEFINED__
#define __IFsrmExportImport_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmExportImport, 0xefcb0ab1, 0x16c4, 0x4a79, 0x81,0x2c, 0x72,0x56,0x14,0xc3,0x30,0x6b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("efcb0ab1-16c4-4a79-812c-725614c3306b")
IFsrmExportImport : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE ExportFileGroups(
        BSTR filePath,
        VARIANT *fileGroupNamesSafeArray = 0,
        BSTR remoteHost = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE ImportFileGroups(
        BSTR filePath,
        VARIANT *fileGroupNamesSafeArray,
        BSTR remoteHost,
        IFsrmCommittableCollection **fileGroups) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExportFileScreenTemplates(
        BSTR filePath,
        VARIANT *templateNamesSafeArray = 0,
        BSTR remoteHost = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE ImportFileScreenTemplates(
        BSTR filePath,
        VARIANT *templateNamesSafeArray,
        BSTR remoteHost,
        IFsrmCommittableCollection **templates) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExportQuotaTemplates(
        BSTR filePath,
        VARIANT *templateNamesSafeArray = 0,
        BSTR remoteHost = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE ImportQuotaTemplates(
        BSTR filePath,
        VARIANT *templateNamesSafeArray,
        BSTR remoteHost,
        IFsrmCommittableCollection **templates) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmExportImport, 0xefcb0ab1, 0x16c4, 0x4a79, 0x81,0x2c, 0x72,0x56,0x14,0xc3,0x30,0x6b)
#endif
#else
typedef struct IFsrmExportImportVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmExportImport methods ***/
    HRESULT (STDMETHODCALLTYPE *ExportFileGroups)(
        IFsrmExportImport *This,
        BSTR filePath,
        VARIANT *fileGroupNamesSafeArray,
        BSTR remoteHost);

    HRESULT (STDMETHODCALLTYPE *ImportFileGroups)(
        IFsrmExportImport *This,
        BSTR filePath,
        VARIANT *fileGroupNamesSafeArray,
        BSTR remoteHost,
        IFsrmCommittableCollection **fileGroups);

    HRESULT (STDMETHODCALLTYPE *ExportFileScreenTemplates)(
        IFsrmExportImport *This,
        BSTR filePath,
        VARIANT *templateNamesSafeArray,
        BSTR remoteHost);

    HRESULT (STDMETHODCALLTYPE *ImportFileScreenTemplates)(
        IFsrmExportImport *This,
        BSTR filePath,
        VARIANT *templateNamesSafeArray,
        BSTR remoteHost,
        IFsrmCommittableCollection **templates);

    HRESULT (STDMETHODCALLTYPE *ExportQuotaTemplates)(
        IFsrmExportImport *This,
        BSTR filePath,
        VARIANT *templateNamesSafeArray,
        BSTR remoteHost);

    HRESULT (STDMETHODCALLTYPE *ImportQuotaTemplates)(
        IFsrmExportImport *This,
        BSTR filePath,
        VARIANT *templateNamesSafeArray,
        BSTR remoteHost,
        IFsrmCommittableCollection **templates);

    END_INTERFACE
} IFsrmExportImportVtbl;

interface IFsrmExportImport {
    CONST_VTBL IFsrmExportImportVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmExportImport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmExportImport_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmExportImport_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmExportImport_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmExportImport_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmExportImport_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmExportImport_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmExportImport methods ***/
#define IFsrmExportImport_ExportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost) (This)->lpVtbl->ExportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost)
#define IFsrmExportImport_ImportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost,fileGroups) (This)->lpVtbl->ImportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost,fileGroups)
#define IFsrmExportImport_ExportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost) (This)->lpVtbl->ExportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost)
#define IFsrmExportImport_ImportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates) (This)->lpVtbl->ImportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates)
#define IFsrmExportImport_ExportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost) (This)->lpVtbl->ExportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost)
#define IFsrmExportImport_ImportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates) (This)->lpVtbl->ImportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmExportImport_QueryInterface(IFsrmExportImport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmExportImport_AddRef(IFsrmExportImport* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmExportImport_Release(IFsrmExportImport* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmExportImport_GetTypeInfoCount(IFsrmExportImport* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmExportImport_GetTypeInfo(IFsrmExportImport* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmExportImport_GetIDsOfNames(IFsrmExportImport* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmExportImport_Invoke(IFsrmExportImport* 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);
}
/*** IFsrmExportImport methods ***/
static __WIDL_INLINE HRESULT IFsrmExportImport_ExportFileGroups(IFsrmExportImport* This,BSTR filePath,VARIANT *fileGroupNamesSafeArray,BSTR remoteHost) {
    return This->lpVtbl->ExportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost);
}
static __WIDL_INLINE HRESULT IFsrmExportImport_ImportFileGroups(IFsrmExportImport* This,BSTR filePath,VARIANT *fileGroupNamesSafeArray,BSTR remoteHost,IFsrmCommittableCollection **fileGroups) {
    return This->lpVtbl->ImportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost,fileGroups);
}
static __WIDL_INLINE HRESULT IFsrmExportImport_ExportFileScreenTemplates(IFsrmExportImport* This,BSTR filePath,VARIANT *templateNamesSafeArray,BSTR remoteHost) {
    return This->lpVtbl->ExportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost);
}
static __WIDL_INLINE HRESULT IFsrmExportImport_ImportFileScreenTemplates(IFsrmExportImport* This,BSTR filePath,VARIANT *templateNamesSafeArray,BSTR remoteHost,IFsrmCommittableCollection **templates) {
    return This->lpVtbl->ImportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates);
}
static __WIDL_INLINE HRESULT IFsrmExportImport_ExportQuotaTemplates(IFsrmExportImport* This,BSTR filePath,VARIANT *templateNamesSafeArray,BSTR remoteHost) {
    return This->lpVtbl->ExportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost);
}
static __WIDL_INLINE HRESULT IFsrmExportImport_ImportQuotaTemplates(IFsrmExportImport* This,BSTR filePath,VARIANT *templateNamesSafeArray,BSTR remoteHost,IFsrmCommittableCollection **templates) {
    return This->lpVtbl->ImportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates);
}
#endif
#endif

#endif


#endif  /* __IFsrmExportImport_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmObject interface
 */
#ifndef __IFsrmObject_INTERFACE_DEFINED__
#define __IFsrmObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmObject, 0x22bcef93, 0x4a3f, 0x4183, 0x89,0xf9, 0x2f,0x8b,0x8a,0x62,0x8a,0xee);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("22bcef93-4a3f-4183-89f9-2f8b8a628aee")
IFsrmObject : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Id(
        FSRM_OBJECT_ID *id) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_Description(
        BSTR description) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Commit(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmObject, 0x22bcef93, 0x4a3f, 0x4183, 0x89,0xf9, 0x2f,0x8b,0x8a,0x62,0x8a,0xee)
#endif
#else
typedef struct IFsrmObjectVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

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

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

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

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

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

    END_INTERFACE
} IFsrmObjectVtbl;

interface IFsrmObject {
    CONST_VTBL IFsrmObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmObject_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmObject_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmObject_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmObject_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmObject_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 IFsrmObject_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmObject_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmObject_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmObject_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmObject_Commit(This) (This)->lpVtbl->Commit(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmObject_QueryInterface(IFsrmObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmObject_AddRef(IFsrmObject* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmObject_Release(IFsrmObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmObject_GetTypeInfoCount(IFsrmObject* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmObject_GetTypeInfo(IFsrmObject* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmObject_GetIDsOfNames(IFsrmObject* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmObject_Invoke(IFsrmObject* 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 __WIDL_INLINE HRESULT IFsrmObject_get_Id(IFsrmObject* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmObject_get_Description(IFsrmObject* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmObject_put_Description(IFsrmObject* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmObject_Delete(IFsrmObject* This) {
    return This->lpVtbl->Delete(This);
}
static __WIDL_INLINE HRESULT IFsrmObject_Commit(IFsrmObject* This) {
    return This->lpVtbl->Commit(This);
}
#endif
#endif

#endif


#endif  /* __IFsrmObject_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmPathMapper interface
 */
#ifndef __IFsrmPathMapper_INTERFACE_DEFINED__
#define __IFsrmPathMapper_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmPathMapper, 0x6f4dbfff, 0x6920, 0x4821, 0xa6,0xc3, 0xb7,0xe9,0x4c,0x1f,0xd6,0x0c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6f4dbfff-6920-4821-a6c3-b7e94c1fd60c")
IFsrmPathMapper : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE GetSharePathsForLocalPath(
        BSTR localPath,
        SAFEARRAY **sharePaths) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmPathMapper, 0x6f4dbfff, 0x6920, 0x4821, 0xa6,0xc3, 0xb7,0xe9,0x4c,0x1f,0xd6,0x0c)
#endif
#else
typedef struct IFsrmPathMapperVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmPathMapper methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSharePathsForLocalPath)(
        IFsrmPathMapper *This,
        BSTR localPath,
        SAFEARRAY **sharePaths);

    END_INTERFACE
} IFsrmPathMapperVtbl;

interface IFsrmPathMapper {
    CONST_VTBL IFsrmPathMapperVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmPathMapper_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmPathMapper_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmPathMapper_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmPathMapper_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmPathMapper_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmPathMapper_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmPathMapper_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmPathMapper methods ***/
#define IFsrmPathMapper_GetSharePathsForLocalPath(This,localPath,sharePaths) (This)->lpVtbl->GetSharePathsForLocalPath(This,localPath,sharePaths)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmPathMapper_QueryInterface(IFsrmPathMapper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmPathMapper_AddRef(IFsrmPathMapper* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmPathMapper_Release(IFsrmPathMapper* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmPathMapper_GetTypeInfoCount(IFsrmPathMapper* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmPathMapper_GetTypeInfo(IFsrmPathMapper* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmPathMapper_GetIDsOfNames(IFsrmPathMapper* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmPathMapper_Invoke(IFsrmPathMapper* 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);
}
/*** IFsrmPathMapper methods ***/
static __WIDL_INLINE HRESULT IFsrmPathMapper_GetSharePathsForLocalPath(IFsrmPathMapper* This,BSTR localPath,SAFEARRAY **sharePaths) {
    return This->lpVtbl->GetSharePathsForLocalPath(This,localPath,sharePaths);
}
#endif
#endif

#endif


#endif  /* __IFsrmPathMapper_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmSetting interface
 */
#ifndef __IFsrmSetting_INTERFACE_DEFINED__
#define __IFsrmSetting_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmSetting, 0xf411d4fd, 0x14be, 0x4260, 0x8c,0x40, 0x03,0xb7,0xc9,0x5e,0x60,0x8a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f411d4fd-14be-4260-8c40-03b7c95e608a")
IFsrmSetting : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_SmtpServer(
        BSTR *smtpServer) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SmtpServer(
        BSTR smtpServer) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MailFrom(
        BSTR *mailFrom) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MailFrom(
        BSTR mailFrom) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AdminEmail(
        BSTR *adminEmail) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AdminEmail(
        BSTR adminEmail) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DisableCommandLine(
        VARIANT_BOOL *disableCommandLine) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DisableCommandLine(
        VARIANT_BOOL disableCommandLine) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_EnableScreeningAudit(
        VARIANT_BOOL *enableScreeningAudit) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_EnableScreeningAudit(
        VARIANT_BOOL enableScreeningAudit) = 0;

    virtual HRESULT STDMETHODCALLTYPE EmailTest(
        BSTR mailTo) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetActionRunLimitInterval(
        FsrmActionType actionType,
        LONG delayTimeMinutes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetActionRunLimitInterval(
        FsrmActionType actionType,
        LONG *delayTimeMinutes) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmSetting, 0xf411d4fd, 0x14be, 0x4260, 0x8c,0x40, 0x03,0xb7,0xc9,0x5e,0x60,0x8a)
#endif
#else
typedef struct IFsrmSettingVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmSetting methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SmtpServer)(
        IFsrmSetting *This,
        BSTR *smtpServer);

    HRESULT (STDMETHODCALLTYPE *put_SmtpServer)(
        IFsrmSetting *This,
        BSTR smtpServer);

    HRESULT (STDMETHODCALLTYPE *get_MailFrom)(
        IFsrmSetting *This,
        BSTR *mailFrom);

    HRESULT (STDMETHODCALLTYPE *put_MailFrom)(
        IFsrmSetting *This,
        BSTR mailFrom);

    HRESULT (STDMETHODCALLTYPE *get_AdminEmail)(
        IFsrmSetting *This,
        BSTR *adminEmail);

    HRESULT (STDMETHODCALLTYPE *put_AdminEmail)(
        IFsrmSetting *This,
        BSTR adminEmail);

    HRESULT (STDMETHODCALLTYPE *get_DisableCommandLine)(
        IFsrmSetting *This,
        VARIANT_BOOL *disableCommandLine);

    HRESULT (STDMETHODCALLTYPE *put_DisableCommandLine)(
        IFsrmSetting *This,
        VARIANT_BOOL disableCommandLine);

    HRESULT (STDMETHODCALLTYPE *get_EnableScreeningAudit)(
        IFsrmSetting *This,
        VARIANT_BOOL *enableScreeningAudit);

    HRESULT (STDMETHODCALLTYPE *put_EnableScreeningAudit)(
        IFsrmSetting *This,
        VARIANT_BOOL enableScreeningAudit);

    HRESULT (STDMETHODCALLTYPE *EmailTest)(
        IFsrmSetting *This,
        BSTR mailTo);

    HRESULT (STDMETHODCALLTYPE *SetActionRunLimitInterval)(
        IFsrmSetting *This,
        FsrmActionType actionType,
        LONG delayTimeMinutes);

    HRESULT (STDMETHODCALLTYPE *GetActionRunLimitInterval)(
        IFsrmSetting *This,
        FsrmActionType actionType,
        LONG *delayTimeMinutes);

    END_INTERFACE
} IFsrmSettingVtbl;

interface IFsrmSetting {
    CONST_VTBL IFsrmSettingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmSetting_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmSetting_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmSetting_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmSetting_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmSetting_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmSetting_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmSetting_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmSetting methods ***/
#define IFsrmSetting_get_SmtpServer(This,smtpServer) (This)->lpVtbl->get_SmtpServer(This,smtpServer)
#define IFsrmSetting_put_SmtpServer(This,smtpServer) (This)->lpVtbl->put_SmtpServer(This,smtpServer)
#define IFsrmSetting_get_MailFrom(This,mailFrom) (This)->lpVtbl->get_MailFrom(This,mailFrom)
#define IFsrmSetting_put_MailFrom(This,mailFrom) (This)->lpVtbl->put_MailFrom(This,mailFrom)
#define IFsrmSetting_get_AdminEmail(This,adminEmail) (This)->lpVtbl->get_AdminEmail(This,adminEmail)
#define IFsrmSetting_put_AdminEmail(This,adminEmail) (This)->lpVtbl->put_AdminEmail(This,adminEmail)
#define IFsrmSetting_get_DisableCommandLine(This,disableCommandLine) (This)->lpVtbl->get_DisableCommandLine(This,disableCommandLine)
#define IFsrmSetting_put_DisableCommandLine(This,disableCommandLine) (This)->lpVtbl->put_DisableCommandLine(This,disableCommandLine)
#define IFsrmSetting_get_EnableScreeningAudit(This,enableScreeningAudit) (This)->lpVtbl->get_EnableScreeningAudit(This,enableScreeningAudit)
#define IFsrmSetting_put_EnableScreeningAudit(This,enableScreeningAudit) (This)->lpVtbl->put_EnableScreeningAudit(This,enableScreeningAudit)
#define IFsrmSetting_EmailTest(This,mailTo) (This)->lpVtbl->EmailTest(This,mailTo)
#define IFsrmSetting_SetActionRunLimitInterval(This,actionType,delayTimeMinutes) (This)->lpVtbl->SetActionRunLimitInterval(This,actionType,delayTimeMinutes)
#define IFsrmSetting_GetActionRunLimitInterval(This,actionType,delayTimeMinutes) (This)->lpVtbl->GetActionRunLimitInterval(This,actionType,delayTimeMinutes)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmSetting_QueryInterface(IFsrmSetting* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmSetting_AddRef(IFsrmSetting* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmSetting_Release(IFsrmSetting* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmSetting_GetTypeInfoCount(IFsrmSetting* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmSetting_GetTypeInfo(IFsrmSetting* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmSetting_GetIDsOfNames(IFsrmSetting* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmSetting_Invoke(IFsrmSetting* 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);
}
/*** IFsrmSetting methods ***/
static __WIDL_INLINE HRESULT IFsrmSetting_get_SmtpServer(IFsrmSetting* This,BSTR *smtpServer) {
    return This->lpVtbl->get_SmtpServer(This,smtpServer);
}
static __WIDL_INLINE HRESULT IFsrmSetting_put_SmtpServer(IFsrmSetting* This,BSTR smtpServer) {
    return This->lpVtbl->put_SmtpServer(This,smtpServer);
}
static __WIDL_INLINE HRESULT IFsrmSetting_get_MailFrom(IFsrmSetting* This,BSTR *mailFrom) {
    return This->lpVtbl->get_MailFrom(This,mailFrom);
}
static __WIDL_INLINE HRESULT IFsrmSetting_put_MailFrom(IFsrmSetting* This,BSTR mailFrom) {
    return This->lpVtbl->put_MailFrom(This,mailFrom);
}
static __WIDL_INLINE HRESULT IFsrmSetting_get_AdminEmail(IFsrmSetting* This,BSTR *adminEmail) {
    return This->lpVtbl->get_AdminEmail(This,adminEmail);
}
static __WIDL_INLINE HRESULT IFsrmSetting_put_AdminEmail(IFsrmSetting* This,BSTR adminEmail) {
    return This->lpVtbl->put_AdminEmail(This,adminEmail);
}
static __WIDL_INLINE HRESULT IFsrmSetting_get_DisableCommandLine(IFsrmSetting* This,VARIANT_BOOL *disableCommandLine) {
    return This->lpVtbl->get_DisableCommandLine(This,disableCommandLine);
}
static __WIDL_INLINE HRESULT IFsrmSetting_put_DisableCommandLine(IFsrmSetting* This,VARIANT_BOOL disableCommandLine) {
    return This->lpVtbl->put_DisableCommandLine(This,disableCommandLine);
}
static __WIDL_INLINE HRESULT IFsrmSetting_get_EnableScreeningAudit(IFsrmSetting* This,VARIANT_BOOL *enableScreeningAudit) {
    return This->lpVtbl->get_EnableScreeningAudit(This,enableScreeningAudit);
}
static __WIDL_INLINE HRESULT IFsrmSetting_put_EnableScreeningAudit(IFsrmSetting* This,VARIANT_BOOL enableScreeningAudit) {
    return This->lpVtbl->put_EnableScreeningAudit(This,enableScreeningAudit);
}
static __WIDL_INLINE HRESULT IFsrmSetting_EmailTest(IFsrmSetting* This,BSTR mailTo) {
    return This->lpVtbl->EmailTest(This,mailTo);
}
static __WIDL_INLINE HRESULT IFsrmSetting_SetActionRunLimitInterval(IFsrmSetting* This,FsrmActionType actionType,LONG delayTimeMinutes) {
    return This->lpVtbl->SetActionRunLimitInterval(This,actionType,delayTimeMinutes);
}
static __WIDL_INLINE HRESULT IFsrmSetting_GetActionRunLimitInterval(IFsrmSetting* This,FsrmActionType actionType,LONG *delayTimeMinutes) {
    return This->lpVtbl->GetActionRunLimitInterval(This,actionType,delayTimeMinutes);
}
#endif
#endif

#endif


#endif  /* __IFsrmSetting_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmActionEmail interface
 */
#ifndef __IFsrmActionEmail_INTERFACE_DEFINED__
#define __IFsrmActionEmail_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmActionEmail, 0xd646567d, 0x26ae, 0x4caa, 0x9f,0x84, 0x4e,0x0a,0xad,0x20,0x7f,0xca);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d646567d-26ae-4caa-9f84-4e0aad207fca")
IFsrmActionEmail : public IFsrmAction
{
    virtual HRESULT STDMETHODCALLTYPE get_MailFrom(
        BSTR *mailFrom) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MailFrom(
        BSTR mailFrom) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MailReplyTo(
        BSTR *mailReplyTo) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MailReplyTo(
        BSTR mailReplyTo) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_MailTo(
        BSTR mailTo) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MailCc(
        BSTR *mailCc) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MailCc(
        BSTR mailCc) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MailBcc(
        BSTR *mailBcc) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MailBcc(
        BSTR mailBcc) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MailSubject(
        BSTR *mailSubject) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MailSubject(
        BSTR mailSubject) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MessageText(
        BSTR *messageText) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MessageText(
        BSTR messageText) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmActionEmail, 0xd646567d, 0x26ae, 0x4caa, 0x9f,0x84, 0x4e,0x0a,0xad,0x20,0x7f,0xca)
#endif
#else
typedef struct IFsrmActionEmailVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmAction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmActionEmail *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_ActionType)(
        IFsrmActionEmail *This,
        FsrmActionType *actionType);

    HRESULT (STDMETHODCALLTYPE *get_RunLimitInterval)(
        IFsrmActionEmail *This,
        LONG *minutes);

    HRESULT (STDMETHODCALLTYPE *put_RunLimitInterval)(
        IFsrmActionEmail *This,
        LONG minutes);

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

    /*** IFsrmActionEmail methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MailFrom)(
        IFsrmActionEmail *This,
        BSTR *mailFrom);

    HRESULT (STDMETHODCALLTYPE *put_MailFrom)(
        IFsrmActionEmail *This,
        BSTR mailFrom);

    HRESULT (STDMETHODCALLTYPE *get_MailReplyTo)(
        IFsrmActionEmail *This,
        BSTR *mailReplyTo);

    HRESULT (STDMETHODCALLTYPE *put_MailReplyTo)(
        IFsrmActionEmail *This,
        BSTR mailReplyTo);

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

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

    HRESULT (STDMETHODCALLTYPE *get_MailCc)(
        IFsrmActionEmail *This,
        BSTR *mailCc);

    HRESULT (STDMETHODCALLTYPE *put_MailCc)(
        IFsrmActionEmail *This,
        BSTR mailCc);

    HRESULT (STDMETHODCALLTYPE *get_MailBcc)(
        IFsrmActionEmail *This,
        BSTR *mailBcc);

    HRESULT (STDMETHODCALLTYPE *put_MailBcc)(
        IFsrmActionEmail *This,
        BSTR mailBcc);

    HRESULT (STDMETHODCALLTYPE *get_MailSubject)(
        IFsrmActionEmail *This,
        BSTR *mailSubject);

    HRESULT (STDMETHODCALLTYPE *put_MailSubject)(
        IFsrmActionEmail *This,
        BSTR mailSubject);

    HRESULT (STDMETHODCALLTYPE *get_MessageText)(
        IFsrmActionEmail *This,
        BSTR *messageText);

    HRESULT (STDMETHODCALLTYPE *put_MessageText)(
        IFsrmActionEmail *This,
        BSTR messageText);

    END_INTERFACE
} IFsrmActionEmailVtbl;

interface IFsrmActionEmail {
    CONST_VTBL IFsrmActionEmailVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmActionEmail_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmActionEmail_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmActionEmail_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmActionEmail_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmActionEmail_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmActionEmail_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmActionEmail_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmAction methods ***/
#define IFsrmActionEmail_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmActionEmail_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
#define IFsrmActionEmail_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
#define IFsrmActionEmail_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
#define IFsrmActionEmail_Delete(This) (This)->lpVtbl->Delete(This)
/*** IFsrmActionEmail methods ***/
#define IFsrmActionEmail_get_MailFrom(This,mailFrom) (This)->lpVtbl->get_MailFrom(This,mailFrom)
#define IFsrmActionEmail_put_MailFrom(This,mailFrom) (This)->lpVtbl->put_MailFrom(This,mailFrom)
#define IFsrmActionEmail_get_MailReplyTo(This,mailReplyTo) (This)->lpVtbl->get_MailReplyTo(This,mailReplyTo)
#define IFsrmActionEmail_put_MailReplyTo(This,mailReplyTo) (This)->lpVtbl->put_MailReplyTo(This,mailReplyTo)
#define IFsrmActionEmail_get_MailTo(This,mailTo) (This)->lpVtbl->get_MailTo(This,mailTo)
#define IFsrmActionEmail_put_MailTo(This,mailTo) (This)->lpVtbl->put_MailTo(This,mailTo)
#define IFsrmActionEmail_get_MailCc(This,mailCc) (This)->lpVtbl->get_MailCc(This,mailCc)
#define IFsrmActionEmail_put_MailCc(This,mailCc) (This)->lpVtbl->put_MailCc(This,mailCc)
#define IFsrmActionEmail_get_MailBcc(This,mailBcc) (This)->lpVtbl->get_MailBcc(This,mailBcc)
#define IFsrmActionEmail_put_MailBcc(This,mailBcc) (This)->lpVtbl->put_MailBcc(This,mailBcc)
#define IFsrmActionEmail_get_MailSubject(This,mailSubject) (This)->lpVtbl->get_MailSubject(This,mailSubject)
#define IFsrmActionEmail_put_MailSubject(This,mailSubject) (This)->lpVtbl->put_MailSubject(This,mailSubject)
#define IFsrmActionEmail_get_MessageText(This,messageText) (This)->lpVtbl->get_MessageText(This,messageText)
#define IFsrmActionEmail_put_MessageText(This,messageText) (This)->lpVtbl->put_MessageText(This,messageText)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEmail_QueryInterface(IFsrmActionEmail* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmActionEmail_AddRef(IFsrmActionEmail* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmActionEmail_Release(IFsrmActionEmail* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEmail_GetTypeInfoCount(IFsrmActionEmail* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_GetTypeInfo(IFsrmActionEmail* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_GetIDsOfNames(IFsrmActionEmail* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_Invoke(IFsrmActionEmail* 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);
}
/*** IFsrmAction methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEmail_get_Id(IFsrmActionEmail* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_get_ActionType(IFsrmActionEmail* This,FsrmActionType *actionType) {
    return This->lpVtbl->get_ActionType(This,actionType);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_get_RunLimitInterval(IFsrmActionEmail* This,LONG *minutes) {
    return This->lpVtbl->get_RunLimitInterval(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_put_RunLimitInterval(IFsrmActionEmail* This,LONG minutes) {
    return This->lpVtbl->put_RunLimitInterval(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_Delete(IFsrmActionEmail* This) {
    return This->lpVtbl->Delete(This);
}
/*** IFsrmActionEmail methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEmail_get_MailFrom(IFsrmActionEmail* This,BSTR *mailFrom) {
    return This->lpVtbl->get_MailFrom(This,mailFrom);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_put_MailFrom(IFsrmActionEmail* This,BSTR mailFrom) {
    return This->lpVtbl->put_MailFrom(This,mailFrom);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_get_MailReplyTo(IFsrmActionEmail* This,BSTR *mailReplyTo) {
    return This->lpVtbl->get_MailReplyTo(This,mailReplyTo);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_put_MailReplyTo(IFsrmActionEmail* This,BSTR mailReplyTo) {
    return This->lpVtbl->put_MailReplyTo(This,mailReplyTo);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_get_MailTo(IFsrmActionEmail* This,BSTR *mailTo) {
    return This->lpVtbl->get_MailTo(This,mailTo);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_put_MailTo(IFsrmActionEmail* This,BSTR mailTo) {
    return This->lpVtbl->put_MailTo(This,mailTo);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_get_MailCc(IFsrmActionEmail* This,BSTR *mailCc) {
    return This->lpVtbl->get_MailCc(This,mailCc);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_put_MailCc(IFsrmActionEmail* This,BSTR mailCc) {
    return This->lpVtbl->put_MailCc(This,mailCc);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_get_MailBcc(IFsrmActionEmail* This,BSTR *mailBcc) {
    return This->lpVtbl->get_MailBcc(This,mailBcc);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_put_MailBcc(IFsrmActionEmail* This,BSTR mailBcc) {
    return This->lpVtbl->put_MailBcc(This,mailBcc);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_get_MailSubject(IFsrmActionEmail* This,BSTR *mailSubject) {
    return This->lpVtbl->get_MailSubject(This,mailSubject);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_put_MailSubject(IFsrmActionEmail* This,BSTR mailSubject) {
    return This->lpVtbl->put_MailSubject(This,mailSubject);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_get_MessageText(IFsrmActionEmail* This,BSTR *messageText) {
    return This->lpVtbl->get_MessageText(This,messageText);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail_put_MessageText(IFsrmActionEmail* This,BSTR messageText) {
    return This->lpVtbl->put_MessageText(This,messageText);
}
#endif
#endif

#endif


#endif  /* __IFsrmActionEmail_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmActionEmail2 interface
 */
#ifndef __IFsrmActionEmail2_INTERFACE_DEFINED__
#define __IFsrmActionEmail2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmActionEmail2, 0x8276702f, 0x2532, 0x4839, 0x89,0xbf, 0x48,0x72,0x60,0x9a,0x2e,0xa4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8276702f-2532-4839-89bf-4872609a2ea4")
IFsrmActionEmail2 : public IFsrmActionEmail
{
    virtual HRESULT STDMETHODCALLTYPE get_AttachmentFileListSize(
        LONG *attachmentFileListSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AttachmentFileListSize(
        LONG attachmentFileListSize) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmActionEmail2, 0x8276702f, 0x2532, 0x4839, 0x89,0xbf, 0x48,0x72,0x60,0x9a,0x2e,0xa4)
#endif
#else
typedef struct IFsrmActionEmail2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmAction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmActionEmail2 *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_ActionType)(
        IFsrmActionEmail2 *This,
        FsrmActionType *actionType);

    HRESULT (STDMETHODCALLTYPE *get_RunLimitInterval)(
        IFsrmActionEmail2 *This,
        LONG *minutes);

    HRESULT (STDMETHODCALLTYPE *put_RunLimitInterval)(
        IFsrmActionEmail2 *This,
        LONG minutes);

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

    /*** IFsrmActionEmail methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MailFrom)(
        IFsrmActionEmail2 *This,
        BSTR *mailFrom);

    HRESULT (STDMETHODCALLTYPE *put_MailFrom)(
        IFsrmActionEmail2 *This,
        BSTR mailFrom);

    HRESULT (STDMETHODCALLTYPE *get_MailReplyTo)(
        IFsrmActionEmail2 *This,
        BSTR *mailReplyTo);

    HRESULT (STDMETHODCALLTYPE *put_MailReplyTo)(
        IFsrmActionEmail2 *This,
        BSTR mailReplyTo);

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

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

    HRESULT (STDMETHODCALLTYPE *get_MailCc)(
        IFsrmActionEmail2 *This,
        BSTR *mailCc);

    HRESULT (STDMETHODCALLTYPE *put_MailCc)(
        IFsrmActionEmail2 *This,
        BSTR mailCc);

    HRESULT (STDMETHODCALLTYPE *get_MailBcc)(
        IFsrmActionEmail2 *This,
        BSTR *mailBcc);

    HRESULT (STDMETHODCALLTYPE *put_MailBcc)(
        IFsrmActionEmail2 *This,
        BSTR mailBcc);

    HRESULT (STDMETHODCALLTYPE *get_MailSubject)(
        IFsrmActionEmail2 *This,
        BSTR *mailSubject);

    HRESULT (STDMETHODCALLTYPE *put_MailSubject)(
        IFsrmActionEmail2 *This,
        BSTR mailSubject);

    HRESULT (STDMETHODCALLTYPE *get_MessageText)(
        IFsrmActionEmail2 *This,
        BSTR *messageText);

    HRESULT (STDMETHODCALLTYPE *put_MessageText)(
        IFsrmActionEmail2 *This,
        BSTR messageText);

    /*** IFsrmActionEmail2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AttachmentFileListSize)(
        IFsrmActionEmail2 *This,
        LONG *attachmentFileListSize);

    HRESULT (STDMETHODCALLTYPE *put_AttachmentFileListSize)(
        IFsrmActionEmail2 *This,
        LONG attachmentFileListSize);

    END_INTERFACE
} IFsrmActionEmail2Vtbl;

interface IFsrmActionEmail2 {
    CONST_VTBL IFsrmActionEmail2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmActionEmail2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmActionEmail2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmActionEmail2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmActionEmail2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmActionEmail2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmActionEmail2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmActionEmail2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmAction methods ***/
#define IFsrmActionEmail2_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmActionEmail2_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
#define IFsrmActionEmail2_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
#define IFsrmActionEmail2_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
#define IFsrmActionEmail2_Delete(This) (This)->lpVtbl->Delete(This)
/*** IFsrmActionEmail methods ***/
#define IFsrmActionEmail2_get_MailFrom(This,mailFrom) (This)->lpVtbl->get_MailFrom(This,mailFrom)
#define IFsrmActionEmail2_put_MailFrom(This,mailFrom) (This)->lpVtbl->put_MailFrom(This,mailFrom)
#define IFsrmActionEmail2_get_MailReplyTo(This,mailReplyTo) (This)->lpVtbl->get_MailReplyTo(This,mailReplyTo)
#define IFsrmActionEmail2_put_MailReplyTo(This,mailReplyTo) (This)->lpVtbl->put_MailReplyTo(This,mailReplyTo)
#define IFsrmActionEmail2_get_MailTo(This,mailTo) (This)->lpVtbl->get_MailTo(This,mailTo)
#define IFsrmActionEmail2_put_MailTo(This,mailTo) (This)->lpVtbl->put_MailTo(This,mailTo)
#define IFsrmActionEmail2_get_MailCc(This,mailCc) (This)->lpVtbl->get_MailCc(This,mailCc)
#define IFsrmActionEmail2_put_MailCc(This,mailCc) (This)->lpVtbl->put_MailCc(This,mailCc)
#define IFsrmActionEmail2_get_MailBcc(This,mailBcc) (This)->lpVtbl->get_MailBcc(This,mailBcc)
#define IFsrmActionEmail2_put_MailBcc(This,mailBcc) (This)->lpVtbl->put_MailBcc(This,mailBcc)
#define IFsrmActionEmail2_get_MailSubject(This,mailSubject) (This)->lpVtbl->get_MailSubject(This,mailSubject)
#define IFsrmActionEmail2_put_MailSubject(This,mailSubject) (This)->lpVtbl->put_MailSubject(This,mailSubject)
#define IFsrmActionEmail2_get_MessageText(This,messageText) (This)->lpVtbl->get_MessageText(This,messageText)
#define IFsrmActionEmail2_put_MessageText(This,messageText) (This)->lpVtbl->put_MessageText(This,messageText)
/*** IFsrmActionEmail2 methods ***/
#define IFsrmActionEmail2_get_AttachmentFileListSize(This,attachmentFileListSize) (This)->lpVtbl->get_AttachmentFileListSize(This,attachmentFileListSize)
#define IFsrmActionEmail2_put_AttachmentFileListSize(This,attachmentFileListSize) (This)->lpVtbl->put_AttachmentFileListSize(This,attachmentFileListSize)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEmail2_QueryInterface(IFsrmActionEmail2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmActionEmail2_AddRef(IFsrmActionEmail2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmActionEmail2_Release(IFsrmActionEmail2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEmail2_GetTypeInfoCount(IFsrmActionEmail2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_GetTypeInfo(IFsrmActionEmail2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_GetIDsOfNames(IFsrmActionEmail2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_Invoke(IFsrmActionEmail2* 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);
}
/*** IFsrmAction methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEmail2_get_Id(IFsrmActionEmail2* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_get_ActionType(IFsrmActionEmail2* This,FsrmActionType *actionType) {
    return This->lpVtbl->get_ActionType(This,actionType);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_get_RunLimitInterval(IFsrmActionEmail2* This,LONG *minutes) {
    return This->lpVtbl->get_RunLimitInterval(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_put_RunLimitInterval(IFsrmActionEmail2* This,LONG minutes) {
    return This->lpVtbl->put_RunLimitInterval(This,minutes);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_Delete(IFsrmActionEmail2* This) {
    return This->lpVtbl->Delete(This);
}
/*** IFsrmActionEmail methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEmail2_get_MailFrom(IFsrmActionEmail2* This,BSTR *mailFrom) {
    return This->lpVtbl->get_MailFrom(This,mailFrom);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_put_MailFrom(IFsrmActionEmail2* This,BSTR mailFrom) {
    return This->lpVtbl->put_MailFrom(This,mailFrom);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_get_MailReplyTo(IFsrmActionEmail2* This,BSTR *mailReplyTo) {
    return This->lpVtbl->get_MailReplyTo(This,mailReplyTo);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_put_MailReplyTo(IFsrmActionEmail2* This,BSTR mailReplyTo) {
    return This->lpVtbl->put_MailReplyTo(This,mailReplyTo);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_get_MailTo(IFsrmActionEmail2* This,BSTR *mailTo) {
    return This->lpVtbl->get_MailTo(This,mailTo);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_put_MailTo(IFsrmActionEmail2* This,BSTR mailTo) {
    return This->lpVtbl->put_MailTo(This,mailTo);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_get_MailCc(IFsrmActionEmail2* This,BSTR *mailCc) {
    return This->lpVtbl->get_MailCc(This,mailCc);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_put_MailCc(IFsrmActionEmail2* This,BSTR mailCc) {
    return This->lpVtbl->put_MailCc(This,mailCc);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_get_MailBcc(IFsrmActionEmail2* This,BSTR *mailBcc) {
    return This->lpVtbl->get_MailBcc(This,mailBcc);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_put_MailBcc(IFsrmActionEmail2* This,BSTR mailBcc) {
    return This->lpVtbl->put_MailBcc(This,mailBcc);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_get_MailSubject(IFsrmActionEmail2* This,BSTR *mailSubject) {
    return This->lpVtbl->get_MailSubject(This,mailSubject);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_put_MailSubject(IFsrmActionEmail2* This,BSTR mailSubject) {
    return This->lpVtbl->put_MailSubject(This,mailSubject);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_get_MessageText(IFsrmActionEmail2* This,BSTR *messageText) {
    return This->lpVtbl->get_MessageText(This,messageText);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_put_MessageText(IFsrmActionEmail2* This,BSTR messageText) {
    return This->lpVtbl->put_MessageText(This,messageText);
}
/*** IFsrmActionEmail2 methods ***/
static __WIDL_INLINE HRESULT IFsrmActionEmail2_get_AttachmentFileListSize(IFsrmActionEmail2* This,LONG *attachmentFileListSize) {
    return This->lpVtbl->get_AttachmentFileListSize(This,attachmentFileListSize);
}
static __WIDL_INLINE HRESULT IFsrmActionEmail2_put_AttachmentFileListSize(IFsrmActionEmail2* This,LONG attachmentFileListSize) {
    return This->lpVtbl->put_AttachmentFileListSize(This,attachmentFileListSize);
}
#endif
#endif

#endif


#endif  /* __IFsrmActionEmail2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmMutableCollection interface
 */
#ifndef __IFsrmMutableCollection_INTERFACE_DEFINED__
#define __IFsrmMutableCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmMutableCollection, 0x1bb617b8, 0x3886, 0x49dc, 0xaf,0x82, 0xa6,0xc9,0x0f,0xa3,0x5d,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1bb617b8-3886-49dc-af82-a6c90fa35dda")
IFsrmMutableCollection : public IFsrmCollection
{
    virtual HRESULT STDMETHODCALLTYPE Add(
        VARIANT item) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        LONG index) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveById(
        FSRM_OBJECT_ID id) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IFsrmMutableCollection **collection) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmMutableCollection, 0x1bb617b8, 0x3886, 0x49dc, 0xaf,0x82, 0xa6,0xc9,0x0f,0xa3,0x5d,0xda)
#endif
#else
typedef struct IFsrmMutableCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFsrmCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IFsrmMutableCollection *This,
        IUnknown **unknown);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IFsrmMutableCollection *This,
        LONG index,
        VARIANT *item);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IFsrmMutableCollection *This,
        LONG *count);

    HRESULT (STDMETHODCALLTYPE *get_State)(
        IFsrmMutableCollection *This,
        FsrmCollectionState *state);

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

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

    HRESULT (STDMETHODCALLTYPE *GetById)(
        IFsrmMutableCollection *This,
        FSRM_OBJECT_ID id,
        VARIANT *entry);

    /*** IFsrmMutableCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *Add)(
        IFsrmMutableCollection *This,
        VARIANT item);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IFsrmMutableCollection *This,
        LONG index);

    HRESULT (STDMETHODCALLTYPE *RemoveById)(
        IFsrmMutableCollection *This,
        FSRM_OBJECT_ID id);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IFsrmMutableCollection *This,
        IFsrmMutableCollection **collection);

    END_INTERFACE
} IFsrmMutableCollectionVtbl;

interface IFsrmMutableCollection {
    CONST_VTBL IFsrmMutableCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmMutableCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmMutableCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmMutableCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmMutableCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmMutableCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmMutableCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmMutableCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmCollection methods ***/
#define IFsrmMutableCollection_get__NewEnum(This,unknown) (This)->lpVtbl->get__NewEnum(This,unknown)
#define IFsrmMutableCollection_get_Item(This,index,item) (This)->lpVtbl->get_Item(This,index,item)
#define IFsrmMutableCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
#define IFsrmMutableCollection_get_State(This,state) (This)->lpVtbl->get_State(This,state)
#define IFsrmMutableCollection_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IFsrmMutableCollection_WaitForCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForCompletion(This,waitSeconds,completed)
#define IFsrmMutableCollection_GetById(This,id,entry) (This)->lpVtbl->GetById(This,id,entry)
/*** IFsrmMutableCollection methods ***/
#define IFsrmMutableCollection_Add(This,item) (This)->lpVtbl->Add(This,item)
#define IFsrmMutableCollection_Remove(This,index) (This)->lpVtbl->Remove(This,index)
#define IFsrmMutableCollection_RemoveById(This,id) (This)->lpVtbl->RemoveById(This,id)
#define IFsrmMutableCollection_Clone(This,collection) (This)->lpVtbl->Clone(This,collection)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmMutableCollection_QueryInterface(IFsrmMutableCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmMutableCollection_AddRef(IFsrmMutableCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmMutableCollection_Release(IFsrmMutableCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmMutableCollection_GetTypeInfoCount(IFsrmMutableCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmMutableCollection_GetTypeInfo(IFsrmMutableCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmMutableCollection_GetIDsOfNames(IFsrmMutableCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmMutableCollection_Invoke(IFsrmMutableCollection* 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);
}
/*** IFsrmCollection methods ***/
static __WIDL_INLINE HRESULT IFsrmMutableCollection_get__NewEnum(IFsrmMutableCollection* This,IUnknown **unknown) {
    return This->lpVtbl->get__NewEnum(This,unknown);
}
static __WIDL_INLINE HRESULT IFsrmMutableCollection_get_Item(IFsrmMutableCollection* This,LONG index,VARIANT *item) {
    return This->lpVtbl->get_Item(This,index,item);
}
static __WIDL_INLINE HRESULT IFsrmMutableCollection_get_Count(IFsrmMutableCollection* This,LONG *count) {
    return This->lpVtbl->get_Count(This,count);
}
static __WIDL_INLINE HRESULT IFsrmMutableCollection_get_State(IFsrmMutableCollection* This,FsrmCollectionState *state) {
    return This->lpVtbl->get_State(This,state);
}
static __WIDL_INLINE HRESULT IFsrmMutableCollection_Cancel(IFsrmMutableCollection* This) {
    return This->lpVtbl->Cancel(This);
}
static __WIDL_INLINE HRESULT IFsrmMutableCollection_WaitForCompletion(IFsrmMutableCollection* This,LONG waitSeconds,VARIANT_BOOL *completed) {
    return This->lpVtbl->WaitForCompletion(This,waitSeconds,completed);
}
static __WIDL_INLINE HRESULT IFsrmMutableCollection_GetById(IFsrmMutableCollection* This,FSRM_OBJECT_ID id,VARIANT *entry) {
    return This->lpVtbl->GetById(This,id,entry);
}
/*** IFsrmMutableCollection methods ***/
static __WIDL_INLINE HRESULT IFsrmMutableCollection_Add(IFsrmMutableCollection* This,VARIANT item) {
    return This->lpVtbl->Add(This,item);
}
static __WIDL_INLINE HRESULT IFsrmMutableCollection_Remove(IFsrmMutableCollection* This,LONG index) {
    return This->lpVtbl->Remove(This,index);
}
static __WIDL_INLINE HRESULT IFsrmMutableCollection_RemoveById(IFsrmMutableCollection* This,FSRM_OBJECT_ID id) {
    return This->lpVtbl->RemoveById(This,id);
}
static __WIDL_INLINE HRESULT IFsrmMutableCollection_Clone(IFsrmMutableCollection* This,IFsrmMutableCollection **collection) {
    return This->lpVtbl->Clone(This,collection);
}
#endif
#endif

#endif


#endif  /* __IFsrmMutableCollection_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 /* __fsrm_h__ */
