/*
 * 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_CHECKING_FOR_CHILDREN = 0x00000010,
        SHCONTF_FOLDERS               = 0x00000020,
        SHCONTF_NONFOLDERS            = 0x00000040,
        SHCONTF_INCLUDEHIDDEN         = 0x00000080,
        SHCONTF_INIT_ON_FIRST_NEXT    = 0x00000100,
        SHCONTF_NETPRINTERSRCH        = 0x00000200,
        SHCONTF_SHAREABLE             = 0x00000400,
        SHCONTF_STORAGE               = 0x00000800,
        SHCONTF_NAVIGATION_ENUM       = 0x00001000,
        SHCONTF_FASTITEMS             = 0x00002000,
        SHCONTF_FLATLIST              = 0x00004000,
        SHCONTF_ENABLE_ASYNC          = 0x00008000,
        SHCONTF_INCLUDESUPERHIDDEN    = 0x00010000
    };

    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_SYSTEM            0x00001000L")
    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_CANMONIKER        0x00400000L")
    cpp_quote("#define SFGAO_HASSTORAGE        0x00400000L")
    cpp_quote("#define SFGAO_STREAM            0x00400000L")
    cpp_quote("#define SFGAO_STORAGEANCESTOR   0x00800000L")
    cpp_quote("#define SFGAO_STORAGEGAPMASK    0x70C50008L")
    cpp_quote("#define SFGAO_PKEYSFGAOMASK     0x81044000L")

    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_PARENTRELATIVEFORUI          = 0x80094001,
    } 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 [v1_enum] enum tagNWMF {
    NWMF_UNLOADING        = 0x00000001,
    NWMF_USERINITED       = 0x00000002,
    NWMF_FIRST            = 0x00000004,
    NWMF_OVERRIDEKEY      = 0x00000008,
    NWMF_SHOWHELP         = 0x00000010,
    NWMF_HTMLDIALOG       = 0x00000020,
    NWMF_FROMDIALOGCHILD  = 0x00000040,
    NWMF_USERREQUESTED    = 0x00000080,
    NWMF_USERALLOWED      = 0x00000100,
    NWMF_FORCEWINDOW      = 0x00010000,
    NWMF_FORCETAB         = 0x00020000,
    NWMF_SUGGESTWINDOW    = 0x00040000,
    NWMF_SUGGESTTAB       = 0x00080000,
    NWMF_INACTIVETAB      = 0x00100000,
} 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 SHCreateItemFromRelativeName(IShellItem *parent, PCWSTR name, IBindCtx *pbc, 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 SHCreateShellItemArrayFromIDLists(UINT cidl, PCIDLIST_ABSOLUTE_ARRAY pidl_array, IShellItemArray **psia);")
cpp_quote("HRESULT WINAPI SHCreateItemInKnownFolder(REFKNOWNFOLDERID rfid, DWORD flags, PCWSTR filename, 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 [v1_enum] enum FOLDERFLAGS
{
    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 [v1_enum] enum FOLDERVIEWMODE
{
    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;

    typedef [v1_enum] enum _SVSIF
    {
        SVSI_DESELECT       = 0x00000000,
        SVSI_SELECT         = 0x00000001,
        SVSI_EDIT           = 0x00000003,
        SVSI_DESELECTOTHERS = 0x00000004,
        SVSI_ENSUREVISIBLE  = 0x00000008,
        SVSI_FOCUSED        = 0x00000010,
        SVSI_TRANSLATEPT    = 0x00000020,
        SVSI_SELECTIONMARK  = 0x00000040,
        SVSI_POSITIONITEM   = 0x00000080,
        SVSI_CHECK          = 0x00000100,
        SVSI_CHECK2         = 0x00000200,
        SVSI_KEYBOARDSELECT = 0x00000401,
        SVSI_NOTAKEFOCUS    = 0x40000000,
    } _SVSIF;

    cpp_quote("#define SVSI_NOSTATECHANGE  0x80000000")

    typedef UINT SVSIF;

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

    typedef INT SVGIO;

    typedef [v1_enum] enum SVUIA_STATUS
    {
        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
    );
}

[
    object,
    uuid(ec39fa88-f8af-41c5-8421-38bed28f4673),
    pointer_default(unique)
]
interface IShellView3 : IShellView2
{
    [v1_enum] enum _SV3CVW3_FLAGS
    {
        SV3CVW3_DEFAULT          = 0x00000000,
        SV3CVW3_NONINTERACTIVE   = 0x00000001,
        SV3CVW3_FORCEVIEWMODE    = 0x00000002,
        SV3CVW3_FORCEFOLDERFLAGS = 0x00000004
    };

    typedef DWORD SV3CVW3_FLAGS;

    HRESULT CreateViewWindow3(
        [in] IShellBrowser *owner,
        [in, unique] IShellView *prev_view,
        [in] SV3CVW3_FLAGS view_flags,
        [in] FOLDERFLAGS mask,
        [in] FOLDERFLAGS flags,
        [in] FOLDERVIEWMODE mode,
        [in, unique] const SHELLVIEWID *view_id,
        [in] const RECT *rect,
        [out] HWND *hwnd);
}

/*****************************************************************************
 * 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
    );
}

[v1_enum] enum tagSORTDIRECTION
{
    SORT_DESCENDING = -1,
    SORT_ASCENDING = 1
};
typedef int SORTDIRECTION;

typedef struct SORTCOLUMN
{
    PROPERTYKEY propkey;
    SORTDIRECTION direction;
} SORTCOLUMN;

typedef [v1_enum] enum FVTEXTTYPE
{
    FVST_EMPTYTEXT = 0
} FVTEXTTYPE;

[
    uuid(1af3a467-214f-4298-908e-06b03e0b39f9),
    object,
    pointer_default(unique)
]
interface IFolderView2 : IFolderView
{
    HRESULT SetGroupBy(
        [in] REFPROPERTYKEY key,
        [in] BOOL ascending);

    [local]
    HRESULT GetGroupBy(
        [out] PROPERTYKEY *pkey,
        [out] BOOL *ascending);

    [call_as(GetGroupBy)]
    HRESULT RemoteGetGroupBy(
        [out] PROPERTYKEY *pkey,
        [out] BOOL *ascending);

    HRESULT SetViewProperty(
        [in] PCUITEMID_CHILD pidl,
        [in] REFPROPERTYKEY propkey,
        [in] REFPROPVARIANT propvar);

    HRESULT GetViewProperty(
        [in] PCUITEMID_CHILD pidl,
        [in] REFPROPERTYKEY propkey,
        [out] PROPVARIANT *propvar);

    HRESULT SetTileViewProperties(
        [in] PCUITEMID_CHILD pidl,
        [in, string] LPCWSTR prop_list);

    HRESULT SetExtendedTileViewProperties(
        [in] PCUITEMID_CHILD pidl,
        [in, string] LPCWSTR prop_list);

    HRESULT SetText(
        [in] FVTEXTTYPE type,
        [in] LPCWSTR text);

    HRESULT SetCurrentFolderFlags(
        [in] DWORD mask,
        [in] DWORD flags);

    HRESULT GetCurrentFolderFlags([out] DWORD *flags);

    HRESULT GetSortColumnCount([out] int *columns);

    HRESULT SetSortColumns(
        [in, size_is(count)] const SORTCOLUMN *columns,
        [in] int count);

    HRESULT GetSortColumns(
        [out, size_is(count)] SORTCOLUMN *columns,
        [in] int count);

    HRESULT GetItem(
        [in] int ittem,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv);

    HRESULT GetVisibleItem(
        [in] int start,
        [in] BOOL previous,
        [out] int *item);

    HRESULT GetSelectedItem(
        [in] int start,
        [out] int *item);

    HRESULT GetSelection(
        [in] BOOL none_implies_folder,
        [out] IShellItemArray **array);

    HRESULT GetSelectionState(
        [in] PCUITEMID_CHILD pidl,
        [out] DWORD *flags);

    HRESULT InvokeVerbOnSelection([in, unique, string] LPCSTR verb);

    HRESULT SetViewModeAndIconSize(
        [in] FOLDERVIEWMODE mode,
        [in] int size);

    HRESULT GetViewModeAndIconSize(
        [out] FOLDERVIEWMODE *mode,
        [out] int *size);

    HRESULT SetGroupSubsetCount([in] UINT visible_rows);

    HRESULT GetGroupSubsetCount([out] UINT *visible_rows);

    HRESULT SetRedraw([in] BOOL redraw);

    HRESULT IsMoveInSameFolder();

    HRESULT DoRename();
}

/*****************************************************************************
 * 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 [v1_enum] enum SLR_FLAGS
    {
        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_OFFER_DELETE_WITHOUT_FILE = 0x0200,
        SLR_KNOWNFOLDER               = 0x0400,
        SLR_MACHINE_IN_LOCAL_TARGET   = 0x0800,
        SLR_UPDATE_MACHINE_AND_SID    = 0x1000,
        SLR_NO_OBJECT_ID              = 0x2000
    } SLR_FLAGS;

    typedef [v1_enum] enum SLGP_FLAGS
    {
        SLGP_SHORTPATH        = 0x0001,
        SLGP_UNCPRIORITY      = 0x0002,
        SLGP_RAWPATH          = 0x0004,
        SLGP_RELATIVEPRIORITY = 0x0008
    } 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_ITEMMENU          0x00000080")
cpp_quote("#define CMF_EXTENDEDVERBS     0x00000100")
cpp_quote("#define CMF_DISABLEDVERBS     0x00000200")
cpp_quote("#define CMF_ASYNCVERBSTATE    0x00000400")
cpp_quote("#define CMF_OPTIMIZEFORINVOKE 0x00000800")
cpp_quote("#define CMF_SYNCCASCADEMENU   0x00001000")
cpp_quote("#define CMF_DONOTPICKDEFAULT  0x00002000")
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
{
    [v1_enum] enum _EXPLORERPANESTATE {
        EPS_DONTCARE     = 0x0,
        EPS_DEFAULT_ON   = 0x1,
        EPS_DEFAULT_OFF  = 0x2,
        EPS_STATE_MASK   = 0xffff,
        EPS_INITIALSTATE = 0x10000,
        EPS_FORCE        = 0x20000
    };
    typedef DWORD 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,
    EBO_NOBORDER           = 0x40,
    EBO_NOPERSISTVIEWSTATE = 0x80,
} 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_ACCEPT   = 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,
        FOS_SUPPORTSTREAMABLEITEMS = 0x80000000
    };
    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,
    KFDF_NO_REDIRECT_UI         = 0x00000040
} 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();
}

[
    object,
    uuid(12337d35-94c6-48a0-bce7-6a9c69d4d600),
    pointer_default(unique)
]
interface IApplicationDestinations : IUnknown
{
    HRESULT SetAppID(
        [in] LPCWSTR pszAppID);

    HRESULT RemoveDestination(
        [in] IUnknown *punk);

    HRESULT RemoveAllDestinations();
}

[
    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();
}

[
    uuid(ddefe873-6997-4e68-be26-39b633adbe12),
    object,
    pointer_default(unique)
]
interface IQueryCancelAutoPlay : IUnknown
{
    HRESULT AllowAutoPlay([in, string] LPCWSTR path,
                          [in] DWORD content_type,
                          [in, string] LPCWSTR label,
                          [in] DWORD serial_number);
}

[
    uuid(d594d0d8-8da7-457b-b3b4-ce5dbaac0b88),
    pointer_default(unique)
]
interface ITransferAdviseSink : IUnknown
{
    [v1_enum] enum _TRANSFER_ADVISE_STATE
    {
        TS_NONE          = 0,
        TS_PERFORMING    = 1,
        TS_PREPARING     = 2,
        TS_INDETERMINATE = 4
    };
    typedef DWORD TRANSFER_ADVISE_STATE;

    HRESULT UpdateProgress([in] ULONGLONG size_current,
                           [in] ULONGLONG size_total,
                           [in] INT files_current,
                           [in] INT files_total,
                           [in] INT folders_current,
                           [in] INT folders_total);
    HRESULT UpdateTransferState([in] TRANSFER_ADVISE_STATE state);
    HRESULT ConfirmOverwrite([in] IShellItem *source,
                             [in] IShellItem *dest_parent,
                             [in, string] LPCWSTR name);
    HRESULT ConfirmEncryptLoss([in] IShellItem *source);
    HRESULT FileFailure([in] IShellItem *item,
                        [in, unique, string] LPCWSTR itemname,
                        [in] HRESULT hr,
                        [in, out, unique, size_is(crename)] LPWSTR rename,
                        [in] ULONG crename);
    HRESULT SubStreamFailure([in] IShellItem *item,
                             [in, string] LPCWSTR stream,
                             [in] HRESULT hr);
    HRESULT PropertyFailure([in] IShellItem *item,
                            [in, unique] const PROPERTYKEY *key,
                            [in] HRESULT hr);
}

[v1_enum] enum _TRANSFER_SOURCE_FLAGS
{
    TSF_NORMAL                     = 0,
    TSF_FAIL_EXIST                 = 0,
    TSF_RENAME_EXIST               = 0x1,
    TSF_OVERWRITE_EXIST            = 0x2,
    TSF_ALLOW_DECRYPTION           = 0x4,
    TSF_NO_SECURITY                = 0x8,
    TSF_COPY_CREATION_TIME         = 0x10,
    TSF_COPY_WRITE_TIME            = 0x20,
    TSF_USE_FULL_ACCESS            = 0x40,
    TSF_DELETE_RECYCLE_IF_POSSIBLE = 0x80,
    TSF_COPY_HARD_LINK             = 0x100,
    TSF_COPY_LOCALIZED_NAME        = 0x200,
    TSF_MOVE_AS_COPY_DELETE        = 0x400,
    TSF_SUSPEND_SHELLEVENTS        = 0x800
};
typedef DWORD TRANSFER_SOURCE_FLAGS;

[
    uuid(00adb003-bde9-45c6-8e29-d09f9353e108),
    object,
    pointer_default(unique)
]
interface ITransferSource : IUnknown
{
    HRESULT Advise([in] ITransferAdviseSink *sink, [out] DWORD *cookie);
    HRESULT Unadvise([in] DWORD cookie);
    HRESULT SetProperties([in] IPropertyChangeArray *array);
    HRESULT OpenItem([in] IShellItem *item,
                     [in] TRANSFER_SOURCE_FLAGS flags,
                     [in] REFIID riid,
                     [out, iid_is(riid)] void **ppv);
    HRESULT MoveItem([in] IShellItem *item,
                     [in] IShellItem *parent_dest,
                     [in, string] LPCWSTR name_dest,
                     [in] TRANSFER_SOURCE_FLAGS flags,
                     [out] IShellItem **newitem);
    HRESULT RecycleItem([in] IShellItem *source,
                        [in] IShellItem *parent_dest,
                        [in] TRANSFER_SOURCE_FLAGS flags,
                        [out] IShellItem **new_dest);
    HRESULT RemoveItem([in] IShellItem *source, [in] TRANSFER_SOURCE_FLAGS flags);
    HRESULT RenameItem([in] IShellItem *source,
                       [in, string] LPCWSTR newname,
                       [in] TRANSFER_SOURCE_FLAGS flags,
                       [out] IShellItem **new_dest);
    HRESULT LinkItem([in] IShellItem *source,
                     [in] IShellItem *parent_dest,
                     [in, unique, string] LPCWSTR new_name,
                     [in] TRANSFER_SOURCE_FLAGS flags,
                     [out] IShellItem **new_dest);
    HRESULT ApplyPropertiesToItem([in] IShellItem *source, [out] IShellItem **newitem);
    HRESULT GetDefaultDestinationName([in] IShellItem *source,
                                      [in] IShellItem *parent_dest,
                                      [out, string] LPWSTR *dest_name);
    HRESULT EnterFolder([in] IShellItem *child_folder);
    HRESULT LeaveFolder([in] IShellItem *child_folder);
}

[
    uuid(48addd32-3ca5-4124-abe3-b5a72531b207),
    object,
    pointer_default(unique)
]
interface ITransferDestination : IUnknown
{
    HRESULT Advise([in] ITransferAdviseSink *sink, [out] DWORD *cookie);
    HRESULT Unadvise([in] DWORD cookie);
    HRESULT CreateItem([in, string] LPCWSTR name,
                       [in] DWORD attr,
                       [in] ULONGLONG size,
                       [in] TRANSFER_SOURCE_FLAGS flags,
                       [in] REFIID riid,
                       [out, iid_is(riid)] void **ppv,
                       [in] REFIID resources,
                       [out, iid_is(riid)] void **presources);
}

[
    uuid(92218cab-ecaa-4335-8133-807fd234c2ee),
    object,
    pointer_default(unique)
]
interface IAssocHandlerInvoker : IUnknown
{
    HRESULT SupportsSelection();
    HRESULT Invoke();
}

[
    uuid(f04061ac-1659-4a3f-a954-775aa57fc083),
    object,
    pointer_default(unique)
]
interface IAssocHandler : IUnknown
{
    HRESULT GetName([out, string] LPWSTR *name);
    HRESULT GetUIName([out, string] LPWSTR *uiname);
    HRESULT GetIconLocation([out, string] LPWSTR *path,
                            [out] int *index);
    HRESULT IsRecommended();
    HRESULT MakeDefault([in, string] LPCWSTR description);
    HRESULT Invoke([in] IDataObject *object);
    HRESULT CreateInvoker([in] IDataObject *object,
                          [out] IAssocHandlerInvoker **invoker);
}

[
    uuid(973810ae-9599-4b88-9e4d-6ee98c9552da),
    object,
    pointer_default(unique)
]
interface IEnumAssocHandlers : IUnknown
{
    HRESULT Next([in]  ULONG count,
                 [out, size_is(count), length_is(*fetched)] IAssocHandler **handlers,
                 [out] ULONG *fetched);
}

typedef enum ASSOC_FILTER
{
    ASSOC_FILTER_NONE = 0,
    ASSOC_FILTER_RECOMMENDED
} ASSOC_FILTER;
cpp_quote("HRESULT WINAPI SHAssocEnumHandlers(PCWSTR extra, ASSOC_FILTER filter, IEnumAssocHandlers **handlersenum);")

/*****************************************************************************
 * 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(86c14003-4d6b-4ef3-a7b4-0506663b2e68)
    ]
    coclass ApplicationDestinations
    {
        interface IApplicationDestinations;
    }

    [
         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;
    }

    [
        uuid(331f1768-05a9-4ddd-b86e-dae34ddc998a)
    ]
    coclass QueryCancelAutoPlay
    {
        interface IQueryCancelAutoPlay;
    }
}
