/*** Autogenerated by WIDL 0.1 from shobjidl.idl - Do not edit ***/
#include <rpc.h>
#include <rpcndr.h>

#ifndef __WIDL_SHOBJIDL_H
#define __WIDL_SHOBJIDL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <objidl.h>
#include <oleidl.h>
#include <oaidl.h>
#include <shtypes.h>
#include <servprov.h>
#include <comcat.h>
#include <propidl.h>
#ifndef __IPersistFolder_FWD_DEFINED__
#define __IPersistFolder_FWD_DEFINED__
typedef struct IPersistFolder IPersistFolder;
#endif

typedef IPersistFolder *LPPERSISTFOLDER;

/*****************************************************************************
 * IPersistFolder interface
 */
#ifndef __IPersistFolder_INTERFACE_DEFINED__
#define __IPersistFolder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPersistFolder, 0x000214ea, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IPersistFolder : public IPersist
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        LPCITEMIDLIST pidl) = 0;

};
#else
typedef struct IPersistFolderVtbl IPersistFolderVtbl;
struct IPersistFolder {
    const IPersistFolderVtbl* lpVtbl;
};
struct IPersistFolderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IPersist methods ***/
    HRESULT (STDMETHODCALLTYPE *GetClassID)(
        IPersistFolder* This,
        CLSID* pClassID);

    /*** IPersistFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IPersistFolder* This,
        LPCITEMIDLIST pidl);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IPersistFolder_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IPersistFolder_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IPersistFolder_Release(p) (p)->lpVtbl->Release(p)
/*** IPersist methods ***/
#define IPersistFolder_GetClassID(p,a) (p)->lpVtbl->GetClassID(p,a)
/*** IPersistFolder methods ***/
#define IPersistFolder_Initialize(p,a) (p)->lpVtbl->Initialize(p,a)
#endif

#endif

#define IPersistFolder_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IPersist methods ***/ \
    STDMETHOD_(HRESULT,GetClassID)(THIS_ CLSID* pClassID) PURE; \
    /*** IPersistFolder methods ***/ \
    STDMETHOD_(HRESULT,Initialize)(THIS_ LPCITEMIDLIST pidl) PURE;

HRESULT CALLBACK IPersistFolder_Initialize_Proxy(
    IPersistFolder* This,
    LPCITEMIDLIST pidl);
void __RPC_STUB IPersistFolder_Initialize_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IPersistFolder_INTERFACE_DEFINED__ */

#ifndef __IPersistFolder2_FWD_DEFINED__
#define __IPersistFolder2_FWD_DEFINED__
typedef struct IPersistFolder2 IPersistFolder2;
#endif

typedef IPersistFolder2 *LPPERSISTFOLDER2;

/*****************************************************************************
 * IPersistFolder2 interface
 */
#ifndef __IPersistFolder2_INTERFACE_DEFINED__
#define __IPersistFolder2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPersistFolder2, 0x1ac3d9f0, 0x175c, 0x11d1, 0x95,0xbe, 0x00,0x60,0x97,0x97,0xea,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IPersistFolder2 : public IPersistFolder
{
    virtual HRESULT STDMETHODCALLTYPE GetCurFolder(
        LPITEMIDLIST* ppidl) = 0;

};
#else
typedef struct IPersistFolder2Vtbl IPersistFolder2Vtbl;
struct IPersistFolder2 {
    const IPersistFolder2Vtbl* lpVtbl;
};
struct IPersistFolder2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IPersist methods ***/
    HRESULT (STDMETHODCALLTYPE *GetClassID)(
        IPersistFolder2* This,
        CLSID* pClassID);

    /*** IPersistFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IPersistFolder2* This,
        LPCITEMIDLIST pidl);

    /*** IPersistFolder2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurFolder)(
        IPersistFolder2* This,
        LPITEMIDLIST* ppidl);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IPersistFolder2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IPersistFolder2_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IPersistFolder2_Release(p) (p)->lpVtbl->Release(p)
/*** IPersist methods ***/
#define IPersistFolder2_GetClassID(p,a) (p)->lpVtbl->GetClassID(p,a)
/*** IPersistFolder methods ***/
#define IPersistFolder2_Initialize(p,a) (p)->lpVtbl->Initialize(p,a)
/*** IPersistFolder2 methods ***/
#define IPersistFolder2_GetCurFolder(p,a) (p)->lpVtbl->GetCurFolder(p,a)
#endif

#endif

#define IPersistFolder2_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IPersist methods ***/ \
    STDMETHOD_(HRESULT,GetClassID)(THIS_ CLSID* pClassID) PURE; \
    /*** IPersistFolder methods ***/ \
    STDMETHOD_(HRESULT,Initialize)(THIS_ LPCITEMIDLIST pidl) PURE; \
    /*** IPersistFolder2 methods ***/ \
    STDMETHOD_(HRESULT,GetCurFolder)(THIS_ LPITEMIDLIST* ppidl) PURE;

HRESULT CALLBACK IPersistFolder2_GetCurFolder_Proxy(
    IPersistFolder2* This,
    LPITEMIDLIST* ppidl);
void __RPC_STUB IPersistFolder2_GetCurFolder_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IPersistFolder2_INTERFACE_DEFINED__ */

#ifndef __IEnumIDList_FWD_DEFINED__
#define __IEnumIDList_FWD_DEFINED__
typedef struct IEnumIDList IEnumIDList;
#endif

typedef IEnumIDList *LPENUMIDLIST;

/*****************************************************************************
 * IEnumIDList interface
 */
#ifndef __IEnumIDList_INTERFACE_DEFINED__
#define __IEnumIDList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumIDList, 0x000214f2, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IEnumIDList : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        LPITEMIDLIST* rgelt,
        ULONG* pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumIDList** ppenum) = 0;

};
#else
typedef struct IEnumIDListVtbl IEnumIDListVtbl;
struct IEnumIDList {
    const IEnumIDListVtbl* lpVtbl;
};
struct IEnumIDListVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumIDList methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumIDList* This,
        ULONG celt,
        LPITEMIDLIST* rgelt,
        ULONG* pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumIDList* This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumIDList* This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumIDList* This,
        IEnumIDList** ppenum);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IEnumIDList_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IEnumIDList_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IEnumIDList_Release(p) (p)->lpVtbl->Release(p)
/*** IEnumIDList methods ***/
#define IEnumIDList_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c)
#define IEnumIDList_Skip(p,a) (p)->lpVtbl->Skip(p,a)
#define IEnumIDList_Reset(p) (p)->lpVtbl->Reset(p)
#define IEnumIDList_Clone(p,a) (p)->lpVtbl->Clone(p,a)
#endif

#endif

#define IEnumIDList_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IEnumIDList methods ***/ \
    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, LPITEMIDLIST* rgelt, ULONG* pceltFetched) PURE; \
    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \
    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumIDList** ppenum) PURE;

HRESULT CALLBACK IEnumIDList_Next_Proxy(
    IEnumIDList* This,
    ULONG celt,
    LPITEMIDLIST* rgelt,
    ULONG* pceltFetched);
void __RPC_STUB IEnumIDList_Next_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumIDList_Skip_Proxy(
    IEnumIDList* This,
    ULONG celt);
void __RPC_STUB IEnumIDList_Skip_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumIDList_Reset_Proxy(
    IEnumIDList* This);
void __RPC_STUB IEnumIDList_Reset_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumIDList_Clone_Proxy(
    IEnumIDList* This,
    IEnumIDList** ppenum);
void __RPC_STUB IEnumIDList_Clone_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEnumIDList_INTERFACE_DEFINED__ */

#ifndef __IShellFolder_FWD_DEFINED__
#define __IShellFolder_FWD_DEFINED__
typedef struct IShellFolder IShellFolder;
#endif

typedef IShellFolder *LPSHELLFOLDER;

typedef enum tagSHGDN {
    SHGDN_NORMAL = 0,
    SHGDN_INFOLDER = 1,
    SHGDN_FOREDITING = 0x1000,
    SHGDN_INCLUDE_NONFILESYS = 0x2000,
    SHGDN_FORADDRESSBAR = 0x4000,
    SHGDN_FORPARSING = 0x8000
} SHGNO;

typedef DWORD SHGDNF;

enum tagSHCONTF {
    SHCONTF_FOLDERS = 32,
    SHCONTF_NONFOLDERS = 64,
    SHCONTF_INCLUDEHIDDEN = 128,
    SHCONTF_INIT_ON_FIRST_NEXT = 256,
    SHCONTF_NETPRINTERSRCH = 512,
    SHCONTF_SHAREABLE = 1024,
    SHCONTF_STORAGE = 2048
};

typedef DWORD SHCONTF;

#define SFGAO_CANCOPY           DROPEFFECT_COPY
#define SFGAO_CANMOVE           DROPEFFECT_MOVE
#define SFGAO_CANLINK           DROPEFFECT_LINK
#define SFGAO_CANRENAME         0x00000010L
#define SFGAO_CANDELETE         0x00000020L
#define SFGAO_HASPROPSHEET      0x00000040L
#define SFGAO_DROPTARGET        0x00000100L
#define SFGAO_CAPABILITYMASK    0x00000177L
#define SFGAO_LINK              0x00010000L
#define SFGAO_SHARE             0x00020000L
#define SFGAO_READONLY          0x00040000L
#define SFGAO_GHOSTED           0x00080000L
#define SFGAO_HIDDEN            0x00080000L
#define SFGAO_DISPLAYATTRMASK   0x000F0000L
#define SFGAO_FILESYSANCESTOR   0x10000000L
#define SFGAO_FOLDER            0x20000000L
#define SFGAO_FILESYSTEM        0x40000000L
#define SFGAO_HASSUBFOLDER      0x80000000L
#define SFGAO_CONTENTSMASK      0x80000000L
#define SFGAO_VALIDATE          0x01000000L
#define SFGAO_REMOVABLE         0x02000000L
#define SFGAO_COMPRESSED        0x04000000L
#define SFGAO_BROWSABLE         0x08000000L
#define SFGAO_NONENUMERATED     0x00100000L
#define SFGAO_NEWCONTENT        0x00200000L
typedef ULONG SFGAOF;

/*****************************************************************************
 * IShellFolder interface
 */
#ifndef __IShellFolder_INTERFACE_DEFINED__
#define __IShellFolder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellFolder, 0x000214e6, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IShellFolder : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ParseDisplayName(
        HWND hwndOwner,
        LPBC pbcReserved,
        LPOLESTR lpszDisplayName,
        ULONG* pchEaten,
        LPITEMIDLIST* ppidl,
        ULONG* pdwAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumObjects(
        HWND hwndOwner,
        SHCONTF grfFlags,
        IEnumIDList** ppenumIDList) = 0;

    virtual HRESULT STDMETHODCALLTYPE BindToObject(
        LPCITEMIDLIST pidl,
        LPBC pbcReserved,
        REFIID riid,
        void** ppvOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE BindToStorage(
        LPCITEMIDLIST pidl,
        LPBC pbcReserved,
        REFIID riid,
        void** ppvObj) = 0;

    virtual HRESULT STDMETHODCALLTYPE CompareIDs(
        LPARAM lParam,
        LPCITEMIDLIST pidl1,
        LPCITEMIDLIST pidl2) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateViewObject(
        HWND hwndOwner,
        REFIID riid,
        void** ppvOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAttributesOf(
        UINT cidl,
        LPCITEMIDLIST* apidl,
        SFGAOF* rgfInOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUIObjectOf(
        HWND hwndOwner,
        UINT cidl,
        LPCITEMIDLIST* apidl,
        REFIID riid,
        UINT* prgfInOut,
        void** ppvOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDisplayNameOf(
        LPCITEMIDLIST pidl,
        SHGDNF uFlags,
        STRRET* lpName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetNameOf(
        HWND hwnd,
        LPCITEMIDLIST pidl,
        LPCOLESTR lpszName,
        SHGDNF uFlags,
        LPITEMIDLIST* ppidlOut) = 0;

};
#else
typedef struct IShellFolderVtbl IShellFolderVtbl;
struct IShellFolder {
    const IShellFolderVtbl* lpVtbl;
};
struct IShellFolderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IShellFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *ParseDisplayName)(
        IShellFolder* This,
        HWND hwndOwner,
        LPBC pbcReserved,
        LPOLESTR lpszDisplayName,
        ULONG* pchEaten,
        LPITEMIDLIST* ppidl,
        ULONG* pdwAttributes);

    HRESULT (STDMETHODCALLTYPE *EnumObjects)(
        IShellFolder* This,
        HWND hwndOwner,
        SHCONTF grfFlags,
        IEnumIDList** ppenumIDList);

    HRESULT (STDMETHODCALLTYPE *BindToObject)(
        IShellFolder* This,
        LPCITEMIDLIST pidl,
        LPBC pbcReserved,
        REFIID riid,
        void** ppvOut);

    HRESULT (STDMETHODCALLTYPE *BindToStorage)(
        IShellFolder* This,
        LPCITEMIDLIST pidl,
        LPBC pbcReserved,
        REFIID riid,
        void** ppvObj);

    HRESULT (STDMETHODCALLTYPE *CompareIDs)(
        IShellFolder* This,
        LPARAM lParam,
        LPCITEMIDLIST pidl1,
        LPCITEMIDLIST pidl2);

    HRESULT (STDMETHODCALLTYPE *CreateViewObject)(
        IShellFolder* This,
        HWND hwndOwner,
        REFIID riid,
        void** ppvOut);

    HRESULT (STDMETHODCALLTYPE *GetAttributesOf)(
        IShellFolder* This,
        UINT cidl,
        LPCITEMIDLIST* apidl,
        SFGAOF* rgfInOut);

    HRESULT (STDMETHODCALLTYPE *GetUIObjectOf)(
        IShellFolder* This,
        HWND hwndOwner,
        UINT cidl,
        LPCITEMIDLIST* apidl,
        REFIID riid,
        UINT* prgfInOut,
        void** ppvOut);

    HRESULT (STDMETHODCALLTYPE *GetDisplayNameOf)(
        IShellFolder* This,
        LPCITEMIDLIST pidl,
        SHGDNF uFlags,
        STRRET* lpName);

    HRESULT (STDMETHODCALLTYPE *SetNameOf)(
        IShellFolder* This,
        HWND hwnd,
        LPCITEMIDLIST pidl,
        LPCOLESTR lpszName,
        SHGDNF uFlags,
        LPITEMIDLIST* ppidlOut);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IShellFolder_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IShellFolder_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IShellFolder_Release(p) (p)->lpVtbl->Release(p)
/*** IShellFolder methods ***/
#define IShellFolder_ParseDisplayName(p,a,b,c,d,e,f) (p)->lpVtbl->ParseDisplayName(p,a,b,c,d,e,f)
#define IShellFolder_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c)
#define IShellFolder_BindToObject(p,a,b,c,d) (p)->lpVtbl->BindToObject(p,a,b,c,d)
#define IShellFolder_BindToStorage(p,a,b,c,d) (p)->lpVtbl->BindToStorage(p,a,b,c,d)
#define IShellFolder_CompareIDs(p,a,b,c) (p)->lpVtbl->CompareIDs(p,a,b,c)
#define IShellFolder_CreateViewObject(p,a,b,c) (p)->lpVtbl->CreateViewObject(p,a,b,c)
#define IShellFolder_GetAttributesOf(p,a,b,c) (p)->lpVtbl->GetAttributesOf(p,a,b,c)
#define IShellFolder_GetUIObjectOf(p,a,b,c,d,e,f) (p)->lpVtbl->GetUIObjectOf(p,a,b,c,d,e,f)
#define IShellFolder_GetDisplayNameOf(p,a,b,c) (p)->lpVtbl->GetDisplayNameOf(p,a,b,c)
#define IShellFolder_SetNameOf(p,a,b,c,d,e) (p)->lpVtbl->SetNameOf(p,a,b,c,d,e)
#endif

#endif

#define IShellFolder_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IShellFolder methods ***/ \
    STDMETHOD_(HRESULT,ParseDisplayName)(THIS_ HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName, ULONG* pchEaten, LPITEMIDLIST* ppidl, ULONG* pdwAttributes) PURE; \
    STDMETHOD_(HRESULT,EnumObjects)(THIS_ HWND hwndOwner, SHCONTF grfFlags, IEnumIDList** ppenumIDList) PURE; \
    STDMETHOD_(HRESULT,BindToObject)(THIS_ LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, void** ppvOut) PURE; \
    STDMETHOD_(HRESULT,BindToStorage)(THIS_ LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, void** ppvObj) PURE; \
    STDMETHOD_(HRESULT,CompareIDs)(THIS_ LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) PURE; \
    STDMETHOD_(HRESULT,CreateViewObject)(THIS_ HWND hwndOwner, REFIID riid, void** ppvOut) PURE; \
    STDMETHOD_(HRESULT,GetAttributesOf)(THIS_ UINT cidl, LPCITEMIDLIST* apidl, SFGAOF* rgfInOut) PURE; \
    STDMETHOD_(HRESULT,GetUIObjectOf)(THIS_ HWND hwndOwner, UINT cidl, LPCITEMIDLIST* apidl, REFIID riid, UINT* prgfInOut, void** ppvOut) PURE; \
    STDMETHOD_(HRESULT,GetDisplayNameOf)(THIS_ LPCITEMIDLIST pidl, SHGDNF uFlags, STRRET* lpName) PURE; \
    STDMETHOD_(HRESULT,SetNameOf)(THIS_ HWND hwnd, LPCITEMIDLIST pidl, LPCOLESTR lpszName, SHGDNF uFlags, LPITEMIDLIST* ppidlOut) PURE;

HRESULT CALLBACK IShellFolder_ParseDisplayName_Proxy(
    IShellFolder* This,
    HWND hwndOwner,
    LPBC pbcReserved,
    LPOLESTR lpszDisplayName,
    ULONG* pchEaten,
    LPITEMIDLIST* ppidl,
    ULONG* pdwAttributes);
void __RPC_STUB IShellFolder_ParseDisplayName_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder_EnumObjects_Proxy(
    IShellFolder* This,
    HWND hwndOwner,
    SHCONTF grfFlags,
    IEnumIDList** ppenumIDList);
void __RPC_STUB IShellFolder_EnumObjects_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder_BindToObject_Proxy(
    IShellFolder* This,
    LPCITEMIDLIST pidl,
    LPBC pbcReserved,
    REFIID riid,
    void** ppvOut);
void __RPC_STUB IShellFolder_BindToObject_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder_BindToStorage_Proxy(
    IShellFolder* This,
    LPCITEMIDLIST pidl,
    LPBC pbcReserved,
    REFIID riid,
    void** ppvObj);
void __RPC_STUB IShellFolder_BindToStorage_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder_CompareIDs_Proxy(
    IShellFolder* This,
    LPARAM lParam,
    LPCITEMIDLIST pidl1,
    LPCITEMIDLIST pidl2);
void __RPC_STUB IShellFolder_CompareIDs_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder_CreateViewObject_Proxy(
    IShellFolder* This,
    HWND hwndOwner,
    REFIID riid,
    void** ppvOut);
void __RPC_STUB IShellFolder_CreateViewObject_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder_GetAttributesOf_Proxy(
    IShellFolder* This,
    UINT cidl,
    LPCITEMIDLIST* apidl,
    SFGAOF* rgfInOut);
void __RPC_STUB IShellFolder_GetAttributesOf_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder_GetUIObjectOf_Proxy(
    IShellFolder* This,
    HWND hwndOwner,
    UINT cidl,
    LPCITEMIDLIST* apidl,
    REFIID riid,
    UINT* prgfInOut,
    void** ppvOut);
void __RPC_STUB IShellFolder_GetUIObjectOf_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder_GetDisplayNameOf_Proxy(
    IShellFolder* This,
    LPCITEMIDLIST pidl,
    SHGDNF uFlags,
    STRRET* lpName);
void __RPC_STUB IShellFolder_GetDisplayNameOf_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder_SetNameOf_Proxy(
    IShellFolder* This,
    HWND hwnd,
    LPCITEMIDLIST pidl,
    LPCOLESTR lpszName,
    SHGDNF uFlags,
    LPITEMIDLIST* ppidlOut);
void __RPC_STUB IShellFolder_SetNameOf_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IShellFolder_INTERFACE_DEFINED__ */

#ifndef __IEnumExtraSearch_FWD_DEFINED__
#define __IEnumExtraSearch_FWD_DEFINED__
typedef struct IEnumExtraSearch IEnumExtraSearch;
#endif

typedef IEnumExtraSearch *LPENUMEXTRASEARCH;

typedef struct {
    GUID guidSearch;
    WCHAR wszFriendlyName[80];
    WCHAR wszUrl[2084];
} EXTRASEARCH, *LPEXTRASEARCH;

/*****************************************************************************
 * IEnumExtraSearch interface
 */
#ifndef __IEnumExtraSearch_INTERFACE_DEFINED__
#define __IEnumExtraSearch_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumExtraSearch, 0x0e700be1, 0x9db6, 0x11d1, 0xa1,0xce, 0x00,0xc0,0x4f,0xd7,0x5d,0x13);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IEnumExtraSearch : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        EXTRASEARCH* rgelt,
        ULONG* pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumExtraSearch** ppenum) = 0;

};
#else
typedef struct IEnumExtraSearchVtbl IEnumExtraSearchVtbl;
struct IEnumExtraSearch {
    const IEnumExtraSearchVtbl* lpVtbl;
};
struct IEnumExtraSearchVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumExtraSearch methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumExtraSearch* This,
        ULONG celt,
        EXTRASEARCH* rgelt,
        ULONG* pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumExtraSearch* This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumExtraSearch* This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumExtraSearch* This,
        IEnumExtraSearch** ppenum);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IEnumExtraSearch_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IEnumExtraSearch_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IEnumExtraSearch_Release(p) (p)->lpVtbl->Release(p)
/*** IEnumExtraSearch methods ***/
#define IEnumExtraSearch_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c)
#define IEnumExtraSearch_Skip(p,a) (p)->lpVtbl->Skip(p,a)
#define IEnumExtraSearch_Reset(p) (p)->lpVtbl->Reset(p)
#define IEnumExtraSearch_Clone(p,a) (p)->lpVtbl->Clone(p,a)
#endif

#endif

#define IEnumExtraSearch_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IEnumExtraSearch methods ***/ \
    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, EXTRASEARCH* rgelt, ULONG* pceltFetched) PURE; \
    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \
    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumExtraSearch** ppenum) PURE;

HRESULT CALLBACK IEnumExtraSearch_Next_Proxy(
    IEnumExtraSearch* This,
    ULONG celt,
    EXTRASEARCH* rgelt,
    ULONG* pceltFetched);
void __RPC_STUB IEnumExtraSearch_Next_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumExtraSearch_Skip_Proxy(
    IEnumExtraSearch* This,
    ULONG celt);
void __RPC_STUB IEnumExtraSearch_Skip_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumExtraSearch_Reset_Proxy(
    IEnumExtraSearch* This);
void __RPC_STUB IEnumExtraSearch_Reset_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumExtraSearch_Clone_Proxy(
    IEnumExtraSearch* This,
    IEnumExtraSearch** ppenum);
void __RPC_STUB IEnumExtraSearch_Clone_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEnumExtraSearch_INTERFACE_DEFINED__ */

#ifndef __IShellFolder2_FWD_DEFINED__
#define __IShellFolder2_FWD_DEFINED__
typedef struct IShellFolder2 IShellFolder2;
#endif

typedef enum {
    SHCOLSTATE_TYPE_STR = 0x1,
    SHCOLSTATE_TYPE_INT = 0x2,
    SHCOLSTATE_TYPE_DATE = 0x3,
    SHCOLSTATE_TYPEMASK = 0xf,
    SHCOLSTATE_ONBYDEFAULT = 0x10,
    SHCOLSTATE_SLOW = 0x20,
    SHCOLSTATE_EXTENDED = 0x40,
    SHCOLSTATE_SECONDARYUI = 0x80,
    SHCOLSTATE_HIDDEN = 0x100,
    SHCOLSTATE_PREFER_VARCMP = 0x200
} SHCOLSTATE;

typedef DWORD SHCOLSTATEF;

typedef struct {
    GUID fmtid;
    DWORD pid;
} SHCOLUMNID, *LPSHCOLUMNID;

typedef const SHCOLUMNID *LPCSHCOLUMNID;

/*****************************************************************************
 * IShellFolder2 interface
 */
#ifndef __IShellFolder2_INTERFACE_DEFINED__
#define __IShellFolder2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellFolder2, 0x93f2f68c, 0x1d1b, 0x11d3, 0xa3,0x0e, 0x00,0xc0,0x4f,0x79,0xab,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IShellFolder2 : public IShellFolder
{
    virtual HRESULT STDMETHODCALLTYPE GetDefaultSearchGUID(
        GUID* lpguid) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumSearches(
        IEnumExtraSearch** ppenum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultColumn(
        DWORD dwReserved,
        ULONG* pSort,
        ULONG* pDisplay) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultColumnState(
        UINT iColumn,
        SHCOLSTATEF* pcsFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDetailsEx(
        LPCITEMIDLIST pidl,
        const SHCOLUMNID* pscid,
        VARIANT* pv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDetailsOf(
        LPCITEMIDLIST pidl,
        UINT iColumn,
        SHELLDETAILS* psd) = 0;

    virtual HRESULT STDMETHODCALLTYPE MapColumnToSCID(
        UINT iColumn,
        SHCOLUMNID* pscid) = 0;

};
#else
typedef struct IShellFolder2Vtbl IShellFolder2Vtbl;
struct IShellFolder2 {
    const IShellFolder2Vtbl* lpVtbl;
};
struct IShellFolder2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IShellFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *ParseDisplayName)(
        IShellFolder2* This,
        HWND hwndOwner,
        LPBC pbcReserved,
        LPOLESTR lpszDisplayName,
        ULONG* pchEaten,
        LPITEMIDLIST* ppidl,
        ULONG* pdwAttributes);

    HRESULT (STDMETHODCALLTYPE *EnumObjects)(
        IShellFolder2* This,
        HWND hwndOwner,
        SHCONTF grfFlags,
        IEnumIDList** ppenumIDList);

    HRESULT (STDMETHODCALLTYPE *BindToObject)(
        IShellFolder2* This,
        LPCITEMIDLIST pidl,
        LPBC pbcReserved,
        REFIID riid,
        void** ppvOut);

    HRESULT (STDMETHODCALLTYPE *BindToStorage)(
        IShellFolder2* This,
        LPCITEMIDLIST pidl,
        LPBC pbcReserved,
        REFIID riid,
        void** ppvObj);

    HRESULT (STDMETHODCALLTYPE *CompareIDs)(
        IShellFolder2* This,
        LPARAM lParam,
        LPCITEMIDLIST pidl1,
        LPCITEMIDLIST pidl2);

    HRESULT (STDMETHODCALLTYPE *CreateViewObject)(
        IShellFolder2* This,
        HWND hwndOwner,
        REFIID riid,
        void** ppvOut);

    HRESULT (STDMETHODCALLTYPE *GetAttributesOf)(
        IShellFolder2* This,
        UINT cidl,
        LPCITEMIDLIST* apidl,
        SFGAOF* rgfInOut);

    HRESULT (STDMETHODCALLTYPE *GetUIObjectOf)(
        IShellFolder2* This,
        HWND hwndOwner,
        UINT cidl,
        LPCITEMIDLIST* apidl,
        REFIID riid,
        UINT* prgfInOut,
        void** ppvOut);

    HRESULT (STDMETHODCALLTYPE *GetDisplayNameOf)(
        IShellFolder2* This,
        LPCITEMIDLIST pidl,
        SHGDNF uFlags,
        STRRET* lpName);

    HRESULT (STDMETHODCALLTYPE *SetNameOf)(
        IShellFolder2* This,
        HWND hwnd,
        LPCITEMIDLIST pidl,
        LPCOLESTR lpszName,
        SHGDNF uFlags,
        LPITEMIDLIST* ppidlOut);

    /*** IShellFolder2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDefaultSearchGUID)(
        IShellFolder2* This,
        GUID* lpguid);

    HRESULT (STDMETHODCALLTYPE *EnumSearches)(
        IShellFolder2* This,
        IEnumExtraSearch** ppenum);

    HRESULT (STDMETHODCALLTYPE *GetDefaultColumn)(
        IShellFolder2* This,
        DWORD dwReserved,
        ULONG* pSort,
        ULONG* pDisplay);

    HRESULT (STDMETHODCALLTYPE *GetDefaultColumnState)(
        IShellFolder2* This,
        UINT iColumn,
        SHCOLSTATEF* pcsFlags);

    HRESULT (STDMETHODCALLTYPE *GetDetailsEx)(
        IShellFolder2* This,
        LPCITEMIDLIST pidl,
        const SHCOLUMNID* pscid,
        VARIANT* pv);

    HRESULT (STDMETHODCALLTYPE *GetDetailsOf)(
        IShellFolder2* This,
        LPCITEMIDLIST pidl,
        UINT iColumn,
        SHELLDETAILS* psd);

    HRESULT (STDMETHODCALLTYPE *MapColumnToSCID)(
        IShellFolder2* This,
        UINT iColumn,
        SHCOLUMNID* pscid);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IShellFolder2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IShellFolder2_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IShellFolder2_Release(p) (p)->lpVtbl->Release(p)
/*** IShellFolder methods ***/
#define IShellFolder2_ParseDisplayName(p,a,b,c,d,e,f) (p)->lpVtbl->ParseDisplayName(p,a,b,c,d,e,f)
#define IShellFolder2_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c)
#define IShellFolder2_BindToObject(p,a,b,c,d) (p)->lpVtbl->BindToObject(p,a,b,c,d)
#define IShellFolder2_BindToStorage(p,a,b,c,d) (p)->lpVtbl->BindToStorage(p,a,b,c,d)
#define IShellFolder2_CompareIDs(p,a,b,c) (p)->lpVtbl->CompareIDs(p,a,b,c)
#define IShellFolder2_CreateViewObject(p,a,b,c) (p)->lpVtbl->CreateViewObject(p,a,b,c)
#define IShellFolder2_GetAttributesOf(p,a,b,c) (p)->lpVtbl->GetAttributesOf(p,a,b,c)
#define IShellFolder2_GetUIObjectOf(p,a,b,c,d,e,f) (p)->lpVtbl->GetUIObjectOf(p,a,b,c,d,e,f)
#define IShellFolder2_GetDisplayNameOf(p,a,b,c) (p)->lpVtbl->GetDisplayNameOf(p,a,b,c)
#define IShellFolder2_SetNameOf(p,a,b,c,d,e) (p)->lpVtbl->SetNameOf(p,a,b,c,d,e)
/*** IShellFolder2 methods ***/
#define IShellFolder2_GetDefaultSearchGUID(p,a) (p)->lpVtbl->GetDefaultSearchGUID(p,a)
#define IShellFolder2_EnumSearches(p,a) (p)->lpVtbl->EnumSearches(p,a)
#define IShellFolder2_GetDefaultColumn(p,a,b,c) (p)->lpVtbl->GetDefaultColumn(p,a,b,c)
#define IShellFolder2_GetDefaultColumnState(p,a,b) (p)->lpVtbl->GetDefaultColumnState(p,a,b)
#define IShellFolder2_GetDetailsEx(p,a,b,c) (p)->lpVtbl->GetDetailsEx(p,a,b,c)
#define IShellFolder2_GetDetailsOf(p,a,b,c) (p)->lpVtbl->GetDetailsOf(p,a,b,c)
#define IShellFolder2_MapColumnToSCID(p,a,b) (p)->lpVtbl->MapColumnToSCID(p,a,b)
#endif

#endif

#define IShellFolder2_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IShellFolder methods ***/ \
    STDMETHOD_(HRESULT,ParseDisplayName)(THIS_ HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName, ULONG* pchEaten, LPITEMIDLIST* ppidl, ULONG* pdwAttributes) PURE; \
    STDMETHOD_(HRESULT,EnumObjects)(THIS_ HWND hwndOwner, SHCONTF grfFlags, IEnumIDList** ppenumIDList) PURE; \
    STDMETHOD_(HRESULT,BindToObject)(THIS_ LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, void** ppvOut) PURE; \
    STDMETHOD_(HRESULT,BindToStorage)(THIS_ LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, void** ppvObj) PURE; \
    STDMETHOD_(HRESULT,CompareIDs)(THIS_ LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) PURE; \
    STDMETHOD_(HRESULT,CreateViewObject)(THIS_ HWND hwndOwner, REFIID riid, void** ppvOut) PURE; \
    STDMETHOD_(HRESULT,GetAttributesOf)(THIS_ UINT cidl, LPCITEMIDLIST* apidl, SFGAOF* rgfInOut) PURE; \
    STDMETHOD_(HRESULT,GetUIObjectOf)(THIS_ HWND hwndOwner, UINT cidl, LPCITEMIDLIST* apidl, REFIID riid, UINT* prgfInOut, void** ppvOut) PURE; \
    STDMETHOD_(HRESULT,GetDisplayNameOf)(THIS_ LPCITEMIDLIST pidl, SHGDNF uFlags, STRRET* lpName) PURE; \
    STDMETHOD_(HRESULT,SetNameOf)(THIS_ HWND hwnd, LPCITEMIDLIST pidl, LPCOLESTR lpszName, SHGDNF uFlags, LPITEMIDLIST* ppidlOut) PURE; \
    /*** IShellFolder2 methods ***/ \
    STDMETHOD_(HRESULT,GetDefaultSearchGUID)(THIS_ GUID* lpguid) PURE; \
    STDMETHOD_(HRESULT,EnumSearches)(THIS_ IEnumExtraSearch** ppenum) PURE; \
    STDMETHOD_(HRESULT,GetDefaultColumn)(THIS_ DWORD dwReserved, ULONG* pSort, ULONG* pDisplay) PURE; \
    STDMETHOD_(HRESULT,GetDefaultColumnState)(THIS_ UINT iColumn, SHCOLSTATEF* pcsFlags) PURE; \
    STDMETHOD_(HRESULT,GetDetailsEx)(THIS_ LPCITEMIDLIST pidl, const SHCOLUMNID* pscid, VARIANT* pv) PURE; \
    STDMETHOD_(HRESULT,GetDetailsOf)(THIS_ LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS* psd) PURE; \
    STDMETHOD_(HRESULT,MapColumnToSCID)(THIS_ UINT iColumn, SHCOLUMNID* pscid) PURE;

HRESULT CALLBACK IShellFolder2_GetDefaultSearchGUID_Proxy(
    IShellFolder2* This,
    GUID* lpguid);
void __RPC_STUB IShellFolder2_GetDefaultSearchGUID_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder2_EnumSearches_Proxy(
    IShellFolder2* This,
    IEnumExtraSearch** ppenum);
void __RPC_STUB IShellFolder2_EnumSearches_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder2_GetDefaultColumn_Proxy(
    IShellFolder2* This,
    DWORD dwReserved,
    ULONG* pSort,
    ULONG* pDisplay);
void __RPC_STUB IShellFolder2_GetDefaultColumn_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder2_GetDefaultColumnState_Proxy(
    IShellFolder2* This,
    UINT iColumn,
    SHCOLSTATEF* pcsFlags);
void __RPC_STUB IShellFolder2_GetDefaultColumnState_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder2_GetDetailsEx_Proxy(
    IShellFolder2* This,
    LPCITEMIDLIST pidl,
    const SHCOLUMNID* pscid,
    VARIANT* pv);
void __RPC_STUB IShellFolder2_GetDetailsEx_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder2_GetDetailsOf_Proxy(
    IShellFolder2* This,
    LPCITEMIDLIST pidl,
    UINT iColumn,
    SHELLDETAILS* psd);
void __RPC_STUB IShellFolder2_GetDetailsOf_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder2_MapColumnToSCID_Proxy(
    IShellFolder2* This,
    UINT iColumn,
    SHCOLUMNID* pscid);
void __RPC_STUB IShellFolder2_MapColumnToSCID_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IShellFolder2_INTERFACE_DEFINED__ */

typedef char *LPVIEWSETTINGS;

typedef enum {
    FWF_AUTOARRANGE = 0x1,
    FWF_ABBREVIATEDNAMES = 0x2,
    FWF_SNAPTOGRID = 0x4,
    FWF_OWNERDATA = 0x8,
    FWF_BESTFITWINDOW = 0x10,
    FWF_DESKTOP = 0x20,
    FWF_SINGLESEL = 0x40,
    FWF_NOSUBFOLDERS = 0x80,
    FWF_TRANSPARENT = 0x100,
    FWF_NOCLIENTEDGE = 0x200,
    FWF_NOSCROLL = 0x400,
    FWF_ALIGNLEFT = 0x800,
    FWF_NOICONS = 0x1000,
    FWF_SHOWSELALWAYS = 0x2000,
    FWF_NOVISIBLE = 0x4000,
    FWF_SINGLECLICKACTIVATE = 0x8000,
    FWF_NOWEBVIEW = 0x10000,
    FWF_HIDEFILENAMES = 0x20000,
    FWF_CHECKSELECT = 0x40000
} FOLDERFLAGS;

typedef enum {
    FVM_ICON = 1,
    FVM_FIRST = FVM_ICON,
    FVM_SMALLICON = 2,
    FVM_LIST = 3,
    FVM_DETAILS = 4,
    FVM_THUMBNAIL = 5,
    FVM_TILE = 6,
    FVM_THUMBSTRIP = 7,
    FVM_LAST = FVM_THUMBSTRIP
} FOLDERVIEWMODE;

typedef struct {
    UINT ViewMode;
    UINT fFlags;
} FOLDERSETTINGS, *PFOLDERSETTINGS, *LPFOLDERSETTINGS;

typedef const FOLDERSETTINGS *LPCFOLDERSETTINGS;

#ifndef __IShellBrowser_FWD_DEFINED__
#define __IShellBrowser_FWD_DEFINED__
typedef struct IShellBrowser IShellBrowser;
#endif

#ifndef __IShellView_FWD_DEFINED__
#define __IShellView_FWD_DEFINED__
typedef struct IShellView IShellView;
#endif

typedef IShellView *LPSHELLVIEW;

#define SVSI_DESELECT       0x00000000
#define SVSI_SELECT         0x00000001
#define SVSI_EDIT           0x00000003
#define SVSI_DESELECTOTHERS 0x00000004
#define SVSI_ENSUREVISIBLE  0x00000008
#define SVSI_FOCUSED        0x00000010
#define SVSI_TRANSLATEPT    0x00000020
#define SVSI_SELECTIONMARK  0x00000040
#define SVSI_POSITIONITEM   0x00000080
#define SVSI_CHECK          0x00000100
#define SVSI_NOSTATECHANGE  0x80000000
typedef UINT SVSIF;

typedef enum {
    SVGIO_BACKGROUND = 0x0,
    SVGIO_SELECTION = 0x1,
    SVGIO_ALLVIEW = 0x2,
    SVGIO_CHECKED = 0x3,
    SVGIO_TYPE_MASK = 0xf,
    SVGIO_FLAG_VIEWORDER = 0x80000000
} SVGIO;

typedef enum {
    SVUIA_DEACTIVATE = 0,
    SVUIA_ACTIVATE_NOFOCUS = 1,
    SVUIA_ACTIVATE_FOCUS = 2,
    SVUIA_INPLACEACTIVATE = 3
} SVUIA_STATUS;

#if 0
typedef LPARAM LPFNSVADDPROPSHEETPAGE;

#else
#include <prsht.h>
typedef LPFNADDPROPSHEETPAGE LPFNSVADDPROPSHEETPAGE;
#endif
/*****************************************************************************
 * IShellView interface
 */
#ifndef __IShellView_INTERFACE_DEFINED__
#define __IShellView_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellView, 0x000214e3, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IShellView : public IOleWindow
{
    virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(
        MSG* pmsg) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableModeless(
        BOOL fEnable) = 0;

    virtual HRESULT STDMETHODCALLTYPE UIActivate(
        UINT uState) = 0;

    virtual HRESULT STDMETHODCALLTYPE Refresh(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateViewWindow(
        IShellView* psvPrevious,
        LPCFOLDERSETTINGS lpfs,
        IShellBrowser* psb,
        RECT* prcView,
        HWND* phWnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE DestroyViewWindow(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentInfo(
        LPFOLDERSETTINGS lpfs) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddPropertySheetPages(
        DWORD dwReserved,
        LPFNSVADDPROPSHEETPAGE pfn,
        LPARAM lparam) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveViewState(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectItem(
        LPCITEMIDLIST pidlItem,
        SVSIF uFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItemObject(
        UINT uItem,
        REFIID riid,
        void** ppv) = 0;

};
#else
typedef struct IShellViewVtbl IShellViewVtbl;
struct IShellView {
    const IShellViewVtbl* lpVtbl;
};
struct IShellViewVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOleWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IShellView* This,
        HWND* phwnd);

    HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)(
        IShellView* This,
        BOOL fEnterMode);

    /*** IShellView methods ***/
    HRESULT (STDMETHODCALLTYPE *TranslateAccelerator)(
        IShellView* This,
        MSG* pmsg);

    HRESULT (STDMETHODCALLTYPE *EnableModeless)(
        IShellView* This,
        BOOL fEnable);

    HRESULT (STDMETHODCALLTYPE *UIActivate)(
        IShellView* This,
        UINT uState);

    HRESULT (STDMETHODCALLTYPE *Refresh)(
        IShellView* This);

    HRESULT (STDMETHODCALLTYPE *CreateViewWindow)(
        IShellView* This,
        IShellView* psvPrevious,
        LPCFOLDERSETTINGS lpfs,
        IShellBrowser* psb,
        RECT* prcView,
        HWND* phWnd);

    HRESULT (STDMETHODCALLTYPE *DestroyViewWindow)(
        IShellView* This);

    HRESULT (STDMETHODCALLTYPE *GetCurrentInfo)(
        IShellView* This,
        LPFOLDERSETTINGS lpfs);

    HRESULT (STDMETHODCALLTYPE *AddPropertySheetPages)(
        IShellView* This,
        DWORD dwReserved,
        LPFNSVADDPROPSHEETPAGE pfn,
        LPARAM lparam);

    HRESULT (STDMETHODCALLTYPE *SaveViewState)(
        IShellView* This);

    HRESULT (STDMETHODCALLTYPE *SelectItem)(
        IShellView* This,
        LPCITEMIDLIST pidlItem,
        SVSIF uFlags);

    HRESULT (STDMETHODCALLTYPE *GetItemObject)(
        IShellView* This,
        UINT uItem,
        REFIID riid,
        void** ppv);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IShellView_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IShellView_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IShellView_Release(p) (p)->lpVtbl->Release(p)
/*** IOleWindow methods ***/
#define IShellView_GetWindow(p,a) (p)->lpVtbl->GetWindow(p,a)
#define IShellView_ContextSensitiveHelp(p,a) (p)->lpVtbl->ContextSensitiveHelp(p,a)
/*** IShellView methods ***/
#define IShellView_TranslateAccelerator(p,a) (p)->lpVtbl->TranslateAccelerator(p,a)
#define IShellView_EnableModeless(p,a) (p)->lpVtbl->EnableModeless(p,a)
#define IShellView_UIActivate(p,a) (p)->lpVtbl->UIActivate(p,a)
#define IShellView_Refresh(p) (p)->lpVtbl->Refresh(p)
#define IShellView_CreateViewWindow(p,a,b,c,d,e) (p)->lpVtbl->CreateViewWindow(p,a,b,c,d,e)
#define IShellView_DestroyViewWindow(p) (p)->lpVtbl->DestroyViewWindow(p)
#define IShellView_GetCurrentInfo(p,a) (p)->lpVtbl->GetCurrentInfo(p,a)
#define IShellView_AddPropertySheetPages(p,a,b,c) (p)->lpVtbl->AddPropertySheetPages(p,a,b,c)
#define IShellView_SaveViewState(p) (p)->lpVtbl->SaveViewState(p)
#define IShellView_SelectItem(p,a,b) (p)->lpVtbl->SelectItem(p,a,b)
#define IShellView_GetItemObject(p,a,b,c) (p)->lpVtbl->GetItemObject(p,a,b,c)
#endif

#endif

#define IShellView_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IOleWindow methods ***/ \
    STDMETHOD_(HRESULT,GetWindow)(THIS_ HWND* phwnd) PURE; \
    STDMETHOD_(HRESULT,ContextSensitiveHelp)(THIS_ BOOL fEnterMode) PURE; \
    /*** IShellView methods ***/ \
    STDMETHOD_(HRESULT,TranslateAccelerator)(THIS_ MSG* pmsg) PURE; \
    STDMETHOD_(HRESULT,EnableModeless)(THIS_ BOOL fEnable) PURE; \
    STDMETHOD_(HRESULT,UIActivate)(THIS_ UINT uState) PURE; \
    STDMETHOD_(HRESULT,Refresh)(THIS) PURE; \
    STDMETHOD_(HRESULT,CreateViewWindow)(THIS_ IShellView* psvPrevious, LPCFOLDERSETTINGS lpfs, IShellBrowser* psb, RECT* prcView, HWND* phWnd) PURE; \
    STDMETHOD_(HRESULT,DestroyViewWindow)(THIS) PURE; \
    STDMETHOD_(HRESULT,GetCurrentInfo)(THIS_ LPFOLDERSETTINGS lpfs) PURE; \
    STDMETHOD_(HRESULT,AddPropertySheetPages)(THIS_ DWORD dwReserved, LPFNSVADDPROPSHEETPAGE pfn, LPARAM lparam) PURE; \
    STDMETHOD_(HRESULT,SaveViewState)(THIS) PURE; \
    STDMETHOD_(HRESULT,SelectItem)(THIS_ LPCITEMIDLIST pidlItem, SVSIF uFlags) PURE; \
    STDMETHOD_(HRESULT,GetItemObject)(THIS_ UINT uItem, REFIID riid, void** ppv) PURE;

HRESULT CALLBACK IShellView_TranslateAccelerator_Proxy(
    IShellView* This,
    MSG* pmsg);
void __RPC_STUB IShellView_TranslateAccelerator_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellView_EnableModeless_Proxy(
    IShellView* This,
    BOOL fEnable);
void __RPC_STUB IShellView_EnableModeless_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellView_UIActivate_Proxy(
    IShellView* This,
    UINT uState);
void __RPC_STUB IShellView_UIActivate_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellView_Refresh_Proxy(
    IShellView* This);
void __RPC_STUB IShellView_Refresh_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellView_CreateViewWindow_Proxy(
    IShellView* This,
    IShellView* psvPrevious,
    LPCFOLDERSETTINGS lpfs,
    IShellBrowser* psb,
    RECT* prcView,
    HWND* phWnd);
void __RPC_STUB IShellView_CreateViewWindow_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellView_DestroyViewWindow_Proxy(
    IShellView* This);
void __RPC_STUB IShellView_DestroyViewWindow_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellView_GetCurrentInfo_Proxy(
    IShellView* This,
    LPFOLDERSETTINGS lpfs);
void __RPC_STUB IShellView_GetCurrentInfo_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellView_SaveViewState_Proxy(
    IShellView* This);
void __RPC_STUB IShellView_SaveViewState_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellView_SelectItem_Proxy(
    IShellView* This,
    LPCITEMIDLIST pidlItem,
    SVSIF uFlags);
void __RPC_STUB IShellView_SelectItem_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellView_GetItemObject_Proxy(
    IShellView* This,
    UINT uItem,
    REFIID riid,
    void** ppv);
void __RPC_STUB IShellView_GetItemObject_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IShellView_INTERFACE_DEFINED__ */

typedef IShellBrowser *LPSHELLBROWSER;

#define SBSP_DEFBROWSER            0x00000000
#define SBSP_SAMEBROWSER           0x00000001
#define SBSP_NEWBROWSER            0x00000002
#define SBSP_DEFMODE               0x00000000
#define SBSP_OPENMODE              0x00000010
#define SBSP_EXPLOREMODE           0x00000020
#define SBSP_HELPMODE              0x00000040
#define SBSP_NOTRANSFERHIST        0x00000080
#define SBSP_ABSOLUTE              0x00000000
#define SBSP_RELATIVE              0x00001000
#define SBSP_PARENT                0x00002000
#define SBSP_NAVIGATEBACK          0x00004000
#define SBSP_NAVIGATEFORWARD       0x00008000
#define SBSP_ALLOW_AUTONAVIGATE    0x00010000
#define SBSP_NOAUTOSELECT          0x04000000
#define SBSP_WRITENOHISTORY        0x08000000
#define SBSP_REDIRECT              0x40000000
#define SBSP_INITIATEDBYHLINKFRAME 0x80000000
#define FCW_STATUS      0x0001
#define FCW_TOOLBAR     0x0002
#define FCW_TREE        0x0003
#define FCW_INTERNETBAR 0x0006
#define FCW_PROGRESS    0x0008
#define FCT_MERGE       0x0001
#define FCT_CONFIGABLE  0x0002
#define FCT_ADDTOEND    0x0004
#if 0
typedef LPARAM LPTBBUTTONSB;

#else
#include <commctrl.h>
typedef LPTBBUTTON LPTBBUTTONSB;
#endif
/*****************************************************************************
 * IShellBrowser interface
 */
#ifndef __IShellBrowser_INTERFACE_DEFINED__
#define __IShellBrowser_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellBrowser, 0x000214e2, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IShellBrowser : public IOleWindow
{
    virtual HRESULT STDMETHODCALLTYPE InsertMenusSB(
        HMENU hmenuShared,
        LPOLEMENUGROUPWIDTHS lpMenuWidths) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMenuSB(
        HMENU hmenuShared,
        HOLEMENU holemenuReserved,
        HWND hwndActiveObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveMenusSB(
        HMENU hmenuShared) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStatusTextSB(
        LPCOLESTR pszStatusText) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableModelessSB(
        BOOL fEnable) = 0;

    virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorSB(
        MSG* pmsg,
        WORD wID) = 0;

    virtual HRESULT STDMETHODCALLTYPE BrowseObject(
        LPCITEMIDLIST pidl,
        UINT wFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetViewStateStream(
        DWORD grfMode,
        IStream** ppStrm) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetControlWindow(
        UINT id,
        HWND* phwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendControlMsg(
        UINT id,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam,
        LRESULT* pret) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(
        IShellView** ppshv) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnViewWindowActive(
        IShellView* pshv) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetToolbarItems(
        LPTBBUTTONSB lpButtons,
        UINT nButtons,
        UINT uFlags) = 0;

};
#else
typedef struct IShellBrowserVtbl IShellBrowserVtbl;
struct IShellBrowser {
    const IShellBrowserVtbl* lpVtbl;
};
struct IShellBrowserVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOleWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IShellBrowser* This,
        HWND* phwnd);

    HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)(
        IShellBrowser* This,
        BOOL fEnterMode);

    /*** IShellBrowser methods ***/
    HRESULT (STDMETHODCALLTYPE *InsertMenusSB)(
        IShellBrowser* This,
        HMENU hmenuShared,
        LPOLEMENUGROUPWIDTHS lpMenuWidths);

    HRESULT (STDMETHODCALLTYPE *SetMenuSB)(
        IShellBrowser* This,
        HMENU hmenuShared,
        HOLEMENU holemenuReserved,
        HWND hwndActiveObject);

    HRESULT (STDMETHODCALLTYPE *RemoveMenusSB)(
        IShellBrowser* This,
        HMENU hmenuShared);

    HRESULT (STDMETHODCALLTYPE *SetStatusTextSB)(
        IShellBrowser* This,
        LPCOLESTR pszStatusText);

    HRESULT (STDMETHODCALLTYPE *EnableModelessSB)(
        IShellBrowser* This,
        BOOL fEnable);

    HRESULT (STDMETHODCALLTYPE *TranslateAcceleratorSB)(
        IShellBrowser* This,
        MSG* pmsg,
        WORD wID);

    HRESULT (STDMETHODCALLTYPE *BrowseObject)(
        IShellBrowser* This,
        LPCITEMIDLIST pidl,
        UINT wFlags);

    HRESULT (STDMETHODCALLTYPE *GetViewStateStream)(
        IShellBrowser* This,
        DWORD grfMode,
        IStream** ppStrm);

    HRESULT (STDMETHODCALLTYPE *GetControlWindow)(
        IShellBrowser* This,
        UINT id,
        HWND* phwnd);

    HRESULT (STDMETHODCALLTYPE *SendControlMsg)(
        IShellBrowser* This,
        UINT id,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam,
        LRESULT* pret);

    HRESULT (STDMETHODCALLTYPE *QueryActiveShellView)(
        IShellBrowser* This,
        IShellView** ppshv);

    HRESULT (STDMETHODCALLTYPE *OnViewWindowActive)(
        IShellBrowser* This,
        IShellView* pshv);

    HRESULT (STDMETHODCALLTYPE *SetToolbarItems)(
        IShellBrowser* This,
        LPTBBUTTONSB lpButtons,
        UINT nButtons,
        UINT uFlags);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IShellBrowser_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IShellBrowser_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IShellBrowser_Release(p) (p)->lpVtbl->Release(p)
/*** IOleWindow methods ***/
#define IShellBrowser_GetWindow(p,a) (p)->lpVtbl->GetWindow(p,a)
#define IShellBrowser_ContextSensitiveHelp(p,a) (p)->lpVtbl->ContextSensitiveHelp(p,a)
/*** IShellBrowser methods ***/
#define IShellBrowser_InsertMenusSB(p,a,b) (p)->lpVtbl->InsertMenusSB(p,a,b)
#define IShellBrowser_SetMenuSB(p,a,b,c) (p)->lpVtbl->SetMenuSB(p,a,b,c)
#define IShellBrowser_RemoveMenusSB(p,a) (p)->lpVtbl->RemoveMenusSB(p,a)
#define IShellBrowser_SetStatusTextSB(p,a) (p)->lpVtbl->SetStatusTextSB(p,a)
#define IShellBrowser_EnableModelessSB(p,a) (p)->lpVtbl->EnableModelessSB(p,a)
#define IShellBrowser_TranslateAcceleratorSB(p,a,b) (p)->lpVtbl->TranslateAcceleratorSB(p,a,b)
#define IShellBrowser_BrowseObject(p,a,b) (p)->lpVtbl->BrowseObject(p,a,b)
#define IShellBrowser_GetViewStateStream(p,a,b) (p)->lpVtbl->GetViewStateStream(p,a,b)
#define IShellBrowser_GetControlWindow(p,a,b) (p)->lpVtbl->GetControlWindow(p,a,b)
#define IShellBrowser_SendControlMsg(p,a,b,c,d,e) (p)->lpVtbl->SendControlMsg(p,a,b,c,d,e)
#define IShellBrowser_QueryActiveShellView(p,a) (p)->lpVtbl->QueryActiveShellView(p,a)
#define IShellBrowser_OnViewWindowActive(p,a) (p)->lpVtbl->OnViewWindowActive(p,a)
#define IShellBrowser_SetToolbarItems(p,a,b,c) (p)->lpVtbl->SetToolbarItems(p,a,b,c)
#endif

#endif

#define IShellBrowser_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IOleWindow methods ***/ \
    STDMETHOD_(HRESULT,GetWindow)(THIS_ HWND* phwnd) PURE; \
    STDMETHOD_(HRESULT,ContextSensitiveHelp)(THIS_ BOOL fEnterMode) PURE; \
    /*** IShellBrowser methods ***/ \
    STDMETHOD_(HRESULT,InsertMenusSB)(THIS_ HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) PURE; \
    STDMETHOD_(HRESULT,SetMenuSB)(THIS_ HMENU hmenuShared, HOLEMENU holemenuReserved, HWND hwndActiveObject) PURE; \
    STDMETHOD_(HRESULT,RemoveMenusSB)(THIS_ HMENU hmenuShared) PURE; \
    STDMETHOD_(HRESULT,SetStatusTextSB)(THIS_ LPCOLESTR pszStatusText) PURE; \
    STDMETHOD_(HRESULT,EnableModelessSB)(THIS_ BOOL fEnable) PURE; \
    STDMETHOD_(HRESULT,TranslateAcceleratorSB)(THIS_ MSG* pmsg, WORD wID) PURE; \
    STDMETHOD_(HRESULT,BrowseObject)(THIS_ LPCITEMIDLIST pidl, UINT wFlags) PURE; \
    STDMETHOD_(HRESULT,GetViewStateStream)(THIS_ DWORD grfMode, IStream** ppStrm) PURE; \
    STDMETHOD_(HRESULT,GetControlWindow)(THIS_ UINT id, HWND* phwnd) PURE; \
    STDMETHOD_(HRESULT,SendControlMsg)(THIS_ UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pret) PURE; \
    STDMETHOD_(HRESULT,QueryActiveShellView)(THIS_ IShellView** ppshv) PURE; \
    STDMETHOD_(HRESULT,OnViewWindowActive)(THIS_ IShellView* pshv) PURE; \
    STDMETHOD_(HRESULT,SetToolbarItems)(THIS_ LPTBBUTTONSB lpButtons, UINT nButtons, UINT uFlags) PURE;

HRESULT CALLBACK IShellBrowser_InsertMenusSB_Proxy(
    IShellBrowser* This,
    HMENU hmenuShared,
    LPOLEMENUGROUPWIDTHS lpMenuWidths);
void __RPC_STUB IShellBrowser_InsertMenusSB_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellBrowser_SetMenuSB_Proxy(
    IShellBrowser* This,
    HMENU hmenuShared,
    HOLEMENU holemenuReserved,
    HWND hwndActiveObject);
void __RPC_STUB IShellBrowser_SetMenuSB_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellBrowser_RemoveMenusSB_Proxy(
    IShellBrowser* This,
    HMENU hmenuShared);
void __RPC_STUB IShellBrowser_RemoveMenusSB_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellBrowser_SetStatusTextSB_Proxy(
    IShellBrowser* This,
    LPCOLESTR pszStatusText);
void __RPC_STUB IShellBrowser_SetStatusTextSB_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellBrowser_EnableModelessSB_Proxy(
    IShellBrowser* This,
    BOOL fEnable);
void __RPC_STUB IShellBrowser_EnableModelessSB_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellBrowser_TranslateAcceleratorSB_Proxy(
    IShellBrowser* This,
    MSG* pmsg,
    WORD wID);
void __RPC_STUB IShellBrowser_TranslateAcceleratorSB_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellBrowser_BrowseObject_Proxy(
    IShellBrowser* This,
    LPCITEMIDLIST pidl,
    UINT wFlags);
void __RPC_STUB IShellBrowser_BrowseObject_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellBrowser_GetViewStateStream_Proxy(
    IShellBrowser* This,
    DWORD grfMode,
    IStream** ppStrm);
void __RPC_STUB IShellBrowser_GetViewStateStream_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellBrowser_GetControlWindow_Proxy(
    IShellBrowser* This,
    UINT id,
    HWND* phwnd);
void __RPC_STUB IShellBrowser_GetControlWindow_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellBrowser_QueryActiveShellView_Proxy(
    IShellBrowser* This,
    IShellView** ppshv);
void __RPC_STUB IShellBrowser_QueryActiveShellView_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellBrowser_OnViewWindowActive_Proxy(
    IShellBrowser* This,
    IShellView* pshv);
void __RPC_STUB IShellBrowser_OnViewWindowActive_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IShellBrowser_INTERFACE_DEFINED__ */

#ifndef __IShellLinkA_FWD_DEFINED__
#define __IShellLinkA_FWD_DEFINED__
typedef struct IShellLinkA IShellLinkA;
#endif

typedef enum {
    SLR_NO_UI = 0x1,
    SLR_ANY_MATCH = 0x2,
    SLR_UPDATE = 0x4,
    SLR_NOUPDATE = 0x8,
    SLR_NOSEARCH = 0x10,
    SLR_NOTRACK = 0x20,
    SLR_NOLINKINFO = 0x40,
    SLR_INVOKE_MSI = 0x80,
    SLR_NO_UI_WITH_MSG_PUMP = 0x101
} SLR_FLAGS;

typedef enum {
    SLGP_SHORTPATH = 0x1,
    SLGP_UNCPRIORITY = 0x2,
    SLGP_RAWPATH = 0x4
} SLGP_FLAGS;

/*****************************************************************************
 * IShellLinkA interface
 */
#ifndef __IShellLinkA_INTERFACE_DEFINED__
#define __IShellLinkA_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellLinkA, 0x000214ee, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IShellLinkA : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPath(
        LPSTR pszFile,
        int cch,
        WIN32_FIND_DATAA* pfd,
        DWORD fFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIDList(
        LPITEMIDLIST* ppidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIDList(
        LPCITEMIDLIST pidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDescription(
        LPSTR pszName,
        int cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDescription(
        LPCSTR pszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWorkingDirectory(
        LPSTR pszDir,
        int cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetWorkingDirectory(
        LPCSTR pszDir) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetArguments(
        LPSTR pszArgs,
        int cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetArguments(
        LPCSTR pszArgs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHotkey(
        WORD* pwHotkey) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHotkey(
        WORD wHotkey) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetShowCmd(
        int* piShowCmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetShowCmd(
        int iShowCmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIconLocation(
        LPSTR pszIconPath,
        int cch,
        int* piIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIconLocation(
        LPCSTR pszIconPath,
        int iIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRelativePath(
        LPCSTR pszPathRel,
        DWORD dwReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resolve(
        HWND hwnd,
        DWORD fFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPath(
        LPCSTR pszFile) = 0;

};
#else
typedef struct IShellLinkAVtbl IShellLinkAVtbl;
struct IShellLinkA {
    const IShellLinkAVtbl* lpVtbl;
};
struct IShellLinkAVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IShellLinkA methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPath)(
        IShellLinkA* This,
        LPSTR pszFile,
        int cch,
        WIN32_FIND_DATAA* pfd,
        DWORD fFlags);

    HRESULT (STDMETHODCALLTYPE *GetIDList)(
        IShellLinkA* This,
        LPITEMIDLIST* ppidl);

    HRESULT (STDMETHODCALLTYPE *SetIDList)(
        IShellLinkA* This,
        LPCITEMIDLIST pidl);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IShellLinkA* This,
        LPSTR pszName,
        int cch);

    HRESULT (STDMETHODCALLTYPE *SetDescription)(
        IShellLinkA* This,
        LPCSTR pszName);

    HRESULT (STDMETHODCALLTYPE *GetWorkingDirectory)(
        IShellLinkA* This,
        LPSTR pszDir,
        int cch);

    HRESULT (STDMETHODCALLTYPE *SetWorkingDirectory)(
        IShellLinkA* This,
        LPCSTR pszDir);

    HRESULT (STDMETHODCALLTYPE *GetArguments)(
        IShellLinkA* This,
        LPSTR pszArgs,
        int cch);

    HRESULT (STDMETHODCALLTYPE *SetArguments)(
        IShellLinkA* This,
        LPCSTR pszArgs);

    HRESULT (STDMETHODCALLTYPE *GetHotkey)(
        IShellLinkA* This,
        WORD* pwHotkey);

    HRESULT (STDMETHODCALLTYPE *SetHotkey)(
        IShellLinkA* This,
        WORD wHotkey);

    HRESULT (STDMETHODCALLTYPE *GetShowCmd)(
        IShellLinkA* This,
        int* piShowCmd);

    HRESULT (STDMETHODCALLTYPE *SetShowCmd)(
        IShellLinkA* This,
        int iShowCmd);

    HRESULT (STDMETHODCALLTYPE *GetIconLocation)(
        IShellLinkA* This,
        LPSTR pszIconPath,
        int cch,
        int* piIcon);

    HRESULT (STDMETHODCALLTYPE *SetIconLocation)(
        IShellLinkA* This,
        LPCSTR pszIconPath,
        int iIcon);

    HRESULT (STDMETHODCALLTYPE *SetRelativePath)(
        IShellLinkA* This,
        LPCSTR pszPathRel,
        DWORD dwReserved);

    HRESULT (STDMETHODCALLTYPE *Resolve)(
        IShellLinkA* This,
        HWND hwnd,
        DWORD fFlags);

    HRESULT (STDMETHODCALLTYPE *SetPath)(
        IShellLinkA* This,
        LPCSTR pszFile);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IShellLinkA_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IShellLinkA_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IShellLinkA_Release(p) (p)->lpVtbl->Release(p)
/*** IShellLinkA methods ***/
#define IShellLinkA_GetPath(p,a,b,c,d) (p)->lpVtbl->GetPath(p,a,b,c,d)
#define IShellLinkA_GetIDList(p,a) (p)->lpVtbl->GetIDList(p,a)
#define IShellLinkA_SetIDList(p,a) (p)->lpVtbl->SetIDList(p,a)
#define IShellLinkA_GetDescription(p,a,b) (p)->lpVtbl->GetDescription(p,a,b)
#define IShellLinkA_SetDescription(p,a) (p)->lpVtbl->SetDescription(p,a)
#define IShellLinkA_GetWorkingDirectory(p,a,b) (p)->lpVtbl->GetWorkingDirectory(p,a,b)
#define IShellLinkA_SetWorkingDirectory(p,a) (p)->lpVtbl->SetWorkingDirectory(p,a)
#define IShellLinkA_GetArguments(p,a,b) (p)->lpVtbl->GetArguments(p,a,b)
#define IShellLinkA_SetArguments(p,a) (p)->lpVtbl->SetArguments(p,a)
#define IShellLinkA_GetHotkey(p,a) (p)->lpVtbl->GetHotkey(p,a)
#define IShellLinkA_SetHotkey(p,a) (p)->lpVtbl->SetHotkey(p,a)
#define IShellLinkA_GetShowCmd(p,a) (p)->lpVtbl->GetShowCmd(p,a)
#define IShellLinkA_SetShowCmd(p,a) (p)->lpVtbl->SetShowCmd(p,a)
#define IShellLinkA_GetIconLocation(p,a,b,c) (p)->lpVtbl->GetIconLocation(p,a,b,c)
#define IShellLinkA_SetIconLocation(p,a,b) (p)->lpVtbl->SetIconLocation(p,a,b)
#define IShellLinkA_SetRelativePath(p,a,b) (p)->lpVtbl->SetRelativePath(p,a,b)
#define IShellLinkA_Resolve(p,a,b) (p)->lpVtbl->Resolve(p,a,b)
#define IShellLinkA_SetPath(p,a) (p)->lpVtbl->SetPath(p,a)
#endif

#endif

#define IShellLinkA_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IShellLinkA methods ***/ \
    STDMETHOD_(HRESULT,GetPath)(THIS_ LPSTR pszFile, int cch, WIN32_FIND_DATAA* pfd, DWORD fFlags) PURE; \
    STDMETHOD_(HRESULT,GetIDList)(THIS_ LPITEMIDLIST* ppidl) PURE; \
    STDMETHOD_(HRESULT,SetIDList)(THIS_ LPCITEMIDLIST pidl) PURE; \
    STDMETHOD_(HRESULT,GetDescription)(THIS_ LPSTR pszName, int cch) PURE; \
    STDMETHOD_(HRESULT,SetDescription)(THIS_ LPCSTR pszName) PURE; \
    STDMETHOD_(HRESULT,GetWorkingDirectory)(THIS_ LPSTR pszDir, int cch) PURE; \
    STDMETHOD_(HRESULT,SetWorkingDirectory)(THIS_ LPCSTR pszDir) PURE; \
    STDMETHOD_(HRESULT,GetArguments)(THIS_ LPSTR pszArgs, int cch) PURE; \
    STDMETHOD_(HRESULT,SetArguments)(THIS_ LPCSTR pszArgs) PURE; \
    STDMETHOD_(HRESULT,GetHotkey)(THIS_ WORD* pwHotkey) PURE; \
    STDMETHOD_(HRESULT,SetHotkey)(THIS_ WORD wHotkey) PURE; \
    STDMETHOD_(HRESULT,GetShowCmd)(THIS_ int* piShowCmd) PURE; \
    STDMETHOD_(HRESULT,SetShowCmd)(THIS_ int iShowCmd) PURE; \
    STDMETHOD_(HRESULT,GetIconLocation)(THIS_ LPSTR pszIconPath, int cch, int* piIcon) PURE; \
    STDMETHOD_(HRESULT,SetIconLocation)(THIS_ LPCSTR pszIconPath, int iIcon) PURE; \
    STDMETHOD_(HRESULT,SetRelativePath)(THIS_ LPCSTR pszPathRel, DWORD dwReserved) PURE; \
    STDMETHOD_(HRESULT,Resolve)(THIS_ HWND hwnd, DWORD fFlags) PURE; \
    STDMETHOD_(HRESULT,SetPath)(THIS_ LPCSTR pszFile) PURE;

HRESULT CALLBACK IShellLinkA_GetPath_Proxy(
    IShellLinkA* This,
    LPSTR pszFile,
    int cch,
    WIN32_FIND_DATAA* pfd,
    DWORD fFlags);
void __RPC_STUB IShellLinkA_GetPath_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_GetIDList_Proxy(
    IShellLinkA* This,
    LPITEMIDLIST* ppidl);
void __RPC_STUB IShellLinkA_GetIDList_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_SetIDList_Proxy(
    IShellLinkA* This,
    LPCITEMIDLIST pidl);
void __RPC_STUB IShellLinkA_SetIDList_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_GetDescription_Proxy(
    IShellLinkA* This,
    LPSTR pszName,
    int cch);
void __RPC_STUB IShellLinkA_GetDescription_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_SetDescription_Proxy(
    IShellLinkA* This,
    LPCSTR pszName);
void __RPC_STUB IShellLinkA_SetDescription_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_GetWorkingDirectory_Proxy(
    IShellLinkA* This,
    LPSTR pszDir,
    int cch);
void __RPC_STUB IShellLinkA_GetWorkingDirectory_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_SetWorkingDirectory_Proxy(
    IShellLinkA* This,
    LPCSTR pszDir);
void __RPC_STUB IShellLinkA_SetWorkingDirectory_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_GetArguments_Proxy(
    IShellLinkA* This,
    LPSTR pszArgs,
    int cch);
void __RPC_STUB IShellLinkA_GetArguments_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_SetArguments_Proxy(
    IShellLinkA* This,
    LPCSTR pszArgs);
void __RPC_STUB IShellLinkA_SetArguments_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_GetHotkey_Proxy(
    IShellLinkA* This,
    WORD* pwHotkey);
void __RPC_STUB IShellLinkA_GetHotkey_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_SetHotkey_Proxy(
    IShellLinkA* This,
    WORD wHotkey);
void __RPC_STUB IShellLinkA_SetHotkey_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_GetShowCmd_Proxy(
    IShellLinkA* This,
    int* piShowCmd);
void __RPC_STUB IShellLinkA_GetShowCmd_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_SetShowCmd_Proxy(
    IShellLinkA* This,
    int iShowCmd);
void __RPC_STUB IShellLinkA_SetShowCmd_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_GetIconLocation_Proxy(
    IShellLinkA* This,
    LPSTR pszIconPath,
    int cch,
    int* piIcon);
void __RPC_STUB IShellLinkA_GetIconLocation_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_SetIconLocation_Proxy(
    IShellLinkA* This,
    LPCSTR pszIconPath,
    int iIcon);
void __RPC_STUB IShellLinkA_SetIconLocation_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_SetRelativePath_Proxy(
    IShellLinkA* This,
    LPCSTR pszPathRel,
    DWORD dwReserved);
void __RPC_STUB IShellLinkA_SetRelativePath_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_Resolve_Proxy(
    IShellLinkA* This,
    HWND hwnd,
    DWORD fFlags);
void __RPC_STUB IShellLinkA_Resolve_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkA_SetPath_Proxy(
    IShellLinkA* This,
    LPCSTR pszFile);
void __RPC_STUB IShellLinkA_SetPath_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IShellLinkA_INTERFACE_DEFINED__ */

#ifndef __IShellLinkW_FWD_DEFINED__
#define __IShellLinkW_FWD_DEFINED__
typedef struct IShellLinkW IShellLinkW;
#endif

/*****************************************************************************
 * IShellLinkW interface
 */
#ifndef __IShellLinkW_INTERFACE_DEFINED__
#define __IShellLinkW_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellLinkW, 0x000214f9, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IShellLinkW : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPath(
        LPWSTR pszFile,
        int cch,
        WIN32_FIND_DATAW* pfd,
        DWORD fFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIDList(
        LPITEMIDLIST* ppidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIDList(
        LPCITEMIDLIST pidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDescription(
        LPWSTR pszName,
        int cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDescription(
        LPCWSTR pszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWorkingDirectory(
        LPWSTR pszDir,
        int cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetWorkingDirectory(
        LPCWSTR pszDir) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetArguments(
        LPWSTR pszArgs,
        int cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetArguments(
        LPCWSTR pszArgs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHotkey(
        WORD* pwHotkey) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHotkey(
        WORD wHotkey) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetShowCmd(
        int* piShowCmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetShowCmd(
        int iShowCmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIconLocation(
        LPWSTR pszIconPath,
        int cch,
        int* piIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIconLocation(
        LPCWSTR pszIconPath,
        int iIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRelativePath(
        LPCWSTR pszPathRel,
        DWORD dwReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resolve(
        HWND hwnd,
        DWORD fFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPath(
        LPCWSTR pszFile) = 0;

};
#else
typedef struct IShellLinkWVtbl IShellLinkWVtbl;
struct IShellLinkW {
    const IShellLinkWVtbl* lpVtbl;
};
struct IShellLinkWVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IShellLinkW methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPath)(
        IShellLinkW* This,
        LPWSTR pszFile,
        int cch,
        WIN32_FIND_DATAW* pfd,
        DWORD fFlags);

    HRESULT (STDMETHODCALLTYPE *GetIDList)(
        IShellLinkW* This,
        LPITEMIDLIST* ppidl);

    HRESULT (STDMETHODCALLTYPE *SetIDList)(
        IShellLinkW* This,
        LPCITEMIDLIST pidl);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IShellLinkW* This,
        LPWSTR pszName,
        int cch);

    HRESULT (STDMETHODCALLTYPE *SetDescription)(
        IShellLinkW* This,
        LPCWSTR pszName);

    HRESULT (STDMETHODCALLTYPE *GetWorkingDirectory)(
        IShellLinkW* This,
        LPWSTR pszDir,
        int cch);

    HRESULT (STDMETHODCALLTYPE *SetWorkingDirectory)(
        IShellLinkW* This,
        LPCWSTR pszDir);

    HRESULT (STDMETHODCALLTYPE *GetArguments)(
        IShellLinkW* This,
        LPWSTR pszArgs,
        int cch);

    HRESULT (STDMETHODCALLTYPE *SetArguments)(
        IShellLinkW* This,
        LPCWSTR pszArgs);

    HRESULT (STDMETHODCALLTYPE *GetHotkey)(
        IShellLinkW* This,
        WORD* pwHotkey);

    HRESULT (STDMETHODCALLTYPE *SetHotkey)(
        IShellLinkW* This,
        WORD wHotkey);

    HRESULT (STDMETHODCALLTYPE *GetShowCmd)(
        IShellLinkW* This,
        int* piShowCmd);

    HRESULT (STDMETHODCALLTYPE *SetShowCmd)(
        IShellLinkW* This,
        int iShowCmd);

    HRESULT (STDMETHODCALLTYPE *GetIconLocation)(
        IShellLinkW* This,
        LPWSTR pszIconPath,
        int cch,
        int* piIcon);

    HRESULT (STDMETHODCALLTYPE *SetIconLocation)(
        IShellLinkW* This,
        LPCWSTR pszIconPath,
        int iIcon);

    HRESULT (STDMETHODCALLTYPE *SetRelativePath)(
        IShellLinkW* This,
        LPCWSTR pszPathRel,
        DWORD dwReserved);

    HRESULT (STDMETHODCALLTYPE *Resolve)(
        IShellLinkW* This,
        HWND hwnd,
        DWORD fFlags);

    HRESULT (STDMETHODCALLTYPE *SetPath)(
        IShellLinkW* This,
        LPCWSTR pszFile);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IShellLinkW_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IShellLinkW_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IShellLinkW_Release(p) (p)->lpVtbl->Release(p)
/*** IShellLinkW methods ***/
#define IShellLinkW_GetPath(p,a,b,c,d) (p)->lpVtbl->GetPath(p,a,b,c,d)
#define IShellLinkW_GetIDList(p,a) (p)->lpVtbl->GetIDList(p,a)
#define IShellLinkW_SetIDList(p,a) (p)->lpVtbl->SetIDList(p,a)
#define IShellLinkW_GetDescription(p,a,b) (p)->lpVtbl->GetDescription(p,a,b)
#define IShellLinkW_SetDescription(p,a) (p)->lpVtbl->SetDescription(p,a)
#define IShellLinkW_GetWorkingDirectory(p,a,b) (p)->lpVtbl->GetWorkingDirectory(p,a,b)
#define IShellLinkW_SetWorkingDirectory(p,a) (p)->lpVtbl->SetWorkingDirectory(p,a)
#define IShellLinkW_GetArguments(p,a,b) (p)->lpVtbl->GetArguments(p,a,b)
#define IShellLinkW_SetArguments(p,a) (p)->lpVtbl->SetArguments(p,a)
#define IShellLinkW_GetHotkey(p,a) (p)->lpVtbl->GetHotkey(p,a)
#define IShellLinkW_SetHotkey(p,a) (p)->lpVtbl->SetHotkey(p,a)
#define IShellLinkW_GetShowCmd(p,a) (p)->lpVtbl->GetShowCmd(p,a)
#define IShellLinkW_SetShowCmd(p,a) (p)->lpVtbl->SetShowCmd(p,a)
#define IShellLinkW_GetIconLocation(p,a,b,c) (p)->lpVtbl->GetIconLocation(p,a,b,c)
#define IShellLinkW_SetIconLocation(p,a,b) (p)->lpVtbl->SetIconLocation(p,a,b)
#define IShellLinkW_SetRelativePath(p,a,b) (p)->lpVtbl->SetRelativePath(p,a,b)
#define IShellLinkW_Resolve(p,a,b) (p)->lpVtbl->Resolve(p,a,b)
#define IShellLinkW_SetPath(p,a) (p)->lpVtbl->SetPath(p,a)
#endif

#endif

#define IShellLinkW_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IShellLinkW methods ***/ \
    STDMETHOD_(HRESULT,GetPath)(THIS_ LPWSTR pszFile, int cch, WIN32_FIND_DATAW* pfd, DWORD fFlags) PURE; \
    STDMETHOD_(HRESULT,GetIDList)(THIS_ LPITEMIDLIST* ppidl) PURE; \
    STDMETHOD_(HRESULT,SetIDList)(THIS_ LPCITEMIDLIST pidl) PURE; \
    STDMETHOD_(HRESULT,GetDescription)(THIS_ LPWSTR pszName, int cch) PURE; \
    STDMETHOD_(HRESULT,SetDescription)(THIS_ LPCWSTR pszName) PURE; \
    STDMETHOD_(HRESULT,GetWorkingDirectory)(THIS_ LPWSTR pszDir, int cch) PURE; \
    STDMETHOD_(HRESULT,SetWorkingDirectory)(THIS_ LPCWSTR pszDir) PURE; \
    STDMETHOD_(HRESULT,GetArguments)(THIS_ LPWSTR pszArgs, int cch) PURE; \
    STDMETHOD_(HRESULT,SetArguments)(THIS_ LPCWSTR pszArgs) PURE; \
    STDMETHOD_(HRESULT,GetHotkey)(THIS_ WORD* pwHotkey) PURE; \
    STDMETHOD_(HRESULT,SetHotkey)(THIS_ WORD wHotkey) PURE; \
    STDMETHOD_(HRESULT,GetShowCmd)(THIS_ int* piShowCmd) PURE; \
    STDMETHOD_(HRESULT,SetShowCmd)(THIS_ int iShowCmd) PURE; \
    STDMETHOD_(HRESULT,GetIconLocation)(THIS_ LPWSTR pszIconPath, int cch, int* piIcon) PURE; \
    STDMETHOD_(HRESULT,SetIconLocation)(THIS_ LPCWSTR pszIconPath, int iIcon) PURE; \
    STDMETHOD_(HRESULT,SetRelativePath)(THIS_ LPCWSTR pszPathRel, DWORD dwReserved) PURE; \
    STDMETHOD_(HRESULT,Resolve)(THIS_ HWND hwnd, DWORD fFlags) PURE; \
    STDMETHOD_(HRESULT,SetPath)(THIS_ LPCWSTR pszFile) PURE;

HRESULT CALLBACK IShellLinkW_GetPath_Proxy(
    IShellLinkW* This,
    LPWSTR pszFile,
    int cch,
    WIN32_FIND_DATAW* pfd,
    DWORD fFlags);
void __RPC_STUB IShellLinkW_GetPath_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_GetIDList_Proxy(
    IShellLinkW* This,
    LPITEMIDLIST* ppidl);
void __RPC_STUB IShellLinkW_GetIDList_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_SetIDList_Proxy(
    IShellLinkW* This,
    LPCITEMIDLIST pidl);
void __RPC_STUB IShellLinkW_SetIDList_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_GetDescription_Proxy(
    IShellLinkW* This,
    LPWSTR pszName,
    int cch);
void __RPC_STUB IShellLinkW_GetDescription_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_SetDescription_Proxy(
    IShellLinkW* This,
    LPCWSTR pszName);
void __RPC_STUB IShellLinkW_SetDescription_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_GetWorkingDirectory_Proxy(
    IShellLinkW* This,
    LPWSTR pszDir,
    int cch);
void __RPC_STUB IShellLinkW_GetWorkingDirectory_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_SetWorkingDirectory_Proxy(
    IShellLinkW* This,
    LPCWSTR pszDir);
void __RPC_STUB IShellLinkW_SetWorkingDirectory_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_GetArguments_Proxy(
    IShellLinkW* This,
    LPWSTR pszArgs,
    int cch);
void __RPC_STUB IShellLinkW_GetArguments_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_SetArguments_Proxy(
    IShellLinkW* This,
    LPCWSTR pszArgs);
void __RPC_STUB IShellLinkW_SetArguments_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_GetHotkey_Proxy(
    IShellLinkW* This,
    WORD* pwHotkey);
void __RPC_STUB IShellLinkW_GetHotkey_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_SetHotkey_Proxy(
    IShellLinkW* This,
    WORD wHotkey);
void __RPC_STUB IShellLinkW_SetHotkey_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_GetShowCmd_Proxy(
    IShellLinkW* This,
    int* piShowCmd);
void __RPC_STUB IShellLinkW_GetShowCmd_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_SetShowCmd_Proxy(
    IShellLinkW* This,
    int iShowCmd);
void __RPC_STUB IShellLinkW_SetShowCmd_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_GetIconLocation_Proxy(
    IShellLinkW* This,
    LPWSTR pszIconPath,
    int cch,
    int* piIcon);
void __RPC_STUB IShellLinkW_GetIconLocation_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_SetIconLocation_Proxy(
    IShellLinkW* This,
    LPCWSTR pszIconPath,
    int iIcon);
void __RPC_STUB IShellLinkW_SetIconLocation_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_SetRelativePath_Proxy(
    IShellLinkW* This,
    LPCWSTR pszPathRel,
    DWORD dwReserved);
void __RPC_STUB IShellLinkW_SetRelativePath_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_Resolve_Proxy(
    IShellLinkW* This,
    HWND hwnd,
    DWORD fFlags);
void __RPC_STUB IShellLinkW_Resolve_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellLinkW_SetPath_Proxy(
    IShellLinkW* This,
    LPCWSTR pszFile);
void __RPC_STUB IShellLinkW_SetPath_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IShellLinkW_INTERFACE_DEFINED__ */

#define IShellLink WINELIB_NAME_AW(IShellLink)
#ifndef __IShellExtInit_FWD_DEFINED__
#define __IShellExtInit_FWD_DEFINED__
typedef struct IShellExtInit IShellExtInit;
#endif

typedef IShellExtInit *LPSHELLEXTINIT;

/*****************************************************************************
 * IShellExtInit interface
 */
#ifndef __IShellExtInit_INTERFACE_DEFINED__
#define __IShellExtInit_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellExtInit, 0x000214e8, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IShellExtInit : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        LPCITEMIDLIST pidlFolder,
        IDataObject* pdtobj,
        HKEY hkeyProgID) = 0;

};
#else
typedef struct IShellExtInitVtbl IShellExtInitVtbl;
struct IShellExtInit {
    const IShellExtInitVtbl* lpVtbl;
};
struct IShellExtInitVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IShellExtInit methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IShellExtInit* This,
        LPCITEMIDLIST pidlFolder,
        IDataObject* pdtobj,
        HKEY hkeyProgID);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IShellExtInit_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IShellExtInit_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IShellExtInit_Release(p) (p)->lpVtbl->Release(p)
/*** IShellExtInit methods ***/
#define IShellExtInit_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c)
#endif

#endif

#define IShellExtInit_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IShellExtInit methods ***/ \
    STDMETHOD_(HRESULT,Initialize)(THIS_ LPCITEMIDLIST pidlFolder, IDataObject* pdtobj, HKEY hkeyProgID) PURE;

HRESULT CALLBACK IShellExtInit_Initialize_Proxy(
    IShellExtInit* This,
    LPCITEMIDLIST pidlFolder,
    IDataObject* pdtobj,
    HKEY hkeyProgID);
void __RPC_STUB IShellExtInit_Initialize_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IShellExtInit_INTERFACE_DEFINED__ */

#ifndef __IPersistFolder3_FWD_DEFINED__
#define __IPersistFolder3_FWD_DEFINED__
typedef struct IPersistFolder3 IPersistFolder3;
#endif

typedef struct {
    LPITEMIDLIST pidlTargetFolder;
    WCHAR szTargetParsingName[260];
    WCHAR szNetworkProvider[260];
    DWORD dwAttributes;
    int csidl;
} PERSIST_FOLDER_TARGET_INFO;

/*****************************************************************************
 * IPersistFolder3 interface
 */
#ifndef __IPersistFolder3_INTERFACE_DEFINED__
#define __IPersistFolder3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPersistFolder3, 0xcef04fdf, 0xfe72, 0x11d2, 0x87,0xa5, 0x00,0xc0,0x4f,0x68,0x37,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IPersistFolder3 : public IPersistFolder2
{
    virtual HRESULT STDMETHODCALLTYPE InitializeEx(
        IBindCtx* pbc,
        LPCITEMIDLIST pidlRoot,
        const PERSIST_FOLDER_TARGET_INFO* ppfti) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolderTargetInfo(
        PERSIST_FOLDER_TARGET_INFO* ppfti) = 0;

};
#else
typedef struct IPersistFolder3Vtbl IPersistFolder3Vtbl;
struct IPersistFolder3 {
    const IPersistFolder3Vtbl* lpVtbl;
};
struct IPersistFolder3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IPersist methods ***/
    HRESULT (STDMETHODCALLTYPE *GetClassID)(
        IPersistFolder3* This,
        CLSID* pClassID);

    /*** IPersistFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IPersistFolder3* This,
        LPCITEMIDLIST pidl);

    /*** IPersistFolder2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurFolder)(
        IPersistFolder3* This,
        LPITEMIDLIST* ppidl);

    /*** IPersistFolder3 methods ***/
    HRESULT (STDMETHODCALLTYPE *InitializeEx)(
        IPersistFolder3* This,
        IBindCtx* pbc,
        LPCITEMIDLIST pidlRoot,
        const PERSIST_FOLDER_TARGET_INFO* ppfti);

    HRESULT (STDMETHODCALLTYPE *GetFolderTargetInfo)(
        IPersistFolder3* This,
        PERSIST_FOLDER_TARGET_INFO* ppfti);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IPersistFolder3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IPersistFolder3_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IPersistFolder3_Release(p) (p)->lpVtbl->Release(p)
/*** IPersist methods ***/
#define IPersistFolder3_GetClassID(p,a) (p)->lpVtbl->GetClassID(p,a)
/*** IPersistFolder methods ***/
#define IPersistFolder3_Initialize(p,a) (p)->lpVtbl->Initialize(p,a)
/*** IPersistFolder2 methods ***/
#define IPersistFolder3_GetCurFolder(p,a) (p)->lpVtbl->GetCurFolder(p,a)
/*** IPersistFolder3 methods ***/
#define IPersistFolder3_InitializeEx(p,a,b,c) (p)->lpVtbl->InitializeEx(p,a,b,c)
#define IPersistFolder3_GetFolderTargetInfo(p,a) (p)->lpVtbl->GetFolderTargetInfo(p,a)
#endif

#endif

#define IPersistFolder3_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IPersist methods ***/ \
    STDMETHOD_(HRESULT,GetClassID)(THIS_ CLSID* pClassID) PURE; \
    /*** IPersistFolder methods ***/ \
    STDMETHOD_(HRESULT,Initialize)(THIS_ LPCITEMIDLIST pidl) PURE; \
    /*** IPersistFolder2 methods ***/ \
    STDMETHOD_(HRESULT,GetCurFolder)(THIS_ LPITEMIDLIST* ppidl) PURE; \
    /*** IPersistFolder3 methods ***/ \
    STDMETHOD_(HRESULT,InitializeEx)(THIS_ IBindCtx* pbc, LPCITEMIDLIST pidlRoot, const PERSIST_FOLDER_TARGET_INFO* ppfti) PURE; \
    STDMETHOD_(HRESULT,GetFolderTargetInfo)(THIS_ PERSIST_FOLDER_TARGET_INFO* ppfti) PURE;

HRESULT CALLBACK IPersistFolder3_InitializeEx_Proxy(
    IPersistFolder3* This,
    IBindCtx* pbc,
    LPCITEMIDLIST pidlRoot,
    const PERSIST_FOLDER_TARGET_INFO* ppfti);
void __RPC_STUB IPersistFolder3_InitializeEx_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IPersistFolder3_GetFolderTargetInfo_Proxy(
    IPersistFolder3* This,
    PERSIST_FOLDER_TARGET_INFO* ppfti);
void __RPC_STUB IPersistFolder3_GetFolderTargetInfo_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IPersistFolder3_INTERFACE_DEFINED__ */

#ifndef __IExtractIconA_FWD_DEFINED__
#define __IExtractIconA_FWD_DEFINED__
typedef struct IExtractIconA IExtractIconA;
#endif

#define GIL_OPENICON     0x0001
#define GIL_FORSHELL     0x0002
#define GIL_ASYNC        0x0020
#define GIL_DEFAULTICON  0x0040
#define GIL_FORSHORTCUT  0x0080
#define GIL_SIMULATEDOC  0x0001
#define GIL_PERINSTANCE  0x0002
#define GIL_PERCLASS     0x0004
#define GIL_NOTFILENAME  0x0008
#define GIL_DONTCACHE    0x0010
typedef IExtractIconA *LPEXTRACTICONA;

/*****************************************************************************
 * IExtractIconA interface
 */
#ifndef __IExtractIconA_INTERFACE_DEFINED__
#define __IExtractIconA_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExtractIconA, 0x000214eb, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IExtractIconA : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetIconLocation(
        UINT uFlags,
        LPSTR szIconFile,
        UINT cchMax,
        INT* piIndex,
        UINT* pwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Extract(
        LPCSTR pszFile,
        UINT nIconIndex,
        HICON* phiconLarge,
        HICON* phiconSmall,
        UINT nIconSize) = 0;

};
#else
typedef struct IExtractIconAVtbl IExtractIconAVtbl;
struct IExtractIconA {
    const IExtractIconAVtbl* lpVtbl;
};
struct IExtractIconAVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IExtractIconA methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIconLocation)(
        IExtractIconA* This,
        UINT uFlags,
        LPSTR szIconFile,
        UINT cchMax,
        INT* piIndex,
        UINT* pwFlags);

    HRESULT (STDMETHODCALLTYPE *Extract)(
        IExtractIconA* This,
        LPCSTR pszFile,
        UINT nIconIndex,
        HICON* phiconLarge,
        HICON* phiconSmall,
        UINT nIconSize);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IExtractIconA_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IExtractIconA_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IExtractIconA_Release(p) (p)->lpVtbl->Release(p)
/*** IExtractIconA methods ***/
#define IExtractIconA_GetIconLocation(p,a,b,c,d,e) (p)->lpVtbl->GetIconLocation(p,a,b,c,d,e)
#define IExtractIconA_Extract(p,a,b,c,d,e) (p)->lpVtbl->Extract(p,a,b,c,d,e)
#endif

#endif

#define IExtractIconA_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IExtractIconA methods ***/ \
    STDMETHOD_(HRESULT,GetIconLocation)(THIS_ UINT uFlags, LPSTR szIconFile, UINT cchMax, INT* piIndex, UINT* pwFlags) PURE; \
    STDMETHOD_(HRESULT,Extract)(THIS_ LPCSTR pszFile, UINT nIconIndex, HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize) PURE;

HRESULT CALLBACK IExtractIconA_GetIconLocation_Proxy(
    IExtractIconA* This,
    UINT uFlags,
    LPSTR szIconFile,
    UINT cchMax,
    INT* piIndex,
    UINT* pwFlags);
void __RPC_STUB IExtractIconA_GetIconLocation_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IExtractIconA_Extract_Proxy(
    IExtractIconA* This,
    LPCSTR pszFile,
    UINT nIconIndex,
    HICON* phiconLarge,
    HICON* phiconSmall,
    UINT nIconSize);
void __RPC_STUB IExtractIconA_Extract_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IExtractIconA_INTERFACE_DEFINED__ */

#ifndef __IExtractIconW_FWD_DEFINED__
#define __IExtractIconW_FWD_DEFINED__
typedef struct IExtractIconW IExtractIconW;
#endif

typedef IExtractIconW *LPEXTRACTICONW;

/*****************************************************************************
 * IExtractIconW interface
 */
#ifndef __IExtractIconW_INTERFACE_DEFINED__
#define __IExtractIconW_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExtractIconW, 0x000214fa, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IExtractIconW : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetIconLocation(
        UINT uFlags,
        LPWSTR szIconFile,
        UINT cchMax,
        INT* piIndex,
        UINT* pwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Extract(
        LPCWSTR pszFile,
        UINT nIconIndex,
        HICON* phiconLarge,
        HICON* phiconSmall,
        UINT nIconSize) = 0;

};
#else
typedef struct IExtractIconWVtbl IExtractIconWVtbl;
struct IExtractIconW {
    const IExtractIconWVtbl* lpVtbl;
};
struct IExtractIconWVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IExtractIconW methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIconLocation)(
        IExtractIconW* This,
        UINT uFlags,
        LPWSTR szIconFile,
        UINT cchMax,
        INT* piIndex,
        UINT* pwFlags);

    HRESULT (STDMETHODCALLTYPE *Extract)(
        IExtractIconW* This,
        LPCWSTR pszFile,
        UINT nIconIndex,
        HICON* phiconLarge,
        HICON* phiconSmall,
        UINT nIconSize);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IExtractIconW_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IExtractIconW_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IExtractIconW_Release(p) (p)->lpVtbl->Release(p)
/*** IExtractIconW methods ***/
#define IExtractIconW_GetIconLocation(p,a,b,c,d,e) (p)->lpVtbl->GetIconLocation(p,a,b,c,d,e)
#define IExtractIconW_Extract(p,a,b,c,d,e) (p)->lpVtbl->Extract(p,a,b,c,d,e)
#endif

#endif

#define IExtractIconW_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IExtractIconW methods ***/ \
    STDMETHOD_(HRESULT,GetIconLocation)(THIS_ UINT uFlags, LPWSTR szIconFile, UINT cchMax, INT* piIndex, UINT* pwFlags) PURE; \
    STDMETHOD_(HRESULT,Extract)(THIS_ LPCWSTR pszFile, UINT nIconIndex, HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize) PURE;

HRESULT CALLBACK IExtractIconW_GetIconLocation_Proxy(
    IExtractIconW* This,
    UINT uFlags,
    LPWSTR szIconFile,
    UINT cchMax,
    INT* piIndex,
    UINT* pwFlags);
void __RPC_STUB IExtractIconW_GetIconLocation_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IExtractIconW_Extract_Proxy(
    IExtractIconW* This,
    LPCWSTR pszFile,
    UINT nIconIndex,
    HICON* phiconLarge,
    HICON* phiconSmall,
    UINT nIconSize);
void __RPC_STUB IExtractIconW_Extract_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IExtractIconW_INTERFACE_DEFINED__ */

#define LPEXTRACTICON WINELIB_NAME_AW(LPEXTRACTICON)
#define IExtractIcon WINELIB_NAME_AW(IExtractIcon)
#ifndef __ICommDlgBrowser_FWD_DEFINED__
#define __ICommDlgBrowser_FWD_DEFINED__
typedef struct ICommDlgBrowser ICommDlgBrowser;
#endif

#define CDBOSC_SETFOCUS     0x00000000
#define CDBOSC_KILLFOCUS    0x00000001
#define CDBOSC_SELCHANGE    0x00000002
#define CDBOSC_RENAME       0x00000003
#define CDBOSC_STATECHANGE  0x00000004
typedef ICommDlgBrowser *LPCOMMDLGBROWSER;

/*****************************************************************************
 * ICommDlgBrowser interface
 */
#ifndef __ICommDlgBrowser_INTERFACE_DEFINED__
#define __ICommDlgBrowser_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICommDlgBrowser, 0x000214f1, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct ICommDlgBrowser : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnDefaultCommand(
        IShellView* shv) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnStateChange(
        IShellView* shv,
        ULONG uChange) = 0;

    virtual HRESULT STDMETHODCALLTYPE IncludeObject(
        IShellView* shv,
        LPCITEMIDLIST pidl) = 0;

};
#else
typedef struct ICommDlgBrowserVtbl ICommDlgBrowserVtbl;
struct ICommDlgBrowser {
    const ICommDlgBrowserVtbl* lpVtbl;
};
struct ICommDlgBrowserVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICommDlgBrowser methods ***/
    HRESULT (STDMETHODCALLTYPE *OnDefaultCommand)(
        ICommDlgBrowser* This,
        IShellView* shv);

    HRESULT (STDMETHODCALLTYPE *OnStateChange)(
        ICommDlgBrowser* This,
        IShellView* shv,
        ULONG uChange);

    HRESULT (STDMETHODCALLTYPE *IncludeObject)(
        ICommDlgBrowser* This,
        IShellView* shv,
        LPCITEMIDLIST pidl);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define ICommDlgBrowser_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define ICommDlgBrowser_AddRef(p) (p)->lpVtbl->AddRef(p)
#define ICommDlgBrowser_Release(p) (p)->lpVtbl->Release(p)
/*** ICommDlgBrowser methods ***/
#define ICommDlgBrowser_OnDefaultCommand(p,a) (p)->lpVtbl->OnDefaultCommand(p,a)
#define ICommDlgBrowser_OnStateChange(p,a,b) (p)->lpVtbl->OnStateChange(p,a,b)
#define ICommDlgBrowser_IncludeObject(p,a,b) (p)->lpVtbl->IncludeObject(p,a,b)
#endif

#endif

#define ICommDlgBrowser_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** ICommDlgBrowser methods ***/ \
    STDMETHOD_(HRESULT,OnDefaultCommand)(THIS_ IShellView* shv) PURE; \
    STDMETHOD_(HRESULT,OnStateChange)(THIS_ IShellView* shv, ULONG uChange) PURE; \
    STDMETHOD_(HRESULT,IncludeObject)(THIS_ IShellView* shv, LPCITEMIDLIST pidl) PURE;

HRESULT CALLBACK ICommDlgBrowser_OnDefaultCommand_Proxy(
    ICommDlgBrowser* This,
    IShellView* shv);
void __RPC_STUB ICommDlgBrowser_OnDefaultCommand_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK ICommDlgBrowser_OnStateChange_Proxy(
    ICommDlgBrowser* This,
    IShellView* shv,
    ULONG uChange);
void __RPC_STUB ICommDlgBrowser_OnStateChange_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK ICommDlgBrowser_IncludeObject_Proxy(
    ICommDlgBrowser* This,
    IShellView* shv,
    LPCITEMIDLIST pidl);
void __RPC_STUB ICommDlgBrowser_IncludeObject_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ICommDlgBrowser_INTERFACE_DEFINED__ */

#ifndef __IDockingWindowFrame_FWD_DEFINED__
#define __IDockingWindowFrame_FWD_DEFINED__
typedef struct IDockingWindowFrame IDockingWindowFrame;
#endif

#define DWFRF_NORMAL           0x0000
#define DWFRF_DELETECONFIGDATA 0x0001
#define DWFAF_HIDDEN           0x0001
/*****************************************************************************
 * IDockingWindowFrame interface
 */
#ifndef __IDockingWindowFrame_INTERFACE_DEFINED__
#define __IDockingWindowFrame_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDockingWindowFrame, 0x47d2657a, 0x7b27, 0x11d0, 0x8c,0xa9, 0x00,0xa0,0xc9,0x2d,0xbf,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IDockingWindowFrame : public IOleWindow
{
    virtual HRESULT STDMETHODCALLTYPE AddToolbar(
        IUnknown* punkSrc,
        LPCWSTR pwszItem,
        DWORD dwAddFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(
        IUnknown* punkSrc,
        DWORD dwRemoveFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindToolbar(
        LPCWSTR pwszItem,
        REFIID riid,
        LPVOID* ppvObj) = 0;

};
#else
typedef struct IDockingWindowFrameVtbl IDockingWindowFrameVtbl;
struct IDockingWindowFrame {
    const IDockingWindowFrameVtbl* lpVtbl;
};
struct IDockingWindowFrameVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOleWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IDockingWindowFrame* This,
        HWND* phwnd);

    HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)(
        IDockingWindowFrame* This,
        BOOL fEnterMode);

    /*** IDockingWindowFrame methods ***/
    HRESULT (STDMETHODCALLTYPE *AddToolbar)(
        IDockingWindowFrame* This,
        IUnknown* punkSrc,
        LPCWSTR pwszItem,
        DWORD dwAddFlags);

    HRESULT (STDMETHODCALLTYPE *RemoveToolbar)(
        IDockingWindowFrame* This,
        IUnknown* punkSrc,
        DWORD dwRemoveFlags);

    HRESULT (STDMETHODCALLTYPE *FindToolbar)(
        IDockingWindowFrame* This,
        LPCWSTR pwszItem,
        REFIID riid,
        LPVOID* ppvObj);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IDockingWindowFrame_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDockingWindowFrame_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IDockingWindowFrame_Release(p) (p)->lpVtbl->Release(p)
/*** IOleWindow methods ***/
#define IDockingWindowFrame_GetWindow(p,a) (p)->lpVtbl->GetWindow(p,a)
#define IDockingWindowFrame_ContextSensitiveHelp(p,a) (p)->lpVtbl->ContextSensitiveHelp(p,a)
/*** IDockingWindowFrame methods ***/
#define IDockingWindowFrame_AddToolbar(p,a,b,c) (p)->lpVtbl->AddToolbar(p,a,b,c)
#define IDockingWindowFrame_RemoveToolbar(p,a,b) (p)->lpVtbl->RemoveToolbar(p,a,b)
#define IDockingWindowFrame_FindToolbar(p,a,b,c) (p)->lpVtbl->FindToolbar(p,a,b,c)
#endif

#endif

#define IDockingWindowFrame_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IOleWindow methods ***/ \
    STDMETHOD_(HRESULT,GetWindow)(THIS_ HWND* phwnd) PURE; \
    STDMETHOD_(HRESULT,ContextSensitiveHelp)(THIS_ BOOL fEnterMode) PURE; \
    /*** IDockingWindowFrame methods ***/ \
    STDMETHOD_(HRESULT,AddToolbar)(THIS_ IUnknown* punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags) PURE; \
    STDMETHOD_(HRESULT,RemoveToolbar)(THIS_ IUnknown* punkSrc, DWORD dwRemoveFlags) PURE; \
    STDMETHOD_(HRESULT,FindToolbar)(THIS_ LPCWSTR pwszItem, REFIID riid, LPVOID* ppvObj) PURE;

HRESULT CALLBACK IDockingWindowFrame_AddToolbar_Proxy(
    IDockingWindowFrame* This,
    IUnknown* punkSrc,
    LPCWSTR pwszItem,
    DWORD dwAddFlags);
void __RPC_STUB IDockingWindowFrame_AddToolbar_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IDockingWindowFrame_RemoveToolbar_Proxy(
    IDockingWindowFrame* This,
    IUnknown* punkSrc,
    DWORD dwRemoveFlags);
void __RPC_STUB IDockingWindowFrame_RemoveToolbar_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IDockingWindowFrame_FindToolbar_Proxy(
    IDockingWindowFrame* This,
    LPCWSTR pwszItem,
    REFIID riid,
    LPVOID* ppvObj);
void __RPC_STUB IDockingWindowFrame_FindToolbar_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDockingWindowFrame_INTERFACE_DEFINED__ */

#ifndef __IDragSourceHelper_FWD_DEFINED__
#define __IDragSourceHelper_FWD_DEFINED__
typedef struct IDragSourceHelper IDragSourceHelper;
#endif

typedef struct {
    SIZE sizeDragImage;
    POINT ptOffset;
    HBITMAP hbmpDragImage;
    COLORREF crColorKey;
} SHDRAGIMAGE, *LPSHDRAGIMAGE;

/*****************************************************************************
 * IDragSourceHelper interface
 */
#ifndef __IDragSourceHelper_INTERFACE_DEFINED__
#define __IDragSourceHelper_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDragSourceHelper, 0xde5bf786, 0x477a, 0x11d2, 0x83,0x9d, 0x00,0xc0,0x4f,0xd9,0x18,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IDragSourceHelper : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InitializeFromBitmap(
        LPSHDRAGIMAGE pshdi,
        IDataObject* pDataObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeFromWindow(
        HWND hwnd,
        POINT* ppt,
        IDataObject* pDataObject) = 0;

};
#else
typedef struct IDragSourceHelperVtbl IDragSourceHelperVtbl;
struct IDragSourceHelper {
    const IDragSourceHelperVtbl* lpVtbl;
};
struct IDragSourceHelperVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDragSourceHelper methods ***/
    HRESULT (STDMETHODCALLTYPE *InitializeFromBitmap)(
        IDragSourceHelper* This,
        LPSHDRAGIMAGE pshdi,
        IDataObject* pDataObject);

    HRESULT (STDMETHODCALLTYPE *InitializeFromWindow)(
        IDragSourceHelper* This,
        HWND hwnd,
        POINT* ppt,
        IDataObject* pDataObject);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IDragSourceHelper_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDragSourceHelper_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IDragSourceHelper_Release(p) (p)->lpVtbl->Release(p)
/*** IDragSourceHelper methods ***/
#define IDragSourceHelper_InitializeFromBitmap(p,a,b) (p)->lpVtbl->InitializeFromBitmap(p,a,b)
#define IDragSourceHelper_InitializeFromWindow(p,a,b,c) (p)->lpVtbl->InitializeFromWindow(p,a,b,c)
#endif

#endif

#define IDragSourceHelper_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IDragSourceHelper methods ***/ \
    STDMETHOD_(HRESULT,InitializeFromBitmap)(THIS_ LPSHDRAGIMAGE pshdi, IDataObject* pDataObject) PURE; \
    STDMETHOD_(HRESULT,InitializeFromWindow)(THIS_ HWND hwnd, POINT* ppt, IDataObject* pDataObject) PURE;

HRESULT CALLBACK IDragSourceHelper_InitializeFromBitmap_Proxy(
    IDragSourceHelper* This,
    LPSHDRAGIMAGE pshdi,
    IDataObject* pDataObject);
void __RPC_STUB IDragSourceHelper_InitializeFromBitmap_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IDragSourceHelper_InitializeFromWindow_Proxy(
    IDragSourceHelper* This,
    HWND hwnd,
    POINT* ppt,
    IDataObject* pDataObject);
void __RPC_STUB IDragSourceHelper_InitializeFromWindow_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDragSourceHelper_INTERFACE_DEFINED__ */

#ifndef __IDropTargetHelper_FWD_DEFINED__
#define __IDropTargetHelper_FWD_DEFINED__
typedef struct IDropTargetHelper IDropTargetHelper;
#endif

/*****************************************************************************
 * IDropTargetHelper interface
 */
#ifndef __IDropTargetHelper_INTERFACE_DEFINED__
#define __IDropTargetHelper_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDropTargetHelper, 0x4657278b, 0x411b, 0x11d2, 0x83,0x9a, 0x00,0xc0,0x4f,0xd9,0x18,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IDropTargetHelper : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE DragEnter(
        HWND hwndTarget,
        IDataObject* pDataObject,
        POINT* ppt,
        DWORD dwEffect) = 0;

    virtual HRESULT STDMETHODCALLTYPE DragLeave(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE DragOver(
        POINT* ppt,
        DWORD dwEffect) = 0;

    virtual HRESULT STDMETHODCALLTYPE Drop(
        IDataObject* pDataObject,
        POINT* ppt,
        DWORD dwEffect) = 0;

    virtual HRESULT STDMETHODCALLTYPE Show(
        BOOL fShow) = 0;

};
#else
typedef struct IDropTargetHelperVtbl IDropTargetHelperVtbl;
struct IDropTargetHelper {
    const IDropTargetHelperVtbl* lpVtbl;
};
struct IDropTargetHelperVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDropTargetHelper methods ***/
    HRESULT (STDMETHODCALLTYPE *DragEnter)(
        IDropTargetHelper* This,
        HWND hwndTarget,
        IDataObject* pDataObject,
        POINT* ppt,
        DWORD dwEffect);

    HRESULT (STDMETHODCALLTYPE *DragLeave)(
        IDropTargetHelper* This);

    HRESULT (STDMETHODCALLTYPE *DragOver)(
        IDropTargetHelper* This,
        POINT* ppt,
        DWORD dwEffect);

    HRESULT (STDMETHODCALLTYPE *Drop)(
        IDropTargetHelper* This,
        IDataObject* pDataObject,
        POINT* ppt,
        DWORD dwEffect);

    HRESULT (STDMETHODCALLTYPE *Show)(
        IDropTargetHelper* This,
        BOOL fShow);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IDropTargetHelper_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDropTargetHelper_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IDropTargetHelper_Release(p) (p)->lpVtbl->Release(p)
/*** IDropTargetHelper methods ***/
#define IDropTargetHelper_DragEnter(p,a,b,c,d) (p)->lpVtbl->DragEnter(p,a,b,c,d)
#define IDropTargetHelper_DragLeave(p) (p)->lpVtbl->DragLeave(p)
#define IDropTargetHelper_DragOver(p,a,b) (p)->lpVtbl->DragOver(p,a,b)
#define IDropTargetHelper_Drop(p,a,b,c) (p)->lpVtbl->Drop(p,a,b,c)
#define IDropTargetHelper_Show(p,a) (p)->lpVtbl->Show(p,a)
#endif

#endif

#define IDropTargetHelper_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IDropTargetHelper methods ***/ \
    STDMETHOD_(HRESULT,DragEnter)(THIS_ HWND hwndTarget, IDataObject* pDataObject, POINT* ppt, DWORD dwEffect) PURE; \
    STDMETHOD_(HRESULT,DragLeave)(THIS) PURE; \
    STDMETHOD_(HRESULT,DragOver)(THIS_ POINT* ppt, DWORD dwEffect) PURE; \
    STDMETHOD_(HRESULT,Drop)(THIS_ IDataObject* pDataObject, POINT* ppt, DWORD dwEffect) PURE; \
    STDMETHOD_(HRESULT,Show)(THIS_ BOOL fShow) PURE;

HRESULT CALLBACK IDropTargetHelper_DragEnter_Proxy(
    IDropTargetHelper* This,
    HWND hwndTarget,
    IDataObject* pDataObject,
    POINT* ppt,
    DWORD dwEffect);
void __RPC_STUB IDropTargetHelper_DragEnter_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IDropTargetHelper_DragLeave_Proxy(
    IDropTargetHelper* This);
void __RPC_STUB IDropTargetHelper_DragLeave_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IDropTargetHelper_DragOver_Proxy(
    IDropTargetHelper* This,
    POINT* ppt,
    DWORD dwEffect);
void __RPC_STUB IDropTargetHelper_DragOver_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IDropTargetHelper_Drop_Proxy(
    IDropTargetHelper* This,
    IDataObject* pDataObject,
    POINT* ppt,
    DWORD dwEffect);
void __RPC_STUB IDropTargetHelper_Drop_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IDropTargetHelper_Show_Proxy(
    IDropTargetHelper* This,
    BOOL fShow);
void __RPC_STUB IDropTargetHelper_Show_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDropTargetHelper_INTERFACE_DEFINED__ */

#ifndef __IContextMenu_FWD_DEFINED__
#define __IContextMenu_FWD_DEFINED__
typedef struct IContextMenu IContextMenu;
#endif

#define CMF_NORMAL        0x00000000
#define CMF_DEFAULTONLY   0x00000001
#define CMF_VERBSONLY     0x00000002
#define CMF_EXPLORE       0x00000004
#define CMF_NOVERBS       0x00000008
#define CMF_CANRENAME     0x00000010
#define CMF_NODEFAULT     0x00000020
#define CMF_INCLUDESTATIC 0x00000040
#define CMF_EXTENDEDVERBS 0x00000100
#define CMF_RESERVED      0xffff0000
#define GCS_VERBA         0x00000000
#define GCS_HELPTEXTA     0x00000001
#define GCS_VALIDATEA     0x00000002
#define GCS_VERBW         0x00000004
#define GCS_HELPTEXTW     0x00000005
#define GCS_VALIDATEW     0x00000006
#define GCS_UNICODE       0x00000004
#define GCS_VERB          WINELIB_NAME_AW(GCS_VERB)
#define GCS_HELPTEXT      WINELIB_NAME_AW(GCS_HELPTEXT)
#define GCS_VALIDATE      WINELIB_NAME_AW(GCS_VALIDATE)
#define CMDSTR_NEWFOLDERA   "NewFolder"
#define CMDSTR_VIEWLISTA    "ViewList"
#define CMDSTR_VIEWDETAILSA "ViewDetails"
#if defined(__GNUC__)
# define CMDSTR_NEWFOLDERW (const WCHAR []){ 'N','e','w','F','o','l','d','e','r',0 }
# define CMDSTR_VIEWLISTW (const WCHAR []){ 'V','i','e','w','L','i','s','t',0 }
# define CMDSTR_VIEWDETAILSW (const WCHAR []){ 'V','i','e','w','D','e','t','a','i','l','s',0 }
#elif defined(_MSC_VER)
# define CMDSTR_NEWFOLDERW   L"NewFolder"
# define CMDSTR_VIEWLISTW    L"ViewList"
# define CMDSTR_VIEWDETAILSW L"ViewDetails"
#else
static const WCHAR CMDSTR_NEWFOLDERW[] = {'N','e','w','F','o','l','d','e','r',0};
static const WCHAR CMDSTR_VIEWLISTW [] = {'V','i','e','w','L','i','s','t',0};
static const WCHAR CMDSTR_VIEWDETAILSW[] = {'V','i','e','w','D','e','t','a','i','l','s',0};
#endif
#define CMDSTR_NEWFOLDER    WINELIB_NAME_AW(CMDSTR_NEWFOLDER)
#define CMDSTR_VIEWLIST     WINELIB_NAME_AW(CMDSTR_VIEWLIST)
#define CMDSTR_VIEWDETAILS  WINELIB_NAME_AW(CMDSTR_VIEWDETAILS)
#define CMIC_MASK_HOTKEY         SEE_MASK_HOTKEY
#define CMIC_MASK_ICON           SEE_MASK_ICON
#define CMIC_MASK_FLAG_NO_UI     SEE_MASK_FLAG_NO_UI
#define CMIC_MASK_UNICODE        SEE_MASK_UNICODE
#define CMIC_MASK_NO_CONSOLE     SEE_MASK_NO_CONSOLE
#define CMIC_MASK_HASLINKNAME    SEE_MASK_HASLINKNAME
#define CMIC_MASK_FLAG_SEP_VDM   SEE_MASK_FLAG_SEPVDM
#define CMIC_MASK_HASTITLE       SEE_MASK_HASTITLE
#define CMIC_MASK_ASYNCOK        SEE_MASK_ASYNCOK
#define CMIC_MASK_SHIFT_DOWN     0x10000000
#define CMIC_MASK_PTINVOKE       0x20000000
#define CMIC_MASK_CONTROL_DOWN   0x40000000
#define CMIC_MASK_FLAG_LOG_USAGE SEE_MASK_FLAG_LOG_USAGE
#define CMIC_MASK_NOZONECHECKS   SEE_MASK_NOZONECHECKS
typedef IContextMenu *LPCONTEXTMENU;

typedef struct tagCMINVOKECOMMANDINFO {
    DWORD cbSize;
    DWORD fMask;
    HWND hwnd;
    LPCSTR lpVerb;
    LPCSTR lpParameters;
    LPCSTR lpDirectory;
    INT nShow;
    DWORD dwHotKey;
    HANDLE hIcon;
} CMINVOKECOMMANDINFO, *LPCMINVOKECOMMANDINFO;

typedef struct tagCMInvokeCommandInfoEx {
    DWORD cbSize;
    DWORD fMask;
    HWND hwnd;
    LPCSTR lpVerb;
    LPCSTR lpParameters;
    LPCSTR lpDirectory;
    INT nShow;
    DWORD dwHotKey;
    HANDLE hIcon;
    LPCSTR lpTitle;
    LPCWSTR lpVerbW;
    LPCWSTR lpParametersW;
    LPCWSTR lpDirectoryW;
    LPCWSTR lpTitleW;
    POINT ptInvoke;
} CMINVOKECOMMANDINFOEX, *LPCMINVOKECOMMANDINFOEX;

/*****************************************************************************
 * IContextMenu interface
 */
#ifndef __IContextMenu_INTERFACE_DEFINED__
#define __IContextMenu_INTERFACE_DEFINED__

DEFINE_GUID(IID_IContextMenu, 0x000214e4, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IContextMenu : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryContextMenu(
        HMENU hmenu,
        UINT indexMenu,
        UINT idCmdFirst,
        UINT idCmdLast,
        UINT uFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvokeCommand(
        LPCMINVOKECOMMANDINFO lpici) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCommandString(
        UINT idCmd,
        UINT uType,
        UINT* pwReserved,
        LPSTR pszName,
        UINT cchMax) = 0;

};
#else
typedef struct IContextMenuVtbl IContextMenuVtbl;
struct IContextMenu {
    const IContextMenuVtbl* lpVtbl;
};
struct IContextMenuVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IContextMenu methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryContextMenu)(
        IContextMenu* This,
        HMENU hmenu,
        UINT indexMenu,
        UINT idCmdFirst,
        UINT idCmdLast,
        UINT uFlags);

    HRESULT (STDMETHODCALLTYPE *InvokeCommand)(
        IContextMenu* This,
        LPCMINVOKECOMMANDINFO lpici);

    HRESULT (STDMETHODCALLTYPE *GetCommandString)(
        IContextMenu* This,
        UINT idCmd,
        UINT uType,
        UINT* pwReserved,
        LPSTR pszName,
        UINT cchMax);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IContextMenu_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IContextMenu_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IContextMenu_Release(p) (p)->lpVtbl->Release(p)
/*** IContextMenu methods ***/
#define IContextMenu_QueryContextMenu(p,a,b,c,d,e) (p)->lpVtbl->QueryContextMenu(p,a,b,c,d,e)
#define IContextMenu_InvokeCommand(p,a) (p)->lpVtbl->InvokeCommand(p,a)
#define IContextMenu_GetCommandString(p,a,b,c,d,e) (p)->lpVtbl->GetCommandString(p,a,b,c,d,e)
#endif

#endif

#define IContextMenu_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IContextMenu methods ***/ \
    STDMETHOD_(HRESULT,QueryContextMenu)(THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) PURE; \
    STDMETHOD_(HRESULT,InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO lpici) PURE; \
    STDMETHOD_(HRESULT,GetCommandString)(THIS_ UINT idCmd, UINT uType, UINT* pwReserved, LPSTR pszName, UINT cchMax) PURE;

HRESULT CALLBACK IContextMenu_QueryContextMenu_Proxy(
    IContextMenu* This,
    HMENU hmenu,
    UINT indexMenu,
    UINT idCmdFirst,
    UINT idCmdLast,
    UINT uFlags);
void __RPC_STUB IContextMenu_QueryContextMenu_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IContextMenu_InvokeCommand_Proxy(
    IContextMenu* This,
    LPCMINVOKECOMMANDINFO lpici);
void __RPC_STUB IContextMenu_InvokeCommand_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IContextMenu_GetCommandString_Proxy(
    IContextMenu* This,
    UINT idCmd,
    UINT uType,
    UINT* pwReserved,
    LPSTR pszName,
    UINT cchMax);
void __RPC_STUB IContextMenu_GetCommandString_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IContextMenu_INTERFACE_DEFINED__ */

#ifndef __IContextMenu2_FWD_DEFINED__
#define __IContextMenu2_FWD_DEFINED__
typedef struct IContextMenu2 IContextMenu2;
#endif

typedef IContextMenu2 *LPCONTEXTMENU2;

/*****************************************************************************
 * IContextMenu2 interface
 */
#ifndef __IContextMenu2_INTERFACE_DEFINED__
#define __IContextMenu2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IContextMenu2, 0x000214f4, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IContextMenu2 : public IContextMenu
{
    virtual HRESULT STDMETHODCALLTYPE HandleMenuMsg(
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam) = 0;

};
#else
typedef struct IContextMenu2Vtbl IContextMenu2Vtbl;
struct IContextMenu2 {
    const IContextMenu2Vtbl* lpVtbl;
};
struct IContextMenu2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IContextMenu methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryContextMenu)(
        IContextMenu2* This,
        HMENU hmenu,
        UINT indexMenu,
        UINT idCmdFirst,
        UINT idCmdLast,
        UINT uFlags);

    HRESULT (STDMETHODCALLTYPE *InvokeCommand)(
        IContextMenu2* This,
        LPCMINVOKECOMMANDINFO lpici);

    HRESULT (STDMETHODCALLTYPE *GetCommandString)(
        IContextMenu2* This,
        UINT idCmd,
        UINT uType,
        UINT* pwReserved,
        LPSTR pszName,
        UINT cchMax);

    /*** IContextMenu2 methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleMenuMsg)(
        IContextMenu2* This,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IContextMenu2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IContextMenu2_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IContextMenu2_Release(p) (p)->lpVtbl->Release(p)
/*** IContextMenu methods ***/
#define IContextMenu2_QueryContextMenu(p,a,b,c,d,e) (p)->lpVtbl->QueryContextMenu(p,a,b,c,d,e)
#define IContextMenu2_InvokeCommand(p,a) (p)->lpVtbl->InvokeCommand(p,a)
#define IContextMenu2_GetCommandString(p,a,b,c,d,e) (p)->lpVtbl->GetCommandString(p,a,b,c,d,e)
/*** IContextMenu2 methods ***/
#define IContextMenu2_HandleMenuMsg(p,a,b,c) (p)->lpVtbl->HandleMenuMsg(p,a,b,c)
#endif

#endif

#define IContextMenu2_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IContextMenu methods ***/ \
    STDMETHOD_(HRESULT,QueryContextMenu)(THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) PURE; \
    STDMETHOD_(HRESULT,InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO lpici) PURE; \
    STDMETHOD_(HRESULT,GetCommandString)(THIS_ UINT idCmd, UINT uType, UINT* pwReserved, LPSTR pszName, UINT cchMax) PURE; \
    /*** IContextMenu2 methods ***/ \
    STDMETHOD_(HRESULT,HandleMenuMsg)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE;

HRESULT CALLBACK IContextMenu2_HandleMenuMsg_Proxy(
    IContextMenu2* This,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);
void __RPC_STUB IContextMenu2_HandleMenuMsg_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IContextMenu2_INTERFACE_DEFINED__ */

#ifndef __IContextMenu3_FWD_DEFINED__
#define __IContextMenu3_FWD_DEFINED__
typedef struct IContextMenu3 IContextMenu3;
#endif

typedef IContextMenu3 *LPCONTEXTMENU3;

/*****************************************************************************
 * IContextMenu3 interface
 */
#ifndef __IContextMenu3_INTERFACE_DEFINED__
#define __IContextMenu3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IContextMenu3, 0xbcfce0a0, 0xec17, 0x11d0, 0x8d,0x10, 0x00,0xa0,0xc9,0x0f,0x27,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IContextMenu3 : public IContextMenu2
{
    virtual HRESULT STDMETHODCALLTYPE HandleMenuMsg2(
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam,
        LRESULT* plResult) = 0;

};
#else
typedef struct IContextMenu3Vtbl IContextMenu3Vtbl;
struct IContextMenu3 {
    const IContextMenu3Vtbl* lpVtbl;
};
struct IContextMenu3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IContextMenu methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryContextMenu)(
        IContextMenu3* This,
        HMENU hmenu,
        UINT indexMenu,
        UINT idCmdFirst,
        UINT idCmdLast,
        UINT uFlags);

    HRESULT (STDMETHODCALLTYPE *InvokeCommand)(
        IContextMenu3* This,
        LPCMINVOKECOMMANDINFO lpici);

    HRESULT (STDMETHODCALLTYPE *GetCommandString)(
        IContextMenu3* This,
        UINT idCmd,
        UINT uType,
        UINT* pwReserved,
        LPSTR pszName,
        UINT cchMax);

    /*** IContextMenu2 methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleMenuMsg)(
        IContextMenu3* This,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam);

    /*** IContextMenu3 methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleMenuMsg2)(
        IContextMenu3* This,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam,
        LRESULT* plResult);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IContextMenu3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IContextMenu3_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IContextMenu3_Release(p) (p)->lpVtbl->Release(p)
/*** IContextMenu methods ***/
#define IContextMenu3_QueryContextMenu(p,a,b,c,d,e) (p)->lpVtbl->QueryContextMenu(p,a,b,c,d,e)
#define IContextMenu3_InvokeCommand(p,a) (p)->lpVtbl->InvokeCommand(p,a)
#define IContextMenu3_GetCommandString(p,a,b,c,d,e) (p)->lpVtbl->GetCommandString(p,a,b,c,d,e)
/*** IContextMenu2 methods ***/
#define IContextMenu3_HandleMenuMsg(p,a,b,c) (p)->lpVtbl->HandleMenuMsg(p,a,b,c)
/*** IContextMenu3 methods ***/
#define IContextMenu3_HandleMenuMsg2(p,a,b,c,d) (p)->lpVtbl->HandleMenuMsg2(p,a,b,c,d)
#endif

#endif

#define IContextMenu3_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IContextMenu methods ***/ \
    STDMETHOD_(HRESULT,QueryContextMenu)(THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) PURE; \
    STDMETHOD_(HRESULT,InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO lpici) PURE; \
    STDMETHOD_(HRESULT,GetCommandString)(THIS_ UINT idCmd, UINT uType, UINT* pwReserved, LPSTR pszName, UINT cchMax) PURE; \
    /*** IContextMenu2 methods ***/ \
    STDMETHOD_(HRESULT,HandleMenuMsg)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE; \
    /*** IContextMenu3 methods ***/ \
    STDMETHOD_(HRESULT,HandleMenuMsg2)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* plResult) PURE;

HRESULT CALLBACK IContextMenu3_HandleMenuMsg2_Proxy(
    IContextMenu3* This,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam,
    LRESULT* plResult);
void __RPC_STUB IContextMenu3_HandleMenuMsg2_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IContextMenu3_INTERFACE_DEFINED__ */

#ifndef __IShellExecuteHookA_FWD_DEFINED__
#define __IShellExecuteHookA_FWD_DEFINED__
typedef struct IShellExecuteHookA IShellExecuteHookA;
#endif

struct _SHELLEXECUTEINFOA;
/*****************************************************************************
 * IShellExecuteHookA interface
 */
#ifndef __IShellExecuteHookA_INTERFACE_DEFINED__
#define __IShellExecuteHookA_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellExecuteHookA, 0x000214f5, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IShellExecuteHookA : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Execute(
        struct _SHELLEXECUTEINFOA* pei) = 0;

};
#else
typedef struct IShellExecuteHookAVtbl IShellExecuteHookAVtbl;
struct IShellExecuteHookA {
    const IShellExecuteHookAVtbl* lpVtbl;
};
struct IShellExecuteHookAVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IShellExecuteHookA methods ***/
    HRESULT (STDMETHODCALLTYPE *Execute)(
        IShellExecuteHookA* This,
        struct _SHELLEXECUTEINFOA* pei);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IShellExecuteHookA_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IShellExecuteHookA_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IShellExecuteHookA_Release(p) (p)->lpVtbl->Release(p)
/*** IShellExecuteHookA methods ***/
#define IShellExecuteHookA_Execute(p,a) (p)->lpVtbl->Execute(p,a)
#endif

#endif

#define IShellExecuteHookA_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IShellExecuteHookA methods ***/ \
    STDMETHOD_(HRESULT,Execute)(THIS_ struct _SHELLEXECUTEINFOA* pei) PURE;

HRESULT CALLBACK IShellExecuteHookA_Execute_Proxy(
    IShellExecuteHookA* This,
    struct _SHELLEXECUTEINFOA* pei);
void __RPC_STUB IShellExecuteHookA_Execute_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IShellExecuteHookA_INTERFACE_DEFINED__ */

#ifndef __IShellExecuteHookW_FWD_DEFINED__
#define __IShellExecuteHookW_FWD_DEFINED__
typedef struct IShellExecuteHookW IShellExecuteHookW;
#endif

struct _SHELLEXECUTEINFOW;
/*****************************************************************************
 * IShellExecuteHookW interface
 */
#ifndef __IShellExecuteHookW_INTERFACE_DEFINED__
#define __IShellExecuteHookW_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellExecuteHookW, 0x000214fb, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IShellExecuteHookW : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Execute(
        struct _SHELLEXECUTEINFOW* pei) = 0;

};
#else
typedef struct IShellExecuteHookWVtbl IShellExecuteHookWVtbl;
struct IShellExecuteHookW {
    const IShellExecuteHookWVtbl* lpVtbl;
};
struct IShellExecuteHookWVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IShellExecuteHookW methods ***/
    HRESULT (STDMETHODCALLTYPE *Execute)(
        IShellExecuteHookW* This,
        struct _SHELLEXECUTEINFOW* pei);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IShellExecuteHookW_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IShellExecuteHookW_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IShellExecuteHookW_Release(p) (p)->lpVtbl->Release(p)
/*** IShellExecuteHookW methods ***/
#define IShellExecuteHookW_Execute(p,a) (p)->lpVtbl->Execute(p,a)
#endif

#endif

#define IShellExecuteHookW_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IShellExecuteHookW methods ***/ \
    STDMETHOD_(HRESULT,Execute)(THIS_ struct _SHELLEXECUTEINFOW* pei) PURE;

HRESULT CALLBACK IShellExecuteHookW_Execute_Proxy(
    IShellExecuteHookW* This,
    struct _SHELLEXECUTEINFOW* pei);
void __RPC_STUB IShellExecuteHookW_Execute_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IShellExecuteHookW_INTERFACE_DEFINED__ */

#ifdef __cplusplus
}
#endif
#endif /* __WIDL_SHOBJIDL_H */
