/*** Autogenerated by WIDL 8.9 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__

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

/* Forward declarations */

#ifndef __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 __WIDL_INLINE HRESULT IFolderViewOC_QueryInterface(IFolderViewOC* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFolderViewOC_AddRef(IFolderViewOC* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFolderViewOC_Release(IFolderViewOC* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFolderViewOC_GetTypeInfoCount(IFolderViewOC* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFolderViewOC_GetTypeInfo(IFolderViewOC* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT DShellFolderViewEvents_QueryInterface(DShellFolderViewEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DShellFolderViewEvents_AddRef(DShellFolderViewEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DShellFolderViewEvents_Release(DShellFolderViewEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DShellFolderViewEvents_GetTypeInfoCount(DShellFolderViewEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DShellFolderViewEvents_GetTypeInfo(DShellFolderViewEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT DFConstraint_QueryInterface(DFConstraint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DFConstraint_AddRef(DFConstraint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DFConstraint_Release(DFConstraint* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DFConstraint_GetTypeInfoCount(DFConstraint* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DFConstraint_GetTypeInfo(DFConstraint* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT DFConstraint_get_Name(DFConstraint* This,BSTR *pbs) {
    return This->lpVtbl->get_Name(This,pbs);
}
static __WIDL_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 __WIDL_INLINE HRESULT Folder_QueryInterface(Folder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG Folder_AddRef(Folder* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG Folder_Release(Folder* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT Folder_GetTypeInfoCount(Folder* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT Folder_GetTypeInfo(Folder* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT Folder_get_Title(Folder* This,BSTR *pbs) {
    return This->lpVtbl->get_Title(This,pbs);
}
static __WIDL_INLINE HRESULT Folder_get_Application(Folder* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT Folder_get_Parent(Folder* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT Folder_get_ParentFolder(Folder* This,Folder **ppsf) {
    return This->lpVtbl->get_ParentFolder(This,ppsf);
}
static __WIDL_INLINE HRESULT Folder_Items(Folder* This,FolderItems **ppid) {
    return This->lpVtbl->Items(This,ppid);
}
static __WIDL_INLINE HRESULT Folder_ParseName(Folder* This,BSTR bName,FolderItem **ppid) {
    return This->lpVtbl->ParseName(This,bName,ppid);
}
static __WIDL_INLINE HRESULT Folder_NewFolder(Folder* This,BSTR bName,VARIANT vOptions) {
    return This->lpVtbl->NewFolder(This,bName,vOptions);
}
static __WIDL_INLINE HRESULT Folder_MoveHere(Folder* This,VARIANT vItem,VARIANT vOptions) {
    return This->lpVtbl->MoveHere(This,vItem,vOptions);
}
static __WIDL_INLINE HRESULT Folder_CopyHere(Folder* This,VARIANT vItem,VARIANT vOptions) {
    return This->lpVtbl->CopyHere(This,vItem,vOptions);
}
static __WIDL_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 __WIDL_INLINE HRESULT Folder2_QueryInterface(Folder2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG Folder2_AddRef(Folder2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG Folder2_Release(Folder2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT Folder2_GetTypeInfoCount(Folder2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT Folder2_GetTypeInfo(Folder2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT Folder2_get_Title(Folder2* This,BSTR *pbs) {
    return This->lpVtbl->get_Title(This,pbs);
}
static __WIDL_INLINE HRESULT Folder2_get_Application(Folder2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT Folder2_get_Parent(Folder2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT Folder2_get_ParentFolder(Folder2* This,Folder **ppsf) {
    return This->lpVtbl->get_ParentFolder(This,ppsf);
}
static __WIDL_INLINE HRESULT Folder2_Items(Folder2* This,FolderItems **ppid) {
    return This->lpVtbl->Items(This,ppid);
}
static __WIDL_INLINE HRESULT Folder2_ParseName(Folder2* This,BSTR bName,FolderItem **ppid) {
    return This->lpVtbl->ParseName(This,bName,ppid);
}
static __WIDL_INLINE HRESULT Folder2_NewFolder(Folder2* This,BSTR bName,VARIANT vOptions) {
    return This->lpVtbl->NewFolder(This,bName,vOptions);
}
static __WIDL_INLINE HRESULT Folder2_MoveHere(Folder2* This,VARIANT vItem,VARIANT vOptions) {
    return This->lpVtbl->MoveHere(This,vItem,vOptions);
}
static __WIDL_INLINE HRESULT Folder2_CopyHere(Folder2* This,VARIANT vItem,VARIANT vOptions) {
    return This->lpVtbl->CopyHere(This,vItem,vOptions);
}
static __WIDL_INLINE HRESULT Folder2_GetDetailsOf(Folder2* This,VARIANT vItem,int iColumn,BSTR *pbs) {
    return This->lpVtbl->GetDetailsOf(This,vItem,iColumn,pbs);
}
/*** Folder2 methods ***/
static __WIDL_INLINE HRESULT Folder2_get_Self(Folder2* This,FolderItem **ppfi) {
    return This->lpVtbl->get_Self(This,ppfi);
}
static __WIDL_INLINE HRESULT Folder2_get_OfflineStatus(Folder2* This,LONG *pul) {
    return This->lpVtbl->get_OfflineStatus(This,pul);
}
static __WIDL_INLINE HRESULT Folder2_Synchronize(Folder2* This) {
    return This->lpVtbl->Synchronize(This);
}
static __WIDL_INLINE HRESULT Folder2_get_HaveToShowWebViewBarricade(Folder2* This,VARIANT_BOOL *pbHaveToShowWebViewBarricade) {
    return This->lpVtbl->get_HaveToShowWebViewBarricade(This,pbHaveToShowWebViewBarricade);
}
static __WIDL_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 __WIDL_INLINE HRESULT Folder3_QueryInterface(Folder3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG Folder3_AddRef(Folder3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG Folder3_Release(Folder3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT Folder3_GetTypeInfoCount(Folder3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT Folder3_GetTypeInfo(Folder3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT Folder3_get_Title(Folder3* This,BSTR *pbs) {
    return This->lpVtbl->get_Title(This,pbs);
}
static __WIDL_INLINE HRESULT Folder3_get_Application(Folder3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT Folder3_get_Parent(Folder3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT Folder3_get_ParentFolder(Folder3* This,Folder **ppsf) {
    return This->lpVtbl->get_ParentFolder(This,ppsf);
}
static __WIDL_INLINE HRESULT Folder3_Items(Folder3* This,FolderItems **ppid) {
    return This->lpVtbl->Items(This,ppid);
}
static __WIDL_INLINE HRESULT Folder3_ParseName(Folder3* This,BSTR bName,FolderItem **ppid) {
    return This->lpVtbl->ParseName(This,bName,ppid);
}
static __WIDL_INLINE HRESULT Folder3_NewFolder(Folder3* This,BSTR bName,VARIANT vOptions) {
    return This->lpVtbl->NewFolder(This,bName,vOptions);
}
static __WIDL_INLINE HRESULT Folder3_MoveHere(Folder3* This,VARIANT vItem,VARIANT vOptions) {
    return This->lpVtbl->MoveHere(This,vItem,vOptions);
}
static __WIDL_INLINE HRESULT Folder3_CopyHere(Folder3* This,VARIANT vItem,VARIANT vOptions) {
    return This->lpVtbl->CopyHere(This,vItem,vOptions);
}
static __WIDL_INLINE HRESULT Folder3_GetDetailsOf(Folder3* This,VARIANT vItem,int iColumn,BSTR *pbs) {
    return This->lpVtbl->GetDetailsOf(This,vItem,iColumn,pbs);
}
/*** Folder2 methods ***/
static __WIDL_INLINE HRESULT Folder3_get_Self(Folder3* This,FolderItem **ppfi) {
    return This->lpVtbl->get_Self(This,ppfi);
}
static __WIDL_INLINE HRESULT Folder3_get_OfflineStatus(Folder3* This,LONG *pul) {
    return This->lpVtbl->get_OfflineStatus(This,pul);
}
static __WIDL_INLINE HRESULT Folder3_Synchronize(Folder3* This) {
    return This->lpVtbl->Synchronize(This);
}
static __WIDL_INLINE HRESULT Folder3_get_HaveToShowWebViewBarricade(Folder3* This,VARIANT_BOOL *pbHaveToShowWebViewBarricade) {
    return This->lpVtbl->get_HaveToShowWebViewBarricade(This,pbHaveToShowWebViewBarricade);
}
static __WIDL_INLINE HRESULT Folder3_DismissedWebViewBarricade(Folder3* This) {
    return This->lpVtbl->DismissedWebViewBarricade(This);
}
/*** Folder3 methods ***/
static __WIDL_INLINE HRESULT Folder3_get_ShowWebViewBarricade(Folder3* This,VARIANT_BOOL *pbShowWebViewBarricade) {
    return This->lpVtbl->get_ShowWebViewBarricade(This,pbShowWebViewBarricade);
}
static __WIDL_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 __WIDL_INLINE HRESULT FolderItem_QueryInterface(FolderItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG FolderItem_AddRef(FolderItem* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG FolderItem_Release(FolderItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT FolderItem_GetTypeInfoCount(FolderItem* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT FolderItem_GetTypeInfo(FolderItem* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT FolderItem_get_Application(FolderItem* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItem_get_Parent(FolderItem* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItem_get_Name(FolderItem* This,BSTR *pbs) {
    return This->lpVtbl->get_Name(This,pbs);
}
static __WIDL_INLINE HRESULT FolderItem_put_Name(FolderItem* This,BSTR bs) {
    return This->lpVtbl->put_Name(This,bs);
}
static __WIDL_INLINE HRESULT FolderItem_get_Path(FolderItem* This,BSTR *pbs) {
    return This->lpVtbl->get_Path(This,pbs);
}
static __WIDL_INLINE HRESULT FolderItem_get_GetLink(FolderItem* This,IDispatch **ppid) {
    return This->lpVtbl->get_GetLink(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItem_get_GetFolder(FolderItem* This,IDispatch **ppid) {
    return This->lpVtbl->get_GetFolder(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItem_get_IsLink(FolderItem* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsLink(This,pb);
}
static __WIDL_INLINE HRESULT FolderItem_get_IsFolder(FolderItem* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsFolder(This,pb);
}
static __WIDL_INLINE HRESULT FolderItem_get_IsFileSystem(FolderItem* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsFileSystem(This,pb);
}
static __WIDL_INLINE HRESULT FolderItem_get_IsBrowsable(FolderItem* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsBrowsable(This,pb);
}
static __WIDL_INLINE HRESULT FolderItem_get_ModifyDate(FolderItem* This,DATE *pdt) {
    return This->lpVtbl->get_ModifyDate(This,pdt);
}
static __WIDL_INLINE HRESULT FolderItem_put_ModifyDate(FolderItem* This,DATE dt) {
    return This->lpVtbl->put_ModifyDate(This,dt);
}
static __WIDL_INLINE HRESULT FolderItem_get_Size(FolderItem* This,LONG *pul) {
    return This->lpVtbl->get_Size(This,pul);
}
static __WIDL_INLINE HRESULT FolderItem_get_Type(FolderItem* This,BSTR *pbs) {
    return This->lpVtbl->get_Type(This,pbs);
}
static __WIDL_INLINE HRESULT FolderItem_Verbs(FolderItem* This,FolderItemVerbs **ppfic) {
    return This->lpVtbl->Verbs(This,ppfic);
}
static __WIDL_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 __WIDL_INLINE HRESULT FolderItem2_QueryInterface(FolderItem2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG FolderItem2_AddRef(FolderItem2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG FolderItem2_Release(FolderItem2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT FolderItem2_GetTypeInfoCount(FolderItem2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT FolderItem2_GetTypeInfo(FolderItem2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT FolderItem2_get_Application(FolderItem2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItem2_get_Parent(FolderItem2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItem2_get_Name(FolderItem2* This,BSTR *pbs) {
    return This->lpVtbl->get_Name(This,pbs);
}
static __WIDL_INLINE HRESULT FolderItem2_put_Name(FolderItem2* This,BSTR bs) {
    return This->lpVtbl->put_Name(This,bs);
}
static __WIDL_INLINE HRESULT FolderItem2_get_Path(FolderItem2* This,BSTR *pbs) {
    return This->lpVtbl->get_Path(This,pbs);
}
static __WIDL_INLINE HRESULT FolderItem2_get_GetLink(FolderItem2* This,IDispatch **ppid) {
    return This->lpVtbl->get_GetLink(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItem2_get_GetFolder(FolderItem2* This,IDispatch **ppid) {
    return This->lpVtbl->get_GetFolder(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItem2_get_IsLink(FolderItem2* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsLink(This,pb);
}
static __WIDL_INLINE HRESULT FolderItem2_get_IsFolder(FolderItem2* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsFolder(This,pb);
}
static __WIDL_INLINE HRESULT FolderItem2_get_IsFileSystem(FolderItem2* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsFileSystem(This,pb);
}
static __WIDL_INLINE HRESULT FolderItem2_get_IsBrowsable(FolderItem2* This,VARIANT_BOOL *pb) {
    return This->lpVtbl->get_IsBrowsable(This,pb);
}
static __WIDL_INLINE HRESULT FolderItem2_get_ModifyDate(FolderItem2* This,DATE *pdt) {
    return This->lpVtbl->get_ModifyDate(This,pdt);
}
static __WIDL_INLINE HRESULT FolderItem2_put_ModifyDate(FolderItem2* This,DATE dt) {
    return This->lpVtbl->put_ModifyDate(This,dt);
}
static __WIDL_INLINE HRESULT FolderItem2_get_Size(FolderItem2* This,LONG *pul) {
    return This->lpVtbl->get_Size(This,pul);
}
static __WIDL_INLINE HRESULT FolderItem2_get_Type(FolderItem2* This,BSTR *pbs) {
    return This->lpVtbl->get_Type(This,pbs);
}
static __WIDL_INLINE HRESULT FolderItem2_Verbs(FolderItem2* This,FolderItemVerbs **ppfic) {
    return This->lpVtbl->Verbs(This,ppfic);
}
static __WIDL_INLINE HRESULT FolderItem2_InvokeVerb(FolderItem2* This,VARIANT vVerb) {
    return This->lpVtbl->InvokeVerb(This,vVerb);
}
/*** FolderItem2 methods ***/
static __WIDL_INLINE HRESULT FolderItem2_InvokeVerbEx(FolderItem2* This,VARIANT vVerb,VARIANT vArgs) {
    return This->lpVtbl->InvokeVerbEx(This,vVerb,vArgs);
}
static __WIDL_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 __WIDL_INLINE HRESULT FolderItems_QueryInterface(FolderItems* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG FolderItems_AddRef(FolderItems* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG FolderItems_Release(FolderItems* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT FolderItems_GetTypeInfoCount(FolderItems* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT FolderItems_GetTypeInfo(FolderItems* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT FolderItems_get_Count(FolderItems* This,LONG *plCount) {
    return This->lpVtbl->get_Count(This,plCount);
}
static __WIDL_INLINE HRESULT FolderItems_get_Application(FolderItems* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItems_get_Parent(FolderItems* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItems_Item(FolderItems* This,VARIANT index,FolderItem **ppid) {
    return This->lpVtbl->Item(This,index,ppid);
}
static __WIDL_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 __WIDL_INLINE HRESULT FolderItems2_QueryInterface(FolderItems2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG FolderItems2_AddRef(FolderItems2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG FolderItems2_Release(FolderItems2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT FolderItems2_GetTypeInfoCount(FolderItems2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT FolderItems2_GetTypeInfo(FolderItems2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT FolderItems2_get_Count(FolderItems2* This,LONG *plCount) {
    return This->lpVtbl->get_Count(This,plCount);
}
static __WIDL_INLINE HRESULT FolderItems2_get_Application(FolderItems2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItems2_get_Parent(FolderItems2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItems2_Item(FolderItems2* This,VARIANT index,FolderItem **ppid) {
    return This->lpVtbl->Item(This,index,ppid);
}
static __WIDL_INLINE HRESULT FolderItems2__NewEnum(FolderItems2* This,IUnknown **ppunk) {
    return This->lpVtbl->_NewEnum(This,ppunk);
}
/*** FolderItems2 methods ***/
static __WIDL_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 __WIDL_INLINE HRESULT FolderItems3_QueryInterface(FolderItems3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG FolderItems3_AddRef(FolderItems3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG FolderItems3_Release(FolderItems3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT FolderItems3_GetTypeInfoCount(FolderItems3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT FolderItems3_GetTypeInfo(FolderItems3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT FolderItems3_get_Count(FolderItems3* This,LONG *plCount) {
    return This->lpVtbl->get_Count(This,plCount);
}
static __WIDL_INLINE HRESULT FolderItems3_get_Application(FolderItems3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItems3_get_Parent(FolderItems3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItems3_Item(FolderItems3* This,VARIANT index,FolderItem **ppid) {
    return This->lpVtbl->Item(This,index,ppid);
}
static __WIDL_INLINE HRESULT FolderItems3__NewEnum(FolderItems3* This,IUnknown **ppunk) {
    return This->lpVtbl->_NewEnum(This,ppunk);
}
/*** FolderItems2 methods ***/
static __WIDL_INLINE HRESULT FolderItems3_InvokeVerbEx(FolderItems3* This,VARIANT vVerb,VARIANT vArgs) {
    return This->lpVtbl->InvokeVerbEx(This,vVerb,vArgs);
}
/*** FolderItems3 methods ***/
static __WIDL_INLINE HRESULT FolderItems3_Filter(FolderItems3* This,LONG grfFlags,BSTR bstrFileSpec) {
    return This->lpVtbl->Filter(This,grfFlags,bstrFileSpec);
}
static __WIDL_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 __WIDL_INLINE HRESULT FolderItemVerb_QueryInterface(FolderItemVerb* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG FolderItemVerb_AddRef(FolderItemVerb* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG FolderItemVerb_Release(FolderItemVerb* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT FolderItemVerb_GetTypeInfoCount(FolderItemVerb* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT FolderItemVerb_GetTypeInfo(FolderItemVerb* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT FolderItemVerb_get_Application(FolderItemVerb* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItemVerb_get_Parent(FolderItemVerb* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItemVerb_get_Name(FolderItemVerb* This,BSTR *pbs) {
    return This->lpVtbl->get_Name(This,pbs);
}
static __WIDL_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 __WIDL_INLINE HRESULT FolderItemVerbs_QueryInterface(FolderItemVerbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG FolderItemVerbs_AddRef(FolderItemVerbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG FolderItemVerbs_Release(FolderItemVerbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT FolderItemVerbs_GetTypeInfoCount(FolderItemVerbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT FolderItemVerbs_GetTypeInfo(FolderItemVerbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT FolderItemVerbs_get_Count(FolderItemVerbs* This,LONG *plCount) {
    return This->lpVtbl->get_Count(This,plCount);
}
static __WIDL_INLINE HRESULT FolderItemVerbs_get_Application(FolderItemVerbs* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItemVerbs_get_Parent(FolderItemVerbs* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT FolderItemVerbs_Item(FolderItemVerbs* This,VARIANT index,FolderItemVerb **ppid) {
    return This->lpVtbl->Item(This,index,ppid);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellLinkDual_QueryInterface(IShellLinkDual* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IShellLinkDual_AddRef(IShellLinkDual* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IShellLinkDual_Release(IShellLinkDual* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IShellLinkDual_GetTypeInfoCount(IShellLinkDual* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IShellLinkDual_GetTypeInfo(IShellLinkDual* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IShellLinkDual_get_Path(IShellLinkDual* This,BSTR *pbs) {
    return This->lpVtbl->get_Path(This,pbs);
}
static __WIDL_INLINE HRESULT IShellLinkDual_put_Path(IShellLinkDual* This,BSTR bs) {
    return This->lpVtbl->put_Path(This,bs);
}
static __WIDL_INLINE HRESULT IShellLinkDual_get_Description(IShellLinkDual* This,BSTR *pbs) {
    return This->lpVtbl->get_Description(This,pbs);
}
static __WIDL_INLINE HRESULT IShellLinkDual_put_Description(IShellLinkDual* This,BSTR bs) {
    return This->lpVtbl->put_Description(This,bs);
}
static __WIDL_INLINE HRESULT IShellLinkDual_get_WorkingDirectory(IShellLinkDual* This,BSTR *pbs) {
    return This->lpVtbl->get_WorkingDirectory(This,pbs);
}
static __WIDL_INLINE HRESULT IShellLinkDual_put_WorkingDirectory(IShellLinkDual* This,BSTR bs) {
    return This->lpVtbl->put_WorkingDirectory(This,bs);
}
static __WIDL_INLINE HRESULT IShellLinkDual_get_Arguments(IShellLinkDual* This,BSTR *pbs) {
    return This->lpVtbl->get_Arguments(This,pbs);
}
static __WIDL_INLINE HRESULT IShellLinkDual_put_Arguments(IShellLinkDual* This,BSTR bs) {
    return This->lpVtbl->put_Arguments(This,bs);
}
static __WIDL_INLINE HRESULT IShellLinkDual_get_Hotkey(IShellLinkDual* This,int *piHK) {
    return This->lpVtbl->get_Hotkey(This,piHK);
}
static __WIDL_INLINE HRESULT IShellLinkDual_put_Hotkey(IShellLinkDual* This,int iHK) {
    return This->lpVtbl->put_Hotkey(This,iHK);
}
static __WIDL_INLINE HRESULT IShellLinkDual_get_ShowCommand(IShellLinkDual* This,int *piShowCommand) {
    return This->lpVtbl->get_ShowCommand(This,piShowCommand);
}
static __WIDL_INLINE HRESULT IShellLinkDual_put_ShowCommand(IShellLinkDual* This,int iShowCommand) {
    return This->lpVtbl->put_ShowCommand(This,iShowCommand);
}
static __WIDL_INLINE HRESULT IShellLinkDual_Resolve(IShellLinkDual* This,int fFlags) {
    return This->lpVtbl->Resolve(This,fFlags);
}
static __WIDL_INLINE HRESULT IShellLinkDual_GetIconLocation(IShellLinkDual* This,BSTR *pbs,int *piIcon) {
    return This->lpVtbl->GetIconLocation(This,pbs,piIcon);
}
static __WIDL_INLINE HRESULT IShellLinkDual_SetIconLocation(IShellLinkDual* This,BSTR bs,int iIcon) {
    return This->lpVtbl->SetIconLocation(This,bs,iIcon);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellLinkDual2_QueryInterface(IShellLinkDual2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IShellLinkDual2_AddRef(IShellLinkDual2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IShellLinkDual2_Release(IShellLinkDual2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IShellLinkDual2_GetTypeInfoCount(IShellLinkDual2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_GetTypeInfo(IShellLinkDual2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IShellLinkDual2_get_Path(IShellLinkDual2* This,BSTR *pbs) {
    return This->lpVtbl->get_Path(This,pbs);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_put_Path(IShellLinkDual2* This,BSTR bs) {
    return This->lpVtbl->put_Path(This,bs);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_get_Description(IShellLinkDual2* This,BSTR *pbs) {
    return This->lpVtbl->get_Description(This,pbs);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_put_Description(IShellLinkDual2* This,BSTR bs) {
    return This->lpVtbl->put_Description(This,bs);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_get_WorkingDirectory(IShellLinkDual2* This,BSTR *pbs) {
    return This->lpVtbl->get_WorkingDirectory(This,pbs);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_put_WorkingDirectory(IShellLinkDual2* This,BSTR bs) {
    return This->lpVtbl->put_WorkingDirectory(This,bs);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_get_Arguments(IShellLinkDual2* This,BSTR *pbs) {
    return This->lpVtbl->get_Arguments(This,pbs);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_put_Arguments(IShellLinkDual2* This,BSTR bs) {
    return This->lpVtbl->put_Arguments(This,bs);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_get_Hotkey(IShellLinkDual2* This,int *piHK) {
    return This->lpVtbl->get_Hotkey(This,piHK);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_put_Hotkey(IShellLinkDual2* This,int iHK) {
    return This->lpVtbl->put_Hotkey(This,iHK);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_get_ShowCommand(IShellLinkDual2* This,int *piShowCommand) {
    return This->lpVtbl->get_ShowCommand(This,piShowCommand);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_put_ShowCommand(IShellLinkDual2* This,int iShowCommand) {
    return This->lpVtbl->put_ShowCommand(This,iShowCommand);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_Resolve(IShellLinkDual2* This,int fFlags) {
    return This->lpVtbl->Resolve(This,fFlags);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_GetIconLocation(IShellLinkDual2* This,BSTR *pbs,int *piIcon) {
    return This->lpVtbl->GetIconLocation(This,pbs,piIcon);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_SetIconLocation(IShellLinkDual2* This,BSTR bs,int iIcon) {
    return This->lpVtbl->SetIconLocation(This,bs,iIcon);
}
static __WIDL_INLINE HRESULT IShellLinkDual2_Save(IShellLinkDual2* This,VARIANT vWhere) {
    return This->lpVtbl->Save(This,vWhere);
}
/*** IShellLinkDual2 methods ***/
static __WIDL_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 __WIDL_INLINE HRESULT IShellFolderViewDual_QueryInterface(IShellFolderViewDual* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IShellFolderViewDual_AddRef(IShellFolderViewDual* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IShellFolderViewDual_Release(IShellFolderViewDual* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IShellFolderViewDual_GetTypeInfoCount(IShellFolderViewDual* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual_GetTypeInfo(IShellFolderViewDual* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IShellFolderViewDual_get_Application(IShellFolderViewDual* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual_get_Parent(IShellFolderViewDual* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual_get_Folder(IShellFolderViewDual* This,Folder **ppid) {
    return This->lpVtbl->get_Folder(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual_SelectedItems(IShellFolderViewDual* This,FolderItems **ppid) {
    return This->lpVtbl->SelectedItems(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual_get_FocusedItem(IShellFolderViewDual* This,FolderItem **ppid) {
    return This->lpVtbl->get_FocusedItem(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual_SelectItem(IShellFolderViewDual* This,VARIANT *pvfi,int dwFlags) {
    return This->lpVtbl->SelectItem(This,pvfi,dwFlags);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual_PopupItemMenu(IShellFolderViewDual* This,FolderItem *pfi,VARIANT vx,VARIANT vy,BSTR *pbs) {
    return This->lpVtbl->PopupItemMenu(This,pfi,vx,vy,pbs);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual_get_Script(IShellFolderViewDual* This,IDispatch **ppDisp) {
    return This->lpVtbl->get_Script(This,ppDisp);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellFolderViewDual2_QueryInterface(IShellFolderViewDual2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IShellFolderViewDual2_AddRef(IShellFolderViewDual2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IShellFolderViewDual2_Release(IShellFolderViewDual2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IShellFolderViewDual2_GetTypeInfoCount(IShellFolderViewDual2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual2_GetTypeInfo(IShellFolderViewDual2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IShellFolderViewDual2_get_Application(IShellFolderViewDual2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual2_get_Parent(IShellFolderViewDual2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual2_get_Folder(IShellFolderViewDual2* This,Folder **ppid) {
    return This->lpVtbl->get_Folder(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual2_SelectedItems(IShellFolderViewDual2* This,FolderItems **ppid) {
    return This->lpVtbl->SelectedItems(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual2_get_FocusedItem(IShellFolderViewDual2* This,FolderItem **ppid) {
    return This->lpVtbl->get_FocusedItem(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual2_SelectItem(IShellFolderViewDual2* This,VARIANT *pvfi,int dwFlags) {
    return This->lpVtbl->SelectItem(This,pvfi,dwFlags);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual2_PopupItemMenu(IShellFolderViewDual2* This,FolderItem *pfi,VARIANT vx,VARIANT vy,BSTR *pbs) {
    return This->lpVtbl->PopupItemMenu(This,pfi,vx,vy,pbs);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual2_get_Script(IShellFolderViewDual2* This,IDispatch **ppDisp) {
    return This->lpVtbl->get_Script(This,ppDisp);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual2_get_ViewOptions(IShellFolderViewDual2* This,LONG *plViewOptions) {
    return This->lpVtbl->get_ViewOptions(This,plViewOptions);
}
/*** IShellFolderViewDual2 methods ***/
static __WIDL_INLINE HRESULT IShellFolderViewDual2_get_CurrentViewMode(IShellFolderViewDual2* This,UINT *pViewMode) {
    return This->lpVtbl->get_CurrentViewMode(This,pViewMode);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual2_put_CurrentViewMode(IShellFolderViewDual2* This,UINT ViewMode) {
    return This->lpVtbl->put_CurrentViewMode(This,ViewMode);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellFolderViewDual3_QueryInterface(IShellFolderViewDual3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IShellFolderViewDual3_AddRef(IShellFolderViewDual3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IShellFolderViewDual3_Release(IShellFolderViewDual3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IShellFolderViewDual3_GetTypeInfoCount(IShellFolderViewDual3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_GetTypeInfo(IShellFolderViewDual3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IShellFolderViewDual3_get_Application(IShellFolderViewDual3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_get_Parent(IShellFolderViewDual3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_get_Folder(IShellFolderViewDual3* This,Folder **ppid) {
    return This->lpVtbl->get_Folder(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_SelectedItems(IShellFolderViewDual3* This,FolderItems **ppid) {
    return This->lpVtbl->SelectedItems(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_get_FocusedItem(IShellFolderViewDual3* This,FolderItem **ppid) {
    return This->lpVtbl->get_FocusedItem(This,ppid);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_SelectItem(IShellFolderViewDual3* This,VARIANT *pvfi,int dwFlags) {
    return This->lpVtbl->SelectItem(This,pvfi,dwFlags);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_PopupItemMenu(IShellFolderViewDual3* This,FolderItem *pfi,VARIANT vx,VARIANT vy,BSTR *pbs) {
    return This->lpVtbl->PopupItemMenu(This,pfi,vx,vy,pbs);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_get_Script(IShellFolderViewDual3* This,IDispatch **ppDisp) {
    return This->lpVtbl->get_Script(This,ppDisp);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_get_ViewOptions(IShellFolderViewDual3* This,LONG *plViewOptions) {
    return This->lpVtbl->get_ViewOptions(This,plViewOptions);
}
/*** IShellFolderViewDual2 methods ***/
static __WIDL_INLINE HRESULT IShellFolderViewDual3_get_CurrentViewMode(IShellFolderViewDual3* This,UINT *pViewMode) {
    return This->lpVtbl->get_CurrentViewMode(This,pViewMode);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_put_CurrentViewMode(IShellFolderViewDual3* This,UINT ViewMode) {
    return This->lpVtbl->put_CurrentViewMode(This,ViewMode);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_SelectItemRelative(IShellFolderViewDual3* This,int iRelative) {
    return This->lpVtbl->SelectItemRelative(This,iRelative);
}
/*** IShellFolderViewDual3 methods ***/
static __WIDL_INLINE HRESULT IShellFolderViewDual3_get_GroupBy(IShellFolderViewDual3* This,BSTR *pbstrGroupBy) {
    return This->lpVtbl->get_GroupBy(This,pbstrGroupBy);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_put_GroupBy(IShellFolderViewDual3* This,BSTR bstrGroupBy) {
    return This->lpVtbl->put_GroupBy(This,bstrGroupBy);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_get_FolderFlags(IShellFolderViewDual3* This,DWORD *pdwFlags) {
    return This->lpVtbl->get_FolderFlags(This,pdwFlags);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_put_FolderFlags(IShellFolderViewDual3* This,DWORD dwFlags) {
    return This->lpVtbl->put_FolderFlags(This,dwFlags);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_get_SortColumns(IShellFolderViewDual3* This,BSTR *pbstrSortColumns) {
    return This->lpVtbl->get_SortColumns(This,pbstrSortColumns);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_put_SortColumns(IShellFolderViewDual3* This,BSTR bstrSortColumns) {
    return This->lpVtbl->put_SortColumns(This,bstrSortColumns);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_put_IconSize(IShellFolderViewDual3* This,int iIconSize) {
    return This->lpVtbl->put_IconSize(This,iIconSize);
}
static __WIDL_INLINE HRESULT IShellFolderViewDual3_get_IconSize(IShellFolderViewDual3* This,int *piIconSize) {
    return This->lpVtbl->get_IconSize(This,piIconSize);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch_QueryInterface(IShellDispatch* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IShellDispatch_AddRef(IShellDispatch* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IShellDispatch_Release(IShellDispatch* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IShellDispatch_GetTypeInfoCount(IShellDispatch* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IShellDispatch_GetTypeInfo(IShellDispatch* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch_get_Application(IShellDispatch* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch_get_Parent(IShellDispatch* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch_NameSpace(IShellDispatch* This,VARIANT vDir,Folder **ppsdf) {
    return This->lpVtbl->NameSpace(This,vDir,ppsdf);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch_Windows(IShellDispatch* This,IDispatch **ppid) {
    return This->lpVtbl->Windows(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch_Open(IShellDispatch* This,VARIANT vDir) {
    return This->lpVtbl->Open(This,vDir);
}
static __WIDL_INLINE HRESULT IShellDispatch_Explore(IShellDispatch* This,VARIANT vDir) {
    return This->lpVtbl->Explore(This,vDir);
}
static __WIDL_INLINE HRESULT IShellDispatch_MinimizeAll(IShellDispatch* This) {
    return This->lpVtbl->MinimizeAll(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_UndoMinimizeALL(IShellDispatch* This) {
    return This->lpVtbl->UndoMinimizeALL(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_FileRun(IShellDispatch* This) {
    return This->lpVtbl->FileRun(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_CascadeWindows(IShellDispatch* This) {
    return This->lpVtbl->CascadeWindows(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_TileVertically(IShellDispatch* This) {
    return This->lpVtbl->TileVertically(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_TileHorizontally(IShellDispatch* This) {
    return This->lpVtbl->TileHorizontally(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_ShutdownWindows(IShellDispatch* This) {
    return This->lpVtbl->ShutdownWindows(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_Suspend(IShellDispatch* This) {
    return This->lpVtbl->Suspend(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_EjectPC(IShellDispatch* This) {
    return This->lpVtbl->EjectPC(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_SetTime(IShellDispatch* This) {
    return This->lpVtbl->SetTime(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_TrayProperties(IShellDispatch* This) {
    return This->lpVtbl->TrayProperties(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_Help(IShellDispatch* This) {
    return This->lpVtbl->Help(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_FindFiles(IShellDispatch* This) {
    return This->lpVtbl->FindFiles(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_FindComputer(IShellDispatch* This) {
    return This->lpVtbl->FindComputer(This);
}
static __WIDL_INLINE HRESULT IShellDispatch_RefreshMenu(IShellDispatch* This) {
    return This->lpVtbl->RefreshMenu(This);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch2_QueryInterface(IShellDispatch2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IShellDispatch2_AddRef(IShellDispatch2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IShellDispatch2_Release(IShellDispatch2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IShellDispatch2_GetTypeInfoCount(IShellDispatch2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IShellDispatch2_GetTypeInfo(IShellDispatch2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch2_get_Application(IShellDispatch2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch2_get_Parent(IShellDispatch2* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch2_NameSpace(IShellDispatch2* This,VARIANT vDir,Folder **ppsdf) {
    return This->lpVtbl->NameSpace(This,vDir,ppsdf);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch2_Windows(IShellDispatch2* This,IDispatch **ppid) {
    return This->lpVtbl->Windows(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch2_Open(IShellDispatch2* This,VARIANT vDir) {
    return This->lpVtbl->Open(This,vDir);
}
static __WIDL_INLINE HRESULT IShellDispatch2_Explore(IShellDispatch2* This,VARIANT vDir) {
    return This->lpVtbl->Explore(This,vDir);
}
static __WIDL_INLINE HRESULT IShellDispatch2_MinimizeAll(IShellDispatch2* This) {
    return This->lpVtbl->MinimizeAll(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_UndoMinimizeALL(IShellDispatch2* This) {
    return This->lpVtbl->UndoMinimizeALL(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_FileRun(IShellDispatch2* This) {
    return This->lpVtbl->FileRun(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_CascadeWindows(IShellDispatch2* This) {
    return This->lpVtbl->CascadeWindows(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_TileVertically(IShellDispatch2* This) {
    return This->lpVtbl->TileVertically(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_TileHorizontally(IShellDispatch2* This) {
    return This->lpVtbl->TileHorizontally(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_ShutdownWindows(IShellDispatch2* This) {
    return This->lpVtbl->ShutdownWindows(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_Suspend(IShellDispatch2* This) {
    return This->lpVtbl->Suspend(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_EjectPC(IShellDispatch2* This) {
    return This->lpVtbl->EjectPC(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_SetTime(IShellDispatch2* This) {
    return This->lpVtbl->SetTime(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_TrayProperties(IShellDispatch2* This) {
    return This->lpVtbl->TrayProperties(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_Help(IShellDispatch2* This) {
    return This->lpVtbl->Help(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_FindFiles(IShellDispatch2* This) {
    return This->lpVtbl->FindFiles(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_FindComputer(IShellDispatch2* This) {
    return This->lpVtbl->FindComputer(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_RefreshMenu(IShellDispatch2* This) {
    return This->lpVtbl->RefreshMenu(This);
}
static __WIDL_INLINE HRESULT IShellDispatch2_ControlPanelItem(IShellDispatch2* This,BSTR bstrDir) {
    return This->lpVtbl->ControlPanelItem(This,bstrDir);
}
/*** IShellDispatch2 methods ***/
static __WIDL_INLINE HRESULT IShellDispatch2_IsRestricted(IShellDispatch2* This,BSTR Group,BSTR Restriction,LONG *plRestrictValue) {
    return This->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch2_FindPrinter(IShellDispatch2* This,BSTR name,BSTR location,BSTR model) {
    return This->lpVtbl->FindPrinter(This,name,location,model);
}
static __WIDL_INLINE HRESULT IShellDispatch2_GetSystemInformation(IShellDispatch2* This,BSTR name,VARIANT *pv) {
    return This->lpVtbl->GetSystemInformation(This,name,pv);
}
static __WIDL_INLINE HRESULT IShellDispatch2_ServiceStart(IShellDispatch2* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess);
}
static __WIDL_INLINE HRESULT IShellDispatch2_ServiceStop(IShellDispatch2* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess);
}
static __WIDL_INLINE HRESULT IShellDispatch2_IsServiceRunning(IShellDispatch2* This,BSTR ServiceName,VARIANT *pRunning) {
    return This->lpVtbl->IsServiceRunning(This,ServiceName,pRunning);
}
static __WIDL_INLINE HRESULT IShellDispatch2_CanStartStopService(IShellDispatch2* This,BSTR ServiceName,VARIANT *pCanStartStop) {
    return This->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch3_QueryInterface(IShellDispatch3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IShellDispatch3_AddRef(IShellDispatch3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IShellDispatch3_Release(IShellDispatch3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IShellDispatch3_GetTypeInfoCount(IShellDispatch3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IShellDispatch3_GetTypeInfo(IShellDispatch3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch3_get_Application(IShellDispatch3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch3_get_Parent(IShellDispatch3* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch3_NameSpace(IShellDispatch3* This,VARIANT vDir,Folder **ppsdf) {
    return This->lpVtbl->NameSpace(This,vDir,ppsdf);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch3_Windows(IShellDispatch3* This,IDispatch **ppid) {
    return This->lpVtbl->Windows(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch3_Open(IShellDispatch3* This,VARIANT vDir) {
    return This->lpVtbl->Open(This,vDir);
}
static __WIDL_INLINE HRESULT IShellDispatch3_Explore(IShellDispatch3* This,VARIANT vDir) {
    return This->lpVtbl->Explore(This,vDir);
}
static __WIDL_INLINE HRESULT IShellDispatch3_MinimizeAll(IShellDispatch3* This) {
    return This->lpVtbl->MinimizeAll(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_UndoMinimizeALL(IShellDispatch3* This) {
    return This->lpVtbl->UndoMinimizeALL(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_FileRun(IShellDispatch3* This) {
    return This->lpVtbl->FileRun(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_CascadeWindows(IShellDispatch3* This) {
    return This->lpVtbl->CascadeWindows(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_TileVertically(IShellDispatch3* This) {
    return This->lpVtbl->TileVertically(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_TileHorizontally(IShellDispatch3* This) {
    return This->lpVtbl->TileHorizontally(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_ShutdownWindows(IShellDispatch3* This) {
    return This->lpVtbl->ShutdownWindows(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_Suspend(IShellDispatch3* This) {
    return This->lpVtbl->Suspend(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_EjectPC(IShellDispatch3* This) {
    return This->lpVtbl->EjectPC(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_SetTime(IShellDispatch3* This) {
    return This->lpVtbl->SetTime(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_TrayProperties(IShellDispatch3* This) {
    return This->lpVtbl->TrayProperties(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_Help(IShellDispatch3* This) {
    return This->lpVtbl->Help(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_FindFiles(IShellDispatch3* This) {
    return This->lpVtbl->FindFiles(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_FindComputer(IShellDispatch3* This) {
    return This->lpVtbl->FindComputer(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_RefreshMenu(IShellDispatch3* This) {
    return This->lpVtbl->RefreshMenu(This);
}
static __WIDL_INLINE HRESULT IShellDispatch3_ControlPanelItem(IShellDispatch3* This,BSTR bstrDir) {
    return This->lpVtbl->ControlPanelItem(This,bstrDir);
}
/*** IShellDispatch2 methods ***/
static __WIDL_INLINE HRESULT IShellDispatch3_IsRestricted(IShellDispatch3* This,BSTR Group,BSTR Restriction,LONG *plRestrictValue) {
    return This->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch3_FindPrinter(IShellDispatch3* This,BSTR name,BSTR location,BSTR model) {
    return This->lpVtbl->FindPrinter(This,name,location,model);
}
static __WIDL_INLINE HRESULT IShellDispatch3_GetSystemInformation(IShellDispatch3* This,BSTR name,VARIANT *pv) {
    return This->lpVtbl->GetSystemInformation(This,name,pv);
}
static __WIDL_INLINE HRESULT IShellDispatch3_ServiceStart(IShellDispatch3* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess);
}
static __WIDL_INLINE HRESULT IShellDispatch3_ServiceStop(IShellDispatch3* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess);
}
static __WIDL_INLINE HRESULT IShellDispatch3_IsServiceRunning(IShellDispatch3* This,BSTR ServiceName,VARIANT *pRunning) {
    return This->lpVtbl->IsServiceRunning(This,ServiceName,pRunning);
}
static __WIDL_INLINE HRESULT IShellDispatch3_CanStartStopService(IShellDispatch3* This,BSTR ServiceName,VARIANT *pCanStartStop) {
    return This->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop);
}
static __WIDL_INLINE HRESULT IShellDispatch3_ShowBrowserBar(IShellDispatch3* This,BSTR bstrClsid,VARIANT bShow,VARIANT *pSuccess) {
    return This->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess);
}
/*** IShellDispatch3 methods ***/
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch4_QueryInterface(IShellDispatch4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IShellDispatch4_AddRef(IShellDispatch4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IShellDispatch4_Release(IShellDispatch4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IShellDispatch4_GetTypeInfoCount(IShellDispatch4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IShellDispatch4_GetTypeInfo(IShellDispatch4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch4_get_Application(IShellDispatch4* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch4_get_Parent(IShellDispatch4* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch4_NameSpace(IShellDispatch4* This,VARIANT vDir,Folder **ppsdf) {
    return This->lpVtbl->NameSpace(This,vDir,ppsdf);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch4_Windows(IShellDispatch4* This,IDispatch **ppid) {
    return This->lpVtbl->Windows(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch4_Open(IShellDispatch4* This,VARIANT vDir) {
    return This->lpVtbl->Open(This,vDir);
}
static __WIDL_INLINE HRESULT IShellDispatch4_Explore(IShellDispatch4* This,VARIANT vDir) {
    return This->lpVtbl->Explore(This,vDir);
}
static __WIDL_INLINE HRESULT IShellDispatch4_MinimizeAll(IShellDispatch4* This) {
    return This->lpVtbl->MinimizeAll(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_UndoMinimizeALL(IShellDispatch4* This) {
    return This->lpVtbl->UndoMinimizeALL(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_FileRun(IShellDispatch4* This) {
    return This->lpVtbl->FileRun(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_CascadeWindows(IShellDispatch4* This) {
    return This->lpVtbl->CascadeWindows(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_TileVertically(IShellDispatch4* This) {
    return This->lpVtbl->TileVertically(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_TileHorizontally(IShellDispatch4* This) {
    return This->lpVtbl->TileHorizontally(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_ShutdownWindows(IShellDispatch4* This) {
    return This->lpVtbl->ShutdownWindows(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_Suspend(IShellDispatch4* This) {
    return This->lpVtbl->Suspend(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_EjectPC(IShellDispatch4* This) {
    return This->lpVtbl->EjectPC(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_SetTime(IShellDispatch4* This) {
    return This->lpVtbl->SetTime(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_TrayProperties(IShellDispatch4* This) {
    return This->lpVtbl->TrayProperties(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_Help(IShellDispatch4* This) {
    return This->lpVtbl->Help(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_FindFiles(IShellDispatch4* This) {
    return This->lpVtbl->FindFiles(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_FindComputer(IShellDispatch4* This) {
    return This->lpVtbl->FindComputer(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_RefreshMenu(IShellDispatch4* This) {
    return This->lpVtbl->RefreshMenu(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_ControlPanelItem(IShellDispatch4* This,BSTR bstrDir) {
    return This->lpVtbl->ControlPanelItem(This,bstrDir);
}
/*** IShellDispatch2 methods ***/
static __WIDL_INLINE HRESULT IShellDispatch4_IsRestricted(IShellDispatch4* This,BSTR Group,BSTR Restriction,LONG *plRestrictValue) {
    return This->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch4_FindPrinter(IShellDispatch4* This,BSTR name,BSTR location,BSTR model) {
    return This->lpVtbl->FindPrinter(This,name,location,model);
}
static __WIDL_INLINE HRESULT IShellDispatch4_GetSystemInformation(IShellDispatch4* This,BSTR name,VARIANT *pv) {
    return This->lpVtbl->GetSystemInformation(This,name,pv);
}
static __WIDL_INLINE HRESULT IShellDispatch4_ServiceStart(IShellDispatch4* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess);
}
static __WIDL_INLINE HRESULT IShellDispatch4_ServiceStop(IShellDispatch4* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess);
}
static __WIDL_INLINE HRESULT IShellDispatch4_IsServiceRunning(IShellDispatch4* This,BSTR ServiceName,VARIANT *pRunning) {
    return This->lpVtbl->IsServiceRunning(This,ServiceName,pRunning);
}
static __WIDL_INLINE HRESULT IShellDispatch4_CanStartStopService(IShellDispatch4* This,BSTR ServiceName,VARIANT *pCanStartStop) {
    return This->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop);
}
static __WIDL_INLINE HRESULT IShellDispatch4_ShowBrowserBar(IShellDispatch4* This,BSTR bstrClsid,VARIANT bShow,VARIANT *pSuccess) {
    return This->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess);
}
/*** IShellDispatch3 methods ***/
static __WIDL_INLINE HRESULT IShellDispatch4_AddToRecent(IShellDispatch4* This,VARIANT varFile,BSTR bstrCategory) {
    return This->lpVtbl->AddToRecent(This,varFile,bstrCategory);
}
/*** IShellDispatch4 methods ***/
static __WIDL_INLINE HRESULT IShellDispatch4_WindowsSecurity(IShellDispatch4* This) {
    return This->lpVtbl->WindowsSecurity(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_ToggleDesktop(IShellDispatch4* This) {
    return This->lpVtbl->ToggleDesktop(This);
}
static __WIDL_INLINE HRESULT IShellDispatch4_ExplorerPolicy(IShellDispatch4* This,BSTR bstrPolicyName,VARIANT *pValue) {
    return This->lpVtbl->ExplorerPolicy(This,bstrPolicyName,pValue);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch5_QueryInterface(IShellDispatch5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IShellDispatch5_AddRef(IShellDispatch5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IShellDispatch5_Release(IShellDispatch5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IShellDispatch5_GetTypeInfoCount(IShellDispatch5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IShellDispatch5_GetTypeInfo(IShellDispatch5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch5_get_Application(IShellDispatch5* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch5_get_Parent(IShellDispatch5* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch5_NameSpace(IShellDispatch5* This,VARIANT vDir,Folder **ppsdf) {
    return This->lpVtbl->NameSpace(This,vDir,ppsdf);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch5_Windows(IShellDispatch5* This,IDispatch **ppid) {
    return This->lpVtbl->Windows(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch5_Open(IShellDispatch5* This,VARIANT vDir) {
    return This->lpVtbl->Open(This,vDir);
}
static __WIDL_INLINE HRESULT IShellDispatch5_Explore(IShellDispatch5* This,VARIANT vDir) {
    return This->lpVtbl->Explore(This,vDir);
}
static __WIDL_INLINE HRESULT IShellDispatch5_MinimizeAll(IShellDispatch5* This) {
    return This->lpVtbl->MinimizeAll(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_UndoMinimizeALL(IShellDispatch5* This) {
    return This->lpVtbl->UndoMinimizeALL(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_FileRun(IShellDispatch5* This) {
    return This->lpVtbl->FileRun(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_CascadeWindows(IShellDispatch5* This) {
    return This->lpVtbl->CascadeWindows(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_TileVertically(IShellDispatch5* This) {
    return This->lpVtbl->TileVertically(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_TileHorizontally(IShellDispatch5* This) {
    return This->lpVtbl->TileHorizontally(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_ShutdownWindows(IShellDispatch5* This) {
    return This->lpVtbl->ShutdownWindows(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_Suspend(IShellDispatch5* This) {
    return This->lpVtbl->Suspend(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_EjectPC(IShellDispatch5* This) {
    return This->lpVtbl->EjectPC(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_SetTime(IShellDispatch5* This) {
    return This->lpVtbl->SetTime(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_TrayProperties(IShellDispatch5* This) {
    return This->lpVtbl->TrayProperties(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_Help(IShellDispatch5* This) {
    return This->lpVtbl->Help(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_FindFiles(IShellDispatch5* This) {
    return This->lpVtbl->FindFiles(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_FindComputer(IShellDispatch5* This) {
    return This->lpVtbl->FindComputer(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_RefreshMenu(IShellDispatch5* This) {
    return This->lpVtbl->RefreshMenu(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_ControlPanelItem(IShellDispatch5* This,BSTR bstrDir) {
    return This->lpVtbl->ControlPanelItem(This,bstrDir);
}
/*** IShellDispatch2 methods ***/
static __WIDL_INLINE HRESULT IShellDispatch5_IsRestricted(IShellDispatch5* This,BSTR Group,BSTR Restriction,LONG *plRestrictValue) {
    return This->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch5_FindPrinter(IShellDispatch5* This,BSTR name,BSTR location,BSTR model) {
    return This->lpVtbl->FindPrinter(This,name,location,model);
}
static __WIDL_INLINE HRESULT IShellDispatch5_GetSystemInformation(IShellDispatch5* This,BSTR name,VARIANT *pv) {
    return This->lpVtbl->GetSystemInformation(This,name,pv);
}
static __WIDL_INLINE HRESULT IShellDispatch5_ServiceStart(IShellDispatch5* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess);
}
static __WIDL_INLINE HRESULT IShellDispatch5_ServiceStop(IShellDispatch5* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess);
}
static __WIDL_INLINE HRESULT IShellDispatch5_IsServiceRunning(IShellDispatch5* This,BSTR ServiceName,VARIANT *pRunning) {
    return This->lpVtbl->IsServiceRunning(This,ServiceName,pRunning);
}
static __WIDL_INLINE HRESULT IShellDispatch5_CanStartStopService(IShellDispatch5* This,BSTR ServiceName,VARIANT *pCanStartStop) {
    return This->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop);
}
static __WIDL_INLINE HRESULT IShellDispatch5_ShowBrowserBar(IShellDispatch5* This,BSTR bstrClsid,VARIANT bShow,VARIANT *pSuccess) {
    return This->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess);
}
/*** IShellDispatch3 methods ***/
static __WIDL_INLINE HRESULT IShellDispatch5_AddToRecent(IShellDispatch5* This,VARIANT varFile,BSTR bstrCategory) {
    return This->lpVtbl->AddToRecent(This,varFile,bstrCategory);
}
/*** IShellDispatch4 methods ***/
static __WIDL_INLINE HRESULT IShellDispatch5_WindowsSecurity(IShellDispatch5* This) {
    return This->lpVtbl->WindowsSecurity(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_ToggleDesktop(IShellDispatch5* This) {
    return This->lpVtbl->ToggleDesktop(This);
}
static __WIDL_INLINE HRESULT IShellDispatch5_ExplorerPolicy(IShellDispatch5* This,BSTR bstrPolicyName,VARIANT *pValue) {
    return This->lpVtbl->ExplorerPolicy(This,bstrPolicyName,pValue);
}
static __WIDL_INLINE HRESULT IShellDispatch5_GetSetting(IShellDispatch5* This,LONG lSetting,VARIANT_BOOL *pResult) {
    return This->lpVtbl->GetSetting(This,lSetting,pResult);
}
/*** IShellDispatch5 methods ***/
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch6_QueryInterface(IShellDispatch6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IShellDispatch6_AddRef(IShellDispatch6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IShellDispatch6_Release(IShellDispatch6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IShellDispatch6_GetTypeInfoCount(IShellDispatch6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IShellDispatch6_GetTypeInfo(IShellDispatch6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch6_get_Application(IShellDispatch6* This,IDispatch **ppid) {
    return This->lpVtbl->get_Application(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch6_get_Parent(IShellDispatch6* This,IDispatch **ppid) {
    return This->lpVtbl->get_Parent(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch6_NameSpace(IShellDispatch6* This,VARIANT vDir,Folder **ppsdf) {
    return This->lpVtbl->NameSpace(This,vDir,ppsdf);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch6_Windows(IShellDispatch6* This,IDispatch **ppid) {
    return This->lpVtbl->Windows(This,ppid);
}
static __WIDL_INLINE HRESULT IShellDispatch6_Open(IShellDispatch6* This,VARIANT vDir) {
    return This->lpVtbl->Open(This,vDir);
}
static __WIDL_INLINE HRESULT IShellDispatch6_Explore(IShellDispatch6* This,VARIANT vDir) {
    return This->lpVtbl->Explore(This,vDir);
}
static __WIDL_INLINE HRESULT IShellDispatch6_MinimizeAll(IShellDispatch6* This) {
    return This->lpVtbl->MinimizeAll(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_UndoMinimizeALL(IShellDispatch6* This) {
    return This->lpVtbl->UndoMinimizeALL(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_FileRun(IShellDispatch6* This) {
    return This->lpVtbl->FileRun(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_CascadeWindows(IShellDispatch6* This) {
    return This->lpVtbl->CascadeWindows(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_TileVertically(IShellDispatch6* This) {
    return This->lpVtbl->TileVertically(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_TileHorizontally(IShellDispatch6* This) {
    return This->lpVtbl->TileHorizontally(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_ShutdownWindows(IShellDispatch6* This) {
    return This->lpVtbl->ShutdownWindows(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_Suspend(IShellDispatch6* This) {
    return This->lpVtbl->Suspend(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_EjectPC(IShellDispatch6* This) {
    return This->lpVtbl->EjectPC(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_SetTime(IShellDispatch6* This) {
    return This->lpVtbl->SetTime(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_TrayProperties(IShellDispatch6* This) {
    return This->lpVtbl->TrayProperties(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_Help(IShellDispatch6* This) {
    return This->lpVtbl->Help(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_FindFiles(IShellDispatch6* This) {
    return This->lpVtbl->FindFiles(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_FindComputer(IShellDispatch6* This) {
    return This->lpVtbl->FindComputer(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_RefreshMenu(IShellDispatch6* This) {
    return This->lpVtbl->RefreshMenu(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_ControlPanelItem(IShellDispatch6* This,BSTR bstrDir) {
    return This->lpVtbl->ControlPanelItem(This,bstrDir);
}
/*** IShellDispatch2 methods ***/
static __WIDL_INLINE HRESULT IShellDispatch6_IsRestricted(IShellDispatch6* This,BSTR Group,BSTR Restriction,LONG *plRestrictValue) {
    return This->lpVtbl->IsRestricted(This,Group,Restriction,plRestrictValue);
}
static __WIDL_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 __WIDL_INLINE HRESULT IShellDispatch6_FindPrinter(IShellDispatch6* This,BSTR name,BSTR location,BSTR model) {
    return This->lpVtbl->FindPrinter(This,name,location,model);
}
static __WIDL_INLINE HRESULT IShellDispatch6_GetSystemInformation(IShellDispatch6* This,BSTR name,VARIANT *pv) {
    return This->lpVtbl->GetSystemInformation(This,name,pv);
}
static __WIDL_INLINE HRESULT IShellDispatch6_ServiceStart(IShellDispatch6* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStart(This,ServiceName,Persistent,pSuccess);
}
static __WIDL_INLINE HRESULT IShellDispatch6_ServiceStop(IShellDispatch6* This,BSTR ServiceName,VARIANT Persistent,VARIANT *pSuccess) {
    return This->lpVtbl->ServiceStop(This,ServiceName,Persistent,pSuccess);
}
static __WIDL_INLINE HRESULT IShellDispatch6_IsServiceRunning(IShellDispatch6* This,BSTR ServiceName,VARIANT *pRunning) {
    return This->lpVtbl->IsServiceRunning(This,ServiceName,pRunning);
}
static __WIDL_INLINE HRESULT IShellDispatch6_CanStartStopService(IShellDispatch6* This,BSTR ServiceName,VARIANT *pCanStartStop) {
    return This->lpVtbl->CanStartStopService(This,ServiceName,pCanStartStop);
}
static __WIDL_INLINE HRESULT IShellDispatch6_ShowBrowserBar(IShellDispatch6* This,BSTR bstrClsid,VARIANT bShow,VARIANT *pSuccess) {
    return This->lpVtbl->ShowBrowserBar(This,bstrClsid,bShow,pSuccess);
}
/*** IShellDispatch3 methods ***/
static __WIDL_INLINE HRESULT IShellDispatch6_AddToRecent(IShellDispatch6* This,VARIANT varFile,BSTR bstrCategory) {
    return This->lpVtbl->AddToRecent(This,varFile,bstrCategory);
}
/*** IShellDispatch4 methods ***/
static __WIDL_INLINE HRESULT IShellDispatch6_WindowsSecurity(IShellDispatch6* This) {
    return This->lpVtbl->WindowsSecurity(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_ToggleDesktop(IShellDispatch6* This) {
    return This->lpVtbl->ToggleDesktop(This);
}
static __WIDL_INLINE HRESULT IShellDispatch6_ExplorerPolicy(IShellDispatch6* This,BSTR bstrPolicyName,VARIANT *pValue) {
    return This->lpVtbl->ExplorerPolicy(This,bstrPolicyName,pValue);
}
static __WIDL_INLINE HRESULT IShellDispatch6_GetSetting(IShellDispatch6* This,LONG lSetting,VARIANT_BOOL *pResult) {
    return This->lpVtbl->GetSetting(This,lSetting,pResult);
}
/*** IShellDispatch5 methods ***/
static __WIDL_INLINE HRESULT IShellDispatch6_WindowSwitcher(IShellDispatch6* This) {
    return This->lpVtbl->WindowSwitcher(This);
}
/*** IShellDispatch6 methods ***/
static __WIDL_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 __WIDL_INLINE HRESULT IFileSearchBand_QueryInterface(IFileSearchBand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFileSearchBand_AddRef(IFileSearchBand* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFileSearchBand_Release(IFileSearchBand* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFileSearchBand_GetTypeInfoCount(IFileSearchBand* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFileSearchBand_GetTypeInfo(IFileSearchBand* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IFileSearchBand_SetFocus(IFileSearchBand* This) {
    return This->lpVtbl->SetFocus(This);
}
static __WIDL_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 __WIDL_INLINE HRESULT IFileSearchBand_get_SearchID(IFileSearchBand* This,BSTR *pbstrSearchID) {
    return This->lpVtbl->get_SearchID(This,pbstrSearchID);
}
static __WIDL_INLINE HRESULT IFileSearchBand_get_Scope(IFileSearchBand* This,VARIANT *pvarScope) {
    return This->lpVtbl->get_Scope(This,pvarScope);
}
static __WIDL_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 __WIDL_INLINE HRESULT IWebWizardHost_QueryInterface(IWebWizardHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWebWizardHost_AddRef(IWebWizardHost* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWebWizardHost_Release(IWebWizardHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWebWizardHost_GetTypeInfoCount(IWebWizardHost* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWebWizardHost_GetTypeInfo(IWebWizardHost* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT IWebWizardHost_FinalBack(IWebWizardHost* This) {
    return This->lpVtbl->FinalBack(This);
}
static __WIDL_INLINE HRESULT IWebWizardHost_FinalNext(IWebWizardHost* This) {
    return This->lpVtbl->FinalNext(This);
}
static __WIDL_INLINE HRESULT IWebWizardHost_Cancel(IWebWizardHost* This) {
    return This->lpVtbl->Cancel(This);
}
static __WIDL_INLINE HRESULT IWebWizardHost_put_Caption(IWebWizardHost* This,BSTR bstrCaption) {
    return This->lpVtbl->put_Caption(This,bstrCaption);
}
static __WIDL_INLINE HRESULT IWebWizardHost_get_Caption(IWebWizardHost* This,BSTR *pbstrCaption) {
    return This->lpVtbl->get_Caption(This,pbstrCaption);
}
static __WIDL_INLINE HRESULT IWebWizardHost_put_Property(IWebWizardHost* This,BSTR bstrPropertyName,VARIANT *pvProperty) {
    return This->lpVtbl->put_Property(This,bstrPropertyName,pvProperty);
}
static __WIDL_INLINE HRESULT IWebWizardHost_get_Property(IWebWizardHost* This,BSTR bstrPropertyName,VARIANT *pvProperty) {
    return This->lpVtbl->get_Property(This,bstrPropertyName,pvProperty);
}
static __WIDL_INLINE HRESULT IWebWizardHost_SetWizardButtons(IWebWizardHost* This,VARIANT_BOOL vfEnableBack,VARIANT_BOOL vfEnableNext,VARIANT_BOOL vfLastPage) {
    return This->lpVtbl->SetWizardButtons(This,vfEnableBack,vfEnableNext,vfLastPage);
}
static __WIDL_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 __WIDL_INLINE HRESULT INewWDEvents_QueryInterface(INewWDEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG INewWDEvents_AddRef(INewWDEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG INewWDEvents_Release(INewWDEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT INewWDEvents_GetTypeInfoCount(INewWDEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT INewWDEvents_GetTypeInfo(INewWDEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_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 __WIDL_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 __WIDL_INLINE HRESULT INewWDEvents_FinalBack(INewWDEvents* This) {
    return This->lpVtbl->FinalBack(This);
}
static __WIDL_INLINE HRESULT INewWDEvents_FinalNext(INewWDEvents* This) {
    return This->lpVtbl->FinalNext(This);
}
static __WIDL_INLINE HRESULT INewWDEvents_Cancel(INewWDEvents* This) {
    return This->lpVtbl->Cancel(This);
}
static __WIDL_INLINE HRESULT INewWDEvents_put_Caption(INewWDEvents* This,BSTR bstrCaption) {
    return This->lpVtbl->put_Caption(This,bstrCaption);
}
static __WIDL_INLINE HRESULT INewWDEvents_get_Caption(INewWDEvents* This,BSTR *pbstrCaption) {
    return This->lpVtbl->get_Caption(This,pbstrCaption);
}
static __WIDL_INLINE HRESULT INewWDEvents_put_Property(INewWDEvents* This,BSTR bstrPropertyName,VARIANT *pvProperty) {
    return This->lpVtbl->put_Property(This,bstrPropertyName,pvProperty);
}
static __WIDL_INLINE HRESULT INewWDEvents_get_Property(INewWDEvents* This,BSTR bstrPropertyName,VARIANT *pvProperty) {
    return This->lpVtbl->get_Property(This,bstrPropertyName,pvProperty);
}
static __WIDL_INLINE HRESULT INewWDEvents_SetWizardButtons(INewWDEvents* This,VARIANT_BOOL vfEnableBack,VARIANT_BOOL vfEnableNext,VARIANT_BOOL vfLastPage) {
    return This->lpVtbl->SetWizardButtons(This,vfEnableBack,vfEnableNext,vfLastPage);
}
static __WIDL_INLINE HRESULT INewWDEvents_SetHeaderText(INewWDEvents* This,BSTR bstrHeaderTitle,BSTR bstrHeaderSubtitle) {
    return This->lpVtbl->SetHeaderText(This,bstrHeaderTitle,bstrHeaderSubtitle);
}
/*** INewWDEvents methods ***/
static __WIDL_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 __WIDL_INLINE HRESULT IAutoComplete_QueryInterface(IAutoComplete* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAutoComplete_AddRef(IAutoComplete* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAutoComplete_Release(IAutoComplete* This) {
    return This->lpVtbl->Release(This);
}
/*** IAutoComplete methods ***/
static __WIDL_INLINE HRESULT IAutoComplete_Init(IAutoComplete* This,HWND hwndEdit,IUnknown *punkACL,LPCWSTR pwszRegKeyPath,LPCWSTR pwszQuickComplete) {
    return This->lpVtbl->Init(This,hwndEdit,punkACL,pwszRegKeyPath,pwszQuickComplete);
}
static __WIDL_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 __WIDL_INLINE HRESULT IAutoComplete2_QueryInterface(IAutoComplete2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAutoComplete2_AddRef(IAutoComplete2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAutoComplete2_Release(IAutoComplete2* This) {
    return This->lpVtbl->Release(This);
}
/*** IAutoComplete methods ***/
static __WIDL_INLINE HRESULT IAutoComplete2_Init(IAutoComplete2* This,HWND hwndEdit,IUnknown *punkACL,LPCWSTR pwszRegKeyPath,LPCWSTR pwszQuickComplete) {
    return This->lpVtbl->Init(This,hwndEdit,punkACL,pwszRegKeyPath,pwszQuickComplete);
}
static __WIDL_INLINE HRESULT IAutoComplete2_Enable(IAutoComplete2* This,WINBOOL fEnable) {
    return This->lpVtbl->Enable(This,fEnable);
}
/*** IAutoComplete2 methods ***/
static __WIDL_INLINE HRESULT IAutoComplete2_SetOptions(IAutoComplete2* This,DWORD dwFlag) {
    return This->lpVtbl->SetOptions(This,dwFlag);
}
static __WIDL_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 __WIDL_INLINE HRESULT IEnumACString_QueryInterface(IEnumACString* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumACString_AddRef(IEnumACString* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumACString_Release(IEnumACString* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumString methods ***/
static __WIDL_INLINE HRESULT IEnumACString_Next(IEnumACString* This,ULONG celt,LPOLESTR *rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static __WIDL_INLINE HRESULT IEnumACString_Skip(IEnumACString* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static __WIDL_INLINE HRESULT IEnumACString_Reset(IEnumACString* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE HRESULT IEnumACString_Clone(IEnumACString* This,IEnumString **ppenum) {
    return This->lpVtbl->Clone(This,ppenum);
}
/*** IEnumACString methods ***/
static __WIDL_INLINE HRESULT IEnumACString_NextItem(IEnumACString* This,LPWSTR pszUrl,ULONG cchMax,ULONG *pulSortIndex) {
    return This->lpVtbl->NextItem(This,pszUrl,cchMax,pulSortIndex);
}
static __WIDL_INLINE HRESULT IEnumACString_SetEnumOptions(IEnumACString* This,DWORD dwOptions) {
    return This->lpVtbl->SetEnumOptions(This,dwOptions);
}
static __WIDL_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 __WIDL_INLINE HRESULT IDataObjectAsyncCapability_QueryInterface(IDataObjectAsyncCapability* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDataObjectAsyncCapability_AddRef(IDataObjectAsyncCapability* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDataObjectAsyncCapability_Release(IDataObjectAsyncCapability* This) {
    return This->lpVtbl->Release(This);
}
/*** IDataObjectAsyncCapability methods ***/
static __WIDL_INLINE HRESULT IDataObjectAsyncCapability_SetAsyncMode(IDataObjectAsyncCapability* This,WINBOOL fDoOpAsync) {
    return This->lpVtbl->SetAsyncMode(This,fDoOpAsync);
}
static __WIDL_INLINE HRESULT IDataObjectAsyncCapability_GetAsyncMode(IDataObjectAsyncCapability* This,WINBOOL *pfIsOpAsync) {
    return This->lpVtbl->GetAsyncMode(This,pfIsOpAsync);
}
static __WIDL_INLINE HRESULT IDataObjectAsyncCapability_StartOperation(IDataObjectAsyncCapability* This,IBindCtx *pbcReserved) {
    return This->lpVtbl->StartOperation(This,pbcReserved);
}
static __WIDL_INLINE HRESULT IDataObjectAsyncCapability_InOperation(IDataObjectAsyncCapability* This,WINBOOL *pfInAsyncOp) {
    return This->lpVtbl->InOperation(This,pfInAsyncOp);
}
static __WIDL_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__ */
