/*
 * 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";
/* FIXME: import "structuredquery.idl"; */

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


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

    HRESULT Initialize( [in] LPCITEMIDLIST pidl );
}


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

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


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


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

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

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

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

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

    typedef UINT EXPPS;

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

/*****************************************************************************
 * IShellFolder interface
 */
[
    object,
    uuid(000214e6-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IShellFolder : IUnknown
{
    typedef IShellFolder * LPSHELLFOLDER;

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

    typedef DWORD SHGDNF;

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

    typedef DWORD SHCONTF;

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

    typedef ULONG SFGAOF;

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

cpp_quote("#define SID_SNewWindowManager IID_INewWindowManager")

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

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

    HRESULT Skip(
        [in] ULONG celt);

    HRESULT Reset();

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

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

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

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

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

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

    HRESULT GetCount(
        [out] DWORD *pdwNumItems);

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

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

}

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

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

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

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

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

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

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

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

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

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

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

    typedef UINT SVSIF;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

    HRESULT GetIDList( [out] LPITEMIDLIST * ppidl );

    HRESULT SetIDList( [in] LPCITEMIDLIST pidl );

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

    HRESULT SetDescription( [in] LPCSTR pszName );

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

    HRESULT SetWorkingDirectory( [in] LPCSTR pszDir );

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

    HRESULT SetArguments( [in] LPCSTR pszArgs );

    HRESULT GetHotkey( [out] WORD *pwHotkey );

    HRESULT SetHotkey( [in] WORD wHotkey );

    HRESULT GetShowCmd( [out] int *piShowCmd );

    HRESULT SetShowCmd( [in] int iShowCmd );

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

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

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

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

    HRESULT SetPath( [in] LPCSTR pszFile );
}


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

    HRESULT GetIDList( [out] LPITEMIDLIST * ppidl );

    HRESULT SetIDList( [in] LPCITEMIDLIST pidl );

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

    HRESULT SetDescription( [in] LPCWSTR pszName );

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

    HRESULT SetWorkingDirectory( [in] LPCWSTR pszDir );

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

    HRESULT SetArguments( [in] LPCWSTR pszArgs );

    HRESULT GetHotkey( [out] WORD *pwHotkey );

    HRESULT SetHotkey( [in] WORD wHotkey );

    HRESULT GetShowCmd( [out] int *piShowCmd );

    HRESULT SetShowCmd( [in] int iShowCmd );

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

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

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

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

    HRESULT SetPath( [in] LPCWSTR pszFile );
}

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


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

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


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

#ifndef MAX_PATH
#define MAX_PATH 260
#endif


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

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

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


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

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

    typedef IExtractIconA *LPEXTRACTICONA;

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

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


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

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

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

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


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

    typedef ICommDlgBrowser *LPCOMMDLGBROWSER;

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


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

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

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

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


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

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

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

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


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

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

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

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


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

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

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


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

    HRESULT DragLeave();

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

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

    HRESULT Show( [in] BOOL fShow );
}


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

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

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

cpp_quote("#define CMIC_MASK_HOTKEY         SEE_MASK_HOTKEY")
cpp_quote("#define CMIC_MASK_ICON           SEE_MASK_ICON")
cpp_quote("#define CMIC_MASK_FLAG_NO_UI     SEE_MASK_FLAG_NO_UI")
cpp_quote("#define CMIC_MASK_UNICODE        SEE_MASK_UNICODE")
cpp_quote("#define CMIC_MASK_NO_CONSOLE     SEE_MASK_NO_CONSOLE")
cpp_quote("#define CMIC_MASK_HASLINKNAME    SEE_MASK_HASLINKNAME")
cpp_quote("#define CMIC_MASK_FLAG_SEP_VDM   SEE_MASK_FLAG_SEPVDM")
cpp_quote("#define CMIC_MASK_HASTITLE       SEE_MASK_HASTITLE")
cpp_quote("#define CMIC_MASK_ASYNCOK        SEE_MASK_ASYNCOK")
cpp_quote("#define CMIC_MASK_NOASYNC        SEE_MASK_NOASYNC")
cpp_quote("#define CMIC_MASK_SHIFT_DOWN     0x10000000")
cpp_quote("#define CMIC_MASK_PTINVOKE       0x20000000")
cpp_quote("#define CMIC_MASK_CONTROL_DOWN   0x40000000")
cpp_quote("#define CMIC_MASK_FLAG_LOG_USAGE SEE_MASK_FLAG_LOG_USAGE")
cpp_quote("#define CMIC_MASK_NOZONECHECKS   SEE_MASK_NOZONECHECKS")

    typedef IContextMenu *LPCONTEXTMENU;

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

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

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

    HRESULT InvokeCommand( [in] LPCMINVOKECOMMANDINFO lpici );

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


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

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


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

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


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

cpp_quote("EXTERN_C const CLSID CLSID_TaskbarList;")

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

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

    HRESULT ResetEnumerator();
}

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

    HRESULT RevokeService([in] DWORD cookie);
}

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

    HRESULT OnViewCreated(
        [in] IShellView *psv);

    HRESULT OnNavigationComplete(
        [in] PCIDLIST_ABSOLUTE pidlFolder);

    HRESULT OnNavigationFailed(
        [in] PCIDLIST_ABSOLUTE pidlFolder);
}

typedef GUID EXPLORERPANE;
typedef EXPLORERPANE *REFEXPLORERPANE;

cpp_quote("#define SID_ExplorerPaneVisibility IID_IExplorerPaneVisibility")

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

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

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

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

cpp_quote("#define SID_SExplorerBrowserFrame IID_ICommDlgBrowser")

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

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

    HRESULT Destroy();

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

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

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

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

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

    HRESULT Unadvise(
        [in] DWORD dwCookie);

    HRESULT SetOptions(
        [in] EXPLORER_BROWSER_OPTIONS dwFlag);

    HRESULT GetOptions(
        [out] EXPLORER_BROWSER_OPTIONS *pdwFlag);

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

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

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

    HRESULT RemoveAll();

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

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

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

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

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

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

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

    HRESULT TreeUnadvise(
        [in] DWORD dwCookie);

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

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

    HRESULT RemoveRoot(
        [in] IShellItem *psiRoot);

    HRESULT RemoveAllRoots();

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

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

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

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

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

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

    HRESULT EnsureItemVisible(
        [in] IShellItem *psi);

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

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

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

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

    HRESULT CollapseAll();
}

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

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

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

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

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

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

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

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

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

    HRESULT OnPropertyItemCommit(
        [in] IShellItem *psi);

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

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

    HRESULT OnSelectionChanged(
        [in] IShellItemArray *psiaSelection);

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

    HRESULT OnBeforeExpand(
        [in] IShellItem *psi);

    HRESULT OnAfterExpand(
        [in] IShellItem *psi);

    HRESULT OnBeginLabelEdit(
        [in] IShellItem *psi);

    HRESULT OnEndLabelEdit(
        [in] IShellItem *psi);

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

    HRESULT OnBeforeItemDelete(
        [in] IShellItem *psi);

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

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

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

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

    HRESULT OnBeforeStateImageChange(
        [in] IShellItem *psi);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IFileDialog;

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

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

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

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

    HRESULT OnFolderChange(
        [in] IFileDialog *pfd);

    HRESULT OnSelectionChange(
        [in] IFileDialog *pfd);

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

    HRESULT OnTypeChange(
        [in] IFileDialog *pfd);

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

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

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

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

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

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

    HRESULT SetFileTypeIndex(
        [in] UINT iFileType);

    HRESULT GetFileTypeIndex(
        [out] UINT *piFileType);

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

    HRESULT Unadvise(
        [in] DWORD dwCookie);

    HRESULT SetOptions(
        [in] FILEOPENDIALOGOPTIONS fos);

    HRESULT GetOptions(
        [in] FILEOPENDIALOGOPTIONS *pfos);

    HRESULT SetDefaultFolder(
        [in] IShellItem *psi);

    HRESULT SetFolder(
        [in] IShellItem *psi);

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

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

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

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

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

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

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

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

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

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

    HRESULT Close(
        [in] HRESULT hr);

    HRESULT SetClientGuid(
        [in] REFGUID guid);

    HRESULT ClearClientData();

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

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

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

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

    HRESULT FinishOperations(
        [in] HRESULT hrResult);

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

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

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

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

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

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

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

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

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

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

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

    HRESULT ResetTimer();

    HRESULT PauseTimer();

    HRESULT ResumeTimer();
}

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

    HRESULT SetProperties(
        [in] IPropertyStore *pStore);

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

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

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


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

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

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

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

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

    HRESULT AddComboBox(
        [in] DWORD dwIDCtl);

    HRESULT AddRadioButtonList(
        [in] DWORD dwIDCtl);

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

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

    HRESULT AddSeparator(
        [in] DWORD dwIDCtl);

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

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

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

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

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

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

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

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

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

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

    HRESULT RemoveAllControlItems(
        [in] DWORD dwIDCtl);

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

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

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

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

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

    HRESULT EndVisualGroup();

    HRESULT MakeProminent(
        [in] DWORD dwIDCtl);

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

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

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

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

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

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

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

typedef [v1_enum] enum tagKF_DEFINITION_FLAGS
{
    KFDF_LOCAL_REDIRECT_ONLY    = 0x00000002,
    KFDF_ROAMABLE               = 0x00000004,
    KFDF_PRECREATE              = 0x00000008
} 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);
}

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