//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992-1997.
//
//  File: shlobj.idl
//
//----------------------------------------------------------------------------

cpp_quote("//+-------------------------------------------------------------------------")
cpp_quote("//")
cpp_quote("//  Microsoft Windows")
cpp_quote("//  Copyright (C) Microsoft Corporation, 1992-1997.")
cpp_quote("//")
cpp_quote("//--------------------------------------------------------------------------")

cpp_quote("#if ( _MSC_VER >= 800 )")
cpp_quote("#pragma warning(disable:4201)")
cpp_quote("#endif")

#ifndef DO_NO_IMPORTS
import "objidl.idl";
import "oleidl.idl";
import "commctrl.idl";
import "prsht.idl";
#endif

interface IContextMenu;
interface IEnumIDList;
interface IPersistFolder;
interface IPersistFolder2;
interface IShellBrowser;
interface IShellExtInit;
interface IShellFolder;
interface IShellView;
interface IExtractIconA;
interface IExtractIconW;
interface IQueryInfo;
interface IExplorerToolbar;
interface IShellDetails;

typedef struct _CMINVOKECOMMANDINFO {
    DWORD cbSize;        // sizeof(CMINVOKECOMMANDINFO)
    DWORD fMask;         // any combination of CMIC_MASK_*
    HWND hwnd;           // might be NULL (indicating no owner window)
    LPCSTR lpVerb;       // either a string or MAKEINTRESOURCE(idOffset)
    LPCSTR lpParameters; // might be NULL (indicating no parameter)
    LPCSTR lpDirectory;  // might be NULL (indicating no specific directory)
    int nShow;           // one of SW_ values for ShowWindow() API

    DWORD dwHotKey;
    HANDLE hIcon;
} CMINVOKECOMMANDINFO,  *LPCMINVOKECOMMANDINFO;

//
// SHITEMID -- Item ID
//
typedef struct _SHITEMID        // mkid
{
    USHORT      cb;             // Size of the ID (including cb itself)
    BYTE        abID[1];        // The item ID (variable length)
} SHITEMID;
typedef SHITEMID *LPSHITEMID;
typedef const SHITEMID *LPCSHITEMID;

//
// ITEMIDLIST -- List if item IDs (combined with 0-terminator)
//
typedef struct _ITEMIDLIST      // idl
{
    SHITEMID    mkid;
} ITEMIDLIST;
typedef ITEMIDLIST * LPITEMIDLIST;
typedef const ITEMIDLIST * LPCITEMIDLIST;

#define MAX_PATH          260

typedef struct _STRRET
{
    UINT uType; // One of the STRRET_* values
    union
    {
        LPWSTR          pOleStr;        // must be freed by caller of GetDisplayNameOf
        LPSTR           pStr;           // NOT USED
        UINT            uOffset;        // Offset into SHITEMID
        char            cStr[MAX_PATH]; // Buffer to fill in (ANSI)
    } DUMMYUNIONNAME;
} STRRET, *LPSTRRET;

typedef struct
    {
    UINT ViewMode;       // View mode (FOLDERVIEWMODE values)
    UINT fFlags;         // View options (FOLDERFLAGS bits)
    } FOLDERSETTINGS, *LPFOLDERSETTINGS;

typedef const FOLDERSETTINGS * LPCFOLDERSETTINGS;

typedef struct _TBBUTTON {
    int iBitmap;
    int idCommand;
    BYTE fsState;
    BYTE fsStyle;
#ifdef _WIN32
    BYTE bReserved[2];
#endif
    DWORD dwData;
    int iString;
} TBBUTTON, *PTBBUTTON, *LPTBBUTTON;
typedef const TBBUTTON* LPCTBBUTTON;


//+---------------------------------------------------------------------------
// IContextMenu -
//
[
    local,
    object,
    uuid(000214E4-0000-0000-0000-C00000000046),
    pointer_default(unique)
]
interface IContextMenu : IUnknown
{
    HRESULT QueryContextMenu(
        HMENU   hmenu,
        UINT    indexMenu,
        UINT    idCmdFirst,
        UINT    idCmdLast,
        UINT    uFlags);

    HRESULT InvokeCommand(
        LPCMINVOKECOMMANDINFO   lpici);

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

};

//+---------------------------------------------------------------------------
// IEnumIDList -
//
[
    local,
    object,
    uuid(000214F2-0000-0000-0000-C00000000046),
    pointer_default(unique)
]
interface IEnumIDList : IUnknown
{
    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);
};

//+---------------------------------------------------------------------------
// IPersistFolder -
//
[
    local,
    object,
    uuid(000214EA-0000-0000-0000-C00000000046),
    pointer_default(unique)
]
interface IPersistFolder : IPersist
{
    HRESULT Initialize(
        [in] LPCITEMIDLIST pidl);
};

//+---------------------------------------------------------------------------
// IPersistFolder2 -
//
[
    local,
    object,
    uuid(1AC3D9F0-175C-11d1-95BE-00609797EA4F),
    pointer_default(unique)
]
interface IPersistFolder2 : IPersistFolder
{
    HRESULT GetCurFolder(
        [out] LPITEMIDLIST *ppidl);
};

//+---------------------------------------------------------------------------
// IShellExtInit -
//
[
    local,
    object,
    uuid(000214E8-0000-0000-0000-C00000000046),
    pointer_default(unique)
]
interface IShellExtInit : IUnknown
{
    HRESULT Initialize(
        [in] LPCITEMIDLIST pidl,
        [in] LPDATAOBJECT pdobj,
        [in] HKEY hkeyProgID);
};

//+---------------------------------------------------------------------------
// IShellBrowser -
//
[
    local,
    object,
    uuid(000214E2-0000-0000-0000-C00000000046),
    pointer_default(unique)
]
interface IShellBrowser : IOleWindow
{
    HRESULT InsertMenusSB(
        HMENU                   hmenuShared,
        LPOLEMENUGROUPWIDTHS    lpMenuWidths);

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

    HRESULT RemoveMenusSB(
        HMENU hmenuShared);

    HRESULT SetStatusTextSB(
        LPCOLESTR lpszStatusText);

    HRESULT EnableModelessSB(
        BOOL        fEnable);

    HRESULT TranslateAcceleratorSB(
        LPMSG       lpmsg,
        WORD        wID);

    HRESULT BrowseObject (
        LPCITEMIDLIST   pidl,
        UINT            wFlags);

    HRESULT GetViewStateStream(
        DWORD       grfMode,
        LPSTREAM*   ppStrm);

    HRESULT GetControlWindow(
        UINT        id,
        HWND*       lphwnd);

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

    HRESULT QueryActiveShellView(
        IShellView** ppshv);

    HRESULT OnViewWindowActive(
        IShellView* ppshv);

    HRESULT SetToolbarItems(
        LPTBBUTTON  lpButtons,
        UINT        nButtons,
        UINT        uFlags);
};

//+---------------------------------------------------------------------------
// IShellFolder -
//
[
    local,
    object,
    uuid(000214E6-0000-0000-0000-C00000000046),
    pointer_default(unique)
]
interface IShellFolder : IUnknown
{
    HRESULT ParseDisplayName(
        HWND            hwndOwner,
        LPBC            pbcReserved,
        LPOLESTR        lpszDisplayName,
        ULONG*          pchEaten,
        LPITEMIDLIST*   ppidl,
        ULONG*          pdwAttributes);

    HRESULT EnumObjects(
        HWND            hwndOwner,
        DWORD           grfFlags,
        IEnumIDList**   ppenumIDList);

    HRESULT BindToObject(
        LPCITEMIDLIST   pidl,
        LPBC            pbcReserved,
        REFIID          riid,
        LPVOID*         ppvOut);

    HRESULT BindToStorage(
        LPCITEMIDLIST   pidl,
        LPBC            pbcReserved,
        REFIID          riid,
        LPVOID*         ppvObj);

    HRESULT CompareIDs(
        LPARAM          lParam,
        LPCITEMIDLIST   pidl1,
        LPCITEMIDLIST   pidl2);

    HRESULT CreateViewObject(
        HWND            hwndOwner,
        REFIID          riid,
        LPVOID*         ppvOut);

    HRESULT GetAttributesOf(
        UINT            cidl,
        LPCITEMIDLIST*  apidl,
        ULONG*          rgfInOut);

    HRESULT GetUIObjectOf(
        HWND            hwndOwner,
        UINT            cidl,
        LPCITEMIDLIST*  apidl,
        REFIID          riid,
        UINT*           prgfInOut,
        LPVOID*         ppvOut);

    HRESULT GetDisplayNameOf(
        LPCITEMIDLIST   pidl,
        DWORD           uFlags,
        LPSTRRET        lpName);

    HRESULT SetNameOf(
        HWND            hwndOwner,
        LPCITEMIDLIST   pidl,
        LPCOLESTR       lpszName,
        DWORD           uFlags,
        LPITEMIDLIST*   ppidlOut);
};

//+---------------------------------------------------------------------------
// IShellView -
//
[
    local,
    object,
    uuid(000214E3-0000-0000-0000-C00000000046),
    pointer_default(unique)
]
interface IShellView : IOleWindow
{
    HRESULT TranslateAccelerator(
        LPMSG   lpmsg);

    HRESULT EnableModeless(
        BOOL    fEnable);

    HRESULT UIActivate(
        UINT    uState);

    HRESULT Refresh();

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

    HRESULT DestroyViewWindow();

    HRESULT GetCurrentInfo(
        LPFOLDERSETTINGS    lpfs);

    HRESULT AddPropertySheetPages(
        DWORD                   dwReserved,
        LPFNADDPROPSHEETPAGE    lpfn,
        LPARAM                  lparam);

    HRESULT SaveViewState();

    HRESULT SelectItem(
        LPCITEMIDLIST   pidlItem,
        UINT            uFlags);

    HRESULT GetItemObject(
        UINT    uItem,
        REFIID  riid,
        LPVOID* ppv);
};

//+---------------------------------------------------------------------------
// IExtractIconW -
//
[
    local,
    object,
    uuid(000214FA-0000-0000-0000-C00000000046),
    pointer_default(unique)
]
interface IExtractIconW : IUnknown
{
    HRESULT GetIconLocation(
        UINT    uFlags,
        LPWSTR  szIconFile,
        UINT    cchMax,
        int *   piIndex,
        UINT *  pwFlags);

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

//+---------------------------------------------------------------------------
// IExtractIconA -
//
[
    local,
    object,
    uuid(000214EB-0000-0000-0000-C00000000046),
    pointer_default(unique)
]
interface IExtractIconA : IUnknown
{
    HRESULT GetIconLocation(
        UINT    uFlags,
        LPWSTR  szIconFile,
        UINT    cchMax,
        int   * piIndex,
        UINT  * pwFlags);

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

//+---------------------------------------------------------------------------
// IQueryInfo -
//
[
    local,
    object,
    uuid(00021500-0000-0000-0000-C00000000046),
    pointer_default(unique)
]
interface IQueryInfo : IUnknown
{
    HRESULT GetInfoTip(
        DWORD       dwFlags, 
        WCHAR **    ppwszTip);
        
    HRESULT GetInfoFlags(
        DWORD * pdwFlags);
};

//+---------------------------------------------------------------------------
// IOleCommandTarget -
//
//  [
//      local,
//      object,
//      uuid(b722bccb-4e68-101b-a2bc-00aa00404770),
//      pointer_default(unique)
//  ]
//  interface IOleCommandTarget : IUnknown
//  {
//      HRESULT QueryStatus(
//          const GUID *    pguidCmdGroup,
//          ULONG           cCmds, 
//          OLECMD          prgCmds[], 
//          OLECMDTEXT *    pCmdText);
//  
//      HRESULT Exec(
//          const GUID *    pguidCmdGroup, 
//          DWORD           nCmdID,
//          DWORD           nCmdexecopt, 
//          VARIANTARG *    pvaIn,
//          VARIANTARG *    pvaOut);
//  };

typedef struct tagTBADDBITMAP {
        HINSTANCE       hInst;
        UINT            nID;
} TBADDBITMAP, *LPTBADDBITMAP;

//+---------------------------------------------------------------------------
// IExplorerToolbar -
//
[
    local,
    object,
    uuid(8455F0C1-158F-11D0-89AE-00A0C90A90AC),
    pointer_default(unique)
]
interface IExplorerToolbar : IUnknown
{
    // *** IExplorerToolbar methods ***
    HRESULT SetCommandTarget(
        IUnknown *      punkCmdTarget, 
        const GUID *    pguidCmdGrp, 
        DWORD           dwFlags);
        
    HRESULT AddStdBrowserButtons();

    HRESULT AddButtons(
        const GUID *        pguidButtonGroup, 
        UINT                nButtons, 
        const TBBUTTON *    lpButtons);
        
    HRESULT AddString(
        const GUID *    pguidButtonGroup, 
        HINSTANCE       hInst, 
        UINT            uiResID, 
        LRESULT *       pOffset);
        
    HRESULT GetButton(
        const GUID *    pguidButtonGroup, 
        UINT            uiCommand, 
        LPTBBUTTON      lpButton);
        
    HRESULT GetState(
        const GUID *    pguidButtonGroup, 
        UINT            uiCommand, 
        UINT *          pfState);
        
    HRESULT SetState(
        const GUID *    pguidButtonGroup, 
        UINT            uiCommand, 
        UINT            fState);
        
    HRESULT AddBitmap(
        const GUID *    pguidButtonGroup, 
        UINT            uiBMPType, 
        UINT            uiCount, 
        TBADDBITMAP *   ptb,
        LRESULT *       pOffset, 
        COLORREF        rgbMask);
        
    HRESULT GetBitmapSize(
        UINT *  uiID);
    
    HRESULT SendToolbarMsg(
        const GUID *    pguidButtonGroup, 
        UINT            uMsg, 
        WPARAM          wParam, 
        LPARAM          lParam, 
        LRESULT *       plRes);

    HRESULT SetImageList(
        const GUID*     pguidCmdGroup, 
        HIMAGELIST      himlNormal, 
        HIMAGELIST      himlHot, 
        HIMAGELIST      himlDisabled);
        
    HRESULT ModifyButton(
        const GUID *    pguidButtonGroup, 
        UINT            uiCommand, 
        LPTBBUTTON      lpButton);
};

//===========================================================================
// Defview related API and interface
//
//  Notes: At this point, we have no plan to publish this mechanism.
//===========================================================================

typedef struct _SHELLDETAILS
{
        int     fmt;            // LVCFMT_* value (header only)
        int     cxChar;         // Number of "average" characters (header only)
        STRRET  str;            // String information
} SHELLDETAILS, *LPSHELLDETAILS;

//+---------------------------------------------------------------------------
// IShellDetails
//
[
    local,
    object,
    uuid(000214EC-0000-0000-0000-C00000000046),
    pointer_default(unique)
]
interface IShellDetails : IUnknown
{
    // *** IShellDetails methods ***
    HRESULT GetDetailsOf(
        LPCITEMIDLIST   pidl, 
        UINT            iColumn, 
        LPSHELLDETAILS  pDetails);
        
    HRESULT ColumnClick(
        UINT    iColumn);
};