//=========================================================================== // // Copyright (c) Microsoft Corporation 1991-1998 // // File: shlobj.h // //=========================================================================== #ifndef _SHLOBJ_H_ #pragma option push -b -a8 -pc -A- /*P_O_Push*/ #define _SHLOBJ_H_ #ifndef _WINRESRC_ #ifndef _WIN32_IE #define _WIN32_IE 0x0501 #else #if (_WIN32_IE < 0x0400) && defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0500) #error _WIN32_IE setting conflicts with _WIN32_WINNT setting #endif #endif #endif #ifndef SNDMSG #ifdef __cplusplus #define SNDMSG ::SendMessage #else #define SNDMSG SendMessage #endif #endif // ifndef SNDMSG // // Define API decoration for direct importing of DLL references. // #ifndef WINSHELLAPI #if defined(_SHELL32_) #define WINSHELLAPI #else #define WINSHELLAPI DECLSPEC_IMPORT #endif #endif // WINSHELLAPI #ifndef SHSTDAPI #if defined(_SHELL32_) #define SHSTDAPI STDAPI #define SHSTDAPI_(type) STDAPI_(type) #else #define SHSTDAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE #define SHSTDAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE #endif #endif // SHSTDAPI #ifndef SHDOCAPI #if defined(_SHDOCVW_) #define SHDOCAPI STDAPI #define SHDOCAPI_(type) STDAPI_(type) #else #define SHDOCAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE #define SHDOCAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE #endif #endif // SHDOCAPI // shell32 APIs that are also exported from shdocvw #ifndef SHSTDDOCAPI #if defined(_SHDOCVW_) || defined(_SHELL32_) #define SHSTDDOCAPI STDAPI #define SHSTDDOCAPI_(type) STDAPI_(type) #else #define SHSTDDOCAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE #define SHSTDDOCAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE #endif #endif // SHSTDDOCAPI #ifndef BROWSEUIAPI #if defined(_BROWSEUI_) #define BROWSEUIAPI STDAPI #define BROWSEUIAPI_(type) STDAPI_(type) #else #define BROWSEUIAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE #define BROWSEUIAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE #endif // defined(_BROWSEUI_) #endif // BROWSEUIAPI // shell32 APIs that are also exported from shfolder #ifndef SHFOLDERAPI #if defined(_SHFOLDER_) || defined(_SHELL32_) #define SHFOLDERAPI STDAPI #else #define SHFOLDERAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE #endif #endif #include #ifndef _PRSHT_H_ #include #endif #ifndef _INC_COMMCTRL #include // for LPTBBUTTON #endif #ifndef INITGUID #include #endif /* !INITGUID */ #ifndef RC_INVOKED #include /* 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) // //=========================================================================== SHSTDAPI 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). // hMonitor -- Specifies the default monitor (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_FINDHACK 0x00000080 #define CMF_EXTENDEDVERBS 0x00000100 // rarely used verbs #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 #if (_WIN32_IE >= 0x0501) #define CMIC_MASK_SHIFT_DOWN 0x10000000 #define CMIC_MASK_CONTROL_DOWN 0x20000000 #endif // (_WIN32_IE >= 0x501) #if (_WIN32_IE >= 0x0400) #define CMIC_MASK_PTINVOKE 0x20000000 #endif //NOTE: When SEE_MASK_HMONITOR is set, hIcon is treated as hMonitor 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) #if (_WIN32_IE >= 0x0400) POINT ptInvoke; // Point where it's invoked #endif } CMINVOKECOMMANDINFOEX, *LPCMINVOKECOMMANDINFOEX; #undef INTERFACE #define INTERFACE IContextMenu DECLARE_INTERFACE_(IContextMenu, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) 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_PTR 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 hwnd): // 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, IContextMenu) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IContextMenu methods *** STDMETHOD(QueryContextMenu)(THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) PURE; STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO lpici) PURE; STDMETHOD(GetCommandString)(THIS_ UINT_PTR idCmd, UINT uType, UINT * pwReserved, LPSTR pszName, UINT cchMax) PURE; // *** IContextMenu2 methods *** STDMETHOD(HandleMenuMsg)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE; }; typedef IContextMenu2 * LPCONTEXTMENU2; // // IContextMenu3 (IContextMenu with one new member) // // IContextMenu3::HandleMenuMsg2 // // This function is called, if the client of IContextMenu is aware of // IContextMenu3 interface and receives a menu message while // it is calling TrackPopupMenu (in the window proc of hwnd): // #undef INTERFACE #define INTERFACE IContextMenu3 DECLARE_INTERFACE_(IContextMenu3, IContextMenu2) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IContextMenu methods *** STDMETHOD(QueryContextMenu)(THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) PURE; STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO lpici) PURE; STDMETHOD(GetCommandString)(THIS_ UINT_PTR idCmd, UINT uType, UINT * pwReserved, LPSTR pszName, UINT cchMax) PURE; // *** IContextMenu2 methods *** STDMETHOD(HandleMenuMsg)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE; // *** IContextMenu3 methods *** STDMETHOD(HandleMenuMsg2)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* plResult) PURE; }; typedef IContextMenu3 * LPCONTEXTMENU3; //=========================================================================== // // 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, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IShellExtInit methods *** STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST pidlFolder, IDataObject *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, void **ppv) 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, void **ppv) 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; #if (_WIN32_IE >= 0x0400) #undef INTERFACE #define INTERFACE IPersistFolder2 DECLARE_INTERFACE_(IPersistFolder2, IPersistFolder) { // *** IUnknown methods *** STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) 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; // *** IPersistFolder2 methods *** STDMETHOD(GetCurFolder)(THIS_ LPITEMIDLIST *ppidl) PURE; }; #if (_WIN32_IE >= 0x0401) typedef IPersistFolder2 *LPPERSISTFOLDER2; #endif #endif #if (_WIN32_IE >= 0x0500) #undef INTERFACE #define INTERFACE IPersistFolder3 #define CSIDL_FLAG_PFTI_TRACKTARGET CSIDL_FLAG_DONT_VERIFY // DESCRIPTION: PERSIST_FOLDER_TARGET_INFO // This stucture is used for Folder Shortcuts which allow the shell to // have a file system folder act like another area in the name space. // One of pidlTargetFolder, szTargetParsingName, or csidl needs to // specify the destination name space. // // pidlTargetFolder: This is a full pidl to the target folder. Can be NULL in the IPersistFolder3::InitializeEx() // call but not in the GetFolderTargetInfo() return structure. // szTargetParsingName: Empty string if not specified. Ortherwise, it is the parsible name // to the target. This name can be parsed by IShellFolder:: // ParseDisplayName() from the desktop. // szNetworkProvider: Can be an empty string. If not empty, it specifies the type of network // provider that will be used when binding to the target. This is used // for performance optimizations for the WNet APIs. // dwAttributes: -1 if not known. These are the SFGAO_ flags for IShellFolder::GetAttributesOf() // csidl: This is -1 if it's not used. This can be used instead of pidlTargetFolder or // szTargetParsingName to indicate the TargetFolder. See the list of CSIDL_ folders // below. CSIDL_FLAG_PFTI_TRACKTARGET means that the IShellFolder's target folder // should change if the user changes the target of the underlying CSIDL value. // You can also pass CSIDL_FLAG_CREATE to indicate that the target folder // should be created if it does not exist. No other CSIDL_FLAG_* values are supported. typedef struct { LPITEMIDLIST pidlTargetFolder; // pidl for the folder we want to intiailize WCHAR szTargetParsingName[MAX_PATH]; // optional parsing name for the target WCHAR szNetworkProvider[MAX_PATH]; // optional network provider DWORD dwAttributes; // optional FILE_ATTRIBUTES_ flags (-1 if not used) int csidl; // optional folder index (SHGetFolderPath()) -1 if not used } PERSIST_FOLDER_TARGET_INFO; // DESCRIPTION: IPersistFolder3 // This interface is implemented by an IShellFolder object that wants non-default // handling of Folder Shortcuts. In general, shell name space extensions should use // pidlRoot (the alias pidl) as their location in the name space and pass it to public // APIs, such as ShellExecute(). The one exception is that pidlTarget should be used // when sending ChangeNotifies or registering to listen for change notifies // (see SFVM_GETNOTIFY). // // InitializeEx: This method initializes an IShellFolder and specifies where // it is rooted in the name space. // pbc: May be NULL. // pidlRoot: This is the same parameter as IPersistFolder::Initialize(). Caller allocates // and frees this parameter. // ppfti: May be NULL, in which case this is the same as a call to IPersistFolder::Initialize(). // Otherwise this is a Folder Shortcut and this struction specifies the target // folder and it's attributes. // GetFolderTargetInfo: This is used by the caller to find information about // the folder shortcut. This structure may not be initialized by the caller, // so the callee needs to initialize every member. The callee allocates // pidlTargetFolder and the caller will free it. Filling in pidlTargetFolder is // ALWAYS required. DECLARE_INTERFACE_(IPersistFolder3, IPersistFolder2) { // *** IUnknown methods *** STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) 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; // *** IPersistFolder2 methods *** STDMETHOD(GetCurFolder)(THIS_ LPITEMIDLIST *ppidl) PURE; // *** IPersistFolder3 methods *** STDMETHOD(InitializeEx)(THIS_ IBindCtx *pbc, LPCITEMIDLIST pidlRoot, const PERSIST_FOLDER_TARGET_INFO *ppfti) PURE; STDMETHOD(GetFolderTargetInfo)(THIS_ PERSIST_FOLDER_TARGET_INFO *ppfti) PURE; }; // // this interface is just the IID. return back // a pointer to the IPersist interface if the object // implementation is free threaded. this is used // for performance on free threaded objects. // #define IPersistFreeThreadedObject IPersist #endif // //=========================================================================== // // IRemoteComputer Interface // // The IRemoteComputer interface is used to initialize a name space // extension invoked on a remote computer object. // // [Member functions] // // IRemoteComputer::Initialize // // This member function is called when the explorer is initializing or // enumerating the name space extension. If failure is returned during // enumeration, the extension won't appear for this computer. Otherwise, // the extension will appear, and should target the given machine. // // Parameters: // pszMachine -- Specifies the name of the machine to target. // //=========================================================================== #undef INTERFACE #define INTERFACE IRemoteComputer DECLARE_INTERFACE_(IRemoteComputer, IUnknown) // remc { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IRemoteComputer methods *** STDMETHOD(Initialize) (THIS_ const WCHAR *pszMachine, BOOL bEnumerating) PURE; }; //=========================================================================== // // 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, void **ppv) 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, void **ppv) 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, void **ppv) 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; //=========================================================================== // // IShellIconOverlayIdentifier // // Used to identify a file as a member of the group of files that have this specific // icon overlay // // Users can create new IconOverlayIdentifiers and place them in the following registry // location together with the Icon overlay image and their priority. // HKEY_LOCAL_MACHINE "Software\\Microsoft\\Windows\\CurrentVersion\\ShellIconOverlayIdentifiers" // // The shell will enumerate through all IconOverlayIdentifiers at start, and prioritize // them according to internal rules, in case the internal rules don't apply, we use their // input priority // // IShellIconOverlayIdentifier:IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib) // pwszPath full path of the file // dwAttrib attribute of this file // // returns: // S_OK, if the file is a member // S_FALSE, if the file is not a member // E_FAIL, if the operation failed due to bad WIN32_FIND_DATA // // IShellIconOverlayIdentifier::GetOverlayInfo(LPWSTR pwszIconFile, int * pIndex, DWORD * dwFlags) PURE; // pszIconFile the path of the icon file // pIndex Depend on the flags, this could contain the IconIndex // dwFlags defined below // // IShellIconOverlayIdentifier::GetPriority(int * pIPriority) PURE; // pIPriority the priority of this Overlay Identifier // //=========================================================================== #undef INTERFACE #define INTERFACE IShellIconOverlayIdentifier DECLARE_INTERFACE_(IShellIconOverlayIdentifier, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IShellIconOverlayIdentifier methods *** STDMETHOD (IsMemberOf)(THIS_ LPCWSTR pwszPath, DWORD dwAttrib) PURE; STDMETHOD (GetOverlayInfo)(THIS_ LPWSTR pwszIconFile, int cchMax, int * pIndex, DWORD * pdwFlags) PURE; STDMETHOD (GetPriority)(THIS_ int * pIPriority) PURE; }; #define ISIOI_ICONFILE 0x00000001 // path is returned through pwszIconFile #define ISIOI_ICONINDEX 0x00000002 // icon index in pwszIconFile is returned through pIndex //=========================================================================== // // IShellIconOverlay // // Used to return the icon overlay index or its icon index for an IShellFolder object, // this is always implemented with IShellFolder // // IShellIconOverlay:GetOverlayIndex(LPCITEMIDLIST pidl, DWORD * pdwIndex) // pidl object to identify icon overlay for. // pdwIndex the Overlay Index in the system image list // // IShellIconOverlay:GetOverlayIconIndex(LPCITEMIDLIST pidl, DWORD * pdwIndex) // pdwIconIndex the Overlay Icon index in the system image list // This method is only used for those who are interested in seeing the real bits // of the Overlay Icon // // returns: // S_OK, if the index of an Overlay is found // S_FALSE, if no Overlay exists for this file // E_FAIL, if pidl is bad // //=========================================================================== #undef INTERFACE #define INTERFACE IShellIconOverlay DECLARE_INTERFACE_(IShellIconOverlay, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IShellIconOverlay methods *** STDMETHOD(GetOverlayIndex)(THIS_ LPCITEMIDLIST pidl, int * pIndex) PURE; STDMETHOD(GetOverlayIconIndex)(THIS_ LPCITEMIDLIST pidl, int * pIconIndex) PURE; }; #define OI_ASYNC 0xFFFFEEEE //------------------------------------------------------------------------- // // SHGetIconOverlayIndex // // This function takes the path and icon/res id to the icon and convert it into // an overlay index in the system image list. // Note: there are totally only 15 slots for system image overlays, some of which // was reserved by the system, or taken by the overlayidentifiers, so it's possible // that this function would fail and return -1; // // To get the default overlays in the system, such as the share hand, link shortcut // and slow files, pass NULL as the file name, then the IDO_SHGIOI_* flags as the icon index //------------------------------------------------------------------------- #define IDO_SHGIOI_SHARE 0x0FFFFFFF #define IDO_SHGIOI_LINK 0x0FFFFFFE #define IDO_SHGIOI_SLOWFILE 0x0FFFFFFFD SHSTDAPI_(int) SHGetIconOverlayIndexA(LPCSTR pszIconPath, int iIconIndex); SHSTDAPI_(int) SHGetIconOverlayIndexW(LPCWSTR pszIconPath, int iIconIndex); #ifdef UNICODE #define SHGetIconOverlayIndex SHGetIconOverlayIndexW #else #define SHGetIconOverlayIndex SHGetIconOverlayIndexA #endif // !UNICODE //=========================================================================== // // 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, // don't post any UI durring the resolve operation SLR_ANY_MATCH = 0x0002, // no longer used SLR_UPDATE = 0x0004, // save the link back to it's file if the track made it dirty SLR_NOUPDATE = 0x0008, SLR_NOSEARCH = 0x0010, // don't execute the search heuristics SLR_NOTRACK = 0x0020, // don't use NT5 object ID to track the link SLR_NOLINKINFO = 0x0040, // don't use the net and volume relative info SLR_INVOKE_MSI = 0x0080, // if we have a darwin link, then call msi to fault in the applicaion } SLR_FLAGS; // IShellLink::GetPath fFlags typedef enum { SLGP_SHORTPATH = 0x0001, SLGP_UNCPRIORITY = 0x0002, SLGP_RAWPATH = 0x0004, } SLGP_FLAGS; #undef INTERFACE #define INTERFACE IShellLinkA DECLARE_INTERFACE_(IShellLinkA, IUnknown) // sl { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IShellLink methods *** 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, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IShellLink methods *** 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; }; #if (_WIN32_IE >= 0x0400) // IShellLinkDataList::GetFlags()/SetFlags() typedef enum { SLDF_HAS_ID_LIST = 0x00000001, // Shell link saved with ID list SLDF_HAS_LINK_INFO = 0x00000002, // Shell link saved with LinkInfo SLDF_HAS_NAME = 0x00000004, SLDF_HAS_RELPATH = 0x00000008, SLDF_HAS_WORKINGDIR = 0x00000010, SLDF_HAS_ARGS = 0x00000020, SLDF_HAS_ICONLOCATION = 0x00000040, SLDF_UNICODE = 0x00000080, // the strings are unicode SLDF_FORCE_NO_LINKINFO = 0x00000100, // don't create a LINKINFO (make a dumb link) SLDF_HAS_EXP_SZ = 0x00000200, // the link contains expandable env strings SLDF_RUN_IN_SEPARATE = 0x00000400, // Run the 16-bit target exe in a separate VDM/WOW SLDF_HAS_LOGO3ID = 0x00000800, // this link is a special Logo3/MSICD link SLDF_HAS_DARWINID = 0x00001000, // this link is a special Darwin link SLDF_RUNAS_USER = 0x00002000, // Run this link as a different user SLDF_HAS_EXP_ICON_SZ = 0x00004000 // contains expandable env string for icon path } SHELL_LINK_DATA_FLAGS; // // We conditionally define it here to break the circular dependency between // shlobj and shlwapi. // #ifndef __DATABLOCKHEADER_DEFINED #define __DATABLOCKHEADER_DEFINED typedef struct tagDATABLOCKHEADER { DWORD cbSize; // Size of this extra data block DWORD dwSignature; // signature of this extra data block } DATABLOCK_HEADER, *LPDATABLOCK_HEADER, *LPDBLIST; #endif typedef struct { #ifdef __cplusplus DATABLOCK_HEADER dbh; #else DATABLOCK_HEADER; #endif WORD wFillAttribute; // fill attribute for console WORD wPopupFillAttribute; // fill attribute for console popups COORD dwScreenBufferSize; // screen buffer size for console COORD dwWindowSize; // window size for console COORD dwWindowOrigin; // window origin for console DWORD nFont; DWORD nInputBufferSize; COORD dwFontSize; UINT uFontFamily; UINT uFontWeight; WCHAR FaceName[LF_FACESIZE]; UINT uCursorSize; BOOL bFullScreen; BOOL bQuickEdit; BOOL bInsertMode; BOOL bAutoPosition; UINT uHistoryBufferSize; UINT uNumberOfHistoryBuffers; BOOL bHistoryNoDup; COLORREF ColorTable[ 16 ]; } NT_CONSOLE_PROPS, *LPNT_CONSOLE_PROPS; #define NT_CONSOLE_PROPS_SIG 0xA0000002 // This is a FE Console property typedef struct { #ifdef __cplusplus DATABLOCK_HEADER dbh; #else DATABLOCK_HEADER; #endif UINT uCodePage; } NT_FE_CONSOLE_PROPS, *LPNT_FE_CONSOLE_PROPS; #define NT_FE_CONSOLE_PROPS_SIG 0xA0000004 #if (_WIN32_IE >= 0x0500) typedef struct { #ifdef __cplusplus DATABLOCK_HEADER dbh; #else DATABLOCK_HEADER; #endif CHAR szDarwinID[MAX_PATH]; // ANSI darwin ID associated with link WCHAR szwDarwinID[MAX_PATH]; // UNICODE darwin ID associated with link } EXP_DARWIN_LINK, *LPEXP_DARWIN_LINK; #define EXP_DARWIN_ID_SIG 0xA0000006 #define EXP_LOGO3_ID_SIG 0xA0000007 #endif #define EXP_SPECIAL_FOLDER_SIG 0xA0000005 // LPEXP_SPECIAL_FOLDER typedef struct { DWORD cbSize; // Size of this extra data block DWORD dwSignature; // signature of this extra data block DWORD idSpecialFolder; // special folder id this link points into DWORD cbOffset; // ofset into pidl from SLDF_HAS_ID_LIST for child } EXP_SPECIAL_FOLDER, *LPEXP_SPECIAL_FOLDER; typedef struct { DWORD cbSize; // Size of this extra data block DWORD dwSignature; // signature of this extra data block CHAR szTarget[ MAX_PATH ]; // ANSI target name w/EXP_SZ in it WCHAR swzTarget[ MAX_PATH ]; // UNICODE target name w/EXP_SZ in it } EXP_SZ_LINK, *LPEXP_SZ_LINK; #define EXP_SZ_LINK_SIG 0xA0000001 // LPEXP_SZ_LINK (target) #define EXP_SZ_ICON_SIG 0xA0000007 // LPEXP_SZ_LINK (icon) #undef INTERFACE #define INTERFACE IShellLinkDataList DECLARE_INTERFACE_(IShellLinkDataList, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef) (THIS) PURE; STDMETHOD_(ULONG, Release) (THIS) PURE; // *** IShellLinkDataList methods *** STDMETHOD(AddDataBlock)(THIS_ void * pDataBlock) PURE; STDMETHOD(CopyDataBlock)(THIS_ DWORD dwSig, void **ppDataBlock) PURE; STDMETHOD(RemoveDataBlock)(THIS_ DWORD dwSig) PURE; STDMETHOD(GetFlags)(THIS_ DWORD *pdwFlags) PURE; STDMETHOD(SetFlags)(THIS_ DWORD dwFlags) PURE; }; #endif // (_WIN32_IE >= 0x0400) #if (_WIN32_IE >= 0x0500) #undef INTERFACE #define INTERFACE IResolveShellLink DECLARE_INTERFACE_(IResolveShellLink, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef) (THIS) PURE; STDMETHOD_(ULONG, Release) (THIS) PURE; // *** IResolveShellLink methods *** STDMETHOD(ResolveShellLink)(THIS_ IUnknown* punk, HWND hwnd, DWORD fFlags) PURE; }; #endif // (_WIN32_IE >= 0x0500) #ifdef _INC_SHELLAPI /* for LPSHELLEXECUTEINFO */ //=========================================================================== // // IShellExecuteHook Interface // //=========================================================================== #undef INTERFACE #define INTERFACE IShellExecuteHookA DECLARE_INTERFACE_(IShellExecuteHookA, IUnknown) // shexhk { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) 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, void **ppv) 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 //=========================================================================== // // IURLSearchHook Interface // //=========================================================================== #undef INTERFACE #define INTERFACE IURLSearchHook DECLARE_INTERFACE_(IURLSearchHook, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef) (THIS) PURE; STDMETHOD_(ULONG, Release) (THIS) PURE; // *** IURLSearchHook methods *** STDMETHOD(Translate)(THIS_ LPWSTR lpwszSearchURL, DWORD cchBufferSize) PURE; }; //=========================================================================== // // INewShortcutHook Interface // //=========================================================================== #undef INTERFACE #define INTERFACE INewShortcutHookA DECLARE_INTERFACE_(INewShortcutHookA, IUnknown) // nshhk { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) 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, void **ppv) 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 #define FOF_NOCOPYSECURITYATTRIBS 0x0800 // dont copy NT file Security Attributes #define FOF_NORECURSION 0x1000 // don't recurse into directories. #if (_WIN32_IE >= 0x500) #define FOF_NO_CONNECTED_ELEMENTS 0x2000 // don't operate on connected file elements. #define FOF_WANTNUKEWARNING 0x4000 // during delete operation, warn if nuking instead of recycling (partially overrides FOF_NOCONFIRMATION) #endif // _WIN32_IE >= 0x500 typedef WORD 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, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** ICopyHook methods *** 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, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** ICopyHook methods *** 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, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IFileViewerSite methods *** 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 IUnknown *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) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IFileViewer methods *** 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) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IFileViewer methods *** 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 //========================================================================== // // 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) // for Win9x compat #define FCIDM_MENU_TOOLS_SEP_GOTO (FCIDM_GLOBALFIRST+0x00c1) // for Win9x compat #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) #if (_WIN32_IE >= 0x0400) //-------------------------------------------------------------------------- // // The resource id of the offline cursor // This cursor is avaialble in shdocvw.dll #define IDC_OFFLINE_HAND 103 // //-------------------------------------------------------------------------- #endif //-------------------------------------------------------------------------- // // 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_NOICONS = 0x1000, FWF_SHOWSELALWAYS = 0x2000, FWF_NOVISIBLE = 0X4000, 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(pszStatusText) // // 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) // SBSP_NAVIGATEBACK -- Navigate back (ignores the pidl) // SBSP_NAVIGATEFORWARD -- Navigate forward (ignores the pidl) // // Following two flags control history manipulation as result of navigate // SBSP_WRITENOHISTORY -- write no history (shell folder) entry // SBSP_NOAUTOSELECT -- suppress selection in history pane // // 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 IStream *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. // //------------------------------------------------------------------------- // // 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_HELPMODE 0x0040 // IEUNIX : Help window uses this. #define SBSP_NOTRANSFERHIST 0x0080 // IEUNIX only mode. #define SBSP_ABSOLUTE 0x0000 #define SBSP_RELATIVE 0x1000 #define SBSP_PARENT 0x2000 #define SBSP_NAVIGATEBACK 0x4000 #define SBSP_NAVIGATEFORWARD 0x8000 #define SBSP_ALLOW_AUTONAVIGATE 0x10000 #define SBSP_INITIATEDBYHLINKFRAME 0x80000000 #define SBSP_REDIRECT 0x40000000 #define SBSP_WRITENOHISTORY 0x08000000 #define SBSP_NOAUTOSELECT 0x04000000 // // 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 #define FCW_INTERNETBAR 0x0006 #define FCW_PROGRESS 0x0008 #if (_WIN32_IE >= 0x0400) #endif // // Values for uFlags paremeter of ISB::SetToolbarItems member. // #define FCT_MERGE 0x0001 #define FCT_CONFIGABLE 0x0002 #define FCT_ADDTOEND 0x0004 #undef INTERFACE #define INTERFACE IShellBrowser DECLARE_INTERFACE_(IShellBrowser, IOleWindow) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) 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 holemenuRes, HWND hwndActiveObject) PURE; STDMETHOD(RemoveMenusSB) (THIS_ HMENU hmenuShared) PURE; STDMETHOD(SetStatusTextSB) (THIS_ LPCOLESTR pszStatusText) PURE; STDMETHOD(EnableModelessSB) (THIS_ BOOL fEnable) PURE; STDMETHOD(TranslateAcceleratorSB) (THIS_ MSG *pmsg, WORD wID) PURE; // *** IShellBrowser methods *** STDMETHOD(BrowseObject)(THIS_ LPCITEMIDLIST pidl, UINT wFlags) PURE; STDMETHOD(GetViewStateStream)(THIS_ DWORD grfMode, IStream **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; }; #define __IShellBrowser_INTERFACE_DEFINED__ typedef IShellBrowser * LPSHELLBROWSER; enum { SBSC_HIDE = 0, SBSC_SHOW = 1, SBSC_TOGGLE = 2, SBSC_QUERY = 3 }; enum { SBO_DEFAULT = 0 , SBO_NOBROWSERPAGES = 1 }; //------------------------------------------------------------------------- // 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 // //------------------------------------------------------------------------- #define CDBOSC_SETFOCUS 0x00000000 #define CDBOSC_KILLFOCUS 0x00000001 #define CDBOSC_SELCHANGE 0x00000002 #define CDBOSC_RENAME 0x00000003 #undef INTERFACE #define INTERFACE ICommDlgBrowser DECLARE_INTERFACE_(ICommDlgBrowser, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) 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; //------------------------------------------------------------------------- // ICommDlgBrowser2 interface // // Member functions: // // ICommDlgBrowser2::Notify(IShellView *pshv, DWORD dwNotfyType) // Called when the view is wants to notify common dialog when an event // occurrs. // // CDB2N_CONTEXTMENU_START indicates the context menu has started. // CDB2N_CONTEXTMENU_DONE indicates the context menu has completed. // // ICommDlgBrowser2::GetDefaultMenuText(IShellView *pshv, // WCHAR *pszText, INT cchMax) // Called when the view wants to get the default context menu text. // pszText points to buffer and cchMax specifies the size of the // buffer in characters. The browser on return has filled the buffer // with the default context menu text. The Shell will call this method // with at least a buffer size of MAX_PATH. The browser should return // S_OK if it returned a new default menu text, S_FALSE to let the view // to use the normal default menu text. // // ICommDlgBrowser2::GetViewFlags(DWORD *pdwFlags) // Called when the view wants to determine if special customization needs to // be done for the common dialog browser. For example View calls this function to // determin if all files(hidden and system)needs to be shown. If the GetViewFlags returns a DWORD with // CDB2GVF_SHOWALLFILES flag set then it will show all the files. //------------------------------------------------------------------------- #define CDB2N_CONTEXTMENU_DONE 0x00000001 #define CDB2N_CONTEXTMENU_START 0x00000002 //GetViewFlags #define CDB2GVF_SHOWALLFILES 0x00000001 #undef INTERFACE #define INTERFACE ICommDlgBrowser2 DECLARE_INTERFACE_(ICommDlgBrowser2, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) 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; // *** ICommDlgBrowser2 methods *** STDMETHOD(Notify) (THIS_ struct IShellView * ppshv, DWORD dwNotifyType) PURE; STDMETHOD(GetDefaultMenuText) (THIS_ struct IShellView * ppshv, WCHAR *pszText, INT cchMax) PURE; STDMETHOD(GetViewFlags)(THIS_ DWORD *pdwFlags) PURE; }; typedef ICommDlgBrowser2 * LPCOMMDLGBROWSER2; //========================================================================== // // 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. // // One of the ACTIVATE / INPLACEACTIVATE messages will be sent when // the view window becomes the currently displayed view. On Win95 systems, // this will happen immediately after the CreateViewWindow call. On IE4, Win98, // and NT5 systems this may happen when the view reports it is ready (if the // IShellView supports async creation). This can be used as a hint as to when // to make your view window visible. Note: the Win95/Win98/NT4 common dialogs // do not send either of these on creation. // // // 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. // //------------------------------------------------------------------------- // // 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 #define SVSI_TRANSLATEPT 0x0020 // // 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; #undef INTERFACE #define INTERFACE IShellView DECLARE_INTERFACE_(IShellView, IOleWindow) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) 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, void **ppv) PURE; }; typedef IShellView *LPSHELLVIEW; typedef GUID SHELLVIEWID; #define SV2GV_CURRENTVIEW ((UINT)-1) #define SV2GV_DEFAULTVIEW ((UINT)-2) #ifndef RC_INVOKED #include #endif /* !RC_INVOKED */ 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, void **ppv) 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, void **ppv) PURE; // *** IShellView2 methods *** STDMETHOD(GetView)(THIS_ SHELLVIEWID* pvid, ULONG uView) PURE; STDMETHOD(CreateViewWindow2)(THIS_ LPSV2CVW2_PARAMS lpParams) PURE; STDMETHOD(HandleRename)(THIS_ LPCITEMIDLIST pidlNew) PURE; STDMETHOD(SelectAndPositionItem) (THIS_ LPCITEMIDLIST pidlItem, UINT uFlags,POINT* point) 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 #ifdef NONAMELESSUNION #define NAMELESS_MEMBER(member) DUMMYUNIONNAME.##member #else #define NAMELESS_MEMBER(member) member #endif 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; #ifndef RC_INVOKED #include /* Assume byte packing throughout */ #endif /* !RC_INVOKED */ //------------------------------------------------------------------------- // // SHGetPathFromIDList // // This function assumes the size of the buffer (MAX_PATH). The pidl // should point to a file system object. // //------------------------------------------------------------------------- SHSTDAPI_(BOOL) SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath); SHSTDAPI_(BOOL) SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath); #ifdef UNICODE #define SHGetPathFromIDList SHGetPathFromIDListW #else #define SHGetPathFromIDList SHGetPathFromIDListA #endif // !UNICODE SHSTDAPI_(int) SHCreateDirectoryExA(HWND hwnd, LPCSTR pszPath, SECURITY_ATTRIBUTES *psa); SHSTDAPI_(int) SHCreateDirectoryExW(HWND hwnd, LPCWSTR pszPath, SECURITY_ATTRIBUTES *psa); #ifdef UNICODE #define SHCreateDirectoryEx SHCreateDirectoryExW #else #define SHCreateDirectoryEx SHCreateDirectoryExA #endif // !UNICODE //------------------------------------------------------------------------- // // SHGetSpecialFolderLocation // // Caller should use SHGetMalloc to obtain an allocator that can free the 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_INTERNET 0x0001 // Internet Explorer (icon on desktop) #define CSIDL_PROGRAMS 0x0002 // Start Menu\Programs #define CSIDL_CONTROLS 0x0003 // My Computer\Control Panel #define CSIDL_PRINTERS 0x0004 // My Computer\Printers #define CSIDL_PERSONAL 0x0005 // My Documents #define CSIDL_FAVORITES 0x0006 // \Favorites #define CSIDL_STARTUP 0x0007 // Start Menu\Programs\Startup #define CSIDL_RECENT 0x0008 // \Recent #define CSIDL_SENDTO 0x0009 // \SendTo #define CSIDL_BITBUCKET 0x000a // \Recycle Bin #define CSIDL_STARTMENU 0x000b // \Start Menu #define CSIDL_DESKTOPDIRECTORY 0x0010 // \Desktop #define CSIDL_DRIVES 0x0011 // My Computer #define CSIDL_NETWORK 0x0012 // Network Neighborhood #define CSIDL_NETHOOD 0x0013 // \nethood #define CSIDL_FONTS 0x0014 // windows\fonts #define CSIDL_TEMPLATES 0x0015 #define CSIDL_COMMON_STARTMENU 0x0016 // All Users\Start Menu #define CSIDL_COMMON_PROGRAMS 0X0017 // All Users\Programs #define CSIDL_COMMON_STARTUP 0x0018 // All Users\Startup #define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019 // All Users\Desktop #define CSIDL_APPDATA 0x001a // \Application Data #define CSIDL_PRINTHOOD 0x001b // \PrintHood #define CSIDL_LOCAL_APPDATA 0x001c // \Local Settings\Applicaiton Data (non roaming) #define CSIDL_ALTSTARTUP 0x001d // non localized startup #define CSIDL_COMMON_ALTSTARTUP 0x001e // non localized common startup #define CSIDL_COMMON_FAVORITES 0x001f #define CSIDL_INTERNET_CACHE 0x0020 #define CSIDL_COOKIES 0x0021 #define CSIDL_HISTORY 0x0022 #define CSIDL_COMMON_APPDATA 0x0023 // All Users\Application Data #define CSIDL_WINDOWS 0x0024 // GetWindowsDirectory() #define CSIDL_SYSTEM 0x0025 // GetSystemDirectory() #define CSIDL_PROGRAM_FILES 0x0026 // C:\Program Files #define CSIDL_MYPICTURES 0x0027 // C:\Program Files\My Pictures #define CSIDL_PROFILE 0x0028 // USERPROFILE #define CSIDL_SYSTEMX86 0x0029 // x86 system directory on RISC #define CSIDL_PROGRAM_FILESX86 0x002a // x86 C:\Program Files on RISC #define CSIDL_PROGRAM_FILES_COMMON 0x002b // C:\Program Files\Common #define CSIDL_PROGRAM_FILES_COMMONX86 0x002c // x86 Program Files\Common on RISC #define CSIDL_COMMON_TEMPLATES 0x002d // All Users\Templates #define CSIDL_COMMON_DOCUMENTS 0x002e // All Users\Documents #define CSIDL_COMMON_ADMINTOOLS 0x002f // All Users\Start Menu\Programs\Administrative Tools #define CSIDL_ADMINTOOLS 0x0030 // \Start Menu\Programs\Administrative Tools #define CSIDL_CONNECTIONS 0x0031 // Network and Dial-up Connections #define CSIDL_FLAG_CREATE 0x8000 // combine with CSIDL_ value to force folder creation in SHGetFolderPath() #define CSIDL_FLAG_DONT_VERIFY 0x4000 // combine with CSIDL_ value to return an unverified folder path #define CSIDL_FLAG_MASK 0xFF00 // mask for all possible flag values SHSTDAPI SHGetSpecialFolderLocation(HWND hwnd, int csidl, LPITEMIDLIST *ppidl); #if (_WIN32_IE >= 0x0400) SHSTDAPI_(BOOL) SHGetSpecialFolderPathA(HWND hwnd, LPSTR pszPath, int csidl, BOOL fCreate); SHSTDAPI_(BOOL) SHGetSpecialFolderPathW(HWND hwnd, LPWSTR pszPath, int csidl, BOOL fCreate); #ifdef UNICODE #define SHGetSpecialFolderPath SHGetSpecialFolderPathW #else #define SHGetSpecialFolderPath SHGetSpecialFolderPathA #endif // !UNICODE #if (_WIN32_IE >= 0x0500) typedef enum { SHGFP_TYPE_CURRENT = 0, // current value for user, verify it exists SHGFP_TYPE_DEFAULT = 1, // default value, may not exist } SHGFP_TYPE; SHFOLDERAPI SHGetFolderPathA(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPSTR pszPath); SHFOLDERAPI SHGetFolderPathW(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath); #ifdef UNICODE #define SHGetFolderPath SHGetFolderPathW #else #define SHGetFolderPath SHGetFolderPathA #endif // !UNICODE SHSTDAPI SHGetFolderLocation(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPITEMIDLIST *ppidl); #endif // _WIN32_IE >= 0x0500 #endif // _WIN32_IE >= 0x0400 //------------------------------------------------------------------------- // // 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 // Top of the dialog has 2 lines of text for BROWSEINFO.lpszTitle and one line if // this flag is set. Passing the message BFFM_SETSTATUSTEXTA to the hwnd can set the // rest of the text. This is not used with BIF_USENEWUI and BROWSEINFO.lpszTitle gets // all three lines of text. #define BIF_RETURNFSANCESTORS 0x0008 #define BIF_EDITBOX 0x0010 // Add an editbox to the dialog #define BIF_VALIDATE 0x0020 // insist on valid result (or CANCEL) #define BIF_NEWDIALOGSTYLE 0x0040 // Use the new dialog layout with the ability to resize // Caller needs to call OleInitialize() before using this API #define BIF_USENEWUI (BIF_NEWDIALOGSTYLE | BIF_EDITBOX) #define BIF_BROWSEINCLUDEURLS 0x0080 // Allow URLs to be displayed or entered. (Requires BIF_USENEWUI) #define BIF_BROWSEFORCOMPUTER 0x1000 // Browsing for Computers. #define BIF_BROWSEFORPRINTER 0x2000 // Browsing for Printers #define BIF_BROWSEINCLUDEFILES 0x4000 // Browsing for Everything #define BIF_SHAREABLE 0x8000 // sharable resources displayed (remote shares, requires BIF_USENEWUI) // message from browser #define BFFM_INITIALIZED 1 #define BFFM_SELCHANGED 2 #define BFFM_VALIDATEFAILEDA 3 // lParam:szPath ret:1(cont),0(EndDialog) #define BFFM_VALIDATEFAILEDW 4 // lParam:wzPath ret:1(cont),0(EndDialog) // 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) SHSTDAPI_(LPITEMIDLIST) SHBrowseForFolderA(LPBROWSEINFOA lpbi); SHSTDAPI_(LPITEMIDLIST) SHBrowseForFolderW(LPBROWSEINFOW lpbi); #ifdef UNICODE #define SHBrowseForFolder SHBrowseForFolderW #define BFFM_SETSTATUSTEXT BFFM_SETSTATUSTEXTW #define BFFM_SETSELECTION BFFM_SETSELECTIONW #define BFFM_VALIDATEFAILED BFFM_VALIDATEFAILEDW #else #define SHBrowseForFolder SHBrowseForFolderA #define BFFM_SETSTATUSTEXT BFFM_SETSTATUSTEXTA #define BFFM_SETSELECTION BFFM_SETSELECTIONA #define BFFM_VALIDATEFAILED BFFM_VALIDATEFAILEDA #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. // //------------------------------------------------------------------------- SHSTDAPI 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, void **ppv) 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, ppv) // This function returns an instance of a sub-folder which is specified // by the IDList (pidl). // // IShellFolder::BindToStorage(pidl, pbc, riid, ppv) // 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, ppv) // 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, ppv) // 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. // //------------------------------------------------------------------------- // IShellFolder::GetDisplayNameOf/SetNameOf uFlags typedef enum tagSHGDN { SHGDN_NORMAL = 0x0000, // default (display purpose) SHGDN_INFOLDER = 0x0001, // displayed under a folder (relative) SHGDN_FOREDITING = 0x1000, // for in-place editing SHGDN_FORADDRESSBAR = 0x4000, // UI friendly parsing name (remove ugly stuff) SHGDN_FORPARSING = 0x8000, // parsing name for ParseDisplayName() } SHGNO; // IShellFolder::EnumObjects grfFlags bits typedef enum tagSHCONTF { SHCONTF_FOLDERS = 0x0020, // only want folders enumerated (SHGAO_FOLDER) SHCONTF_NONFOLDERS = 0x0040, // include non folders SHCONTF_INCLUDEHIDDEN = 0x0080, // show items normally hidden SHCONTF_INIT_ON_FIRST_NEXT = 0x0100, // allow EnumObject() to return before validating enum SHCONTF_NETPRINTERSRCH = 0x0200, // hint that client is looking for printers SHCONTF_SHAREABLE = 0x0400, // hint that client is looking sharable resources (remote shares) } SHCONTF; // IShellFolder::CompareIDs lParam flags #define SHCIDS_ALLFIELDS 0x80000000L #define SHCIDS_COLUMNMASK 0x0000FFFFL // IShellFolder::GetAttributesOf flags // DESCRIPTION: // SFGAO_CANLINK: If this bit is set on an item in the shell folder, a // "Create Shortcut" menu item will be added to the File // menu and context menus for the item. If the user selects // that command, your IContextMenu::InvokeCommand() will be called // with 'link'. // That flag will also be used to determine if "Create Shortcut" // should be added when the item in your folder is dragged to another // folder. #define SFGAO_CANCOPY DROPEFFECT_COPY // Objects can be copied (0x1) #define SFGAO_CANMOVE DROPEFFECT_MOVE // Objects can be moved (0x2) #define SFGAO_CANLINK DROPEFFECT_LINK // Objects can be linked (0x4) #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_HIDDEN 0x00080000L // hidden object #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) #define SFGAO_BROWSABLE 0x08000000L // is in-place browsable #define SFGAO_NONENUMERATED 0x00100000L // is a non-enumerated object #define SFGAO_NEWCONTENT 0x00200000L // should show bold in explorer tree #define SFGAO_CANMONIKER 0x00400000L // can create monikers for its objects // IShellFolder IBindCtx* parameters. the IUnknown for these are // accessed through IBindCtx::RegisterObjectParam/GetObjectParam // this object will support IPersist to query a CLSID that should be skipped // in the binding process. this is to avoid loops or to allow delegation to // base name space functionality. see SHSkipJunction() #define STR_SKIP_BINDING_CLSID L"Skip Binding CLSID" #undef INTERFACE #define INTERFACE IShellFolder DECLARE_INTERFACE_(IShellFolder, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IShellFolder methods *** STDMETHOD(ParseDisplayName)(THIS_ HWND hwnd, LPBC pbc, LPOLESTR pszDisplayName, ULONG *pchEaten, LPITEMIDLIST *ppidl, ULONG *pdwAttributes) PURE; STDMETHOD(EnumObjects)(THIS_ HWND hwnd, DWORD grfFlags, IEnumIDList **ppenumIDList) PURE; STDMETHOD(BindToObject)(THIS_ LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, void **ppv) PURE; STDMETHOD(BindToStorage)(THIS_ LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, void **ppv) PURE; STDMETHOD(CompareIDs)(THIS_ LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) PURE; STDMETHOD(CreateViewObject)(THIS_ HWND hwndOwner, REFIID riid, void **ppv) PURE; STDMETHOD(GetAttributesOf)(THIS_ UINT cidl, LPCITEMIDLIST * apidl, ULONG * rgfInOut) PURE; STDMETHOD(GetUIObjectOf)(THIS_ HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, void **ppv) PURE; STDMETHOD(GetDisplayNameOf)(THIS_ LPCITEMIDLIST pidl, DWORD uFlags, LPSTRRET lpName) PURE; STDMETHOD(SetNameOf)(THIS_ HWND hwnd, LPCITEMIDLIST pidl, LPCOLESTR pszName, 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); // SHSTDAPI SHGetDesktopFolder(IShellFolder **ppshf); // IShellFolder IBindCtx* parameters. the IUnknown for these are // accessed through IBindCtx::RegisterObjectParam/GetObjectParam // use this to provide the data needed create IDLists through // IShellFolder::ParseDisplayName(). this data applies to the last element // of the name that is parsed (c:\foo\bar.txt, data applies to bar.txt) // this makes creating these IDLists much faster that suppling the name only #define STR_FILE_SYS_BIND_DATA L"File System Bind Data" #undef INTERFACE #define INTERFACE IFileSystemBindData DECLARE_INTERFACE_(IFileSystemBindData, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IFileSystemBindData methods *** STDMETHOD(SetFindData)(THIS_ const WIN32_FIND_DATAW *pfd) PURE; STDMETHOD(GetFindData)(THIS_ WIN32_FIND_DATAW *pfd) PURE; }; typedef struct _SHELLDETAILS { int fmt; // LVCFMT_* value (header only) int cxChar; // Number of "average" characters (header only) STRRET str; // String information } SHELLDETAILS, *LPSHELLDETAILS; #undef INTERFACE #define INTERFACE IShellDetails DECLARE_INTERFACE_(IShellDetails, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IShellDetails methods *** STDMETHOD(GetDetailsOf)(THIS_ LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *pDetails) PURE; STDMETHOD(ColumnClick)(THIS_ UINT iColumn) PURE; }; #if (_WIN32_IE >= 0x0500) //------------------------------------------------------------------------- // // IEnumExtraSearch interface // // IShellFolder2::EnumSearches member returns an IEnumExtraSearch object. // //------------------------------------------------------------------------- typedef struct tagEXTRASEARCH { GUID guidSearch; WCHAR wszFriendlyName[80]; WCHAR wszUrl[2084]; }EXTRASEARCH, *LPEXTRASEARCH; typedef struct IEnumExtraSearch *LPENUMEXTRASEARCH; #undef INTERFACE #define INTERFACE IEnumExtraSearch DECLARE_INTERFACE_(IEnumExtraSearch, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IEnumExtraSearch methods *** STDMETHOD(Next) (THIS_ ULONG celt, EXTRASEARCH *rgelt, ULONG *pceltFetched) PURE; STDMETHOD(Skip) (THIS_ ULONG celt) PURE; STDMETHOD(Reset) (THIS) PURE; STDMETHOD(Clone) (THIS_ IEnumExtraSearch **ppenum) PURE; }; //-------------------------------------------------------------------------- // IShellFolder2 // // [member functions] // // IShellFolder2::GetDefaultSearchGUID(LPGUID pGuid) // Returns the guid of the search that is to be invoked when user clicks // on the search toolbar button // // IShellFolder2::EnumSearches(IEnumExtraSearch **ppenum) // gives an enumerator of the searches to be added to the search menu //-------------------------------------------------------------------------- // IShellFolder2::GetDefaultColumnState values typedef enum { SHCOLSTATE_TYPE_STR = 0x00000001, SHCOLSTATE_TYPE_INT = 0x00000002, SHCOLSTATE_TYPE_DATE = 0x00000003, SHCOLSTATE_TYPEMASK = 0x0000000F, SHCOLSTATE_ONBYDEFAULT = 0x00000010, // should on by default in details view SHCOLSTATE_SLOW = 0x00000020, // will be slow to compute, do on a background thread SHCOLSTATE_EXTENDED = 0x00000040, // provided by a handler, not the folder SHCOLSTATE_SECONDARYUI = 0x00000080, // not displayed in context menu, but listed in the "More..." dialog SHCOLSTATE_HIDDEN = 0x00000100, // not displayed in the UI } SHCOLSTATE; typedef struct { GUID fmtid; DWORD pid; } SHCOLUMNID, *LPSHCOLUMNID; typedef const SHCOLUMNID* LPCSHCOLUMNID; #undef INTERFACE #define INTERFACE IShellFolder2 DECLARE_INTERFACE_(IShellFolder2, IShellFolder) { // *** IUnknown methods *** STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef)(THIS) PURE; STDMETHOD_(ULONG,Release)(THIS) PURE; // *** IShellFolder methods *** STDMETHOD(ParseDisplayName)(THIS_ HWND hwnd, LPBC pbc, LPOLESTR pszDisplayName, ULONG *pchEaten, LPITEMIDLIST *ppidl, ULONG *pdwAttributes) PURE; STDMETHOD(EnumObjects)(THIS_ HWND hwnd, DWORD grfFlags, IEnumIDList **ppenumIDList) PURE; STDMETHOD(BindToObject)(THIS_ LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, void **ppv) PURE; STDMETHOD(BindToStorage)(THIS_ LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, void **ppv) PURE; STDMETHOD(CompareIDs)(THIS_ LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) PURE; STDMETHOD(CreateViewObject)(THIS_ HWND hwnd, REFIID riid, void **ppv) PURE; STDMETHOD(GetAttributesOf)(THIS_ UINT cidl, LPCITEMIDLIST * apidl, ULONG * drgfInOut) PURE; STDMETHOD(GetUIObjectOf)(THIS_ HWND hwnd, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, void **ppv) PURE; STDMETHOD(GetDisplayNameOf)(THIS_ LPCITEMIDLIST pidl, DWORD uFlags, STRRET *psr) PURE; STDMETHOD(SetNameOf)(THIS_ HWND hwnd, LPCITEMIDLIST pidl, LPCOLESTR pszName, DWORD uFlags, LPITEMIDLIST *ppidl) PURE; // *** IShellFolder2 methods *** STDMETHOD(GetDefaultSearchGUID)(THIS_ GUID *pguid) PURE; STDMETHOD(EnumSearches)(THIS_ IEnumExtraSearch **ppenum) PURE; STDMETHOD(GetDefaultColumn) (THIS_ DWORD dwRes, ULONG *pSort, ULONG *pDisplay) PURE; STDMETHOD(GetDefaultColumnState)(THIS_ UINT iColumn, DWORD *pcsFlags) PURE; STDMETHOD(GetDetailsEx)(THIS_ LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv) PURE; STDMETHOD(GetDetailsOf)(THIS_ LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd) PURE; STDMETHOD(MapColumnToSCID)(THIS_ UINT iColumn, SHCOLUMNID *pscid) PURE; }; #endif //------------------------------------------------------------------------- // // ITaskbarList interface // // // [Member functions] // // ITaskbarList::HrInit() // This function must be called first to validate use of other members. // // ITaskbarList::AddTab(hwnd) // This function adds a tab for hwnd to the taskbar. // // ITaskbarList::DeleteTab(hwnd) // This function deletes a tab for hwnd from the taskbar. // // ITaskbarList::ActivateTab(hwnd) // This function activates the tab associated with hwnd on the taskbar. // // ITaskbarList::SetActivateAlt(hwnd) // This function marks hwnd in the taskbar as the active tab // //------------------------------------------------------------------------- #undef INTERFACE #define INTERFACE ITaskbarList DECLARE_INTERFACE_(ITaskbarList, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef) (THIS) PURE; STDMETHOD_(ULONG, Release) (THIS) PURE; // *** ITaskbarList specific methods *** STDMETHOD(HrInit) (THIS) PURE; STDMETHOD(AddTab) (THIS_ HWND hwnd) PURE; STDMETHOD(DeleteTab) (THIS_ HWND hwnd) PURE; STDMETHOD(ActivateTab) (THIS_ HWND hwnd) PURE; STDMETHOD(SetActiveAlt) (THIS_ HWND hwnd) PURE; }; //------------------------------------------------------------------------- // // IObjMgr interface // // // [Member functions] // // IObjMgr::Append(punk) // This function adds an object to the end of a list of objects. // // IObjMgr::Remove(punk) // This function removes an object from a list of objects. // // This is implemented by CLSID_ACLMulti so each AutoComplete List // (CLSID_ACLHistory, CLSID_ACListISF, CLSID_ACLMRU) can be added. // CLSID_ACLMulti's IEnumString will then be the union of the results // from the COM Objects added. //------------------------------------------------------------------------- #undef INTERFACE #define INTERFACE IObjMgr DECLARE_INTERFACE_(IObjMgr, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef) (THIS) PURE; STDMETHOD_(ULONG, Release) (THIS) PURE; // *** IObjMgr specific methods *** STDMETHOD(Append) (THIS_ IUnknown *punk) PURE; STDMETHOD(Remove) (THIS_ IUnknown *punk) PURE; }; //------------------------------------------------------------------------- // // ICurrentWorkingDirectory interface // // // [Member functions] // // ICurrentWorkingDirectory::GetDirectory(LPWSTR pwzPath, DWORD cchSize) // This function gets the Current Working Directory from a COM object that // stores such state. // // ICurrentWorkingDirectory::SetDirectory(LPCWSTR pwzPath) // This function sets the Current Working Directory of a COM object that // stores such state. // // This function can be used generically. One COM object that implements it // is CLSID_ACListISF so that the AutoComplete engine can complete relative // paths. SetDirectory() will set the "Current Working Directory" and // AutoComplete with then complete both absolute and relative paths. // For Example, if ::SetDirectory(L"C:\Program Files") is called, then // the user can AutoComplete "..\winnt". In order to set the current // working directory for non-file system paths, "ftp://ftp.microsoft.com/" or // "Control Panel" for example, use IPersistFolder. //------------------------------------------------------------------------- #undef INTERFACE #define INTERFACE ICurrentWorkingDirectory DECLARE_INTERFACE_(ICurrentWorkingDirectory, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef) (THIS) PURE; STDMETHOD_(ULONG, Release) (THIS) PURE; // *** ICurrentWorkingDirectory specific methods *** STDMETHOD(GetDirectory) (THIS_ LPWSTR pwzPath, DWORD cchSize) PURE; STDMETHOD(SetDirectory) (THIS_ LPCWSTR pwzPath) PURE; }; //------------------------------------------------------------------------- // // IACList interface // // // [Member functions] // // IObjMgr::Expand(LPCOLESTR) // This function tells an autocomplete list to expand a specific string. // // If the user enters a multi-level path, AutoComplete (CLSID_AutoComplete) // will use this interface to tell the "AutoComplete Lists" where to expand // the results. // // For Example, if the user enters "C:\Program Files\Micros", AutoComplete // first completely enumerate the "AutoComplete Lists" via IEnumString. Then it // will call the "AutoComplete Lists" with IACList::Expand(L"C:\Program Files"). // It will then enumerate the IEnumString interface again to get results in // that directory. //------------------------------------------------------------------------- #undef INTERFACE #define INTERFACE IACList DECLARE_INTERFACE_(IACList, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef) (THIS) PURE; STDMETHOD_(ULONG, Release) (THIS) PURE; // *** IACList specific methods *** STDMETHOD(Expand) (THIS_ LPCOLESTR pszExpand) PURE; }; //------------------------------------------------------------------------- // // IACList2 interface // // [Description] // This interface exists to allow the caller to set filter criteria // for an AutoComplete List. AutoComplete Lists generates the list of // possible AutoComplete completions. CLSID_ACListISF is one AutoComplete // List COM object that implements this interface. //------------------------------------------------------------------------- #undef INTERFACE #define INTERFACE IACList2 typedef enum _tagAUTOCOMPLETELISTOPTIONS { ACLO_NONE = 0, // don't enumerate anything ACLO_CURRENTDIR = 1, // enumerate current directory ACLO_MYCOMPUTER = 2, // enumerate MyComputer ACLO_DESKTOP = 4, // enumerate Desktop Folder ACLO_FAVORITES = 8, // enumerate Favorites Folder ACLO_FILESYSONLY = 16, // enumerate only the file system } AUTOCOMPLETELISTOPTIONS; DECLARE_INTERFACE_(IACList2, IACList) { // *** IACList2 specific methods *** STDMETHOD(SetOptions)(THIS_ DWORD dwFlag) PURE; STDMETHOD(GetOptions)(THIS_ DWORD* pdwFlag) PURE; }; /*-------------------------------------------------------------------------*\ INTERFACE: IProgressDialog DESCRIPTION: CLSID_ProgressDialog/IProgressDialog exist to allow a caller to create a progress dialog, set it's title, animation, text lines, progress, and it will do all the work of updating on a background thread, being modless, handling the user cancelling the operation, and estimating the time remaining until the operation completes. USAGE: This is how the dialog is used during operations that require progress and the ability to cancel: { DWORD dwComplete, dwTotal; IProgressDialog * ppd; CoCreateInstance(CLSID_ProgressDialog, NULL, CLSCTX_INPROC_SERVER, IID_IProgressDialog, (void **)&ppd); ppd->SetTitle(L"My Slow Operation"); // Set the title of the dialog. ppd->SetAnimation(hInstApp, IDA_OPERATION_ANIMATION); // Set the animation to play. ppd->StartProgressDialog(hwndParent, punk, PROGDLG_AUTOTIME, NULL); // Display and enable automatic estimated time remaining. ppd->SetCancelMsg(L"Please wait while the current operation is cleaned up", NULL); // Will only be displayed if Cancel button is pressed. dwComplete = 0; dwTotal = CalcTotalUnitsToDo(); // Reset because CalcTotalUnitsToDo() took a long time and the estimated time // is based on the time between ::StartProgressDialog() and the first // ::SetProgress() call. ppd->Timer(PDTIMER_RESET, NULL); for (nIndex = 0; nIndex < nTotal; nIndex++) { if (TRUE == ppd->HasUserCancelled()) break; ppd->SetLine(2, L"I'm processing item n", FALSE, NULL); dwComplete += DoSlowOperation(); ppd->SetProgress(dwCompleted, dwTotal); } ppd->StopProgressDialog(); ppd->Release(); } \*-------------------------------------------------------------------------*/ // Flags for IProgressDialog::StartProgressDialog() (dwFlags) #define PROGDLG_NORMAL 0x00000000 // default normal progress dlg behavior #define PROGDLG_MODAL 0x00000001 // the dialog is modal to its hwndParent (default is modeless) #define PROGDLG_AUTOTIME 0x00000002 // automatically updates the "Line3" text with the "time remaining" (you cant call SetLine3 if you passs this!) #define PROGDLG_NOTIME 0x00000004 // we dont show the "time remaining" if this is set. We need this if dwTotal < dwCompleted for sparse files #define PROGDLG_NOMINIMIZE 0x00000008 // Do not have a minimize button in the caption bar. #define PROGDLG_NOPROGRESSBAR 0x00000010 // Don't display the progress bar // Time Actions (dwTimerAction) #define PDTIMER_RESET 0x00000001 // Reset the timer so the progress will be calculated from now until the first ::SetProgress() is called so // those this time will correspond to the values passed to ::SetProgress(). Only do this before ::SetProgress() is called. #undef INTERFACE #define INTERFACE IProgressDialog DECLARE_INTERFACE_(IProgressDialog, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IProgressDialog specific methods STDMETHOD(StartProgressDialog)(THIS_ HWND hwndParent, IUnknown * punkEnableModless, DWORD dwFlags, LPCVOID pvResevered) PURE; STDMETHOD(StopProgressDialog)(THIS) PURE; STDMETHOD(SetTitle)(THIS_ LPCWSTR pwzTitle) PURE; STDMETHOD(SetAnimation)(THIS_ HINSTANCE hInstAnimation, UINT idAnimation) PURE; STDMETHOD_(BOOL,HasUserCancelled) (THIS) PURE; STDMETHOD(SetProgress)(THIS_ DWORD dwCompleted, DWORD dwTotal) PURE; STDMETHOD(SetProgress64)(THIS_ ULONGLONG ullCompleted, ULONGLONG ullTotal) PURE; STDMETHOD(SetLine)(THIS_ DWORD dwLineNum, LPCWSTR pwzString, BOOL fCompactPath, LPCVOID pvResevered) PURE; STDMETHOD(SetCancelMsg)(THIS_ LPCWSTR pwzCancelMsg, LPCVOID pvResevered) PURE; STDMETHOD(Timer)(THIS_ DWORD dwTimerAction, LPCVOID pvResevered) PURE; }; //========================================================================== // IInputObjectSite/IInputObject interfaces // // These interfaces allow us (or ISVs) to install/update external Internet // Toolbar for IE and the shell. The frame will simply get the CLSID from // registry (to be defined) and CoCreateInstance it. // //========================================================================== //------------------------------------------------------------------------- // // IInputObjectSite interface // // A site implements this interface so the object can communicate // focus change to it. // // [Member functions] // // IInputObjectSite::OnFocusChangeIS(punkObj, fSetFocus) // Object (punkObj) is getting or losing the focus. // //------------------------------------------------------------------------- #undef INTERFACE #define INTERFACE IInputObjectSite DECLARE_INTERFACE_(IInputObjectSite, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IInputObjectSite specific methods *** STDMETHOD(OnFocusChangeIS)(THIS_ IUnknown* punkObj, BOOL fSetFocus) PURE; }; //------------------------------------------------------------------------- // // IInputObject interface // // An object implements this interface so the site can communicate // activation and accelerator events to it. // // [Member functions] // // IInputObject::UIActivateIO(fActivate, lpMsg) // Activates or deactivates the object. lpMsg may be NULL. Returns // S_OK if the activation succeeded. // // IInputObject::HasFocusIO() // Returns S_OK if the object has the focus, S_FALSE if not. // // IInputObject::TranslateAcceleratorIO(lpMsg) // Allow the object to process the message. Returns S_OK if the // message was processed (eaten). // //------------------------------------------------------------------------- #undef INTERFACE #define INTERFACE IInputObject DECLARE_INTERFACE_(IInputObject, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IInputObject specific methods *** STDMETHOD(UIActivateIO)(THIS_ BOOL fActivate, LPMSG lpMsg) PURE; STDMETHOD(HasFocusIO)(THIS) PURE; STDMETHOD(TranslateAcceleratorIO)(THIS_ LPMSG lpMsg) PURE; }; //========================================================================== // IDockingWindowSite/IDockingWindow/IDockingWindowFrame interfaces // IInputObjectSite/IInputObject interfaces // // These interfaces allow us (or ISVs) to install/update external Internet // Toolbar for IE and the shell. The frame will simply get the CLSID from // registry (to be defined) and CoCreateInstance it. // //========================================================================== //------------------------------------------------------------------------- // // IDockingWindowSite interface // // A site implements this interface so the object can negotiate for // and inquire about real estate on the site. // // [Member functions] // // IDockingWindowSite::GetBorderDW(punkObj, prcBorder) // Site returns the bounding rectangle of the given source object // (punkObj). // // IDockingWindowSite::RequestBorderSpaceDW(punkObj, pbw) // Object requests that the site makes room for it, as specified in // *pbw. // // IDockingWindowSite::SetBorderSpaceDW(punkObj, pbw) // Object requests that the site set the border spacing to the size // specified in *pbw. // //------------------------------------------------------------------------- #undef INTERFACE #define INTERFACE IDockingWindowSite DECLARE_INTERFACE_(IDockingWindowSite, IOleWindow) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) 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; // *** IDockingWindowSite methods *** STDMETHOD(GetBorderDW) (THIS_ IUnknown* punkObj, LPRECT prcBorder) PURE; STDMETHOD(RequestBorderSpaceDW) (THIS_ IUnknown* punkObj, LPCBORDERWIDTHS pbw) PURE; STDMETHOD(SetBorderSpaceDW) (THIS_ IUnknown* punkObj, LPCBORDERWIDTHS pbw) PURE; }; //------------------------------------------------------------------------- // // IDockingWindowFrame interface // // // [Member functions] // // IDockingWindowFrame::AddToolbar(punkSrc, pwszItem, dwReserved) // // IDockingWindowFrame::RemoveToolbar(punkSrc, dwRemoveFlags) // // IDockingWindowFrame::FindToolbar(pwszItem, riid, ppv) // //------------------------------------------------------------------------- // flags for RemoveToolbar #define DWFRF_NORMAL 0x0000 #define DWFRF_DELETECONFIGDATA 0x0001 // flags for AddToolbar #define DWFAF_HIDDEN 0x0001 // add hidden #undef INTERFACE #define INTERFACE IDockingWindowFrame DECLARE_INTERFACE_(IDockingWindowFrame, IOleWindow) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) 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; // *** IDockingWindowFrame methods *** STDMETHOD(AddToolbar) (THIS_ IUnknown* punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags) PURE; STDMETHOD(RemoveToolbar) (THIS_ IUnknown* punkSrc, DWORD dwRemoveFlags) PURE; STDMETHOD(FindToolbar) (THIS_ LPCWSTR pwszItem, REFIID riid, void **ppv) PURE; }; //------------------------------------------------------------------------- // // IDockingWindow interface // // An object (docking window) implements this interface so the site can // communicate with it. An example of a docking window is a toolbar. // // [Member functions] // // IDockingWindow::ShowDW(fShow) // Shows or hides the docking window. // // IDockingWindow::CloseDW(dwReserved) // Closes the docking window. dwReserved must be 0. // // IDockingWindow::ResizeBorderDW(prcBorder, punkToolbarSite, fReserved) // Resizes the docking window's border to *prcBorder. fReserved must // be 0. // IObjectWithSite::SetSite(punkSite) // IDockingWindow usually paired with IObjectWithSite. // Provides the IUnknown pointer of the site to the docking window. // // //------------------------------------------------------------------------- #undef INTERFACE #define INTERFACE IDockingWindow DECLARE_INTERFACE_(IDockingWindow, IOleWindow) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) 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; // *** IDockingWindow methods *** STDMETHOD(ShowDW) (THIS_ BOOL fShow) PURE; STDMETHOD(CloseDW) (THIS_ DWORD dwReserved) PURE; STDMETHOD(ResizeBorderDW) (THIS_ LPCRECT prcBorder, IUnknown* punkToolbarSite, BOOL fReserved) PURE; }; //------------------------------------------------------------------------- // // IDeskBand interface // // // [Member functions] // // IDeskBand::GetBandInfo(dwBandID, dwViewMode, pdbi) // Returns info on the given band in *pdbi, according to the mask // field in the DESKBANDINFO structure and the given viewmode. // //------------------------------------------------------------------------- // Mask values for DESKBANDINFO #define DBIM_MINSIZE 0x0001 #define DBIM_MAXSIZE 0x0002 #define DBIM_INTEGRAL 0x0004 #define DBIM_ACTUAL 0x0008 #define DBIM_TITLE 0x0010 #define DBIM_MODEFLAGS 0x0020 #define DBIM_BKCOLOR 0x0040 typedef struct { DWORD dwMask; POINTL ptMinSize; POINTL ptMaxSize; POINTL ptIntegral; POINTL ptActual; WCHAR wszTitle[256]; DWORD dwModeFlags; COLORREF crBkgnd; } DESKBANDINFO; // DESKBANDINFO dwModeFlags values #define DBIMF_NORMAL 0x0000 #define DBIMF_VARIABLEHEIGHT 0x0008 #define DBIMF_DEBOSSED 0x0020 #define DBIMF_BKCOLOR 0x0040 // GetBandInfo view mode values #define DBIF_VIEWMODE_NORMAL 0x0000 #define DBIF_VIEWMODE_VERTICAL 0x0001 #define DBIF_VIEWMODE_FLOATING 0x0002 #define DBIF_VIEWMODE_TRANSPARENT 0x0004 #undef INTERFACE #define INTERFACE IDeskBand DECLARE_INTERFACE_(IDeskBand, IDockingWindow) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) 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; // *** IDockingWindow methods *** STDMETHOD(ShowDW) (THIS_ BOOL fShow) PURE; STDMETHOD(CloseDW) (THIS_ DWORD dwReserved) PURE; STDMETHOD(ResizeBorderDW) (THIS_ LPCRECT prcBorder, IUnknown* punkToolbarSite, BOOL fReserved) PURE; // *** IDeskBand methods *** STDMETHOD(GetBandInfo) (THIS_ DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi) PURE; }; // Command Target IDs enum { DBID_BANDINFOCHANGED = 0, DBID_SHOWONLY = 1, DBID_MAXIMIZEBAND = 2, // Maximize the specified band (VT_UI4 == dwID) DBID_PUSHCHEVRON = 3, DBID_DELAYINIT = 4, // Note: _bandsite_ calls _band_ with this code DBID_FINISHINIT = 5, // Note: _bandsite_ calls _band_ with this code }; #if (_WIN32_IE >= 0x0400) //------------------------------------------------------------------------- // // IRunnableTask interface // // This is a free threaded interface used for putting items on a background // scheduler for execution within the view. It allows a scheduler to start and // stop tasks on as many worker threads as it deems necessary. // // Run(), Kill() and Suspend() may be called from different threads. // // [Member functions] // // IRunnableTask::Run(void) // Initiate the task to run. This should return E_PENDING if the task // has been suspended. // // IRunnableTask::Kill(void) // // IRunnableTask::Suspend(void) // // IRunnableTask::Resume(void) // // IRunnableTask::IsRunning(void) // //------------------------------------------------------------------------- // Convenient state values #define IRTIR_TASK_NOT_RUNNING 0 #define IRTIR_TASK_RUNNING 1 #define IRTIR_TASK_SUSPENDED 2 #define IRTIR_TASK_PENDING 3 #define IRTIR_TASK_FINISHED 4 #undef INTERFACE #define INTERFACE IRunnableTask DECLARE_INTERFACE_( IRunnableTask, IUnknown ) { // *** IUnknown methods *** STDMETHOD (QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; // *** IRunnableTask methods *** STDMETHOD (Run)(THIS) PURE; STDMETHOD (Kill)(THIS_ BOOL fWait ) PURE; STDMETHOD (Suspend)(THIS) PURE; STDMETHOD (Resume)(THIS) PURE; STDMETHOD_(ULONG, IsRunning)(THIS) PURE; }; typedef IRunnableTask * LPRUNNABLETASK; #endif #if (_WIN32_IE >= 0x0400) // --- IExtractImage // this interface is provided for objects to provide a thumbnail image. // IExtractImage::GetLocation() // Gets a path description of the image that is to be extracted. This is used to // identify the image in the view so that multiple instances of the same image can reuse the // original image. If *pdwFlags == IEIFLAG_ASYNC and the result is E_PENDING, then *pdwPriority // is used to return the priority of the item, this is usually a measure of how long it will take // to perform the extraction. *pdwFlags can return IEIFLAG_CACHE if the view should cache a copy // of the image for future reference and faster access. This flag is use dto tell the difference // between file formats that cache a thumbnail image such as Flashpix or Office documents, and those // that don't cache one. // IExtractImage::Extract() // Extract the thumbnail of the specified size. If GetLocation() returned the values indicating // it is free-threaded and can be placed on a background thread. If the object // supports IRunnableTask as well, then long extractions can be started and paused as appropriate. // At this point it is asssumed the object is free-threaded. // If dwRecClrDepth contains a recommended Colour depth // If *phBmpthumbnail is non NULL, then it contains the destination bitmap that should be used. #define IEI_PRIORITY_MAX ITSAT_MAX_PRIORITY #define IEI_PRIORITY_MIN ITSAT_MIN_PRIORITY #define IEIT_PRIORITY_NORMAL ITSAT_DEFAULT_PRIORITY #define IEIFLAG_ASYNC 0x0001 // ask the extractor if it supports ASYNC extract (free threaded) #define IEIFLAG_CACHE 0x0002 // returned from the extractor if it does NOT cache the thumbnail #define IEIFLAG_ASPECT 0x0004 // passed to the extractor to beg it to render to the aspect ratio of the supplied rect #define IEIFLAG_OFFLINE 0x0008 // if the extractor shouldn't hit the net to get any content neede for the rendering #define IEIFLAG_GLEAM 0x0010 // does the image have a gleam ? this will be returned if it does #define IEIFLAG_SCREEN 0x0020 // render as if for the screen (this is exlusive with IEIFLAG_ASPECT ) #define IEIFLAG_ORIGSIZE 0x0040 // render to the approx size passed, but crop if neccessary #undef INTERFACE #define INTERFACE IExtractImage DECLARE_INTERFACE_ ( IExtractImage, IUnknown ) { // IUnknown methods STDMETHOD (QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef) ( THIS ) PURE; STDMETHOD_(ULONG, Release) ( THIS ) PURE; // *** IExtractImage methods *** STDMETHOD (GetLocation) ( THIS_ LPWSTR pszPathBuffer, DWORD cch, DWORD * pdwPriority, const SIZE * prgSize, DWORD dwRecClrDepth, DWORD *pdwFlags ) PURE; STDMETHOD (Extract)( THIS_ HBITMAP * phBmpThumbnail) PURE; }; typedef IExtractImage * LPEXTRACTIMAGE; /* ***************** IExtractImage2 * GetDateStamp : returns the date stamp associated with the image. If this image is already cached, * then it is easy to find out if the image is out of date. */ #undef INTERFACE #define INTERFACE IExtractImage DECLARE_INTERFACE_ ( IExtractImage2, IExtractImage ) { // IUnknown methods STDMETHOD (QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef) ( THIS ) PURE; STDMETHOD_(ULONG, Release) ( THIS ) PURE; // *** IExtractImage methods *** STDMETHOD (GetLocation) ( THIS_ LPWSTR pszPathBuffer, DWORD cch, DWORD * pdwPriority, const SIZE * prgSize, DWORD dwRecClrDepth, DWORD *pdwFlags ) PURE; STDMETHOD (Extract)( THIS_ HBITMAP * phBmpThumbnail) PURE; // *** IExtractImage2 methods *** STDMETHOD (GetDateStamp)( FILETIME * pDateStamp ) PURE; }; typedef IExtractImage2 * LPEXTRACTIMAGE2; #endif #if (_WIN32_IE >= 0x400) // // We need to make sure that WININET.H is included before this interface is // used because the COMPONENT structure uses INTERNET_MAX_URL_LENGTH // #ifdef _WININET_ // // Flags and structures used by IActiveDesktop // typedef struct _tagWALLPAPEROPT { DWORD dwSize; // size of this Structure. DWORD dwStyle; // WPSTYLE_* mentioned above } WALLPAPEROPT; typedef WALLPAPEROPT *LPWALLPAPEROPT; typedef const WALLPAPEROPT *LPCWALLPAPEROPT; typedef struct _tagCOMPONENTSOPT { DWORD dwSize; //Size of this structure BOOL fEnableComponents; //Enable components? BOOL fActiveDesktop; // Active desktop enabled ? } COMPONENTSOPT; typedef COMPONENTSOPT *LPCOMPONENTSOPT; typedef const COMPONENTSOPT *LPCCOMPONENTSOPT; typedef struct _tagCOMPPOS { DWORD dwSize; //Size of this structure int iLeft; //Left of top-left corner in screen co-ordinates. int iTop; //Top of top-left corner in screen co-ordinates. DWORD dwWidth; // Width in pixels. DWORD dwHeight; // Height in pixels. int izIndex; // Indicates the Z-order of the component. BOOL fCanResize; // Is the component resizeable? BOOL fCanResizeX; // Resizeable in X-direction? BOOL fCanResizeY; // Resizeable in Y-direction? int iPreferredLeftPercent; //Left of top-left corner as percent of screen width int iPreferredTopPercent; //Top of top-left corner as percent of screen height } COMPPOS; typedef COMPPOS *LPCOMPPOS; typedef const COMPPOS *LPCCOMPPOS; typedef struct _tagCOMPSTATEINFO { DWORD dwSize; // Size of this structure. int iLeft; // Left of the top-left corner in screen co-ordinates. int iTop; // Top of top-left corner in screen co-ordinates. DWORD dwWidth; // Width in pixels. DWORD dwHeight; // Height in pixels. DWORD dwItemState; // State of the component (full-screen mode or split-screen or normal state. } COMPSTATEINFO; typedef COMPSTATEINFO *LPCOMPSTATEINFO; typedef const COMPSTATEINFO *LPCCOMPSTATEINFO; #define COMPONENT_TOP (0x3fffffff) // izOrder value meaning component is at the top // iCompType values #define COMP_TYPE_HTMLDOC 0 #define COMP_TYPE_PICTURE 1 #define COMP_TYPE_WEBSITE 2 #define COMP_TYPE_CONTROL 3 #define COMP_TYPE_CFHTML 4 #define COMP_TYPE_MAX 4 // The following is the COMPONENT structure used in IE4.01, IE4.0 and Memphis. It is kept here for compatibility // reasons. typedef struct _tagIE4COMPONENT { DWORD dwSize; //Size of this structure DWORD dwID; //Reserved: Set it always to zero. int iComponentType; //One of COMP_TYPE_* BOOL fChecked; // Is this component enabled? BOOL fDirty; // Had the component been modified and not yet saved to disk? BOOL fNoScroll; // Is the component scrollable? COMPPOS cpPos; // Width, height etc., WCHAR wszFriendlyName[MAX_PATH]; // Friendly name of component. WCHAR wszSource[INTERNET_MAX_URL_LENGTH]; //URL of the component. WCHAR wszSubscribedURL[INTERNET_MAX_URL_LENGTH]; //Subscrined URL } IE4COMPONENT; typedef IE4COMPONENT *LPIE4COMPONENT; typedef const IE4COMPONENT *LPCIE4COMPONENT; // // The following is the new NT5 component structure. Note that the initial portion of this component exactly // matches the IE4COMPONENT structure. All new fields are added at the bottom and the dwSize field is used to // distinguish between IE4COMPONENT and the new COMPONENT structures. // typedef struct _tagCOMPONENT { DWORD dwSize; //Size of this structure DWORD dwID; //Reserved: Set it always to zero. int iComponentType; //One of COMP_TYPE_* BOOL fChecked; // Is this component enabled? BOOL fDirty; // Had the component been modified and not yet saved to disk? BOOL fNoScroll; // Is the component scrollable? COMPPOS cpPos; // Width, height etc., WCHAR wszFriendlyName[MAX_PATH]; // Friendly name of component. WCHAR wszSource[INTERNET_MAX_URL_LENGTH]; //URL of the component. WCHAR wszSubscribedURL[INTERNET_MAX_URL_LENGTH]; //Subscrined URL //New fields are added below. Everything above here must exactly match the IE4COMPONENT Structure. DWORD dwCurItemState; // Current state of the Component. COMPSTATEINFO csiOriginal; // Original state of the component when it was first added. COMPSTATEINFO csiRestored; // Restored state of the component. } COMPONENT; typedef COMPONENT *LPCOMPONENT; typedef const COMPONENT *LPCCOMPONENT; // Defines for dwCurItemState #define IS_NORMAL 0x00000001 #define IS_FULLSCREEN 0x00000002 #define IS_SPLIT 0x00000004 #define IS_VALIDSIZESTATEBITS (IS_NORMAL | IS_SPLIT | IS_FULLSCREEN) // The set of IS_* state bits which define the "size" of the component - these bits are mutually exclusive. #define IS_VALIDSTATEBITS (IS_NORMAL | IS_SPLIT | IS_FULLSCREEN | 0x80000000 | 0x40000000) // All of the currently defined IS_* bits. //////////////////////////////////////////// // Flags for IActiveDesktop::ApplyChanges() #define AD_APPLY_SAVE 0x00000001 #define AD_APPLY_HTMLGEN 0x00000002 #define AD_APPLY_REFRESH 0x00000004 #define AD_APPLY_ALL (AD_APPLY_SAVE | AD_APPLY_HTMLGEN | AD_APPLY_REFRESH) #define AD_APPLY_FORCE 0x00000008 #define AD_APPLY_BUFFERED_REFRESH 0x00000010 #define AD_APPLY_DYNAMICREFRESH 0x00000020 //////////////////////////////////////////// // Flags for IActiveDesktop::GetWallpaperOptions() // IActiveDesktop::SetWallpaperOptions() #define WPSTYLE_CENTER 0 #define WPSTYLE_TILE 1 #define WPSTYLE_STRETCH 2 #define WPSTYLE_MAX 3 //////////////////////////////////////////// // Flags for IActiveDesktop::ModifyComponent() #define COMP_ELEM_TYPE 0x00000001 #define COMP_ELEM_CHECKED 0x00000002 #define COMP_ELEM_DIRTY 0x00000004 #define COMP_ELEM_NOSCROLL 0x00000008 #define COMP_ELEM_POS_LEFT 0x00000010 #define COMP_ELEM_POS_TOP 0x00000020 #define COMP_ELEM_SIZE_WIDTH 0x00000040 #define COMP_ELEM_SIZE_HEIGHT 0x00000080 #define COMP_ELEM_POS_ZINDEX 0x00000100 #define COMP_ELEM_SOURCE 0x00000200 #define COMP_ELEM_FRIENDLYNAME 0x00000400 #define COMP_ELEM_SUBSCRIBEDURL 0x00000800 #define COMP_ELEM_ORIGINAL_CSI 0x00001000 #define COMP_ELEM_RESTORED_CSI 0x00002000 #define COMP_ELEM_CURITEMSTATE 0x00004000 #define COMP_ELEM_ALL (COMP_ELEM_TYPE | COMP_ELEM_CHECKED | COMP_ELEM_DIRTY | \ COMP_ELEM_NOSCROLL | COMP_ELEM_POS_LEFT | COMP_ELEM_SIZE_WIDTH | \ COMP_ELEM_SIZE_HEIGHT | COMP_ELEM_POS_ZINDEX | COMP_ELEM_SOURCE | \ COMP_ELEM_FRIENDLYNAME | COMP_ELEM_POS_TOP | COMP_ELEM_SUBSCRIBEDURL | \ COMP_ELEM_ORIGINAL_CSI | COMP_ELEM_RESTORED_CSI | COMP_ELEM_CURITEMSTATE) //////////////////////////////////////////// // Flags for IActiveDesktop::AddDesktopItemWithUI() typedef enum tagDTI_ADTIWUI { DTI_ADDUI_DEFAULT = 0x00000000, DTI_ADDUI_DISPSUBWIZARD = 0x00000001, DTI_ADDUI_POSITIONITEM = 0x00000002, #ifdef __BORLANDC__ } DTI_ADTIWUI; #else }; #endif /* __BORLANDC__ */ //////////////////////////////////////////// // Flags for IActiveDesktop::AddUrl() #define ADDURL_SILENT 0X0001 //////////////////////////////////////////// // Default positions for ADI #define COMPONENT_DEFAULT_LEFT (0xFFFF) #define COMPONENT_DEFAULT_TOP (0xFFFF) // // Interface for manipulating the Active Desktop. // #undef INTERFACE #define INTERFACE IActiveDesktop DECLARE_INTERFACE_( IActiveDesktop, IUnknown ) { // IUnknown methods STDMETHOD (QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef) ( THIS ) PURE; STDMETHOD_(ULONG, Release) ( THIS ) PURE; // IActiveDesktop methods STDMETHOD (ApplyChanges)(THIS_ DWORD dwFlags) PURE; STDMETHOD (GetWallpaper)(THIS_ LPWSTR pwszWallpaper, UINT cchWallpaper, DWORD dwReserved) PURE; STDMETHOD (SetWallpaper)(THIS_ LPCWSTR pwszWallpaper, DWORD dwReserved) PURE; STDMETHOD (GetWallpaperOptions)(THIS_ LPWALLPAPEROPT pwpo, DWORD dwReserved) PURE; STDMETHOD (SetWallpaperOptions)(THIS_ LPCWALLPAPEROPT pwpo, DWORD dwReserved) PURE; STDMETHOD (GetPattern)(THIS_ LPWSTR pwszPattern, UINT cchPattern, DWORD dwReserved) PURE; STDMETHOD (SetPattern)(THIS_ LPCWSTR pwszPattern, DWORD dwReserved) PURE; STDMETHOD (GetDesktopItemOptions)(THIS_ LPCOMPONENTSOPT pco, DWORD dwReserved) PURE; STDMETHOD (SetDesktopItemOptions)(THIS_ LPCCOMPONENTSOPT pco, DWORD dwReserved) PURE; STDMETHOD (AddDesktopItem)(THIS_ LPCCOMPONENT pcomp, DWORD dwReserved) PURE; STDMETHOD (AddDesktopItemWithUI)(THIS_ HWND hwnd, LPCOMPONENT pcomp, DWORD dwReserved) PURE; STDMETHOD (ModifyDesktopItem)(THIS_ LPCCOMPONENT pcomp, DWORD dwFlags) PURE; STDMETHOD (RemoveDesktopItem)(THIS_ LPCCOMPONENT pcomp, DWORD dwReserved) PURE; STDMETHOD (GetDesktopItemCount)(THIS_ LPINT lpiCount, DWORD dwReserved) PURE; STDMETHOD (GetDesktopItem)(THIS_ int nComponent, LPCOMPONENT pcomp, DWORD dwReserved) PURE; STDMETHOD (GetDesktopItemByID)(THIS_ ULONG_PTR dwID, LPCOMPONENT pcomp, DWORD dwReserved) PURE; STDMETHOD (GenerateDesktopItemHtml)(THIS_ LPCWSTR pwszFileName, LPCOMPONENT pcomp, DWORD dwReserved) PURE; STDMETHOD (AddUrl)(THIS_ HWND hwnd, LPCWSTR pszSource, LPCOMPONENT pcomp, DWORD dwFlags) PURE; STDMETHOD (GetDesktopItemBySource)(THIS_ LPCWSTR pwszSource, LPCOMPONENT pcomp, DWORD dwReserved) PURE; }; typedef IActiveDesktop * LPACTIVEDESKTOP; #endif // _WININET_ #if (_WIN32_IE >= 0x0500) #define MAX_COLUMN_NAME_LEN 80 #define MAX_COLUMN_DESC_LEN 128 typedef struct { ULONG dwFlags ; // initialization flags ULONG dwReserved ; // reserved for future use. WCHAR wszFolder[MAX_PATH]; // fully qualified folder path (or empty if multiple folders) } SHCOLUMNINIT, *LPSHCOLUMNINIT; typedef const SHCOLUMNINIT* LPCSHCOLUMNINIT; typedef struct { SHCOLUMNID scid; // OUT the unique identifier of this column VARTYPE vt; // OUT the native type of the data returned DWORD fmt; // OUT this listview format (LVCFMT_LEFT, usually) UINT cChars; // OUT the default width of the column, in characters DWORD csFlags; // OUT SHCOLSTATE flags WCHAR wszTitle[MAX_COLUMN_NAME_LEN]; // OUT the title of the column WCHAR wszDescription[MAX_COLUMN_DESC_LEN]; // OUT full description of this column } SHCOLUMNINFO, *LPSHCOLUMNINFO ; typedef const SHCOLUMNINFO* LPCSHCOLUMNINFO ; #define SHCDF_UPDATEITEM 0x00000001 // this flag is a hint that the file has changed since the last call to GetItemData typedef struct { ULONG dwFlags ; // combination of SHCDF_ flags. DWORD dwFileAttributes ; // file attributes. ULONG dwReserved ; // reserved for future use. WCHAR* pwszExt ; // address of file name extension WCHAR wszFile[MAX_PATH] ; // Absolute path of file. } SHCOLUMNDATA, *LPSHCOLUMNDATA ; typedef const SHCOLUMNDATA* LPCSHCOLUMNDATA ; #undef INTERFACE #define INTERFACE IColumnProvider // Note: these objects must be threadsafe! GetItemData _will_ be called // simultaneously from multiple threads. DECLARE_INTERFACE_(IColumnProvider, IUnknown) { // IUnknown methods STDMETHOD (QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; // IColumnProvider methods STDMETHOD (Initialize)(THIS_ LPCSHCOLUMNINIT psci) PURE; STDMETHOD (GetColumnInfo)(THIS_ DWORD dwIndex, SHCOLUMNINFO *psci) PURE; STDMETHOD (GetItemData)(THIS_ LPCSHCOLUMNID pscid, LPCSHCOLUMNDATA pscd, VARIANT *pvarData) PURE; }; /////////////////////////////////////////////////////// // // Drag and Drop helper // // Purpose: To expose the Shell drag images // // This interface is implemented in the shell by CLSID_DragDropHelper. // // To use: // If you are the source of a drag (i.e. in response to LV_DRAGBEGIN or // equivelent begin drag message) call // IDragSourceHelper::InitializeFromWindow // (, // , // ) // // NOTE: The Data object must support IDataObject::SetData with multiple // data types and GetData must implement data type cloning // (Including HGLOBAL), not just aliasing. // // If you wish to have an image while over your application add the // IDragImages::Dr* calls to your IDropTarget implementation. For Example: // // STDMETHODIMP CUserDropTarget::DragEnter(IDataObject* pDataObject, // DWORD grfKeyState, // POINTL pt, DWORD* pdwEffect) // { // // Process your DragEnter // // Call IDragImages::DragEnter last. // _pDropTargetHelper->DragEnter(_hwndDragOver, pDataObject, // (POINT*)&pt, *pdwEffect); // return hres; // } // // // If you wish to be able to source a drag image from a custom control, // implement a handler for the RegisterWindowMessage(DI_GETDRAGIMAGE). // The LPARAM is a pointer to an SHDRAGIMAGE structure. // // sizeDragImage - Calculate the length and width required to render // the images. // ptOffset - Calculate the offset from the upper left corner to // the mouse cursor within the image // hbmpDragImage - CreateBitmap( sizeDragImage.cx, sizeDragImage.cy, // GetDeviceCaps(hdcScreen, PLANES), // GetDeviceCaps(hdcScreen, BITSPIXEL), // NULL); // // Drag Images will only be displayed on Windows NT 5.0 or later. // // // Note about IDropTargetHelper::Show - This method is provided for // showing/hiding the Drag image in low color depth video modes. When // painting to a window that is currently being dragged over (i.e. For // indicating a selection) you need to hide the drag image by calling this // method passing FALSE. After the window is done painting, Show the image // again by passing TRUE. // This is sent to a window to get the rendered images to a bitmap typedef struct { SIZE sizeDragImage; // OUT - The length and Width of the // rendered image POINT ptOffset; // OUT - The Offset from the mouse cursor to // the upper left corner of the image HBITMAP hbmpDragImage; // OUT - The Bitmap containing the rendered // drag images COLORREF crColorKey; // OUT - The COLORREF that has been blitted // to the background of the images } SHDRAGIMAGE, *LPSHDRAGIMAGE; // Call RegisterWindowMessage to get the ID #define DI_GETDRAGIMAGE TEXT("ShellGetDragImage") #undef INTERFACE #define INTERFACE IDropTargetHelper DECLARE_INTERFACE_( IDropTargetHelper, IUnknown ) { // IUnknown methods STDMETHOD (QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef) ( THIS ) PURE; STDMETHOD_(ULONG, Release) ( THIS ) PURE; // IDropTargetHelper STDMETHOD (DragEnter)(THIS_ HWND hwndTarget, IDataObject* pDataObject, POINT* ppt, DWORD dwEffect) PURE; STDMETHOD (DragLeave)(THIS) PURE; STDMETHOD (DragOver)(THIS_ POINT* ppt, DWORD dwEffect) PURE; STDMETHOD (Drop)(THIS_ IDataObject* pDataObject, POINT* ppt, DWORD dwEffect) PURE; STDMETHOD (Show)(THIS_ BOOL fShow) PURE; }; #undef INTERFACE #define INTERFACE IDragSourceHelper DECLARE_INTERFACE_( IDragSourceHelper, IUnknown ) { // IUnknown methods STDMETHOD (QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG, AddRef) ( THIS ) PURE; STDMETHOD_(ULONG, Release) ( THIS ) PURE; // IDragSourceHelper STDMETHOD (InitializeFromBitmap)(THIS_ LPSHDRAGIMAGE pshdi, IDataObject* pDataObject) PURE; STDMETHOD (InitializeFromWindow)(THIS_ HWND hwnd, POINT* ppt, IDataObject* pDataObject) PURE; }; #endif // _WIN32_IE >= 0x0500 #endif // _WIN32_IE //========================================================================== // 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_SHELLURL TEXT("UniformResourceLocator") #define CFSTR_PREFERREDDROPEFFECT TEXT("Preferred DropEffect") #define CFSTR_PERFORMEDDROPEFFECT TEXT("Performed DropEffect") #define CFSTR_PASTESUCCEEDED TEXT("Paste Succeeded") #define CFSTR_INDRAGLOOP TEXT("InShellDragLoop") #define CFSTR_DRAGCONTEXT TEXT("DragContext") #define CFSTR_MOUNTEDVOLUME TEXT("MountedVolume") #define CFSTR_PERSISTEDDATAOBJECT TEXT("PersistedDataObject") #define CFSTR_TARGETCLSID TEXT("TargetCLSID") // HGLOBAL with a CLSID of the drop target #define CFSTR_LOGICALPERFORMEDDROPEFFECT TEXT("Logical Performed 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 #define DVASPECT_SHORTNAME 2 // use for CF_HDROP to get short name version of file paths #define DVASPECT_COPY 3 // use to indicate format is a "Copy" of the data (FILECONTENTS, FILEDESCRIPTOR, etc) #define DVASPECT_LINK 4 // use to indicate format is a "Shortcut" to the data (FILECONTENTS, FILEDESCRIPTOR, etc) // // 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_PROGRESSUI = 0x4000, // Show Progress UI w/Drag and Drop 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, *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 #if (_WIN32_IE >= 0x0400) // SHCNE_EXTENDED_EVENT: the extended event is identified in dwItem1, // packed in LPITEMIDLIST format (same as SHCNF_DWORD packing). // Additional information can be passed in the dwItem2 parameter // of SHChangeNotify (called "pidl2" below), which if present, must also // be in LPITEMIDLIST format. // // Unlike the standard events, the extended events are ORDINALs, so we // don't run out of bits. Extended events follow the SHCNEE_* naming // convention. // // The dwItem2 parameter varies according to the extended event. #define SHCNE_EXTENDED_EVENT 0x04000000L #endif // _WIN32_IE >= 0x0400 #define SHCNE_ASSOCCHANGED 0x08000000L #define SHCNE_DISKEVENTS 0x0002381FL #define SHCNE_GLOBALEVENTS 0x0C0581E0L // 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. #if (_WIN32_IE >= 0x0400) // SHCNE_EXTENDED_EVENT extended events. These events are ordinals. // This is not a bitfield. #define SHCNEE_ORDERCHANGED 2L // pidl2 is the changed folder #define SHCNEE_MSI_CHANGE 4L // pidl2 is a SHChangeProductKeyAsIDList #define SHCNEE_MSI_UNINSTALL 5L // pidl2 is a SHChangeProductKeyAsIDList #endif // 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 // SHSTDAPI_(void) SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2); // // IShellChangeNotify // #undef INTERFACE #define INTERFACE IShellChangeNotify DECLARE_INTERFACE_(IShellChangeNotify, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IShellChangeNotify methods *** STDMETHOD(OnChange) (THIS_ LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) PURE; } ; // // IQueryInfo // #undef INTERFACE #define INTERFACE IQueryInfo DECLARE_INTERFACE_(IQueryInfo, IUnknown) { // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // *** IQueryInfo methods *** STDMETHOD(GetInfoTip)(THIS_ DWORD dwFlags, WCHAR **ppwszTip) PURE; STDMETHOD(GetInfoFlags)(THIS_ DWORD *pdwFlags) PURE; } ; #define QITIPF_DEFAULT 0x00000000 #define QITIPF_USENAME 0x00000001 #define QITIPF_LINKNOTARGET 0x00000002 #define QITIPF_LINKUSETARGET 0x00000004 #define QIF_CACHED 0x00000001 #define QIF_DONTEXPANDFOLDER 0x00000002 // // 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 SHSTDAPI_(void) SHAddToRecentDocs(UINT uFlags, LPCVOID pv); #if (_WIN32_IE >= 0x0400) typedef struct _SHChangeProductKeyAsIDList { USHORT cb; WCHAR wszProductKey[39]; USHORT cbZero; } SHChangeProductKeyAsIDList, *LPSHChangeProductKeyAsIDList; SHSTDAPI_(void) SHUpdateImageA(LPCSTR pszHashItem, int iIndex, UINT uFlags, int iImageIndex); SHSTDAPI_(void) SHUpdateImageW(LPCWSTR pszHashItem, int iIndex, UINT uFlags, int iImageIndex); #ifdef UNICODE #define SHUpdateImage SHUpdateImageW #else #define SHUpdateImage SHUpdateImageA #endif // !UNICODE #endif /* _WIN32_IE */ SHSTDAPI SHGetInstanceExplorer(IUnknown **ppunk); // // SHGetDataFromIDListA/W // // SHGetDataFromIDList nFormat values TCHAR #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; // these delegate to IShellFolder2::GetItemData() SHSTDAPI SHGetDataFromIDListA(IShellFolder *psf, LPCITEMIDLIST pidl, int nFormat, void *pv, int cb); SHSTDAPI SHGetDataFromIDListW(IShellFolder *psf, LPCITEMIDLIST pidl, int nFormat, void *pv, int cb); #ifdef UNICODE #define SHGetDataFromIDList SHGetDataFromIDListW #else #define SHGetDataFromIDList SHGetDataFromIDListA #endif // !UNICODE //=========================================================================== // // PROPIDs for Internet Shortcuts (FMTID_Intshcut) to be used with // IPropertySetStorage/IPropertyStorage // // The known property ids and their variant types are: // PID_IS_URL [VT_LPWSTR] URL // PID_IS_NAME [VT_LPWSTR] Name of the internet shortcut // PID_IS_WORKINGDIR [VT_LPWSTR] Working directory for the shortcut // PID_IS_HOTKEY [VT_UI2] Hotkey for the shortcut // PID_IS_SHOWCMD [VT_I4] Show command for shortcut // PID_IS_ICONINDEX [VT_I4] Index into file that has icon // PID_IS_ICONFILE [VT_LPWSTR] File that has the icon // PID_IS_WHATSNEW [VT_LPWSTR] What's New text // PID_IS_AUTHOR [VT_LPWSTR] Author // PID_IS_DESCRIPTION [VT_LPWSTR] Description text of site // PID_IS_COMMENT [VT_LPWSTR] User annotated comment // #define PID_IS_URL 2 #define PID_IS_NAME 4 #define PID_IS_WORKINGDIR 5 #define PID_IS_HOTKEY 6 #define PID_IS_SHOWCMD 7 #define PID_IS_ICONINDEX 8 #define PID_IS_ICONFILE 9 #define PID_IS_WHATSNEW 10 #define PID_IS_AUTHOR 11 #define PID_IS_DESCRIPTION 12 #define PID_IS_COMMENT 13 // // PROPIDs for Internet Sites (FMTID_InternetSite) to be used with // IPropertySetStorage/IPropertyStorage // // The known property ids and their variant types are: // PID_INTSITE_WHATSNEW [VT_LPWSTR] What's New text // PID_INTSITE_AUTHOR [VT_LPWSTR] Author // PID_INTSITE_LASTVISIT [VT_FILETIME] Time site was last visited // PID_INTSITE_LASTMOD [VT_FILETIME] Time site was last modified // PID_INTSITE_VISITCOUNT [VT_UI4] Number of times user has visited // PID_INTSITE_DESCRIPTION [VT_LPWSTR] Description text of site // PID_INTSITE_COMMENT [VT_LPWSTR] User annotated comment // PID_INTSITE_RECURSE [VT_UI4] Levels to recurse (0-3) // PID_INTSITE_WATCH [VT_UI4] PIDISM_ flags // PID_INTSITE_SUBSCRIPTION [VT_UI8] Subscription cookie // PID_INTSITE_URL [VT_LPWSTR] URL // PID_INTSITE_TITLE [VT_LPWSTR] Title // PID_INTSITE_CODEPAGE [VT_UI4] Codepage of the document // PID_INTSITE_TRACKING [VT_UI4] Tracking // PID_INTSITE_ICONINDEX [VT_I4] Retrieve the index to the icon // PID_INTSITE_ICONFILE [VT_LPWSTR] Retrieve the file containing the icon index. #define PID_INTSITE_WHATSNEW 2 #define PID_INTSITE_AUTHOR 3 #define PID_INTSITE_LASTVISIT 4 #define PID_INTSITE_LASTMOD 5 #define PID_INTSITE_VISITCOUNT 6 #define PID_INTSITE_DESCRIPTION 7 #define PID_INTSITE_COMMENT 8 #define PID_INTSITE_FLAGS 9 #define PID_INTSITE_CONTENTLEN 10 #define PID_INTSITE_CONTENTCODE 11 #define PID_INTSITE_RECURSE 12 #define PID_INTSITE_WATCH 13 #define PID_INTSITE_SUBSCRIPTION 14 #define PID_INTSITE_URL 15 #define PID_INTSITE_TITLE 16 #define PID_INTSITE_CODEPAGE 18 #define PID_INTSITE_TRACKING 19 #define PID_INTSITE_ICONINDEX 20 #define PID_INTSITE_ICONFILE 21 // Flags for PID_IS_FLAGS #define PIDISF_RECENTLYCHANGED 0x00000001 #define PIDISF_CACHEDSTICKY 0x00000002 #define PIDISF_CACHEIMAGES 0x00000010 #define PIDISF_FOLLOWALLLINKS 0x00000020 // Values for PID_INTSITE_WATCH #define PIDISM_GLOBAL 0 // Monitor based on global setting #define PIDISM_WATCH 1 // User says watch #define PIDISM_DONTWATCH 2 // User says don't watch //////////////////////////////////////////////////////////////////// // // The shell keeps track of some per-user state to handle display // options that is of major interest to ISVs. // The key one requested right now is "DoubleClickInWebView". // // SysFiles are these windows special files: // "dll sys vxd 386 drv" // // hidden files are files with the FILE_ATTRIBUTE_HIDDEN attribute // // system files are files with the FILE_ATTRIBUTE_SYSTEM attribute // // fShowAllObjects fShowSysFiles Result // --------------- ------------- ------ // 0 0 hide hidden + SysFiles + system files // 0 1 hide hidden files. // 1 0 show all files. // 1 1 show all files. // typedef struct { BOOL fShowAllObjects : 1; BOOL fShowExtensions : 1; BOOL fNoConfirmRecycle : 1; BOOL fShowSysFiles : 1; BOOL fShowCompColor : 1; BOOL fDoubleClickInWebView : 1; BOOL fDesktopHTML : 1; BOOL fWin95Classic : 1; BOOL fDontPrettyPath : 1; BOOL fShowAttribCol : 1; BOOL fMapNetDrvBtn : 1; BOOL fShowInfoTip : 1; BOOL fHideIcons : 1; UINT fRestFlags : 3; } SHELLFLAGSTATE, * LPSHELLFLAGSTATE; #define SSF_SHOWALLOBJECTS 0x00000001 #define SSF_SHOWEXTENSIONS 0x00000002 #define SSF_SHOWCOMPCOLOR 0x00000008 #define SSF_SHOWSYSFILES 0x00000020 #define SSF_DOUBLECLICKINWEBVIEW 0x00000080 #define SSF_SHOWATTRIBCOL 0x00000100 #define SSF_DESKTOPHTML 0x00000200 #define SSF_WIN95CLASSIC 0x00000400 #define SSF_DONTPRETTYPATH 0x00000800 #define SSF_SHOWINFOTIP 0x00002000 #define SSF_MAPNETDRVBUTTON 0x00001000 #define SSF_NOCONFIRMRECYCLE 0x00008000 #define SSF_HIDEICONS 0x00004000 // SHGetSettings(LPSHELLFLAGSTATE lpss, DWORD dwMask) // // Specify the bits you are interested in in dwMask and they will be // filled out in the lpss structure. // // When these settings change, a WM_SETTINGCHANGE message is sent // with the string lParam value of "ShellState". // SHSTDAPI_(void) SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask); // SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, void **ppv, LPCITEMIDLIST *ppidlLast) // // Given a pidl, you can get an interface pointer (as specified by riid) of the pidl's parent folder (in ppv) // If ppidlLast is non-NULL, you can also get the pidl of the last item. // STDAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, void **ppv, LPCITEMIDLIST *ppidlLast); // SHPathPrepareForWrite(HWND hwnd, IUnknown *punkEnableModless, LPCTSTR pszPath, DWORD dwFlags) // // DESCRIPTION: // This API will prepare the path for the caller. This includes: // 1. Prompting for the ejectable media to be re-inserted. (Floppy, CD-ROM, ZIP drive, etc.) // 2. Prompting for the media to be formatted. (Floppy, hard drive, etc.) // 3. Remount mapped drives if the connection was lost. (\\unc\share mapped to N: becomes disconnected) // 4. If the path doesn't exist, create it. (SHPPFW_DIRCREATE and SHPPFW_ASKDIRCREATE) // 5. Display an error if the media is read only. (SHPPFW_NOWRITECHECK not set) // // PARAMETERS: // hwnd: Parernt window for UI. NULL means don't display UI. OPTIONAL // punkEnableModless: Parent that will be set to modal during UI using IOleInPlaceActiveObject::EnableModeless(). OPTIONAL // pszPath: Path to verify is valid for writting. This can be a UNC or file drive path. The path // should only contain directories. Pass SHPPFW_IGNOREFILENAME if the last path segment // is always filename to ignore. // dwFlags: SHPPFW_* Flags to modify behavior // //------------------------------------------------------------------------- #define SHPPFW_NONE 0x00000000 #define SHPPFW_DEFAULT SHPPFW_DIRCREATE // May change #define SHPPFW_DIRCREATE 0x00000001 // Create the directory if it doesn't exist without asking the user. #define SHPPFW_ASKDIRCREATE 0x00000002 // Create the directory if it doesn't exist after asking the user. #define SHPPFW_IGNOREFILENAME 0x00000004 // Ignore the last item in pszPath because it's a file. Example: pszPath="C:\DirA\DirB", only use "C:\DirA". #define SHPPFW_NOWRITECHECK 0x00000008 // Caller only needs to read from the drive, so don't check if it's READ ONLY. STDAPI SHPathPrepareForWriteA(HWND hwnd, IUnknown *punkEnableModless, LPCSTR pszPath, DWORD dwFlags); STDAPI SHPathPrepareForWriteW(HWND hwnd, IUnknown *punkEnableModless, LPCWSTR pszPath, DWORD dwFlags); #ifdef UNICODE #define SHPathPrepareForWrite SHPathPrepareForWriteW #else #define SHPathPrepareForWrite SHPathPrepareForWriteA #endif // !UNICODE #ifdef __urlmon_h__ // NOTE: urlmon.h must be included before shlobj.h to access this function. // // SoftwareUpdateMessageBox // // Provides a standard message box for the alerting the user that a software // update is available or installed. No UI will be displayed if there is no // update available or if the available update version is less than or equal // to the Advertised update version. // // hWnd - [in] Handle of owner window // szDistUnit - [in] Unique identifier string for a code distribution unit. For // ActiveX controls and Active Setup installed components, this // is typically a GUID string. // dwFlags - [in] Must be 0. // psdi - [in,out] Pointer to SOFTDISTINFO ( see URLMon.h ). May be NULL. // cbSize should be initialized // by the caller to sizeof(SOFTDISTINFO), dwReserved should be set to 0. // // RETURNS: // // IDNO - The user chose cancel. If *pbRemind is FALSE, the caller should save the // update version from the SOFTDISTINFO and pass it in as the Advertised // version in future calls. // // IDYES - The user has selected Update Now/About Update. The caller should navigate to // the SOFTDISTINFO's pszHREF to initiate the install or learn about it. // The caller should save the update version from the SOFTDISTINFO and pass // it in as the Advertised version in future calls. // // IDIGNORE - There is no pending software update. Note: There is // no Ignore button in the standard UI. This occurs if the available // version is less than the installed version or is not present or if the // Advertised version is greater than or equal to the update version. // // IDABORT - An error occured. Call GetSoftwareUpdateInfo() for a more specific HRESULT. // Note: There is no Abort button in the standard UI. SHDOCAPI_(DWORD) SoftwareUpdateMessageBox( HWND hWnd, LPCWSTR szDistUnit, DWORD dwFlags, LPSOFTDISTINFO psdi ); #endif // if __urlmon_h__ #ifdef __cplusplus } #endif /* __cplusplus */ #ifndef RC_INVOKED #include #endif /* !RC_INVOKED */ #pragma option pop /*P_O_Pop*/ #endif // _SHLOBJ_H_