/*
 * COM interfaces for shell objects
 *
 * Copyright (C) 1999 Juergen Schmied
 * Copyright (C) 2003 Alexandre Julliard
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "objidl.idl";
import "oleidl.idl";
import "oaidl.idl";
import "docobj.idl";
import "shtypes.idl";
import "servprov.idl";
import "comcat.idl";
import "propidl.idl";
/* FIXME: import "prsht.idl";*/
import "msxml.idl";
import "wtypes.idl";
import "propsys.idl";
import "objectarray.idl";
/* FIXME: import "structuredquery.idl"; */

cpp_quote("/* FIXME: #include <sherrors.h> */")


/*****************************************************************************
 * IPersistFolder interface
 */
[
    object,
    uuid(000214ea-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IPersistFolder : IPersist
{
    typedef IPersistFolder *LPPERSISTFOLDER;

    HRESULT Initialize( [in] LPCITEMIDLIST pidl );
}


/*****************************************************************************
 * IPersistFolder2 interface
 */
[
    object,
    uuid(1ac3d9f0-175c-11d1-95be-00609797ea4f),
    pointer_default(unique)
]
interface IPersistFolder2 : IPersistFolder
{
    typedef IPersistFolder2 *LPPERSISTFOLDER2;

    HRESULT GetCurFolder( [out] LPITEMIDLIST *ppidl );
}


/*****************************************************************************
 * IPersistIDList interface
 */
[
    object,
    uuid(1079acfc-29bd-11d3-8e0d-00c04f6837d5),
    pointer_default(unique)
]
interface IPersistIDList : IPersist
{
    HRESULT SetIDList( [in] LPCITEMIDLIST pidl );
    HRESULT GetIDList( [out] LPITEMIDLIST *ppidl );
}


/*****************************************************************************
 * IEnumIDList interface
 */
[
    object,
    uuid(000214f2-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IEnumIDList : IUnknown
{
    typedef IEnumIDList *LPENUMIDLIST;

    HRESULT Next(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)] LPITEMIDLIST *rgelt,
        [out] ULONG *pceltFetched);

    HRESULT Skip( [in] ULONG celt );
    HRESULT Reset();
    HRESULT Clone( [out] IEnumIDList **ppenum );
}

/*****************************************************************************
 * IShellPropSheetExt interface
 */
cpp_quote("#if 0")
    typedef LPARAM LPFNSVADDPROPSHEETPAGE;
cpp_quote("#else")
cpp_quote("#include <prsht.h>")
cpp_quote("typedef LPFNADDPROPSHEETPAGE LPFNSVADDPROPSHEETPAGE;")
cpp_quote("#endif")

[
    object,
    uuid(000214E9-0000-0000-C000-000000000046),
    pointer_default(unique),
    local
]
interface IShellPropSheetExt : IUnknown
{
    enum tagSHELLPROPSHEETEXTPAGEID {
        EXPPS_FILETYPES = 0x1
    };

    typedef UINT EXPPS;

    HRESULT AddPages(
        [in] LPFNSVADDPROPSHEETPAGE pfnAddPage,
        [in] LPARAM lParam);
    HRESULT ReplacePage(
        [in] EXPPS uPageID,
        [in] LPFNSVADDPROPSHEETPAGE pfnReplaceWith,
        [in] LPARAM lParam);
}
typedef IShellPropSheetExt *LPSHELLPROPSHEETEXT;

/*****************************************************************************
 * IShellFolder interface
 */
[
    object,
    uuid(000214e6-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellFolder : IUnknown
{
    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;

    cpp_quote("#define SFGAO_CANCOPY           DROPEFFECT_COPY")
    cpp_quote("#define SFGAO_CANMOVE           DROPEFFECT_MOVE")
    cpp_quote("#define SFGAO_CANLINK           DROPEFFECT_LINK")
    cpp_quote("#define SFGAO_STORAGE           0x00000008L")
    cpp_quote("#define SFGAO_CANRENAME         0x00000010L")
    cpp_quote("#define SFGAO_CANDELETE         0x00000020L")
    cpp_quote("#define SFGAO_HASPROPSHEET      0x00000040L")
    cpp_quote("#define SFGAO_DROPTARGET        0x00000100L")
    cpp_quote("#define SFGAO_CAPABILITYMASK    0x00000177L")
    cpp_quote("#define SFGAO_ENCRYPTED         0x00002000L")
    cpp_quote("#define SFGAO_ISSLOW            0x00004000L")
    cpp_quote("#define SFGAO_GHOSTED           0x00008000L")
    cpp_quote("#define SFGAO_LINK              0x00010000L")
    cpp_quote("#define SFGAO_SHARE             0x00020000L")
    cpp_quote("#define SFGAO_READONLY          0x00040000L")
    cpp_quote("#define SFGAO_HIDDEN            0x00080000L")
    cpp_quote("#define SFGAO_DISPLAYATTRMASK   0x000FC000L")
    cpp_quote("#define SFGAO_FILESYSANCESTOR   0x10000000L")
    cpp_quote("#define SFGAO_FOLDER            0x20000000L")
    cpp_quote("#define SFGAO_FILESYSTEM        0x40000000L")
    cpp_quote("#define SFGAO_HASSUBFOLDER      0x80000000L")
    cpp_quote("#define SFGAO_CONTENTSMASK      0x80000000L")
    cpp_quote("#define SFGAO_VALIDATE          0x01000000L")
    cpp_quote("#define SFGAO_REMOVABLE         0x02000000L")
    cpp_quote("#define SFGAO_COMPRESSED        0x04000000L")
    cpp_quote("#define SFGAO_BROWSABLE         0x08000000L")
    cpp_quote("#define SFGAO_NONENUMERATED     0x00100000L")
    cpp_quote("#define SFGAO_NEWCONTENT        0x00200000L")
    cpp_quote("#define SFGAO_STREAM            0x00400000L")
    cpp_quote("#define SFGAO_STORAGEANCESTOR   0x00800000L")

    typedef ULONG SFGAOF;

    HRESULT ParseDisplayName(
        [in] HWND hwndOwner,
        [in] LPBC pbcReserved,
        [in, string] LPOLESTR lpszDisplayName,
        [out] ULONG *pchEaten,
        [out] LPITEMIDLIST *ppidl,
        [in, out, unique] ULONG *pdwAttributes);

    HRESULT EnumObjects(
        [in] HWND hwndOwner,
        [in] SHCONTF grfFlags,
        [out] IEnumIDList **ppenumIDList);

    HRESULT BindToObject(
        [in] LPCITEMIDLIST pidl,
        [in] LPBC pbcReserved,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvOut);

    HRESULT BindToStorage(
        [in] LPCITEMIDLIST pidl,
        [in] LPBC pbcReserved,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvObj);

    HRESULT CompareIDs(
        [in] LPARAM lParam,
        [in] LPCITEMIDLIST pidl1,
        [in] LPCITEMIDLIST pidl2);

    HRESULT CreateViewObject(
        [in] HWND hwndOwner,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvOut);

    HRESULT GetAttributesOf(
        [in] UINT cidl,
        [in, size_is(cidl)] LPCITEMIDLIST *apidl,
        [in, out] SFGAOF *rgfInOut);

    HRESULT GetUIObjectOf(
        [in] HWND hwndOwner,
        [in] UINT cidl,
        [in, size_is(cidl)] LPCITEMIDLIST *apidl,
        [in] REFIID riid,
        [in, out, unique] UINT *prgfInOut,
        [out, iid_is(riid)] void **ppvOut);

    HRESULT GetDisplayNameOf(
        [in] LPCITEMIDLIST pidl,
        [in] SHGDNF uFlags,
        [out] STRRET *lpName);

    HRESULT SetNameOf(
        [in] HWND hwnd,
        [in] LPCITEMIDLIST pidl,
        [in, string] LPCOLESTR lpszName,
        [in] SHGDNF uFlags,
        [out] LPITEMIDLIST *ppidlOut);
}


/*****************************************************************************
 * IEnumExtraSearch interface
 */
[
    object,
    uuid(0e700be1-9db6-11d1-a1ce-00c04fd75d13),
    pointer_default(unique)
]
interface IEnumExtraSearch : IUnknown
{
    typedef IEnumExtraSearch *LPENUMEXTRASEARCH;

    typedef struct
    {
        GUID guidSearch;
        WCHAR wszFriendlyName[80];
        /*
         *WCHAR wszMenuText[80];
         *WCHAR wszHelpText[MAX_PATH];
         */
        WCHAR wszUrl[2084];
        /*
         *WCHAR wszIcon[MAX_PATH+10];
         *WCHAR wszGreyIcon[MAX_PATH+10];
         *WCHAR wszClrIcon[MAX_PATH+10];
         */
    } EXTRASEARCH, *LPEXTRASEARCH;

    HRESULT Next(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)] EXTRASEARCH *rgelt,
        [out] ULONG *pceltFetched);

    HRESULT Skip( [in] ULONG celt );
    HRESULT Reset();
    HRESULT Clone( [out] IEnumExtraSearch **ppenum );
}


/*****************************************************************************
 * IShellFolder2 interface
 */
[
    object,
    uuid(93f2f68c-1d1b-11d3-a30e-00c04f79abd1),
    pointer_default(unique)
]
interface IShellFolder2 : IShellFolder
{
    typedef struct
    {
        GUID    fmtid;
        DWORD   pid;
    } SHCOLUMNID, *LPSHCOLUMNID;
    typedef const SHCOLUMNID *LPCSHCOLUMNID;

    HRESULT GetDefaultSearchGUID( [out] GUID *lpguid );
    HRESULT EnumSearches( [out] IEnumExtraSearch **ppenum );
    HRESULT GetDefaultColumn( [in] DWORD dwReserved, [out] ULONG *pSort, [out] ULONG *pDisplay );
    HRESULT GetDefaultColumnState( [in] UINT iColumn, [out] SHCOLSTATEF *pcsFlags );
    HRESULT GetDetailsEx( [in] LPCITEMIDLIST pidl, [in] const SHCOLUMNID *pscid, [out] VARIANT *pv);
    HRESULT GetDetailsOf( [in] LPCITEMIDLIST pidl, [in] UINT iColumn, [out] SHELLDETAILS *psd);
    HRESULT MapColumnToSCID( [in] UINT iColumn, [in] SHCOLUMNID *pscid );
}

/*****************************************************************************
 * IShellItem interface
 */
[
    object,
    uuid(43826d1e-e718-42ee-bc55-a1e261c37bfe),
    pointer_default(unique)
]
interface IShellItem : IUnknown
{
    typedef [v1_enum] enum {
        SIGDN_NORMALDISPLAY                = 0,
        SIGDN_PARENTRELATIVEPARSING        = 0x80018001,
        SIGDN_DESKTOPABSOLUTEPARSING       = 0x80028000,
        SIGDN_PARENTRELATIVEEDITING        = 0x80031001,
        SIGDN_DESKTOPABSOLUTEEDITING       = 0x8004c000,
        SIGDN_FILESYSPATH                  = 0x80058000,
        SIGDN_URL                          = 0x80068000,
        SIGDN_PARENTRELATIVEFORADDRESSBAR  = 0x8007c001,
        SIGDN_PARENTRELATIVE               = 0x80080001
    } SIGDN; /* & 0xFFFF => SHGDN */

    [v1_enum] enum _SICHINTF
    {
        SICHINT_DISPLAY                       = 0x00000000,
        SICHINT_CANONICAL                     = 0x10000000,
        SICHINT_TEST_FILESYSPATH_IF_NOT_EQUAL = 0x20000000,
        SICHINT_ALLFIELDS                     = 0x80000000
    };
    typedef DWORD SICHINTF;

    HRESULT BindToHandler(
        [in] IBindCtx *pbc,
        [in] REFGUID rbhid,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvOut);

    HRESULT GetParent( [out] IShellItem **ppsi );

    HRESULT GetDisplayName(
        [in] SIGDN sigdnName,
        [out] LPWSTR *ppszName);

    HRESULT GetAttributes(
        [in] SFGAOF sfgaoMask,
        [out] SFGAOF *psfgaoAttribs);

    HRESULT Compare(
        [in] IShellItem *psi,
        [in] SICHINTF hint,
        [out] int *piOrder);
}

/*****************************************************************************
 * IShellItem2 interface
 */
[
    object,
    uuid(7E9FB0D3-919F-4307-AB2E-9B1860310C93),
    pointer_default(unique)
]
interface IShellItem2 : IShellItem
{
    HRESULT GetPropertyStore(
        [in] GETPROPERTYSTOREFLAGS flags,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);

    HRESULT GetPropertyStoreWithCreateObject(
        [in] GETPROPERTYSTOREFLAGS flags,
        [in] IUnknown *punkCreateObject,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);

    HRESULT GetPropertyStoreForKeys(
        [in, size_is(cKeys)] const PROPERTYKEY *rgKeys,
        [in] UINT cKeys,
        [in] GETPROPERTYSTOREFLAGS flags,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);

    HRESULT GetPropertyDescriptionList(
        [in] REFPROPERTYKEY keyType,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);

    HRESULT Update(
        [in, unique] IBindCtx *pbc);

    HRESULT GetProperty(
        [in] REFPROPERTYKEY key,
        [out] PROPVARIANT *ppropvar);

    HRESULT GetCLSID(
        [in] REFPROPERTYKEY key,
        [out] CLSID *pclsid);

    HRESULT GetFileTime (
        [in] REFPROPERTYKEY key,
        [out] FILETIME *pft);

    HRESULT GetInt32(
        [in] REFPROPERTYKEY key,
        [out] int *pi);

    HRESULT GetString(
        [in] REFPROPERTYKEY key,
        [out, string] LPWSTR *ppsz);

    HRESULT GetUInt32(
        [in] REFPROPERTYKEY key,
        [out] ULONG *pui);

    HRESULT GetUInt64(
        [in] REFPROPERTYKEY key,
        [out] ULONGLONG *pull);

    HRESULT GetBool(
        [in] REFPROPERTYKEY key,
        [out] BOOL *pf);
}

typedef enum tagNWMF {
    NWMF_UNLOADING        = 0x0001,
    NWMF_USERINITED       = 0x0002,
    NWMF_FIRST            = 0x0004,
    NWMF_OVERRIDEKEY      = 0x0008,
    NWMF_SHOWHELP         = 0x0010,
    NWMF_HTMLDIALOG       = 0x0020,
    NWMF_FROMDIALOGCHILD  = 0x0040,
    NWMF_USERREQUESTED    = 0x0080,
    NWMF_USERALLOWED      = 0x0100
} NWMF;

[
    uuid(d2bc4c84-3f72-4a52-a604-7bcbf3982cbb),
    object,
    pointer_default(unique)
]
interface INewWindowManager : IUnknown
{
    HRESULT EvaluateNewWindow(
        [in, string] LPCWSTR pszUrl,
        [in, string] LPCWSTR pszName,
        [in, string] LPCWSTR pszUrlContext,
        [in, string] LPCWSTR pszFeatures,
        [in]         BOOL fReplace,
        [in]         DWORD dwFlags,
        [in]         DWORD dwUserActionTime);
}

cpp_quote("#define SID_SNewWindowManager IID_INewWindowManager")

/*****************************************************************************
 * IEnumShellItems interface
 */
[
 object,
 uuid(70629033-E363-4A28-A567-0DB78006E6D7),
 pointer_default(unique)
]
interface IEnumShellItems : IUnknown
{
    [local] HRESULT Next(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)] IShellItem **rgelt,
        [out] ULONG *pceltFetched);

    [call_as(Next)] HRESULT RemoteNext(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)] IShellItem **rgelt,
        [out] ULONG *pceltFetched);

    HRESULT Skip(
        [in] ULONG celt);

    HRESULT Reset();

    HRESULT Clone(
        [out] IEnumShellItems **ppenum);
}

/*****************************************************************************
 * IShellItemArray interface
 */
[
 object,
 uuid(B63EA76D-1F85-456F-A19C-48159EFA858B),
 pointer_default(unique)
]
interface IShellItemArray : IUnknown
{
    typedef [v1_enum] enum SIATTRIBFLAGS {
        SIATTRIBFLAGS_AND            = 0x0001,
        SIATTRIBFLAGS_OR             = 0x0002,
        SIATTRIBFLAGS_APPCOMPAT      = 0x0003,
        SIATTRIBFLAGS_MASK           = 0x0003,
        SIATTRIBFLAGS_ALLITEMS       = 0x4000
    } SIATTRIBFLAGS;
    cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(SIATTRIBFLAGS)")

    HRESULT BindToHandler(
        [in, unique] IBindCtx *pbc,
        [in] REFGUID bhid,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvOut);

    HRESULT GetPropertyStore(
        [in] GETPROPERTYSTOREFLAGS flags,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);

    HRESULT GetPropertyDescriptionList(
        [in] REFPROPERTYKEY keyType,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);

    HRESULT GetAttributes(
        [in] SIATTRIBFLAGS AttribFlags,
        [in] SFGAOF sfgaoMask,
        [out] SFGAOF *psfgaoAttribs);

    HRESULT GetCount(
        [out] DWORD *pdwNumItems);

    HRESULT GetItemAt(
        [in] DWORD dwIndex,
        [out] IShellItem **ppsi);

    HRESULT EnumItems(
        [out] IEnumShellItems **ppenumShellItems);

}

typedef [v1_enum] enum DATAOBJ_GET_ITEM_FLAGS
{
    DOGIF_DEFAULT       = 0x0,
    DOGIF_TRAVERSE_LINK = 0x1,
    DOGIF_NO_HDROP      = 0x2,
    DOGIF_NO_URL        = 0x4,
    DOGIF_ONLY_IF_ONE   = 0x8
} DATAOBJ_GET_ITEM_FLAGS;
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(DATAOBJ_GET_ITEM_FLAGS)")

cpp_quote("HRESULT WINAPI SHGetNameFromIDList(PCIDLIST_ABSOLUTE pidl, SIGDN sigdnName, PWSTR *ppszName);")
cpp_quote("HRESULT WINAPI SHCreateItemFromParsingName(PCWSTR pszPath, IBindCtx *pbc, REFIID riid, void **ppv);")
cpp_quote("HRESULT WINAPI SHCreateItemFromIDList(PCIDLIST_ABSOLUTE pidl, REFIID riid, void **ppv);")
cpp_quote("HRESULT WINAPI SHGetItemFromDataObject(IDataObject *pdtobj, DATAOBJ_GET_ITEM_FLAGS dwFlags, REFIID riid, void **ppv);")
cpp_quote("HRESULT WINAPI SHGetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl);")
cpp_quote("HRESULT WINAPI SHGetItemFromObject(IUnknown *punk, REFIID riid, void **ppv);")
cpp_quote("HRESULT WINAPI SHCreateShellItemArray(PCIDLIST_ABSOLUTE pidlParent, IShellFolder* psf, UINT cidl, PCUITEMID_CHILD_ARRAY ppidl, IShellItemArray **ppsiItemArray);")
cpp_quote("HRESULT WINAPI SHCreateShellItemArrayFromShellItem(IShellItem *psi, REFIID riid, void **ppv);")
cpp_quote("HRESULT WINAPI SHCreateShellItemArrayFromDataObject(IDataObject *pdo, REFIID riid, void **ppv);")

/*****************************************************************************
 * IShellItemFilter interface
 */
[
 object,
 uuid(2659B475-EEB8-48B7-8F07-B378810F48CF),
 pointer_default(unique)
]
interface IShellItemFilter : IUnknown
{
    HRESULT IncludeItem(
        [in] IShellItem *psi);

    HRESULT GetEnumFlagsForItem(
        [in] IShellItem *psi,
        [out] SHCONTF *pgrfFlags);
}

/*****************************************************************************
 * FOLDERSETTINGS
 */
typedef char *LPVIEWSETTINGS;

typedef enum
{
    FWF_AUTOARRANGE         = 0x00000001,
    FWF_ABBREVIATEDNAMES    = 0x00000002,
    FWF_SNAPTOGRID          = 0x00000004,
    FWF_OWNERDATA           = 0x00000008,
    FWF_BESTFITWINDOW       = 0x00000010,
    FWF_DESKTOP             = 0x00000020,
    FWF_SINGLESEL           = 0x00000040,
    FWF_NOSUBFOLDERS        = 0x00000080,
    FWF_TRANSPARENT         = 0x00000100,
    FWF_NOCLIENTEDGE        = 0x00000200,
    FWF_NOSCROLL            = 0x00000400,
    FWF_ALIGNLEFT           = 0x00000800,
    FWF_NOICONS             = 0x00001000,
    FWF_SHOWSELALWAYS       = 0x00002000,
    FWF_NOVISIBLE           = 0x00004000,
    FWF_SINGLECLICKACTIVATE = 0x00008000,
    FWF_NOWEBVIEW           = 0x00010000,
    FWF_HIDEFILENAMES       = 0x00020000,
    FWF_CHECKSELECT         = 0x00040000,
    FWF_NOENUMREFRESH       = 0x00080000,
    FWF_NOGROUPING          = 0x00100000,
    FWF_FULLROWSELECT       = 0x00200000,
    FWF_NOFILTERS           = 0x00400000,
    FWF_NOCOLUMNHEADER      = 0x00800000,
    FWF_NOHEADERINALLVIEWS  = 0x01000000,
    FWF_EXTENDEDTILES       = 0x02000000,
    FWF_TRICHECKSELECT      = 0x04000000,
    FWF_AUTOCHECKSELECT     = 0x08000000,
    FWF_NOBROWSERVIEWSTATE  = 0x10000000,
    FWF_SUBSETGROUPS        = 0x20000000,
    FWF_USESEARCHFOLDER     = 0x40000000,
    FWF_ALLOWRTLREADING     = 0x80000000
} FOLDERFLAGS;

typedef enum
{
    FVM_AUTO       =-1,
    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_CONTENT    = 8,
    FVM_LAST       = FVM_CONTENT
} FOLDERVIEWMODE;

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

/*****************************************************************************
 * IShellIcon interface
 */
[
    uuid(000214e5-0000-0000-c000-000000000046),
    object,
    pointer_default(unique)
]
interface IShellIcon : IUnknown
{
    HRESULT GetIconOf(
        [in] PCUITEMID_CHILD pidl,
        [in] UINT flags,
        [out] int *pIconIndex);
}

/*****************************************************************************
 * IShellView interface
 */
interface IShellBrowser;  /* forward declaration */
[
    object,
    uuid(000214e3-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellView : IOleWindow
{
    typedef IShellView *LPSHELLVIEW;

    cpp_quote("#define SVSI_DESELECT       0x00000000")
    cpp_quote("#define SVSI_SELECT         0x00000001")
    cpp_quote("#define SVSI_EDIT           0x00000003")
    cpp_quote("#define SVSI_DESELECTOTHERS 0x00000004")
    cpp_quote("#define SVSI_ENSUREVISIBLE  0x00000008")
    cpp_quote("#define SVSI_FOCUSED        0x00000010")
    cpp_quote("#define SVSI_TRANSLATEPT    0x00000020")
    cpp_quote("#define SVSI_SELECTIONMARK  0x00000040")
    cpp_quote("#define SVSI_POSITIONITEM   0x00000080")
    cpp_quote("#define SVSI_CHECK          0x00000100")
    cpp_quote("#define SVSI_NOSTATECHANGE  0x80000000")

    typedef UINT SVSIF;

    typedef enum
    {
        SVGIO_BACKGROUND     = 0x00000000,
        SVGIO_SELECTION      = 0x00000001,
        SVGIO_ALLVIEW        = 0x00000002,
        SVGIO_CHECKED        = 0x00000003,
        SVGIO_TYPE_MASK      = 0x0000000f,
        SVGIO_FLAG_VIEWORDER = 0x80000000,
    } SVGIO;

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

    HRESULT TranslateAccelerator( [in] MSG *pmsg );
    HRESULT EnableModeless( [in] BOOL fEnable );
    HRESULT UIActivate( [in] UINT uState );
    HRESULT Refresh();
    HRESULT CreateViewWindow(
        [in] IShellView *psvPrevious,
        [in] LPCFOLDERSETTINGS lpfs,
        [in] IShellBrowser *psb,
        [out] RECT *prcView,
        [out] HWND *phWnd);

    HRESULT DestroyViewWindow();
    HRESULT GetCurrentInfo( [out] LPFOLDERSETTINGS lpfs );

    [local] HRESULT AddPropertySheetPages(
        [in] DWORD dwReserved,
        [in] LPFNSVADDPROPSHEETPAGE pfn,
        [in] LPARAM lparam);

    HRESULT SaveViewState();
    HRESULT SelectItem(
        [in] LPCITEMIDLIST pidlItem,
        [in] SVSIF uFlags);
    HRESULT GetItemObject(
        [in] UINT uItem,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);
}

[
    object,
    uuid(88e39e80-3578-11cf-ae69-08002b2e1262),
    pointer_default(unique)
]
interface IShellView2 : IShellView
{
    typedef GUID SHELLVIEWID;
cpp_quote("#include <pshpack8.h>")
    typedef struct _SV2CVW2_PARAMS
    {
        DWORD cbSize;
        IShellView *psvPrev;
        LPCFOLDERSETTINGS pfs;
        IShellBrowser *psbOwner;
        RECT *prcView;
        SHELLVIEWID const *pvid;
        HWND hwndView;
    } SV2CVW2_PARAMS, *LPSV2CVW2_PARAMS;
cpp_quote("#include <poppack.h>")

    HRESULT GetView(
        [in, out] SHELLVIEWID *view_guid,
        [in] ULONG view_type
    );
    HRESULT CreateViewWindow2(
        [in] LPSV2CVW2_PARAMS view_params
    );
    HRESULT HandleRename(
        [in] LPCITEMIDLIST new_pidl
    );
    HRESULT SelectAndPositionItem(
        [in] LPCITEMIDLIST item,
        [in] UINT flags,
        [in] POINT *point
    );
}

/*****************************************************************************
 * IFolderView interface
 */
[
    uuid(cde725b0-ccc9-4519-917e-325d72fab4ce),
    object,
    pointer_default(unique)
]
interface IFolderView : IUnknown
{
    HRESULT GetCurrentViewMode( [out] UINT *mode );
    HRESULT SetCurrentViewMode( [in] UINT mode );
    HRESULT GetFolder( [in] REFIID riid, [out, iid_is(riid)] void **ppv );
    HRESULT Item(
        [in] int index,
        [out] PITEMID_CHILD *ppidl
    );
    HRESULT ItemCount(
        [in] UINT flags,
        [out] int *items
    );
    HRESULT Items(
        [in] UINT flags,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv
    );
    HRESULT GetSelectionMarkedItem( [out] int *item );
    HRESULT GetFocusedItem( [out] int *item );
    HRESULT GetItemPosition(
        [in] PCUITEMID_CHILD pidl,
        [out] POINT* ppt
    );
    HRESULT GetSpacing( [in, out, unique] POINT* pt );
    HRESULT GetDefaultSpacing( [out] POINT* pt );
    HRESULT GetAutoArrange();
    HRESULT SelectItem(
        [in] int item,
        [in] DWORD flags
    );
    HRESULT SelectAndPositionItems(
        [in] UINT cidl,
        [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl,
        [in, unique, size_is(cidl)] POINT* apt,
        [in] DWORD flags
    );
}

/*****************************************************************************
 * IShellBrowser interface
 */
[
    object,
    uuid(000214e2-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellBrowser : IOleWindow
{
    typedef IShellBrowser *LPSHELLBROWSER;

cpp_quote("#define SBSP_DEFBROWSER            0x00000000")
cpp_quote("#define SBSP_SAMEBROWSER           0x00000001")
cpp_quote("#define SBSP_NEWBROWSER            0x00000002")
cpp_quote("#define SBSP_DEFMODE               0x00000000")
cpp_quote("#define SBSP_OPENMODE              0x00000010")
cpp_quote("#define SBSP_EXPLOREMODE           0x00000020")
cpp_quote("#define SBSP_HELPMODE              0x00000040")
cpp_quote("#define SBSP_NOTRANSFERHIST        0x00000080")
cpp_quote("#define SBSP_ABSOLUTE              0x00000000")
cpp_quote("#define SBSP_RELATIVE              0x00001000")
cpp_quote("#define SBSP_PARENT                0x00002000")
cpp_quote("#define SBSP_NAVIGATEBACK          0x00004000")
cpp_quote("#define SBSP_NAVIGATEFORWARD       0x00008000")
cpp_quote("#define SBSP_ALLOW_AUTONAVIGATE    0x00010000")
cpp_quote("#define SBSP_KEEPSAMETEMPLATE      0x00020000")
cpp_quote("#define SBSP_KEEPWORDWHEELTEXT     0x00040000")
cpp_quote("#define SBSP_ACTIVATE_NOFOCUS      0x00080000")
cpp_quote("#define SBSP_CREATENOHISTORY       0x00100000")
cpp_quote("#define SBSP_PLAYNOSOUND           0x00200000")
cpp_quote("#define SBSP_CALLERUNTURUSTED      0x00800000")
cpp_quote("#define SBSP_TRUSTFIRSTDOWNLOAD    0x01000000")
cpp_quote("#define SBSP_UNTRUSTEDFORDOWNLOAD  0x02000000")
cpp_quote("#define SBSP_NOAUTOSELECT          0x04000000")
cpp_quote("#define SBSP_WRITENOHISTORY        0x08000000")
cpp_quote("#define SBSP_TRUSTEDFORACTIVEX     0x10000000")
cpp_quote("#define SBSP_FEEDNAVIGATION        0x20000000")
cpp_quote("#define SBSP_REDIRECT              0x40000000")
cpp_quote("#define SBSP_INITIATEDBYHLINKFRAME 0x80000000")

cpp_quote("#define FCW_STATUS      0x0001")
cpp_quote("#define FCW_TOOLBAR     0x0002")
cpp_quote("#define FCW_TREE        0x0003")
cpp_quote("#define FCW_INTERNETBAR 0x0006")
cpp_quote("#define FCW_PROGRESS    0x0008")

cpp_quote("#define FCT_MERGE       0x0001")
cpp_quote("#define FCT_CONFIGABLE  0x0002")
cpp_quote("#define FCT_ADDTOEND    0x0004")

cpp_quote("#if 0")
    typedef LPARAM LPTBBUTTONSB;
cpp_quote("#else")
cpp_quote("#include <commctrl.h>")
cpp_quote("typedef LPTBBUTTON LPTBBUTTONSB;")
cpp_quote("#endif")

    HRESULT InsertMenusSB(
        [in] HMENU hmenuShared,
        [in, out] LPOLEMENUGROUPWIDTHS lpMenuWidths);

    HRESULT SetMenuSB(
        [in] HMENU hmenuShared,
        [in] HOLEMENU holemenuReserved,
        [in] HWND hwndActiveObject);

    HRESULT RemoveMenusSB( [in] HMENU hmenuShared );
    HRESULT SetStatusTextSB( [in, unique] LPCOLESTR pszStatusText );
    HRESULT EnableModelessSB( [in] BOOL fEnable );
    HRESULT TranslateAcceleratorSB( [in] MSG *pmsg, [in] WORD wID );

    HRESULT BrowseObject(
        [in] LPCITEMIDLIST pidl,
        [in] UINT wFlags);

    HRESULT GetViewStateStream(
        [in] DWORD grfMode,
        [out] IStream **ppStrm);

    HRESULT GetControlWindow(
        [in] UINT id,
        [out] HWND *phwnd);

    [local] HRESULT SendControlMsg(
        [in] UINT id,
        [in] UINT uMsg,
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [in] LRESULT *pret);

    HRESULT QueryActiveShellView( [out] IShellView **ppshv );
    HRESULT OnViewWindowActive( [in] IShellView *pshv );

    [local]
    HRESULT SetToolbarItems(
        [in] LPTBBUTTONSB lpButtons,
        [in] UINT nButtons,
        [in] UINT uFlags);
}


/*****************************************************************************
 * IShellLinkA interface
 */
[
    object,
    uuid(000214ee-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellLinkA : IUnknown
{
    typedef enum
    {
        SLR_NO_UI               = 0x0001,
        SLR_ANY_MATCH           = 0x0002,
        SLR_UPDATE              = 0x0004,
        SLR_NOUPDATE            = 0x0008,
        SLR_NOSEARCH            = 0x0010,
        SLR_NOTRACK             = 0x0020,
        SLR_NOLINKINFO          = 0x0040,
        SLR_INVOKE_MSI          = 0x0080,
        SLR_NO_UI_WITH_MSG_PUMP = 0x0101,
    } SLR_FLAGS;

    typedef enum
    {
        SLGP_SHORTPATH   = 0x0001,
        SLGP_UNCPRIORITY = 0x0002,
        SLGP_RAWPATH     = 0x0004,
    } SLGP_FLAGS;

    HRESULT GetPath(
        [out, size_is(cch)] LPSTR pszFile,
        [in] int cch,
        [in, out, unique] WIN32_FIND_DATAA *pfd,
        [in] DWORD fFlags);

    HRESULT GetIDList( [out] LPITEMIDLIST * ppidl );

    HRESULT SetIDList( [in] LPCITEMIDLIST pidl );

    HRESULT GetDescription(
        [out, size_is(cch)] LPSTR pszName,
        [in] int cch);

    HRESULT SetDescription( [in] LPCSTR pszName );

    HRESULT GetWorkingDirectory(
        [out, size_is(cch)] LPSTR pszDir,
        [in] int cch);

    HRESULT SetWorkingDirectory( [in] LPCSTR pszDir );

    HRESULT GetArguments(
        [out, size_is(cch)] LPSTR pszArgs,
        [in] int cch);

    HRESULT SetArguments( [in] LPCSTR pszArgs );

    HRESULT GetHotkey( [out] WORD *pwHotkey );

    HRESULT SetHotkey( [in] WORD wHotkey );

    HRESULT GetShowCmd( [out] int *piShowCmd );

    HRESULT SetShowCmd( [in] int iShowCmd );

    HRESULT GetIconLocation(
        [out, size_is(cch)] LPSTR pszIconPath,
        [in] int cch,
        [out] int *piIcon);

    HRESULT SetIconLocation(
        [in] LPCSTR pszIconPath,
        [in] int iIcon);

    HRESULT SetRelativePath(
        [in] LPCSTR pszPathRel,
        [in] DWORD dwReserved);

    HRESULT Resolve(
        [in] HWND hwnd,
        [in] DWORD fFlags);

    HRESULT SetPath( [in] LPCSTR pszFile );
}


/*****************************************************************************
 * IShellLinkW interface
 */
[
    object,
    uuid(000214f9-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellLinkW : IUnknown
{
    HRESULT GetPath(
        [out, size_is(cch)] LPWSTR pszFile,
        [in] int cch,
        [in, out] WIN32_FIND_DATAW *pfd,
        [in] DWORD fFlags);

    HRESULT GetIDList( [out] LPITEMIDLIST * ppidl );

    HRESULT SetIDList( [in] LPCITEMIDLIST pidl );

    HRESULT GetDescription(
        [out, size_is(cch)] LPWSTR pszName,
        [in] int cch);

    HRESULT SetDescription( [in] LPCWSTR pszName );

    HRESULT GetWorkingDirectory(
        [out, size_is(cch)] LPWSTR pszDir,
        [in] int cch);

    HRESULT SetWorkingDirectory( [in] LPCWSTR pszDir );

    HRESULT GetArguments(
        [out, size_is(cch)] LPWSTR pszArgs,
        [in] int cch);

    HRESULT SetArguments( [in] LPCWSTR pszArgs );

    HRESULT GetHotkey( [out] WORD *pwHotkey );

    HRESULT SetHotkey( [in] WORD wHotkey );

    HRESULT GetShowCmd( [out] int *piShowCmd );

    HRESULT SetShowCmd( [in] int iShowCmd );

    HRESULT GetIconLocation(
        [out, size_is(cch)] LPWSTR pszIconPath,
        [in] int cch,
        [out] int *piIcon);

    HRESULT SetIconLocation(
        [in] LPCWSTR pszIconPath,
        [in] int iIcon);

    HRESULT SetRelativePath(
        [in] LPCWSTR pszPathRel,
        [in] DWORD dwReserved);

    HRESULT Resolve(
        [in] HWND hwnd,
        [in] DWORD fFlags);

    HRESULT SetPath( [in] LPCWSTR pszFile );
}

cpp_quote("#define IShellLink WINELIB_NAME_AW(IShellLink)")


/*****************************************************************************
 * IShellExtInit interface
 */
[
    object,
    uuid(000214e8-0000-0000-c000-000000000046),
    pointer_default(unique),
    local
]
interface IShellExtInit : IUnknown
{
    typedef IShellExtInit *LPSHELLEXTINIT;

    HRESULT Initialize(
        [in] LPCITEMIDLIST pidlFolder,
        [in] IDataObject *pdtobj,
        [in] HKEY hkeyProgID);
}


/*******************************************************************************/
/* Note: the following interfaces are not in shobjidl.idl under Windows, they  */
/* are declared directly in shlobj.h. It hopefully won't break anything to put */
/* them here anyway.                                                           */
/*******************************************************************************/

#ifndef MAX_PATH
#define MAX_PATH 260
#endif


/*****************************************************************************
 * IPersistFolder3 interface
 */
[
    object,
    uuid(cef04fdf-fe72-11d2-87a5-00c04f6837cf),
    pointer_default(unique)
]
interface IPersistFolder3 : IPersistFolder2
{
    typedef struct
    {
        LPITEMIDLIST	pidlTargetFolder;
	WCHAR		szTargetParsingName[MAX_PATH];
	WCHAR		szNetworkProvider[MAX_PATH];
	DWORD		dwAttributes;
	int		csidl;
    } PERSIST_FOLDER_TARGET_INFO;

    HRESULT InitializeEx(
        [in] IBindCtx *pbc,
        [in] LPCITEMIDLIST pidlRoot,
        [in] const PERSIST_FOLDER_TARGET_INFO *ppfti);

    HRESULT GetFolderTargetInfo( [out] PERSIST_FOLDER_TARGET_INFO *ppfti );
}


/*****************************************************************************
 * IExtractIconA interface
 */
[
    object,
    uuid(000214eb-0000-0000-c000-000000000046),
    pointer_default(unique),
    local
]
interface IExtractIconA : IUnknown
{
cpp_quote("#define GIL_OPENICON     0x0001")
cpp_quote("#define GIL_FORSHELL     0x0002")
cpp_quote("#define GIL_ASYNC        0x0020")
cpp_quote("#define GIL_DEFAULTICON  0x0040")
cpp_quote("#define GIL_FORSHORTCUT  0x0080")

cpp_quote("#define GIL_SIMULATEDOC  0x0001")
cpp_quote("#define GIL_PERINSTANCE  0x0002")
cpp_quote("#define GIL_PERCLASS     0x0004")
cpp_quote("#define GIL_NOTFILENAME  0x0008")
cpp_quote("#define GIL_DONTCACHE    0x0010")

    typedef IExtractIconA *LPEXTRACTICONA;

    HRESULT GetIconLocation(
        [in] UINT uFlags,
        [out, size_is(cchMax)] LPSTR szIconFile,
        [in] UINT cchMax,
        [out] INT *piIndex,
        [out] UINT *pwFlags);

    HRESULT Extract(
        [in] LPCSTR pszFile,
        [in] UINT nIconIndex,
        [out] HICON *phiconLarge,
        [out] HICON *phiconSmall,
        [in] UINT nIconSize );
}


/*****************************************************************************
 * IExtractIconW interface
 */
[
    object,
    uuid(000214fa-0000-0000-c000-000000000046),
    pointer_default(unique),
    local
]
interface IExtractIconW : IUnknown
{
    typedef IExtractIconW *LPEXTRACTICONW;

    HRESULT GetIconLocation(
        [in] UINT uFlags,
        [out, size_is(cchMax)] LPWSTR szIconFile,
        [in] UINT cchMax,
        [out] INT *piIndex,
        [out] UINT *pwFlags);

    HRESULT Extract(
        [in] LPCWSTR pszFile,
        [in] UINT nIconIndex,
        [out] HICON *phiconLarge,
        [out] HICON *phiconSmall,
        [in] UINT nIconSize );
}

cpp_quote("#define LPEXTRACTICON WINELIB_NAME_AW(LPEXTRACTICON)")
cpp_quote("#define IExtractIcon WINELIB_NAME_AW(IExtractIcon)")


/*****************************************************************************
 * ICommDlgBrowser interface
 */
[
    object,
    uuid(000214f1-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface ICommDlgBrowser : IUnknown
{
cpp_quote("#define CDBOSC_SETFOCUS     0x00000000")
cpp_quote("#define CDBOSC_KILLFOCUS    0x00000001")
cpp_quote("#define CDBOSC_SELCHANGE    0x00000002")
cpp_quote("#define CDBOSC_RENAME       0x00000003")
cpp_quote("#define CDBOSC_STATECHANGE  0x00000004")

    typedef ICommDlgBrowser *LPCOMMDLGBROWSER;

    HRESULT OnDefaultCommand( [in] IShellView *shv );
    HRESULT OnStateChange( [in] IShellView *shv, [in] ULONG uChange );
    HRESULT IncludeObject( [in] IShellView *shv, [in] LPCITEMIDLIST pidl );
}


/*****************************************************************************
 * ICommDlgBrowser2 interface
 */
[
 object,
 uuid(10339516-2894-11D2-9039-00C04F8EEB3E),
 pointer_default(unique)
]
interface ICommDlgBrowser2 : ICommDlgBrowser
{

    HRESULT Notify(
        [in] IShellView *ppshv,
        [in] DWORD dwNotifyType);

    HRESULT GetDefaultMenuText(
        [in] IShellView *ppshv,
        [out, string, size_is(cchMax)] LPWSTR pszText,
        [in] int cchMax);

    HRESULT GetViewFlags(
        [out] DWORD *pdwFlags);
}


/*****************************************************************************
 * ICommDlgBrowser3 interface
 */
[
 object,
 uuid(C8AD25A1-3294-41EE-8165-71174BD01C57),
 pointer_default(unique)
]
interface ICommDlgBrowser3 : ICommDlgBrowser2
{

    HRESULT OnColumnClicked(
        [in] IShellView *ppshv,
        [in] int iColumn);

    HRESULT GetCurrentFilter(
        [out, string, size_is(cchFileSpec)] LPWSTR pszFileSpec,
        [in] int cchFileSpec);

    HRESULT OnPreviewCreated(
        [in] IShellView *ppshv);
}

/*****************************************************************************
 * IDockingWindow interface
 */
[
    object,
    uuid(012dd920-7b26-11d0-8ca9-00a0c92dbfe8)
]
interface IDockingWindow : IOleWindow
{
    HRESULT ShowDW(
        [in] BOOL fShow);

    HRESULT CloseDW(
        [in] DWORD dwReserved);

    HRESULT ResizeBorderDW(
        [in] LPCRECT prcBorder,
        [in] IUnknown *punkToolbarSite,
        [in] BOOL fReserved);
};


/*****************************************************************************
 * IDockingWindowFrame interface
 */
[
    object,
    uuid(47d2657a-7b27-11d0-8ca9-00a0c92dbfe8),
    pointer_default(unique),
    local
]
interface IDockingWindowFrame : IOleWindow
{
cpp_quote("#define DWFRF_NORMAL           0x0000")
cpp_quote("#define DWFRF_DELETECONFIGDATA 0x0001")
cpp_quote("#define DWFAF_HIDDEN           0x0001")

    HRESULT AddToolbar(
        [in] IUnknown *punkSrc,
        [in] LPCWSTR pwszItem,
        [in] DWORD dwAddFlags);

    HRESULT RemoveToolbar(
        [in] IUnknown *punkSrc,
        [in] DWORD dwRemoveFlags);

    HRESULT FindToolbar(
        [in] LPCWSTR pwszItem,
        [in] REFIID riid,
        [out] LPVOID *ppvObj);
}


/*****************************************************************************
 * IDragSourceHelper interface
 */
[
    object,
    uuid(de5bf786-477a-11d2-839d-00c04fd918d0),
    pointer_default(unique),
    local
]
interface IDragSourceHelper : IUnknown
{
    typedef struct
    {
        SIZE     sizeDragImage;
        POINT    ptOffset;
        HBITMAP  hbmpDragImage;
        COLORREF crColorKey;
    } SHDRAGIMAGE, *LPSHDRAGIMAGE;

  HRESULT InitializeFromBitmap(
      [in] LPSHDRAGIMAGE pshdi,
      [in] IDataObject *pDataObject);

  HRESULT InitializeFromWindow(
      [in] HWND hwnd,
      [in] POINT *ppt,
      [in] IDataObject *pDataObject);
}


/*****************************************************************************
 * IDropTargetHelper interface
 */
[
    object,
    uuid(4657278b-411b-11d2-839a-00c04fd918d0),
    pointer_default(unique),
    local
]
interface IDropTargetHelper : IUnknown
{
    HRESULT DragEnter(
        [in] HWND hwndTarget,
        [in] IDataObject *pDataObject,
        [in] POINT *ppt,
        [in] DWORD dwEffect);

    HRESULT DragLeave();

    HRESULT DragOver(
        [in] POINT *ppt,
        [in] DWORD dwEffect);

    HRESULT Drop(
        [in] IDataObject *pDataObject,
        [in] POINT *ppt,
        [in] DWORD dwEffect);

    HRESULT Show( [in] BOOL fShow );
}


/*****************************************************************************
 * IContextMenu interface
 */
[
    object,
    uuid(000214e4-0000-0000-c000-000000000046),
    pointer_default(unique),
    local
]
interface IContextMenu : IUnknown
{
cpp_quote("#define CMF_NORMAL        0x00000000")
cpp_quote("#define CMF_DEFAULTONLY   0x00000001")
cpp_quote("#define CMF_VERBSONLY     0x00000002")
cpp_quote("#define CMF_EXPLORE       0x00000004")
cpp_quote("#define CMF_NOVERBS       0x00000008")
cpp_quote("#define CMF_CANRENAME     0x00000010")
cpp_quote("#define CMF_NODEFAULT     0x00000020")
cpp_quote("#define CMF_INCLUDESTATIC 0x00000040")
cpp_quote("#define CMF_EXTENDEDVERBS 0x00000100")
cpp_quote("#define CMF_RESERVED      0xffff0000")

cpp_quote("#define GCS_VERBA         0x00000000")
cpp_quote("#define GCS_HELPTEXTA     0x00000001")
cpp_quote("#define GCS_VALIDATEA     0x00000002")
cpp_quote("#define GCS_VERBW         0x00000004")
cpp_quote("#define GCS_HELPTEXTW     0x00000005")
cpp_quote("#define GCS_VALIDATEW     0x00000006")
cpp_quote("#define GCS_UNICODE       0x00000004")
cpp_quote("#define GCS_VERB          WINELIB_NAME_AW(GCS_VERB)")
cpp_quote("#define GCS_HELPTEXT      WINELIB_NAME_AW(GCS_HELPTEXT)")
cpp_quote("#define GCS_VALIDATE      WINELIB_NAME_AW(GCS_VALIDATE)")

cpp_quote("#define CMDSTR_NEWFOLDERA   \"NewFolder\"")
cpp_quote("#define CMDSTR_VIEWLISTA    \"ViewList\"")
cpp_quote("#define CMDSTR_VIEWDETAILSA \"ViewDetails\"")
cpp_quote("#if defined(__GNUC__)")
cpp_quote("# define CMDSTR_NEWFOLDERW (const WCHAR []){ 'N','e','w','F','o','l','d','e','r',0 }")
cpp_quote("# define CMDSTR_VIEWLISTW (const WCHAR []){ 'V','i','e','w','L','i','s','t',0 }")
cpp_quote("# define CMDSTR_VIEWDETAILSW (const WCHAR []){ 'V','i','e','w','D','e','t','a','i','l','s',0 }")
cpp_quote("#elif defined(_MSC_VER)")
cpp_quote("# define CMDSTR_NEWFOLDERW   L\"NewFolder\"")
cpp_quote("# define CMDSTR_VIEWLISTW    L\"ViewList\"")
cpp_quote("# define CMDSTR_VIEWDETAILSW L\"ViewDetails\"")
cpp_quote("#else")
cpp_quote("static const WCHAR CMDSTR_NEWFOLDERW[] = {'N','e','w','F','o','l','d','e','r',0};")
cpp_quote("static const WCHAR CMDSTR_VIEWLISTW [] = {'V','i','e','w','L','i','s','t',0};")
cpp_quote("static const WCHAR CMDSTR_VIEWDETAILSW[] = {'V','i','e','w','D','e','t','a','i','l','s',0};")
cpp_quote("#endif")
cpp_quote("#define CMDSTR_NEWFOLDER    WINELIB_NAME_AW(CMDSTR_NEWFOLDER)")
cpp_quote("#define CMDSTR_VIEWLIST     WINELIB_NAME_AW(CMDSTR_VIEWLIST)")
cpp_quote("#define CMDSTR_VIEWDETAILS  WINELIB_NAME_AW(CMDSTR_VIEWDETAILS)")

cpp_quote("#define CMIC_MASK_HOTKEY         SEE_MASK_HOTKEY")
cpp_quote("#define CMIC_MASK_ICON           SEE_MASK_ICON")
cpp_quote("#define CMIC_MASK_FLAG_NO_UI     SEE_MASK_FLAG_NO_UI")
cpp_quote("#define CMIC_MASK_UNICODE        SEE_MASK_UNICODE")
cpp_quote("#define CMIC_MASK_NO_CONSOLE     SEE_MASK_NO_CONSOLE")
cpp_quote("#define CMIC_MASK_HASLINKNAME    SEE_MASK_HASLINKNAME")
cpp_quote("#define CMIC_MASK_FLAG_SEP_VDM   SEE_MASK_FLAG_SEPVDM")
cpp_quote("#define CMIC_MASK_HASTITLE       SEE_MASK_HASTITLE")
cpp_quote("#define CMIC_MASK_ASYNCOK        SEE_MASK_ASYNCOK")
cpp_quote("#define CMIC_MASK_NOASYNC        SEE_MASK_NOASYNC")
cpp_quote("#define CMIC_MASK_SHIFT_DOWN     0x10000000")
cpp_quote("#define CMIC_MASK_PTINVOKE       0x20000000")
cpp_quote("#define CMIC_MASK_CONTROL_DOWN   0x40000000")
cpp_quote("#define CMIC_MASK_FLAG_LOG_USAGE SEE_MASK_FLAG_LOG_USAGE")
cpp_quote("#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;

    HRESULT QueryContextMenu(
        [in] HMENU hmenu,
        [in] UINT indexMenu,
        [in] UINT idCmdFirst,
        [in] UINT idCmdLast,
        [in] UINT uFlags);

    HRESULT InvokeCommand( [in] LPCMINVOKECOMMANDINFO lpici );

    HRESULT GetCommandString(
        [in] UINT_PTR idCmd,
        [in] UINT uType,
        [out] UINT *pwReserved,
        [out, size_is(cchMax)] LPSTR pszName,
        [in] UINT cchMax);
}


/*****************************************************************************
 * IContextMenu2 interface
 */
[
    object,
    uuid(000214f4-0000-0000-c000-000000000046),
    pointer_default(unique),
    local
]
interface IContextMenu2 : IContextMenu
{
    typedef IContextMenu2 *LPCONTEXTMENU2;

    HRESULT HandleMenuMsg(
        [in] UINT uMsg,
        [in] WPARAM wParam,
        [in] LPARAM lParam);
}


/*****************************************************************************
 * IContextMenu3 interface
 */
[
    object,
    uuid(bcfce0a0-ec17-11d0-8d10-00a0c90f2719),
    pointer_default(unique),
    local
]
interface IContextMenu3 : IContextMenu2
{
    typedef IContextMenu3 *LPCONTEXTMENU3;

    HRESULT HandleMenuMsg2(
        [in] UINT uMsg,
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] LRESULT *plResult);
}


[
    object,
    uuid(3409e930-5a39-11d1-83fa-00a0c90dc849),
    pointer_default(unique),
    local
]
interface IContextMenuCB : IUnknown
{
    HRESULT CallBack(
        [in] IShellFolder *psf,
        [in] HWND hwndOwner,
        [in] IDataObject *pdtobj,
        [in] UINT uMsg,
        [in] WPARAM wParam,
        [in] LPARAM lParam);
}

/*****************************************************************************
 * IShellExecuteHookA interface
 */
[
    object,
    uuid(000214f5-0000-0000-c000-000000000046),
    pointer_default(unique),
    local
]
interface IShellExecuteHookA : IUnknown
{
    cpp_quote("struct _SHELLEXECUTEINFOA;")
    HRESULT Execute(
        [in, out] struct _SHELLEXECUTEINFOA* pei);
}


/*****************************************************************************
 * IShellExecuteHookW interface
 */
[
    object,
    uuid(000214fb-0000-0000-c000-000000000046),
    pointer_default(unique),
    local
]
interface IShellExecuteHookW : IUnknown
{
    cpp_quote("struct _SHELLEXECUTEINFOW;")
    HRESULT Execute(
		[in, out] struct _SHELLEXECUTEINFOW* pei);
}

/*****************************************************************************
 * IShellLinkDataList interface
 */
[
    object,
    uuid(45e2b4ae-b1c3-11d0-b92f-00a0c90312e1),
    pointer_default(unique)
]
interface IShellLinkDataList : IUnknown
{
    [local] HRESULT AddDataBlock(
                [in] void *pDataBlock);
    [local] HRESULT CopyDataBlock(
                [in] DWORD dwSig,
                [out] void **ppDataBlock);
    HRESULT RemoveDataBlock(
                [in] DWORD dwSig);
    HRESULT GetFlags(
                [out] DWORD *pdwFlags);
    HRESULT SetFlags(
                [in] DWORD dwFlags);
}


/*****************************************************************************
 * IResolveShellLink interface
 */
[
    object,
    uuid(5cd52983-9449-11d2-963a-00c04f79adf0),
    pointer_default(unique)
]
interface IResolveShellLink : IUnknown
{
    HRESULT ResolveShellLink(
                [in] IUnknown *punk,
                [in] HWND hwnd,
                [in] DWORD fFlags);
}


/*****************************************************************************
 * IURLSearchHook interface
 */
[
    object,
    uuid(ac60f6a0-0fd9-11d0-99cb-00c04fd64497),
    pointer_default(unique),
    local
]
interface IURLSearchHook : IUnknown
{
    HRESULT Translate(
                [in, out] LPWSTR lpwszSearchURL,
                [in] DWORD cchBufferSize);
}


/*****************************************************************************
 * ISearchContext interface
 */
[
    object,
    uuid(09f656a2-41af-480c-88f7-16cc0d164615),
    pointer_default(unique),
    local
]
interface ISearchContext : IUnknown
{
    HRESULT GetSearchUrl(
                [in] BSTR *pbstrSearchUrl);
    HRESULT GetSearchText(
                [in] BSTR *pbstrSearchText);
    HRESULT GetSearchStyle(
                [in] BSTR *pdwSearchStyle);
}


/*****************************************************************************
 * IURLSearchHook2 interface
 */
[
    object,
    uuid(5ee44da4-6d32-46e3-86bc-07540dedd0e0),
    pointer_default(unique),
    local
]
interface IURLSearchHook2 : IURLSearchHook
{
    HRESULT TranslateWithSearchContext(
                [in, out] LPWSTR lpwszSearchURL,
                [in] DWORD cchBufferSize,
                [in] ISearchContext *pSearchContext);
}


cpp_quote("#define INewShortcutHook WINELIB_NAME_AW(INewShortcutHook)")

/*****************************************************************************
 * INewShortcutHookA interface
 */
[
    object,
    uuid(000214e1-0000-0000-c000-000000000046),
    pointer_default(unique),
    local
]
interface INewShortcutHookA : IUnknown
{
    HRESULT SetReferent(
                [in] LPCSTR pcszReferent,
                [in] HWND hwnd);
    HRESULT GetReferent(
                [out] LPSTR pcszReferent,
                [in] int cchReferent);
    HRESULT SetFolder(
                [in] LPCSTR pcszReferent);
    HRESULT GetFolder(
                [out] LPSTR pcszReferent,
                [in] int cchFolder);
    HRESULT GetName(
                [out] LPSTR pszName,
                [in] int cchName);
    HRESULT GetExtension(
                [out] LPSTR pszExtension,
                [in] int cchExtension);
} 


/*****************************************************************************
 * INewShortcutHookW interface
 */
[
    object,
    uuid(000214f7-0000-0000-c000-000000000046),
    pointer_default(unique),
    local
]
interface INewShortcutHookW : IUnknown
{
    HRESULT SetReferent(
                [in] LPCWSTR pcszReferent,
                [in] HWND hwnd);
    HRESULT GetReferent(
                [out] LPWSTR pcszReferent,
                [in] int cchReferent);
    HRESULT SetFolder(
                [in] LPCWSTR pcszReferent);
    HRESULT GetFolder(
                [out] LPWSTR pcszReferent,
                [in] int cchFolder);
    HRESULT GetName(
                [out] LPWSTR pszName,
                [in] int cchName);
    HRESULT GetExtension(
                [out] LPWSTR pszExtension,
                [in] int cchExtension);
} 

/*****************************************************************************
 * IRunnableTask interface
 */
[
    object,
    uuid(85788d00-6807-11d0-b810-00c04fd706ec),
    pointer_default(unique),
    local
]
interface IRunnableTask : IUnknown
{
    HRESULT Run();
    HRESULT Kill([in] BOOL fWait);
    HRESULT Suspend();
    HRESULT Resume();
    ULONG IsRunning();
}

/*****************************************************************************
 * IShellChangeNotify interface
 */
[
    object,
    uuid(d82be2b1-5764-11d0-a96e-00c04fd705a2),
    pointer_default(unique),
    local
]
interface IShellChangeNotify : IUnknown
{
    HRESULT OnChange(
                [in] LONG lEvent,
                [in] LPCITEMIDLIST pidl1,
                [in] LPCITEMIDLIST pidl2);
}

/*****************************************************************************
 * IFileSystemBindData interface
 */
[
    object,
    uuid(01e18d10-4d8b-11d2-855d-006008059367),
    pointer_default(unique),
    local
]
interface IFileSystemBindData : IUnknown
{
    HRESULT SetFindData(
                [in] const WIN32_FIND_DATAW *pfd);
    HRESULT GetFindData(
                [out] WIN32_FIND_DATAW *pfd);
}

/*****************************************************************************
 *    ITaskbarList interface
 */
[
    object,
    uuid(56FDF342-FD6D-11d0-958A-006097C9A090),
    pointer_default(unique)
]
interface ITaskbarList : IUnknown
{
    HRESULT HrInit();

    HRESULT AddTab(
        [in] HWND hwnd);

    HRESULT DeleteTab(
        [in] HWND hwnd);

    HRESULT ActivateTab(
        [in] HWND hwnd);

    HRESULT SetActiveAlt(
        [in] HWND hwnd);
}

/*****************************************************************************
 *    ITaskbarList2 interface
 */
[
    object,
    uuid(602D4995-B13A-429B-A66E-1935E44F4317),
    pointer_default(unique)
]
interface ITaskbarList2 : ITaskbarList
{
    HRESULT MarkFullscreenWindow(
        [in] HWND hwnd,
        [in] BOOL fullscreen);
}

cpp_quote("#ifdef MIDL_PASS")
typedef IUnknown* HIMAGELIST;
cpp_quote("#endif")

typedef [v1_enum] enum THUMBBUTTONFLAGS {
    THBF_ENABLED         = 0x0000,
    THBF_DISABLED        = 0x0001,
    THBF_DISMISSONCLICK  = 0x0002,
    THBF_NOBACKGROUND    = 0x0004,
    THBF_HIDDEN          = 0x0008,
    THBF_NONINTERACTIVE  = 0x0010
} THUMBBUTTONFLAGS;

cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(THUMBBUTTONFLAGS)")

typedef [v1_enum] enum THUMBBUTTONMASK {
    THB_BITMAP   = 0x0001,
    THB_ICON     = 0x0002,
    THB_TOOLTIP  = 0x0004,
    THB_FLAGS    = 0x0008
} THUMBBUTTONMASK;

cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(THUMBBUTTONMASK)")

cpp_quote("#include <pshpack8.h>")
typedef struct THUMBBUTTON {
    THUMBBUTTONMASK dwMask;
    UINT iId;
    UINT iBitmap;
    HICON hIcon;
    WCHAR szTip[260];
    THUMBBUTTONFLAGS dwFlags;
} THUMBBUTTON, *LPTHUMBBUTTON;
cpp_quote("#include <poppack.h>")

[
    uuid(ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf),
    object
]
interface ITaskbarList3 : ITaskbarList2
{
    typedef [v1_enum] enum TBPFLAG {
        TBPF_NOPROGRESS     = 0x0000,
        TBPF_INDETERMINATE  = 0x0001,
        TBPF_NORMAL         = 0x0002,
        TBPF_ERROR          = 0x0004,
        TBPF_PAUSED         = 0x0008
    } TBPFLAG;

    cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(TBPFLAG)")

    HRESULT SetProgressValue(
            [in] HWND hwnd,
            [in] ULONGLONG ullCompleted,
            [in] ULONGLONG ullTotal);

    HRESULT SetProgressState(
            [in] HWND hwnd,
            [in] TBPFLAG tbpFlags);

    HRESULT RegisterTab(
            [in] HWND hwndTab,
            [in] HWND hwndMDI);

    HRESULT UnregisterTab([in] HWND hwndTab);

    HRESULT SetTabOrder(
            [in] HWND hwndTab,
            [in] HWND hwndInsertBefore);

    HRESULT SetTabActive(
            [in] HWND hwndTab,
            [in] HWND hwndMDI,
            [in] DWORD dwReserved);

    HRESULT ThumbBarAddButtons(
            [in] HWND hwnd,
            [in] UINT cButtons,
            [in, size_is(cButtons)] LPTHUMBBUTTON pButton);

    HRESULT ThumbBarUpdateButtons(
            [in] HWND hwnd,
            [in] UINT cButtons,
            [in, size_is(cButtons)] LPTHUMBBUTTON pButton);

    HRESULT ThumbBarSetImageList(
            [in] HWND hwnd,
            [in] HIMAGELIST himl);

    HRESULT SetOverlayIcon(
            [in] HWND hwnd,
            [in] HICON hIcon,
            [in, unique, string] LPCWSTR pszDescription);

    HRESULT SetThumbnailTooltip(
            [in] HWND hwnd,
            [in, unique, string] LPCWSTR pszTip);

    HRESULT SetThumbnailClip(
            [in] HWND hwnd,
            [in] RECT *prcClip);
}

[
    uuid(c43dc798-95d1-4bea-9030-bb99e2983a1a),
    object
]
interface ITaskbarList4 : ITaskbarList3
{
    typedef [v1_enum] enum STPFLAG {
        STPF_NONE                       = 0x0000,
        STPF_USEAPPTHUMBNAILALWAYS      = 0x0001,
        STPF_USEAPPTHUMBNAILWHENACTIVE  = 0x0002,
        STPF_USEAPPPEEKALWAYS           = 0x0004,
        STPF_USEAPPPEEKWHENACTIVE       = 0x0008
    } STPFLAG;

    cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(STPFLAG)")

    HRESULT SetTabProperties(
            [in] HWND hwndTab,
            [in] STPFLAG stpFlags);
}

/*****************************************************************************
 *    IAutoCompleteDropDown interface
 */
[
    object,
    uuid(3CD141F4-3C6A-11d2-BCAA-00C04FD929DB),
    pointer_default(unique)
]
interface IAutoCompleteDropDown : IUnknown
{
cpp_quote("#define ACDD_VISIBLE   0x0001")

    HRESULT GetDropDownStatus(
        [out] DWORD *pdwFlags,
        [out, string] LPWSTR *ppwszString);

    HRESULT ResetEnumerator();
}

[
    object,
    uuid(cb728b20-f786-11ce-92ad-00aa00a74cd0),
    pointer_default(unique)
]
interface IProfferService : IUnknown
{
    HRESULT ProfferService(
        [in] REFGUID service,
        [in] IServiceProvider *pService,
        [out] DWORD *pCookie);

    HRESULT RevokeService([in] DWORD cookie);
}

/*****************************************************************************
 * IExplorerBrowserEvents interface
 */
[
 object,
 uuid(361BBDC7-E6EE-4E13-BE58-58E2240C810F)
]
interface IExplorerBrowserEvents : IUnknown
{
    HRESULT OnNavigationPending(
        [in] PCIDLIST_ABSOLUTE pidlFolder);

    HRESULT OnViewCreated(
        [in] IShellView *psv);

    HRESULT OnNavigationComplete(
        [in] PCIDLIST_ABSOLUTE pidlFolder);

    HRESULT OnNavigationFailed(
        [in] PCIDLIST_ABSOLUTE pidlFolder);
}

typedef GUID EXPLORERPANE;
typedef EXPLORERPANE *REFEXPLORERPANE;

cpp_quote("#define SID_ExplorerPaneVisibility IID_IExplorerPaneVisibility")

/*****************************************************************************
 * IExplorerPaneVisibility interface
 */
[
 object,
 uuid(E07010EC-BC17-44C0-97B0-46C7C95B9EDC)
]
interface IExplorerPaneVisibility : IUnknown
{
    typedef enum tagEXPLORERPANESTATE {
        EPS_DONTCARE     = 0x0,
        EPS_DEFAULT_ON   = 0x1,
        EPS_DEFAULT_OFF  = 0x2,
        EPS_STATE_MASK   = 0xffff,
        EPS_INITIALSTATE = 0x10000,
        EPS_FORCE        = 0x20000
    } EXPLORERPANESTATE;

    HRESULT GetPaneState(
        [in] REFEXPLORERPANE ep,
        [out] EXPLORERPANESTATE *peps);
}

typedef [v1_enum] enum tagEXPLORER_BROWSER_FILL_FLAGS {
    EBF_NONE                     = 0,
    EBF_SELECTFROMDATAOBJECT     = 0x100,
    EBF_NODROPTARGET             = 0x200
} EXPLORER_BROWSER_FILL_FLAGS;

typedef [v1_enum] enum tagEXPLORER_BROWSER_OPTIONS {
    EBO_NONE               = 0x00,
    EBO_NAVIGATEONCE       = 0x01,
    EBO_SHOWFRAMES         = 0x02,
    EBO_ALWAYSNAVIGATE     = 0x04,
    EBO_NOTRAVELLOG        = 0x08,
    EBO_NOWRAPPERWINDOW    = 0x10,
    EBO_HTMLSHAREPOINTVIEW = 0x20
} EXPLORER_BROWSER_OPTIONS;

cpp_quote("#define SID_SExplorerBrowserFrame IID_ICommDlgBrowser")

/*****************************************************************************
 * IExplorerBrowser interface
 */
[
 object,
 uuid(DFD3B6B5-C10C-4BE9-85F6-A66969F402F6),
 pointer_default(unique)
]
interface IExplorerBrowser : IUnknown
{

    [local] HRESULT Initialize(
        [in] HWND hwndParent,
        [in] const RECT *prc,
        [in, unique] const FOLDERSETTINGS *pfs);

    HRESULT Destroy();

    [local] HRESULT SetRect(
        [in,out,unique] HDWP *phdwp,
        [in] RECT rcBrowser);

    HRESULT SetPropertyBag(
        [in, string] LPCWSTR pszPropertyBag);

    HRESULT SetEmptyText(
        [in, string] LPCWSTR pszEmptyText);

    HRESULT SetFolderSettings(
        [in] const FOLDERSETTINGS *pfs);

    HRESULT Advise(
        [in] IExplorerBrowserEvents *psbe,
        [out] DWORD *pdwCookie);

    HRESULT Unadvise(
        [in] DWORD dwCookie);

    HRESULT SetOptions(
        [in] EXPLORER_BROWSER_OPTIONS dwFlag);

    HRESULT GetOptions(
        [out] EXPLORER_BROWSER_OPTIONS *pdwFlag);

    HRESULT BrowseToIDList(
        [in] PCUIDLIST_RELATIVE pidl,
        [in] UINT uFlags);

    HRESULT BrowseToObject(
        [in] IUnknown *punk,
        [in] UINT uFlags);

    HRESULT FillFromObject(
        [in] IUnknown *punk,
        [in] EXPLORER_BROWSER_FILL_FLAGS dwFlags);

    HRESULT RemoveAll();

    HRESULT GetCurrentView(
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);
}

/*****************************************************************************
 * INameSpaceTreeControl interface
 */
[
 object,
 uuid(028212A3-B627-47E9-8856-C14265554E4F)
]
interface INameSpaceTreeControl : IUnknown
{
    [v1_enum] enum _NSTCSTYLE {
        NSTCS_HASEXPANDOS                 = 0x00000001,
        NSTCS_HASLINES                    = 0x00000002,
        NSTCS_SINGLECLICKEXPAND           = 0x00000004,
        NSTCS_FULLROWSELECT               = 0x00000008,
        NSTCS_SPRINGEXPAND                = 0x00000010,
        NSTCS_HORIZONTALSCROLL            = 0x00000020,
        NSTCS_ROOTHASEXPANDO              = 0x00000040,
        NSTCS_SHOWSELECTIONALWAYS         = 0x00000080,
        NSTCS_NOINFOTIP                   = 0x00000200,
        NSTCS_EVENHEIGHT                  = 0x00000400,
        NSTCS_NOREPLACEOPEN               = 0x00000800,
        NSTCS_DISABLEDRAGDROP             = 0x00001000,
        NSTCS_NOORDERSTREAM               = 0x00002000,
        NSTCS_RICHTOOLTIP                 = 0x00004000,
        NSTCS_BORDER                      = 0x00008000,
        NSTCS_NOEDITLABELS                = 0x00010000,
        NSTCS_TABSTOP                     = 0x00020000,
        NSTCS_FAVORITESMODE               = 0x00080000,
        NSTCS_AUTOHSCROLL                 = 0x00100000,
        NSTCS_FADEINOUTEXPANDOS           = 0x00200000,
        NSTCS_EMPTYTEXT                   = 0x00400000,
        NSTCS_CHECKBOXES                  = 0x00800000,
        NSTCS_PARTIALCHECKBOXES           = 0x01000000,
        NSTCS_EXCLUSIONCHECKBOXES         = 0x02000000,
        NSTCS_DIMMEDCHECKBOXES            = 0x04000000,
        NSTCS_NOINDENTCHECKS              = 0x08000000,
        NSTCS_ALLOWJUNCTIONS              = 0x10000000,
        NSTCS_SHOWTABSBUTTON              = 0x20000000,
        NSTCS_SHOWDELETEBUTTON            = 0x40000000,
        NSTCS_SHOWREFRESHBUTTON      = (int)0x80000000
    };
    typedef DWORD NSTCSTYLE;

    [v1_enum] enum _NSTCROOTSTYLE {
        NSTCRS_VISIBLE                    = 0x0000,
        NSTCRS_HIDDEN                     = 0x0001,
        NSTCRS_EXPANDED                   = 0x0002
    };
    typedef DWORD NSTCROOTSTYLE;

    [v1_enum] enum _NSTCITEMSTATE {
        NSTCIS_NONE                       = 0x0000,
        NSTCIS_SELECTED                   = 0x0001,
        NSTCIS_EXPANDED                   = 0x0002,
        NSTCIS_BOLD                       = 0x0004,
        NSTCIS_DISABLED                   = 0x0008,
        NSTCIS_SELECTEDNOEXPAND           = 0x0010
    };
    typedef DWORD NSTCITEMSTATE;

    typedef [v1_enum] enum NSTCGNI {
        NSTCGNI_NEXT                      = 0,
        NSTCGNI_NEXTVISIBLE               = 1,
        NSTCGNI_PREV                      = 2,
        NSTCGNI_PREVVISIBLE               = 3,
        NSTCGNI_PARENT                    = 4,
        NSTCGNI_CHILD                     = 5,
        NSTCGNI_FIRSTVISIBLE              = 6,
        NSTCGNI_LASTVISIBLE               = 7
    } NSTCGNI;

    HRESULT Initialize(
        [in] HWND hwndParent,
        [in, unique] RECT *prc,
        [in] NSTCSTYLE nstcsFlags);

    HRESULT TreeAdvise(
        [in] IUnknown *punk,
        [out] DWORD *pdwCookie);

    HRESULT TreeUnadvise(
        [in] DWORD dwCookie);

    HRESULT AppendRoot(
        [in] IShellItem *psiRoot,
        [in] SHCONTF grfEnumFlags,
        [in] NSTCROOTSTYLE grfRootStyle,
        [in, unique] IShellItemFilter *pif);

    HRESULT InsertRoot(
        [in] int iIndex,
        [in] IShellItem *psiRoot,
        [in] SHCONTF grfEnumFlags,
        [in] NSTCROOTSTYLE grfRootStyle,
        [in, unique] IShellItemFilter *pif);

    HRESULT RemoveRoot(
        [in] IShellItem *psiRoot);

    HRESULT RemoveAllRoots();

    HRESULT GetRootItems(
        [out] IShellItemArray **ppsiaRootItems);

    HRESULT SetItemState(
        [in] IShellItem *psi,
        [in] NSTCITEMSTATE nstcisMask,
        [in] NSTCITEMSTATE nstcisFlags);

    HRESULT GetItemState(
        [in] IShellItem *psi,
        [in] NSTCITEMSTATE nstcismask,
        [out] NSTCITEMSTATE *pnstcisFlags);

    HRESULT GetSelectedItems(
        [out] IShellItemArray **psiaItems);

    HRESULT GetItemCustomState(
        [in] IShellItem *psi,
        [out] int *piStateNumber);

    HRESULT SetItemCustomState(
        [in] IShellItem *psi,
        [in] int iStateNumber);

    HRESULT EnsureItemVisible(
        [in] IShellItem *psi);

    HRESULT SetTheme(
        [in, string] LPCWSTR pszTheme);

    HRESULT GetNextItem(
        [in, unique] IShellItem *psi,
        [in] NSTCGNI nstcgi,
        [out] IShellItem **ppsiNext);

    HRESULT HitTest(
        [in] POINT *ppt,
        [out] IShellItem **ppsiOut);

    HRESULT GetItemRect(
        [in] IShellItem *psi,
        [out] RECT *prect);

    HRESULT CollapseAll();
}

/*****************************************************************************
 * INameSpaceTreeControl2 interface
 */
[
 object,
 uuid(7CC7AED8-290E-49BC-8945-C1401CC9306C)
]
interface INameSpaceTreeControl2 : INameSpaceTreeControl
{
    typedef [v1_enum] enum NSTCSTYLE2 {
        NSTCS2_DEFAULT                     = 0x00,
        NSTCS2_INTERRUPTNOTIFICATIONS      = 0x01,
        NSTCS2_SHOWNULLSPACEMENU           = 0x02,
        NSTCS2_DISPLAYPADDING              = 0x04,
        NSTCS2_DISPLAYPINNEDONLY           = 0x08,
        NTSCS2_NOSINGLETONAUTOEXPAND       = 0x10,  /* The apparent typo here is   */
        NTSCS2_NEVERINSERTNONENUMERATED    = 0x20   /* present also in the Win SDK */
    } NSTCSTYLE2;
    cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(NSTCSTYLE2)")

    HRESULT SetControlStyle(
        [in] NSTCSTYLE nstcsMask,
        [in] NSTCSTYLE nstcsStyle);

    HRESULT GetControlStyle(
        [in] NSTCSTYLE nstcsMask,
        [out] NSTCSTYLE *pnstcsStyle);

    HRESULT SetControlStyle2(
        [in] NSTCSTYLE2 nstcsMask,
        [in] NSTCSTYLE2 nstcsStyle);

    HRESULT GetControlStyle2(
        [in] NSTCSTYLE2 nstcsMask,
        [out] NSTCSTYLE2 *pnstcsStyle);
}

/*****************************************************************************
 * INameSpaceTreeControlEvents interface
 */

[
 object,
 uuid(93D77985-B3D8-4484-8318-672CDDA002CE),
 local
]
interface INameSpaceTreeControlEvents : IUnknown
{
    [v1_enum] enum _NSTCEHITTEST {
        NSTCEHT_NOWHERE                    = 0x0001,
        NSTCEHT_ONITEMICON                 = 0x0002,
        NSTCEHT_ONITEMLABEL                = 0x0004,
        NSTCEHT_ONITEMIDENT                = 0x0008,
        NSTCEHT_ONITEMBUTTON               = 0x0010,
        NSTCEHT_ONITEMRIGHT                = 0x0020,
        NSTCEHT_ONITEMSTATEICON            = 0x0040,
        NSTCEHT_ONITEM                     = 0x0046,
        NSTCEHT_ONITEMTABBUTTON            = 0x1000
    };
    typedef DWORD NSTCEHITTEST;

    [v1_enum] enum _NSTCECLICKTYPE {
        NSTCECT_LBUTTON                    = 0x1,
        NSTCECT_MBUTTON                    = 0x2,
        NSTCECT_RBUTTON                    = 0x3,
        NSTCECT_BUTTON                     = 0x3,
        NSTCECT_DBLCLICK                   = 0x4
    };
    typedef DWORD NSTCECLICKTYPE;

    HRESULT OnItemClick(
        [in] IShellItem *psi,
        [in] NSTCEHITTEST nstceHitTest,
        [in] NSTCECLICKTYPE nstceClickType);

    HRESULT OnPropertyItemCommit(
        [in] IShellItem *psi);

    HRESULT OnItemStateChanging(
        [in] IShellItem *psi,
        [in] NSTCITEMSTATE nstcisMask,
        [in] NSTCITEMSTATE nstcisState);

    HRESULT OnItemStateChanged(
        [in] IShellItem *psi,
        [in] NSTCITEMSTATE nstcisMask,
        [in] NSTCITEMSTATE nstcisState);

    HRESULT OnSelectionChanged(
        [in] IShellItemArray *psiaSelection);

    HRESULT OnKeyboardInput(
        [in] UINT uMsg,
        [in] WPARAM wParam,
        [in] LPARAM lParam);

    HRESULT OnBeforeExpand(
        [in] IShellItem *psi);

    HRESULT OnAfterExpand(
        [in] IShellItem *psi);

    HRESULT OnBeginLabelEdit(
        [in] IShellItem *psi);

    HRESULT OnEndLabelEdit(
        [in] IShellItem *psi);

    HRESULT OnGetToolTip(
        [in] IShellItem *psi,
        [out, string, size_is(cchTip)] LPWSTR pszTip,
        [in] int cchTip);

    HRESULT OnBeforeItemDelete(
        [in] IShellItem *psi);

    HRESULT OnItemAdded(
        [in] IShellItem *psi,
        [in] BOOL fIsRoot);

    HRESULT OnItemDeleted(
        [in] IShellItem *psi,
        [in] BOOL fIsRoot);

    HRESULT OnBeforeContextMenu(
        [in, unique] IShellItem *psi,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);

    HRESULT OnAfterContextMenu(
        [in] IShellItem *psi,
        [in] IContextMenu *pcmIn,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);

    HRESULT OnBeforeStateImageChange(
        [in] IShellItem *psi);

    HRESULT OnGetDefaultIconIndex(
        [in] IShellItem *psi,
        [out] int *piDefaultIcon,
        [out] int *piOpenIcon);
}

/*****************************************************************************
 * INameSpaceTreeControlCustomDraw interface
 */
[
 object,
 uuid(2D3BA758-33EE-42D5-BB7B-5F3431D86C78),
 local
]

interface INameSpaceTreeControlCustomDraw : IUnknown
{
    typedef struct NSTCCUSTOMDRAW
    {
        IShellItem *psi;
        UINT uItemState;
        NSTCITEMSTATE nstcis;
        LPCWSTR pszText;
        int iImage;
        HIMAGELIST himl;
        int iLevel;
        int iIndent;
    } NSTCCUSTOMDRAW;

    HRESULT PrePaint(
        [in] HDC hdc,
        [in] RECT *prc,
        [out] LRESULT *plres);

    HRESULT PostPaint(
        [in] HDC hdc,
        [in] RECT *prc);

    HRESULT ItemPrePaint(
        [in] HDC hdc,
        [in] RECT *prc,
        [in, out] COLORREF *pclrText,
        [in, out] COLORREF *pclrTextBk,
        [out] LRESULT *plres);

    HRESULT ItemPostPaint(
        [in] HDC hdc,
        [in] RECT *prc,
        [in] NSTCCUSTOMDRAW *pnstccdItem);
}

/*****************************************************************************
 * INameSpaceTreeControlDropHandler interface
 */
[
 object,
 uuid(F9C665D6-C2F2-4C19-BF33-8322D7352F51),
 local
]
interface INameSpaceTreeControlDropHandler : IUnknown
{
    HRESULT OnDragEnter(
        [in, unique] IShellItem *psiOver,
        [in] IShellItemArray *psiaData,
        [in] BOOL fOutsideSource,
        [in] DWORD grfKeyState,
        [in, out] DWORD *pdwEffect);

    HRESULT OnDragOver(
        [in, unique] IShellItem *psiOver,
        [in] IShellItemArray *psiaData,
        [in] DWORD grfKeyState,
        [in, out] DWORD *pdwEffect);

    HRESULT OnDragPosition(
        [in, unique] IShellItem *psiOver,
        [in] IShellItemArray *psiaData,
        [in] int iNewPosition,
        [in] int iOldPosition);

    HRESULT OnDrop(
        [in, unique] IShellItem *psiOver,
        [in] IShellItemArray *psiaData,
        [in] int iPosition,
        [in] DWORD grfKeyState,
        [in, out] DWORD *pdwEffect);

    HRESULT OnDropPosition(
        [in, unique] IShellItem *psiOver,
        [in] IShellItemArray *psiaData,
        [in] int iNewPosition,
        [in] int iOldPosition);

    HRESULT OnDragLeave(
        [in, unique] IShellItem *psiOver);
}
cpp_quote("#define NSTCDHPOS_ONTOP -1")

interface IFileDialog;

typedef [v1_enum] enum FDE_OVERWRITE_RESPONSE
{
    FDEOR_DEFAULT  = 0,
    FDEOR_ACCCEP   = 1,
    FDEOR_REFUSE   = 2
} FDE_OVERWRITE_RESPONSE;

typedef [v1_enum] enum FDE_SHAREVIOLATION_RESPONSE
{
    FDESVR_DEFAULT = 0,
    FDESVR_ACCEPT  = 1,
    FDESVR_REFUSE  = 2
} FDE_SHAREVIOLATION_RESPONSE;

/*****************************************************************************
 * IFileDialogEvents interface
 */
[
 object,
 uuid(973510DB-7D7F-452B-8975-74A85828D354),
 pointer_default(unique)
]
interface IFileDialogEvents : IUnknown
{
    HRESULT OnFileOk(
        [in] IFileDialog *pfd);

    HRESULT OnFolderChanging(
        [in] IFileDialog *pfd,
        [in] IShellItem *psiFolder);

    HRESULT OnFolderChange(
        [in] IFileDialog *pfd);

    HRESULT OnSelectionChange(
        [in] IFileDialog *pfd);

    HRESULT OnShareViolation(
        [in] IFileDialog *pfd,
        [in] IShellItem *psi,
        [out] FDE_SHAREVIOLATION_RESPONSE *pResponse);

    HRESULT OnTypeChange(
        [in] IFileDialog *pfd);

    HRESULT OnOverwrite(
        [in] IFileDialog *pfd,
        [in] IShellItem *psi,
        [out] FDE_OVERWRITE_RESPONSE *pResponse);
}

/*****************************************************************************
 * IModalWindow interface
 */
[
 object,
 uuid(B4DB1657-70D7-485E-8E3E-6FCB5A5C1802),
 pointer_default(unique)
]
interface IModalWindow : IUnknown
{
    [local]
    HRESULT Show(
        [in, unique, annotation("__in_opt")] HWND hwndOwner);

    [call_as(Show)]
    HRESULT RemoteShow(
        [in, unique] HWND hwndOwner);
}

typedef [v1_enum] enum FDAP
{
    FDAP_BOTTOM    = 0,
    FDAP_TOP       = 1
} FDAP;

/*****************************************************************************
 * IFileDialog interface
 */
[
 object,
 uuid(42F85136-DB7E-439C-85F1-E4075D135FC8),
 pointer_default(unique)
]
interface IFileDialog : IModalWindow
{
    [v1_enum] enum _FILEOPENDIALOGOPTIONS
    {
        FOS_OVERWRITEPROMPT     = 0x00000002,
        FOS_STRICTFILETYPES     = 0x00000004,
        FOS_NOCHANGEDIR         = 0x00000008,
        FOS_PICKFOLDERS         = 0x00000020,
        FOS_FORCEFILESYSTEM     = 0x00000040,
        FOS_ALLNONSTORAGEITEMS  = 0x00000080,
        FOS_NOVALIDATE          = 0x00000100,
        FOS_ALLOWMULTISELECT    = 0x00000200,
        FOS_PATHMUSTEXIST       = 0x00000800,
        FOS_FILEMUSTEXIST       = 0x00001000,
        FOS_CREATEPROMPT        = 0x00002000,
        FOS_SHAREAWARE          = 0x00004000,
        FOS_NOREADONLYRETURN    = 0x00008000,
        FOS_NOTESTFILECREATE    = 0x00010000,
        FOS_HIDEMRUPLACES       = 0x00020000,
        FOS_HIDEPINNEDPLACES    = 0x00040000,
        FOS_NODEREFERENCELINKS  = 0x00100000,
        FOS_DONTADDTORECENT     = 0x02000000,
        FOS_FORCESHOWHIDDEN     = 0x10000000,
        FOS_DEFAULTNOMINIMODE   = 0x20000000,
        FOS_FORCEPREVIEWPANEON  = 0x40000000
    };
    typedef DWORD FILEOPENDIALOGOPTIONS;

    HRESULT SetFileTypes(
        [in] UINT cFileTypes,
        [in, size_is(cFileTypes)] const COMDLG_FILTERSPEC *rgFilterSpec);

    HRESULT SetFileTypeIndex(
        [in] UINT iFileType);

    HRESULT GetFileTypeIndex(
        [out] UINT *piFileType);

    HRESULT Advise(
        [in] IFileDialogEvents *pfde,
        [out] DWORD *pdwCookie);

    HRESULT Unadvise(
        [in] DWORD dwCookie);

    HRESULT SetOptions(
        [in] FILEOPENDIALOGOPTIONS fos);

    HRESULT GetOptions(
        [in] FILEOPENDIALOGOPTIONS *pfos);

    HRESULT SetDefaultFolder(
        [in] IShellItem *psi);

    HRESULT SetFolder(
        [in] IShellItem *psi);

    HRESULT GetFolder(
        [out] IShellItem **ppsi);

    HRESULT GetCurrentSelection(
        [out] IShellItem **ppsi);

    HRESULT SetFileName(
        [in, string] LPCWSTR pszName);

    HRESULT GetFileName(
        [out, string] LPWSTR *pszName);

    HRESULT SetTitle(
        [in, string] LPCWSTR pszTitle);

    HRESULT SetOkButtonLabel(
        [in, string] LPCWSTR pszText);

    HRESULT SetFileNameLabel(
        [in, string] LPCWSTR pszLabel);

    HRESULT GetResult(
        [out] IShellItem **ppsi);

    HRESULT AddPlace(
        [in] IShellItem *psi,
        [in] FDAP fdap);

    HRESULT SetDefaultExtension(
        [in, string] LPCWSTR pszDefaultExtension);

    HRESULT Close(
        [in] HRESULT hr);

    HRESULT SetClientGuid(
        [in] REFGUID guid);

    HRESULT ClearClientData();

    HRESULT SetFilter(
        [in] IShellItemFilter *pFilter);
}

/*****************************************************************************
 * IFileDialog2 interface
 */
[
 object,
 uuid(61744FC7-85B5-4791-A9B0-272276309B13),
 pointer_default(unique)
]
interface IFileDialog2 : IFileDialog
{
    HRESULT SetCancelButtonLabel(
        [in] LPCWSTR pszLabel);

    HRESULT SetNavigationRoot(
        [in] IShellItem *psi);
}

/*****************************************************************************
 * IFileOperationProgressSink interface
 */
[
 object,
 uuid(04B0F1A7-9490-44BC-96E1-4296A31252E2),
 pointer_default(unique)
]
interface IFileOperationProgressSink : IUnknown
{
    HRESULT StartOperations();

    HRESULT FinishOperations(
        [in] HRESULT hrResult);

    HRESULT PreRenameItem(
        [in] DWORD dwFlags,
        [in] IShellItem *psiItem,
        [in, unique, string] LPCWSTR pszNewName);

    HRESULT PostRenameItem(
        [in] DWORD dwFlags,
        [in] IShellItem *psiItem,
        [in, string] LPCWSTR pszNewName,
        [in] HRESULT hrRename,
        [in] IShellItem *psiNewlyCreated);

    HRESULT PreMoveItem(
        [in] DWORD dwFlags,
        [in] IShellItem *psiItem,
        [in] IShellItem *psiDestinationFolder,
        [in, unique, string] LPCWSTR pszNewName);

    HRESULT PostMoveItem(
        [in] DWORD dwFlags,
        [in] IShellItem *psiItem,
        [in] IShellItem *psiDestinationFolder,
        [in, unique, string] LPCWSTR pszNewName,
        [in] HRESULT hrMove,
        [in] IShellItem *psiNewlyCreated);

    HRESULT PreCopyItem(
        [in] DWORD dwFlags,
        [in] IShellItem *psiItem,
        [in] IShellItem *psiDestinationFolder,
        [in, unique, string] LPCWSTR pszNewName);

    HRESULT PostCopyItem(
        [in] DWORD dwFlags,
        [in] IShellItem *psiItem,
        [in] IShellItem *psiDestinationFolder,
        [in, unique, string] LPCWSTR pszNewName,
        [in] HRESULT hrCopy,
        [in] IShellItem *psiNewlyCreated);

    HRESULT PreDeleteItem(
        [in] DWORD dwFlags,
        [in] IShellItem *psiItem);

    HRESULT PostDeleteItem(
        [in] DWORD dwFlags,
        [in] IShellItem *psiItem,
        [in] HRESULT hrDelete,
        [in] IShellItem *psiNewlyCreated);

    HRESULT PreNewItem(
        [in] DWORD dwFlags,
        [in] IShellItem *psiDestinationFolder,
        [in, unique, string] LPCWSTR pszNewName);

    HRESULT PostNewItem(
        [in] DWORD dwFlags,
        [in] IShellItem *psiDestinationFolder,
        [in, unique, string] LPCWSTR pszNewName,
        [in, unique, string] LPCWSTR pszTemplateName,
        [in] DWORD dwFileAttributes,
        [in] HRESULT hrNew,
        [in] IShellItem *psiNewItem);

    HRESULT UpdateProgress(
        [in] UINT iWorkTotal,
        [in] UINT iWorkSoFar);

    HRESULT ResetTimer();

    HRESULT PauseTimer();

    HRESULT ResumeTimer();
}

/*****************************************************************************
 * IFileSaveDialog interface
 */
[
 object,
 uuid(84BCCD23-5FDE-4CDB-AEA4-AF64B83D78AB),
 pointer_default(unique)
]
interface IFileSaveDialog : IFileDialog
{
    HRESULT SetSaveAsItem(
        [in] IShellItem *psi);

    HRESULT SetProperties(
        [in] IPropertyStore *pStore);

    HRESULT SetCollectedProperties(
        [in] IPropertyDescriptionList *pList,
        [in] BOOL fAppendDefault);

    HRESULT GetProperties(
        [in] IPropertyStore **ppStore);

    HRESULT ApplyProperties(
        [in] IShellItem *psi,
        [in] IPropertyStore *pStore,
        [in, unique] HWND hwnd,
        [in, unique] IFileOperationProgressSink *pSink);
}


/*****************************************************************************
 * IFileOpenDialog interface
 */
[
 object,
 uuid(D57C7288-D4AD-4768-BE02-9D969532D960),
 pointer_default(unique)
]
interface IFileOpenDialog : IFileDialog
{
    HRESULT GetResults(
        [out] IShellItemArray **ppenum);

    HRESULT GetSelectedItems(
        [out] IShellItemArray **ppsai);
}

typedef [v1_enum] enum CDCONTROLSTATEF
{
    CDCS_INACTIVE       = 0x0,
    CDCS_ENABLED        = 0x1,
    CDCS_VISIBLE        = 0x2,
    CDCS_ENABLEDVISIBLE = 0x3
} CDCONTROLSTATEF;
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(CDCONTROLSTATEF)")
/*****************************************************************************
 * IFileDialogCustomize interface
 */
[
 object,
 uuid(E6FDD21A-163F-4975-9C8C-A69F1BA37034),
 pointer_default(unique)
]
interface IFileDialogCustomize : IUnknown
{
    HRESULT EnableOpenDropDown(
        [in] DWORD dwIDCtl);

    HRESULT AddMenu(
        [in] DWORD dwIDCtl,
        [in, string] LPCWSTR pszLabel);

    HRESULT AddPushButton(
        [in] DWORD dwIDCtl,
        [in, string] LPCWSTR pszLabel);

    HRESULT AddComboBox(
        [in] DWORD dwIDCtl);

    HRESULT AddRadioButtonList(
        [in] DWORD dwIDCtl);

    HRESULT AddCheckButton(
        [in] DWORD dwIDCtl,
        [in, string] LPCWSTR pszLabel,
        [in] BOOL bChecked);

    HRESULT AddEditBox(
        [in] DWORD dwIDCtl,
        [in, string] LPCWSTR pszText);

    HRESULT AddSeparator(
        [in] DWORD dwIDCtl);

    HRESULT AddText(
        [in] DWORD dwIDCtl,
        [in, string] LPCWSTR pszText);

    HRESULT SetControlLabel(
        [in] DWORD dwIDCtl,
        [in, string] LPCWSTR pszLabel);

    HRESULT GetControlState(
        [in] DWORD dwIDCtl,
        [out] CDCONTROLSTATEF *pdwState);

    HRESULT SetControlState(
        [in] DWORD dwIDCtl,
        [in] CDCONTROLSTATEF dwState);

    HRESULT GetEditBoxText(
        [in] DWORD dwIDCtl,
        [out, string] WCHAR **ppszText);

    HRESULT SetEditBoxText(
        [in] DWORD dwIDCtl,
        [in, string] LPCWSTR pszText);

    HRESULT GetCheckButtonState(
        [in] DWORD dwIDCtl,
        [out] BOOL *pbChecked);

    HRESULT SetCheckButtonState(
        [in] DWORD dwIDCtl,
        [in] BOOL bChecked);

    HRESULT AddControlItem(
        [in] DWORD dwIDCtl,
        [in] DWORD dwIDItem,
        [in] LPCWSTR pszLabel);

    HRESULT RemoveControlItem(
        [in] DWORD dwIDCtl,
        [in] DWORD dwIDItem);

    HRESULT RemoveAllControlItems(
        [in] DWORD dwIDCtl);

    HRESULT GetControlItemState(
        [in] DWORD dwIDCtl,
        [in] DWORD dwIDItem,
        [out] CDCONTROLSTATEF *pdwState);

    HRESULT SetControlItemState(
        [in] DWORD dwIDCtl,
        [in] DWORD dwIDItem,
        [in] CDCONTROLSTATEF dwState);

    HRESULT GetSelectedControlItem(
        [in] DWORD dwIDCtl,
        [out] DWORD *pdwIDItem);

    HRESULT SetSelectedControlItem(
        [in] DWORD dwIDCtl,
        [in] DWORD dwIDItem);

    HRESULT StartVisualGroup(
        [in] DWORD dwIDCtl,
        [in, string] LPCWSTR pszLabel);

    HRESULT EndVisualGroup();

    HRESULT MakeProminent(
        [in] DWORD dwIDCtl);

    HRESULT SetControlItemText(
        [in] DWORD dwIDCtl,
        [in] DWORD dwIDItem,
        [in, string] LPCWSTR pszLabel);
}

/*****************************************************************************
 * IFileDialogControlEvents interface
 */
[
 object,
 uuid(36116642-D713-4B97-9B83-7484A9D00433),
 pointer_default(unique)
]
interface IFileDialogControlEvents : IUnknown
{
    HRESULT OnItemSelected(
        [in] IFileDialogCustomize *pfdc,
        [in] DWORD dwIDCtl,
        [in] DWORD dwIDItem);

    HRESULT OnButtonClicked(
        [in] IFileDialogCustomize *pfdc,
        [in] DWORD dwIDCtl);

    HRESULT OnCheckButtonToggled(
        [in] IFileDialogCustomize *pfdc,
        [in] BOOL dwIDCtl,
        [in] BOOL bChecked);

    HRESULT OnControlActivating(
        [in] IFileDialogCustomize *pfdc,
        [in] DWORD dwIDCtl);
}

typedef [v1_enum] enum tagKF_CATEGORY
{
    KF_CATEGORY_VIRTUAL = 0x00000001,
    KF_CATEGORY_FIXED   = 0x00000002,
    KF_CATEGORY_COMMON  = 0x00000003,
    KF_CATEGORY_PERUSER = 0x00000004
} KF_CATEGORY;

typedef [v1_enum] enum tagKF_REDIRECTION_CAPABILITIES
{
    KF_REDIRECTION_CAPABILITIES_ALLOW_ALL               = 0x000000ff,
    KF_REDIRECTION_CAPABILITIES_REDIRECTABLE            = 0x00000001,
    KF_REDIRECTION_CAPABILITIES_DENY_ALL                = 0x000fff00,
    KF_REDIRECTION_CAPABILITIES_DENY_POLICY_REDIRECTED  = 0x00000100,
    KF_REDIRECTION_CAPABILITIES_DENY_POLICY             = 0x00000200,
    KF_REDIRECTION_CAPABILITIES_DENY_PERMISSIONS        = 0x00000400
} KF_REDIRECTION_CAPABILITIES;

typedef [v1_enum] enum tagKF_DEFINITION_FLAGS
{
    KFDF_LOCAL_REDIRECT_ONLY    = 0x00000002,
    KFDF_ROAMABLE               = 0x00000004,
    KFDF_PRECREATE              = 0x00000008,
    KFDF_STREAM                 = 0x00000010,
    KFDF_PUBLISHEXPANDEDPATH    = 0x00000020
} KF_DEFINITION_FLAGS;

typedef struct tagKNOWNFOLDER_DEFINITION
{
    KF_CATEGORY         category;
    LPWSTR              pszName;
    LPWSTR              pszDescription;
    KNOWNFOLDERID       fidParent;
    LPWSTR              pszRelativePath;
    LPWSTR              pszParsingName;
    LPWSTR              pszTooltip;
    LPWSTR              pszLocalizedName;
    LPWSTR              pszIcon;
    LPWSTR              pszSecurity;
    DWORD               dwAttributes;
    KF_DEFINITION_FLAGS kfdFlags;
    FOLDERTYPEID        ftidType;
} KNOWNFOLDER_DEFINITION;

[
 object,
 uuid(3aa7af7e-9b36-420C-a8e3-f77d4674a488),
 pointer_default(ref)
]
interface IKnownFolder : IUnknown
{
    HRESULT GetId(
        [out] KNOWNFOLDERID *pkfid);

    HRESULT GetCategory(
        [out] KF_CATEGORY *pCategory);

    HRESULT GetShellItem(
        [in] DWORD dwFlags,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);

    HRESULT GetPath(
        [in] DWORD dwFlags,
        [out, string] LPWSTR *ppszPath);

    HRESULT SetPath(
        [in] DWORD dwFlags,
        [in, string] LPCWSTR pszPath);

    HRESULT GetIDList(
        [in] DWORD dwFlags,
        [out] PIDLIST_ABSOLUTE *ppidl);

    HRESULT GetFolderType(
        [out] FOLDERTYPEID *pftid);

    HRESULT GetRedirectionCapabilities(
        [out] KF_REDIRECTION_CAPABILITIES *pCapabilities);

    HRESULT GetFolderDefinition(
        [out] KNOWNFOLDER_DEFINITION *pKFD);
}

typedef [v1_enum] enum tagKF_REDIRECT_FLAGS
{
    KF_REDIRECT_USER_EXCLUSIVE      = 0x00000001,
    KF_REDIRECT_COPY_SOURCE_DACL    = 0x00000002,
    KF_REDIRECT_OWNER_USER          = 0x00000004,
    KF_REDIRECT_SET_OWNER_EXPLICIT  = 0x00000008,
    KF_REDIRECT_CHECK_ONLY          = 0x00000010,
    KF_REDIRECT_WITH_UI             = 0x00000020,
    KF_REDIRECT_UNPIN               = 0x00000040,
    KF_REDIRECT_PIN                 = 0x00000080,
    KF_REDIRECT_COPY_CONTENTS       = 0x00000200,
    KF_REDIRECT_DEL_SOURCE_CONTENTS = 0x00000400,
    KF_REDIRECT_EXCLUDE_ALL_KNOWN_SUBFOLDERS = 0x00000800
} KF_REDIRECT_FLAGS;

[
    object,
    uuid(8BE2D872-86AA-4d47-B776-32CCA40C7018),
    pointer_default(ref)
]
interface IKnownFolderManager : IUnknown
{
    typedef [v1_enum] enum tagFFFP_MODE
    {
        FFFP_EXACTMATCH,
        FFFP_NEARESTPARENTMATCH
    } FFFP_MODE;

    HRESULT FolderIdFromCsidl(
        [in] int nCsidl,
        [out] KNOWNFOLDERID *pfid);

    HRESULT FolderIdToCsidl(
        [in] REFKNOWNFOLDERID rfid,
        [out] int *pnCsidl);

    HRESULT GetFolderIds(
        [out, size_is(, *pCount)] KNOWNFOLDERID **ppKFId,
        [in, out] UINT *pCount);

    HRESULT GetFolder(
        [in] REFKNOWNFOLDERID rfid,
        [out] IKnownFolder **ppkf);

    HRESULT GetFolderByName(
        [in, string] LPCWSTR pszCanonicalName,
        [out] IKnownFolder **ppkf);

    HRESULT RegisterFolder(
        [in] REFKNOWNFOLDERID rfid,
        [in] KNOWNFOLDER_DEFINITION const *pKFD);

    HRESULT UnregisterFolder(
        [in] REFKNOWNFOLDERID rfid);

    HRESULT FindFolderFromPath(
        [in, string] LPCWSTR pszPath,
        [in] FFFP_MODE mode,
        [out] IKnownFolder **ppkf);

    HRESULT FindFolderFromIDList(
        [in] PCIDLIST_ABSOLUTE pidl,
        [out] IKnownFolder **ppkf);

    HRESULT Redirect(
        [in] REFKNOWNFOLDERID rfid,
        [in, unique] HWND hwnd,
        [in] KF_REDIRECT_FLAGS flags,
        [in, unique, string] LPCWSTR pszTargetPath,
        [in] UINT cFolders,
        [in, size_is(cFolders), unique] KNOWNFOLDERID const *pExclusion,
        [out, string] LPWSTR *ppszError);
}

/* function for releasing structure returned from IKnownFolder::GetFolderDefinition */
cpp_quote("static inline void FreeKnownFolderDefinitionFields(KNOWNFOLDER_DEFINITION *pKFD)")
cpp_quote("{")
cpp_quote("    CoTaskMemFree(pKFD->pszName);")
cpp_quote("    CoTaskMemFree(pKFD->pszDescription);")
cpp_quote("    CoTaskMemFree(pKFD->pszRelativePath);")
cpp_quote("    CoTaskMemFree(pKFD->pszParsingName);")
cpp_quote("    CoTaskMemFree(pKFD->pszTooltip);")
cpp_quote("    CoTaskMemFree(pKFD->pszLocalizedName);")
cpp_quote("    CoTaskMemFree(pKFD->pszIcon);")
cpp_quote("    CoTaskMemFree(pKFD->pszSecurity);")
cpp_quote("}")

typedef [v1_enum] enum ASSOCIATIONLEVEL {
    AL_MACHINE,
    AL_EFFECTIVE,
    AL_USER
} ASSOCIATIONLEVEL;

typedef [v1_enum] enum ASSOCIATIONTYPE {
    AT_FILEEXTENSION,
    AT_URLPROTOCOL,
    AT_STARTMENUCLIENT,
    AT_MIMETYPE
} ASSOCIATIONTYPE;

[
    object,
    uuid(4e530b0a-e611-4c77-a3ac-9031d022281b),
    pointer_default(unique)
]
interface IApplicationAssociationRegistration : IUnknown
{
    HRESULT QueryCurrentDefault(
        [in, string] LPCWSTR pszQuery,
        [in] ASSOCIATIONTYPE atQueryType,
        [in] ASSOCIATIONLEVEL alQueryLevel,
        [out, string] LPWSTR *ppszAssociation);

    HRESULT QueryAppIsDefault(
        [in, string] LPCWSTR pszQuery,
        [in] ASSOCIATIONTYPE atQueryType,
        [in] ASSOCIATIONLEVEL alQueryLevel,
        [in, string] LPCWSTR pszAppRegistryName,
        [out] BOOL *pfDefault);

    HRESULT QueryAppIsDefaultAll(
        [in] ASSOCIATIONLEVEL alQueryLevel,
        [in, string] LPCWSTR pszAppRegistryName,
        [out] BOOL* pfDefault);

    HRESULT SetAppAsDefault(
        [in, string] LPCWSTR pszAppRegistryName,
        [in, string] LPCWSTR pszSet,
        [in] ASSOCIATIONTYPE atSetType);

    HRESULT SetAppAsDefaultAll(
        [in, string] LPCWSTR pszAppRegistryName);

    HRESULT ClearUserAssociations();
}

[
    uuid(6332debf-87b5-4670-90c0-5e57b408a49e),
    object,
    pointer_default(unique)
]
interface ICustomDestinationList : IUnknown
{
    typedef [v1_enum] enum KNOWNDESTCATEGORY {
        KDC_FREQUENT = 1,
        KDC_RECENT
    } KNOWNDESTCATEGORY;

    HRESULT SetAppID([in, string] LPCWSTR pszAppID);

    HRESULT BeginList(
            [out] UINT *pcMinSlots,
            [in] REFIID riid,
            [out, iid_is(riid)] void **ppv);

    HRESULT AppendCategory(
            [in, string] LPCWSTR pszCategory,
            [in] IObjectArray *poa);

    HRESULT AppendKnownCategory([in] KNOWNDESTCATEGORY category);
    HRESULT AddUserTasks([in] IObjectArray *poa);
    HRESULT CommitList();

    HRESULT GetRemovedDestinations(
            [in] REFIID riid,
            [out, iid_is(riid)] void **ppv);

    HRESULT DeleteList([in, unique, string] LPCWSTR pszAppID);
    HRESULT AbortList();
}

/*****************************************************************************
 * ShellObjects typelibrary
 */
[
 uuid(50A7E9B1-70EF-11D1-B75A-00A0C90564FE),
 lcid(0x0000),
 version(1.0)
]
library ShellObjects
{
    [
        uuid(71F96385-DDD6-48D3-A0C1-AE06E8B055FB)
    ]
    coclass ExplorerBrowser
    {
        interface IExplorerBrowser;
    }

    [
        uuid(DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7)
    ]
    coclass FileOpenDialog
    {
        interface IFileOpenDialog;
    }

    [
        uuid(C0B4E2F3-BA21-4773-8DBA-335EC946EB8B)
    ]
    coclass FileSaveDialog
    {
        interface IFileSaveDialog;
    }

    [
        uuid(AE054212-3535-4430-83ED-D501AA6680E6)
    ]
    coclass NamespaceTreeControl
    {
        interface INameSpaceTreeControl2;
    }

    [
        uuid(4df0c730-df9d-4ae3-9153-aa6b82e9795a)
    ]
    coclass KnownFolderManager
    {
        interface IKnownFolderManager;
    }

    [
        uuid(591209c7-767b-42b2-9fba-44ee4615f2c7)
    ]
    coclass ApplicationAssociationRegistration
    {
        interface IApplicationAssociationRegistration;
    }

    [
         uuid(00021401-0000-0000-c000-000000000046)
    ]
    coclass ShellLink
    {
        interface IShellLinkW;
    }

    [
        uuid(56fdf344-fd6d-11d0-958a-006097c9a090)
    ]
    coclass TaskbarList
    {
        interface ITaskbarList4;
    }

    [
        uuid(77f10cf0-3db5-4966-b520-b7c54fd35ed6)
    ]
    coclass DestinationList {
        interface ICustomDestinationList;
    }

    [
        uuid(2d3468c1-36a7-43b6-ac24-d3f02fd9607a)
    ]
    coclass EnumerableObjectCollection
    {
        interface IEnumObjects;
    }
}
