summaryrefslogtreecommitdiffstats
path: root/public/sdk/inc/shlobj.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--public/sdk/inc/shlobj.h2508
1 files changed, 2508 insertions, 0 deletions
diff --git a/public/sdk/inc/shlobj.h b/public/sdk/inc/shlobj.h
new file mode 100644
index 000000000..d787d15ce
--- /dev/null
+++ b/public/sdk/inc/shlobj.h
@@ -0,0 +1,2508 @@
+//===========================================================================
+//
+// Copyright (c) Microsoft Corporation 1991-1996
+//
+// File: shlobj.h
+//
+//===========================================================================
+
+#ifndef _SHLOBJ_H_
+#define _SHLOBJ_H_
+
+//
+// Define API decoration for direct importing of DLL references.
+//
+#ifndef WINSHELLAPI
+#if !defined(_SHELL32_)
+#define WINSHELLAPI DECLSPEC_IMPORT
+#else
+#define WINSHELLAPI
+#endif
+#endif // WINSHELLAPI
+
+
+#include <ole2.h>
+#ifndef _PRSHT_H_
+#include <prsht.h>
+#endif
+#ifndef _INC_COMMCTRL
+#include <commctrl.h> // for LPTBBUTTON
+#endif
+
+#ifndef INITGUID
+#include <shlguid.h>
+#endif /* !INITGUID */
+
+#ifndef RC_INVOKED
+#pragma pack(1) /* Assume byte packing throughout */
+#endif /* !RC_INVOKED */
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+//===========================================================================
+//
+// Object identifiers in the explorer's name space (ItemID and IDList)
+//
+// All the items that the user can browse with the explorer (such as files,
+// directories, servers, work-groups, etc.) has an identifier which is unique
+// among items within the parent folder. Those identifiers are called item
+// IDs (SHITEMID). Since all its parent folders have their own item IDs,
+// any items can be uniquely identified by a list of item IDs, which is called
+// an ID list (ITEMIDLIST).
+//
+// ID lists are almost always allocated by the task allocator (see some
+// description below as well as OLE 2.0 SDK) and may be passed across
+// some of shell interfaces (such as IShellFolder). Each item ID in an ID list
+// is only meaningful to its parent folder (which has generated it), and all
+// the clients must treat it as an opaque binary data except the first two
+// bytes, which indicates the size of the item ID.
+//
+// When a shell extension -- which implements the IShellFolder interace --
+// generates an item ID, it may put any information in it, not only the data
+// with that it needs to identifies the item, but also some additional
+// information, which would help implementing some other functions efficiently.
+// For example, the shell's IShellFolder implementation of file system items
+// stores the primary (long) name of a file or a directory as the item
+// identifier, but it also stores its alternative (short) name, size and date
+// etc.
+//
+// When an ID list is passed to one of shell APIs (such as SHGetPathFromIDList),
+// it is always an absolute path -- relative from the root of the name space,
+// which is the desktop folder. When an ID list is passed to one of IShellFolder
+// member function, it is always a relative path from the folder (unless it
+// is explicitly specified).
+//
+//===========================================================================
+
+//
+// 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 UNALIGNED SHITEMID *LPSHITEMID;
+typedef const UNALIGNED SHITEMID *LPCSHITEMID;
+
+//
+// ITEMIDLIST -- List if item IDs (combined with 0-terminator)
+//
+typedef struct _ITEMIDLIST // idl
+{
+ SHITEMID mkid;
+} ITEMIDLIST;
+typedef UNALIGNED ITEMIDLIST * LPITEMIDLIST;
+typedef const UNALIGNED ITEMIDLIST * LPCITEMIDLIST;
+
+
+//===========================================================================
+//
+// Task allocator API
+//
+// All the shell extensions MUST use the task allocator (see OLE 2.0
+// programming guild for its definition) when they allocate or free
+// memory objects (mostly ITEMIDLIST) that are returned across any
+// shell interfaces. There are two ways to access the task allocator
+// from a shell extension depending on whether or not it is linked with
+// OLE32.DLL or not (purely for efficiency).
+//
+// (1) A shell extension which calls any OLE API (i.e., linked with
+// OLE32.DLL) should call OLE's task allocator (by retrieving
+// the task allocator by calling CoGetMalloc API).
+//
+// (2) A shell extension which does not call any OLE API (i.e., not linked
+// with OLE32.DLL) should call the shell task allocator API (defined
+// below), so that the shell can quickly loads it when OLE32.DLL is not
+// loaded by any application at that point.
+//
+// Notes:
+// In next version of Windowso release, SHGetMalloc will be replaced by
+// the following macro.
+//
+// #define SHGetMalloc(ppmem) CoGetMalloc(MEMCTX_TASK, ppmem)
+//
+//===========================================================================
+
+WINSHELLAPI HRESULT WINAPI SHGetMalloc(LPMALLOC * ppMalloc);
+
+
+
+//===========================================================================
+//
+// IContextMenu interface
+//
+// [OverView]
+//
+// The shell uses the IContextMenu interface in following three cases.
+//
+// case-1: The shell is loading context menu extensions.
+//
+// When the user clicks the right mouse button on an item within the shell's
+// name space (i.g., file, directory, server, work-group, etc.), it creates
+// the default context menu for its type, then loads context menu extensions
+// that are registered for that type (and its base type) so that they can
+// add extra menu items. Those context menu extensions are registered at
+// HKCR\{ProgID}\shellex\ContextMenuHandlers.
+//
+// case-2: The shell is retrieving a context menu of sub-folders in extended
+// name-space.
+//
+// When the explorer's name space is extended by name space extensions,
+// the shell calls their IShellFolder::GetUIObjectOf to get the IContextMenu
+// objects when it creates context menus for folders under those extended
+// name spaces.
+//
+// case-3: The shell is loading non-default drag and drop handler for directories.
+//
+// When the user performed a non-default drag and drop onto one of file
+// system folders (i.e., directories), it loads shell extensions that are
+// registered at HKCR\{ProgID}\DragDropHandlers.
+//
+//
+// [Member functions]
+//
+//
+// IContextMenu::QueryContextMenu
+//
+// This member function may insert one or more menuitems to the specified
+// menu (hmenu) at the specified location (indexMenu which is never be -1).
+// The IDs of those menuitem must be in the specified range (idCmdFirst and
+// idCmdLast). It returns the maximum menuitem ID offset (ushort) in the
+// 'code' field (low word) of the scode.
+//
+// The uFlags specify the context. It may have one or more of following
+// flags.
+//
+// CMF_DEFAULTONLY: This flag is passed if the user is invoking the default
+// action (typically by double-clicking, case 1 and 2 only). Context menu
+// extensions (case 1) should not add any menu items, and returns NOERROR.
+//
+// CMF_VERBSONLY: The explorer passes this flag if it is constructing
+// a context menu for a short-cut object (case 1 and case 2 only). If this
+// flag is passed, it should not add any menu-items that is not appropriate
+// from a short-cut.
+// A good example is the "Delete" menuitem, which confuses the user
+// because it is not clear whether it deletes the link source item or the
+// link itself.
+//
+// CMF_EXPLORER: The explorer passes this flag if it has the left-side pane
+// (case 1 and 2 only). Context menu extensions should ignore this flag.
+//
+// High word (16-bit) are reserved for context specific communications
+// and the rest of flags (13-bit) are reserved by the system.
+//
+//
+// IContextMenu::InvokeCommand
+//
+// This member is called when the user has selected one of menuitems that
+// are inserted by previous QueryContextMenu member. In this case, the
+// LOWORD(lpici->lpVerb) contains the menuitem ID offset (menuitem ID -
+// idCmdFirst).
+//
+// This member function may also be called programmatically. In such a case,
+// lpici->lpVerb specifies the canonical name of the command to be invoked,
+// which is typically retrieved by GetCommandString member previously.
+//
+// Parameters in lpci:
+// cbSize -- Specifies the size of this structure (sizeof(*lpci))
+// hwnd -- Specifies the owner window for any message/dialog box.
+// fMask -- Specifies whether or not dwHotkey/hIcon paramter is valid.
+// lpVerb -- Specifies the command to be invoked.
+// lpParameters -- Parameters (optional)
+// lpDirectory -- Working directory (optional)
+// nShow -- Specifies the flag to be passed to ShowWindow (SW_*).
+// dwHotKey -- Hot key to be assigned to the app after invoked (optional).
+// hIcon -- Specifies the icon (optional).
+//
+//
+// IContextMenu::GetCommandString
+//
+// This member function is called by the explorer either to get the
+// canonical (language independent) command name (uFlags == GCS_VERB) or
+// the help text ((uFlags & GCS_HELPTEXT) != 0) for the specified command.
+// The retrieved canonical string may be passed to its InvokeCommand
+// member function to invoke a command programmatically. The explorer
+// displays the help texts in its status bar; therefore, the length of
+// the help text should be reasonably short (<40 characters).
+//
+// Parameters:
+// idCmd -- Specifies menuitem ID offset (from idCmdFirst)
+// uFlags -- Either GCS_VERB or GCS_HELPTEXT
+// pwReserved -- Reserved (must pass NULL when calling, must ignore when called)
+// pszName -- Specifies the string buffer.
+// cchMax -- Specifies the size of the string buffer.
+//
+//===========================================================================
+
+// QueryContextMenu uFlags
+#define CMF_NORMAL 0x00000000
+#define CMF_DEFAULTONLY 0x00000001
+#define CMF_VERBSONLY 0x00000002
+#define CMF_EXPLORE 0x00000004
+#define CMF_NOVERBS 0x00000008
+#define CMF_CANRENAME 0x00000010
+#define CMF_NODEFAULT 0x00000020
+#define CMF_INCLUDESTATIC 0x00000040
+#define CMF_RESERVED 0xffff0000 // View specific
+
+// GetCommandString uFlags
+#define GCS_VERBA 0x00000000 // canonical verb
+#define GCS_HELPTEXTA 0x00000001 // help text (for status bar)
+#define GCS_VALIDATEA 0x00000002 // validate command exists
+#define GCS_VERBW 0x00000004 // canonical verb (unicode)
+#define GCS_HELPTEXTW 0x00000005 // help text (unicode version)
+#define GCS_VALIDATEW 0x00000006 // validate command exists (unicode)
+#define GCS_UNICODE 0x00000004 // for bit testing - Unicode string
+
+#ifdef UNICODE
+#define GCS_VERB GCS_VERBW
+#define GCS_HELPTEXT GCS_HELPTEXTW
+#define GCS_VALIDATE GCS_VALIDATEW
+#else
+#define GCS_VERB GCS_VERBA
+#define GCS_HELPTEXT GCS_HELPTEXTA
+#define GCS_VALIDATE GCS_VALIDATEA
+#endif
+
+#define CMDSTR_NEWFOLDERA "NewFolder"
+#define CMDSTR_VIEWLISTA "ViewList"
+#define CMDSTR_VIEWDETAILSA "ViewDetails"
+#define CMDSTR_NEWFOLDERW L"NewFolder"
+#define CMDSTR_VIEWLISTW L"ViewList"
+#define CMDSTR_VIEWDETAILSW L"ViewDetails"
+
+#ifdef UNICODE
+#define CMDSTR_NEWFOLDER CMDSTR_NEWFOLDERW
+#define CMDSTR_VIEWLIST CMDSTR_VIEWLISTW
+#define CMDSTR_VIEWDETAILS CMDSTR_VIEWDETAILSW
+#else
+#define CMDSTR_NEWFOLDER CMDSTR_NEWFOLDERA
+#define CMDSTR_VIEWLIST CMDSTR_VIEWLISTA
+#define CMDSTR_VIEWDETAILS CMDSTR_VIEWDETAILSA
+#endif
+
+#define CMIC_MASK_HOTKEY SEE_MASK_HOTKEY
+#define CMIC_MASK_ICON SEE_MASK_ICON
+#define CMIC_MASK_FLAG_NO_UI SEE_MASK_FLAG_NO_UI
+#define CMIC_MASK_UNICODE SEE_MASK_UNICODE
+#define CMIC_MASK_NO_CONSOLE SEE_MASK_NO_CONSOLE
+#define CMIC_MASK_HASLINKNAME SEE_MASK_HASLINKNAME
+#define CMIC_MASK_FLAG_SEP_VDM SEE_MASK_FLAG_SEPVDM
+#define CMIC_MASK_HASTITLE SEE_MASK_HASTITLE
+#define CMIC_MASK_ASYNCOK SEE_MASK_ASYNCOK
+
+
+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;
+
+typedef struct _CMInvokeCommandInfoEx {
+ DWORD cbSize; // must be sizeof(CMINVOKECOMMANDINFOEX)
+ 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;
+ LPCSTR lpTitle; // For CreateProcess-StartupInfo.lpTitle
+ LPCWSTR lpVerbW; // Unicode verb (for those who can use it)
+ LPCWSTR lpParametersW; // Unicode parameters (for those who can use it)
+ LPCWSTR lpDirectoryW; // Unicode directory (for those who can use it)
+ LPCWSTR lpTitleW; // Unicode title (for those who can use it)
+} CMINVOKECOMMANDINFOEX, *LPCMINVOKECOMMANDINFOEX;
+
+#undef INTERFACE
+#define INTERFACE IContextMenu
+
+DECLARE_INTERFACE_(IContextMenu, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ STDMETHOD(QueryContextMenu)(THIS_
+ HMENU hmenu,
+ UINT indexMenu,
+ UINT idCmdFirst,
+ UINT idCmdLast,
+ UINT uFlags) PURE;
+
+ STDMETHOD(InvokeCommand)(THIS_
+ LPCMINVOKECOMMANDINFO lpici) PURE;
+
+ STDMETHOD(GetCommandString)(THIS_
+ UINT idCmd,
+ UINT uType,
+ UINT * pwReserved,
+ LPSTR pszName,
+ UINT cchMax) PURE;
+};
+
+typedef IContextMenu * LPCONTEXTMENU;
+
+//
+// IContextMenu2 (IContextMenu with one new member)
+//
+// IContextMenu2::HandleMenuMsg
+//
+// This function is called, if the client of IContextMenu is aware of
+// IContextMenu2 interface and receives one of following messages while
+// it is calling TrackPopupMenu (in the window proc of hwndOwner):
+// WM_INITPOPUP, WM_DRAWITEM and WM_MEASUREITEM
+// The callee may handle these messages to draw owner draw menuitems.
+//
+
+#undef INTERFACE
+#define INTERFACE IContextMenu2
+
+DECLARE_INTERFACE_(IContextMenu2, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ STDMETHOD(QueryContextMenu)(THIS_
+ HMENU hmenu,
+ UINT indexMenu,
+ UINT idCmdFirst,
+ UINT idCmdLast,
+ UINT uFlags) PURE;
+
+ STDMETHOD(InvokeCommand)(THIS_
+ LPCMINVOKECOMMANDINFO lpici) PURE;
+
+ STDMETHOD(GetCommandString)(THIS_
+ UINT idCmd,
+ UINT uType,
+ UINT * pwReserved,
+ LPSTR pszName,
+ UINT cchMax) PURE;
+ STDMETHOD(HandleMenuMsg)(THIS_
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam) PURE;
+};
+
+typedef IContextMenu2 * LPCONTEXTMENU2;
+
+
+
+
+//===========================================================================
+//
+// Interface: IShellExtInit
+//
+// The IShellExtInit interface is used by the explorer to initialize shell
+// extension objects. The explorer (1) calls CoCreateInstance (or equivalent)
+// with the registered CLSID and IID_IShellExtInit, (2) calls its Initialize
+// member, then (3) calls its QueryInterface to a particular interface (such
+// as IContextMenu or IPropSheetExt and (4) performs the rest of operation.
+//
+//
+// [Member functions]
+//
+// IShellExtInit::Initialize
+//
+// This member function is called when the explorer is initializing either
+// context menu extension, property sheet extension or non-default drag-drop
+// extension.
+//
+// Parameters: (context menu or property sheet extension)
+// pidlFolder -- Specifies the parent folder
+// lpdobj -- Spefifies the set of items selected in that folder.
+// hkeyProgID -- Specifies the type of the focused item in the selection.
+//
+// Parameters: (non-default drag-and-drop extension)
+// pidlFolder -- Specifies the target (destination) folder
+// lpdobj -- Specifies the items that are dropped (see the description
+// about shell's clipboard below for clipboard formats).
+// hkeyProgID -- Specifies the folder type.
+//
+//===========================================================================
+
+#undef INTERFACE
+#define INTERFACE IShellExtInit
+
+DECLARE_INTERFACE_(IShellExtInit, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IShellExtInit methods ***
+ STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST pidlFolder,
+ LPDATAOBJECT lpdobj, HKEY hkeyProgID) PURE;
+};
+
+typedef IShellExtInit * LPSHELLEXTINIT;
+
+
+//===========================================================================
+//
+// Interface: IShellPropSheetExt
+//
+// The explorer uses the IShellPropSheetExt to allow property sheet
+// extensions or control panel extensions to add additional property
+// sheet pages.
+//
+//
+// [Member functions]
+//
+// IShellPropSheetExt::AddPages
+//
+// The explorer calls this member function when it finds a registered
+// property sheet extension for a particular type of object. For each
+// additional page, the extension creates a page object by calling
+// CreatePropertySheetPage API and calls lpfnAddPage.
+//
+// Parameters:
+// lpfnAddPage -- Specifies the callback function.
+// lParam -- Specifies the opaque handle to be passed to the callback function.
+//
+//
+// IShellPropSheetExt::ReplacePage
+//
+// The explorer never calls this member of property sheet extensions. The
+// explorer calls this member of control panel extensions, so that they
+// can replace some of default control panel pages (such as a page of
+// mouse control panel).
+//
+// Parameters:
+// uPageID -- Specifies the page to be replaced.
+// lpfnReplace Specifies the callback function.
+// lParam -- Specifies the opaque handle to be passed to the callback function.
+//
+//===========================================================================
+
+#undef INTERFACE
+#define INTERFACE IShellPropSheetExt
+
+DECLARE_INTERFACE_(IShellPropSheetExt, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IShellPropSheetExt methods ***
+ STDMETHOD(AddPages)(THIS_ LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam) PURE;
+ STDMETHOD(ReplacePage)(THIS_ UINT uPageID, LPFNADDPROPSHEETPAGE lpfnReplaceWith, LPARAM lParam) PURE;
+};
+
+typedef IShellPropSheetExt * LPSHELLPROPSHEETEXT;
+
+
+//===========================================================================
+//
+// IPersistFolder Interface
+//
+// The IPersistFolder interface is used by the file system implementation of
+// IShellFolder::BindToObject when it is initializing a shell folder object.
+//
+//
+// [Member functions]
+//
+// IPersistFolder::Initialize
+//
+// This member function is called when the explorer is initializing a
+// shell folder object.
+//
+// Parameters:
+// pidl -- Specifies the absolute location of the folder.
+//
+//===========================================================================
+
+#undef INTERFACE
+#define INTERFACE IPersistFolder
+
+DECLARE_INTERFACE_(IPersistFolder, IPersist) // fld
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+ STDMETHOD_(ULONG,Release)(THIS) PURE;
+
+ // *** IPersist methods ***
+ STDMETHOD(GetClassID)(THIS_ LPCLSID lpClassID) PURE;
+
+ // *** IPersistFolder methods ***
+ STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST pidl) PURE;
+};
+
+typedef IPersistFolder *LPPERSISTFOLDER;
+
+
+//===========================================================================
+//
+// IExtractIcon interface
+//
+// This interface is used in two different places in the shell.
+//
+// Case-1: Icons of sub-folders for the scope-pane of the explorer.
+//
+// It is used by the explorer to get the "icon location" of
+// sub-folders from each shell folders. When the user expands a folder
+// in the scope pane of the explorer, the explorer does following:
+// (1) binds to the folder (gets IShellFolder),
+// (2) enumerates its sub-folders by calling its EnumObjects member,
+// (3) calls its GetUIObjectOf member to get IExtractIcon interface
+// for each sub-folders.
+// In this case, the explorer uses only IExtractIcon::GetIconLocation
+// member to get the location of the appropriate icon. An icon location
+// always consists of a file name (typically DLL or EXE) and either an icon
+// resource or an icon index.
+//
+//
+// Case-2: Extracting an icon image from a file
+//
+// It is used by the shell when it extracts an icon image
+// from a file. When the shell is extracting an icon from a file,
+// it does following:
+// (1) creates the icon extraction handler object (by getting its CLSID
+// under the {ProgID}\shell\ExtractIconHanler key and calling
+// CoCreateInstance requesting for IExtractIcon interface).
+// (2) Calls IExtractIcon::GetIconLocation.
+// (3) Then, calls IExtractIcon::ExtractIcon with the location/index pair.
+// (4) If (3) returns NOERROR, it uses the returned icon.
+// (5) Otherwise, it recursively calls this logic with new location
+// assuming that the location string contains a fully qualified path name.
+//
+// From extension programmer's point of view, there are only two cases
+// where they provide implementations of IExtractIcon:
+// Case-1) providing explorer extensions (i.e., IShellFolder).
+// Case-2) providing per-instance icons for some types of files.
+//
+// Because Case-1 is described above, we'll explain only Case-2 here.
+//
+// When the shell is about display an icon for a file, it does following:
+// (1) Finds its ProgID and ClassID.
+// (2) If the file has a ClassID, it gets the icon location string from the
+// "DefaultIcon" key under it. The string indicates either per-class
+// icon (e.g., "FOOBAR.DLL,2") or per-instance icon (e.g., "%1,1").
+// (3) If a per-instance icon is specified, the shell creates an icon
+// extraction handler object for it, and extracts the icon from it
+// (which is described above).
+//
+// It is important to note that the shell calls IExtractIcon::GetIconLocation
+// first, then calls IExtractIcon::Extract. Most application programs
+// that support per-instance icons will probably store an icon location
+// (DLL/EXE name and index/id) rather than an icon image in each file.
+// In those cases, a programmer needs to implement only the GetIconLocation
+// member and it Extract member simply returns S_FALSE. They need to
+// implement Extract member only if they decided to store the icon images
+// within files themselved or some other database (which is very rare).
+//
+//
+//
+// [Member functions]
+//
+//
+// IExtractIcon::GetIconLocation
+//
+// This function returns an icon location.
+//
+// Parameters:
+// uFlags [in] -- Specifies if it is opened or not (GIL_OPENICON or 0)
+// szIconFile [out] -- Specifies the string buffer buffer for a location name.
+// cchMax [in] -- Specifies the size of szIconFile (almost always MAX_PATH)
+// piIndex [out] -- Sepcifies the address of UINT for the index.
+// pwFlags [out] -- Returns GIL_* flags
+// Returns:
+// NOERROR, if it returns a valid location; S_FALSE, if the shell use a
+// default icon.
+//
+// Notes: The location may or may not be a path to a file. The caller can
+// not assume anything unless the subsequent Extract member call returns
+// S_FALSE.
+//
+// if the returned location is not a path to a file, GIL_NOTFILENAME should
+// be set in the returned flags.
+//
+// IExtractIcon::Extract
+//
+// This function extracts an icon image from a specified file.
+//
+// Parameters:
+// pszFile [in] -- Specifies the icon location (typically a path to a file).
+// nIconIndex [in] -- Specifies the icon index.
+// phiconLarge [out] -- Specifies the HICON variable for large icon.
+// phiconSmall [out] -- Specifies the HICON variable for small icon.
+// nIconSize [in] -- Specifies the size icon required (size of large icon)
+// LOWORD is the requested large icon size
+// HIWORD is the requested small icon size
+// Returns:
+// NOERROR, if it extracted the from the file.
+// S_FALSE, if the caller should extract from the file specified in the
+// location.
+//
+//===========================================================================
+
+// GetIconLocation() input flags
+
+#define GIL_OPENICON 0x0001 // allows containers to specify an "open" look
+#define GIL_FORSHELL 0x0002 // icon is to be displayed in a ShellFolder
+#define GIL_ASYNC 0x0020 // this is an async extract, return E_ASYNC
+
+// GetIconLocation() return flags
+
+#define GIL_SIMULATEDOC 0x0001 // simulate this document icon for this
+#define GIL_PERINSTANCE 0x0002 // icons from this class are per instance (each file has its own)
+#define GIL_PERCLASS 0x0004 // icons from this class per class (shared for all files of this type)
+#define GIL_NOTFILENAME 0x0008 // location is not a filename, must call ::ExtractIcon
+#define GIL_DONTCACHE 0x0010 // this icon should not be cached
+
+#undef INTERFACE
+#define INTERFACE IExtractIconA
+
+DECLARE_INTERFACE_(IExtractIconA, IUnknown) // exic
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IExtractIcon methods ***
+ STDMETHOD(GetIconLocation)(THIS_
+ UINT uFlags,
+ LPSTR szIconFile,
+ UINT cchMax,
+ int * piIndex,
+ UINT * pwFlags) PURE;
+
+ STDMETHOD(Extract)(THIS_
+ LPCSTR pszFile,
+ UINT nIconIndex,
+ HICON *phiconLarge,
+ HICON *phiconSmall,
+ UINT nIconSize) PURE;
+};
+
+typedef IExtractIconA * LPEXTRACTICONA;
+
+#undef INTERFACE
+#define INTERFACE IExtractIconW
+
+DECLARE_INTERFACE_(IExtractIconW, IUnknown) // exic
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IExtractIcon methods ***
+ STDMETHOD(GetIconLocation)(THIS_
+ UINT uFlags,
+ LPWSTR szIconFile,
+ UINT cchMax,
+ int * piIndex,
+ UINT * pwFlags) PURE;
+
+ STDMETHOD(Extract)(THIS_
+ LPCWSTR pszFile,
+ UINT nIconIndex,
+ HICON *phiconLarge,
+ HICON *phiconSmall,
+ UINT nIconSize) PURE;
+};
+
+typedef IExtractIconW * LPEXTRACTICONW;
+
+#ifdef UNICODE
+#define IExtractIcon IExtractIconW
+#define IExtractIconVtbl IExtractIconWVtbl
+#define LPEXTRACTICON LPEXTRACTICONW
+#else
+#define IExtractIcon IExtractIconA
+#define IExtractIconVtbl IExtractIconAVtbl
+#define LPEXTRACTICON LPEXTRACTICONA
+#endif
+
+//===========================================================================
+//
+// IShellIcon Interface
+//
+// used to get a icon index for a IShellFolder object.
+//
+// this interface can be implemented by a IShellFolder, as a quick way to
+// return the icon for a object in the folder.
+//
+// a instance of this interface is only created once for the folder, unlike
+// IExtractIcon witch is created once for each object.
+//
+// if a ShellFolder does not implement this interface, the standard
+// GetUIObject(....IExtractIcon) method will be used to get a icon
+// for all objects.
+//
+// the following standard imagelist indexs can be returned:
+//
+// 0 document (blank page) (not associated)
+// 1 document (with stuff on the page)
+// 2 application (exe, com, bat)
+// 3 folder (plain)
+// 4 folder (open)
+//
+// IShellIcon:GetIconOf(pidl, flags, lpIconIndex)
+//
+// pidl object to get icon for.
+// flags GIL_* input flags (GIL_OPEN, ...)
+// lpIconIndex place to return icon index.
+//
+// returns:
+// NOERROR, if lpIconIndex contains the correct system imagelist index.
+// S_FALSE, if unable to get icon for this object, go through
+// GetUIObject, IExtractIcon, methods.
+//
+//===========================================================================
+
+#undef INTERFACE
+#define INTERFACE IShellIcon
+
+DECLARE_INTERFACE_(IShellIcon, IUnknown) // shi
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IShellIcon methods ***
+ STDMETHOD(GetIconOf)(THIS_ LPCITEMIDLIST pidl, UINT flags,
+ LPINT lpIconIndex) PURE;
+};
+
+typedef IShellIcon *LPSHELLICON;
+
+//===========================================================================
+//
+// IShellLink Interface
+//
+//===========================================================================
+
+#ifdef UNICODE
+#define IShellLink IShellLinkW
+#define IShellLinkVtbl IShellLinkWVtbl
+#else
+#define IShellLink IShellLinkA
+#define IShellLinkVtbl IShellLinkAVtbl
+#endif
+
+// IShellLink::Resolve fFlags
+typedef enum {
+ SLR_NO_UI = 0x0001,
+ SLR_ANY_MATCH = 0x0002,
+ SLR_UPDATE = 0x0004,
+} SLR_FLAGS;
+
+// IShellLink::GetPath fFlags
+typedef enum {
+ SLGP_SHORTPATH = 0x0001,
+ SLGP_UNCPRIORITY = 0x0002,
+} SLGP_FLAGS;
+
+#undef INTERFACE
+#define INTERFACE IShellLinkA
+
+DECLARE_INTERFACE_(IShellLinkA, IUnknown) // sl
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ STDMETHOD(GetPath)(THIS_ LPSTR pszFile, int cchMaxPath, WIN32_FIND_DATAA *pfd, DWORD fFlags) PURE;
+
+ STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST * ppidl) PURE;
+ STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST pidl) PURE;
+
+ STDMETHOD(GetDescription)(THIS_ LPSTR pszName, int cchMaxName) PURE;
+ STDMETHOD(SetDescription)(THIS_ LPCSTR pszName) PURE;
+
+ STDMETHOD(GetWorkingDirectory)(THIS_ LPSTR pszDir, int cchMaxPath) PURE;
+ STDMETHOD(SetWorkingDirectory)(THIS_ LPCSTR pszDir) PURE;
+
+ STDMETHOD(GetArguments)(THIS_ LPSTR pszArgs, int cchMaxPath) PURE;
+ STDMETHOD(SetArguments)(THIS_ LPCSTR pszArgs) PURE;
+
+ STDMETHOD(GetHotkey)(THIS_ WORD *pwHotkey) PURE;
+ STDMETHOD(SetHotkey)(THIS_ WORD wHotkey) PURE;
+
+ STDMETHOD(GetShowCmd)(THIS_ int *piShowCmd) PURE;
+ STDMETHOD(SetShowCmd)(THIS_ int iShowCmd) PURE;
+
+ STDMETHOD(GetIconLocation)(THIS_ LPSTR pszIconPath, int cchIconPath, int *piIcon) PURE;
+ STDMETHOD(SetIconLocation)(THIS_ LPCSTR pszIconPath, int iIcon) PURE;
+
+ STDMETHOD(SetRelativePath)(THIS_ LPCSTR pszPathRel, DWORD dwReserved) PURE;
+
+ STDMETHOD(Resolve)(THIS_ HWND hwnd, DWORD fFlags) PURE;
+
+ STDMETHOD(SetPath)(THIS_ LPCSTR pszFile) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE IShellLinkW
+
+DECLARE_INTERFACE_(IShellLinkW, IUnknown) // sl
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ STDMETHOD(GetPath)(THIS_ LPWSTR pszFile, int cchMaxPath, WIN32_FIND_DATAW *pfd, DWORD fFlags) PURE;
+
+ STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST * ppidl) PURE;
+ STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST pidl) PURE;
+
+ STDMETHOD(GetDescription)(THIS_ LPWSTR pszName, int cchMaxName) PURE;
+ STDMETHOD(SetDescription)(THIS_ LPCWSTR pszName) PURE;
+
+ STDMETHOD(GetWorkingDirectory)(THIS_ LPWSTR pszDir, int cchMaxPath) PURE;
+ STDMETHOD(SetWorkingDirectory)(THIS_ LPCWSTR pszDir) PURE;
+
+ STDMETHOD(GetArguments)(THIS_ LPWSTR pszArgs, int cchMaxPath) PURE;
+ STDMETHOD(SetArguments)(THIS_ LPCWSTR pszArgs) PURE;
+
+ STDMETHOD(GetHotkey)(THIS_ WORD *pwHotkey) PURE;
+ STDMETHOD(SetHotkey)(THIS_ WORD wHotkey) PURE;
+
+ STDMETHOD(GetShowCmd)(THIS_ int *piShowCmd) PURE;
+ STDMETHOD(SetShowCmd)(THIS_ int iShowCmd) PURE;
+
+ STDMETHOD(GetIconLocation)(THIS_ LPWSTR pszIconPath, int cchIconPath, int *piIcon) PURE;
+ STDMETHOD(SetIconLocation)(THIS_ LPCWSTR pszIconPath, int iIcon) PURE;
+
+ STDMETHOD(SetRelativePath)(THIS_ LPCWSTR pszPathRel, DWORD dwReserved) PURE;
+
+ STDMETHOD(Resolve)(THIS_ HWND hwnd, DWORD fFlags) PURE;
+
+ STDMETHOD(SetPath)(THIS_ LPCWSTR pszFile) PURE;
+};
+
+#ifdef _INC_SHELLAPI /* for LPSHELLEXECUTEINFO */
+//===========================================================================
+//
+// IShellExecuteHook Interface
+//
+//===========================================================================
+
+#undef INTERFACE
+#define INTERFACE IShellExecuteHookA
+
+DECLARE_INTERFACE_(IShellExecuteHookA, IUnknown) // shexhk
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG, AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG, Release) (THIS) PURE;
+
+ // *** IShellExecuteHookA methods ***
+ STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOA pei) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE IShellExecuteHookW
+
+DECLARE_INTERFACE_(IShellExecuteHookW, IUnknown) // shexhk
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG, AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG, Release) (THIS) PURE;
+
+ // *** IShellExecuteHookW methods ***
+ STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOW pei) PURE;
+};
+
+#ifdef UNICODE
+#define IShellExecuteHook IShellExecuteHookW
+#define IShellExecuteHookVtbl IShellExecuteHookWVtbl
+#else
+#define IShellExecuteHook IShellExecuteHookA
+#define IShellExecuteHookVtbl IShellExecuteHookAVtbl
+#endif
+#endif
+
+//===========================================================================
+//
+// INewShortcutHook Interface
+//
+//===========================================================================
+
+#undef INTERFACE
+#define INTERFACE INewShortcutHookA
+
+DECLARE_INTERFACE_(INewShortcutHookA, IUnknown) // nshhk
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG, AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG, Release) (THIS) PURE;
+
+ // *** INewShortcutHook methods ***
+ STDMETHOD(SetReferent)(THIS_ LPCSTR pcszReferent, HWND hwnd) PURE;
+ STDMETHOD(GetReferent)(THIS_ LPSTR pszReferent, int cchReferent) PURE;
+ STDMETHOD(SetFolder)(THIS_ LPCSTR pcszFolder) PURE;
+ STDMETHOD(GetFolder)(THIS_ LPSTR pszFolder, int cchFolder) PURE;
+ STDMETHOD(GetName)(THIS_ LPSTR pszName, int cchName) PURE;
+ STDMETHOD(GetExtension)(THIS_ LPSTR pszExtension, int cchExtension) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE INewShortcutHookW
+
+DECLARE_INTERFACE_(INewShortcutHookW, IUnknown) // nshhk
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG, AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG, Release) (THIS) PURE;
+
+ // *** INewShortcutHook methods ***
+ STDMETHOD(SetReferent)(THIS_ LPCWSTR pcszReferent, HWND hwnd) PURE;
+ STDMETHOD(GetReferent)(THIS_ LPWSTR pszReferent, int cchReferent) PURE;
+ STDMETHOD(SetFolder)(THIS_ LPCWSTR pcszFolder) PURE;
+ STDMETHOD(GetFolder)(THIS_ LPWSTR pszFolder, int cchFolder) PURE;
+ STDMETHOD(GetName)(THIS_ LPWSTR pszName, int cchName) PURE;
+ STDMETHOD(GetExtension)(THIS_ LPWSTR pszExtension, int cchExtension) PURE;
+};
+
+#ifdef UNICODE
+#define INewShortcutHook INewShortcutHookW
+#define INewShortcutHookVtbl INewShortcutHookWVtbl
+#else
+#define INewShortcutHook INewShortcutHookA
+#define INewShortcutHookVtbl INewShortcutHookAVtbl
+#endif
+
+//===========================================================================
+//
+// ICopyHook Interface
+//
+// The copy hook is called whenever file system directories are
+// copy/moved/deleted/renamed via the shell. It is also called by the shell
+// on changes of status of printers.
+//
+// Clients register their id under STRREG_SHEX_COPYHOOK for file system hooks
+// and STRREG_SHEx_PRNCOPYHOOK for printer hooks.
+// the CopyCallback is called prior to the action, so the hook has the chance
+// to allow, deny or cancel the operation by returning the falues:
+// IDYES - means allow the operation
+// IDNO - means disallow the operation on this file, but continue with
+// any other operations (eg. batch copy)
+// IDCANCEL - means disallow the current operation and cancel any pending
+// operations
+//
+// arguments to the CopyCallback
+// hwnd - window to use for any UI
+// wFunc - what operation is being done
+// wFlags - and flags (FOF_*) set in the initial call to the file operation
+// pszSrcFile - name of the source file
+// dwSrcAttribs - file attributes of the source file
+// pszDestFile - name of the destiation file (for move and renames)
+// dwDestAttribs - file attributes of the destination file
+//
+//
+//===========================================================================
+
+#ifndef FO_MOVE //these need to be kept in sync with the ones in shellapi.h
+
+// file operations
+
+#define FO_MOVE 0x0001
+#define FO_COPY 0x0002
+#define FO_DELETE 0x0003
+#define FO_RENAME 0x0004
+
+#define FOF_MULTIDESTFILES 0x0001
+#define FOF_CONFIRMMOUSE 0x0002
+#define FOF_SILENT 0x0004 // don't create progress/report
+#define FOF_RENAMEONCOLLISION 0x0008
+#define FOF_NOCONFIRMATION 0x0010 // Don't prompt the user.
+#define FOF_WANTMAPPINGHANDLE 0x0020 // Fill in SHFILEOPSTRUCT.hNameMappings
+ // Must be freed using SHFreeNameMappings
+#define FOF_ALLOWUNDO 0x0040
+#define FOF_FILESONLY 0x0080 // on *.*, do only files
+#define FOF_SIMPLEPROGRESS 0x0100 // means don't show names of files
+#define FOF_NOCONFIRMMKDIR 0x0200 // don't confirm making any needed dirs
+#define FOF_NOERRORUI 0x0400 // don't put up error UI
+
+typedef UINT FILEOP_FLAGS;
+
+// printer operations
+
+#define PO_DELETE 0x0013 // printer is being deleted
+#define PO_RENAME 0x0014 // printer is being renamed
+#define PO_PORTCHANGE 0x0020 // port this printer connected to is being changed
+ // if this id is set, the strings received by
+ // the copyhook are a doubly-null terminated
+ // list of strings. The first is the printer
+ // name and the second is the printer port.
+#define PO_REN_PORT 0x0034 // PO_RENAME and PO_PORTCHANGE at same time.
+
+// no POF_ flags currently defined
+
+typedef UINT PRINTEROP_FLAGS;
+
+#endif // FO_MOVE
+
+#undef INTERFACE
+#define INTERFACE ICopyHookA
+
+DECLARE_INTERFACE_(ICopyHookA, IUnknown) // sl
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ STDMETHOD_(UINT,CopyCallback) (THIS_ HWND hwnd, UINT wFunc, UINT wFlags, LPCSTR pszSrcFile, DWORD dwSrcAttribs,
+ LPCSTR pszDestFile, DWORD dwDestAttribs) PURE;
+};
+
+typedef ICopyHookA * LPCOPYHOOKA;
+
+#undef INTERFACE
+#define INTERFACE ICopyHookW
+
+DECLARE_INTERFACE_(ICopyHookW, IUnknown) // sl
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ STDMETHOD_(UINT,CopyCallback) (THIS_ HWND hwnd, UINT wFunc, UINT wFlags, LPCWSTR pszSrcFile, DWORD dwSrcAttribs,
+ LPCWSTR pszDestFile, DWORD dwDestAttribs) PURE;
+};
+
+typedef ICopyHookW * LPCOPYHOOKW;
+
+#ifdef UNICODE
+#define ICopyHook ICopyHookW
+#define ICopyHookVtbl ICopyHookWVtbl
+#define LPCOPYHOOK LPCOPYHOOKW
+#else
+#define ICopyHook ICopyHookA
+#define ICopyHookVtbl ICopyHookAVtbl
+#define LPCOPYHOOK LPCOPYHOOKA
+#endif
+
+//===========================================================================
+//
+// IFileViewerSite Interface
+//
+//===========================================================================
+
+#undef INTERFACE
+#define INTERFACE IFileViewerSite
+
+DECLARE_INTERFACE(IFileViewerSite)
+{
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ STDMETHOD(SetPinnedWindow) (THIS_ HWND hwnd) PURE;
+ STDMETHOD(GetPinnedWindow) (THIS_ HWND *phwnd) PURE;
+};
+
+typedef IFileViewerSite * LPFILEVIEWERSITE;
+
+
+//===========================================================================
+//
+// IFileViewer Interface
+//
+// Implemented in a FileViewer component object. Used to tell a
+// FileViewer to PrintTo or to view, the latter happening though
+// ShowInitialize and Show. The filename is always given to the
+// viewer through IPersistFile.
+//
+//===========================================================================
+
+typedef struct
+{
+ // Stuff passed into viewer (in)
+ DWORD cbSize; // Size of structure for future expansion...
+ HWND hwndOwner; // who is the owner window.
+ int iShow; // The show command
+
+ // Passed in and updated (in/Out)
+ DWORD dwFlags; // flags
+ RECT rect; // Where to create the window may have defaults
+ LPUNKNOWN punkRel; // Relese this interface when window is visible
+
+ // Stuff that might be returned from viewer (out)
+ OLECHAR strNewFile[MAX_PATH]; // New File to view.
+
+} FVSHOWINFO, *LPFVSHOWINFO;
+
+ // Define File View Show Info Flags.
+#define FVSIF_RECT 0x00000001 // The rect variable has valid data.
+#define FVSIF_PINNED 0x00000002 // We should Initialize pinned
+
+#define FVSIF_NEWFAILED 0x08000000 // The new file passed back failed
+ // to be viewed.
+
+#define FVSIF_NEWFILE 0x80000000 // A new file to view has been returned
+#define FVSIF_CANVIEWIT 0x40000000 // The viewer can view it.
+
+#undef INTERFACE
+#define INTERFACE IFileViewerA
+
+DECLARE_INTERFACE(IFileViewerA)
+{
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ STDMETHOD(ShowInitialize) (THIS_ LPFILEVIEWERSITE lpfsi) PURE;
+ STDMETHOD(Show) (THIS_ LPFVSHOWINFO pvsi) PURE;
+ STDMETHOD(PrintTo) (THIS_ LPSTR pszDriver, BOOL fSuppressUI) PURE;
+};
+
+typedef IFileViewerA * LPFILEVIEWERA;
+
+#undef INTERFACE
+#define INTERFACE IFileViewerW
+
+DECLARE_INTERFACE(IFileViewerW)
+{
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ STDMETHOD(ShowInitialize) (THIS_ LPFILEVIEWERSITE lpfsi) PURE;
+ STDMETHOD(Show) (THIS_ LPFVSHOWINFO pvsi) PURE;
+ STDMETHOD(PrintTo) (THIS_ LPWSTR pszDriver, BOOL fSuppressUI) PURE;
+};
+
+typedef IFileViewerW * LPFILEVIEWERW;
+
+#ifdef UNICODE
+#define IFileViewer IFileViewerW
+#define LPFILEVIEWER LPFILEVIEWERW
+#else
+#define IFileViewer IFileViewerA
+#define LPFILEVIEWER LPFILEVIEWERA
+#endif
+
+
+
+// CommandTarget ids. for shell doc view wedge
+enum {
+ SHDVID_SETPROGRESSPOS,
+ SHDVID_SETPROGRESSRANGE,
+ SHDVID_SETSTATUSTEXT, // variantIn bstr
+
+ SHDVID_REFRESH,
+ SHDVID_STOP,
+ SHDVID_UPDATECOMMANDS, /// this forces a re-querystatus of the command targets.
+ /// the arg in can specify a specific one to update or NULL for evrything
+ SHDVID_SETTITLE, // variantIn bstr
+ SHDVID_FINALTITLEAVAIL, // variantIn bstr - sent after final SETTITLE is sent
+ SHDVID_STARTLOAD, // NULL for everything
+ SHDVID_STOPLOAD // NULL for everything
+#if MSOCT2
+ ,SHDVID_CCALLBACK, // callback to arbitrary C func
+ SHDVID_MENUEXEC, // do menu command
+ SHDVID_MENUQS // query menu commands
+#endif
+};
+
+
+
+//==========================================================================
+//
+// IShellBrowser/IShellView/IShellFolder interface
+//
+// These three interfaces are used when the shell communicates with
+// name space extensions. The shell (explorer) provides IShellBrowser
+// interface, and extensions implements IShellFolder and IShellView
+// interfaces.
+//
+//==========================================================================
+
+
+//--------------------------------------------------------------------------
+//
+// Command/menuitem IDs
+//
+// The explorer dispatches WM_COMMAND messages based on the range of
+// command/menuitem IDs. All the IDs of menuitems that the view (right
+// pane) inserts must be in FCIDM_SHVIEWFIRST/LAST (otherwise, the explorer
+// won't dispatch them). The view should not deal with any menuitems
+// in FCIDM_BROWSERFIRST/LAST (otherwise, it won't work with the future
+// version of the shell).
+//
+// FCIDM_SHVIEWFIRST/LAST for the right pane (IShellView)
+// FCIDM_BROWSERFIRST/LAST for the explorer frame (IShellBrowser)
+// FCIDM_GLOBAL/LAST for the explorer's submenu IDs
+//
+//--------------------------------------------------------------------------
+
+#define FCIDM_SHVIEWFIRST 0x0000
+#define FCIDM_SHVIEWLAST 0x7fff
+#define FCIDM_BROWSERFIRST 0xa000
+#define FCIDM_BROWSERLAST 0xbf00
+#define FCIDM_GLOBALFIRST 0x8000
+#define FCIDM_GLOBALLAST 0x9fff
+
+//
+// Global submenu IDs and separator IDs
+//
+#define FCIDM_MENU_FILE (FCIDM_GLOBALFIRST+0x0000)
+#define FCIDM_MENU_EDIT (FCIDM_GLOBALFIRST+0x0040)
+#define FCIDM_MENU_VIEW (FCIDM_GLOBALFIRST+0x0080)
+#define FCIDM_MENU_VIEW_SEP_OPTIONS (FCIDM_GLOBALFIRST+0x0081)
+#define FCIDM_MENU_TOOLS (FCIDM_GLOBALFIRST+0x00c0)
+#define FCIDM_MENU_TOOLS_SEP_GOTO (FCIDM_GLOBALFIRST+0x00c1)
+#define FCIDM_MENU_HELP (FCIDM_GLOBALFIRST+0x0100)
+#define FCIDM_MENU_FIND (FCIDM_GLOBALFIRST+0x0140)
+#define FCIDM_MENU_EXPLORE (FCIDM_GLOBALFIRST+0x0150)
+#define FCIDM_MENU_FAVORITES (FCIDM_GLOBALFIRST+0x0170)
+
+//--------------------------------------------------------------------------
+// control IDs known to the view
+//--------------------------------------------------------------------------
+
+#define FCIDM_TOOLBAR (FCIDM_BROWSERFIRST + 0)
+#define FCIDM_STATUS (FCIDM_BROWSERFIRST + 1)
+
+
+//--------------------------------------------------------------------------
+//
+// FOLDERSETTINGS
+//
+// FOLDERSETTINGS is a data structure that explorer passes from one folder
+// view to another, when the user is browsing. It calls ISV::GetCurrentInfo
+// member to get the current settings and pass it to ISV::CreateViewWindow
+// to allow the next folder view "inherit" it. These settings assumes a
+// particular UI (which the shell's folder view has), and shell extensions
+// may or may not use those settings.
+//
+//--------------------------------------------------------------------------
+
+typedef LPBYTE LPVIEWSETTINGS;
+
+// NB Bitfields.
+// FWF_DESKTOP implies FWF_TRANSPARENT/NOCLIENTEDGE/NOSCROLL
+typedef enum
+ {
+ FWF_AUTOARRANGE = 0x0001,
+ FWF_ABBREVIATEDNAMES = 0x0002,
+ FWF_SNAPTOGRID = 0x0004,
+ FWF_OWNERDATA = 0x0008,
+ FWF_BESTFITWINDOW = 0x0010,
+ FWF_DESKTOP = 0x0020,
+ FWF_SINGLESEL = 0x0040,
+ FWF_NOSUBFOLDERS = 0x0080,
+ FWF_TRANSPARENT = 0x0100,
+ FWF_NOCLIENTEDGE = 0x0200,
+ FWF_NOSCROLL = 0x0400,
+ FWF_ALIGNLEFT = 0x0800,
+ FWF_SINGLECLICKACTIVATE=0x8000 // TEMPORARY -- NO UI FOR THIS
+ } FOLDERFLAGS;
+
+typedef enum
+ {
+ FVM_ICON = 1,
+ FVM_SMALLICON = 2,
+ FVM_LIST = 3,
+ FVM_DETAILS = 4,
+ } FOLDERVIEWMODE;
+
+typedef struct
+ {
+ UINT ViewMode; // View mode (FOLDERVIEWMODE values)
+ UINT fFlags; // View options (FOLDERFLAGS bits)
+ } FOLDERSETTINGS, *LPFOLDERSETTINGS;
+
+typedef const FOLDERSETTINGS * LPCFOLDERSETTINGS;
+
+
+//--------------------------------------------------------------------------
+//
+// Interface: IShellBrowser
+//
+// IShellBrowser interface is the interface that is provided by the shell
+// explorer/folder frame window. When it creates the "contents pane" of
+// a shell folder (which provides IShellFolder interface), it calls its
+// CreateViewObject member function to create an IShellView object. Then,
+// it calls its CreateViewWindow member to create the "contents pane"
+// window. The pointer to the IShellBrowser interface is passed to
+// the IShellView object as a parameter to this CreateViewWindow member
+// function call.
+//
+// +--------------------------+ <-- Explorer window
+// | [] Explorer |
+// |--------------------------+ IShellBrowser
+// | File Edit View .. |
+// |--------------------------|
+// | | |
+// | | <-------- Content pane
+// | | |
+// | | | IShellView
+// | | |
+// | | |
+// +--------------------------+
+//
+//
+//
+// [Member functions]
+//
+//
+// IShellBrowser::GetWindow(phwnd)
+//
+// Inherited from IOleWindow::GetWindow.
+//
+//
+// IShellBrowser::ContextSensitiveHelp(fEnterMode)
+//
+// Inherited from IOleWindow::ContextSensitiveHelp.
+//
+//
+// IShellBrowser::InsertMenusSB(hmenuShared, lpMenuWidths)
+//
+// Similar to the IOleInPlaceFrame::InsertMenus. The explorer will put
+// "File" and "Edit" pulldown in the File menu group, "View" and "Tools"
+// in the Container menu group and "Help" in the Window menu group. Each
+// pulldown menu will have a uniqu ID, FCIDM_MENU_FILE/EDIT/VIEW/TOOLS/HELP.
+// The view is allowed to insert menuitems into those sub-menus by those
+// IDs must be between FCIDM_SHVIEWFIRST and FCIDM_SHVIEWLAST.
+//
+//
+// IShellBrowser::SetMenuSB(hmenuShared, holemenu, hwndActiveObject)
+//
+// Similar to the IOleInPlaceFrame::SetMenu. The explorer ignores the
+// holemenu parameter (reserved for future enhancement) and performs
+// menu-dispatch based on the menuitem IDs (see the description above).
+// It is important to note that the explorer will add different
+// set of menuitems depending on whether the view has a focus or not.
+// Therefore, it is very important to call ISB::OnViewWindowActivate
+// whenever the view window (or its children) gets the focus.
+//
+//
+// IShellBrowser::RemoveMenusSB(hmenuShared)
+//
+// Same as the IOleInPlaceFrame::RemoveMenus.
+//
+//
+// IShellBrowser::SetStatusTextSB(lpszStatusText)
+//
+// Same as the IOleInPlaceFrame::SetStatusText. It is also possible to
+// send messages directly to the status window via SendControlMsg.
+//
+//
+// IShellBrowser::EnableModelessSB(fEnable)
+//
+// Same as the IOleInPlaceFrame::EnableModeless.
+//
+//
+// IShellBrowser::TranslateAcceleratorSB(lpmsg, wID)
+//
+// Same as the IOleInPlaceFrame::TranslateAccelerator, but will be
+// never called because we don't support EXEs (i.e., the explorer has
+// the message loop). This member function is defined here for possible
+// future enhancement.
+//
+//
+// IShellBrowser::BrowseObject(pidl, wFlags)
+//
+// The view calls this member to let shell explorer browse to another
+// folder. The pidl and wFlags specifies the folder to be browsed.
+//
+// Following three flags specifies whether it creates another window or not.
+// SBSP_SAMEBROWSER -- Browse to another folder with the same window.
+// SBSP_NEWBROWSER -- Creates another window for the specified folder.
+// SBSP_DEFBROWSER -- Default behavior (respects the view option).
+//
+// Following three flags specifies open, explore, or default mode. These .
+// are ignored if SBSP_SAMEBROWSER or (SBSP_DEFBROWSER && (single window .
+// browser || explorer)). .
+// SBSP_OPENMODE -- Use a normal folder window
+// SBSP_EXPLOREMODE -- Use an explorer window
+// SBSP_DEFMODE -- Use the same as the current window
+//
+// Following three flags specifies the pidl.
+// SBSP_ABSOLUTE -- pidl is an absolute pidl (relative from desktop)
+// SBSP_RELATIVE -- pidl is relative from the current folder.
+// SBSP_PARENT -- Browse the parent folder (ignores the pidl)
+//
+//
+// IShellBrowser::GetViewStateStream(grfMode, ppstm)
+//
+// The browser returns an IStream interface as the storage for view
+// specific state information.
+//
+// grfMode -- Specifies the read/write access (STGM_READ/WRITE/READWRITE)
+// ppstm -- Specifies the LPSTREAM variable to be filled.
+//
+//
+// IShellBrowser::GetControlWindow(id, phwnd)
+//
+// The shell view may call this member function to get the window handle
+// of Explorer controls (toolbar or status winodw -- FCW_TOOLBAR or
+// FCW_STATUS).
+//
+//
+// IShellBrowser::SendControlMsg(id, uMsg, wParam, lParam, pret)
+//
+// The shell view calls this member function to send control messages to
+// one of Explorer controls (toolbar or status window -- FCW_TOOLBAR or
+// FCW_STATUS).
+//
+//
+// IShellBrowser::QueryActiveShellView(IShellView * ppshv)
+//
+// This member returns currently activated (displayed) shellview object.
+// A shellview never need to call this member function.
+//
+//
+// IShellBrowser::OnViewWindowActive(pshv)
+//
+// The shell view window calls this member function when the view window
+// (or one of its children) got the focus. It MUST call this member before
+// calling IShellBrowser::InsertMenus, because it will insert different
+// set of menu items depending on whether the view has the focus or not.
+//
+//
+// IShellBrowser::SetToolbarItems(lpButtons, nButtons, uFlags)
+//
+// The view calls this function to add toolbar items to the exporer's
+// toolbar. "lpButtons" and "nButtons" specifies the array of toolbar
+// items. "uFlags" must be one of FCT_MERGE, FCT_CONFIGABLE, FCT_ADDTOEND.
+//
+//-------------------------------------------------------------------------
+
+#undef INTERFACE
+#define INTERFACE IShellBrowser
+
+//
+// Values for wFlags parameter of ISB::BrowseObject() member.
+//
+#define SBSP_DEFBROWSER 0x0000
+#define SBSP_SAMEBROWSER 0x0001
+#define SBSP_NEWBROWSER 0x0002
+
+#define SBSP_DEFMODE 0x0000
+#define SBSP_OPENMODE 0x0010
+#define SBSP_EXPLOREMODE 0x0020
+
+#define SBSP_ABSOLUTE 0x0000
+#define SBSP_RELATIVE 0x1000
+#define SBSP_PARENT 0x2000
+
+#define SBSP_INITIATEDBYHLINKFRAME 0x80000000
+#define SBSP_REDIRECT 0x40000000
+
+//
+// Values for id parameter of ISB::GetWindow/SendControlMsg members.
+//
+// WARNING:
+// Any shell extensions which sends messages to those control windows
+// might not work in the future version of windows. If you really need
+// to send messages to them, (1) don't assume that those control window
+// always exist (i.e. GetControlWindow may fail) and (2) verify the window
+// class of the window before sending any messages.
+//
+#define FCW_STATUS 0x0001
+#define FCW_TOOLBAR 0x0002
+#define FCW_TREE 0x0003
+
+//
+// Values for uFlags paremeter of ISB::SetToolbarItems member.
+//
+#define FCT_MERGE 0x0001
+#define FCT_CONFIGABLE 0x0002
+#define FCT_ADDTOEND 0x0004
+
+
+DECLARE_INTERFACE_(IShellBrowser, IOleWindow)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleWindow methods ***
+ STDMETHOD(GetWindow) (THIS_ HWND * lphwnd) PURE;
+ STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL fEnterMode) PURE;
+
+ // *** IShellBrowser methods *** (same as IOleInPlaceFrame)
+ STDMETHOD(InsertMenusSB) (THIS_ HMENU hmenuShared,
+ LPOLEMENUGROUPWIDTHS lpMenuWidths) PURE;
+ STDMETHOD(SetMenuSB) (THIS_ HMENU hmenuShared, HOLEMENU holemenuReserved,
+ HWND hwndActiveObject) PURE;
+ STDMETHOD(RemoveMenusSB) (THIS_ HMENU hmenuShared) PURE;
+ STDMETHOD(SetStatusTextSB) (THIS_ LPCOLESTR lpszStatusText) PURE;
+ STDMETHOD(EnableModelessSB) (THIS_ BOOL fEnable) PURE;
+ STDMETHOD(TranslateAcceleratorSB) (THIS_ LPMSG lpmsg, WORD wID) PURE;
+
+ // *** IShellBrowser methods ***
+ STDMETHOD(BrowseObject)(THIS_ LPCITEMIDLIST pidl, UINT wFlags) PURE;
+ STDMETHOD(GetViewStateStream)(THIS_ DWORD grfMode,
+ LPSTREAM *ppStrm) PURE;
+ STDMETHOD(GetControlWindow)(THIS_ UINT id, HWND * lphwnd) PURE;
+ STDMETHOD(SendControlMsg)(THIS_ UINT id, UINT uMsg, WPARAM wParam,
+ LPARAM lParam, LRESULT * pret) PURE;
+ STDMETHOD(QueryActiveShellView)(THIS_ struct IShellView ** ppshv) PURE;
+ STDMETHOD(OnViewWindowActive)(THIS_ struct IShellView * ppshv) PURE;
+ STDMETHOD(SetToolbarItems)(THIS_ LPTBBUTTON lpButtons, UINT nButtons,
+ UINT uFlags) PURE;
+};
+
+typedef IShellBrowser * LPSHELLBROWSER;
+
+enum {
+ SBSC_HIDE = 0,
+ SBSC_SHOW = 1,
+ SBSC_TOGGLE = 2,
+ SBSC_QUERY = 3
+};
+
+// CommandTarget ids.
+enum {
+ SBCMDID_ENABLESHOWTREE,
+ SBCMDID_SHOWCONTROL, // variant vt_i4 = loword = FCW_* hiword = SBSC_*
+ SBCMDID_CANCELNAVIGATION, // cancel last navigation
+ SBCMDID_MAYSAVECHANGES, // about to close and may save changes
+ SBCMDID_SETHLINKFRAME, // variant vt_i4 = phlinkframe
+ SBCMDID_ENABLESTOP, // variant vt_bool = fEnable
+ SBCMDID_OPTIONS, // the view.options page
+};
+
+
+//-------------------------------------------------------------------------
+// ICommDlgBrowser interface
+//
+// ICommDlgBrowser interface is the interface that is provided by the new
+// common dialog window to hook and modify the behavior of IShellView. When
+// a default view is created, it queries its parent IShellBrowser for the
+// ICommDlgBrowser interface. If supported, it calls out to that interface
+// in several cases that need to behave differently in a dialog.
+//
+// Member functions:
+//
+// ICommDlgBrowser::OnDefaultCommand()
+// Called when the user double-clicks in the view or presses Enter. The
+// browser should return S_OK if it processed the action itself, S_FALSE
+// to let the view perform the default action.
+//
+// ICommDlgBrowser::OnStateChange(ULONG uChange)
+// Called when some states in the view change. 'uChange' is one of the
+// CDBOSC_* values. This call is made after the state (selection, focus,
+// etc) has changed. There is no return value.
+//
+// ICommDlgBrowser::IncludeObject(LPCITEMIDLIST pidl)
+// Called when the view is enumerating objects. 'pidl' is a relative
+// IDLIST. The browser should return S_OK to include the object in the
+// view, S_FALSE to hide it
+//
+//-------------------------------------------------------------------------
+
+#undef INTERFACE
+#define INTERFACE ICommDlgBrowser
+
+#define CDBOSC_SETFOCUS 0x00000000
+#define CDBOSC_KILLFOCUS 0x00000001
+#define CDBOSC_SELCHANGE 0x00000002
+#define CDBOSC_RENAME 0x00000003
+
+DECLARE_INTERFACE_(ICommDlgBrowser, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** ICommDlgBrowser methods ***
+ STDMETHOD(OnDefaultCommand) (THIS_ struct IShellView * ppshv) PURE;
+ STDMETHOD(OnStateChange) (THIS_ struct IShellView * ppshv,
+ ULONG uChange) PURE;
+ STDMETHOD(IncludeObject) (THIS_ struct IShellView * ppshv,
+ LPCITEMIDLIST pidl) PURE;
+};
+
+typedef ICommDlgBrowser * LPCOMMDLGBROWSER;
+
+
+//==========================================================================
+//
+// Interface: IShellView
+//
+// IShellView::GetWindow(phwnd)
+//
+// Inherited from IOleWindow::GetWindow.
+//
+//
+// IShellView::ContextSensitiveHelp(fEnterMode)
+//
+// Inherited from IOleWindow::ContextSensitiveHelp.
+//
+//
+// IShellView::TranslateAccelerator(lpmsg)
+//
+// Similar to IOleInPlaceActiveObject::TranlateAccelerator. The explorer
+// calls this function BEFORE any other translation. Returning S_OK
+// indicates that the message was translated (eaten) and should not be
+// translated or dispatched by the explorer.
+//
+//
+// IShellView::EnableModeless(fEnable)
+// Similar to IOleInPlaceActiveObject::EnableModeless.
+//
+//
+// IShellView::UIActivate(uState)
+//
+// The explorer calls this member function whenever the activation
+// state of the view window is changed by a certain event that is
+// NOT caused by the shell view itself.
+//
+// SVUIA_DEACTIVATE will be passed when the explorer is about to
+// destroy the shell view window; the shell view is supposed to remove
+// all the extended UIs (typically merged menu and modeless popup windows).
+//
+// SVUIA_ACTIVATE_NOFOCUS will be passsed when the shell view is losing
+// the input focus or the shell view has been just created without the
+// input focus; the shell view is supposed to set menuitems appropriate
+// for non-focused state (no selection specific items should be added).
+//
+// SVUIA_ACTIVATE_FOCUS will be passed when the explorer has just
+// created the view window with the input focus; the shell view is
+// supposed to set menuitems appropriate for focused state.
+//
+// SVUIA_INPLACEACTIVATE(new) will be passed when the shell view is opened
+// within an ActiveX control, which is not a UI active. In this case,
+// the shell view should not merge menus or put toolbas. To be compatible
+// with Win95 client, we don't pass this value unless the view supports
+// IShellView2.
+//
+// The shell view should not change focus within this member function.
+// The shell view should not hook the WM_KILLFOCUS message to remerge
+// menuitems. However, the shell view typically hook the WM_SETFOCUS
+// message, and re-merge the menu after calling IShellBrowser::
+// OnViewWindowActivated.
+//
+//
+// IShellView::Refresh()
+//
+// The explorer calls this member when the view needs to refresh its
+// contents (such as when the user hits F5 key).
+//
+//
+// IShellView::CreateViewWindow
+//
+// This member creates the view window (right-pane of the explorer or the
+// client window of the folder window).
+//
+//
+// IShellView::DestroyViewWindow
+//
+// This member destroys the view window.
+//
+//
+// IShellView::GetCurrentInfo
+//
+// This member returns the folder settings.
+//
+//
+// IShellView::AddPropertySHeetPages
+//
+// The explorer calls this member when it is opening the option property
+// sheet. This allows the view to add additional pages to it.
+//
+//
+// IShellView::SaveViewState()
+//
+// The explorer calls this member when the shell view is supposed to
+// store its view settings. The shell view is supposed to get a view
+// stream by calling IShellBrowser::GetViewStateStream and store the
+// current view state into that stream.
+//
+//
+// IShellView::SelectItem(pidlItem, uFlags)
+//
+// The explorer calls this member to change the selection state of
+// item(s) within the shell view window. If pidlItem is NULL and uFlags
+// is SVSI_DESELECTOTHERS, all items should be deselected.
+//
+//-------------------------------------------------------------------------
+
+#undef INTERFACE
+#define INTERFACE IShellView
+
+//
+// shellview select item flags
+//
+#define SVSI_DESELECT 0x0000
+#define SVSI_SELECT 0x0001
+#define SVSI_EDIT 0x0003 // includes select
+#define SVSI_DESELECTOTHERS 0x0004
+#define SVSI_ENSUREVISIBLE 0x0008
+#define SVSI_FOCUSED 0x0010
+
+//
+// shellview get item object flags
+//
+#define SVGIO_BACKGROUND 0x00000000
+#define SVGIO_SELECTION 0x00000001
+#define SVGIO_ALLVIEW 0x00000002
+
+//
+// uState values for IShellView::UIActivate
+//
+typedef enum {
+ SVUIA_DEACTIVATE = 0,
+ SVUIA_ACTIVATE_NOFOCUS = 1,
+ SVUIA_ACTIVATE_FOCUS = 2,
+ SVUIA_INPLACEACTIVATE = 3 // new flag for IShellView2
+} SVUIA_STATUS;
+
+DECLARE_INTERFACE_(IShellView, IOleWindow)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleWindow methods ***
+ STDMETHOD(GetWindow) (THIS_ HWND * lphwnd) PURE;
+ STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL fEnterMode) PURE;
+
+ // *** IShellView methods ***
+ STDMETHOD(TranslateAccelerator) (THIS_ LPMSG lpmsg) PURE;
+#ifdef _FIX_ENABLEMODELESS_CONFLICT
+ STDMETHOD(EnableModelessSV) (THIS_ BOOL fEnable) PURE;
+#else
+ STDMETHOD(EnableModeless) (THIS_ BOOL fEnable) PURE;
+#endif
+ STDMETHOD(UIActivate) (THIS_ UINT uState) PURE;
+ STDMETHOD(Refresh) (THIS) PURE;
+
+ STDMETHOD(CreateViewWindow)(THIS_ IShellView *lpPrevView,
+ LPCFOLDERSETTINGS lpfs, IShellBrowser * psb,
+ RECT * prcView, HWND *phWnd) PURE;
+ STDMETHOD(DestroyViewWindow)(THIS) PURE;
+ STDMETHOD(GetCurrentInfo)(THIS_ LPFOLDERSETTINGS lpfs) PURE;
+ STDMETHOD(AddPropertySheetPages)(THIS_ DWORD dwReserved,
+ LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam) PURE;
+ STDMETHOD(SaveViewState)(THIS) PURE;
+ STDMETHOD(SelectItem)(THIS_ LPCITEMIDLIST pidlItem, UINT uFlags) PURE;
+ STDMETHOD(GetItemObject)(THIS_ UINT uItem, REFIID riid,
+ LPVOID *ppv) PURE;
+};
+
+typedef IShellView * LPSHELLVIEW;
+
+typedef GUID SHELLVIEWID;
+
+#define SV2GV_CURRENTVIEW ((UINT)-1)
+#define SV2GV_DEFAULTVIEW ((UINT)-2)
+
+typedef struct _SV2CVW2_PARAMS
+{
+ DWORD cbSize;
+
+ IShellView *psvPrev;
+ FOLDERSETTINGS const *pfs;
+ IShellBrowser *psbOwner;
+ RECT *prcView;
+ SHELLVIEWID const *pvid;
+
+ HWND hwndView;
+} SV2CVW2_PARAMS;
+typedef SV2CVW2_PARAMS *LPSV2CVW2_PARAMS;
+
+#undef INTERFACE
+#define INTERFACE IShellView2
+
+DECLARE_INTERFACE_(IShellView2, IShellView)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IOleWindow methods ***
+ STDMETHOD(GetWindow) (THIS_ HWND * lphwnd) PURE;
+ STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL fEnterMode) PURE;
+
+ // *** IShellView methods ***
+ STDMETHOD(TranslateAccelerator) (THIS_ LPMSG lpmsg) PURE;
+#ifdef _FIX_ENABLEMODELESS_CONFLICT
+ STDMETHOD(EnableModelessSV) (THIS_ BOOL fEnable) PURE;
+#else
+ STDMETHOD(EnableModeless) (THIS_ BOOL fEnable) PURE;
+#endif
+ STDMETHOD(UIActivate) (THIS_ UINT uState) PURE;
+ STDMETHOD(Refresh) (THIS) PURE;
+
+ STDMETHOD(CreateViewWindow)(THIS_ IShellView *lpPrevView,
+ LPCFOLDERSETTINGS lpfs, IShellBrowser * psb,
+ RECT * prcView, HWND *phWnd) PURE;
+ STDMETHOD(DestroyViewWindow)(THIS) PURE;
+ STDMETHOD(GetCurrentInfo)(THIS_ LPFOLDERSETTINGS lpfs) PURE;
+ STDMETHOD(AddPropertySheetPages)(THIS_ DWORD dwReserved,
+ LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam) PURE;
+ STDMETHOD(SaveViewState)(THIS) PURE;
+ STDMETHOD(SelectItem)(THIS_ LPCITEMIDLIST pidlItem, UINT uFlags) PURE;
+ STDMETHOD(GetItemObject)(THIS_ UINT uItem, REFIID riid,
+ LPVOID *ppv) PURE;
+
+ // *** IShellView2 methods ***
+ STDMETHOD(GetView)(THIS_ SHELLVIEWID* pvid, ULONG uView) PURE;
+ STDMETHOD(CreateViewWindow2)(THIS_ LPSV2CVW2_PARAMS lpParams) PURE;
+};
+
+//-------------------------------------------------------------------------
+//
+// struct STRRET
+//
+// structure for returning strings from IShellFolder member functions
+//
+//-------------------------------------------------------------------------
+#define STRRET_WSTR 0x0000 // Use STRRET.pOleStr
+#define STRRET_OFFSET 0x0001 // Use STRRET.uOffset to Ansi
+#define STRRET_CSTR 0x0002 // Use STRRET.cStr
+
+
+typedef struct _STRRET
+{
+ UINT uType; // One of the STRRET_* values
+ union
+ {
+ LPWSTR pOleStr; // OLESTR that will be freed
+ LPSTR pStr; // ANSI string that will be freed (needed?)
+ UINT uOffset; // Offset into SHITEMID
+ char cStr[MAX_PATH]; // Buffer to fill in (ANSI)
+ } DUMMYUNIONNAME;
+} STRRET, *LPSTRRET;
+
+
+//-------------------------------------------------------------------------
+//
+// SHGetPathFromIDList
+//
+// This function assumes the size of the buffer (MAX_PATH). The pidl
+// should point to a file system object.
+//
+//-------------------------------------------------------------------------
+
+WINSHELLAPI BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath);
+WINSHELLAPI BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath);
+
+#ifdef UNICODE
+#define SHGetPathFromIDList SHGetPathFromIDListW
+#else
+#define SHGetPathFromIDList SHGetPathFromIDListA
+#endif
+
+
+//-------------------------------------------------------------------------
+//
+// SHGetSpecialFolderLocation
+//
+// Caller should call SHFree to free the returned pidl.
+//
+//-------------------------------------------------------------------------
+//
+// registry entries for special paths are kept in :
+#define REGSTR_PATH_SPECIAL_FOLDERS REGSTR_PATH_EXPLORER TEXT("\\Shell Folders")
+
+
+
+#define CSIDL_DESKTOP 0x0000
+#define CSIDL_PROGRAMS 0x0002
+#define CSIDL_CONTROLS 0x0003
+#define CSIDL_PRINTERS 0x0004
+#define CSIDL_PERSONAL 0x0005
+#define CSIDL_FAVORITES 0x0006
+#define CSIDL_STARTUP 0x0007
+#define CSIDL_RECENT 0x0008
+#define CSIDL_SENDTO 0x0009
+#define CSIDL_BITBUCKET 0x000a
+#define CSIDL_STARTMENU 0x000b
+#define CSIDL_DESKTOPDIRECTORY 0x0010
+#define CSIDL_DRIVES 0x0011
+#define CSIDL_NETWORK 0x0012
+#define CSIDL_NETHOOD 0x0013
+#define CSIDL_FONTS 0x0014
+#define CSIDL_TEMPLATES 0x0015
+#define CSIDL_COMMON_STARTMENU 0x0016
+#define CSIDL_COMMON_PROGRAMS 0X0017
+#define CSIDL_COMMON_STARTUP 0x0018
+#define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019
+#define CSIDL_APPDATA 0x001a
+#define CSIDL_PRINTHOOD 0x001b
+
+WINSHELLAPI HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, int nFolder, LPITEMIDLIST * ppidl);
+
+//-------------------------------------------------------------------------
+//
+// SHBrowseForFolder API
+//
+//-------------------------------------------------------------------------
+
+typedef int (CALLBACK* BFFCALLBACK)(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData);
+
+typedef struct _browseinfoA {
+ HWND hwndOwner;
+ LPCITEMIDLIST pidlRoot;
+ LPSTR pszDisplayName;// Return display name of item selected.
+ LPCSTR lpszTitle; // text to go in the banner over the tree.
+ UINT ulFlags; // Flags that control the return stuff
+ BFFCALLBACK lpfn;
+ LPARAM lParam; // extra info that's passed back in callbacks
+
+ int iImage; // output var: where to return the Image index.
+} BROWSEINFOA, *PBROWSEINFOA, *LPBROWSEINFOA;
+
+typedef struct _browseinfoW {
+ HWND hwndOwner;
+ LPCITEMIDLIST pidlRoot;
+ LPWSTR pszDisplayName;// Return display name of item selected.
+ LPCWSTR lpszTitle; // text to go in the banner over the tree.
+ UINT ulFlags; // Flags that control the return stuff
+ BFFCALLBACK lpfn;
+ LPARAM lParam; // extra info that's passed back in callbacks
+
+ int iImage; // output var: where to return the Image index.
+} BROWSEINFOW, *PBROWSEINFOW, *LPBROWSEINFOW;
+
+#ifdef UNICODE
+#define BROWSEINFO BROWSEINFOW
+#define PBROWSEINFO PBROWSEINFOW
+#define LPBROWSEINFO LPBROWSEINFOW
+#else
+#define BROWSEINFO BROWSEINFOA
+#define PBROWSEINFO PBROWSEINFOA
+#define LPBROWSEINFO LPBROWSEINFOA
+#endif
+
+// Browsing for directory.
+#define BIF_RETURNONLYFSDIRS 0x0001 // For finding a folder to start document searching
+#define BIF_DONTGOBELOWDOMAIN 0x0002 // For starting the Find Computer
+#define BIF_STATUSTEXT 0x0004
+#define BIF_RETURNFSANCESTORS 0x0008
+
+#define BIF_BROWSEFORCOMPUTER 0x1000 // Browsing for Computers.
+#define BIF_BROWSEFORPRINTER 0x2000 // Browsing for Printers
+#define BIF_BROWSEINCLUDEFILES 0x4000 // Browsing for Everything
+
+// message from browser
+#define BFFM_INITIALIZED 1
+#define BFFM_SELCHANGED 2
+
+// messages to browser
+#define BFFM_SETSTATUSTEXTA (WM_USER + 100)
+#define BFFM_ENABLEOK (WM_USER + 101)
+#define BFFM_SETSELECTIONA (WM_USER + 102)
+#define BFFM_SETSELECTIONW (WM_USER + 103)
+#define BFFM_SETSTATUSTEXTW (WM_USER + 104)
+
+
+WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolderA(LPBROWSEINFOA lpbi);
+WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolderW(LPBROWSEINFOW lpbi);
+
+#ifdef UNICODE
+#define SHBrowseForFolder SHBrowseForFolderW
+#define BFFM_SETSTATUSTEXT BFFM_SETSTATUSTEXTW
+#define BFFM_SETSELECTION BFFM_SETSELECTIONW
+#else
+#define SHBrowseForFolder SHBrowseForFolderA
+#define BFFM_SETSTATUSTEXT BFFM_SETSTATUSTEXTA
+#define BFFM_SETSELECTION BFFM_SETSELECTIONA
+#endif
+
+//-------------------------------------------------------------------------
+//
+// SHLoadInProc
+//
+// When this function is called, the shell calls CoCreateInstance
+// (or equivalent) with CLSCTX_INPROC_SERVER and the specified CLSID
+// from within the shell's process and release it immediately.
+//
+//-------------------------------------------------------------------------
+
+WINSHELLAPI HRESULT WINAPI SHLoadInProc(REFCLSID rclsid);
+
+
+//-------------------------------------------------------------------------
+//
+// IEnumIDList interface
+//
+// IShellFolder::EnumObjects member returns an IEnumIDList object.
+//
+//-------------------------------------------------------------------------
+
+typedef struct IEnumIDList *LPENUMIDLIST;
+
+#undef INTERFACE
+#define INTERFACE IEnumIDList
+
+DECLARE_INTERFACE_(IEnumIDList, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IEnumIDList methods ***
+ STDMETHOD(Next) (THIS_ ULONG celt,
+ LPITEMIDLIST *rgelt,
+ ULONG *pceltFetched) PURE;
+ STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
+ STDMETHOD(Reset) (THIS) PURE;
+ STDMETHOD(Clone) (THIS_ IEnumIDList **ppenum) PURE;
+};
+
+
+//-------------------------------------------------------------------------
+//
+// IShellFolder interface
+//
+//
+// [Member functions]
+//
+// IShellFolder::BindToObject(pidl, pbc, riid, ppvOut)
+// This function returns an instance of a sub-folder which is specified
+// by the IDList (pidl).
+//
+// IShellFolder::BindToStorage(pidl, pbc, riid, ppvObj)
+// This function returns a storage instance of a sub-folder which is
+// specified by the IDList (pidl). The shell never calls this member
+// function in the first release of Win95.
+//
+// IShellFolder::CompareIDs(lParam, pidl1, pidl2)
+// This function compares two IDLists and returns the result. The shell
+// explorer always passes 0 as lParam, which indicates "sort by name".
+// It should return 0 (as CODE of the scode), if two id indicates the
+// same object; negative value if pidl1 should be placed before pidl2;
+// positive value if pidl2 should be placed before pidl1.
+//
+// IShellFolder::CreateViewObject(hwndOwner, riid, ppvOut)
+// This function creates a view object of the folder itself. The view
+// object is a difference instance from the shell folder object.
+// "hwndOwner" can be used as the owner window of its dialog box or
+// menu during the lifetime of the view object.
+// instance which has only one reference count. The explorer may create
+// more than one instances of view object from one shell folder object
+// and treat them as separate instances.
+//
+// IShellFolder::GetAttributesOf(cidl, apidl, prgfInOut)
+// This function returns the attributes of specified objects in that
+// folder. "cidl" and "apidl" specifies objects. "apidl" contains only
+// simple IDLists. The explorer initializes *prgfInOut with a set of
+// flags to be evaluated. The shell folder may optimize the operation
+// by not returning unspecified flags.
+//
+// IShellFolder::GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, ppvOut)
+// This function creates a UI object to be used for specified objects.
+// The shell explorer passes either IID_IDataObject (for transfer operation)
+// or IID_IContextMenu (for context menu operation) as riid.
+//
+// IShellFolder::GetDisplayNameOf
+// This function returns the display name of the specified object.
+// If the ID contains the display name (in the locale character set),
+// it returns the offset to the name. Otherwise, it returns a pointer
+// to the display name string (UNICODE), which is allocated by the
+// task allocator, or fills in a buffer.
+//
+// IShellFolder::SetNameOf
+// This function sets the display name of the specified object.
+// If it changes the ID as well, it returns the new ID which is
+// alocated by the task allocator.
+//
+//-------------------------------------------------------------------------
+
+#undef INTERFACE
+#define INTERFACE IShellFolder
+
+// IShellFolder::GetDisplayNameOf/SetNameOf uFlags
+typedef enum tagSHGDN
+{
+ SHGDN_NORMAL = 0, // default (display purpose)
+ SHGDN_INFOLDER = 1, // displayed under a folder (relative)
+ SHGDN_FORADDRESSBAR = 0x4000, // for displaying in the address (drives dropdown) bar
+ SHGDN_FORPARSING = 0x8000, // for ParseDisplayName or path
+} SHGNO;
+
+// IShellFolder::EnumObjects
+typedef enum tagSHCONTF
+{
+ SHCONTF_FOLDERS = 32, // for shell browser
+ SHCONTF_NONFOLDERS = 64, // for default view
+ SHCONTF_INCLUDEHIDDEN = 128, // for hidden/system objects
+} SHCONTF;
+
+// IShellFolder::GetAttributesOf flags
+#define SFGAO_CANCOPY DROPEFFECT_COPY // Objects can be copied
+#define SFGAO_CANMOVE DROPEFFECT_MOVE // Objects can be moved
+#define SFGAO_CANLINK DROPEFFECT_LINK // Objects can be linked
+#define SFGAO_CANRENAME 0x00000010L // Objects can be renamed
+#define SFGAO_CANDELETE 0x00000020L // Objects can be deleted
+#define SFGAO_HASPROPSHEET 0x00000040L // Objects have property sheets
+#define SFGAO_DROPTARGET 0x00000100L // Objects are drop target
+#define SFGAO_CAPABILITYMASK 0x00000177L
+#define SFGAO_LINK 0x00010000L // Shortcut (link)
+#define SFGAO_SHARE 0x00020000L // shared
+#define SFGAO_READONLY 0x00040000L // read-only
+#define SFGAO_GHOSTED 0x00080000L // ghosted icon
+#define SFGAO_DISPLAYATTRMASK 0x000F0000L
+#define SFGAO_FILESYSANCESTOR 0x10000000L // It contains file system folder
+#define SFGAO_FOLDER 0x20000000L // It's a folder.
+#define SFGAO_FILESYSTEM 0x40000000L // is a file system thing (file/folder/root)
+#define SFGAO_HASSUBFOLDER 0x80000000L // Expandable in the map pane
+#define SFGAO_CONTENTSMASK 0x80000000L
+#define SFGAO_VALIDATE 0x01000000L // invalidate cached information
+#define SFGAO_REMOVABLE 0x02000000L // is this removeable media?
+#define SFGAO_COMPRESSED 0x04000000L // Object is compressed (use alt color)
+
+DECLARE_INTERFACE_(IShellFolder, IUnknown)
+{
+ // *** IUnknown methods ***
+ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+ // *** IShellFolder methods ***
+ STDMETHOD(ParseDisplayName) (THIS_ HWND hwndOwner,
+ LPBC pbcReserved, LPOLESTR lpszDisplayName,
+ ULONG * pchEaten, LPITEMIDLIST * ppidl, ULONG *pdwAttributes) PURE;
+
+ STDMETHOD(EnumObjects) ( THIS_ HWND hwndOwner, DWORD grfFlags, LPENUMIDLIST * ppenumIDList) PURE;
+
+ STDMETHOD(BindToObject) (THIS_ LPCITEMIDLIST pidl, LPBC pbcReserved,
+ REFIID riid, LPVOID * ppvOut) PURE;
+ STDMETHOD(BindToStorage) (THIS_ LPCITEMIDLIST pidl, LPBC pbcReserved,
+ REFIID riid, LPVOID * ppvObj) PURE;
+ STDMETHOD(CompareIDs) (THIS_ LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) PURE;
+ STDMETHOD(CreateViewObject) (THIS_ HWND hwndOwner, REFIID riid, LPVOID * ppvOut) PURE;
+ STDMETHOD(GetAttributesOf) (THIS_ UINT cidl, LPCITEMIDLIST * apidl,
+ ULONG * rgfInOut) PURE;
+ STDMETHOD(GetUIObjectOf) (THIS_ HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl,
+ REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) PURE;
+ STDMETHOD(GetDisplayNameOf) (THIS_ LPCITEMIDLIST pidl, DWORD uFlags, LPSTRRET lpName) PURE;
+ STDMETHOD(SetNameOf) (THIS_ HWND hwndOwner, LPCITEMIDLIST pidl,
+ LPCOLESTR lpszName, DWORD uFlags,
+ LPITEMIDLIST * ppidlOut) PURE;
+};
+
+typedef IShellFolder * LPSHELLFOLDER;
+
+//
+// Helper function which returns a IShellFolder interface to the desktop
+// folder. This is equivalent to call CoCreateInstance with CLSID_ShellDesktop.
+//
+// CoCreateInstance(CLSID_Desktop, NULL,
+// CLSCTX_INPROC, IID_IShellFolder, &pshf);
+//
+WINSHELLAPI HRESULT WINAPI SHGetDesktopFolder(LPSHELLFOLDER *ppshf);
+
+
+
+
+//==========================================================================
+// Clipboard format which may be supported by IDataObject from system
+// defined shell folders (such as directories, network, ...).
+//==========================================================================
+
+#define CFSTR_SHELLIDLIST TEXT("Shell IDList Array") // CF_IDLIST
+#define CFSTR_SHELLIDLISTOFFSET TEXT("Shell Object Offsets") // CF_OBJECTPOSITIONS
+#define CFSTR_NETRESOURCES TEXT("Net Resource") // CF_NETRESOURCE
+#define CFSTR_FILEDESCRIPTORA TEXT("FileGroupDescriptor") // CF_FILEGROUPDESCRIPTORA
+#define CFSTR_FILEDESCRIPTORW TEXT("FileGroupDescriptorW") // CF_FILEGROUPDESCRIPTORW
+#define CFSTR_FILECONTENTS TEXT("FileContents") // CF_FILECONTENTS
+#define CFSTR_FILENAMEA TEXT("FileName") // CF_FILENAMEA
+#define CFSTR_FILENAMEW TEXT("FileNameW") // CF_FILENAMEW
+#define CFSTR_PRINTERGROUP TEXT("PrinterFriendlyName") // CF_PRINTERS
+#define CFSTR_FILENAMEMAPA TEXT("FileNameMap") // CF_FILENAMEMAPA
+#define CFSTR_FILENAMEMAPW TEXT("FileNameMapW") // CF_FILENAMEMAPW
+#define CFSTR_PREFERREDDROPEFFECT TEXT("Preferred DropEffect")
+
+#ifdef UNICODE
+#define CFSTR_FILEDESCRIPTOR CFSTR_FILEDESCRIPTORW
+#define CFSTR_FILENAME CFSTR_FILENAMEW
+#define CFSTR_FILENAMEMAP CFSTR_FILENAMEMAPW
+#else
+#define CFSTR_FILEDESCRIPTOR CFSTR_FILEDESCRIPTORA
+#define CFSTR_FILENAME CFSTR_FILENAMEA
+#define CFSTR_FILENAMEMAP CFSTR_FILENAMEMAPA
+#endif
+
+//
+// CF_OBJECTPOSITIONS
+//
+//
+
+
+
+#define DVASPECT_SHORTNAME 2 // use for CF_HDROP to get short name version
+//
+// format of CF_NETRESOURCE
+//
+typedef struct _NRESARRAY { // anr
+ UINT cItems;
+ NETRESOURCE nr[1];
+} NRESARRAY, * LPNRESARRAY;
+
+//
+// format of CF_IDLIST
+//
+typedef struct _IDA {
+ UINT cidl; // number of relative IDList
+ UINT aoffset[1]; // [0]: folder IDList, [1]-[cidl]: item IDList
+} CIDA, * LPIDA;
+
+//
+// FILEDESCRIPTOR.dwFlags field indicate which fields are to be used
+//
+typedef enum {
+ FD_CLSID = 0x0001,
+ FD_SIZEPOINT = 0x0002,
+ FD_ATTRIBUTES = 0x0004,
+ FD_CREATETIME = 0x0008,
+ FD_ACCESSTIME = 0x0010,
+ FD_WRITESTIME = 0x0020,
+ FD_FILESIZE = 0x0040,
+ FD_LINKUI = 0x8000, // 'link' UI is prefered
+} FD_FLAGS;
+
+typedef struct _FILEDESCRIPTORA { // fod
+ DWORD dwFlags;
+
+ CLSID clsid;
+ SIZEL sizel;
+ POINTL pointl;
+
+ DWORD dwFileAttributes;
+ FILETIME ftCreationTime;
+ FILETIME ftLastAccessTime;
+ FILETIME ftLastWriteTime;
+ DWORD nFileSizeHigh;
+ DWORD nFileSizeLow;
+ CHAR cFileName[ MAX_PATH ];
+} FILEDESCRIPTORA, *LPFILEDESCRIPTORA;
+
+typedef struct _FILEDESCRIPTORW { // fod
+ DWORD dwFlags;
+
+ CLSID clsid;
+ SIZEL sizel;
+ POINTL pointl;
+
+ DWORD dwFileAttributes;
+ FILETIME ftCreationTime;
+ FILETIME ftLastAccessTime;
+ FILETIME ftLastWriteTime;
+ DWORD nFileSizeHigh;
+ DWORD nFileSizeLow;
+ WCHAR cFileName[ MAX_PATH ];
+} FILEDESCRIPTORW, *LPFILEDESCRIPTORW;
+
+#ifdef UNICODE
+#define FILEDESCRIPTOR FILEDESCRIPTORW
+#define LPFILEDESCRIPTOR LPFILEDESCRIPTORW
+#else
+#define FILEDESCRIPTOR FILEDESCRIPTORA
+#define LPFILEDESCRIPTOR LPFILEDESCRIPTORA
+#endif
+
+//
+// format of CF_FILEGROUPDESCRIPTOR
+//
+typedef struct _FILEGROUPDESCRIPTORA { // fgd
+ UINT cItems;
+ FILEDESCRIPTORA fgd[1];
+} FILEGROUPDESCRIPTORA, * LPFILEGROUPDESCRIPTORA;
+
+typedef struct _FILEGROUPDESCRIPTORW { // fgd
+ UINT cItems;
+ FILEDESCRIPTORW fgd[1];
+} FILEGROUPDESCRIPTORW, * LPFILEGROUPDESCRIPTORW;
+
+#ifdef UNICODE
+#define FILEGROUPDESCRIPTOR FILEGROUPDESCRIPTORW
+#define LPFILEGROUPDESCRIPTOR LPFILEGROUPDESCRIPTORW
+#else
+#define FILEGROUPDESCRIPTOR FILEGROUPDESCRIPTORA
+#define LPFILEGROUPDESCRIPTOR LPFILEGROUPDESCRIPTORA
+#endif
+
+//
+// format of CF_HDROP and CF_PRINTERS, in the HDROP case the data that follows
+// is a double null terinated list of file names, for printers they are printer
+// friendly names
+//
+typedef struct _DROPFILES {
+ DWORD pFiles; // offset of file list
+ POINT pt; // drop point (client coords)
+ BOOL fNC; // is it on NonClient area
+ // and pt is in screen coords
+ BOOL fWide; // WIDE character switch
+} DROPFILES, FAR * LPDROPFILES;
+
+
+//====== File System Notification APIs ===============================
+//
+
+
+
+//
+// File System Notification flags
+//
+
+
+
+#define SHCNE_RENAMEITEM 0x00000001L
+#define SHCNE_CREATE 0x00000002L
+#define SHCNE_DELETE 0x00000004L
+#define SHCNE_MKDIR 0x00000008L
+#define SHCNE_RMDIR 0x00000010L
+#define SHCNE_MEDIAINSERTED 0x00000020L
+#define SHCNE_MEDIAREMOVED 0x00000040L
+#define SHCNE_DRIVEREMOVED 0x00000080L
+#define SHCNE_DRIVEADD 0x00000100L
+#define SHCNE_NETSHARE 0x00000200L
+#define SHCNE_NETUNSHARE 0x00000400L
+#define SHCNE_ATTRIBUTES 0x00000800L
+#define SHCNE_UPDATEDIR 0x00001000L
+#define SHCNE_UPDATEITEM 0x00002000L
+#define SHCNE_SERVERDISCONNECT 0x00004000L
+#define SHCNE_UPDATEIMAGE 0x00008000L
+#define SHCNE_DRIVEADDGUI 0x00010000L
+#define SHCNE_RENAMEFOLDER 0x00020000L
+#define SHCNE_FREESPACE 0x00040000L
+#define SHCNE_EXTENDED_EVENT 0x00080000L // Extended Event.
+
+#define SHCNE_ASSOCCHANGED 0x08000000L
+
+#define SHCNE_DISKEVENTS 0x0002381FL
+#define SHCNE_GLOBALEVENTS 0x0C0D81E0L // Events that dont match pidls first
+#define SHCNE_ALLEVENTS 0x7FFFFFFFL
+#define SHCNE_INTERRUPT 0x80000000L // The presence of this flag indicates
+ // that the event was generated by an
+ // interrupt. It is stripped out before
+ // the clients of SHCNNotify_ see it.
+
+#define SHCNEE_THEMECHANGED 0x00000001L // The theme changed
+
+
+// Flags
+// uFlags & SHCNF_TYPE is an ID which indicates what dwItem1 and dwItem2 mean
+#define SHCNF_IDLIST 0x0000 // LPITEMIDLIST
+#define SHCNF_PATHA 0x0001 // path name
+#define SHCNF_PRINTERA 0x0002 // printer friendly name
+#define SHCNF_DWORD 0x0003 // DWORD
+#define SHCNF_PATHW 0x0005 // path name
+#define SHCNF_PRINTERW 0x0006 // printer friendly name
+#define SHCNF_TYPE 0x00FF
+#define SHCNF_FLUSH 0x1000
+#define SHCNF_FLUSHNOWAIT 0x2000
+
+#ifdef UNICODE
+#define SHCNF_PATH SHCNF_PATHW
+#define SHCNF_PRINTER SHCNF_PRINTERW
+#else
+#define SHCNF_PATH SHCNF_PATHA
+#define SHCNF_PRINTER SHCNF_PRINTERA
+#endif
+
+
+
+//
+// APIs
+//
+WINSHELLAPI void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags,
+ LPCVOID dwItem1, LPCVOID dwItem2);
+
+//
+// SHAddToRecentDocs
+//
+#define SHARD_PIDL 0x00000001L
+#define SHARD_PATHA 0x00000002L
+#define SHARD_PATHW 0x00000003L
+
+#ifdef UNICODE
+#define SHARD_PATH SHARD_PATHW
+#else
+#define SHARD_PATH SHARD_PATHA
+#endif
+
+WINSHELLAPI void WINAPI SHAddToRecentDocs(UINT uFlags, LPCVOID pv);
+
+
+
+
+WINSHELLAPI HRESULT WINAPI SHGetInstanceExplorer(IUnknown **ppunk);
+
+//
+// SHGetDataFromIDListA/W
+//
+#define SHGDFIL_FINDDATA 1
+#define SHGDFIL_NETRESOURCE 2
+#define SHGDFIL_DESCRIPTIONID 3
+
+#define SHDID_ROOT_REGITEM 1
+#define SHDID_FS_FILE 2
+#define SHDID_FS_DIRECTORY 3
+#define SHDID_FS_OTHER 4
+#define SHDID_COMPUTER_DRIVE35 5
+#define SHDID_COMPUTER_DRIVE525 6
+#define SHDID_COMPUTER_REMOVABLE 7
+#define SHDID_COMPUTER_FIXED 8
+#define SHDID_COMPUTER_NETDRIVE 9
+#define SHDID_COMPUTER_CDROM 10
+#define SHDID_COMPUTER_RAMDISK 11
+#define SHDID_COMPUTER_OTHER 12
+#define SHDID_NET_DOMAIN 13
+#define SHDID_NET_SERVER 14
+#define SHDID_NET_SHARE 15
+#define SHDID_NET_RESTOFNET 16
+#define SHDID_NET_OTHER 17
+
+typedef struct _SHDESCRIPTIONID {
+ DWORD dwDescriptionId;
+ CLSID clsid;
+} SHDESCRIPTIONID, *LPSHDESCRIPTIONID;
+
+WINSHELLAPI HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl,
+ int nFormat, PVOID pv, int cb);
+WINSHELLAPI HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl,
+ int nFormat, PVOID pv, int cb);
+
+#ifdef UNICODE
+#define SHGetDataFromIDList SHGetDataFromIDListW
+#else
+#define SHGetDataFromIDList SHGetDataFromIDListA
+#endif
+
+#ifdef __cplusplus
+}
+
+#endif /* __cplusplus */
+
+#ifndef RC_INVOKED
+#pragma pack()
+#endif /* !RC_INVOKED */
+
+#endif // _SHLOBJ_H_