/*** Autogenerated by WIDL 10.4 from include/shldisp.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 __shldisp_h__
#define __shldisp_h__

/* Forward declarations */

#ifndef __IFolderViewOC_FWD_DEFINED__
#define __IFolderViewOC_FWD_DEFINED__
typedef interface IFolderViewOC IFolderViewOC;
#ifdef __cplusplus
interface IFolderViewOC;
#endif /* __cplusplus */
#endif

#ifndef __DShellFolderViewEvents_FWD_DEFINED__
#define __DShellFolderViewEvents_FWD_DEFINED__
typedef interface DShellFolderViewEvents DShellFolderViewEvents;
#ifdef __cplusplus
interface DShellFolderViewEvents;
#endif /* __cplusplus */
#endif

#ifndef __ShellFolderViewOC_FWD_DEFINED__
#define __ShellFolderViewOC_FWD_DEFINED__
#ifdef __cplusplus
typedef class ShellFolderViewOC ShellFolderViewOC;
#else
typedef struct ShellFolderViewOC ShellFolderViewOC;
#endif /* defined __cplusplus */
#endif /* defined __ShellFolderViewOC_FWD_DEFINED__ */

#ifndef __DFConstraint_FWD_DEFINED__
#define __DFConstraint_FWD_DEFINED__
typedef interface DFConstraint DFConstraint;
#ifdef __cplusplus
interface DFConstraint;
#endif /* __cplusplus */
#endif

#ifndef __Folder_FWD_DEFINED__
#define __Folder_FWD_DEFINED__
typedef interface Folder Folder;
#ifdef __cplusplus
interface Folder;
#endif /* __cplusplus */
#endif

#ifndef __Folder2_FWD_DEFINED__
#define __Folder2_FWD_DEFINED__
typedef interface Folder2 Folder2;
#ifdef __cplusplus
interface Folder2;
#endif /* __cplusplus */
#endif

#ifndef __Folder3_FWD_DEFINED__
#define __Folder3_FWD_DEFINED__
typedef interface Folder3 Folder3;
#ifdef __cplusplus
interface Folder3;
#endif /* __cplusplus */
#endif

#ifndef __FolderItem_FWD_DEFINED__
#define __FolderItem_FWD_DEFINED__
typedef interface FolderItem FolderItem;
#ifdef __cplusplus
interface FolderItem;
#endif /* __cplusplus */
#endif

#ifndef __FolderItem2_FWD_DEFINED__
#define __FolderItem2_FWD_DEFINED__
typedef interface FolderItem2 FolderItem2;
#ifdef __cplusplus
interface FolderItem2;
#endif /* __cplusplus */
#endif

#ifndef __ShellFolderItem_FWD_DEFINED__
#define __ShellFolderItem_FWD_DEFINED__
#ifdef __cplusplus
typedef class ShellFolderItem ShellFolderItem;
#else
typedef struct ShellFolderItem ShellFolderItem;
#endif /* defined __cplusplus */
#endif /* defined __ShellFolderItem_FWD_DEFINED__ */

#ifndef __FolderItems_FWD_DEFINED__
#define __FolderItems_FWD_DEFINED__
typedef interface FolderItems FolderItems;
#ifdef __cplusplus
interface FolderItems;
#endif /* __cplusplus */
#endif

#ifndef __FolderItems2_FWD_DEFINED__
#define __FolderItems2_FWD_DEFINED__
typedef interface FolderItems2 FolderItems2;
#ifdef __cplusplus
interface FolderItems2;
#endif /* __cplusplus */
#endif

#ifndef __FolderItems3_FWD_DEFINED__
#define __FolderItems3_FWD_DEFINED__
typedef interface FolderItems3 FolderItems3;
#ifdef __cplusplus
interface FolderItems3;
#endif /* __cplusplus */
#endif

#ifndef __FolderItemVerb_FWD_DEFINED__
#define __FolderItemVerb_FWD_DEFINED__
typedef interface FolderItemVerb FolderItemVerb;
#ifdef __cplusplus
interface FolderItemVerb;
#endif /* __cplusplus */
#endif

#ifndef __FolderItemVerbs_FWD_DEFINED__
#define __FolderItemVerbs_FWD_DEFINED__
typedef interface FolderItemVerbs FolderItemVerbs;
#ifdef __cplusplus
interface FolderItemVerbs;
#endif /* __cplusplus */
#endif

#ifndef __IShellLinkDual_FWD_DEFINED__
#define __IShellLinkDual_FWD_DEFINED__
typedef interface IShellLinkDual IShellLinkDual;
#ifdef __cplusplus
interface IShellLinkDual;
#endif /* __cplusplus */
#endif

#ifndef __IShellLinkDual2_FWD_DEFINED__
#define __IShellLinkDual2_FWD_DEFINED__
typedef interface IShellLinkDual2 IShellLinkDual2;
#ifdef __cplusplus
interface IShellLinkDual2;
#endif /* __cplusplus */
#endif

#ifndef __ShellLinkObject_FWD_DEFINED__
#define __ShellLinkObject_FWD_DEFINED__
#ifdef __cplusplus
typedef class ShellLinkObject ShellLinkObject;
#else
typedef struct ShellLinkObject ShellLinkObject;
#endif /* defined __cplusplus */
#endif /* defined __ShellLinkObject_FWD_DEFINED__ */

#ifndef __IShellFolderViewDual_FWD_DEFINED__
#define __IShellFolderViewDual_FWD_DEFINED__
typedef interface IShellFolderViewDual IShellFolderViewDual;
#ifdef __cplusplus
interface IShellFolderViewDual;
#endif /* __cplusplus */
#endif

#ifndef __IShellFolderViewDual2_FWD_DEFINED__
#define __IShellFolderViewDual2_FWD_DEFINED__
typedef interface IShellFolderViewDual2 IShellFolderViewDual2;
#ifdef __cplusplus
interface IShellFolderViewDual2;
#endif /* __cplusplus */
#endif

#ifndef __IShellFolderViewDual3_FWD_DEFINED__
#define __IShellFolderViewDual3_FWD_DEFINED__
typedef interface IShellFolderViewDual3 IShellFolderViewDual3;
#ifdef __cplusplus
interface IShellFolderViewDual3;
#endif /* __cplusplus */
#endif

#ifndef __ShellFolderView_FWD_DEFINED__
#define __ShellFolderView_FWD_DEFINED__
#ifdef __cplusplus
typedef class ShellFolderView ShellFolderView;
#else
typedef struct ShellFolderView ShellFolderView;
#endif /* defined __cplusplus */
#endif /* defined __ShellFolderView_FWD_DEFINED__ */

#ifndef __IShellDispatch_FWD_DEFINED__
#define __IShellDispatch_FWD_DEFINED__
typedef interface IShellDispatch IShellDispatch;
#ifdef __cplusplus
interface IShellDispatch;
#endif /* __cplusplus */
#endif

#ifndef __IShellDispatch2_FWD_DEFINED__
#define __IShellDispatch2_FWD_DEFINED__
typedef interface IShellDispatch2 IShellDispatch2;
#ifdef __cplusplus
interface IShellDispatch2;
#endif /* __cplusplus */
#endif

#ifndef __IShellDispatch3_FWD_DEFINED__
#define __IShellDispatch3_FWD_DEFINED__
typedef interface IShellDispatch3 IShellDispatch3;
#ifdef __cplusplus
interface IShellDispatch3;
#endif /* __cplusplus */
#endif

#ifndef __IShellDispatch4_FWD_DEFINED__
#define __IShellDispatch4_FWD_DEFINED__
typedef interface IShellDispatch4 IShellDispatch4;
#ifdef __cplusplus
interface IShellDispatch4;
#endif /* __cplusplus */
#endif

#ifndef __IShellDispatch5_FWD_DEFINED__
#define __IShellDispatch5_FWD_DEFINED__
typedef interface IShellDispatch5 IShellDispatch5;
#ifdef __cplusplus
interface IShellDispatch5;
#endif /* __cplusplus */
#endif

#ifndef __IShellDispatch6_FWD_DEFINED__
#define __IShellDispatch6_FWD_DEFINED__
typedef interface IShellDispatch6 IShellDispatch6;
#ifdef __cplusplus
interface IShellDispatch6;
#endif /* __cplusplus */
#endif

#ifndef __Shell_FWD_DEFINED__
#define __Shell_FWD_DEFINED__
#ifdef __cplusplus
typedef class Shell Shell;
#else
typedef struct Shell Shell;
#endif /* defined __cplusplus */
#endif /* defined __Shell_FWD_DEFINED__ */

#ifndef __ShellDispatchInproc_FWD_DEFINED__
#define __ShellDispatchInproc_FWD_DEFINED__
#ifdef __cplusplus
typedef class ShellDispatchInproc ShellDispatchInproc;
#else
typedef struct ShellDispatchInproc ShellDispatchInproc;
#endif /* defined __cplusplus */
#endif /* defined __ShellDispatchInproc_FWD_DEFINED__ */

#ifndef __IFileSearchBand_FWD_DEFINED__
#define __IFileSearchBand_FWD_DEFINED__
typedef interface IFileSearchBand IFileSearchBand;
#ifdef __cplusplus
interface IFileSearchBand;
#endif /* __cplusplus */
#endif

#ifndef __FileSearchBand_FWD_DEFINED__
#define __FileSearchBand_FWD_DEFINED__
#ifdef __cplusplus
typedef class FileSearchBand FileSearchBand;
#else
typedef struct FileSearchBand FileSearchBand;
#endif /* defined __cplusplus */
#endif /* defined __FileSearchBand_FWD_DEFINED__ */

#ifndef __IWebWizardHost_FWD_DEFINED__
#define __IWebWizardHost_FWD_DEFINED__
typedef interface IWebWizardHost IWebWizardHost;
#ifdef __cplusplus
interface IWebWizardHost;
#endif /* __cplusplus */
#endif

#ifndef __INewWDEvents_FWD_DEFINED__
#define __INewWDEvents_FWD_DEFINED__
typedef interface INewWDEvents INewWDEvents;
#ifdef __cplusplus
interface INewWDEvents;
#endif /* __cplusplus */
#endif

#ifndef __IAutoComplete_FWD_DEFINED__
#define __IAutoComplete_FWD_DEFINED__
typedef interface IAutoComplete IAutoComplete;
#ifdef __cplusplus
interface IAutoComplete;
#endif /* __cplusplus */
#endif

#ifndef __IAutoComplete2_FWD_DEFINED__
#define __IAutoComplete2_FWD_DEFINED__
typedef interface IAutoComplete2 IAutoComplete2;
#ifdef __cplusplus
interface IAutoComplete2;
#endif /* __cplusplus */
#endif

#ifndef __IEnumACString_FWD_DEFINED__
#define __IEnumACString_FWD_DEFINED__
typedef interface IEnumACString IEnumACString;
#ifdef __cplusplus
interface IEnumACString;
#endif /* __cplusplus */
#endif

#ifndef __IDataObjectAsyncCapability_FWD_DEFINED__
#define __IDataObjectAsyncCapability_FWD_DEFINED__
typedef interface IDataObjectAsyncCapability IDataObjectAsyncCapability;
#ifdef __cplusplus
interface IDataObjectAsyncCapability;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <ocidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

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

#ifndef __IAutoComplete_FWD_DEFINED__
#define __IAutoComplete_FWD_DEFINED__
typedef interface IAutoComplete IAutoComplete;
#ifdef __cplusplus
interface IAutoComplete;
#endif /* __cplusplus */
#endif

#ifndef __FolderItem_FWD_DEFINED__
#define __FolderItem_FWD_DEFINED__
typedef interface FolderItem FolderItem;
#ifdef __cplusplus
interface FolderItem;
#endif /* __cplusplus */
#endif

#ifndef __FolderItems_FWD_DEFINED__
#define __FolderItems_FWD_DEFINED__
typedef interface FolderItems FolderItems;
#ifdef __cplusplus
interface FolderItems;
#endif /* __cplusplus */
#endif

#ifndef __FolderItemVerb_FWD_DEFINED__
#define __FolderItemVerb_FWD_DEFINED__
typedef interface FolderItemVerb FolderItemVerb;
#ifdef __cplusplus
interface FolderItemVerb;
#endif /* __cplusplus */
#endif

#ifndef __FolderItemVerbs_FWD_DEFINED__
#define __FolderItemVerbs_FWD_DEFINED__
typedef interface FolderItemVerbs FolderItemVerbs;
#ifdef __cplusplus
interface FolderItemVerbs;
#endif /* __cplusplus */
#endif

#ifndef __Shell32_LIBRARY_DEFINED__
#define __Shell32_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_Shell32, 0x50a7e9b0, 0x70ef, 0x11d1, 0xb7,0x5a, 0x00,0xa0,0xc9,0x05,0x64,0xfe);

/*****************************************************************************
 * IFolderViewOC interface
 */
#ifndef __IFolderViewOC_INTERFACE_DEFINED__
#define __IFolderViewOC_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFolderViewOC, 0x9ba05970, 0xf6a8, 0x11cf, 0xa4,0x42, 0x00,0xa0,0xc9,0x0a,0x8f,0x39);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9ba05970-f6a8-11cf-a442-00a0c90a8f39")
IFolderViewOC : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE SetFolderView(
        IDispatch *pdisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFolderViewOC, 0x9ba05970, 0xf6a8, 0x11cf, 0xa4,0x42, 0x00,0xa0,0xc9,0x0a,0x8f,0x39)
#endif
#else
typedef struct IFolderViewOCVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFolderViewOC methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFolderView)(
        IFolderViewOC *This,
        IDispatch *pdisp);

    END_INTERFACE
} IFolderViewOCVtbl;

interface IFolderViewOC {
    CONST_VTBL IFolderViewOCVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFolderViewOC_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFolderViewOC_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFolderViewOC_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFolderViewOC_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFolderViewOC_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFolderViewOC_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFolderViewOC_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFolderViewOC methods ***/
#define IFolderViewOC_SetFolderView(This,pdisp) (This)->lpVtbl->SetFolderView(This,pdisp)
#else
/*** IUnknown methods ***/
static inline HRESULT IFolderViewOC_QueryInterface(IFolderViewOC* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFolderViewOC_AddRef(IFolderViewOC* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFolderViewOC_Release(IFolderViewOC* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IFolderViewOC_GetTypeInfoCount(IFolderViewOC* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IFolderViewOC_GetTypeInfo(IFolderViewOC* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IFolderViewOC_GetIDsOfNames(IFolderViewOC* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IFolderViewOC_Invoke(IFolderViewOC* 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);
}
/*** IFolderViewOC methods ***/
static inline HRESULT IFolderViewOC_SetFolderView(IFolderViewOC* This,IDispatch *pdisp) {
    return This->lpVtbl->SetFolderView(This,pdisp);
}
#endif
#endif

#endif


#endif  /* __IFolderViewOC_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DShellFolderViewEvents dispinterface
 */
#ifndef __DShellFolderViewEvents_DISPINTERFACE_DEFINED__
#define __DShellFolderViewEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_DShellFolderViewEvents, 0x62112aa2, 0xebe4, 0x11cf, 0xa5,0xfb, 0x00,0x20,0xaf,0xe7,0x29,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("62112aa2-ebe4-11cf-a5fb-0020afe7292d")
DShellFolderViewEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DShellFolderViewEvents, 0x62112aa2, 0xebe4, 0x11cf, 0xa5,0xfb, 0x00,0x20,0xaf,0xe7,0x29,0x2d)
#endif
#else
typedef struct DShellFolderViewEventsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} DShellFolderViewEventsVtbl;

interface DShellFolderViewEvents {
    CONST_VTBL DShellFolderViewEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DShellFolderViewEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DShellFolderViewEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DShellFolderViewEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DShellFolderViewEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DShellFolderViewEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DShellFolderViewEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DShellFolderViewEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#else
/*** IUnknown methods ***/
static inline HRESULT DShellFolderViewEvents_QueryInterface(DShellFolderViewEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG DShellFolderViewEvents_AddRef(DShellFolderViewEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG DShellFolderViewEvents_Release(DShellFolderViewEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT DShellFolderViewEvents_GetTypeInfoCount(DShellFolderViewEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT DShellFolderViewEvents_GetTypeInfo(DShellFolderViewEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT DShellFolderViewEvents_GetIDsOfNames(DShellFolderViewEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT DShellFolderViewEvents_Invoke(DShellFolderViewEvents* 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);
}
#endif
#endif

#endif

#endif  /* __DShellFolderViewEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * ShellFolderViewOC coclass
 */

DEFINE_GUID(CLSID_ShellFolderViewOC, 0x9ba05971, 0xf6a8, 0x11cf, 0xa4,0x42, 0x00,0xa0,0xc9,0x0a,0x8f,0x39);

#ifdef __cplusplus
class DECLSPEC_UUID("9ba05971-f6a8-11cf-a442-00a0c90a8f39") ShellFolderViewOC;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ShellFolderViewOC, 0x9ba05971, 0xf6a8, 0x11cf, 0xa4,0x42, 0x00,0xa0,0xc9,0x0a,0x8f,0x39)
#endif
#endif

/*****************************************************************************
 * DFConstraint interface
 */
#ifndef __DFConstraint_INTERFACE_DEFINED__
#define __DFConstraint_INTERFACE_DEFINED__

DEFINE_GUID(IID_DFConstraint, 0x4a3df050, 0x23bd, 0x11d2, 0x93,0x9f, 0x00,0xa0,0xc9,0x1e,0xed,0xba);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4a3df050-23bd-11d2-939f-00a0c91eedba")
DFConstraint : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *pbs) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DFConstraint, 0x4a3df050, 0x23bd, 0x11d2, 0x93,0x9f, 0x00,0xa0,0xc9,0x1e,0xed,0xba)
#endif
#else
typedef struct DFConstraintVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** DFConstraint methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        DFConstraint *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        DFConstraint *This,
        VARIANT *pv);

    END_INTERFACE
} DFConstraintVtbl;

interface DFConstraint {
    CONST_VTBL DFConstraintVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define DFConstraint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define DFConstraint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define DFConstraint_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define DFConstraint_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define DFConstraint_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define DFConstraint_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define DFConstraint_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** DFConstraint methods ***/
#define DFConstraint_get_Name(This,pbs) (This)->lpVtbl->get_Name(This,pbs)
#define DFConstraint_get_Value(This,pv) (This)->lpVtbl->get_Value(This,pv)
#else
/*** IUnknown methods ***/
static inline HRESULT DFConstraint_QueryInterface(DFConstraint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG DFConstraint_AddRef(DFConstraint* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG DFConstraint_Release(DFConstraint* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT DFConstraint_GetTypeInfoCount(DFConstraint* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT DFConstraint_GetTypeInfo(DFConstraint* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT DFConstraint_GetIDsOfNames(DFConstraint* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT DFConstraint_Invoke(DFConstraint* 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);
}
/*** DFConstraint methods ***/
static inline HRESULT DFConstraint_get_Name(DFConstraint* This,BSTR *pbs) {
    return This->lpVtbl->get_Name(This,pbs);
}
static inline HRESULT DFConstraint_get_Value(DFConstraint* This,VARIANT *pv) {
    return This->lpVtbl->get_Value(This,pv);
}
#endif
#endif

#endif


#endif  /* __DFConstraint_INTERFACE_DEFINED__ */

/*****************************************************************************
 * Folder interface
 */
#ifndef __Folder_INTERFACE_DEFINED__
#define __Folder_INTERFACE_DEFINED__

DEFINE_GUID(IID_Folder, 0xbbcbde60, 0xc3ff, 0x11ce, 0x83,0x50, 0x44,0x45,0x53,0x54,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bbcbde60-c3ff-11ce-8350-444553540000")
Folder : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Title(
        BSTR *pbs) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Application(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Parent(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ParentFolder(
        Folder **ppsf) = 0;

    virtual HRESULT STDMETHODCALLTYPE Items(
        FolderItems **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE ParseName(
        BSTR bName,
        FolderItem **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE NewFolder(
        BSTR bName,
        VARIANT vOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveHere(
        VARIANT vItem,
        VARIANT vOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyHere(
        VARIANT vItem,
        VARIANT vOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDetailsOf(
        VARIANT vItem,
        int iColumn,
        BSTR *pbs) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(Folder, 0xbbcbde60, 0xc3ff, 0x11ce, 0x83,0x50, 0x44,0x45,0x53,0x54,0x00,0x00)
#endif
#else
typedef struct FolderVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** Folder methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Title)(
        Folder *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *get_Application)(
        Folder *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        Folder *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_ParentFolder)(
        Folder *This,
        Folder **ppsf);

    HRESULT (STDMETHODCALLTYPE *Items)(
        Folder *This,
        FolderItems **ppid);

    HRESULT (STDMETHODCALLTYPE *ParseName)(
        Folder *This,
        BSTR bName,
        FolderItem **ppid);

    HRESULT (STDMETHODCALLTYPE *NewFolder)(
        Folder *This,
        BSTR bName,
        VARIANT vOptions);

    HRESULT (STDMETHODCALLTYPE *MoveHere)(
        Folder *This,
        VARIANT vItem,
        VARIANT vOptions);

    HRESULT (STDMETHODCALLTYPE *CopyHere)(
        Folder *This,
        VARIANT vItem,
        VARIANT vOptions);

    HRESULT (STDMETHODCALLTYPE *GetDetailsOf)(
        Folder *This,
        VARIANT vItem,
        int iColumn,
        BSTR *pbs);

    END_INTERFACE
} FolderVtbl;

interface Folder {
    CONST_VTBL FolderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define Folder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define Folder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define Folder_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define Folder_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define Folder_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define Folder_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define Folder_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** Folder methods ***/
#define Folder_get_Title(This,pbs) (This)->lpVtbl->get_Title(This,pbs)
#define Folder_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define Folder_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define Folder_get_ParentFolder(This,ppsf) (This)->lpVtbl->get_ParentFolder(This,ppsf)
#define Folder_Items(This,ppid) (This)->lpVtbl->Items(This,ppid)
#define Folder_ParseName(This,bName,ppid) (This)->lpVtbl->ParseName(This,bName,ppid)
#define Folder_NewFolder(This,bName,vOptions) (This)->lpVtbl->NewFolder(This,bName,vOptions)
#define Folder_MoveHere(This,vItem,vOptions) (This)->lpVtbl->MoveHere(This,vItem,vOptions)
#define Folder_CopyHere(This,vItem,vOptions) (This)->lpVtbl->CopyHere(This,vItem,vOptions)
#define Folder_GetDetailsOf(This,vItem,iColumn,pbs) (This)->lpVtbl->GetDetailsOf(This,vItem,iColumn,pbs)
#else
/*** IUnknown methods ***/
static inline HRESULT Folder_QueryInterface(Folder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG Folder_AddRef(Folder* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG Folder_Release(Folder* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT Folder_GetTypeInfoCount(Folder* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT Folder_GetTypeInfo(Folder* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT Folder_GetIDsOfNames(Folder* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT Folder_Invoke(Folder* 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);
}
/*** Folder methods ***/
static inline HRESULT Folder_get_Title(Folder* This,BSTR *pbs) {
    return This->lpVtbl->get_Title(This,pbs);
}
static inline HRESULT Folder_get_Application(Folder* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT Folder_get_Parent(Folder* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT Folder_get_ParentFolder(Folder* This,Folder **ppsf) {
    return This->lpVtbl->get_ParentFolder(This,ppsf);
}
static inline HRESULT Folder_Items(Folder* This,FolderItems **ppid) {
    return This->lpVtbl->Items(This,ppid);
}
static inline HRESULT Folder_ParseName(Folder* This,BSTR bName,FolderItem **ppid) {
    return This->lpVtbl->ParseName(This,bName,ppid);
}
static inline HRESULT Folder_NewFolder(Folder* This,BSTR bName,VARIANT vOptions) {
    return This->lpVtbl->NewFolder(This,bName,vOptions);
}
static inline HRESULT Folder_MoveHere(Folder* This,VARIANT vItem,VARIANT vOptions) {
    return This->lpVtbl->MoveHere(This,vItem,vOptions);
}
static inline HRESULT Folder_CopyHere(Folder* This,VARIANT vItem,VARIANT vOptions) {
    return This->lpVtbl->CopyHere(This,vItem,vOptions);
}
static inline HRESULT Folder_GetDetailsOf(Folder* This,VARIANT vItem,int iColumn,BSTR *pbs) {
    return This->lpVtbl->GetDetailsOf(This,vItem,iColumn,pbs);
}
#endif
#endif

#endif


#endif  /* __Folder_INTERFACE_DEFINED__ */

/*****************************************************************************
 * Folder2 interface
 */
#ifndef __Folder2_INTERFACE_DEFINED__
#define __Folder2_INTERFACE_DEFINED__

DEFINE_GUID(IID_Folder2, 0xf0d2d8ef, 0x3890, 0x11d2, 0xbf,0x8b, 0x00,0xc0,0x4f,0xb9,0x36,0x61);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f0d2d8ef-3890-11d2-bf8b-00c04fb93661")
Folder2 : public Folder
{
    virtual HRESULT STDMETHODCALLTYPE get_Self(
        FolderItem **ppfi) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_OfflineStatus(
        LONG *pul) = 0;

    virtual HRESULT STDMETHODCALLTYPE Synchronize(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HaveToShowWebViewBarricade(
        VARIANT_BOOL *pbHaveToShowWebViewBarricade) = 0;

    virtual HRESULT STDMETHODCALLTYPE DismissedWebViewBarricade(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(Folder2, 0xf0d2d8ef, 0x3890, 0x11d2, 0xbf,0x8b, 0x00,0xc0,0x4f,0xb9,0x36,0x61)
#endif
#else
typedef struct Folder2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** Folder methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Title)(
        Folder2 *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *get_Application)(
        Folder2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        Folder2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_ParentFolder)(
        Folder2 *This,
        Folder **ppsf);

    HRESULT (STDMETHODCALLTYPE *Items)(
        Folder2 *This,
        FolderItems **ppid);

    HRESULT (STDMETHODCALLTYPE *ParseName)(
        Folder2 *This,
        BSTR bName,
        FolderItem **ppid);

    HRESULT (STDMETHODCALLTYPE *NewFolder)(
        Folder2 *This,
        BSTR bName,
        VARIANT vOptions);

    HRESULT (STDMETHODCALLTYPE *MoveHere)(
        Folder2 *This,
        VARIANT vItem,
        VARIANT vOptions);

    HRESULT (STDMETHODCALLTYPE *CopyHere)(
        Folder2 *This,
        VARIANT vItem,
        VARIANT vOptions);

    HRESULT (STDMETHODCALLTYPE *GetDetailsOf)(
        Folder2 *This,
        VARIANT vItem,
        int iColumn,
        BSTR *pbs);

    /*** Folder2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Self)(
        Folder2 *This,
        FolderItem **ppfi);

    HRESULT (STDMETHODCALLTYPE *get_OfflineStatus)(
        Folder2 *This,
        LONG *pul);

    HRESULT (STDMETHODCALLTYPE *Synchronize)(
        Folder2 *This);

    HRESULT (STDMETHODCALLTYPE *get_HaveToShowWebViewBarricade)(
        Folder2 *This,
        VARIANT_BOOL *pbHaveToShowWebViewBarricade);

    HRESULT (STDMETHODCALLTYPE *DismissedWebViewBarricade)(
        Folder2 *This);

    END_INTERFACE
} Folder2Vtbl;

interface Folder2 {
    CONST_VTBL Folder2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define Folder2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define Folder2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define Folder2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define Folder2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define Folder2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define Folder2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define Folder2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** Folder methods ***/
#define Folder2_get_Title(This,pbs) (This)->lpVtbl->get_Title(This,pbs)
#define Folder2_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define Folder2_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define Folder2_get_ParentFolder(This,ppsf) (This)->lpVtbl->get_ParentFolder(This,ppsf)
#define Folder2_Items(This,ppid) (This)->lpVtbl->Items(This,ppid)
#define Folder2_ParseName(This,bName,ppid) (This)->lpVtbl->ParseName(This,bName,ppid)
#define Folder2_NewFolder(This,bName,vOptions) (This)->lpVtbl->NewFolder(This,bName,vOptions)
#define Folder2_MoveHere(This,vItem,vOptions) (This)->lpVtbl->MoveHere(This,vItem,vOptions)
#define Folder2_CopyHere(This,vItem,vOptions) (This)->lpVtbl->CopyHere(This,vItem,vOptions)
#define Folder2_GetDetailsOf(This,vItem,iColumn,pbs) (This)->lpVtbl->GetDetailsOf(This,vItem,iColumn,pbs)
/*** Folder2 methods ***/
#define Folder2_get_Self(This,ppfi) (This)->lpVtbl->get_Self(This,ppfi)
#define Folder2_get_OfflineStatus(This,pul) (This)->lpVtbl->get_OfflineStatus(This,pul)
#define Folder2_Synchronize(This) (This)->lpVtbl->Synchronize(This)
#define Folder2_get_HaveToShowWebViewBarricade(This,pbHaveToShowWebViewBarricade) (This)->lpVtbl->get_HaveToShowWebViewBarricade(This,pbHaveToShowWebViewBarricade)
#define Folder2_DismissedWebViewBarricade(This) (This)->lpVtbl->DismissedWebViewBarricade(This)
#else
/*** IUnknown methods ***/
static inline HRESULT Folder2_QueryInterface(Folder2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG Folder2_AddRef(Folder2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG Folder2_Release(Folder2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT Folder2_GetTypeInfoCount(Folder2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT Folder2_GetTypeInfo(Folder2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT Folder2_GetIDsOfNames(Folder2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT Folder2_Invoke(Folder2* 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);
}
/*** Folder methods ***/
static inline HRESULT Folder2_get_Title(Folder2* This,BSTR *pbs) {
    return This->lpVtbl->get_Title(This,pbs);
}
static inline HRESULT Folder2_get_Application(Folder2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT Folder2_get_Parent(Folder2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT Folder2_get_ParentFolder(Folder2* This,Folder **ppsf) {
    return This->lpVtbl->get_ParentFolder(This,ppsf);
}
static inline HRESULT Folder2_Items(Folder2* This,FolderItems **ppid) {
    return This->lpVtbl->Items(This,ppid);
}
static inline HRESULT Folder2_ParseName(Folder2* This,BSTR bName,FolderItem **ppid) {
    return This->lpVtbl->ParseName(This,bName,ppid);
}
static inline HRESULT Folder2_NewFolder(Folder2* This,BSTR bName,VARIANT vOptions) {
    return This->lpVtbl->NewFolder(This,bName,vOptions);
}
static inline HRESULT Folder2_MoveHere(Folder2* This,VARIANT vItem,VARIANT vOptions) {
    return This->lpVtbl->MoveHere(This,vItem,vOptions);
}
static inline HRESULT Folder2_CopyHere(Folder2* This,VARIANT vItem,VARIANT vOptions) {
    return This->lpVtbl->CopyHere(This,vItem,vOptions);
}
static inline HRESULT Folder2_GetDetailsOf(Folder2* This,VARIANT vItem,int iColumn,BSTR *pbs) {
    return This->lpVtbl->GetDetailsOf(This,vItem,iColumn,pbs);
}
/*** Folder2 methods ***/
static inline HRESULT Folder2_get_Self(Folder2* This,FolderItem **ppfi) {
    return This->lpVtbl->get_Self(This,ppfi);
}
static inline HRESULT Folder2_get_OfflineStatus(Folder2* This,LONG *pul) {
    return This->lpVtbl->get_OfflineStatus(This,pul);
}
static inline HRESULT Folder2_Synchronize(Folder2* This) {
    return This->lpVtbl->Synchronize(This);
}
static inline HRESULT Folder2_get_HaveToShowWebViewBarricade(Folder2* This,VARIANT_BOOL *pbHaveToShowWebViewBarricade) {
    return This->lpVtbl->get_HaveToShowWebViewBarricade(This,pbHaveToShowWebViewBarricade);
}
static inline HRESULT Folder2_DismissedWebViewBarricade(Folder2* This) {
    return This->lpVtbl->DismissedWebViewBarricade(This);
}
#endif
#endif

#endif


#endif  /* __Folder2_INTERFACE_DEFINED__ */

typedef enum OfflineFolderStatus {
    OFS_INACTIVE = -1,
    OFS_ONLINE = 0,
    OFS_OFFLINE = 1,
    OFS_SERVERBACK = 2,
    OFS_DIRTYCACHE = 3
} OfflineFolderStatus;
/*****************************************************************************
 * Folder3 interface
 */
#ifndef __Folder3_INTERFACE_DEFINED__
#define __Folder3_INTERFACE_DEFINED__

DEFINE_GUID(IID_Folder3, 0xa7ae5f64, 0xc4d7, 0x4d7f, 0x93,0x07, 0x4d,0x24,0xee,0x54,0xb8,0x41);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a7ae5f64-c4d7-4d7f-9307-4d24ee54b841")
Folder3 : public Folder2
{
    virtual HRESULT STDMETHODCALLTYPE get_ShowWebViewBarricade(
        VARIANT_BOOL *pbShowWebViewBarricade) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ShowWebViewBarricade(
        VARIANT_BOOL bShowWebViewBarricade) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(Folder3, 0xa7ae5f64, 0xc4d7, 0x4d7f, 0x93,0x07, 0x4d,0x24,0xee,0x54,0xb8,0x41)
#endif
#else
typedef struct Folder3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** Folder methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Title)(
        Folder3 *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *get_Application)(
        Folder3 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        Folder3 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_ParentFolder)(
        Folder3 *This,
        Folder **ppsf);

    HRESULT (STDMETHODCALLTYPE *Items)(
        Folder3 *This,
        FolderItems **ppid);

    HRESULT (STDMETHODCALLTYPE *ParseName)(
        Folder3 *This,
        BSTR bName,
        FolderItem **ppid);

    HRESULT (STDMETHODCALLTYPE *NewFolder)(
        Folder3 *This,
        BSTR bName,
        VARIANT vOptions);

    HRESULT (STDMETHODCALLTYPE *MoveHere)(
        Folder3 *This,
        VARIANT vItem,
        VARIANT vOptions);

    HRESULT (STDMETHODCALLTYPE *CopyHere)(
        Folder3 *This,
        VARIANT vItem,
        VARIANT vOptions);

    HRESULT (STDMETHODCALLTYPE *GetDetailsOf)(
        Folder3 *This,
        VARIANT vItem,
        int iColumn,
        BSTR *pbs);

    /*** Folder2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Self)(
        Folder3 *This,
        FolderItem **ppfi);

    HRESULT (STDMETHODCALLTYPE *get_OfflineStatus)(
        Folder3 *This,
        LONG *pul);

    HRESULT (STDMETHODCALLTYPE *Synchronize)(
        Folder3 *This);

    HRESULT (STDMETHODCALLTYPE *get_HaveToShowWebViewBarricade)(
        Folder3 *This,
        VARIANT_BOOL *pbHaveToShowWebViewBarricade);

    HRESULT (STDMETHODCALLTYPE *DismissedWebViewBarricade)(
        Folder3 *This);

    /*** Folder3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ShowWebViewBarricade)(
        Folder3 *This,
        VARIANT_BOOL *pbShowWebViewBarricade);

    HRESULT (STDMETHODCALLTYPE *put_ShowWebViewBarricade)(
        Folder3 *This,
        VARIANT_BOOL bShowWebViewBarricade);

    END_INTERFACE
} Folder3Vtbl;

interface Folder3 {
    CONST_VTBL Folder3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define Folder3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define Folder3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define Folder3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define Folder3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define Folder3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define Folder3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define Folder3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** Folder methods ***/
#define Folder3_get_Title(This,pbs) (This)->lpVtbl->get_Title(This,pbs)
#define Folder3_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define Folder3_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define Folder3_get_ParentFolder(This,ppsf) (This)->lpVtbl->get_ParentFolder(This,ppsf)
#define Folder3_Items(This,ppid) (This)->lpVtbl->Items(This,ppid)
#define Folder3_ParseName(This,bName,ppid) (This)->lpVtbl->ParseName(This,bName,ppid)
#define Folder3_NewFolder(This,bName,vOptions) (This)->lpVtbl->NewFolder(This,bName,vOptions)
#define Folder3_MoveHere(This,vItem,vOptions) (This)->lpVtbl->MoveHere(This,vItem,vOptions)
#define Folder3_CopyHere(This,vItem,vOptions) (This)->lpVtbl->CopyHere(This,vItem,vOptions)
#define Folder3_GetDetailsOf(This,vItem,iColumn,pbs) (This)->lpVtbl->GetDetailsOf(This,vItem,iColumn,pbs)
/*** Folder2 methods ***/
#define Folder3_get_Self(This,ppfi) (This)->lpVtbl->get_Self(This,ppfi)
#define Folder3_get_OfflineStatus(This,pul) (This)->lpVtbl->get_OfflineStatus(This,pul)
#define Folder3_Synchronize(This) (This)->lpVtbl->Synchronize(This)
#define Folder3_get_HaveToShowWebViewBarricade(This,pbHaveToShowWebViewBarricade) (This)->lpVtbl->get_HaveToShowWebViewBarricade(This,pbHaveToShowWebViewBarricade)
#define Folder3_DismissedWebViewBarricade(This) (This)->lpVtbl->DismissedWebViewBarricade(This)
/*** Folder3 methods ***/
#define Folder3_get_ShowWebViewBarricade(This,pbShowWebViewBarricade) (This)->lpVtbl->get_ShowWebViewBarricade(This,pbShowWebViewBarricade)
#define Folder3_put_ShowWebViewBarricade(This,bShowWebViewBarricade) (This)->lpVtbl->put_ShowWebViewBarricade(This,bShowWebViewBarricade)
#else
/*** IUnknown methods ***/
static inline HRESULT Folder3_QueryInterface(Folder3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG Folder3_AddRef(Folder3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG Folder3_Release(Folder3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT Folder3_GetTypeInfoCount(Folder3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT Folder3_GetTypeInfo(Folder3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT Folder3_GetIDsOfNames(Folder3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT Folder3_Invoke(Folder3* 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);
}
/*** Folder methods ***/
static inline HRESULT Folder3_get_Title(Folder3* This,BSTR *pbs) {
    return This->lpVtbl->get_Title(This,pbs);
}
static inline HRESULT Folder3_get_Application(Folder3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT Folder3_get_Parent(Folder3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT Folder3_get_ParentFolder(Folder3* This,Folder **ppsf) {
    return This->lpVtbl->get_ParentFolder(This,ppsf);
}
static inline HRESULT Folder3_Items(Folder3* This,FolderItems **ppid) {
    return This->lpVtbl->Items(This,ppid);
}
static inline HRESULT Folder3_ParseName(Folder3* This,BSTR bName,FolderItem **ppid) {
    return This->lpVtbl->ParseName(This,bName,ppid);
}
static inline HRESULT Folder3_NewFolder(Folder3* This,BSTR bName,VARIANT vOptions) {
    return This->lpVtbl->NewFolder(This,bName,vOptions);
}
static inline HRESULT Folder3_MoveHere(Folder3* This,VARIANT vItem,VARIANT vOptions) {
    return This->lpVtbl->MoveHere(This,vItem,vOptions);
}
static inline HRESULT Folder3_CopyHere(Folder3* This,VARIANT vItem,VARIANT vOptions) {
    return This->lpVtbl->CopyHere(This,vItem,vOptions);
}
static inline HRESULT Folder3_GetDetailsOf(Folder3* This,VARIANT vItem,int iColumn,BSTR *pbs) {
    return This->lpVtbl->GetDetailsOf(This,vItem,iColumn,pbs);
}
/*** Folder2 methods ***/
static inline HRESULT Folder3_get_Self(Folder3* This,FolderItem **ppfi) {
    return This->lpVtbl->get_Self(This,ppfi);
}
static inline HRESULT Folder3_get_OfflineStatus(Folder3* This,LONG *pul) {
    return This->lpVtbl->get_OfflineStatus(This,pul);
}
static inline HRESULT Folder3_Synchronize(Folder3* This) {
    return This->lpVtbl->Synchronize(This);
}
static inline HRESULT Folder3_get_HaveToShowWebViewBarricade(Folder3* This,VARIANT_BOOL *pbHaveToShowWebViewBarricade) {
    return This->lpVtbl->get_HaveToShowWebViewBarricade(This,pbHaveToShowWebViewBarricade);
}
static inline HRESULT Folder3_DismissedWebViewBarricade(Folder3* This) {
    return This->lpVtbl->DismissedWebViewBarricade(This);
}
/*** Folder3 methods ***/
static inline HRESULT Folder3_get_ShowWebViewBarricade(Folder3* This,VARIANT_BOOL *pbShowWebViewBarricade) {
    return This->lpVtbl->get_ShowWebViewBarricade(This,pbShowWebViewBarricade);
}
static inline HRESULT Folder3_put_ShowWebViewBarricade(Folder3* This,VARIANT_BOOL bShowWebViewBarricade) {
    return This->lpVtbl->put_ShowWebViewBarricade(This,bShowWebViewBarricade);
}
#endif
#endif

#endif


#endif  /* __Folder3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * FolderItem interface
 */
#ifndef __FolderItem_INTERFACE_DEFINED__
#define __FolderItem_INTERFACE_DEFINED__

typedef FolderItem *LPFOLDERITEM;
DEFINE_GUID(IID_FolderItem, 0xfac32c80, 0xcbe4, 0x11ce, 0x83,0x50, 0x44,0x45,0x53,0x54,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fac32c80-cbe4-11ce-8350-444553540000")
FolderItem : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Application(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Parent(
        IDispatch **ppid) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_Name(
        BSTR bs) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_GetLink(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_GetFolder(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsLink(
        VARIANT_BOOL *pb) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsFolder(
        VARIANT_BOOL *pb) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsFileSystem(
        VARIANT_BOOL *pb) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsBrowsable(
        VARIANT_BOOL *pb) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ModifyDate(
        DATE *pdt) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ModifyDate(
        DATE dt) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Size(
        LONG *pul) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Type(
        BSTR *pbs) = 0;

    virtual HRESULT STDMETHODCALLTYPE Verbs(
        FolderItemVerbs **ppfic) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvokeVerb(
        VARIANT vVerb) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FolderItem, 0xfac32c80, 0xcbe4, 0x11ce, 0x83,0x50, 0x44,0x45,0x53,0x54,0x00,0x00)
#endif
#else
typedef struct FolderItemVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** FolderItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Application)(
        FolderItem *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        FolderItem *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        FolderItem *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *put_Name)(
        FolderItem *This,
        BSTR bs);

    HRESULT (STDMETHODCALLTYPE *get_Path)(
        FolderItem *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *get_GetLink)(
        FolderItem *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_GetFolder)(
        FolderItem *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_IsLink)(
        FolderItem *This,
        VARIANT_BOOL *pb);

    HRESULT (STDMETHODCALLTYPE *get_IsFolder)(
        FolderItem *This,
        VARIANT_BOOL *pb);

    HRESULT (STDMETHODCALLTYPE *get_IsFileSystem)(
        FolderItem *This,
        VARIANT_BOOL *pb);

    HRESULT (STDMETHODCALLTYPE *get_IsBrowsable)(
        FolderItem *This,
        VARIANT_BOOL *pb);

    HRESULT (STDMETHODCALLTYPE *get_ModifyDate)(
        FolderItem *This,
        DATE *pdt);

    HRESULT (STDMETHODCALLTYPE *put_ModifyDate)(
        FolderItem *This,
        DATE dt);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        FolderItem *This,
        LONG *pul);

    HRESULT (STDMETHODCALLTYPE *get_Type)(
        FolderItem *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *Verbs)(
        FolderItem *This,
        FolderItemVerbs **ppfic);

    HRESULT (STDMETHODCALLTYPE *InvokeVerb)(
        FolderItem *This,
        VARIANT vVerb);

    END_INTERFACE
} FolderItemVtbl;

interface FolderItem {
    CONST_VTBL FolderItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define FolderItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define FolderItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define FolderItem_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define FolderItem_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define FolderItem_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define FolderItem_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define FolderItem_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** FolderItem methods ***/
#define FolderItem_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define FolderItem_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define FolderItem_get_Name(This,pbs) (This)->lpVtbl->get_Name(This,pbs)
#define FolderItem_put_Name(This,bs) (This)->lpVtbl->put_Name(This,bs)
#define FolderItem_get_Path(This,pbs) (This)->lpVtbl->get_Path(This,pbs)
#define FolderItem_get_GetLink(This,ppid) (This)->lpVtbl->get_GetLink(This,ppid)
#define FolderItem_get_GetFolder(This,ppid) (This)->lpVtbl->get_GetFolder(This,ppid)
#define FolderItem_get_IsLink(This,pb) (This)->lpVtbl->get_IsLink(This,pb)
#define FolderItem_get_IsFolder(This,pb) (This)->lpVtbl->get_IsFolder(This,pb)
#define FolderItem_get_IsFileSystem(This,pb) (This)->lpVtbl->get_IsFileSystem(This,pb)
#define FolderItem_get_IsBrowsable(This,pb) (This)->lpVtbl->get_IsBrowsable(This,pb)
#define FolderItem_get_ModifyDate(This,pdt) (This)->lpVtbl->get_ModifyDate(This,pdt)
#define FolderItem_put_ModifyDate(This,dt) (This)->lpVtbl->put_ModifyDate(This,dt)
#define FolderItem_get_Size(This,pul) (This)->lpVtbl->get_Size(This,pul)
#define FolderItem_get_Type(This,pbs) (This)->lpVtbl->get_Type(This,pbs)
#define FolderItem_Verbs(This,ppfic) (This)->lpVtbl->Verbs(This,ppfic)
#define FolderItem_InvokeVerb(This,vVerb) (This)->lpVtbl->InvokeVerb(This,vVerb)
#else
/*** IUnknown methods ***/
static inline HRESULT FolderItem_QueryInterface(FolderItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG FolderItem_AddRef(FolderItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG FolderItem_Release(FolderItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT FolderItem_GetTypeInfoCount(FolderItem* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT FolderItem_GetTypeInfo(FolderItem* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT FolderItem_GetIDsOfNames(FolderItem* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT FolderItem_Invoke(FolderItem* 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);
}
/*** FolderItem methods ***/
static inline HRESULT FolderItem_get_Application(FolderItem* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT FolderItem_get_Parent(FolderItem* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT FolderItem_get_Name(FolderItem* This,BSTR *pbs) {
    return This->lpVtbl->get_Name(This,pbs);
}
static inline HRESULT FolderItem_put_Name(FolderItem* This,BSTR bs) {
    return This->lpVtbl->put_Name(This,bs);
}
static inline HRESULT FolderItem_get_Path(FolderItem* This,BSTR *pbs) {
    return This->lpVtbl->get_Path(This,pbs);
}
static inline HRESULT FolderItem_get_GetLink(FolderItem* This,IDispatch **ppid) {
    return This->lpVtbl->get_GetLink(This,ppid);
}
static inline HRESULT FolderItem_get_GetFolder(FolderItem* This,IDispatch **ppid) {
    return This->lpVtbl->get_GetFolder(This,ppid);
}
static inline HRESULT FolderItem_get_IsLink(FolderItem* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsLink(This,pb);
}
static inline HRESULT FolderItem_get_IsFolder(FolderItem* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsFolder(This,pb);
}
static inline HRESULT FolderItem_get_IsFileSystem(FolderItem* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsFileSystem(This,pb);
}
static inline HRESULT FolderItem_get_IsBrowsable(FolderItem* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsBrowsable(This,pb);
}
static inline HRESULT FolderItem_get_ModifyDate(FolderItem* This,DATE *pdt) {
    return This->lpVtbl->get_ModifyDate(This,pdt);
}
static inline HRESULT FolderItem_put_ModifyDate(FolderItem* This,DATE dt) {
    return This->lpVtbl->put_ModifyDate(This,dt);
}
static inline HRESULT FolderItem_get_Size(FolderItem* This,LONG *pul) {
    return This->lpVtbl->get_Size(This,pul);
}
static inline HRESULT FolderItem_get_Type(FolderItem* This,BSTR *pbs) {
    return This->lpVtbl->get_Type(This,pbs);
}
static inline HRESULT FolderItem_Verbs(FolderItem* This,FolderItemVerbs **ppfic) {
    return This->lpVtbl->Verbs(This,ppfic);
}
static inline HRESULT FolderItem_InvokeVerb(FolderItem* This,VARIANT vVerb) {
    return This->lpVtbl->InvokeVerb(This,vVerb);
}
#endif
#endif

#endif


#endif  /* __FolderItem_INTERFACE_DEFINED__ */

/*****************************************************************************
 * FolderItem2 interface
 */
#ifndef __FolderItem2_INTERFACE_DEFINED__
#define __FolderItem2_INTERFACE_DEFINED__

DEFINE_GUID(IID_FolderItem2, 0xedc817aa, 0x92b8, 0x11d1, 0xb0,0x75, 0x00,0xc0,0x4f,0xc3,0x3a,0xa5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("edc817aa-92b8-11d1-b075-00c04fc33aa5")
FolderItem2 : public FolderItem
{
    virtual HRESULT STDMETHODCALLTYPE InvokeVerbEx(
        VARIANT vVerb,
        VARIANT vArgs) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExtendedProperty(
        BSTR bstrPropName,
        VARIANT *pvRet) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FolderItem2, 0xedc817aa, 0x92b8, 0x11d1, 0xb0,0x75, 0x00,0xc0,0x4f,0xc3,0x3a,0xa5)
#endif
#else
typedef struct FolderItem2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** FolderItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Application)(
        FolderItem2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        FolderItem2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        FolderItem2 *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *put_Name)(
        FolderItem2 *This,
        BSTR bs);

    HRESULT (STDMETHODCALLTYPE *get_Path)(
        FolderItem2 *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *get_GetLink)(
        FolderItem2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_GetFolder)(
        FolderItem2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_IsLink)(
        FolderItem2 *This,
        VARIANT_BOOL *pb);

    HRESULT (STDMETHODCALLTYPE *get_IsFolder)(
        FolderItem2 *This,
        VARIANT_BOOL *pb);

    HRESULT (STDMETHODCALLTYPE *get_IsFileSystem)(
        FolderItem2 *This,
        VARIANT_BOOL *pb);

    HRESULT (STDMETHODCALLTYPE *get_IsBrowsable)(
        FolderItem2 *This,
        VARIANT_BOOL *pb);

    HRESULT (STDMETHODCALLTYPE *get_ModifyDate)(
        FolderItem2 *This,
        DATE *pdt);

    HRESULT (STDMETHODCALLTYPE *put_ModifyDate)(
        FolderItem2 *This,
        DATE dt);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        FolderItem2 *This,
        LONG *pul);

    HRESULT (STDMETHODCALLTYPE *get_Type)(
        FolderItem2 *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *Verbs)(
        FolderItem2 *This,
        FolderItemVerbs **ppfic);

    HRESULT (STDMETHODCALLTYPE *InvokeVerb)(
        FolderItem2 *This,
        VARIANT vVerb);

    /*** FolderItem2 methods ***/
    HRESULT (STDMETHODCALLTYPE *InvokeVerbEx)(
        FolderItem2 *This,
        VARIANT vVerb,
        VARIANT vArgs);

    HRESULT (STDMETHODCALLTYPE *ExtendedProperty)(
        FolderItem2 *This,
        BSTR bstrPropName,
        VARIANT *pvRet);

    END_INTERFACE
} FolderItem2Vtbl;

interface FolderItem2 {
    CONST_VTBL FolderItem2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define FolderItem2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define FolderItem2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define FolderItem2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define FolderItem2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define FolderItem2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define FolderItem2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define FolderItem2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** FolderItem methods ***/
#define FolderItem2_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define FolderItem2_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define FolderItem2_get_Name(This,pbs) (This)->lpVtbl->get_Name(This,pbs)
#define FolderItem2_put_Name(This,bs) (This)->lpVtbl->put_Name(This,bs)
#define FolderItem2_get_Path(This,pbs) (This)->lpVtbl->get_Path(This,pbs)
#define FolderItem2_get_GetLink(This,ppid) (This)->lpVtbl->get_GetLink(This,ppid)
#define FolderItem2_get_GetFolder(This,ppid) (This)->lpVtbl->get_GetFolder(This,ppid)
#define FolderItem2_get_IsLink(This,pb) (This)->lpVtbl->get_IsLink(This,pb)
#define FolderItem2_get_IsFolder(This,pb) (This)->lpVtbl->get_IsFolder(This,pb)
#define FolderItem2_get_IsFileSystem(This,pb) (This)->lpVtbl->get_IsFileSystem(This,pb)
#define FolderItem2_get_IsBrowsable(This,pb) (This)->lpVtbl->get_IsBrowsable(This,pb)
#define FolderItem2_get_ModifyDate(This,pdt) (This)->lpVtbl->get_ModifyDate(This,pdt)
#define FolderItem2_put_ModifyDate(This,dt) (This)->lpVtbl->put_ModifyDate(This,dt)
#define FolderItem2_get_Size(This,pul) (This)->lpVtbl->get_Size(This,pul)
#define FolderItem2_get_Type(This,pbs) (This)->lpVtbl->get_Type(This,pbs)
#define FolderItem2_Verbs(This,ppfic) (This)->lpVtbl->Verbs(This,ppfic)
#define FolderItem2_InvokeVerb(This,vVerb) (This)->lpVtbl->InvokeVerb(This,vVerb)
/*** FolderItem2 methods ***/
#define FolderItem2_InvokeVerbEx(This,vVerb,vArgs) (This)->lpVtbl->InvokeVerbEx(This,vVerb,vArgs)
#define FolderItem2_ExtendedProperty(This,bstrPropName,pvRet) (This)->lpVtbl->ExtendedProperty(This,bstrPropName,pvRet)
#else
/*** IUnknown methods ***/
static inline HRESULT FolderItem2_QueryInterface(FolderItem2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG FolderItem2_AddRef(FolderItem2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG FolderItem2_Release(FolderItem2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT FolderItem2_GetTypeInfoCount(FolderItem2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT FolderItem2_GetTypeInfo(FolderItem2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT FolderItem2_GetIDsOfNames(FolderItem2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT FolderItem2_Invoke(FolderItem2* 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);
}
/*** FolderItem methods ***/
static inline HRESULT FolderItem2_get_Application(FolderItem2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT FolderItem2_get_Parent(FolderItem2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT FolderItem2_get_Name(FolderItem2* This,BSTR *pbs) {
    return This->lpVtbl->get_Name(This,pbs);
}
static inline HRESULT FolderItem2_put_Name(FolderItem2* This,BSTR bs) {
    return This->lpVtbl->put_Name(This,bs);
}
static inline HRESULT FolderItem2_get_Path(FolderItem2* This,BSTR *pbs) {
    return This->lpVtbl->get_Path(This,pbs);
}
static inline HRESULT FolderItem2_get_GetLink(FolderItem2* This,IDispatch **ppid) {
    return This->lpVtbl->get_GetLink(This,ppid);
}
static inline HRESULT FolderItem2_get_GetFolder(FolderItem2* This,IDispatch **ppid) {
    return This->lpVtbl->get_GetFolder(This,ppid);
}
static inline HRESULT FolderItem2_get_IsLink(FolderItem2* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsLink(This,pb);
}
static inline HRESULT FolderItem2_get_IsFolder(FolderItem2* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsFolder(This,pb);
}
static inline HRESULT FolderItem2_get_IsFileSystem(FolderItem2* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsFileSystem(This,pb);
}
static inline HRESULT FolderItem2_get_IsBrowsable(FolderItem2* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsBrowsable(This,pb);
}
static inline HRESULT FolderItem2_get_ModifyDate(FolderItem2* This,DATE *pdt) {
    return This->lpVtbl->get_ModifyDate(This,pdt);
}
static inline HRESULT FolderItem2_put_ModifyDate(FolderItem2* This,DATE dt) {
    return This->lpVtbl->put_ModifyDate(This,dt);
}
static inline HRESULT FolderItem2_get_Size(FolderItem2* This,LONG *pul) {
    return This->lpVtbl->get_Size(This,pul);
}
static inline HRESULT FolderItem2_get_Type(FolderItem2* This,BSTR *pbs) {
    return This->lpVtbl->get_Type(This,pbs);
}
static inline HRESULT FolderItem2_Verbs(FolderItem2* This,FolderItemVerbs **ppfic) {
    return This->lpVtbl->Verbs(This,ppfic);
}
static inline HRESULT FolderItem2_InvokeVerb(FolderItem2* This,VARIANT vVerb) {
    return This->lpVtbl->InvokeVerb(This,vVerb);
}
/*** FolderItem2 methods ***/
static inline HRESULT FolderItem2_InvokeVerbEx(FolderItem2* This,VARIANT vVerb,VARIANT vArgs) {
    return This->lpVtbl->InvokeVerbEx(This,vVerb,vArgs);
}
static inline HRESULT FolderItem2_ExtendedProperty(FolderItem2* This,BSTR bstrPropName,VARIANT *pvRet) {
    return This->lpVtbl->ExtendedProperty(This,bstrPropName,pvRet);
}
#endif
#endif

#endif


#endif  /* __FolderItem2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ShellFolderItem coclass
 */

DEFINE_GUID(CLSID_ShellFolderItem, 0x2fe352ea, 0xfd1f, 0x11d2, 0xb1,0xf4, 0x00,0xc0,0x4f,0x8e,0xeb,0x3e);

#ifdef __cplusplus
class DECLSPEC_UUID("2fe352ea-fd1f-11d2-b1f4-00c04f8eeb3e") ShellFolderItem;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ShellFolderItem, 0x2fe352ea, 0xfd1f, 0x11d2, 0xb1,0xf4, 0x00,0xc0,0x4f,0x8e,0xeb,0x3e)
#endif
#endif

/*****************************************************************************
 * FolderItems interface
 */
#ifndef __FolderItems_INTERFACE_DEFINED__
#define __FolderItems_INTERFACE_DEFINED__

DEFINE_GUID(IID_FolderItems, 0x744129e0, 0xcbe5, 0x11ce, 0x83,0x50, 0x44,0x45,0x53,0x54,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("744129e0-cbe5-11ce-8350-444553540000")
FolderItems : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *plCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Application(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Parent(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        VARIANT index,
        FolderItem **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE _NewEnum(
        IUnknown **ppunk) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FolderItems, 0x744129e0, 0xcbe5, 0x11ce, 0x83,0x50, 0x44,0x45,0x53,0x54,0x00,0x00)
#endif
#else
typedef struct FolderItemsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** FolderItems methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        FolderItems *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *get_Application)(
        FolderItems *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        FolderItems *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *Item)(
        FolderItems *This,
        VARIANT index,
        FolderItem **ppid);

    HRESULT (STDMETHODCALLTYPE *_NewEnum)(
        FolderItems *This,
        IUnknown **ppunk);

    END_INTERFACE
} FolderItemsVtbl;

interface FolderItems {
    CONST_VTBL FolderItemsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define FolderItems_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define FolderItems_AddRef(This) (This)->lpVtbl->AddRef(This)
#define FolderItems_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define FolderItems_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define FolderItems_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define FolderItems_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define FolderItems_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** FolderItems methods ***/
#define FolderItems_get_Count(This,plCount) (This)->lpVtbl->get_Count(This,plCount)
#define FolderItems_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define FolderItems_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define FolderItems_Item(This,index,ppid) (This)->lpVtbl->Item(This,index,ppid)
#define FolderItems__NewEnum(This,ppunk) (This)->lpVtbl->_NewEnum(This,ppunk)
#else
/*** IUnknown methods ***/
static inline HRESULT FolderItems_QueryInterface(FolderItems* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG FolderItems_AddRef(FolderItems* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG FolderItems_Release(FolderItems* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT FolderItems_GetTypeInfoCount(FolderItems* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT FolderItems_GetTypeInfo(FolderItems* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT FolderItems_GetIDsOfNames(FolderItems* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT FolderItems_Invoke(FolderItems* 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);
}
/*** FolderItems methods ***/
static inline HRESULT FolderItems_get_Count(FolderItems* This,LONG *plCount) {
    return This->lpVtbl->get_Count(This,plCount);
}
static inline HRESULT FolderItems_get_Application(FolderItems* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT FolderItems_get_Parent(FolderItems* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT FolderItems_Item(FolderItems* This,VARIANT index,FolderItem **ppid) {
    return This->lpVtbl->Item(This,index,ppid);
}
static inline HRESULT FolderItems__NewEnum(FolderItems* This,IUnknown **ppunk) {
    return This->lpVtbl->_NewEnum(This,ppunk);
}
#endif
#endif

#endif


#endif  /* __FolderItems_INTERFACE_DEFINED__ */

/*****************************************************************************
 * FolderItems2 interface
 */
#ifndef __FolderItems2_INTERFACE_DEFINED__
#define __FolderItems2_INTERFACE_DEFINED__

DEFINE_GUID(IID_FolderItems2, 0xc94f0ad0, 0xf363, 0x11d2, 0xa3,0x27, 0x00,0xc0,0x4f,0x8e,0xec,0x7f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c94f0ad0-f363-11d2-a327-00c04f8eec7f")
FolderItems2 : public FolderItems
{
    virtual HRESULT STDMETHODCALLTYPE InvokeVerbEx(
        VARIANT vVerb,
        VARIANT vArgs) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FolderItems2, 0xc94f0ad0, 0xf363, 0x11d2, 0xa3,0x27, 0x00,0xc0,0x4f,0x8e,0xec,0x7f)
#endif
#else
typedef struct FolderItems2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** FolderItems methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        FolderItems2 *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *get_Application)(
        FolderItems2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        FolderItems2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *Item)(
        FolderItems2 *This,
        VARIANT index,
        FolderItem **ppid);

    HRESULT (STDMETHODCALLTYPE *_NewEnum)(
        FolderItems2 *This,
        IUnknown **ppunk);

    /*** FolderItems2 methods ***/
    HRESULT (STDMETHODCALLTYPE *InvokeVerbEx)(
        FolderItems2 *This,
        VARIANT vVerb,
        VARIANT vArgs);

    END_INTERFACE
} FolderItems2Vtbl;

interface FolderItems2 {
    CONST_VTBL FolderItems2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define FolderItems2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define FolderItems2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define FolderItems2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define FolderItems2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define FolderItems2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define FolderItems2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define FolderItems2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** FolderItems methods ***/
#define FolderItems2_get_Count(This,plCount) (This)->lpVtbl->get_Count(This,plCount)
#define FolderItems2_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define FolderItems2_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define FolderItems2_Item(This,index,ppid) (This)->lpVtbl->Item(This,index,ppid)
#define FolderItems2__NewEnum(This,ppunk) (This)->lpVtbl->_NewEnum(This,ppunk)
/*** FolderItems2 methods ***/
#define FolderItems2_InvokeVerbEx(This,vVerb,vArgs) (This)->lpVtbl->InvokeVerbEx(This,vVerb,vArgs)
#else
/*** IUnknown methods ***/
static inline HRESULT FolderItems2_QueryInterface(FolderItems2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG FolderItems2_AddRef(FolderItems2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG FolderItems2_Release(FolderItems2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT FolderItems2_GetTypeInfoCount(FolderItems2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT FolderItems2_GetTypeInfo(FolderItems2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT FolderItems2_GetIDsOfNames(FolderItems2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT FolderItems2_Invoke(FolderItems2* 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);
}
/*** FolderItems methods ***/
static inline HRESULT FolderItems2_get_Count(FolderItems2* This,LONG *plCount) {
    return This->lpVtbl->get_Count(This,plCount);
}
static inline HRESULT FolderItems2_get_Application(FolderItems2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT FolderItems2_get_Parent(FolderItems2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT FolderItems2_Item(FolderItems2* This,VARIANT index,FolderItem **ppid) {
    return This->lpVtbl->Item(This,index,ppid);
}
static inline HRESULT FolderItems2__NewEnum(FolderItems2* This,IUnknown **ppunk) {
    return This->lpVtbl->_NewEnum(This,ppunk);
}
/*** FolderItems2 methods ***/
static inline HRESULT FolderItems2_InvokeVerbEx(FolderItems2* This,VARIANT vVerb,VARIANT vArgs) {
    return This->lpVtbl->InvokeVerbEx(This,vVerb,vArgs);
}
#endif
#endif

#endif


#endif  /* __FolderItems2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * FolderItems3 interface
 */
#ifndef __FolderItems3_INTERFACE_DEFINED__
#define __FolderItems3_INTERFACE_DEFINED__

DEFINE_GUID(IID_FolderItems3, 0xeaa7c309, 0xbbec, 0x49d5, 0x82,0x1d, 0x64,0xd9,0x66,0xcb,0x66,0x7f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("eaa7c309-bbec-49d5-821d-64d966cb667f")
FolderItems3 : public FolderItems2
{
    virtual HRESULT STDMETHODCALLTYPE Filter(
        LONG grfFlags,
        BSTR bstrFileSpec) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Verbs(
        FolderItemVerbs **ppfic) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FolderItems3, 0xeaa7c309, 0xbbec, 0x49d5, 0x82,0x1d, 0x64,0xd9,0x66,0xcb,0x66,0x7f)
#endif
#else
typedef struct FolderItems3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** FolderItems methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        FolderItems3 *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *get_Application)(
        FolderItems3 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        FolderItems3 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *Item)(
        FolderItems3 *This,
        VARIANT index,
        FolderItem **ppid);

    HRESULT (STDMETHODCALLTYPE *_NewEnum)(
        FolderItems3 *This,
        IUnknown **ppunk);

    /*** FolderItems2 methods ***/
    HRESULT (STDMETHODCALLTYPE *InvokeVerbEx)(
        FolderItems3 *This,
        VARIANT vVerb,
        VARIANT vArgs);

    /*** FolderItems3 methods ***/
    HRESULT (STDMETHODCALLTYPE *Filter)(
        FolderItems3 *This,
        LONG grfFlags,
        BSTR bstrFileSpec);

    HRESULT (STDMETHODCALLTYPE *get_Verbs)(
        FolderItems3 *This,
        FolderItemVerbs **ppfic);

    END_INTERFACE
} FolderItems3Vtbl;

interface FolderItems3 {
    CONST_VTBL FolderItems3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define FolderItems3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define FolderItems3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define FolderItems3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define FolderItems3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define FolderItems3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define FolderItems3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define FolderItems3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** FolderItems methods ***/
#define FolderItems3_get_Count(This,plCount) (This)->lpVtbl->get_Count(This,plCount)
#define FolderItems3_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define FolderItems3_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define FolderItems3_Item(This,index,ppid) (This)->lpVtbl->Item(This,index,ppid)
#define FolderItems3__NewEnum(This,ppunk) (This)->lpVtbl->_NewEnum(This,ppunk)
/*** FolderItems2 methods ***/
#define FolderItems3_InvokeVerbEx(This,vVerb,vArgs) (This)->lpVtbl->InvokeVerbEx(This,vVerb,vArgs)
/*** FolderItems3 methods ***/
#define FolderItems3_Filter(This,grfFlags,bstrFileSpec) (This)->lpVtbl->Filter(This,grfFlags,bstrFileSpec)
#define FolderItems3_get_Verbs(This,ppfic) (This)->lpVtbl->get_Verbs(This,ppfic)
#else
/*** IUnknown methods ***/
static inline HRESULT FolderItems3_QueryInterface(FolderItems3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG FolderItems3_AddRef(FolderItems3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG FolderItems3_Release(FolderItems3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT FolderItems3_GetTypeInfoCount(FolderItems3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT FolderItems3_GetTypeInfo(FolderItems3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT FolderItems3_GetIDsOfNames(FolderItems3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT FolderItems3_Invoke(FolderItems3* 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);
}
/*** FolderItems methods ***/
static inline HRESULT FolderItems3_get_Count(FolderItems3* This,LONG *plCount) {
    return This->lpVtbl->get_Count(This,plCount);
}
static inline HRESULT FolderItems3_get_Application(FolderItems3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT FolderItems3_get_Parent(FolderItems3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT FolderItems3_Item(FolderItems3* This,VARIANT index,FolderItem **ppid) {
    return This->lpVtbl->Item(This,index,ppid);
}
static inline HRESULT FolderItems3__NewEnum(FolderItems3* This,IUnknown **ppunk) {
    return This->lpVtbl->_NewEnum(This,ppunk);
}
/*** FolderItems2 methods ***/
static inline HRESULT FolderItems3_InvokeVerbEx(FolderItems3* This,VARIANT vVerb,VARIANT vArgs) {
    return This->lpVtbl->InvokeVerbEx(This,vVerb,vArgs);
}
/*** FolderItems3 methods ***/
static inline HRESULT FolderItems3_Filter(FolderItems3* This,LONG grfFlags,BSTR bstrFileSpec) {
    return This->lpVtbl->Filter(This,grfFlags,bstrFileSpec);
}
static inline HRESULT FolderItems3_get_Verbs(FolderItems3* This,FolderItemVerbs **ppfic) {
    return This->lpVtbl->get_Verbs(This,ppfic);
}
#endif
#endif

#endif


#endif  /* __FolderItems3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * FolderItemVerb interface
 */
#ifndef __FolderItemVerb_INTERFACE_DEFINED__
#define __FolderItemVerb_INTERFACE_DEFINED__

DEFINE_GUID(IID_FolderItemVerb, 0x08ec3e00, 0x50b0, 0x11cf, 0x96,0x0c, 0x00,0x80,0xc7,0xf4,0xee,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("08ec3e00-50b0-11cf-960c-0080c7f4ee85")
FolderItemVerb : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Application(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Parent(
        IDispatch **ppid) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE DoIt(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FolderItemVerb, 0x08ec3e00, 0x50b0, 0x11cf, 0x96,0x0c, 0x00,0x80,0xc7,0xf4,0xee,0x85)
#endif
#else
typedef struct FolderItemVerbVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** FolderItemVerb methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Application)(
        FolderItemVerb *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        FolderItemVerb *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        FolderItemVerb *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *DoIt)(
        FolderItemVerb *This);

    END_INTERFACE
} FolderItemVerbVtbl;

interface FolderItemVerb {
    CONST_VTBL FolderItemVerbVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define FolderItemVerb_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define FolderItemVerb_AddRef(This) (This)->lpVtbl->AddRef(This)
#define FolderItemVerb_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define FolderItemVerb_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define FolderItemVerb_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define FolderItemVerb_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define FolderItemVerb_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** FolderItemVerb methods ***/
#define FolderItemVerb_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define FolderItemVerb_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define FolderItemVerb_get_Name(This,pbs) (This)->lpVtbl->get_Name(This,pbs)
#define FolderItemVerb_DoIt(This) (This)->lpVtbl->DoIt(This)
#else
/*** IUnknown methods ***/
static inline HRESULT FolderItemVerb_QueryInterface(FolderItemVerb* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG FolderItemVerb_AddRef(FolderItemVerb* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG FolderItemVerb_Release(FolderItemVerb* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT FolderItemVerb_GetTypeInfoCount(FolderItemVerb* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT FolderItemVerb_GetTypeInfo(FolderItemVerb* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT FolderItemVerb_GetIDsOfNames(FolderItemVerb* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT FolderItemVerb_Invoke(FolderItemVerb* 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);
}
/*** FolderItemVerb methods ***/
static inline HRESULT FolderItemVerb_get_Application(FolderItemVerb* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT FolderItemVerb_get_Parent(FolderItemVerb* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT FolderItemVerb_get_Name(FolderItemVerb* This,BSTR *pbs) {
    return This->lpVtbl->get_Name(This,pbs);
}
static inline HRESULT FolderItemVerb_DoIt(FolderItemVerb* This) {
    return This->lpVtbl->DoIt(This);
}
#endif
#endif

#endif


#endif  /* __FolderItemVerb_INTERFACE_DEFINED__ */

/*****************************************************************************
 * FolderItemVerbs interface
 */
#ifndef __FolderItemVerbs_INTERFACE_DEFINED__
#define __FolderItemVerbs_INTERFACE_DEFINED__

DEFINE_GUID(IID_FolderItemVerbs, 0x1f8352c0, 0x50b0, 0x11cf, 0x96,0x0c, 0x00,0x80,0xc7,0xf4,0xee,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1f8352c0-50b0-11cf-960c-0080c7f4ee85")
FolderItemVerbs : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *plCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Application(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Parent(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        VARIANT index,
        FolderItemVerb **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE _NewEnum(
        IUnknown **ppunk) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FolderItemVerbs, 0x1f8352c0, 0x50b0, 0x11cf, 0x96,0x0c, 0x00,0x80,0xc7,0xf4,0xee,0x85)
#endif
#else
typedef struct FolderItemVerbsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** FolderItemVerbs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        FolderItemVerbs *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *get_Application)(
        FolderItemVerbs *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        FolderItemVerbs *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *Item)(
        FolderItemVerbs *This,
        VARIANT index,
        FolderItemVerb **ppid);

    HRESULT (STDMETHODCALLTYPE *_NewEnum)(
        FolderItemVerbs *This,
        IUnknown **ppunk);

    END_INTERFACE
} FolderItemVerbsVtbl;

interface FolderItemVerbs {
    CONST_VTBL FolderItemVerbsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define FolderItemVerbs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define FolderItemVerbs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define FolderItemVerbs_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define FolderItemVerbs_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define FolderItemVerbs_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define FolderItemVerbs_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define FolderItemVerbs_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** FolderItemVerbs methods ***/
#define FolderItemVerbs_get_Count(This,plCount) (This)->lpVtbl->get_Count(This,plCount)
#define FolderItemVerbs_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define FolderItemVerbs_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define FolderItemVerbs_Item(This,index,ppid) (This)->lpVtbl->Item(This,index,ppid)
#define FolderItemVerbs__NewEnum(This,ppunk) (This)->lpVtbl->_NewEnum(This,ppunk)
#else
/*** IUnknown methods ***/
static inline HRESULT FolderItemVerbs_QueryInterface(FolderItemVerbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG FolderItemVerbs_AddRef(FolderItemVerbs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG FolderItemVerbs_Release(FolderItemVerbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT FolderItemVerbs_GetTypeInfoCount(FolderItemVerbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT FolderItemVerbs_GetTypeInfo(FolderItemVerbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT FolderItemVerbs_GetIDsOfNames(FolderItemVerbs* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT FolderItemVerbs_Invoke(FolderItemVerbs* 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);
}
/*** FolderItemVerbs methods ***/
static inline HRESULT FolderItemVerbs_get_Count(FolderItemVerbs* This,LONG *plCount) {
    return This->lpVtbl->get_Count(This,plCount);
}
static inline HRESULT FolderItemVerbs_get_Application(FolderItemVerbs* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT FolderItemVerbs_get_Parent(FolderItemVerbs* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT FolderItemVerbs_Item(FolderItemVerbs* This,VARIANT index,FolderItemVerb **ppid) {
    return This->lpVtbl->Item(This,index,ppid);
}
static inline HRESULT FolderItemVerbs__NewEnum(FolderItemVerbs* This,IUnknown **ppunk) {
    return This->lpVtbl->_NewEnum(This,ppunk);
}
#endif
#endif

#endif


#endif  /* __FolderItemVerbs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IShellLinkDual interface
 */
#ifndef __IShellLinkDual_INTERFACE_DEFINED__
#define __IShellLinkDual_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellLinkDual, 0x88a05c00, 0xf000, 0x11ce, 0x83,0x50, 0x44,0x45,0x53,0x54,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("88a05c00-f000-11ce-8350-444553540000")
IShellLinkDual : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Path(
        BSTR *pbs) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Path(
        BSTR bs) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_Description(
        BSTR bs) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_WorkingDirectory(
        BSTR bs) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_Arguments(
        BSTR bs) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Hotkey(
        int *piHK) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Hotkey(
        int iHK) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ShowCommand(
        int *piShowCommand) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ShowCommand(
        int iShowCommand) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resolve(
        int fFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIconLocation(
        BSTR *pbs,
        int *piIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIconLocation(
        BSTR bs,
        int iIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE Save(
        VARIANT vWhere) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellLinkDual, 0x88a05c00, 0xf000, 0x11ce, 0x83,0x50, 0x44,0x45,0x53,0x54,0x00,0x00)
#endif
#else
typedef struct IShellLinkDualVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IShellLinkDual methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IShellLinkDual *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *put_Path)(
        IShellLinkDual *This,
        BSTR bs);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IShellLinkDual *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IShellLinkDual *This,
        BSTR bs);

    HRESULT (STDMETHODCALLTYPE *get_WorkingDirectory)(
        IShellLinkDual *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *put_WorkingDirectory)(
        IShellLinkDual *This,
        BSTR bs);

    HRESULT (STDMETHODCALLTYPE *get_Arguments)(
        IShellLinkDual *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *put_Arguments)(
        IShellLinkDual *This,
        BSTR bs);

    HRESULT (STDMETHODCALLTYPE *get_Hotkey)(
        IShellLinkDual *This,
        int *piHK);

    HRESULT (STDMETHODCALLTYPE *put_Hotkey)(
        IShellLinkDual *This,
        int iHK);

    HRESULT (STDMETHODCALLTYPE *get_ShowCommand)(
        IShellLinkDual *This,
        int *piShowCommand);

    HRESULT (STDMETHODCALLTYPE *put_ShowCommand)(
        IShellLinkDual *This,
        int iShowCommand);

    HRESULT (STDMETHODCALLTYPE *Resolve)(
        IShellLinkDual *This,
        int fFlags);

    HRESULT (STDMETHODCALLTYPE *GetIconLocation)(
        IShellLinkDual *This,
        BSTR *pbs,
        int *piIcon);

    HRESULT (STDMETHODCALLTYPE *SetIconLocation)(
        IShellLinkDual *This,
        BSTR bs,
        int iIcon);

    HRESULT (STDMETHODCALLTYPE *Save)(
        IShellLinkDual *This,
        VARIANT vWhere);

    END_INTERFACE
} IShellLinkDualVtbl;

interface IShellLinkDual {
    CONST_VTBL IShellLinkDualVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellLinkDual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellLinkDual_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellLinkDual_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IShellLinkDual_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IShellLinkDual_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IShellLinkDual_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IShellLinkDual_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IShellLinkDual methods ***/
#define IShellLinkDual_get_Path(This,pbs) (This)->lpVtbl->get_Path(This,pbs)
#define IShellLinkDual_put_Path(This,bs) (This)->lpVtbl->put_Path(This,bs)
#define IShellLinkDual_get_Description(This,pbs) (This)->lpVtbl->get_Description(This,pbs)
#define IShellLinkDual_put_Description(This,bs) (This)->lpVtbl->put_Description(This,bs)
#define IShellLinkDual_get_WorkingDirectory(This,pbs) (This)->lpVtbl->get_WorkingDirectory(This,pbs)
#define IShellLinkDual_put_WorkingDirectory(This,bs) (This)->lpVtbl->put_WorkingDirectory(This,bs)
#define IShellLinkDual_get_Arguments(This,pbs) (This)->lpVtbl->get_Arguments(This,pbs)
#define IShellLinkDual_put_Arguments(This,bs) (This)->lpVtbl->put_Arguments(This,bs)
#define IShellLinkDual_get_Hotkey(This,piHK) (This)->lpVtbl->get_Hotkey(This,piHK)
#define IShellLinkDual_put_Hotkey(This,iHK) (This)->lpVtbl->put_Hotkey(This,iHK)
#define IShellLinkDual_get_ShowCommand(This,piShowCommand) (This)->lpVtbl->get_ShowCommand(This,piShowCommand)
#define IShellLinkDual_put_ShowCommand(This,iShowCommand) (This)->lpVtbl->put_ShowCommand(This,iShowCommand)
#define IShellLinkDual_Resolve(This,fFlags) (This)->lpVtbl->Resolve(This,fFlags)
#define IShellLinkDual_GetIconLocation(This,pbs,piIcon) (This)->lpVtbl->GetIconLocation(This,pbs,piIcon)
#define IShellLinkDual_SetIconLocation(This,bs,iIcon) (This)->lpVtbl->SetIconLocation(This,bs,iIcon)
#define IShellLinkDual_Save(This,vWhere) (This)->lpVtbl->Save(This,vWhere)
#else
/*** IUnknown methods ***/
static inline HRESULT IShellLinkDual_QueryInterface(IShellLinkDual* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellLinkDual_AddRef(IShellLinkDual* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellLinkDual_Release(IShellLinkDual* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IShellLinkDual_GetTypeInfoCount(IShellLinkDual* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IShellLinkDual_GetTypeInfo(IShellLinkDual* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IShellLinkDual_GetIDsOfNames(IShellLinkDual* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IShellLinkDual_Invoke(IShellLinkDual* 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);
}
/*** IShellLinkDual methods ***/
static inline HRESULT IShellLinkDual_get_Path(IShellLinkDual* This,BSTR *pbs) {
    return This->lpVtbl->get_Path(This,pbs);
}
static inline HRESULT IShellLinkDual_put_Path(IShellLinkDual* This,BSTR bs) {
    return This->lpVtbl->put_Path(This,bs);
}
static inline HRESULT IShellLinkDual_get_Description(IShellLinkDual* This,BSTR *pbs) {
    return This->lpVtbl->get_Description(This,pbs);
}
static inline HRESULT IShellLinkDual_put_Description(IShellLinkDual* This,BSTR bs) {
    return This->lpVtbl->put_Description(This,bs);
}
static inline HRESULT IShellLinkDual_get_WorkingDirectory(IShellLinkDual* This,BSTR *pbs) {
    return This->lpVtbl->get_WorkingDirectory(This,pbs);
}
static inline HRESULT IShellLinkDual_put_WorkingDirectory(IShellLinkDual* This,BSTR bs) {
    return This->lpVtbl->put_WorkingDirectory(This,bs);
}
static inline HRESULT IShellLinkDual_get_Arguments(IShellLinkDual* This,BSTR *pbs) {
    return This->lpVtbl->get_Arguments(This,pbs);
}
static inline HRESULT IShellLinkDual_put_Arguments(IShellLinkDual* This,BSTR bs) {
    return This->lpVtbl->put_Arguments(This,bs);
}
static inline HRESULT IShellLinkDual_get_Hotkey(IShellLinkDual* This,int *piHK) {
    return This->lpVtbl->get_Hotkey(This,piHK);
}
static inline HRESULT IShellLinkDual_put_Hotkey(IShellLinkDual* This,int iHK) {
    return This->lpVtbl->put_Hotkey(This,iHK);
}
static inline HRESULT IShellLinkDual_get_ShowCommand(IShellLinkDual* This,int *piShowCommand) {
    return This->lpVtbl->get_ShowCommand(This,piShowCommand);
}
static inline HRESULT IShellLinkDual_put_ShowCommand(IShellLinkDual* This,int iShowCommand) {
    return This->lpVtbl->put_ShowCommand(This,iShowCommand);
}
static inline HRESULT IShellLinkDual_Resolve(IShellLinkDual* This,int fFlags) {
    return This->lpVtbl->Resolve(This,fFlags);
}
static inline HRESULT IShellLinkDual_GetIconLocation(IShellLinkDual* This,BSTR *pbs,int *piIcon) {
    return This->lpVtbl->GetIconLocation(This,pbs,piIcon);
}
static inline HRESULT IShellLinkDual_SetIconLocation(IShellLinkDual* This,BSTR bs,int iIcon) {
    return This->lpVtbl->SetIconLocation(This,bs,iIcon);
}
static inline HRESULT IShellLinkDual_Save(IShellLinkDual* This,VARIANT vWhere) {
    return This->lpVtbl->Save(This,vWhere);
}
#endif
#endif

#endif


#endif  /* __IShellLinkDual_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IShellLinkDual2 interface
 */
#ifndef __IShellLinkDual2_INTERFACE_DEFINED__
#define __IShellLinkDual2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellLinkDual2, 0x317ee249, 0xf12e, 0x11d2, 0xb1,0xe4, 0x00,0xc0,0x4f,0x8e,0xeb,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("317ee249-f12e-11d2-b1e4-00c04f8eeb3e")
IShellLinkDual2 : public IShellLinkDual
{
    virtual HRESULT STDMETHODCALLTYPE get_Target(
        FolderItem **ppfi) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellLinkDual2, 0x317ee249, 0xf12e, 0x11d2, 0xb1,0xe4, 0x00,0xc0,0x4f,0x8e,0xeb,0x3e)
#endif
#else
typedef struct IShellLinkDual2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IShellLinkDual methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IShellLinkDual2 *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *put_Path)(
        IShellLinkDual2 *This,
        BSTR bs);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IShellLinkDual2 *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IShellLinkDual2 *This,
        BSTR bs);

    HRESULT (STDMETHODCALLTYPE *get_WorkingDirectory)(
        IShellLinkDual2 *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *put_WorkingDirectory)(
        IShellLinkDual2 *This,
        BSTR bs);

    HRESULT (STDMETHODCALLTYPE *get_Arguments)(
        IShellLinkDual2 *This,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *put_Arguments)(
        IShellLinkDual2 *This,
        BSTR bs);

    HRESULT (STDMETHODCALLTYPE *get_Hotkey)(
        IShellLinkDual2 *This,
        int *piHK);

    HRESULT (STDMETHODCALLTYPE *put_Hotkey)(
        IShellLinkDual2 *This,
        int iHK);

    HRESULT (STDMETHODCALLTYPE *get_ShowCommand)(
        IShellLinkDual2 *This,
        int *piShowCommand);

    HRESULT (STDMETHODCALLTYPE *put_ShowCommand)(
        IShellLinkDual2 *This,
        int iShowCommand);

    HRESULT (STDMETHODCALLTYPE *Resolve)(
        IShellLinkDual2 *This,
        int fFlags);

    HRESULT (STDMETHODCALLTYPE *GetIconLocation)(
        IShellLinkDual2 *This,
        BSTR *pbs,
        int *piIcon);

    HRESULT (STDMETHODCALLTYPE *SetIconLocation)(
        IShellLinkDual2 *This,
        BSTR bs,
        int iIcon);

    HRESULT (STDMETHODCALLTYPE *Save)(
        IShellLinkDual2 *This,
        VARIANT vWhere);

    /*** IShellLinkDual2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Target)(
        IShellLinkDual2 *This,
        FolderItem **ppfi);

    END_INTERFACE
} IShellLinkDual2Vtbl;

interface IShellLinkDual2 {
    CONST_VTBL IShellLinkDual2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellLinkDual2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellLinkDual2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellLinkDual2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IShellLinkDual2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IShellLinkDual2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IShellLinkDual2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IShellLinkDual2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IShellLinkDual methods ***/
#define IShellLinkDual2_get_Path(This,pbs) (This)->lpVtbl->get_Path(This,pbs)
#define IShellLinkDual2_put_Path(This,bs) (This)->lpVtbl->put_Path(This,bs)
#define IShellLinkDual2_get_Description(This,pbs) (This)->lpVtbl->get_Description(This,pbs)
#define IShellLinkDual2_put_Description(This,bs) (This)->lpVtbl->put_Description(This,bs)
#define IShellLinkDual2_get_WorkingDirectory(This,pbs) (This)->lpVtbl->get_WorkingDirectory(This,pbs)
#define IShellLinkDual2_put_WorkingDirectory(This,bs) (This)->lpVtbl->put_WorkingDirectory(This,bs)
#define IShellLinkDual2_get_Arguments(This,pbs) (This)->lpVtbl->get_Arguments(This,pbs)
#define IShellLinkDual2_put_Arguments(This,bs) (This)->lpVtbl->put_Arguments(This,bs)
#define IShellLinkDual2_get_Hotkey(This,piHK) (This)->lpVtbl->get_Hotkey(This,piHK)
#define IShellLinkDual2_put_Hotkey(This,iHK) (This)->lpVtbl->put_Hotkey(This,iHK)
#define IShellLinkDual2_get_ShowCommand(This,piShowCommand) (This)->lpVtbl->get_ShowCommand(This,piShowCommand)
#define IShellLinkDual2_put_ShowCommand(This,iShowCommand) (This)->lpVtbl->put_ShowCommand(This,iShowCommand)
#define IShellLinkDual2_Resolve(This,fFlags) (This)->lpVtbl->Resolve(This,fFlags)
#define IShellLinkDual2_GetIconLocation(This,pbs,piIcon) (This)->lpVtbl->GetIconLocation(This,pbs,piIcon)
#define IShellLinkDual2_SetIconLocation(This,bs,iIcon) (This)->lpVtbl->SetIconLocation(This,bs,iIcon)
#define IShellLinkDual2_Save(This,vWhere) (This)->lpVtbl->Save(This,vWhere)
/*** IShellLinkDual2 methods ***/
#define IShellLinkDual2_get_Target(This,ppfi) (This)->lpVtbl->get_Target(This,ppfi)
#else
/*** IUnknown methods ***/
static inline HRESULT IShellLinkDual2_QueryInterface(IShellLinkDual2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellLinkDual2_AddRef(IShellLinkDual2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellLinkDual2_Release(IShellLinkDual2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IShellLinkDual2_GetTypeInfoCount(IShellLinkDual2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IShellLinkDual2_GetTypeInfo(IShellLinkDual2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IShellLinkDual2_GetIDsOfNames(IShellLinkDual2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IShellLinkDual2_Invoke(IShellLinkDual2* 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);
}
/*** IShellLinkDual methods ***/
static inline HRESULT IShellLinkDual2_get_Path(IShellLinkDual2* This,BSTR *pbs) {
    return This->lpVtbl->get_Path(This,pbs);
}
static inline HRESULT IShellLinkDual2_put_Path(IShellLinkDual2* This,BSTR bs) {
    return This->lpVtbl->put_Path(This,bs);
}
static inline HRESULT IShellLinkDual2_get_Description(IShellLinkDual2* This,BSTR *pbs) {
    return This->lpVtbl->get_Description(This,pbs);
}
static inline HRESULT IShellLinkDual2_put_Description(IShellLinkDual2* This,BSTR bs) {
    return This->lpVtbl->put_Description(This,bs);
}
static inline HRESULT IShellLinkDual2_get_WorkingDirectory(IShellLinkDual2* This,BSTR *pbs) {
    return This->lpVtbl->get_WorkingDirectory(This,pbs);
}
static inline HRESULT IShellLinkDual2_put_WorkingDirectory(IShellLinkDual2* This,BSTR bs) {
    return This->lpVtbl->put_WorkingDirectory(This,bs);
}
static inline HRESULT IShellLinkDual2_get_Arguments(IShellLinkDual2* This,BSTR *pbs) {
    return This->lpVtbl->get_Arguments(This,pbs);
}
static inline HRESULT IShellLinkDual2_put_Arguments(IShellLinkDual2* This,BSTR bs) {
    return This->lpVtbl->put_Arguments(This,bs);
}
static inline HRESULT IShellLinkDual2_get_Hotkey(IShellLinkDual2* This,int *piHK) {
    return This->lpVtbl->get_Hotkey(This,piHK);
}
static inline HRESULT IShellLinkDual2_put_Hotkey(IShellLinkDual2* This,int iHK) {
    return This->lpVtbl->put_Hotkey(This,iHK);
}
static inline HRESULT IShellLinkDual2_get_ShowCommand(IShellLinkDual2* This,int *piShowCommand) {
    return This->lpVtbl->get_ShowCommand(This,piShowCommand);
}
static inline HRESULT IShellLinkDual2_put_ShowCommand(IShellLinkDual2* This,int iShowCommand) {
    return This->lpVtbl->put_ShowCommand(This,iShowCommand);
}
static inline HRESULT IShellLinkDual2_Resolve(IShellLinkDual2* This,int fFlags) {
    return This->lpVtbl->Resolve(This,fFlags);
}
static inline HRESULT IShellLinkDual2_GetIconLocation(IShellLinkDual2* This,BSTR *pbs,int *piIcon) {
    return This->lpVtbl->GetIconLocation(This,pbs,piIcon);
}
static inline HRESULT IShellLinkDual2_SetIconLocation(IShellLinkDual2* This,BSTR bs,int iIcon) {
    return This->lpVtbl->SetIconLocation(This,bs,iIcon);
}
static inline HRESULT IShellLinkDual2_Save(IShellLinkDual2* This,VARIANT vWhere) {
    return This->lpVtbl->Save(This,vWhere);
}
/*** IShellLinkDual2 methods ***/
static inline HRESULT IShellLinkDual2_get_Target(IShellLinkDual2* This,FolderItem **ppfi) {
    return This->lpVtbl->get_Target(This,ppfi);
}
#endif
#endif

#endif


#endif  /* __IShellLinkDual2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ShellLinkObject coclass
 */

DEFINE_GUID(CLSID_ShellLinkObject, 0x11219420, 0x1768, 0x11d1, 0x95,0xbe, 0x00,0x60,0x97,0x97,0xea,0x4f);

#ifdef __cplusplus
class DECLSPEC_UUID("11219420-1768-11d1-95be-00609797ea4f") ShellLinkObject;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ShellLinkObject, 0x11219420, 0x1768, 0x11d1, 0x95,0xbe, 0x00,0x60,0x97,0x97,0xea,0x4f)
#endif
#endif

/*****************************************************************************
 * IShellFolderViewDual interface
 */
#ifndef __IShellFolderViewDual_INTERFACE_DEFINED__
#define __IShellFolderViewDual_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellFolderViewDual, 0xe7a1af80, 0x4d96, 0x11cf, 0x96,0x0c, 0x00,0x80,0xc7,0xf4,0xee,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e7a1af80-4d96-11cf-960c-0080c7f4ee85")
IShellFolderViewDual : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Application(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Parent(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Folder(
        Folder **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectedItems(
        FolderItems **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FocusedItem(
        FolderItem **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectItem(
        VARIANT *pvfi,
        int dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE PopupItemMenu(
        FolderItem *pfi,
        VARIANT vx,
        VARIANT vy,
        BSTR *pbs) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Script(
        IDispatch **ppDisp) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ViewOptions(
        LONG *plViewOptions) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellFolderViewDual, 0xe7a1af80, 0x4d96, 0x11cf, 0x96,0x0c, 0x00,0x80,0xc7,0xf4,0xee,0x85)
#endif
#else
typedef struct IShellFolderViewDualVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IShellFolderViewDual methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Application)(
        IShellFolderViewDual *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        IShellFolderViewDual *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Folder)(
        IShellFolderViewDual *This,
        Folder **ppid);

    HRESULT (STDMETHODCALLTYPE *SelectedItems)(
        IShellFolderViewDual *This,
        FolderItems **ppid);

    HRESULT (STDMETHODCALLTYPE *get_FocusedItem)(
        IShellFolderViewDual *This,
        FolderItem **ppid);

    HRESULT (STDMETHODCALLTYPE *SelectItem)(
        IShellFolderViewDual *This,
        VARIANT *pvfi,
        int dwFlags);

    HRESULT (STDMETHODCALLTYPE *PopupItemMenu)(
        IShellFolderViewDual *This,
        FolderItem *pfi,
        VARIANT vx,
        VARIANT vy,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *get_Script)(
        IShellFolderViewDual *This,
        IDispatch **ppDisp);

    HRESULT (STDMETHODCALLTYPE *get_ViewOptions)(
        IShellFolderViewDual *This,
        LONG *plViewOptions);

    END_INTERFACE
} IShellFolderViewDualVtbl;

interface IShellFolderViewDual {
    CONST_VTBL IShellFolderViewDualVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellFolderViewDual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellFolderViewDual_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellFolderViewDual_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IShellFolderViewDual_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IShellFolderViewDual_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IShellFolderViewDual_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IShellFolderViewDual_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IShellFolderViewDual methods ***/
#define IShellFolderViewDual_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define IShellFolderViewDual_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define IShellFolderViewDual_get_Folder(This,ppid) (This)->lpVtbl->get_Folder(This,ppid)
#define IShellFolderViewDual_SelectedItems(This,ppid) (This)->lpVtbl->SelectedItems(This,ppid)
#define IShellFolderViewDual_get_FocusedItem(This,ppid) (This)->lpVtbl->get_FocusedItem(This,ppid)
#define IShellFolderViewDual_SelectItem(This,pvfi,dwFlags) (This)->lpVtbl->SelectItem(This,pvfi,dwFlags)
#define IShellFolderViewDual_PopupItemMenu(This,pfi,vx,vy,pbs) (This)->lpVtbl->PopupItemMenu(This,pfi,vx,vy,pbs)
#define IShellFolderViewDual_get_Script(This,ppDisp) (This)->lpVtbl->get_Script(This,ppDisp)
#define IShellFolderViewDual_get_ViewOptions(This,plViewOptions) (This)->lpVtbl->get_ViewOptions(This,plViewOptions)
#else
/*** IUnknown methods ***/
static inline HRESULT IShellFolderViewDual_QueryInterface(IShellFolderViewDual* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellFolderViewDual_AddRef(IShellFolderViewDual* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellFolderViewDual_Release(IShellFolderViewDual* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IShellFolderViewDual_GetTypeInfoCount(IShellFolderViewDual* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IShellFolderViewDual_GetTypeInfo(IShellFolderViewDual* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IShellFolderViewDual_GetIDsOfNames(IShellFolderViewDual* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IShellFolderViewDual_Invoke(IShellFolderViewDual* 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);
}
/*** IShellFolderViewDual methods ***/
static inline HRESULT IShellFolderViewDual_get_Application(IShellFolderViewDual* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT IShellFolderViewDual_get_Parent(IShellFolderViewDual* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT IShellFolderViewDual_get_Folder(IShellFolderViewDual* This,Folder **ppid) {
    return This->lpVtbl->get_Folder(This,ppid);
}
static inline HRESULT IShellFolderViewDual_SelectedItems(IShellFolderViewDual* This,FolderItems **ppid) {
    return This->lpVtbl->SelectedItems(This,ppid);
}
static inline HRESULT IShellFolderViewDual_get_FocusedItem(IShellFolderViewDual* This,FolderItem **ppid) {
    return This->lpVtbl->get_FocusedItem(This,ppid);
}
static inline HRESULT IShellFolderViewDual_SelectItem(IShellFolderViewDual* This,VARIANT *pvfi,int dwFlags) {
    return This->lpVtbl->SelectItem(This,pvfi,dwFlags);
}
static inline HRESULT IShellFolderViewDual_PopupItemMenu(IShellFolderViewDual* This,FolderItem *pfi,VARIANT vx,VARIANT vy,BSTR *pbs) {
    return This->lpVtbl->PopupItemMenu(This,pfi,vx,vy,pbs);
}
static inline HRESULT IShellFolderViewDual_get_Script(IShellFolderViewDual* This,IDispatch **ppDisp) {
    return This->lpVtbl->get_Script(This,ppDisp);
}
static inline HRESULT IShellFolderViewDual_get_ViewOptions(IShellFolderViewDual* This,LONG *plViewOptions) {
    return This->lpVtbl->get_ViewOptions(This,plViewOptions);
}
#endif
#endif

#endif


#endif  /* __IShellFolderViewDual_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IShellFolderViewDual2 interface
 */
#ifndef __IShellFolderViewDual2_INTERFACE_DEFINED__
#define __IShellFolderViewDual2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellFolderViewDual2, 0x31c147b6, 0x0ade, 0x4a3c, 0xb5,0x14, 0xdd,0xf9,0x32,0xef,0x6d,0x17);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("31c147b6-0ade-4a3c-b514-ddf932ef6d17")
IShellFolderViewDual2 : public IShellFolderViewDual
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentViewMode(
        UINT *pViewMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CurrentViewMode(
        UINT ViewMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectItemRelative(
        int iRelative) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellFolderViewDual2, 0x31c147b6, 0x0ade, 0x4a3c, 0xb5,0x14, 0xdd,0xf9,0x32,0xef,0x6d,0x17)
#endif
#else
typedef struct IShellFolderViewDual2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IShellFolderViewDual methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Application)(
        IShellFolderViewDual2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        IShellFolderViewDual2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Folder)(
        IShellFolderViewDual2 *This,
        Folder **ppid);

    HRESULT (STDMETHODCALLTYPE *SelectedItems)(
        IShellFolderViewDual2 *This,
        FolderItems **ppid);

    HRESULT (STDMETHODCALLTYPE *get_FocusedItem)(
        IShellFolderViewDual2 *This,
        FolderItem **ppid);

    HRESULT (STDMETHODCALLTYPE *SelectItem)(
        IShellFolderViewDual2 *This,
        VARIANT *pvfi,
        int dwFlags);

    HRESULT (STDMETHODCALLTYPE *PopupItemMenu)(
        IShellFolderViewDual2 *This,
        FolderItem *pfi,
        VARIANT vx,
        VARIANT vy,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *get_Script)(
        IShellFolderViewDual2 *This,
        IDispatch **ppDisp);

    HRESULT (STDMETHODCALLTYPE *get_ViewOptions)(
        IShellFolderViewDual2 *This,
        LONG *plViewOptions);

    /*** IShellFolderViewDual2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentViewMode)(
        IShellFolderViewDual2 *This,
        UINT *pViewMode);

    HRESULT (STDMETHODCALLTYPE *put_CurrentViewMode)(
        IShellFolderViewDual2 *This,
        UINT ViewMode);

    HRESULT (STDMETHODCALLTYPE *SelectItemRelative)(
        IShellFolderViewDual2 *This,
        int iRelative);

    END_INTERFACE
} IShellFolderViewDual2Vtbl;

interface IShellFolderViewDual2 {
    CONST_VTBL IShellFolderViewDual2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellFolderViewDual2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellFolderViewDual2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellFolderViewDual2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IShellFolderViewDual2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IShellFolderViewDual2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IShellFolderViewDual2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IShellFolderViewDual2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IShellFolderViewDual methods ***/
#define IShellFolderViewDual2_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define IShellFolderViewDual2_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define IShellFolderViewDual2_get_Folder(This,ppid) (This)->lpVtbl->get_Folder(This,ppid)
#define IShellFolderViewDual2_SelectedItems(This,ppid) (This)->lpVtbl->SelectedItems(This,ppid)
#define IShellFolderViewDual2_get_FocusedItem(This,ppid) (This)->lpVtbl->get_FocusedItem(This,ppid)
#define IShellFolderViewDual2_SelectItem(This,pvfi,dwFlags) (This)->lpVtbl->SelectItem(This,pvfi,dwFlags)
#define IShellFolderViewDual2_PopupItemMenu(This,pfi,vx,vy,pbs) (This)->lpVtbl->PopupItemMenu(This,pfi,vx,vy,pbs)
#define IShellFolderViewDual2_get_Script(This,ppDisp) (This)->lpVtbl->get_Script(This,ppDisp)
#define IShellFolderViewDual2_get_ViewOptions(This,plViewOptions) (This)->lpVtbl->get_ViewOptions(This,plViewOptions)
/*** IShellFolderViewDual2 methods ***/
#define IShellFolderViewDual2_get_CurrentViewMode(This,pViewMode) (This)->lpVtbl->get_CurrentViewMode(This,pViewMode)
#define IShellFolderViewDual2_put_CurrentViewMode(This,ViewMode) (This)->lpVtbl->put_CurrentViewMode(This,ViewMode)
#define IShellFolderViewDual2_SelectItemRelative(This,iRelative) (This)->lpVtbl->SelectItemRelative(This,iRelative)
#else
/*** IUnknown methods ***/
static inline HRESULT IShellFolderViewDual2_QueryInterface(IShellFolderViewDual2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellFolderViewDual2_AddRef(IShellFolderViewDual2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellFolderViewDual2_Release(IShellFolderViewDual2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IShellFolderViewDual2_GetTypeInfoCount(IShellFolderViewDual2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IShellFolderViewDual2_GetTypeInfo(IShellFolderViewDual2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IShellFolderViewDual2_GetIDsOfNames(IShellFolderViewDual2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IShellFolderViewDual2_Invoke(IShellFolderViewDual2* 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);
}
/*** IShellFolderViewDual methods ***/
static inline HRESULT IShellFolderViewDual2_get_Application(IShellFolderViewDual2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT IShellFolderViewDual2_get_Parent(IShellFolderViewDual2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT IShellFolderViewDual2_get_Folder(IShellFolderViewDual2* This,Folder **ppid) {
    return This->lpVtbl->get_Folder(This,ppid);
}
static inline HRESULT IShellFolderViewDual2_SelectedItems(IShellFolderViewDual2* This,FolderItems **ppid) {
    return This->lpVtbl->SelectedItems(This,ppid);
}
static inline HRESULT IShellFolderViewDual2_get_FocusedItem(IShellFolderViewDual2* This,FolderItem **ppid) {
    return This->lpVtbl->get_FocusedItem(This,ppid);
}
static inline HRESULT IShellFolderViewDual2_SelectItem(IShellFolderViewDual2* This,VARIANT *pvfi,int dwFlags) {
    return This->lpVtbl->SelectItem(This,pvfi,dwFlags);
}
static inline HRESULT IShellFolderViewDual2_PopupItemMenu(IShellFolderViewDual2* This,FolderItem *pfi,VARIANT vx,VARIANT vy,BSTR *pbs) {
    return This->lpVtbl->PopupItemMenu(This,pfi,vx,vy,pbs);
}
static inline HRESULT IShellFolderViewDual2_get_Script(IShellFolderViewDual2* This,IDispatch **ppDisp) {
    return This->lpVtbl->get_Script(This,ppDisp);
}
static inline HRESULT IShellFolderViewDual2_get_ViewOptions(IShellFolderViewDual2* This,LONG *plViewOptions) {
    return This->lpVtbl->get_ViewOptions(This,plViewOptions);
}
/*** IShellFolderViewDual2 methods ***/
static inline HRESULT IShellFolderViewDual2_get_CurrentViewMode(IShellFolderViewDual2* This,UINT *pViewMode) {
    return This->lpVtbl->get_CurrentViewMode(This,pViewMode);
}
static inline HRESULT IShellFolderViewDual2_put_CurrentViewMode(IShellFolderViewDual2* This,UINT ViewMode) {
    return This->lpVtbl->put_CurrentViewMode(This,ViewMode);
}
static inline HRESULT IShellFolderViewDual2_SelectItemRelative(IShellFolderViewDual2* This,int iRelative) {
    return This->lpVtbl->SelectItemRelative(This,iRelative);
}
#endif
#endif

#endif


#endif  /* __IShellFolderViewDual2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IShellFolderViewDual3 interface
 */
#ifndef __IShellFolderViewDual3_INTERFACE_DEFINED__
#define __IShellFolderViewDual3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellFolderViewDual3, 0x29ec8e6c, 0x46d3, 0x411f, 0xba,0xaa, 0x61,0x1a,0x6c,0x9c,0xac,0x66);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("29ec8e6c-46d3-411f-baaa-611a6c9cac66")
IShellFolderViewDual3 : public IShellFolderViewDual2
{
    virtual HRESULT STDMETHODCALLTYPE get_GroupBy(
        BSTR *pbstrGroupBy) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_GroupBy(
        BSTR bstrGroupBy) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FolderFlags(
        DWORD *pdwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_FolderFlags(
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SortColumns(
        BSTR *pbstrSortColumns) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SortColumns(
        BSTR bstrSortColumns) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_IconSize(
        int iIconSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IconSize(
        int *piIconSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE FilterView(
        BSTR bstrFilterText) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellFolderViewDual3, 0x29ec8e6c, 0x46d3, 0x411f, 0xba,0xaa, 0x61,0x1a,0x6c,0x9c,0xac,0x66)
#endif
#else
typedef struct IShellFolderViewDual3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IShellFolderViewDual methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Application)(
        IShellFolderViewDual3 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        IShellFolderViewDual3 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Folder)(
        IShellFolderViewDual3 *This,
        Folder **ppid);

    HRESULT (STDMETHODCALLTYPE *SelectedItems)(
        IShellFolderViewDual3 *This,
        FolderItems **ppid);

    HRESULT (STDMETHODCALLTYPE *get_FocusedItem)(
        IShellFolderViewDual3 *This,
        FolderItem **ppid);

    HRESULT (STDMETHODCALLTYPE *SelectItem)(
        IShellFolderViewDual3 *This,
        VARIANT *pvfi,
        int dwFlags);

    HRESULT (STDMETHODCALLTYPE *PopupItemMenu)(
        IShellFolderViewDual3 *This,
        FolderItem *pfi,
        VARIANT vx,
        VARIANT vy,
        BSTR *pbs);

    HRESULT (STDMETHODCALLTYPE *get_Script)(
        IShellFolderViewDual3 *This,
        IDispatch **ppDisp);

    HRESULT (STDMETHODCALLTYPE *get_ViewOptions)(
        IShellFolderViewDual3 *This,
        LONG *plViewOptions);

    /*** IShellFolderViewDual2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentViewMode)(
        IShellFolderViewDual3 *This,
        UINT *pViewMode);

    HRESULT (STDMETHODCALLTYPE *put_CurrentViewMode)(
        IShellFolderViewDual3 *This,
        UINT ViewMode);

    HRESULT (STDMETHODCALLTYPE *SelectItemRelative)(
        IShellFolderViewDual3 *This,
        int iRelative);

    /*** IShellFolderViewDual3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_GroupBy)(
        IShellFolderViewDual3 *This,
        BSTR *pbstrGroupBy);

    HRESULT (STDMETHODCALLTYPE *put_GroupBy)(
        IShellFolderViewDual3 *This,
        BSTR bstrGroupBy);

    HRESULT (STDMETHODCALLTYPE *get_FolderFlags)(
        IShellFolderViewDual3 *This,
        DWORD *pdwFlags);

    HRESULT (STDMETHODCALLTYPE *put_FolderFlags)(
        IShellFolderViewDual3 *This,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *get_SortColumns)(
        IShellFolderViewDual3 *This,
        BSTR *pbstrSortColumns);

    HRESULT (STDMETHODCALLTYPE *put_SortColumns)(
        IShellFolderViewDual3 *This,
        BSTR bstrSortColumns);

    HRESULT (STDMETHODCALLTYPE *put_IconSize)(
        IShellFolderViewDual3 *This,
        int iIconSize);

    HRESULT (STDMETHODCALLTYPE *get_IconSize)(
        IShellFolderViewDual3 *This,
        int *piIconSize);

    HRESULT (STDMETHODCALLTYPE *FilterView)(
        IShellFolderViewDual3 *This,
        BSTR bstrFilterText);

    END_INTERFACE
} IShellFolderViewDual3Vtbl;

interface IShellFolderViewDual3 {
    CONST_VTBL IShellFolderViewDual3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellFolderViewDual3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellFolderViewDual3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellFolderViewDual3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IShellFolderViewDual3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IShellFolderViewDual3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IShellFolderViewDual3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IShellFolderViewDual3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IShellFolderViewDual methods ***/
#define IShellFolderViewDual3_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define IShellFolderViewDual3_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define IShellFolderViewDual3_get_Folder(This,ppid) (This)->lpVtbl->get_Folder(This,ppid)
#define IShellFolderViewDual3_SelectedItems(This,ppid) (This)->lpVtbl->SelectedItems(This,ppid)
#define IShellFolderViewDual3_get_FocusedItem(This,ppid) (This)->lpVtbl->get_FocusedItem(This,ppid)
#define IShellFolderViewDual3_SelectItem(This,pvfi,dwFlags) (This)->lpVtbl->SelectItem(This,pvfi,dwFlags)
#define IShellFolderViewDual3_PopupItemMenu(This,pfi,vx,vy,pbs) (This)->lpVtbl->PopupItemMenu(This,pfi,vx,vy,pbs)
#define IShellFolderViewDual3_get_Script(This,ppDisp) (This)->lpVtbl->get_Script(This,ppDisp)
#define IShellFolderViewDual3_get_ViewOptions(This,plViewOptions) (This)->lpVtbl->get_ViewOptions(This,plViewOptions)
/*** IShellFolderViewDual2 methods ***/
#define IShellFolderViewDual3_get_CurrentViewMode(This,pViewMode) (This)->lpVtbl->get_CurrentViewMode(This,pViewMode)
#define IShellFolderViewDual3_put_CurrentViewMode(This,ViewMode) (This)->lpVtbl->put_CurrentViewMode(This,ViewMode)
#define IShellFolderViewDual3_SelectItemRelative(This,iRelative) (This)->lpVtbl->SelectItemRelative(This,iRelative)
/*** IShellFolderViewDual3 methods ***/
#define IShellFolderViewDual3_get_GroupBy(This,pbstrGroupBy) (This)->lpVtbl->get_GroupBy(This,pbstrGroupBy)
#define IShellFolderViewDual3_put_GroupBy(This,bstrGroupBy) (This)->lpVtbl->put_GroupBy(This,bstrGroupBy)
#define IShellFolderViewDual3_get_FolderFlags(This,pdwFlags) (This)->lpVtbl->get_FolderFlags(This,pdwFlags)
#define IShellFolderViewDual3_put_FolderFlags(This,dwFlags) (This)->lpVtbl->put_FolderFlags(This,dwFlags)
#define IShellFolderViewDual3_get_SortColumns(This,pbstrSortColumns) (This)->lpVtbl->get_SortColumns(This,pbstrSortColumns)
#define IShellFolderViewDual3_put_SortColumns(This,bstrSortColumns) (This)->lpVtbl->put_SortColumns(This,bstrSortColumns)
#define IShellFolderViewDual3_put_IconSize(This,iIconSize) (This)->lpVtbl->put_IconSize(This,iIconSize)
#define IShellFolderViewDual3_get_IconSize(This,piIconSize) (This)->lpVtbl->get_IconSize(This,piIconSize)
#define IShellFolderViewDual3_FilterView(This,bstrFilterText) (This)->lpVtbl->FilterView(This,bstrFilterText)
#else
/*** IUnknown methods ***/
static inline HRESULT IShellFolderViewDual3_QueryInterface(IShellFolderViewDual3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellFolderViewDual3_AddRef(IShellFolderViewDual3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellFolderViewDual3_Release(IShellFolderViewDual3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IShellFolderViewDual3_GetTypeInfoCount(IShellFolderViewDual3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IShellFolderViewDual3_GetTypeInfo(IShellFolderViewDual3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IShellFolderViewDual3_GetIDsOfNames(IShellFolderViewDual3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IShellFolderViewDual3_Invoke(IShellFolderViewDual3* 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);
}
/*** IShellFolderViewDual methods ***/
static inline HRESULT IShellFolderViewDual3_get_Application(IShellFolderViewDual3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT IShellFolderViewDual3_get_Parent(IShellFolderViewDual3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT IShellFolderViewDual3_get_Folder(IShellFolderViewDual3* This,Folder **ppid) {
    return This->lpVtbl->get_Folder(This,ppid);
}
static inline HRESULT IShellFolderViewDual3_SelectedItems(IShellFolderViewDual3* This,FolderItems **ppid) {
    return This->lpVtbl->SelectedItems(This,ppid);
}
static inline HRESULT IShellFolderViewDual3_get_FocusedItem(IShellFolderViewDual3* This,FolderItem **ppid) {
    return This->lpVtbl->get_FocusedItem(This,ppid);
}
static inline HRESULT IShellFolderViewDual3_SelectItem(IShellFolderViewDual3* This,VARIANT *pvfi,int dwFlags) {
    return This->lpVtbl->SelectItem(This,pvfi,dwFlags);
}
static inline HRESULT IShellFolderViewDual3_PopupItemMenu(IShellFolderViewDual3* This,FolderItem *pfi,VARIANT vx,VARIANT vy,BSTR *pbs) {
    return This->lpVtbl->PopupItemMenu(This,pfi,vx,vy,pbs);
}
static inline HRESULT IShellFolderViewDual3_get_Script(IShellFolderViewDual3* This,IDispatch **ppDisp) {
    return This->lpVtbl->get_Script(This,ppDisp);
}
static inline HRESULT IShellFolderViewDual3_get_ViewOptions(IShellFolderViewDual3* This,LONG *plViewOptions) {
    return This->lpVtbl->get_ViewOptions(This,plViewOptions);
}
/*** IShellFolderViewDual2 methods ***/
static inline HRESULT IShellFolderViewDual3_get_CurrentViewMode(IShellFolderViewDual3* This,UINT *pViewMode) {
    return This->lpVtbl->get_CurrentViewMode(This,pViewMode);
}
static inline HRESULT IShellFolderViewDual3_put_CurrentViewMode(IShellFolderViewDual3* This,UINT ViewMode) {
    return This->lpVtbl->put_CurrentViewMode(This,ViewMode);
}
static inline HRESULT IShellFolderViewDual3_SelectItemRelative(IShellFolderViewDual3* This,int iRelative) {
    return This->lpVtbl->SelectItemRelative(This,iRelative);
}
/*** IShellFolderViewDual3 methods ***/
static inline HRESULT IShellFolderViewDual3_get_GroupBy(IShellFolderViewDual3* This,BSTR *pbstrGroupBy) {
    return This->lpVtbl->get_GroupBy(This,pbstrGroupBy);
}
static inline HRESULT IShellFolderViewDual3_put_GroupBy(IShellFolderViewDual3* This,BSTR bstrGroupBy) {
    return This->lpVtbl->put_GroupBy(This,bstrGroupBy);
}
static inline HRESULT IShellFolderViewDual3_get_FolderFlags(IShellFolderViewDual3* This,DWORD *pdwFlags) {
    return This->lpVtbl->get_FolderFlags(This,pdwFlags);
}
static inline HRESULT IShellFolderViewDual3_put_FolderFlags(IShellFolderViewDual3* This,DWORD dwFlags) {
    return This->lpVtbl->put_FolderFlags(This,dwFlags);
}
static inline HRESULT IShellFolderViewDual3_get_SortColumns(IShellFolderViewDual3* This,BSTR *pbstrSortColumns) {
    return This->lpVtbl->get_SortColumns(This,pbstrSortColumns);
}
static inline HRESULT IShellFolderViewDual3_put_SortColumns(IShellFolderViewDual3* This,BSTR bstrSortColumns) {
    return This->lpVtbl->put_SortColumns(This,bstrSortColumns);
}
static inline HRESULT IShellFolderViewDual3_put_IconSize(IShellFolderViewDual3* This,int iIconSize) {
    return This->lpVtbl->put_IconSize(This,iIconSize);
}
static inline HRESULT IShellFolderViewDual3_get_IconSize(IShellFolderViewDual3* This,int *piIconSize) {
    return This->lpVtbl->get_IconSize(This,piIconSize);
}
static inline HRESULT IShellFolderViewDual3_FilterView(IShellFolderViewDual3* This,BSTR bstrFilterText) {
    return This->lpVtbl->FilterView(This,bstrFilterText);
}
#endif
#endif

#endif


#endif  /* __IShellFolderViewDual3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ShellFolderView coclass
 */

DEFINE_GUID(CLSID_ShellFolderView, 0x62112aa1, 0xebe4, 0x11cf, 0xa5,0xfb, 0x00,0x20,0xaf,0xe7,0x29,0x2d);

#ifdef __cplusplus
class DECLSPEC_UUID("62112aa1-ebe4-11cf-a5fb-0020afe7292d") ShellFolderView;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ShellFolderView, 0x62112aa1, 0xebe4, 0x11cf, 0xa5,0xfb, 0x00,0x20,0xaf,0xe7,0x29,0x2d)
#endif
#endif

typedef enum ShellFolderViewOptions {
    SFVVO_SHOWALLOBJECTS = 0x1,
    SFVVO_SHOWEXTENSIONS = 0x2,
    SFVVO_SHOWCOMPCOLOR = 0x8,
    SFVVO_SHOWSYSFILES = 0x20,
    SFVVO_WIN95CLASSIC = 0x40,
    SFVVO_DOUBLECLICKINWEBVIEW = 0x80,
    SFVVO_DESKTOPHTML = 0x200
} ShellFolderViewOptions;
/*****************************************************************************
 * IShellDispatch interface
 */
#ifndef __IShellDispatch_INTERFACE_DEFINED__
#define __IShellDispatch_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellDispatch, 0xd8f015c0, 0xc278, 0x11ce, 0xa4,0x9e, 0x44,0x45,0x53,0x54,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d8f015c0-c278-11ce-a49e-444553540000")
IShellDispatch : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Application(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Parent(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE NameSpace(
        VARIANT vDir,
        Folder **ppsdf) = 0;

    virtual HRESULT STDMETHODCALLTYPE BrowseForFolder(
        LONG Hwnd,
        BSTR Title,
        LONG Options,
        VARIANT RootFolder,
        Folder **ppsdf) = 0;

    virtual HRESULT STDMETHODCALLTYPE Windows(
        IDispatch **ppid) = 0;

    virtual HRESULT STDMETHODCALLTYPE Open(
        VARIANT vDir) = 0;

    virtual HRESULT STDMETHODCALLTYPE Explore(
        VARIANT vDir) = 0;

    virtual HRESULT STDMETHODCALLTYPE MinimizeAll(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE UndoMinimizeALL(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE FileRun(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CascadeWindows(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE TileVertically(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE TileHorizontally(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShutdownWindows(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Suspend(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE EjectPC(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTime(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE TrayProperties(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Help(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindFiles(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindComputer(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RefreshMenu(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ControlPanelItem(
        BSTR bstrDir) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellDispatch, 0xd8f015c0, 0xc278, 0x11ce, 0xa4,0x9e, 0x44,0x45,0x53,0x54,0x00,0x00)
#endif
#else
typedef struct IShellDispatchVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IShellDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Application)(
        IShellDispatch *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        IShellDispatch *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *NameSpace)(
        IShellDispatch *This,
        VARIANT vDir,
        Folder **ppsdf);

    HRESULT (STDMETHODCALLTYPE *BrowseForFolder)(
        IShellDispatch *This,
        LONG Hwnd,
        BSTR Title,
        LONG Options,
        VARIANT RootFolder,
        Folder **ppsdf);

    HRESULT (STDMETHODCALLTYPE *Windows)(
        IShellDispatch *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *Open)(
        IShellDispatch *This,
        VARIANT vDir);

    HRESULT (STDMETHODCALLTYPE *Explore)(
        IShellDispatch *This,
        VARIANT vDir);

    HRESULT (STDMETHODCALLTYPE *MinimizeAll)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *UndoMinimizeALL)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *FileRun)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *CascadeWindows)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *TileVertically)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *TileHorizontally)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *ShutdownWindows)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *Suspend)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *EjectPC)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *SetTime)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *TrayProperties)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *Help)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *FindFiles)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *FindComputer)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *RefreshMenu)(
        IShellDispatch *This);

    HRESULT (STDMETHODCALLTYPE *ControlPanelItem)(
        IShellDispatch *This,
        BSTR bstrDir);

    END_INTERFACE
} IShellDispatchVtbl;

interface IShellDispatch {
    CONST_VTBL IShellDispatchVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellDispatch_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellDispatch_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellDispatch_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IShellDispatch_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IShellDispatch_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IShellDispatch_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IShellDispatch_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IShellDispatch methods ***/
#define IShellDispatch_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define IShellDispatch_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define IShellDispatch_NameSpace(This,vDir,ppsdf) (This)->lpVtbl->NameSpace(This,vDir,ppsdf)
#define IShellDispatch_BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf) (This)->lpVtbl->BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf)
#define IShellDispatch_Windows(This,ppid) (This)->lpVtbl->Windows(This,ppid)
#define IShellDispatch_Open(This,vDir) (This)->lpVtbl->Open(This,vDir)
#define IShellDispatch_Explore(This,vDir) (This)->lpVtbl->Explore(This,vDir)
#define IShellDispatch_MinimizeAll(This) (This)->lpVtbl->MinimizeAll(This)
#define IShellDispatch_UndoMinimizeALL(This) (This)->lpVtbl->UndoMinimizeALL(This)
#define IShellDispatch_FileRun(This) (This)->lpVtbl->FileRun(This)
#define IShellDispatch_CascadeWindows(This) (This)->lpVtbl->CascadeWindows(This)
#define IShellDispatch_TileVertically(This) (This)->lpVtbl->TileVertically(This)
#define IShellDispatch_TileHorizontally(This) (This)->lpVtbl->TileHorizontally(This)
#define IShellDispatch_ShutdownWindows(This) (This)->lpVtbl->ShutdownWindows(This)
#define IShellDispatch_Suspend(This) (This)->lpVtbl->Suspend(This)
#define IShellDispatch_EjectPC(This) (This)->lpVtbl->EjectPC(This)
#define IShellDispatch_SetTime(This) (This)->lpVtbl->SetTime(This)
#define IShellDispatch_TrayProperties(This) (This)->lpVtbl->TrayProperties(This)
#define IShellDispatch_Help(This) (This)->lpVtbl->Help(This)
#define IShellDispatch_FindFiles(This) (This)->lpVtbl->FindFiles(This)
#define IShellDispatch_FindComputer(This) (This)->lpVtbl->FindComputer(This)
#define IShellDispatch_RefreshMenu(This) (This)->lpVtbl->RefreshMenu(This)
#define IShellDispatch_ControlPanelItem(This,bstrDir) (This)->lpVtbl->ControlPanelItem(This,bstrDir)
#else
/*** IUnknown methods ***/
static inline HRESULT IShellDispatch_QueryInterface(IShellDispatch* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellDispatch_AddRef(IShellDispatch* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellDispatch_Release(IShellDispatch* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IShellDispatch_GetTypeInfoCount(IShellDispatch* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IShellDispatch_GetTypeInfo(IShellDispatch* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IShellDispatch_GetIDsOfNames(IShellDispatch* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IShellDispatch_Invoke(IShellDispatch* 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);
}
/*** IShellDispatch methods ***/
static inline HRESULT IShellDispatch_get_Application(IShellDispatch* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT IShellDispatch_get_Parent(IShellDispatch* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT IShellDispatch_NameSpace(IShellDispatch* This,VARIANT vDir,Folder **ppsdf) {
    return This->lpVtbl->NameSpace(This,vDir,ppsdf);
}
static inline HRESULT IShellDispatch_BrowseForFolder(IShellDispatch* This,LONG Hwnd,BSTR Title,LONG Options,VARIANT RootFolder,Folder **ppsdf) {
    return This->lpVtbl->BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf);
}
static inline HRESULT IShellDispatch_Windows(IShellDispatch* This,IDispatch **ppid) {
    return This->lpVtbl->Windows(This,ppid);
}
static inline HRESULT IShellDispatch_Open(IShellDispatch* This,VARIANT vDir) {
    return This->lpVtbl->Open(This,vDir);
}
static inline HRESULT IShellDispatch_Explore(IShellDispatch* This,VARIANT vDir) {
    return This->lpVtbl->Explore(This,vDir);
}
static inline HRESULT IShellDispatch_MinimizeAll(IShellDispatch* This) {
    return This->lpVtbl->MinimizeAll(This);
}
static inline HRESULT IShellDispatch_UndoMinimizeALL(IShellDispatch* This) {
    return This->lpVtbl->UndoMinimizeALL(This);
}
static inline HRESULT IShellDispatch_FileRun(IShellDispatch* This) {
    return This->lpVtbl->FileRun(This);
}
static inline HRESULT IShellDispatch_CascadeWindows(IShellDispatch* This) {
    return This->lpVtbl->CascadeWindows(This);
}
static inline HRESULT IShellDispatch_TileVertically(IShellDispatch* This) {
    return This->lpVtbl->TileVertically(This);
}
static inline HRESULT IShellDispatch_TileHorizontally(IShellDispatch* This) {
    return This->lpVtbl->TileHorizontally(This);
}
static inline HRESULT IShellDispatch_ShutdownWindows(IShellDispatch* This) {
    return This->lpVtbl->ShutdownWindows(This);
}
static inline HRESULT IShellDispatch_Suspend(IShellDispatch* This) {
    return This->lpVtbl->Suspend(This);
}
static inline HRESULT IShellDispatch_EjectPC(IShellDispatch* This) {
    return This->lpVtbl->EjectPC(This);
}
static inline HRESULT IShellDispatch_SetTime(IShellDispatch* This) {
    return This->lpVtbl->SetTime(This);
}
static inline HRESULT IShellDispatch_TrayProperties(IShellDispatch* This) {
    return This->lpVtbl->TrayProperties(This);
}
static inline HRESULT IShellDispatch_Help(IShellDispatch* This) {
    return This->lpVtbl->Help(This);
}
static inline HRESULT IShellDispatch_FindFiles(IShellDispatch* This) {
    return This->lpVtbl->FindFiles(This);
}
static inline HRESULT IShellDispatch_FindComputer(IShellDispatch* This) {
    return This->lpVtbl->FindComputer(This);
}
static inline HRESULT IShellDispatch_RefreshMenu(IShellDispatch* This) {
    return This->lpVtbl->RefreshMenu(This);
}
static inline HRESULT IShellDispatch_ControlPanelItem(IShellDispatch* This,BSTR bstrDir) {
    return This->lpVtbl->ControlPanelItem(This,bstrDir);
}
#endif
#endif

#endif


#endif  /* __IShellDispatch_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IShellDispatch2 interface
 */
#ifndef __IShellDispatch2_INTERFACE_DEFINED__
#define __IShellDispatch2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellDispatch2, 0xa4c6892c, 0x3ba9, 0x11d2, 0x9d,0xea, 0x00,0xc0,0x4f,0xb1,0x61,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a4c6892c-3ba9-11d2-9dea-00c04fb16162")
IShellDispatch2 : public IShellDispatch
{
    virtual HRESULT STDMETHODCALLTYPE IsRestricted(
        BSTR Group,
        BSTR Restriction,
        LONG *plRestrictValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShellExecute(
        BSTR File,
        VARIANT vArgs,
        VARIANT vDir,
        VARIANT vOperation,
        VARIANT vShow) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindPrinter(
        BSTR name,
        BSTR location,
        BSTR model) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSystemInformation(
        BSTR name,
        VARIANT *pv) = 0;

    virtual HRESULT STDMETHODCALLTYPE ServiceStart(
        BSTR ServiceName,
        VARIANT Persistent,
        VARIANT *pSuccess) = 0;

    virtual HRESULT STDMETHODCALLTYPE ServiceStop(
        BSTR ServiceName,
        VARIANT Persistent,
        VARIANT *pSuccess) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsServiceRunning(
        BSTR ServiceName,
        VARIANT *pRunning) = 0;

    virtual HRESULT STDMETHODCALLTYPE CanStartStopService(
        BSTR ServiceName,
        VARIANT *pCanStartStop) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShowBrowserBar(
        BSTR bstrClsid,
        VARIANT bShow,
        VARIANT *pSuccess) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellDispatch2, 0xa4c6892c, 0x3ba9, 0x11d2, 0x9d,0xea, 0x00,0xc0,0x4f,0xb1,0x61,0x62)
#endif
#else
typedef struct IShellDispatch2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IShellDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Application)(
        IShellDispatch2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        IShellDispatch2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *NameSpace)(
        IShellDispatch2 *This,
        VARIANT vDir,
        Folder **ppsdf);

    HRESULT (STDMETHODCALLTYPE *BrowseForFolder)(
        IShellDispatch2 *This,
        LONG Hwnd,
        BSTR Title,
        LONG Options,
        VARIANT RootFolder,
        Folder **ppsdf);

    HRESULT (STDMETHODCALLTYPE *Windows)(
        IShellDispatch2 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *Open)(
        IShellDispatch2 *This,
        VARIANT vDir);

    HRESULT (STDMETHODCALLTYPE *Explore)(
        IShellDispatch2 *This,
        VARIANT vDir);

    HRESULT (STDMETHODCALLTYPE *MinimizeAll)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *UndoMinimizeALL)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *FileRun)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *CascadeWindows)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *TileVertically)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *TileHorizontally)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *ShutdownWindows)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *Suspend)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *EjectPC)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *SetTime)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *TrayProperties)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *Help)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *FindFiles)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *FindComputer)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *RefreshMenu)(
        IShellDispatch2 *This);

    HRESULT (STDMETHODCALLTYPE *ControlPanelItem)(
        IShellDispatch2 *This,
        BSTR bstrDir);

    /*** IShellDispatch2 methods ***/
    HRESULT (STDMETHODCALLTYPE *IsRestricted)(
        IShellDispatch2 *This,
        BSTR Group,
        BSTR Restriction,
        LONG *plRestrictValue);

    HRESULT (STDMETHODCALLTYPE *ShellExecute)(
        IShellDispatch2 *This,
        BSTR File,
        VARIANT vArgs,
        VARIANT vDir,
        VARIANT vOperation,
        VARIANT vShow);

    HRESULT (STDMETHODCALLTYPE *FindPrinter)(
        IShellDispatch2 *This,
        BSTR name,
        BSTR location,
        BSTR model);

    HRESULT (STDMETHODCALLTYPE *GetSystemInformation)(
        IShellDispatch2 *This,
        BSTR name,
        VARIANT *pv);

    HRESULT (STDMETHODCALLTYPE *ServiceStart)(
        IShellDispatch2 *This,
        BSTR ServiceName,
        VARIANT Persistent,
        VARIANT *pSuccess);

    HRESULT (STDMETHODCALLTYPE *ServiceStop)(
        IShellDispatch2 *This,
        BSTR ServiceName,
        VARIANT Persistent,
        VARIANT *pSuccess);

    HRESULT (STDMETHODCALLTYPE *IsServiceRunning)(
        IShellDispatch2 *This,
        BSTR ServiceName,
        VARIANT *pRunning);

    HRESULT (STDMETHODCALLTYPE *CanStartStopService)(
        IShellDispatch2 *This,
        BSTR ServiceName,
        VARIANT *pCanStartStop);

    HRESULT (STDMETHODCALLTYPE *ShowBrowserBar)(
        IShellDispatch2 *This,
        BSTR bstrClsid,
        VARIANT bShow,
        VARIANT *pSuccess);

    END_INTERFACE
} IShellDispatch2Vtbl;

interface IShellDispatch2 {
    CONST_VTBL IShellDispatch2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellDispatch2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellDispatch2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellDispatch2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IShellDispatch2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IShellDispatch2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IShellDispatch2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IShellDispatch2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IShellDispatch methods ***/
#define IShellDispatch2_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define IShellDispatch2_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define IShellDispatch2_NameSpace(This,vDir,ppsdf) (This)->lpVtbl->NameSpace(This,vDir,ppsdf)
#define IShellDispatch2_BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf) (This)->lpVtbl->BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf)
#define IShellDispatch2_Windows(This,ppid) (This)->lpVtbl->Windows(This,ppid)
#define IShellDispatch2_Open(This,vDir) (This)->lpVtbl->Open(This,vDir)
#define IShellDispatch2_Explore(This,vDir) (This)->lpVtbl->Explore(This,vDir)
#define IShellDispatch2_MinimizeAll(This) (This)->lpVtbl->MinimizeAll(This)
#define IShellDispatch2_UndoMinimizeALL(This) (This)->lpVtbl->UndoMinimizeALL(This)
#define IShellDispatch2_FileRun(This) (This)->lpVtbl->FileRun(This)
#define IShellDispatch2_CascadeWindows(This) (This)->lpVtbl->CascadeWindows(This)
#define IShellDispatch2_TileVertically(This) (This)->lpVtbl->TileVertically(This)
#define IShellDispatch2_TileHorizontally(This) (This)->lpVtbl->TileHorizontally(This)
#define IShellDispatch2_ShutdownWindows(This) (This)->lpVtbl->ShutdownWindows(This)
#define IShellDispatch2_Suspend(This) (This)->lpVtbl->Suspend(This)
#define IShellDispatch2_EjectPC(This) (This)->lpVtbl->EjectPC(This)
#define IShellDispatch2_SetTime(This) (This)->lpVtbl->SetTime(This)
#define IShellDispatch2_TrayProperties(This) (This)->lpVtbl->TrayProperties(This)
#define IShellDispatch2_Help(This) (This)->lpVtbl->Help(This)
#define IShellDispatch2_FindFiles(This) (This)->lpVtbl->FindFiles(This)
#define IShellDispatch2_FindComputer(This) (This)->lpVtbl->FindComputer(This)
#define IShellDispatch2_RefreshMenu(This) (This)->lpVtbl->RefreshMenu(This)
#define IShellDispatch2_ControlPanelItem(This,bstrDir) (This)->lpVtbl->ControlPanelItem(This,bstrDir)
/*** IShellDispatch2 methods ***/
#define IShellDispatch2_IsRestricted(This,Group,Restriction,plRestrictValue) (This)->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue)
#define IShellDispatch2_ShellExecute(This,File,vArgs,vDir,vOperation,vShow) (This)->lpVtbl->ShellExecute(This,File,vArgs,vDir,vOperation,vShow)
#define IShellDispatch2_FindPrinter(This,name,location,model) (This)->lpVtbl->FindPrinter(This,name,location,model)
#define IShellDispatch2_GetSystemInformation(This,name,pv) (This)->lpVtbl->GetSystemInformation(This,name,pv)
#define IShellDispatch2_ServiceStart(This,ServiceName,Persistent,pSuccess) (This)->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess)
#define IShellDispatch2_ServiceStop(This,ServiceName,Persistent,pSuccess) (This)->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess)
#define IShellDispatch2_IsServiceRunning(This,ServiceName,pRunning) (This)->lpVtbl->IsServiceRunning(This,ServiceName,pRunning)
#define IShellDispatch2_CanStartStopService(This,ServiceName,pCanStartStop) (This)->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop)
#define IShellDispatch2_ShowBrowserBar(This,bstrClsid,bShow,pSuccess) (This)->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess)
#else
/*** IUnknown methods ***/
static inline HRESULT IShellDispatch2_QueryInterface(IShellDispatch2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellDispatch2_AddRef(IShellDispatch2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellDispatch2_Release(IShellDispatch2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IShellDispatch2_GetTypeInfoCount(IShellDispatch2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IShellDispatch2_GetTypeInfo(IShellDispatch2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IShellDispatch2_GetIDsOfNames(IShellDispatch2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IShellDispatch2_Invoke(IShellDispatch2* 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);
}
/*** IShellDispatch methods ***/
static inline HRESULT IShellDispatch2_get_Application(IShellDispatch2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT IShellDispatch2_get_Parent(IShellDispatch2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT IShellDispatch2_NameSpace(IShellDispatch2* This,VARIANT vDir,Folder **ppsdf) {
    return This->lpVtbl->NameSpace(This,vDir,ppsdf);
}
static inline HRESULT IShellDispatch2_BrowseForFolder(IShellDispatch2* This,LONG Hwnd,BSTR Title,LONG Options,VARIANT RootFolder,Folder **ppsdf) {
    return This->lpVtbl->BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf);
}
static inline HRESULT IShellDispatch2_Windows(IShellDispatch2* This,IDispatch **ppid) {
    return This->lpVtbl->Windows(This,ppid);
}
static inline HRESULT IShellDispatch2_Open(IShellDispatch2* This,VARIANT vDir) {
    return This->lpVtbl->Open(This,vDir);
}
static inline HRESULT IShellDispatch2_Explore(IShellDispatch2* This,VARIANT vDir) {
    return This->lpVtbl->Explore(This,vDir);
}
static inline HRESULT IShellDispatch2_MinimizeAll(IShellDispatch2* This) {
    return This->lpVtbl->MinimizeAll(This);
}
static inline HRESULT IShellDispatch2_UndoMinimizeALL(IShellDispatch2* This) {
    return This->lpVtbl->UndoMinimizeALL(This);
}
static inline HRESULT IShellDispatch2_FileRun(IShellDispatch2* This) {
    return This->lpVtbl->FileRun(This);
}
static inline HRESULT IShellDispatch2_CascadeWindows(IShellDispatch2* This) {
    return This->lpVtbl->CascadeWindows(This);
}
static inline HRESULT IShellDispatch2_TileVertically(IShellDispatch2* This) {
    return This->lpVtbl->TileVertically(This);
}
static inline HRESULT IShellDispatch2_TileHorizontally(IShellDispatch2* This) {
    return This->lpVtbl->TileHorizontally(This);
}
static inline HRESULT IShellDispatch2_ShutdownWindows(IShellDispatch2* This) {
    return This->lpVtbl->ShutdownWindows(This);
}
static inline HRESULT IShellDispatch2_Suspend(IShellDispatch2* This) {
    return This->lpVtbl->Suspend(This);
}
static inline HRESULT IShellDispatch2_EjectPC(IShellDispatch2* This) {
    return This->lpVtbl->EjectPC(This);
}
static inline HRESULT IShellDispatch2_SetTime(IShellDispatch2* This) {
    return This->lpVtbl->SetTime(This);
}
static inline HRESULT IShellDispatch2_TrayProperties(IShellDispatch2* This) {
    return This->lpVtbl->TrayProperties(This);
}
static inline HRESULT IShellDispatch2_Help(IShellDispatch2* This) {
    return This->lpVtbl->Help(This);
}
static inline HRESULT IShellDispatch2_FindFiles(IShellDispatch2* This) {
    return This->lpVtbl->FindFiles(This);
}
static inline HRESULT IShellDispatch2_FindComputer(IShellDispatch2* This) {
    return This->lpVtbl->FindComputer(This);
}
static inline HRESULT IShellDispatch2_RefreshMenu(IShellDispatch2* This) {
    return This->lpVtbl->RefreshMenu(This);
}
static inline HRESULT IShellDispatch2_ControlPanelItem(IShellDispatch2* This,BSTR bstrDir) {
    return This->lpVtbl->ControlPanelItem(This,bstrDir);
}
/*** IShellDispatch2 methods ***/
static inline HRESULT IShellDispatch2_IsRestricted(IShellDispatch2* This,BSTR Group,BSTR Restriction,LONG *plRestrictValue) {
    return This->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue);
}
static inline HRESULT IShellDispatch2_ShellExecute(IShellDispatch2* This,BSTR File,VARIANT vArgs,VARIANT vDir,VARIANT vOperation,VARIANT vShow) {
    return This->lpVtbl->ShellExecute(This,File,vArgs,vDir,vOperation,vShow);
}
static inline HRESULT IShellDispatch2_FindPrinter(IShellDispatch2* This,BSTR name,BSTR location,BSTR model) {
    return This->lpVtbl->FindPrinter(This,name,location,model);
}
static inline HRESULT IShellDispatch2_GetSystemInformation(IShellDispatch2* This,BSTR name,VARIANT *pv) {
    return This->lpVtbl->GetSystemInformation(This,name,pv);
}
static inline HRESULT IShellDispatch2_ServiceStart(IShellDispatch2* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess);
}
static inline HRESULT IShellDispatch2_ServiceStop(IShellDispatch2* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess);
}
static inline HRESULT IShellDispatch2_IsServiceRunning(IShellDispatch2* This,BSTR ServiceName,VARIANT *pRunning) {
    return This->lpVtbl->IsServiceRunning(This,ServiceName,pRunning);
}
static inline HRESULT IShellDispatch2_CanStartStopService(IShellDispatch2* This,BSTR ServiceName,VARIANT *pCanStartStop) {
    return This->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop);
}
static inline HRESULT IShellDispatch2_ShowBrowserBar(IShellDispatch2* This,BSTR bstrClsid,VARIANT bShow,VARIANT *pSuccess) {
    return This->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess);
}
#endif
#endif

#endif


#endif  /* __IShellDispatch2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IShellDispatch3 interface
 */
#ifndef __IShellDispatch3_INTERFACE_DEFINED__
#define __IShellDispatch3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellDispatch3, 0x177160ca, 0xbb5a, 0x411c, 0x84,0x1d, 0xbd,0x38,0xfa,0xcd,0xea,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("177160ca-bb5a-411c-841d-bd38facdeaa0")
IShellDispatch3 : public IShellDispatch2
{
    virtual HRESULT STDMETHODCALLTYPE AddToRecent(
        VARIANT varFile,
        BSTR bstrCategory) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellDispatch3, 0x177160ca, 0xbb5a, 0x411c, 0x84,0x1d, 0xbd,0x38,0xfa,0xcd,0xea,0xa0)
#endif
#else
typedef struct IShellDispatch3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IShellDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Application)(
        IShellDispatch3 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        IShellDispatch3 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *NameSpace)(
        IShellDispatch3 *This,
        VARIANT vDir,
        Folder **ppsdf);

    HRESULT (STDMETHODCALLTYPE *BrowseForFolder)(
        IShellDispatch3 *This,
        LONG Hwnd,
        BSTR Title,
        LONG Options,
        VARIANT RootFolder,
        Folder **ppsdf);

    HRESULT (STDMETHODCALLTYPE *Windows)(
        IShellDispatch3 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *Open)(
        IShellDispatch3 *This,
        VARIANT vDir);

    HRESULT (STDMETHODCALLTYPE *Explore)(
        IShellDispatch3 *This,
        VARIANT vDir);

    HRESULT (STDMETHODCALLTYPE *MinimizeAll)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *UndoMinimizeALL)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *FileRun)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *CascadeWindows)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *TileVertically)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *TileHorizontally)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *ShutdownWindows)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *Suspend)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *EjectPC)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *SetTime)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *TrayProperties)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *Help)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *FindFiles)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *FindComputer)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *RefreshMenu)(
        IShellDispatch3 *This);

    HRESULT (STDMETHODCALLTYPE *ControlPanelItem)(
        IShellDispatch3 *This,
        BSTR bstrDir);

    /*** IShellDispatch2 methods ***/
    HRESULT (STDMETHODCALLTYPE *IsRestricted)(
        IShellDispatch3 *This,
        BSTR Group,
        BSTR Restriction,
        LONG *plRestrictValue);

    HRESULT (STDMETHODCALLTYPE *ShellExecute)(
        IShellDispatch3 *This,
        BSTR File,
        VARIANT vArgs,
        VARIANT vDir,
        VARIANT vOperation,
        VARIANT vShow);

    HRESULT (STDMETHODCALLTYPE *FindPrinter)(
        IShellDispatch3 *This,
        BSTR name,
        BSTR location,
        BSTR model);

    HRESULT (STDMETHODCALLTYPE *GetSystemInformation)(
        IShellDispatch3 *This,
        BSTR name,
        VARIANT *pv);

    HRESULT (STDMETHODCALLTYPE *ServiceStart)(
        IShellDispatch3 *This,
        BSTR ServiceName,
        VARIANT Persistent,
        VARIANT *pSuccess);

    HRESULT (STDMETHODCALLTYPE *ServiceStop)(
        IShellDispatch3 *This,
        BSTR ServiceName,
        VARIANT Persistent,
        VARIANT *pSuccess);

    HRESULT (STDMETHODCALLTYPE *IsServiceRunning)(
        IShellDispatch3 *This,
        BSTR ServiceName,
        VARIANT *pRunning);

    HRESULT (STDMETHODCALLTYPE *CanStartStopService)(
        IShellDispatch3 *This,
        BSTR ServiceName,
        VARIANT *pCanStartStop);

    HRESULT (STDMETHODCALLTYPE *ShowBrowserBar)(
        IShellDispatch3 *This,
        BSTR bstrClsid,
        VARIANT bShow,
        VARIANT *pSuccess);

    /*** IShellDispatch3 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddToRecent)(
        IShellDispatch3 *This,
        VARIANT varFile,
        BSTR bstrCategory);

    END_INTERFACE
} IShellDispatch3Vtbl;

interface IShellDispatch3 {
    CONST_VTBL IShellDispatch3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellDispatch3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellDispatch3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellDispatch3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IShellDispatch3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IShellDispatch3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IShellDispatch3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IShellDispatch3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IShellDispatch methods ***/
#define IShellDispatch3_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define IShellDispatch3_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define IShellDispatch3_NameSpace(This,vDir,ppsdf) (This)->lpVtbl->NameSpace(This,vDir,ppsdf)
#define IShellDispatch3_BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf) (This)->lpVtbl->BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf)
#define IShellDispatch3_Windows(This,ppid) (This)->lpVtbl->Windows(This,ppid)
#define IShellDispatch3_Open(This,vDir) (This)->lpVtbl->Open(This,vDir)
#define IShellDispatch3_Explore(This,vDir) (This)->lpVtbl->Explore(This,vDir)
#define IShellDispatch3_MinimizeAll(This) (This)->lpVtbl->MinimizeAll(This)
#define IShellDispatch3_UndoMinimizeALL(This) (This)->lpVtbl->UndoMinimizeALL(This)
#define IShellDispatch3_FileRun(This) (This)->lpVtbl->FileRun(This)
#define IShellDispatch3_CascadeWindows(This) (This)->lpVtbl->CascadeWindows(This)
#define IShellDispatch3_TileVertically(This) (This)->lpVtbl->TileVertically(This)
#define IShellDispatch3_TileHorizontally(This) (This)->lpVtbl->TileHorizontally(This)
#define IShellDispatch3_ShutdownWindows(This) (This)->lpVtbl->ShutdownWindows(This)
#define IShellDispatch3_Suspend(This) (This)->lpVtbl->Suspend(This)
#define IShellDispatch3_EjectPC(This) (This)->lpVtbl->EjectPC(This)
#define IShellDispatch3_SetTime(This) (This)->lpVtbl->SetTime(This)
#define IShellDispatch3_TrayProperties(This) (This)->lpVtbl->TrayProperties(This)
#define IShellDispatch3_Help(This) (This)->lpVtbl->Help(This)
#define IShellDispatch3_FindFiles(This) (This)->lpVtbl->FindFiles(This)
#define IShellDispatch3_FindComputer(This) (This)->lpVtbl->FindComputer(This)
#define IShellDispatch3_RefreshMenu(This) (This)->lpVtbl->RefreshMenu(This)
#define IShellDispatch3_ControlPanelItem(This,bstrDir) (This)->lpVtbl->ControlPanelItem(This,bstrDir)
/*** IShellDispatch2 methods ***/
#define IShellDispatch3_IsRestricted(This,Group,Restriction,plRestrictValue) (This)->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue)
#define IShellDispatch3_ShellExecute(This,File,vArgs,vDir,vOperation,vShow) (This)->lpVtbl->ShellExecute(This,File,vArgs,vDir,vOperation,vShow)
#define IShellDispatch3_FindPrinter(This,name,location,model) (This)->lpVtbl->FindPrinter(This,name,location,model)
#define IShellDispatch3_GetSystemInformation(This,name,pv) (This)->lpVtbl->GetSystemInformation(This,name,pv)
#define IShellDispatch3_ServiceStart(This,ServiceName,Persistent,pSuccess) (This)->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess)
#define IShellDispatch3_ServiceStop(This,ServiceName,Persistent,pSuccess) (This)->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess)
#define IShellDispatch3_IsServiceRunning(This,ServiceName,pRunning) (This)->lpVtbl->IsServiceRunning(This,ServiceName,pRunning)
#define IShellDispatch3_CanStartStopService(This,ServiceName,pCanStartStop) (This)->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop)
#define IShellDispatch3_ShowBrowserBar(This,bstrClsid,bShow,pSuccess) (This)->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess)
/*** IShellDispatch3 methods ***/
#define IShellDispatch3_AddToRecent(This,varFile,bstrCategory) (This)->lpVtbl->AddToRecent(This,varFile,bstrCategory)
#else
/*** IUnknown methods ***/
static inline HRESULT IShellDispatch3_QueryInterface(IShellDispatch3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellDispatch3_AddRef(IShellDispatch3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellDispatch3_Release(IShellDispatch3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IShellDispatch3_GetTypeInfoCount(IShellDispatch3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IShellDispatch3_GetTypeInfo(IShellDispatch3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IShellDispatch3_GetIDsOfNames(IShellDispatch3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IShellDispatch3_Invoke(IShellDispatch3* 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);
}
/*** IShellDispatch methods ***/
static inline HRESULT IShellDispatch3_get_Application(IShellDispatch3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT IShellDispatch3_get_Parent(IShellDispatch3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT IShellDispatch3_NameSpace(IShellDispatch3* This,VARIANT vDir,Folder **ppsdf) {
    return This->lpVtbl->NameSpace(This,vDir,ppsdf);
}
static inline HRESULT IShellDispatch3_BrowseForFolder(IShellDispatch3* This,LONG Hwnd,BSTR Title,LONG Options,VARIANT RootFolder,Folder **ppsdf) {
    return This->lpVtbl->BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf);
}
static inline HRESULT IShellDispatch3_Windows(IShellDispatch3* This,IDispatch **ppid) {
    return This->lpVtbl->Windows(This,ppid);
}
static inline HRESULT IShellDispatch3_Open(IShellDispatch3* This,VARIANT vDir) {
    return This->lpVtbl->Open(This,vDir);
}
static inline HRESULT IShellDispatch3_Explore(IShellDispatch3* This,VARIANT vDir) {
    return This->lpVtbl->Explore(This,vDir);
}
static inline HRESULT IShellDispatch3_MinimizeAll(IShellDispatch3* This) {
    return This->lpVtbl->MinimizeAll(This);
}
static inline HRESULT IShellDispatch3_UndoMinimizeALL(IShellDispatch3* This) {
    return This->lpVtbl->UndoMinimizeALL(This);
}
static inline HRESULT IShellDispatch3_FileRun(IShellDispatch3* This) {
    return This->lpVtbl->FileRun(This);
}
static inline HRESULT IShellDispatch3_CascadeWindows(IShellDispatch3* This) {
    return This->lpVtbl->CascadeWindows(This);
}
static inline HRESULT IShellDispatch3_TileVertically(IShellDispatch3* This) {
    return This->lpVtbl->TileVertically(This);
}
static inline HRESULT IShellDispatch3_TileHorizontally(IShellDispatch3* This) {
    return This->lpVtbl->TileHorizontally(This);
}
static inline HRESULT IShellDispatch3_ShutdownWindows(IShellDispatch3* This) {
    return This->lpVtbl->ShutdownWindows(This);
}
static inline HRESULT IShellDispatch3_Suspend(IShellDispatch3* This) {
    return This->lpVtbl->Suspend(This);
}
static inline HRESULT IShellDispatch3_EjectPC(IShellDispatch3* This) {
    return This->lpVtbl->EjectPC(This);
}
static inline HRESULT IShellDispatch3_SetTime(IShellDispatch3* This) {
    return This->lpVtbl->SetTime(This);
}
static inline HRESULT IShellDispatch3_TrayProperties(IShellDispatch3* This) {
    return This->lpVtbl->TrayProperties(This);
}
static inline HRESULT IShellDispatch3_Help(IShellDispatch3* This) {
    return This->lpVtbl->Help(This);
}
static inline HRESULT IShellDispatch3_FindFiles(IShellDispatch3* This) {
    return This->lpVtbl->FindFiles(This);
}
static inline HRESULT IShellDispatch3_FindComputer(IShellDispatch3* This) {
    return This->lpVtbl->FindComputer(This);
}
static inline HRESULT IShellDispatch3_RefreshMenu(IShellDispatch3* This) {
    return This->lpVtbl->RefreshMenu(This);
}
static inline HRESULT IShellDispatch3_ControlPanelItem(IShellDispatch3* This,BSTR bstrDir) {
    return This->lpVtbl->ControlPanelItem(This,bstrDir);
}
/*** IShellDispatch2 methods ***/
static inline HRESULT IShellDispatch3_IsRestricted(IShellDispatch3* This,BSTR Group,BSTR Restriction,LONG *plRestrictValue) {
    return This->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue);
}
static inline HRESULT IShellDispatch3_ShellExecute(IShellDispatch3* This,BSTR File,VARIANT vArgs,VARIANT vDir,VARIANT vOperation,VARIANT vShow) {
    return This->lpVtbl->ShellExecute(This,File,vArgs,vDir,vOperation,vShow);
}
static inline HRESULT IShellDispatch3_FindPrinter(IShellDispatch3* This,BSTR name,BSTR location,BSTR model) {
    return This->lpVtbl->FindPrinter(This,name,location,model);
}
static inline HRESULT IShellDispatch3_GetSystemInformation(IShellDispatch3* This,BSTR name,VARIANT *pv) {
    return This->lpVtbl->GetSystemInformation(This,name,pv);
}
static inline HRESULT IShellDispatch3_ServiceStart(IShellDispatch3* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess);
}
static inline HRESULT IShellDispatch3_ServiceStop(IShellDispatch3* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess);
}
static inline HRESULT IShellDispatch3_IsServiceRunning(IShellDispatch3* This,BSTR ServiceName,VARIANT *pRunning) {
    return This->lpVtbl->IsServiceRunning(This,ServiceName,pRunning);
}
static inline HRESULT IShellDispatch3_CanStartStopService(IShellDispatch3* This,BSTR ServiceName,VARIANT *pCanStartStop) {
    return This->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop);
}
static inline HRESULT IShellDispatch3_ShowBrowserBar(IShellDispatch3* This,BSTR bstrClsid,VARIANT bShow,VARIANT *pSuccess) {
    return This->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess);
}
/*** IShellDispatch3 methods ***/
static inline HRESULT IShellDispatch3_AddToRecent(IShellDispatch3* This,VARIANT varFile,BSTR bstrCategory) {
    return This->lpVtbl->AddToRecent(This,varFile,bstrCategory);
}
#endif
#endif

#endif


#endif  /* __IShellDispatch3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IShellDispatch4 interface
 */
#ifndef __IShellDispatch4_INTERFACE_DEFINED__
#define __IShellDispatch4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellDispatch4, 0xefd84b2d, 0x4bcf, 0x4298, 0xbe,0x25, 0xeb,0x54,0x2a,0x59,0xfb,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("efd84b2d-4bcf-4298-be25-eb542a59fbda")
IShellDispatch4 : public IShellDispatch3
{
    virtual HRESULT STDMETHODCALLTYPE WindowsSecurity(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ToggleDesktop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExplorerPolicy(
        BSTR bstrPolicyName,
        VARIANT *pValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSetting(
        LONG lSetting,
        VARIANT_BOOL *pResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellDispatch4, 0xefd84b2d, 0x4bcf, 0x4298, 0xbe,0x25, 0xeb,0x54,0x2a,0x59,0xfb,0xda)
#endif
#else
typedef struct IShellDispatch4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IShellDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Application)(
        IShellDispatch4 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        IShellDispatch4 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *NameSpace)(
        IShellDispatch4 *This,
        VARIANT vDir,
        Folder **ppsdf);

    HRESULT (STDMETHODCALLTYPE *BrowseForFolder)(
        IShellDispatch4 *This,
        LONG Hwnd,
        BSTR Title,
        LONG Options,
        VARIANT RootFolder,
        Folder **ppsdf);

    HRESULT (STDMETHODCALLTYPE *Windows)(
        IShellDispatch4 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *Open)(
        IShellDispatch4 *This,
        VARIANT vDir);

    HRESULT (STDMETHODCALLTYPE *Explore)(
        IShellDispatch4 *This,
        VARIANT vDir);

    HRESULT (STDMETHODCALLTYPE *MinimizeAll)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *UndoMinimizeALL)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *FileRun)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *CascadeWindows)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *TileVertically)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *TileHorizontally)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *ShutdownWindows)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *Suspend)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *EjectPC)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *SetTime)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *TrayProperties)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *Help)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *FindFiles)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *FindComputer)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *RefreshMenu)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *ControlPanelItem)(
        IShellDispatch4 *This,
        BSTR bstrDir);

    /*** IShellDispatch2 methods ***/
    HRESULT (STDMETHODCALLTYPE *IsRestricted)(
        IShellDispatch4 *This,
        BSTR Group,
        BSTR Restriction,
        LONG *plRestrictValue);

    HRESULT (STDMETHODCALLTYPE *ShellExecute)(
        IShellDispatch4 *This,
        BSTR File,
        VARIANT vArgs,
        VARIANT vDir,
        VARIANT vOperation,
        VARIANT vShow);

    HRESULT (STDMETHODCALLTYPE *FindPrinter)(
        IShellDispatch4 *This,
        BSTR name,
        BSTR location,
        BSTR model);

    HRESULT (STDMETHODCALLTYPE *GetSystemInformation)(
        IShellDispatch4 *This,
        BSTR name,
        VARIANT *pv);

    HRESULT (STDMETHODCALLTYPE *ServiceStart)(
        IShellDispatch4 *This,
        BSTR ServiceName,
        VARIANT Persistent,
        VARIANT *pSuccess);

    HRESULT (STDMETHODCALLTYPE *ServiceStop)(
        IShellDispatch4 *This,
        BSTR ServiceName,
        VARIANT Persistent,
        VARIANT *pSuccess);

    HRESULT (STDMETHODCALLTYPE *IsServiceRunning)(
        IShellDispatch4 *This,
        BSTR ServiceName,
        VARIANT *pRunning);

    HRESULT (STDMETHODCALLTYPE *CanStartStopService)(
        IShellDispatch4 *This,
        BSTR ServiceName,
        VARIANT *pCanStartStop);

    HRESULT (STDMETHODCALLTYPE *ShowBrowserBar)(
        IShellDispatch4 *This,
        BSTR bstrClsid,
        VARIANT bShow,
        VARIANT *pSuccess);

    /*** IShellDispatch3 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddToRecent)(
        IShellDispatch4 *This,
        VARIANT varFile,
        BSTR bstrCategory);

    /*** IShellDispatch4 methods ***/
    HRESULT (STDMETHODCALLTYPE *WindowsSecurity)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *ToggleDesktop)(
        IShellDispatch4 *This);

    HRESULT (STDMETHODCALLTYPE *ExplorerPolicy)(
        IShellDispatch4 *This,
        BSTR bstrPolicyName,
        VARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *GetSetting)(
        IShellDispatch4 *This,
        LONG lSetting,
        VARIANT_BOOL *pResult);

    END_INTERFACE
} IShellDispatch4Vtbl;

interface IShellDispatch4 {
    CONST_VTBL IShellDispatch4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellDispatch4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellDispatch4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellDispatch4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IShellDispatch4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IShellDispatch4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IShellDispatch4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IShellDispatch4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IShellDispatch methods ***/
#define IShellDispatch4_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define IShellDispatch4_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define IShellDispatch4_NameSpace(This,vDir,ppsdf) (This)->lpVtbl->NameSpace(This,vDir,ppsdf)
#define IShellDispatch4_BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf) (This)->lpVtbl->BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf)
#define IShellDispatch4_Windows(This,ppid) (This)->lpVtbl->Windows(This,ppid)
#define IShellDispatch4_Open(This,vDir) (This)->lpVtbl->Open(This,vDir)
#define IShellDispatch4_Explore(This,vDir) (This)->lpVtbl->Explore(This,vDir)
#define IShellDispatch4_MinimizeAll(This) (This)->lpVtbl->MinimizeAll(This)
#define IShellDispatch4_UndoMinimizeALL(This) (This)->lpVtbl->UndoMinimizeALL(This)
#define IShellDispatch4_FileRun(This) (This)->lpVtbl->FileRun(This)
#define IShellDispatch4_CascadeWindows(This) (This)->lpVtbl->CascadeWindows(This)
#define IShellDispatch4_TileVertically(This) (This)->lpVtbl->TileVertically(This)
#define IShellDispatch4_TileHorizontally(This) (This)->lpVtbl->TileHorizontally(This)
#define IShellDispatch4_ShutdownWindows(This) (This)->lpVtbl->ShutdownWindows(This)
#define IShellDispatch4_Suspend(This) (This)->lpVtbl->Suspend(This)
#define IShellDispatch4_EjectPC(This) (This)->lpVtbl->EjectPC(This)
#define IShellDispatch4_SetTime(This) (This)->lpVtbl->SetTime(This)
#define IShellDispatch4_TrayProperties(This) (This)->lpVtbl->TrayProperties(This)
#define IShellDispatch4_Help(This) (This)->lpVtbl->Help(This)
#define IShellDispatch4_FindFiles(This) (This)->lpVtbl->FindFiles(This)
#define IShellDispatch4_FindComputer(This) (This)->lpVtbl->FindComputer(This)
#define IShellDispatch4_RefreshMenu(This) (This)->lpVtbl->RefreshMenu(This)
#define IShellDispatch4_ControlPanelItem(This,bstrDir) (This)->lpVtbl->ControlPanelItem(This,bstrDir)
/*** IShellDispatch2 methods ***/
#define IShellDispatch4_IsRestricted(This,Group,Restriction,plRestrictValue) (This)->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue)
#define IShellDispatch4_ShellExecute(This,File,vArgs,vDir,vOperation,vShow) (This)->lpVtbl->ShellExecute(This,File,vArgs,vDir,vOperation,vShow)
#define IShellDispatch4_FindPrinter(This,name,location,model) (This)->lpVtbl->FindPrinter(This,name,location,model)
#define IShellDispatch4_GetSystemInformation(This,name,pv) (This)->lpVtbl->GetSystemInformation(This,name,pv)
#define IShellDispatch4_ServiceStart(This,ServiceName,Persistent,pSuccess) (This)->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess)
#define IShellDispatch4_ServiceStop(This,ServiceName,Persistent,pSuccess) (This)->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess)
#define IShellDispatch4_IsServiceRunning(This,ServiceName,pRunning) (This)->lpVtbl->IsServiceRunning(This,ServiceName,pRunning)
#define IShellDispatch4_CanStartStopService(This,ServiceName,pCanStartStop) (This)->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop)
#define IShellDispatch4_ShowBrowserBar(This,bstrClsid,bShow,pSuccess) (This)->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess)
/*** IShellDispatch3 methods ***/
#define IShellDispatch4_AddToRecent(This,varFile,bstrCategory) (This)->lpVtbl->AddToRecent(This,varFile,bstrCategory)
/*** IShellDispatch4 methods ***/
#define IShellDispatch4_WindowsSecurity(This) (This)->lpVtbl->WindowsSecurity(This)
#define IShellDispatch4_ToggleDesktop(This) (This)->lpVtbl->ToggleDesktop(This)
#define IShellDispatch4_ExplorerPolicy(This,bstrPolicyName,pValue) (This)->lpVtbl->ExplorerPolicy(This,bstrPolicyName,pValue)
#define IShellDispatch4_GetSetting(This,lSetting,pResult) (This)->lpVtbl->GetSetting(This,lSetting,pResult)
#else
/*** IUnknown methods ***/
static inline HRESULT IShellDispatch4_QueryInterface(IShellDispatch4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellDispatch4_AddRef(IShellDispatch4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellDispatch4_Release(IShellDispatch4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IShellDispatch4_GetTypeInfoCount(IShellDispatch4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IShellDispatch4_GetTypeInfo(IShellDispatch4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IShellDispatch4_GetIDsOfNames(IShellDispatch4* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IShellDispatch4_Invoke(IShellDispatch4* 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);
}
/*** IShellDispatch methods ***/
static inline HRESULT IShellDispatch4_get_Application(IShellDispatch4* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT IShellDispatch4_get_Parent(IShellDispatch4* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT IShellDispatch4_NameSpace(IShellDispatch4* This,VARIANT vDir,Folder **ppsdf) {
    return This->lpVtbl->NameSpace(This,vDir,ppsdf);
}
static inline HRESULT IShellDispatch4_BrowseForFolder(IShellDispatch4* This,LONG Hwnd,BSTR Title,LONG Options,VARIANT RootFolder,Folder **ppsdf) {
    return This->lpVtbl->BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf);
}
static inline HRESULT IShellDispatch4_Windows(IShellDispatch4* This,IDispatch **ppid) {
    return This->lpVtbl->Windows(This,ppid);
}
static inline HRESULT IShellDispatch4_Open(IShellDispatch4* This,VARIANT vDir) {
    return This->lpVtbl->Open(This,vDir);
}
static inline HRESULT IShellDispatch4_Explore(IShellDispatch4* This,VARIANT vDir) {
    return This->lpVtbl->Explore(This,vDir);
}
static inline HRESULT IShellDispatch4_MinimizeAll(IShellDispatch4* This) {
    return This->lpVtbl->MinimizeAll(This);
}
static inline HRESULT IShellDispatch4_UndoMinimizeALL(IShellDispatch4* This) {
    return This->lpVtbl->UndoMinimizeALL(This);
}
static inline HRESULT IShellDispatch4_FileRun(IShellDispatch4* This) {
    return This->lpVtbl->FileRun(This);
}
static inline HRESULT IShellDispatch4_CascadeWindows(IShellDispatch4* This) {
    return This->lpVtbl->CascadeWindows(This);
}
static inline HRESULT IShellDispatch4_TileVertically(IShellDispatch4* This) {
    return This->lpVtbl->TileVertically(This);
}
static inline HRESULT IShellDispatch4_TileHorizontally(IShellDispatch4* This) {
    return This->lpVtbl->TileHorizontally(This);
}
static inline HRESULT IShellDispatch4_ShutdownWindows(IShellDispatch4* This) {
    return This->lpVtbl->ShutdownWindows(This);
}
static inline HRESULT IShellDispatch4_Suspend(IShellDispatch4* This) {
    return This->lpVtbl->Suspend(This);
}
static inline HRESULT IShellDispatch4_EjectPC(IShellDispatch4* This) {
    return This->lpVtbl->EjectPC(This);
}
static inline HRESULT IShellDispatch4_SetTime(IShellDispatch4* This) {
    return This->lpVtbl->SetTime(This);
}
static inline HRESULT IShellDispatch4_TrayProperties(IShellDispatch4* This) {
    return This->lpVtbl->TrayProperties(This);
}
static inline HRESULT IShellDispatch4_Help(IShellDispatch4* This) {
    return This->lpVtbl->Help(This);
}
static inline HRESULT IShellDispatch4_FindFiles(IShellDispatch4* This) {
    return This->lpVtbl->FindFiles(This);
}
static inline HRESULT IShellDispatch4_FindComputer(IShellDispatch4* This) {
    return This->lpVtbl->FindComputer(This);
}
static inline HRESULT IShellDispatch4_RefreshMenu(IShellDispatch4* This) {
    return This->lpVtbl->RefreshMenu(This);
}
static inline HRESULT IShellDispatch4_ControlPanelItem(IShellDispatch4* This,BSTR bstrDir) {
    return This->lpVtbl->ControlPanelItem(This,bstrDir);
}
/*** IShellDispatch2 methods ***/
static inline HRESULT IShellDispatch4_IsRestricted(IShellDispatch4* This,BSTR Group,BSTR Restriction,LONG *plRestrictValue) {
    return This->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue);
}
static inline HRESULT IShellDispatch4_ShellExecute(IShellDispatch4* This,BSTR File,VARIANT vArgs,VARIANT vDir,VARIANT vOperation,VARIANT vShow) {
    return This->lpVtbl->ShellExecute(This,File,vArgs,vDir,vOperation,vShow);
}
static inline HRESULT IShellDispatch4_FindPrinter(IShellDispatch4* This,BSTR name,BSTR location,BSTR model) {
    return This->lpVtbl->FindPrinter(This,name,location,model);
}
static inline HRESULT IShellDispatch4_GetSystemInformation(IShellDispatch4* This,BSTR name,VARIANT *pv) {
    return This->lpVtbl->GetSystemInformation(This,name,pv);
}
static inline HRESULT IShellDispatch4_ServiceStart(IShellDispatch4* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess);
}
static inline HRESULT IShellDispatch4_ServiceStop(IShellDispatch4* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess);
}
static inline HRESULT IShellDispatch4_IsServiceRunning(IShellDispatch4* This,BSTR ServiceName,VARIANT *pRunning) {
    return This->lpVtbl->IsServiceRunning(This,ServiceName,pRunning);
}
static inline HRESULT IShellDispatch4_CanStartStopService(IShellDispatch4* This,BSTR ServiceName,VARIANT *pCanStartStop) {
    return This->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop);
}
static inline HRESULT IShellDispatch4_ShowBrowserBar(IShellDispatch4* This,BSTR bstrClsid,VARIANT bShow,VARIANT *pSuccess) {
    return This->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess);
}
/*** IShellDispatch3 methods ***/
static inline HRESULT IShellDispatch4_AddToRecent(IShellDispatch4* This,VARIANT varFile,BSTR bstrCategory) {
    return This->lpVtbl->AddToRecent(This,varFile,bstrCategory);
}
/*** IShellDispatch4 methods ***/
static inline HRESULT IShellDispatch4_WindowsSecurity(IShellDispatch4* This) {
    return This->lpVtbl->WindowsSecurity(This);
}
static inline HRESULT IShellDispatch4_ToggleDesktop(IShellDispatch4* This) {
    return This->lpVtbl->ToggleDesktop(This);
}
static inline HRESULT IShellDispatch4_ExplorerPolicy(IShellDispatch4* This,BSTR bstrPolicyName,VARIANT *pValue) {
    return This->lpVtbl->ExplorerPolicy(This,bstrPolicyName,pValue);
}
static inline HRESULT IShellDispatch4_GetSetting(IShellDispatch4* This,LONG lSetting,VARIANT_BOOL *pResult) {
    return This->lpVtbl->GetSetting(This,lSetting,pResult);
}
#endif
#endif

#endif


#endif  /* __IShellDispatch4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IShellDispatch5 interface
 */
#ifndef __IShellDispatch5_INTERFACE_DEFINED__
#define __IShellDispatch5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellDispatch5, 0x866738b9, 0x6cf2, 0x4de8, 0x87,0x67, 0xf7,0x94,0xeb,0xe7,0x4f,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("866738b9-6cf2-4de8-8767-f794ebe74f4e")
IShellDispatch5 : public IShellDispatch4
{
    virtual HRESULT STDMETHODCALLTYPE WindowSwitcher(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellDispatch5, 0x866738b9, 0x6cf2, 0x4de8, 0x87,0x67, 0xf7,0x94,0xeb,0xe7,0x4f,0x4e)
#endif
#else
typedef struct IShellDispatch5Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IShellDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Application)(
        IShellDispatch5 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        IShellDispatch5 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *NameSpace)(
        IShellDispatch5 *This,
        VARIANT vDir,
        Folder **ppsdf);

    HRESULT (STDMETHODCALLTYPE *BrowseForFolder)(
        IShellDispatch5 *This,
        LONG Hwnd,
        BSTR Title,
        LONG Options,
        VARIANT RootFolder,
        Folder **ppsdf);

    HRESULT (STDMETHODCALLTYPE *Windows)(
        IShellDispatch5 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *Open)(
        IShellDispatch5 *This,
        VARIANT vDir);

    HRESULT (STDMETHODCALLTYPE *Explore)(
        IShellDispatch5 *This,
        VARIANT vDir);

    HRESULT (STDMETHODCALLTYPE *MinimizeAll)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *UndoMinimizeALL)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *FileRun)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *CascadeWindows)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *TileVertically)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *TileHorizontally)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *ShutdownWindows)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *Suspend)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *EjectPC)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *SetTime)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *TrayProperties)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *Help)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *FindFiles)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *FindComputer)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *RefreshMenu)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *ControlPanelItem)(
        IShellDispatch5 *This,
        BSTR bstrDir);

    /*** IShellDispatch2 methods ***/
    HRESULT (STDMETHODCALLTYPE *IsRestricted)(
        IShellDispatch5 *This,
        BSTR Group,
        BSTR Restriction,
        LONG *plRestrictValue);

    HRESULT (STDMETHODCALLTYPE *ShellExecute)(
        IShellDispatch5 *This,
        BSTR File,
        VARIANT vArgs,
        VARIANT vDir,
        VARIANT vOperation,
        VARIANT vShow);

    HRESULT (STDMETHODCALLTYPE *FindPrinter)(
        IShellDispatch5 *This,
        BSTR name,
        BSTR location,
        BSTR model);

    HRESULT (STDMETHODCALLTYPE *GetSystemInformation)(
        IShellDispatch5 *This,
        BSTR name,
        VARIANT *pv);

    HRESULT (STDMETHODCALLTYPE *ServiceStart)(
        IShellDispatch5 *This,
        BSTR ServiceName,
        VARIANT Persistent,
        VARIANT *pSuccess);

    HRESULT (STDMETHODCALLTYPE *ServiceStop)(
        IShellDispatch5 *This,
        BSTR ServiceName,
        VARIANT Persistent,
        VARIANT *pSuccess);

    HRESULT (STDMETHODCALLTYPE *IsServiceRunning)(
        IShellDispatch5 *This,
        BSTR ServiceName,
        VARIANT *pRunning);

    HRESULT (STDMETHODCALLTYPE *CanStartStopService)(
        IShellDispatch5 *This,
        BSTR ServiceName,
        VARIANT *pCanStartStop);

    HRESULT (STDMETHODCALLTYPE *ShowBrowserBar)(
        IShellDispatch5 *This,
        BSTR bstrClsid,
        VARIANT bShow,
        VARIANT *pSuccess);

    /*** IShellDispatch3 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddToRecent)(
        IShellDispatch5 *This,
        VARIANT varFile,
        BSTR bstrCategory);

    /*** IShellDispatch4 methods ***/
    HRESULT (STDMETHODCALLTYPE *WindowsSecurity)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *ToggleDesktop)(
        IShellDispatch5 *This);

    HRESULT (STDMETHODCALLTYPE *ExplorerPolicy)(
        IShellDispatch5 *This,
        BSTR bstrPolicyName,
        VARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *GetSetting)(
        IShellDispatch5 *This,
        LONG lSetting,
        VARIANT_BOOL *pResult);

    /*** IShellDispatch5 methods ***/
    HRESULT (STDMETHODCALLTYPE *WindowSwitcher)(
        IShellDispatch5 *This);

    END_INTERFACE
} IShellDispatch5Vtbl;

interface IShellDispatch5 {
    CONST_VTBL IShellDispatch5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellDispatch5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellDispatch5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellDispatch5_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IShellDispatch5_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IShellDispatch5_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IShellDispatch5_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IShellDispatch5_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IShellDispatch methods ***/
#define IShellDispatch5_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define IShellDispatch5_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define IShellDispatch5_NameSpace(This,vDir,ppsdf) (This)->lpVtbl->NameSpace(This,vDir,ppsdf)
#define IShellDispatch5_BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf) (This)->lpVtbl->BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf)
#define IShellDispatch5_Windows(This,ppid) (This)->lpVtbl->Windows(This,ppid)
#define IShellDispatch5_Open(This,vDir) (This)->lpVtbl->Open(This,vDir)
#define IShellDispatch5_Explore(This,vDir) (This)->lpVtbl->Explore(This,vDir)
#define IShellDispatch5_MinimizeAll(This) (This)->lpVtbl->MinimizeAll(This)
#define IShellDispatch5_UndoMinimizeALL(This) (This)->lpVtbl->UndoMinimizeALL(This)
#define IShellDispatch5_FileRun(This) (This)->lpVtbl->FileRun(This)
#define IShellDispatch5_CascadeWindows(This) (This)->lpVtbl->CascadeWindows(This)
#define IShellDispatch5_TileVertically(This) (This)->lpVtbl->TileVertically(This)
#define IShellDispatch5_TileHorizontally(This) (This)->lpVtbl->TileHorizontally(This)
#define IShellDispatch5_ShutdownWindows(This) (This)->lpVtbl->ShutdownWindows(This)
#define IShellDispatch5_Suspend(This) (This)->lpVtbl->Suspend(This)
#define IShellDispatch5_EjectPC(This) (This)->lpVtbl->EjectPC(This)
#define IShellDispatch5_SetTime(This) (This)->lpVtbl->SetTime(This)
#define IShellDispatch5_TrayProperties(This) (This)->lpVtbl->TrayProperties(This)
#define IShellDispatch5_Help(This) (This)->lpVtbl->Help(This)
#define IShellDispatch5_FindFiles(This) (This)->lpVtbl->FindFiles(This)
#define IShellDispatch5_FindComputer(This) (This)->lpVtbl->FindComputer(This)
#define IShellDispatch5_RefreshMenu(This) (This)->lpVtbl->RefreshMenu(This)
#define IShellDispatch5_ControlPanelItem(This,bstrDir) (This)->lpVtbl->ControlPanelItem(This,bstrDir)
/*** IShellDispatch2 methods ***/
#define IShellDispatch5_IsRestricted(This,Group,Restriction,plRestrictValue) (This)->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue)
#define IShellDispatch5_ShellExecute(This,File,vArgs,vDir,vOperation,vShow) (This)->lpVtbl->ShellExecute(This,File,vArgs,vDir,vOperation,vShow)
#define IShellDispatch5_FindPrinter(This,name,location,model) (This)->lpVtbl->FindPrinter(This,name,location,model)
#define IShellDispatch5_GetSystemInformation(This,name,pv) (This)->lpVtbl->GetSystemInformation(This,name,pv)
#define IShellDispatch5_ServiceStart(This,ServiceName,Persistent,pSuccess) (This)->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess)
#define IShellDispatch5_ServiceStop(This,ServiceName,Persistent,pSuccess) (This)->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess)
#define IShellDispatch5_IsServiceRunning(This,ServiceName,pRunning) (This)->lpVtbl->IsServiceRunning(This,ServiceName,pRunning)
#define IShellDispatch5_CanStartStopService(This,ServiceName,pCanStartStop) (This)->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop)
#define IShellDispatch5_ShowBrowserBar(This,bstrClsid,bShow,pSuccess) (This)->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess)
/*** IShellDispatch3 methods ***/
#define IShellDispatch5_AddToRecent(This,varFile,bstrCategory) (This)->lpVtbl->AddToRecent(This,varFile,bstrCategory)
/*** IShellDispatch4 methods ***/
#define IShellDispatch5_WindowsSecurity(This) (This)->lpVtbl->WindowsSecurity(This)
#define IShellDispatch5_ToggleDesktop(This) (This)->lpVtbl->ToggleDesktop(This)
#define IShellDispatch5_ExplorerPolicy(This,bstrPolicyName,pValue) (This)->lpVtbl->ExplorerPolicy(This,bstrPolicyName,pValue)
#define IShellDispatch5_GetSetting(This,lSetting,pResult) (This)->lpVtbl->GetSetting(This,lSetting,pResult)
/*** IShellDispatch5 methods ***/
#define IShellDispatch5_WindowSwitcher(This) (This)->lpVtbl->WindowSwitcher(This)
#else
/*** IUnknown methods ***/
static inline HRESULT IShellDispatch5_QueryInterface(IShellDispatch5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellDispatch5_AddRef(IShellDispatch5* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellDispatch5_Release(IShellDispatch5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IShellDispatch5_GetTypeInfoCount(IShellDispatch5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IShellDispatch5_GetTypeInfo(IShellDispatch5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IShellDispatch5_GetIDsOfNames(IShellDispatch5* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IShellDispatch5_Invoke(IShellDispatch5* 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);
}
/*** IShellDispatch methods ***/
static inline HRESULT IShellDispatch5_get_Application(IShellDispatch5* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT IShellDispatch5_get_Parent(IShellDispatch5* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT IShellDispatch5_NameSpace(IShellDispatch5* This,VARIANT vDir,Folder **ppsdf) {
    return This->lpVtbl->NameSpace(This,vDir,ppsdf);
}
static inline HRESULT IShellDispatch5_BrowseForFolder(IShellDispatch5* This,LONG Hwnd,BSTR Title,LONG Options,VARIANT RootFolder,Folder **ppsdf) {
    return This->lpVtbl->BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf);
}
static inline HRESULT IShellDispatch5_Windows(IShellDispatch5* This,IDispatch **ppid) {
    return This->lpVtbl->Windows(This,ppid);
}
static inline HRESULT IShellDispatch5_Open(IShellDispatch5* This,VARIANT vDir) {
    return This->lpVtbl->Open(This,vDir);
}
static inline HRESULT IShellDispatch5_Explore(IShellDispatch5* This,VARIANT vDir) {
    return This->lpVtbl->Explore(This,vDir);
}
static inline HRESULT IShellDispatch5_MinimizeAll(IShellDispatch5* This) {
    return This->lpVtbl->MinimizeAll(This);
}
static inline HRESULT IShellDispatch5_UndoMinimizeALL(IShellDispatch5* This) {
    return This->lpVtbl->UndoMinimizeALL(This);
}
static inline HRESULT IShellDispatch5_FileRun(IShellDispatch5* This) {
    return This->lpVtbl->FileRun(This);
}
static inline HRESULT IShellDispatch5_CascadeWindows(IShellDispatch5* This) {
    return This->lpVtbl->CascadeWindows(This);
}
static inline HRESULT IShellDispatch5_TileVertically(IShellDispatch5* This) {
    return This->lpVtbl->TileVertically(This);
}
static inline HRESULT IShellDispatch5_TileHorizontally(IShellDispatch5* This) {
    return This->lpVtbl->TileHorizontally(This);
}
static inline HRESULT IShellDispatch5_ShutdownWindows(IShellDispatch5* This) {
    return This->lpVtbl->ShutdownWindows(This);
}
static inline HRESULT IShellDispatch5_Suspend(IShellDispatch5* This) {
    return This->lpVtbl->Suspend(This);
}
static inline HRESULT IShellDispatch5_EjectPC(IShellDispatch5* This) {
    return This->lpVtbl->EjectPC(This);
}
static inline HRESULT IShellDispatch5_SetTime(IShellDispatch5* This) {
    return This->lpVtbl->SetTime(This);
}
static inline HRESULT IShellDispatch5_TrayProperties(IShellDispatch5* This) {
    return This->lpVtbl->TrayProperties(This);
}
static inline HRESULT IShellDispatch5_Help(IShellDispatch5* This) {
    return This->lpVtbl->Help(This);
}
static inline HRESULT IShellDispatch5_FindFiles(IShellDispatch5* This) {
    return This->lpVtbl->FindFiles(This);
}
static inline HRESULT IShellDispatch5_FindComputer(IShellDispatch5* This) {
    return This->lpVtbl->FindComputer(This);
}
static inline HRESULT IShellDispatch5_RefreshMenu(IShellDispatch5* This) {
    return This->lpVtbl->RefreshMenu(This);
}
static inline HRESULT IShellDispatch5_ControlPanelItem(IShellDispatch5* This,BSTR bstrDir) {
    return This->lpVtbl->ControlPanelItem(This,bstrDir);
}
/*** IShellDispatch2 methods ***/
static inline HRESULT IShellDispatch5_IsRestricted(IShellDispatch5* This,BSTR Group,BSTR Restriction,LONG *plRestrictValue) {
    return This->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue);
}
static inline HRESULT IShellDispatch5_ShellExecute(IShellDispatch5* This,BSTR File,VARIANT vArgs,VARIANT vDir,VARIANT vOperation,VARIANT vShow) {
    return This->lpVtbl->ShellExecute(This,File,vArgs,vDir,vOperation,vShow);
}
static inline HRESULT IShellDispatch5_FindPrinter(IShellDispatch5* This,BSTR name,BSTR location,BSTR model) {
    return This->lpVtbl->FindPrinter(This,name,location,model);
}
static inline HRESULT IShellDispatch5_GetSystemInformation(IShellDispatch5* This,BSTR name,VARIANT *pv) {
    return This->lpVtbl->GetSystemInformation(This,name,pv);
}
static inline HRESULT IShellDispatch5_ServiceStart(IShellDispatch5* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess);
}
static inline HRESULT IShellDispatch5_ServiceStop(IShellDispatch5* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess);
}
static inline HRESULT IShellDispatch5_IsServiceRunning(IShellDispatch5* This,BSTR ServiceName,VARIANT *pRunning) {
    return This->lpVtbl->IsServiceRunning(This,ServiceName,pRunning);
}
static inline HRESULT IShellDispatch5_CanStartStopService(IShellDispatch5* This,BSTR ServiceName,VARIANT *pCanStartStop) {
    return This->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop);
}
static inline HRESULT IShellDispatch5_ShowBrowserBar(IShellDispatch5* This,BSTR bstrClsid,VARIANT bShow,VARIANT *pSuccess) {
    return This->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess);
}
/*** IShellDispatch3 methods ***/
static inline HRESULT IShellDispatch5_AddToRecent(IShellDispatch5* This,VARIANT varFile,BSTR bstrCategory) {
    return This->lpVtbl->AddToRecent(This,varFile,bstrCategory);
}
/*** IShellDispatch4 methods ***/
static inline HRESULT IShellDispatch5_WindowsSecurity(IShellDispatch5* This) {
    return This->lpVtbl->WindowsSecurity(This);
}
static inline HRESULT IShellDispatch5_ToggleDesktop(IShellDispatch5* This) {
    return This->lpVtbl->ToggleDesktop(This);
}
static inline HRESULT IShellDispatch5_ExplorerPolicy(IShellDispatch5* This,BSTR bstrPolicyName,VARIANT *pValue) {
    return This->lpVtbl->ExplorerPolicy(This,bstrPolicyName,pValue);
}
static inline HRESULT IShellDispatch5_GetSetting(IShellDispatch5* This,LONG lSetting,VARIANT_BOOL *pResult) {
    return This->lpVtbl->GetSetting(This,lSetting,pResult);
}
/*** IShellDispatch5 methods ***/
static inline HRESULT IShellDispatch5_WindowSwitcher(IShellDispatch5* This) {
    return This->lpVtbl->WindowSwitcher(This);
}
#endif
#endif

#endif


#endif  /* __IShellDispatch5_INTERFACE_DEFINED__ */

#if NTDDI_VERSION >= NTDDI_WIN8
/*****************************************************************************
 * IShellDispatch6 interface
 */
#ifndef __IShellDispatch6_INTERFACE_DEFINED__
#define __IShellDispatch6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellDispatch6, 0x286e6f1b, 0x7113, 0x4355, 0x95,0x62, 0x96,0xb7,0xe9,0xd6,0x4c,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("286e6f1b-7113-4355-9562-96b7e9d64c54")
IShellDispatch6 : public IShellDispatch5
{
    virtual HRESULT STDMETHODCALLTYPE SearchCommand(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellDispatch6, 0x286e6f1b, 0x7113, 0x4355, 0x95,0x62, 0x96,0xb7,0xe9,0xd6,0x4c,0x54)
#endif
#else
typedef struct IShellDispatch6Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IShellDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Application)(
        IShellDispatch6 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        IShellDispatch6 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *NameSpace)(
        IShellDispatch6 *This,
        VARIANT vDir,
        Folder **ppsdf);

    HRESULT (STDMETHODCALLTYPE *BrowseForFolder)(
        IShellDispatch6 *This,
        LONG Hwnd,
        BSTR Title,
        LONG Options,
        VARIANT RootFolder,
        Folder **ppsdf);

    HRESULT (STDMETHODCALLTYPE *Windows)(
        IShellDispatch6 *This,
        IDispatch **ppid);

    HRESULT (STDMETHODCALLTYPE *Open)(
        IShellDispatch6 *This,
        VARIANT vDir);

    HRESULT (STDMETHODCALLTYPE *Explore)(
        IShellDispatch6 *This,
        VARIANT vDir);

    HRESULT (STDMETHODCALLTYPE *MinimizeAll)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *UndoMinimizeALL)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *FileRun)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *CascadeWindows)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *TileVertically)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *TileHorizontally)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *ShutdownWindows)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *Suspend)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *EjectPC)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *SetTime)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *TrayProperties)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *Help)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *FindFiles)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *FindComputer)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *RefreshMenu)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *ControlPanelItem)(
        IShellDispatch6 *This,
        BSTR bstrDir);

    /*** IShellDispatch2 methods ***/
    HRESULT (STDMETHODCALLTYPE *IsRestricted)(
        IShellDispatch6 *This,
        BSTR Group,
        BSTR Restriction,
        LONG *plRestrictValue);

    HRESULT (STDMETHODCALLTYPE *ShellExecute)(
        IShellDispatch6 *This,
        BSTR File,
        VARIANT vArgs,
        VARIANT vDir,
        VARIANT vOperation,
        VARIANT vShow);

    HRESULT (STDMETHODCALLTYPE *FindPrinter)(
        IShellDispatch6 *This,
        BSTR name,
        BSTR location,
        BSTR model);

    HRESULT (STDMETHODCALLTYPE *GetSystemInformation)(
        IShellDispatch6 *This,
        BSTR name,
        VARIANT *pv);

    HRESULT (STDMETHODCALLTYPE *ServiceStart)(
        IShellDispatch6 *This,
        BSTR ServiceName,
        VARIANT Persistent,
        VARIANT *pSuccess);

    HRESULT (STDMETHODCALLTYPE *ServiceStop)(
        IShellDispatch6 *This,
        BSTR ServiceName,
        VARIANT Persistent,
        VARIANT *pSuccess);

    HRESULT (STDMETHODCALLTYPE *IsServiceRunning)(
        IShellDispatch6 *This,
        BSTR ServiceName,
        VARIANT *pRunning);

    HRESULT (STDMETHODCALLTYPE *CanStartStopService)(
        IShellDispatch6 *This,
        BSTR ServiceName,
        VARIANT *pCanStartStop);

    HRESULT (STDMETHODCALLTYPE *ShowBrowserBar)(
        IShellDispatch6 *This,
        BSTR bstrClsid,
        VARIANT bShow,
        VARIANT *pSuccess);

    /*** IShellDispatch3 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddToRecent)(
        IShellDispatch6 *This,
        VARIANT varFile,
        BSTR bstrCategory);

    /*** IShellDispatch4 methods ***/
    HRESULT (STDMETHODCALLTYPE *WindowsSecurity)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *ToggleDesktop)(
        IShellDispatch6 *This);

    HRESULT (STDMETHODCALLTYPE *ExplorerPolicy)(
        IShellDispatch6 *This,
        BSTR bstrPolicyName,
        VARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *GetSetting)(
        IShellDispatch6 *This,
        LONG lSetting,
        VARIANT_BOOL *pResult);

    /*** IShellDispatch5 methods ***/
    HRESULT (STDMETHODCALLTYPE *WindowSwitcher)(
        IShellDispatch6 *This);

    /*** IShellDispatch6 methods ***/
    HRESULT (STDMETHODCALLTYPE *SearchCommand)(
        IShellDispatch6 *This);

    END_INTERFACE
} IShellDispatch6Vtbl;

interface IShellDispatch6 {
    CONST_VTBL IShellDispatch6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellDispatch6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellDispatch6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellDispatch6_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IShellDispatch6_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IShellDispatch6_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IShellDispatch6_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IShellDispatch6_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IShellDispatch methods ***/
#define IShellDispatch6_get_Application(This,ppid) (This)->lpVtbl->get_Application(This,ppid)
#define IShellDispatch6_get_Parent(This,ppid) (This)->lpVtbl->get_Parent(This,ppid)
#define IShellDispatch6_NameSpace(This,vDir,ppsdf) (This)->lpVtbl->NameSpace(This,vDir,ppsdf)
#define IShellDispatch6_BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf) (This)->lpVtbl->BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf)
#define IShellDispatch6_Windows(This,ppid) (This)->lpVtbl->Windows(This,ppid)
#define IShellDispatch6_Open(This,vDir) (This)->lpVtbl->Open(This,vDir)
#define IShellDispatch6_Explore(This,vDir) (This)->lpVtbl->Explore(This,vDir)
#define IShellDispatch6_MinimizeAll(This) (This)->lpVtbl->MinimizeAll(This)
#define IShellDispatch6_UndoMinimizeALL(This) (This)->lpVtbl->UndoMinimizeALL(This)
#define IShellDispatch6_FileRun(This) (This)->lpVtbl->FileRun(This)
#define IShellDispatch6_CascadeWindows(This) (This)->lpVtbl->CascadeWindows(This)
#define IShellDispatch6_TileVertically(This) (This)->lpVtbl->TileVertically(This)
#define IShellDispatch6_TileHorizontally(This) (This)->lpVtbl->TileHorizontally(This)
#define IShellDispatch6_ShutdownWindows(This) (This)->lpVtbl->ShutdownWindows(This)
#define IShellDispatch6_Suspend(This) (This)->lpVtbl->Suspend(This)
#define IShellDispatch6_EjectPC(This) (This)->lpVtbl->EjectPC(This)
#define IShellDispatch6_SetTime(This) (This)->lpVtbl->SetTime(This)
#define IShellDispatch6_TrayProperties(This) (This)->lpVtbl->TrayProperties(This)
#define IShellDispatch6_Help(This) (This)->lpVtbl->Help(This)
#define IShellDispatch6_FindFiles(This) (This)->lpVtbl->FindFiles(This)
#define IShellDispatch6_FindComputer(This) (This)->lpVtbl->FindComputer(This)
#define IShellDispatch6_RefreshMenu(This) (This)->lpVtbl->RefreshMenu(This)
#define IShellDispatch6_ControlPanelItem(This,bstrDir) (This)->lpVtbl->ControlPanelItem(This,bstrDir)
/*** IShellDispatch2 methods ***/
#define IShellDispatch6_IsRestricted(This,Group,Restriction,plRestrictValue) (This)->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue)
#define IShellDispatch6_ShellExecute(This,File,vArgs,vDir,vOperation,vShow) (This)->lpVtbl->ShellExecute(This,File,vArgs,vDir,vOperation,vShow)
#define IShellDispatch6_FindPrinter(This,name,location,model) (This)->lpVtbl->FindPrinter(This,name,location,model)
#define IShellDispatch6_GetSystemInformation(This,name,pv) (This)->lpVtbl->GetSystemInformation(This,name,pv)
#define IShellDispatch6_ServiceStart(This,ServiceName,Persistent,pSuccess) (This)->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess)
#define IShellDispatch6_ServiceStop(This,ServiceName,Persistent,pSuccess) (This)->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess)
#define IShellDispatch6_IsServiceRunning(This,ServiceName,pRunning) (This)->lpVtbl->IsServiceRunning(This,ServiceName,pRunning)
#define IShellDispatch6_CanStartStopService(This,ServiceName,pCanStartStop) (This)->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop)
#define IShellDispatch6_ShowBrowserBar(This,bstrClsid,bShow,pSuccess) (This)->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess)
/*** IShellDispatch3 methods ***/
#define IShellDispatch6_AddToRecent(This,varFile,bstrCategory) (This)->lpVtbl->AddToRecent(This,varFile,bstrCategory)
/*** IShellDispatch4 methods ***/
#define IShellDispatch6_WindowsSecurity(This) (This)->lpVtbl->WindowsSecurity(This)
#define IShellDispatch6_ToggleDesktop(This) (This)->lpVtbl->ToggleDesktop(This)
#define IShellDispatch6_ExplorerPolicy(This,bstrPolicyName,pValue) (This)->lpVtbl->ExplorerPolicy(This,bstrPolicyName,pValue)
#define IShellDispatch6_GetSetting(This,lSetting,pResult) (This)->lpVtbl->GetSetting(This,lSetting,pResult)
/*** IShellDispatch5 methods ***/
#define IShellDispatch6_WindowSwitcher(This) (This)->lpVtbl->WindowSwitcher(This)
/*** IShellDispatch6 methods ***/
#define IShellDispatch6_SearchCommand(This) (This)->lpVtbl->SearchCommand(This)
#else
/*** IUnknown methods ***/
static inline HRESULT IShellDispatch6_QueryInterface(IShellDispatch6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellDispatch6_AddRef(IShellDispatch6* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellDispatch6_Release(IShellDispatch6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IShellDispatch6_GetTypeInfoCount(IShellDispatch6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IShellDispatch6_GetTypeInfo(IShellDispatch6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IShellDispatch6_GetIDsOfNames(IShellDispatch6* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IShellDispatch6_Invoke(IShellDispatch6* 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);
}
/*** IShellDispatch methods ***/
static inline HRESULT IShellDispatch6_get_Application(IShellDispatch6* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static inline HRESULT IShellDispatch6_get_Parent(IShellDispatch6* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static inline HRESULT IShellDispatch6_NameSpace(IShellDispatch6* This,VARIANT vDir,Folder **ppsdf) {
    return This->lpVtbl->NameSpace(This,vDir,ppsdf);
}
static inline HRESULT IShellDispatch6_BrowseForFolder(IShellDispatch6* This,LONG Hwnd,BSTR Title,LONG Options,VARIANT RootFolder,Folder **ppsdf) {
    return This->lpVtbl->BrowseForFolder(This,Hwnd,Title,Options,RootFolder,ppsdf);
}
static inline HRESULT IShellDispatch6_Windows(IShellDispatch6* This,IDispatch **ppid) {
    return This->lpVtbl->Windows(This,ppid);
}
static inline HRESULT IShellDispatch6_Open(IShellDispatch6* This,VARIANT vDir) {
    return This->lpVtbl->Open(This,vDir);
}
static inline HRESULT IShellDispatch6_Explore(IShellDispatch6* This,VARIANT vDir) {
    return This->lpVtbl->Explore(This,vDir);
}
static inline HRESULT IShellDispatch6_MinimizeAll(IShellDispatch6* This) {
    return This->lpVtbl->MinimizeAll(This);
}
static inline HRESULT IShellDispatch6_UndoMinimizeALL(IShellDispatch6* This) {
    return This->lpVtbl->UndoMinimizeALL(This);
}
static inline HRESULT IShellDispatch6_FileRun(IShellDispatch6* This) {
    return This->lpVtbl->FileRun(This);
}
static inline HRESULT IShellDispatch6_CascadeWindows(IShellDispatch6* This) {
    return This->lpVtbl->CascadeWindows(This);
}
static inline HRESULT IShellDispatch6_TileVertically(IShellDispatch6* This) {
    return This->lpVtbl->TileVertically(This);
}
static inline HRESULT IShellDispatch6_TileHorizontally(IShellDispatch6* This) {
    return This->lpVtbl->TileHorizontally(This);
}
static inline HRESULT IShellDispatch6_ShutdownWindows(IShellDispatch6* This) {
    return This->lpVtbl->ShutdownWindows(This);
}
static inline HRESULT IShellDispatch6_Suspend(IShellDispatch6* This) {
    return This->lpVtbl->Suspend(This);
}
static inline HRESULT IShellDispatch6_EjectPC(IShellDispatch6* This) {
    return This->lpVtbl->EjectPC(This);
}
static inline HRESULT IShellDispatch6_SetTime(IShellDispatch6* This) {
    return This->lpVtbl->SetTime(This);
}
static inline HRESULT IShellDispatch6_TrayProperties(IShellDispatch6* This) {
    return This->lpVtbl->TrayProperties(This);
}
static inline HRESULT IShellDispatch6_Help(IShellDispatch6* This) {
    return This->lpVtbl->Help(This);
}
static inline HRESULT IShellDispatch6_FindFiles(IShellDispatch6* This) {
    return This->lpVtbl->FindFiles(This);
}
static inline HRESULT IShellDispatch6_FindComputer(IShellDispatch6* This) {
    return This->lpVtbl->FindComputer(This);
}
static inline HRESULT IShellDispatch6_RefreshMenu(IShellDispatch6* This) {
    return This->lpVtbl->RefreshMenu(This);
}
static inline HRESULT IShellDispatch6_ControlPanelItem(IShellDispatch6* This,BSTR bstrDir) {
    return This->lpVtbl->ControlPanelItem(This,bstrDir);
}
/*** IShellDispatch2 methods ***/
static inline HRESULT IShellDispatch6_IsRestricted(IShellDispatch6* This,BSTR Group,BSTR Restriction,LONG *plRestrictValue) {
    return This->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue);
}
static inline HRESULT IShellDispatch6_ShellExecute(IShellDispatch6* This,BSTR File,VARIANT vArgs,VARIANT vDir,VARIANT vOperation,VARIANT vShow) {
    return This->lpVtbl->ShellExecute(This,File,vArgs,vDir,vOperation,vShow);
}
static inline HRESULT IShellDispatch6_FindPrinter(IShellDispatch6* This,BSTR name,BSTR location,BSTR model) {
    return This->lpVtbl->FindPrinter(This,name,location,model);
}
static inline HRESULT IShellDispatch6_GetSystemInformation(IShellDispatch6* This,BSTR name,VARIANT *pv) {
    return This->lpVtbl->GetSystemInformation(This,name,pv);
}
static inline HRESULT IShellDispatch6_ServiceStart(IShellDispatch6* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess);
}
static inline HRESULT IShellDispatch6_ServiceStop(IShellDispatch6* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess);
}
static inline HRESULT IShellDispatch6_IsServiceRunning(IShellDispatch6* This,BSTR ServiceName,VARIANT *pRunning) {
    return This->lpVtbl->IsServiceRunning(This,ServiceName,pRunning);
}
static inline HRESULT IShellDispatch6_CanStartStopService(IShellDispatch6* This,BSTR ServiceName,VARIANT *pCanStartStop) {
    return This->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop);
}
static inline HRESULT IShellDispatch6_ShowBrowserBar(IShellDispatch6* This,BSTR bstrClsid,VARIANT bShow,VARIANT *pSuccess) {
    return This->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess);
}
/*** IShellDispatch3 methods ***/
static inline HRESULT IShellDispatch6_AddToRecent(IShellDispatch6* This,VARIANT varFile,BSTR bstrCategory) {
    return This->lpVtbl->AddToRecent(This,varFile,bstrCategory);
}
/*** IShellDispatch4 methods ***/
static inline HRESULT IShellDispatch6_WindowsSecurity(IShellDispatch6* This) {
    return This->lpVtbl->WindowsSecurity(This);
}
static inline HRESULT IShellDispatch6_ToggleDesktop(IShellDispatch6* This) {
    return This->lpVtbl->ToggleDesktop(This);
}
static inline HRESULT IShellDispatch6_ExplorerPolicy(IShellDispatch6* This,BSTR bstrPolicyName,VARIANT *pValue) {
    return This->lpVtbl->ExplorerPolicy(This,bstrPolicyName,pValue);
}
static inline HRESULT IShellDispatch6_GetSetting(IShellDispatch6* This,LONG lSetting,VARIANT_BOOL *pResult) {
    return This->lpVtbl->GetSetting(This,lSetting,pResult);
}
/*** IShellDispatch5 methods ***/
static inline HRESULT IShellDispatch6_WindowSwitcher(IShellDispatch6* This) {
    return This->lpVtbl->WindowSwitcher(This);
}
/*** IShellDispatch6 methods ***/
static inline HRESULT IShellDispatch6_SearchCommand(IShellDispatch6* This) {
    return This->lpVtbl->SearchCommand(This);
}
#endif
#endif

#endif


#endif  /* __IShellDispatch6_INTERFACE_DEFINED__ */

#endif
/*****************************************************************************
 * Shell coclass
 */

DEFINE_GUID(CLSID_Shell, 0x13709620, 0xc279, 0x11ce, 0xa4,0x9e, 0x44,0x45,0x53,0x54,0x00,0x00);

#ifdef __cplusplus
class DECLSPEC_UUID("13709620-c279-11ce-a49e-444553540000") Shell;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(Shell, 0x13709620, 0xc279, 0x11ce, 0xa4,0x9e, 0x44,0x45,0x53,0x54,0x00,0x00)
#endif
#endif

/*****************************************************************************
 * ShellDispatchInproc coclass
 */

DEFINE_GUID(CLSID_ShellDispatchInproc, 0x0a89a860, 0xd7b1, 0x11ce, 0x83,0x50, 0x44,0x45,0x53,0x54,0x00,0x00);

#ifdef __cplusplus
class DECLSPEC_UUID("0a89a860-d7b1-11ce-8350-444553540000") ShellDispatchInproc;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ShellDispatchInproc, 0x0a89a860, 0xd7b1, 0x11ce, 0x83,0x50, 0x44,0x45,0x53,0x54,0x00,0x00)
#endif
#endif

typedef enum ShellSpecialFolderConstants {
    ssfDESKTOP = 0x0,
    ssfPROGRAMS = 0x2,
    ssfCONTROLS = 0x3,
    ssfPRINTERS = 0x4,
    ssfPERSONAL = 0x5,
    ssfFAVORITES = 0x6,
    ssfSTARTUP = 0x7,
    ssfRECENT = 0x8,
    ssfSENDTO = 0x9,
    ssfBITBUCKET = 0xa,
    ssfSTARTMENU = 0xb,
    ssfDESKTOPDIRECTORY = 0x10,
    ssfDRIVES = 0x11,
    ssfNETWORK = 0x12,
    ssfNETHOOD = 0x13,
    ssfFONTS = 0x14,
    ssfTEMPLATES = 0x15,
    ssfCOMMONSTARTMENU = 0x16,
    ssfCOMMONPROGRAMS = 0x17,
    ssfCOMMONSTARTUP = 0x18,
    ssfCOMMONDESKTOPDIR = 0x19,
    ssfAPPDATA = 0x1a,
    ssfPRINTHOOD = 0x1b,
    ssfLOCALAPPDATA = 0x1c,
    ssfALTSTARTUP = 0x1d,
    ssfCOMMONALTSTARTUP = 0x1e,
    ssfCOMMONFAVORITES = 0x1f,
    ssfINTERNETCACHE = 0x20,
    ssfCOOKIES = 0x21,
    ssfHISTORY = 0x22,
    ssfCOMMONAPPDATA = 0x23,
    ssfWINDOWS = 0x24,
    ssfSYSTEM = 0x25,
    ssfPROGRAMFILES = 0x26,
    ssfMYPICTURES = 0x27,
    ssfPROFILE = 0x28,
    ssfSYSTEMx86 = 0x29,
    ssfPROGRAMFILESx86 = 0x30
} ShellSpecialFolderConstants;
/*****************************************************************************
 * IFileSearchBand interface
 */
#ifndef __IFileSearchBand_INTERFACE_DEFINED__
#define __IFileSearchBand_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFileSearchBand, 0x2d91eea1, 0x9932, 0x11d2, 0xbe,0x86, 0x00,0xa0,0xc9,0xa8,0x3d,0xa1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2d91eea1-9932-11d2-be86-00a0c9a83da1")
IFileSearchBand : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE SetFocus(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSearchParameters(
        BSTR *pbstrSearchID,
        VARIANT_BOOL bNavToResults,
        VARIANT *pvarScope,
        VARIANT *pvarQueryFile) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SearchID(
        BSTR *pbstrSearchID) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Scope(
        VARIANT *pvarScope) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_QueryFile(
        VARIANT *pvarFile) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileSearchBand, 0x2d91eea1, 0x9932, 0x11d2, 0xbe,0x86, 0x00,0xa0,0xc9,0xa8,0x3d,0xa1)
#endif
#else
typedef struct IFileSearchBandVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IFileSearchBand methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFocus)(
        IFileSearchBand *This);

    HRESULT (STDMETHODCALLTYPE *SetSearchParameters)(
        IFileSearchBand *This,
        BSTR *pbstrSearchID,
        VARIANT_BOOL bNavToResults,
        VARIANT *pvarScope,
        VARIANT *pvarQueryFile);

    HRESULT (STDMETHODCALLTYPE *get_SearchID)(
        IFileSearchBand *This,
        BSTR *pbstrSearchID);

    HRESULT (STDMETHODCALLTYPE *get_Scope)(
        IFileSearchBand *This,
        VARIANT *pvarScope);

    HRESULT (STDMETHODCALLTYPE *get_QueryFile)(
        IFileSearchBand *This,
        VARIANT *pvarFile);

    END_INTERFACE
} IFileSearchBandVtbl;

interface IFileSearchBand {
    CONST_VTBL IFileSearchBandVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileSearchBand_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileSearchBand_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileSearchBand_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFileSearchBand_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFileSearchBand_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFileSearchBand_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFileSearchBand_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFileSearchBand methods ***/
#define IFileSearchBand_SetFocus(This) (This)->lpVtbl->SetFocus(This)
#define IFileSearchBand_SetSearchParameters(This,pbstrSearchID,bNavToResults,pvarScope,pvarQueryFile) (This)->lpVtbl->SetSearchParameters(This,pbstrSearchID,bNavToResults,pvarScope,pvarQueryFile)
#define IFileSearchBand_get_SearchID(This,pbstrSearchID) (This)->lpVtbl->get_SearchID(This,pbstrSearchID)
#define IFileSearchBand_get_Scope(This,pvarScope) (This)->lpVtbl->get_Scope(This,pvarScope)
#define IFileSearchBand_get_QueryFile(This,pvarFile) (This)->lpVtbl->get_QueryFile(This,pvarFile)
#else
/*** IUnknown methods ***/
static inline HRESULT IFileSearchBand_QueryInterface(IFileSearchBand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileSearchBand_AddRef(IFileSearchBand* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileSearchBand_Release(IFileSearchBand* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IFileSearchBand_GetTypeInfoCount(IFileSearchBand* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IFileSearchBand_GetTypeInfo(IFileSearchBand* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IFileSearchBand_GetIDsOfNames(IFileSearchBand* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IFileSearchBand_Invoke(IFileSearchBand* 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);
}
/*** IFileSearchBand methods ***/
static inline HRESULT IFileSearchBand_SetFocus(IFileSearchBand* This) {
    return This->lpVtbl->SetFocus(This);
}
static inline HRESULT IFileSearchBand_SetSearchParameters(IFileSearchBand* This,BSTR *pbstrSearchID,VARIANT_BOOL bNavToResults,VARIANT *pvarScope,VARIANT *pvarQueryFile) {
    return This->lpVtbl->SetSearchParameters(This,pbstrSearchID,bNavToResults,pvarScope,pvarQueryFile);
}
static inline HRESULT IFileSearchBand_get_SearchID(IFileSearchBand* This,BSTR *pbstrSearchID) {
    return This->lpVtbl->get_SearchID(This,pbstrSearchID);
}
static inline HRESULT IFileSearchBand_get_Scope(IFileSearchBand* This,VARIANT *pvarScope) {
    return This->lpVtbl->get_Scope(This,pvarScope);
}
static inline HRESULT IFileSearchBand_get_QueryFile(IFileSearchBand* This,VARIANT *pvarFile) {
    return This->lpVtbl->get_QueryFile(This,pvarFile);
}
#endif
#endif

#endif


#endif  /* __IFileSearchBand_INTERFACE_DEFINED__ */

/*****************************************************************************
 * FileSearchBand coclass
 */

DEFINE_GUID(CLSID_FileSearchBand, 0xc4ee31f3, 0x4768, 0x11d2, 0xbe,0x5c, 0x00,0xa0,0xc9,0xa8,0x3d,0xa1);

#ifdef __cplusplus
class DECLSPEC_UUID("c4ee31f3-4768-11d2-be5c-00a0c9a83da1") FileSearchBand;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FileSearchBand, 0xc4ee31f3, 0x4768, 0x11d2, 0xbe,0x5c, 0x00,0xa0,0xc9,0xa8,0x3d,0xa1)
#endif
#endif

/*****************************************************************************
 * IWebWizardHost interface
 */
#ifndef __IWebWizardHost_INTERFACE_DEFINED__
#define __IWebWizardHost_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWebWizardHost, 0x18bcc359, 0x4990, 0x4bfb, 0xb9,0x51, 0x3c,0x83,0x70,0x2b,0xe5,0xf9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("18bcc359-4990-4bfb-b951-3c83702be5f9")
IWebWizardHost : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE FinalBack(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE FinalNext(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Caption(
        BSTR bstrCaption) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Caption(
        BSTR *pbstrCaption) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Property(
        BSTR bstrPropertyName,
        VARIANT *pvProperty) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Property(
        BSTR bstrPropertyName,
        VARIANT *pvProperty) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetWizardButtons(
        VARIANT_BOOL vfEnableBack,
        VARIANT_BOOL vfEnableNext,
        VARIANT_BOOL vfLastPage) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHeaderText(
        BSTR bstrHeaderTitle,
        BSTR bstrHeaderSubtitle) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWebWizardHost, 0x18bcc359, 0x4990, 0x4bfb, 0xb9,0x51, 0x3c,0x83,0x70,0x2b,0xe5,0xf9)
#endif
#else
typedef struct IWebWizardHostVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWebWizardHost methods ***/
    HRESULT (STDMETHODCALLTYPE *FinalBack)(
        IWebWizardHost *This);

    HRESULT (STDMETHODCALLTYPE *FinalNext)(
        IWebWizardHost *This);

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

    HRESULT (STDMETHODCALLTYPE *put_Caption)(
        IWebWizardHost *This,
        BSTR bstrCaption);

    HRESULT (STDMETHODCALLTYPE *get_Caption)(
        IWebWizardHost *This,
        BSTR *pbstrCaption);

    HRESULT (STDMETHODCALLTYPE *put_Property)(
        IWebWizardHost *This,
        BSTR bstrPropertyName,
        VARIANT *pvProperty);

    HRESULT (STDMETHODCALLTYPE *get_Property)(
        IWebWizardHost *This,
        BSTR bstrPropertyName,
        VARIANT *pvProperty);

    HRESULT (STDMETHODCALLTYPE *SetWizardButtons)(
        IWebWizardHost *This,
        VARIANT_BOOL vfEnableBack,
        VARIANT_BOOL vfEnableNext,
        VARIANT_BOOL vfLastPage);

    HRESULT (STDMETHODCALLTYPE *SetHeaderText)(
        IWebWizardHost *This,
        BSTR bstrHeaderTitle,
        BSTR bstrHeaderSubtitle);

    END_INTERFACE
} IWebWizardHostVtbl;

interface IWebWizardHost {
    CONST_VTBL IWebWizardHostVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWebWizardHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWebWizardHost_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWebWizardHost_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWebWizardHost_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWebWizardHost_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWebWizardHost_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWebWizardHost_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWebWizardHost methods ***/
#define IWebWizardHost_FinalBack(This) (This)->lpVtbl->FinalBack(This)
#define IWebWizardHost_FinalNext(This) (This)->lpVtbl->FinalNext(This)
#define IWebWizardHost_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IWebWizardHost_put_Caption(This,bstrCaption) (This)->lpVtbl->put_Caption(This,bstrCaption)
#define IWebWizardHost_get_Caption(This,pbstrCaption) (This)->lpVtbl->get_Caption(This,pbstrCaption)
#define IWebWizardHost_put_Property(This,bstrPropertyName,pvProperty) (This)->lpVtbl->put_Property(This,bstrPropertyName,pvProperty)
#define IWebWizardHost_get_Property(This,bstrPropertyName,pvProperty) (This)->lpVtbl->get_Property(This,bstrPropertyName,pvProperty)
#define IWebWizardHost_SetWizardButtons(This,vfEnableBack,vfEnableNext,vfLastPage) (This)->lpVtbl->SetWizardButtons(This,vfEnableBack,vfEnableNext,vfLastPage)
#define IWebWizardHost_SetHeaderText(This,bstrHeaderTitle,bstrHeaderSubtitle) (This)->lpVtbl->SetHeaderText(This,bstrHeaderTitle,bstrHeaderSubtitle)
#else
/*** IUnknown methods ***/
static inline HRESULT IWebWizardHost_QueryInterface(IWebWizardHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWebWizardHost_AddRef(IWebWizardHost* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWebWizardHost_Release(IWebWizardHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IWebWizardHost_GetTypeInfoCount(IWebWizardHost* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IWebWizardHost_GetTypeInfo(IWebWizardHost* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IWebWizardHost_GetIDsOfNames(IWebWizardHost* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IWebWizardHost_Invoke(IWebWizardHost* 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);
}
/*** IWebWizardHost methods ***/
static inline HRESULT IWebWizardHost_FinalBack(IWebWizardHost* This) {
    return This->lpVtbl->FinalBack(This);
}
static inline HRESULT IWebWizardHost_FinalNext(IWebWizardHost* This) {
    return This->lpVtbl->FinalNext(This);
}
static inline HRESULT IWebWizardHost_Cancel(IWebWizardHost* This) {
    return This->lpVtbl->Cancel(This);
}
static inline HRESULT IWebWizardHost_put_Caption(IWebWizardHost* This,BSTR bstrCaption) {
    return This->lpVtbl->put_Caption(This,bstrCaption);
}
static inline HRESULT IWebWizardHost_get_Caption(IWebWizardHost* This,BSTR *pbstrCaption) {
    return This->lpVtbl->get_Caption(This,pbstrCaption);
}
static inline HRESULT IWebWizardHost_put_Property(IWebWizardHost* This,BSTR bstrPropertyName,VARIANT *pvProperty) {
    return This->lpVtbl->put_Property(This,bstrPropertyName,pvProperty);
}
static inline HRESULT IWebWizardHost_get_Property(IWebWizardHost* This,BSTR bstrPropertyName,VARIANT *pvProperty) {
    return This->lpVtbl->get_Property(This,bstrPropertyName,pvProperty);
}
static inline HRESULT IWebWizardHost_SetWizardButtons(IWebWizardHost* This,VARIANT_BOOL vfEnableBack,VARIANT_BOOL vfEnableNext,VARIANT_BOOL vfLastPage) {
    return This->lpVtbl->SetWizardButtons(This,vfEnableBack,vfEnableNext,vfLastPage);
}
static inline HRESULT IWebWizardHost_SetHeaderText(IWebWizardHost* This,BSTR bstrHeaderTitle,BSTR bstrHeaderSubtitle) {
    return This->lpVtbl->SetHeaderText(This,bstrHeaderTitle,bstrHeaderSubtitle);
}
#endif
#endif

#endif


#endif  /* __IWebWizardHost_INTERFACE_DEFINED__ */

/*****************************************************************************
 * INewWDEvents interface
 */
#ifndef __INewWDEvents_INTERFACE_DEFINED__
#define __INewWDEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_INewWDEvents, 0x0751c551, 0x7568, 0x41c9, 0x8e,0x5b, 0xe2,0x2e,0x38,0x91,0x92,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0751c551-7568-41c9-8e5b-e22e38919236")
INewWDEvents : public IWebWizardHost
{
    virtual HRESULT STDMETHODCALLTYPE PassportAuthenticate(
        BSTR bstrSignInUrl,
        VARIANT_BOOL *pvfAuthenitcated) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INewWDEvents, 0x0751c551, 0x7568, 0x41c9, 0x8e,0x5b, 0xe2,0x2e,0x38,0x91,0x92,0x36)
#endif
#else
typedef struct INewWDEventsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWebWizardHost methods ***/
    HRESULT (STDMETHODCALLTYPE *FinalBack)(
        INewWDEvents *This);

    HRESULT (STDMETHODCALLTYPE *FinalNext)(
        INewWDEvents *This);

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

    HRESULT (STDMETHODCALLTYPE *put_Caption)(
        INewWDEvents *This,
        BSTR bstrCaption);

    HRESULT (STDMETHODCALLTYPE *get_Caption)(
        INewWDEvents *This,
        BSTR *pbstrCaption);

    HRESULT (STDMETHODCALLTYPE *put_Property)(
        INewWDEvents *This,
        BSTR bstrPropertyName,
        VARIANT *pvProperty);

    HRESULT (STDMETHODCALLTYPE *get_Property)(
        INewWDEvents *This,
        BSTR bstrPropertyName,
        VARIANT *pvProperty);

    HRESULT (STDMETHODCALLTYPE *SetWizardButtons)(
        INewWDEvents *This,
        VARIANT_BOOL vfEnableBack,
        VARIANT_BOOL vfEnableNext,
        VARIANT_BOOL vfLastPage);

    HRESULT (STDMETHODCALLTYPE *SetHeaderText)(
        INewWDEvents *This,
        BSTR bstrHeaderTitle,
        BSTR bstrHeaderSubtitle);

    /*** INewWDEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *PassportAuthenticate)(
        INewWDEvents *This,
        BSTR bstrSignInUrl,
        VARIANT_BOOL *pvfAuthenitcated);

    END_INTERFACE
} INewWDEventsVtbl;

interface INewWDEvents {
    CONST_VTBL INewWDEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INewWDEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INewWDEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INewWDEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define INewWDEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define INewWDEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define INewWDEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define INewWDEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWebWizardHost methods ***/
#define INewWDEvents_FinalBack(This) (This)->lpVtbl->FinalBack(This)
#define INewWDEvents_FinalNext(This) (This)->lpVtbl->FinalNext(This)
#define INewWDEvents_Cancel(This) (This)->lpVtbl->Cancel(This)
#define INewWDEvents_put_Caption(This,bstrCaption) (This)->lpVtbl->put_Caption(This,bstrCaption)
#define INewWDEvents_get_Caption(This,pbstrCaption) (This)->lpVtbl->get_Caption(This,pbstrCaption)
#define INewWDEvents_put_Property(This,bstrPropertyName,pvProperty) (This)->lpVtbl->put_Property(This,bstrPropertyName,pvProperty)
#define INewWDEvents_get_Property(This,bstrPropertyName,pvProperty) (This)->lpVtbl->get_Property(This,bstrPropertyName,pvProperty)
#define INewWDEvents_SetWizardButtons(This,vfEnableBack,vfEnableNext,vfLastPage) (This)->lpVtbl->SetWizardButtons(This,vfEnableBack,vfEnableNext,vfLastPage)
#define INewWDEvents_SetHeaderText(This,bstrHeaderTitle,bstrHeaderSubtitle) (This)->lpVtbl->SetHeaderText(This,bstrHeaderTitle,bstrHeaderSubtitle)
/*** INewWDEvents methods ***/
#define INewWDEvents_PassportAuthenticate(This,bstrSignInUrl,pvfAuthenitcated) (This)->lpVtbl->PassportAuthenticate(This,bstrSignInUrl,pvfAuthenitcated)
#else
/*** IUnknown methods ***/
static inline HRESULT INewWDEvents_QueryInterface(INewWDEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INewWDEvents_AddRef(INewWDEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INewWDEvents_Release(INewWDEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT INewWDEvents_GetTypeInfoCount(INewWDEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT INewWDEvents_GetTypeInfo(INewWDEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT INewWDEvents_GetIDsOfNames(INewWDEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT INewWDEvents_Invoke(INewWDEvents* 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);
}
/*** IWebWizardHost methods ***/
static inline HRESULT INewWDEvents_FinalBack(INewWDEvents* This) {
    return This->lpVtbl->FinalBack(This);
}
static inline HRESULT INewWDEvents_FinalNext(INewWDEvents* This) {
    return This->lpVtbl->FinalNext(This);
}
static inline HRESULT INewWDEvents_Cancel(INewWDEvents* This) {
    return This->lpVtbl->Cancel(This);
}
static inline HRESULT INewWDEvents_put_Caption(INewWDEvents* This,BSTR bstrCaption) {
    return This->lpVtbl->put_Caption(This,bstrCaption);
}
static inline HRESULT INewWDEvents_get_Caption(INewWDEvents* This,BSTR *pbstrCaption) {
    return This->lpVtbl->get_Caption(This,pbstrCaption);
}
static inline HRESULT INewWDEvents_put_Property(INewWDEvents* This,BSTR bstrPropertyName,VARIANT *pvProperty) {
    return This->lpVtbl->put_Property(This,bstrPropertyName,pvProperty);
}
static inline HRESULT INewWDEvents_get_Property(INewWDEvents* This,BSTR bstrPropertyName,VARIANT *pvProperty) {
    return This->lpVtbl->get_Property(This,bstrPropertyName,pvProperty);
}
static inline HRESULT INewWDEvents_SetWizardButtons(INewWDEvents* This,VARIANT_BOOL vfEnableBack,VARIANT_BOOL vfEnableNext,VARIANT_BOOL vfLastPage) {
    return This->lpVtbl->SetWizardButtons(This,vfEnableBack,vfEnableNext,vfLastPage);
}
static inline HRESULT INewWDEvents_SetHeaderText(INewWDEvents* This,BSTR bstrHeaderTitle,BSTR bstrHeaderSubtitle) {
    return This->lpVtbl->SetHeaderText(This,bstrHeaderTitle,bstrHeaderSubtitle);
}
/*** INewWDEvents methods ***/
static inline HRESULT INewWDEvents_PassportAuthenticate(INewWDEvents* This,BSTR bstrSignInUrl,VARIANT_BOOL *pvfAuthenitcated) {
    return This->lpVtbl->PassportAuthenticate(This,bstrSignInUrl,pvfAuthenitcated);
}
#endif
#endif

#endif


#endif  /* __INewWDEvents_INTERFACE_DEFINED__ */

#endif /* __Shell32_LIBRARY_DEFINED__ */
/*****************************************************************************
 * IAutoComplete interface
 */
#ifndef __IAutoComplete_INTERFACE_DEFINED__
#define __IAutoComplete_INTERFACE_DEFINED__

typedef IAutoComplete *LPAUTOCOMPLETE;
DEFINE_GUID(IID_IAutoComplete, 0x00bb2762, 0x6a77, 0x11d0, 0xa5,0x35, 0x00,0xc0,0x4f,0xd7,0xd0,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00bb2762-6a77-11d0-a535-00c04fd7d062")
IAutoComplete : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Init(
        HWND hwndEdit,
        IUnknown *punkACL,
        LPCWSTR pwszRegKeyPath,
        LPCWSTR pwszQuickComplete) = 0;

    virtual HRESULT STDMETHODCALLTYPE Enable(
        WINBOOL fEnable) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAutoComplete, 0x00bb2762, 0x6a77, 0x11d0, 0xa5,0x35, 0x00,0xc0,0x4f,0xd7,0xd0,0x62)
#endif
#else
typedef struct IAutoCompleteVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAutoComplete methods ***/
    HRESULT (STDMETHODCALLTYPE *Init)(
        IAutoComplete *This,
        HWND hwndEdit,
        IUnknown *punkACL,
        LPCWSTR pwszRegKeyPath,
        LPCWSTR pwszQuickComplete);

    HRESULT (STDMETHODCALLTYPE *Enable)(
        IAutoComplete *This,
        WINBOOL fEnable);

    END_INTERFACE
} IAutoCompleteVtbl;

interface IAutoComplete {
    CONST_VTBL IAutoCompleteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAutoComplete_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAutoComplete_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAutoComplete_Release(This) (This)->lpVtbl->Release(This)
/*** IAutoComplete methods ***/
#define IAutoComplete_Init(This,hwndEdit,punkACL,pwszRegKeyPath,pwszQuickComplete) (This)->lpVtbl->Init(This,hwndEdit,punkACL,pwszRegKeyPath,pwszQuickComplete)
#define IAutoComplete_Enable(This,fEnable) (This)->lpVtbl->Enable(This,fEnable)
#else
/*** IUnknown methods ***/
static inline HRESULT IAutoComplete_QueryInterface(IAutoComplete* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAutoComplete_AddRef(IAutoComplete* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAutoComplete_Release(IAutoComplete* This) {
    return This->lpVtbl->Release(This);
}
/*** IAutoComplete methods ***/
static inline HRESULT IAutoComplete_Init(IAutoComplete* This,HWND hwndEdit,IUnknown *punkACL,LPCWSTR pwszRegKeyPath,LPCWSTR pwszQuickComplete) {
    return This->lpVtbl->Init(This,hwndEdit,punkACL,pwszRegKeyPath,pwszQuickComplete);
}
static inline HRESULT IAutoComplete_Enable(IAutoComplete* This,WINBOOL fEnable) {
    return This->lpVtbl->Enable(This,fEnable);
}
#endif
#endif

#endif


#endif  /* __IAutoComplete_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAutoComplete2 interface
 */
#ifndef __IAutoComplete2_INTERFACE_DEFINED__
#define __IAutoComplete2_INTERFACE_DEFINED__

typedef IAutoComplete2 *LPAUTOCOMPLETE2;
typedef enum _tagAUTOCOMPLETEOPTIONS {
    ACO_NONE = 0x0,
    ACO_AUTOSUGGEST = 0x1,
    ACO_AUTOAPPEND = 0x2,
    ACO_SEARCH = 0x4,
    ACO_FILTERPREFIXES = 0x8,
    ACO_USETAB = 0x10,
    ACO_UPDOWNKEYDROPSLIST = 0x20,
    ACO_RTLREADING = 0x40,
    ACO_WORD_FILTER = 0x80,
    ACO_NOPREFIXFILTERING = 0x100
} AUTOCOMPLETEOPTIONS;
DEFINE_GUID(IID_IAutoComplete2, 0xeac04bc0, 0x3791, 0x11d2, 0xbb,0x95, 0x00,0x60,0x97,0x7b,0x46,0x4c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("eac04bc0-3791-11d2-bb95-0060977b464c")
IAutoComplete2 : public IAutoComplete
{
    virtual HRESULT STDMETHODCALLTYPE SetOptions(
        DWORD dwFlag) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOptions(
        DWORD *pdwFlag) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAutoComplete2, 0xeac04bc0, 0x3791, 0x11d2, 0xbb,0x95, 0x00,0x60,0x97,0x7b,0x46,0x4c)
#endif
#else
typedef struct IAutoComplete2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAutoComplete methods ***/
    HRESULT (STDMETHODCALLTYPE *Init)(
        IAutoComplete2 *This,
        HWND hwndEdit,
        IUnknown *punkACL,
        LPCWSTR pwszRegKeyPath,
        LPCWSTR pwszQuickComplete);

    HRESULT (STDMETHODCALLTYPE *Enable)(
        IAutoComplete2 *This,
        WINBOOL fEnable);

    /*** IAutoComplete2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetOptions)(
        IAutoComplete2 *This,
        DWORD dwFlag);

    HRESULT (STDMETHODCALLTYPE *GetOptions)(
        IAutoComplete2 *This,
        DWORD *pdwFlag);

    END_INTERFACE
} IAutoComplete2Vtbl;

interface IAutoComplete2 {
    CONST_VTBL IAutoComplete2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAutoComplete2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAutoComplete2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAutoComplete2_Release(This) (This)->lpVtbl->Release(This)
/*** IAutoComplete methods ***/
#define IAutoComplete2_Init(This,hwndEdit,punkACL,pwszRegKeyPath,pwszQuickComplete) (This)->lpVtbl->Init(This,hwndEdit,punkACL,pwszRegKeyPath,pwszQuickComplete)
#define IAutoComplete2_Enable(This,fEnable) (This)->lpVtbl->Enable(This,fEnable)
/*** IAutoComplete2 methods ***/
#define IAutoComplete2_SetOptions(This,dwFlag) (This)->lpVtbl->SetOptions(This,dwFlag)
#define IAutoComplete2_GetOptions(This,pdwFlag) (This)->lpVtbl->GetOptions(This,pdwFlag)
#else
/*** IUnknown methods ***/
static inline HRESULT IAutoComplete2_QueryInterface(IAutoComplete2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAutoComplete2_AddRef(IAutoComplete2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAutoComplete2_Release(IAutoComplete2* This) {
    return This->lpVtbl->Release(This);
}
/*** IAutoComplete methods ***/
static inline HRESULT IAutoComplete2_Init(IAutoComplete2* This,HWND hwndEdit,IUnknown *punkACL,LPCWSTR pwszRegKeyPath,LPCWSTR pwszQuickComplete) {
    return This->lpVtbl->Init(This,hwndEdit,punkACL,pwszRegKeyPath,pwszQuickComplete);
}
static inline HRESULT IAutoComplete2_Enable(IAutoComplete2* This,WINBOOL fEnable) {
    return This->lpVtbl->Enable(This,fEnable);
}
/*** IAutoComplete2 methods ***/
static inline HRESULT IAutoComplete2_SetOptions(IAutoComplete2* This,DWORD dwFlag) {
    return This->lpVtbl->SetOptions(This,dwFlag);
}
static inline HRESULT IAutoComplete2_GetOptions(IAutoComplete2* This,DWORD *pdwFlag) {
    return This->lpVtbl->GetOptions(This,pdwFlag);
}
#endif
#endif

#endif


#endif  /* __IAutoComplete2_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IEnumACString interface
 */
#ifndef __IEnumACString_INTERFACE_DEFINED__
#define __IEnumACString_INTERFACE_DEFINED__

typedef IEnumACString *PENUMACSTRING;
typedef IEnumACString *LPENUMACSTRING;
typedef enum _tagACENUMOPTION {
    ACEO_NONE = 0x0,
    ACEO_MOSTRECENTFIRST = 0x1,
    ACEO_FIRSTUNUSED = 0x10000
} ACENUMOPTION;
DEFINE_GUID(IID_IEnumACString, 0x8e74c210, 0xcf9d, 0x4eaf, 0xa4,0x03, 0x73,0x56,0x42,0x8f,0x0a,0x5a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8e74c210-cf9d-4eaf-a403-7356428f0a5a")
IEnumACString : public IEnumString
{
    virtual HRESULT STDMETHODCALLTYPE NextItem(
        LPWSTR pszUrl,
        ULONG cchMax,
        ULONG *pulSortIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEnumOptions(
        DWORD dwOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnumOptions(
        DWORD *pdwOptions) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumACString, 0x8e74c210, 0xcf9d, 0x4eaf, 0xa4,0x03, 0x73,0x56,0x42,0x8f,0x0a,0x5a)
#endif
#else
typedef struct IEnumACStringVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumString methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumACString *This,
        ULONG celt,
        LPOLESTR *rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumACString *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumACString *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumACString *This,
        IEnumString **ppenum);

    /*** IEnumACString methods ***/
    HRESULT (STDMETHODCALLTYPE *NextItem)(
        IEnumACString *This,
        LPWSTR pszUrl,
        ULONG cchMax,
        ULONG *pulSortIndex);

    HRESULT (STDMETHODCALLTYPE *SetEnumOptions)(
        IEnumACString *This,
        DWORD dwOptions);

    HRESULT (STDMETHODCALLTYPE *GetEnumOptions)(
        IEnumACString *This,
        DWORD *pdwOptions);

    END_INTERFACE
} IEnumACStringVtbl;

interface IEnumACString {
    CONST_VTBL IEnumACStringVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumACString_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumACString_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumACString_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumString methods ***/
#define IEnumACString_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IEnumACString_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumACString_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumACString_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
/*** IEnumACString methods ***/
#define IEnumACString_NextItem(This,pszUrl,cchMax,pulSortIndex) (This)->lpVtbl->NextItem(This,pszUrl,cchMax,pulSortIndex)
#define IEnumACString_SetEnumOptions(This,dwOptions) (This)->lpVtbl->SetEnumOptions(This,dwOptions)
#define IEnumACString_GetEnumOptions(This,pdwOptions) (This)->lpVtbl->GetEnumOptions(This,pdwOptions)
#else
/*** IUnknown methods ***/
static inline HRESULT IEnumACString_QueryInterface(IEnumACString* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IEnumACString_AddRef(IEnumACString* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IEnumACString_Release(IEnumACString* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumString methods ***/
static inline HRESULT IEnumACString_Next(IEnumACString* This,ULONG celt,LPOLESTR *rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static inline HRESULT IEnumACString_Skip(IEnumACString* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static inline HRESULT IEnumACString_Reset(IEnumACString* This) {
    return This->lpVtbl->Reset(This);
}
static inline HRESULT IEnumACString_Clone(IEnumACString* This,IEnumString **ppenum) {
    return This->lpVtbl->Clone(This,ppenum);
}
/*** IEnumACString methods ***/
static inline HRESULT IEnumACString_NextItem(IEnumACString* This,LPWSTR pszUrl,ULONG cchMax,ULONG *pulSortIndex) {
    return This->lpVtbl->NextItem(This,pszUrl,cchMax,pulSortIndex);
}
static inline HRESULT IEnumACString_SetEnumOptions(IEnumACString* This,DWORD dwOptions) {
    return This->lpVtbl->SetEnumOptions(This,dwOptions);
}
static inline HRESULT IEnumACString_GetEnumOptions(IEnumACString* This,DWORD *pdwOptions) {
    return This->lpVtbl->GetEnumOptions(This,pdwOptions);
}
#endif
#endif

#endif


#endif  /* __IEnumACString_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDataObjectAsyncCapability interface
 */
#ifndef __IDataObjectAsyncCapability_INTERFACE_DEFINED__
#define __IDataObjectAsyncCapability_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDataObjectAsyncCapability, 0x3d8b0590, 0xf691, 0x11d2, 0x8e,0xa9, 0x00,0x60,0x97,0xdf,0x5b,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3d8b0590-f691-11d2-8ea9-006097df5bd4")
IDataObjectAsyncCapability : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetAsyncMode(
        WINBOOL fDoOpAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAsyncMode(
        WINBOOL *pfIsOpAsync) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartOperation(
        IBindCtx *pbcReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE InOperation(
        WINBOOL *pfInAsyncOp) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndOperation(
        HRESULT hResult,
        IBindCtx *pbcReserved,
        DWORD dwEffects) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDataObjectAsyncCapability, 0x3d8b0590, 0xf691, 0x11d2, 0x8e,0xa9, 0x00,0x60,0x97,0xdf,0x5b,0xd4)
#endif
#else
typedef struct IDataObjectAsyncCapabilityVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDataObjectAsyncCapability methods ***/
    HRESULT (STDMETHODCALLTYPE *SetAsyncMode)(
        IDataObjectAsyncCapability *This,
        WINBOOL fDoOpAsync);

    HRESULT (STDMETHODCALLTYPE *GetAsyncMode)(
        IDataObjectAsyncCapability *This,
        WINBOOL *pfIsOpAsync);

    HRESULT (STDMETHODCALLTYPE *StartOperation)(
        IDataObjectAsyncCapability *This,
        IBindCtx *pbcReserved);

    HRESULT (STDMETHODCALLTYPE *InOperation)(
        IDataObjectAsyncCapability *This,
        WINBOOL *pfInAsyncOp);

    HRESULT (STDMETHODCALLTYPE *EndOperation)(
        IDataObjectAsyncCapability *This,
        HRESULT hResult,
        IBindCtx *pbcReserved,
        DWORD dwEffects);

    END_INTERFACE
} IDataObjectAsyncCapabilityVtbl;

interface IDataObjectAsyncCapability {
    CONST_VTBL IDataObjectAsyncCapabilityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDataObjectAsyncCapability_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDataObjectAsyncCapability_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDataObjectAsyncCapability_Release(This) (This)->lpVtbl->Release(This)
/*** IDataObjectAsyncCapability methods ***/
#define IDataObjectAsyncCapability_SetAsyncMode(This,fDoOpAsync) (This)->lpVtbl->SetAsyncMode(This,fDoOpAsync)
#define IDataObjectAsyncCapability_GetAsyncMode(This,pfIsOpAsync) (This)->lpVtbl->GetAsyncMode(This,pfIsOpAsync)
#define IDataObjectAsyncCapability_StartOperation(This,pbcReserved) (This)->lpVtbl->StartOperation(This,pbcReserved)
#define IDataObjectAsyncCapability_InOperation(This,pfInAsyncOp) (This)->lpVtbl->InOperation(This,pfInAsyncOp)
#define IDataObjectAsyncCapability_EndOperation(This,hResult,pbcReserved,dwEffects) (This)->lpVtbl->EndOperation(This,hResult,pbcReserved,dwEffects)
#else
/*** IUnknown methods ***/
static inline HRESULT IDataObjectAsyncCapability_QueryInterface(IDataObjectAsyncCapability* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDataObjectAsyncCapability_AddRef(IDataObjectAsyncCapability* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDataObjectAsyncCapability_Release(IDataObjectAsyncCapability* This) {
    return This->lpVtbl->Release(This);
}
/*** IDataObjectAsyncCapability methods ***/
static inline HRESULT IDataObjectAsyncCapability_SetAsyncMode(IDataObjectAsyncCapability* This,WINBOOL fDoOpAsync) {
    return This->lpVtbl->SetAsyncMode(This,fDoOpAsync);
}
static inline HRESULT IDataObjectAsyncCapability_GetAsyncMode(IDataObjectAsyncCapability* This,WINBOOL *pfIsOpAsync) {
    return This->lpVtbl->GetAsyncMode(This,pfIsOpAsync);
}
static inline HRESULT IDataObjectAsyncCapability_StartOperation(IDataObjectAsyncCapability* This,IBindCtx *pbcReserved) {
    return This->lpVtbl->StartOperation(This,pbcReserved);
}
static inline HRESULT IDataObjectAsyncCapability_InOperation(IDataObjectAsyncCapability* This,WINBOOL *pfInAsyncOp) {
    return This->lpVtbl->InOperation(This,pfInAsyncOp);
}
static inline HRESULT IDataObjectAsyncCapability_EndOperation(IDataObjectAsyncCapability* This,HRESULT hResult,IBindCtx *pbcReserved,DWORD dwEffects) {
    return This->lpVtbl->EndOperation(This,hResult,pbcReserved,dwEffects);
}
#endif
#endif

#endif


#endif  /* __IDataObjectAsyncCapability_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 /* __shldisp_h__ */
