ShlObj.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:141k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //===========================================================================
  2. //
  3. // Copyright (c) Microsoft Corporation. All rights reserved.
  4. //
  5. // File: shlobj.h
  6. //
  7. //===========================================================================
  8. #ifndef _SHLOBJ_H_
  9. #define _SHLOBJ_H_
  10. #ifndef _WINRESRC_
  11. #ifndef _WIN32_IE
  12. #define _WIN32_IE 0x0501
  13. #else
  14. #if (_WIN32_IE < 0x0400) && defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0500)
  15. #error _WIN32_IE setting conflicts with _WIN32_WINNT setting
  16. #endif
  17. #endif
  18. #endif
  19. #ifndef SNDMSG
  20. #ifdef __cplusplus
  21. #define SNDMSG ::SendMessage
  22. #else
  23. #define SNDMSG SendMessage
  24. #endif
  25. #endif // ifndef SNDMSG
  26. //
  27. // Define API decoration for direct importing of DLL references.
  28. //
  29. #ifndef WINSHELLAPI
  30. #if defined(_SHELL32_)
  31. #define WINSHELLAPI
  32. #else
  33. #define WINSHELLAPI       DECLSPEC_IMPORT
  34. #endif
  35. #endif // WINSHELLAPI
  36. #ifndef SHSTDAPI
  37. #if defined(_SHELL32_)
  38. #define SHSTDAPI          STDAPI
  39. #define SHSTDAPI_(type)   STDAPI_(type)
  40. #else
  41. #define SHSTDAPI          EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
  42. #define SHSTDAPI_(type)   EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
  43. #endif
  44. #endif // SHSTDAPI
  45. #ifndef SHDOCAPI
  46. #if defined(_SHDOCVW_)
  47. #define SHDOCAPI          STDAPI
  48. #define SHDOCAPI_(type)   STDAPI_(type)
  49. #else
  50. #define SHDOCAPI          EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
  51. #define SHDOCAPI_(type)   EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
  52. #endif
  53. #endif // SHDOCAPI
  54. // shell32 APIs that are also exported from shdocvw
  55. #ifndef SHSTDDOCAPI
  56. #if defined(_SHDOCVW_) || defined(_SHELL32_)
  57. #define SHSTDDOCAPI          STDAPI
  58. #define SHSTDDOCAPI_(type)   STDAPI_(type)
  59. #else
  60. #define SHSTDDOCAPI          EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
  61. #define SHSTDDOCAPI_(type)   EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
  62. #endif
  63. #endif // SHSTDDOCAPI
  64. #ifndef BROWSEUIAPI
  65. #if defined(_BROWSEUI_)
  66. #define BROWSEUIAPI           STDAPI
  67. #define BROWSEUIAPI_(type)    STDAPI_(type)
  68. #else
  69. #define BROWSEUIAPI           EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
  70. #define BROWSEUIAPI_(type)    EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
  71. #endif // defined(_BROWSEUI_)
  72. #endif // BROWSEUIAPI
  73. // shell32 APIs that are also exported from shfolder
  74. #ifndef SHFOLDERAPI
  75. #if defined(_SHFOLDER_) || defined(_SHELL32_)
  76. #define SHFOLDERAPI           STDAPI
  77. #else
  78. #define SHFOLDERAPI           EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
  79. #endif
  80. #endif
  81. #include <ole2.h>
  82. #ifndef _PRSHT_H_
  83. #include <prsht.h>
  84. #endif
  85. #ifndef _INC_COMMCTRL
  86. #include <commctrl.h>   // for LPTBBUTTON
  87. #endif
  88. #ifndef INITGUID
  89. #include <shlguid.h>
  90. #endif /* !INITGUID */
  91. #include <pshpack1.h>   /* Assume byte packing throughout */
  92. #ifdef __cplusplus
  93. extern "C" {            /* Assume C declarations for C++ */
  94. #endif /* __cplusplus */
  95. #include <shtypes.h>
  96. #include <shobjidl.h>
  97. //===========================================================================
  98. //
  99. // Task allocator API
  100. //
  101. //  All the shell extensions MUST use the task allocator (see OLE 2.0
  102. // programming guild for its definition) when they allocate or free
  103. // memory objects (mostly ITEMIDLIST) that are returned across any
  104. // shell interfaces. There are two ways to access the task allocator
  105. // from a shell extension depending on whether or not it is linked with
  106. // OLE32.DLL or not (purely for efficiency).
  107. //
  108. // (1) A shell extension which calls any OLE API (i.e., linked with
  109. //  OLE32.DLL) should call OLE's task allocator (by retrieving
  110. //  the task allocator by calling CoGetMalloc API).
  111. //
  112. // (2) A shell extension which does not call any OLE API (i.e., not linked
  113. //  with OLE32.DLL) should call the shell task allocator API (defined
  114. //  below), so that the shell can quickly loads it when OLE32.DLL is not
  115. //  loaded by any application at that point.
  116. //
  117. // Notes:
  118. //  In next version of Windowso release, SHGetMalloc will be replaced by
  119. // the following macro.
  120. //
  121. // #define SHGetMalloc(ppmem)   CoGetMalloc(MEMCTX_TASK, ppmem)
  122. //
  123. //===========================================================================
  124. SHSTDAPI SHGetMalloc(LPMALLOC * ppMalloc);
  125. //===========================================================================
  126. //
  127. // IContextMenu interface
  128. //
  129. // [OverView]
  130. //
  131. //  The shell uses the IContextMenu interface in following three cases.
  132. //
  133. // case-1: The shell is loading context menu extensions.
  134. //
  135. //   When the user clicks the right mouse button on an item within the shell's
  136. //  name space (i.g., file, directory, server, work-group, etc.), it creates
  137. //  the default context menu for its type, then loads context menu extensions
  138. //  that are registered for that type (and its base type) so that they can
  139. //  add extra menu items. Those context menu extensions are registered at
  140. //  HKCR{ProgID}shellexContextMenuHandlers.
  141. //
  142. // case-2: The shell is retrieving a context menu of sub-folders in extended
  143. //   name-space.
  144. //
  145. //   When the explorer's name space is extended by name space extensions,
  146. //  the shell calls their IShellFolder::GetUIObjectOf to get the IContextMenu
  147. //  objects when it creates context menus for folders under those extended
  148. //  name spaces.
  149. //
  150. // case-3: The shell is loading non-default drag and drop handler for directories.
  151. //
  152. //   When the user performed a non-default drag and drop onto one of file
  153. //  system folders (i.e., directories), it loads shell extensions that are
  154. //  registered at HKCR{ProgID}DragDropHandlers.
  155. //
  156. //
  157. // [Member functions]
  158. //
  159. //
  160. // IContextMenu::QueryContextMenu
  161. //
  162. //   This member function may insert one or more menuitems to the specified
  163. //  menu (hmenu) at the specified location (indexMenu which is never be -1).
  164. //  The IDs of those menuitem must be in the specified range (idCmdFirst and
  165. //  idCmdLast). It returns the maximum menuitem ID offset (ushort) in the
  166. //  'code' field (low word) of the scode.
  167. //
  168. //   The uFlags specify the context. It may have one or more of following
  169. //  flags.
  170. //
  171. //  CMF_DEFAULTONLY: This flag is passed if the user is invoking the default
  172. //   action (typically by double-clicking, case 1 and 2 only). Context menu
  173. //   extensions (case 1) should not add any menu items, and returns NOERROR.
  174. //
  175. //  CMF_VERBSONLY: The explorer passes this flag if it is constructing
  176. //   a context menu for a short-cut object (case 1 and case 2 only). If this
  177. //   flag is passed, it should not add any menu-items that is not appropriate
  178. //   from a short-cut.
  179. //    A good example is the "Delete" menuitem, which confuses the user
  180. //   because it is not clear whether it deletes the link source item or the
  181. //   link itself.
  182. //
  183. //  CMF_EXPLORER: The explorer passes this flag if it has the left-side pane
  184. //   (case 1 and 2 only). Context menu extensions should ignore this flag.
  185. //
  186. //   High word (16-bit) are reserved for context specific communications
  187. //  and the rest of flags (13-bit) are reserved by the system.
  188. //
  189. //
  190. // IContextMenu::InvokeCommand
  191. //
  192. //   This member is called when the user has selected one of menuitems that
  193. //  are inserted by previous QueryContextMenu member. In this case, the
  194. //  LOWORD(lpici->lpVerb) contains the menuitem ID offset (menuitem ID -
  195. //  idCmdFirst).
  196. //
  197. //   This member function may also be called programmatically. In such a case,
  198. //  lpici->lpVerb specifies the canonical name of the command to be invoked,
  199. //  which is typically retrieved by GetCommandString member previously.
  200. //
  201. //  Parameters in lpci:
  202. //    cbSize -- Specifies the size of this structure (sizeof(*lpci))
  203. //    hwnd   -- Specifies the owner window for any message/dialog box.
  204. //    fMask  -- Specifies whether or not dwHotkey/hIcon paramter is valid.
  205. //    lpVerb -- Specifies the command to be invoked.
  206. //    lpParameters -- Parameters (optional)
  207. //    lpDirectory  -- Working directory (optional)
  208. //    nShow -- Specifies the flag to be passed to ShowWindow (SW_*).
  209. //    dwHotKey -- Hot key to be assigned to the app after invoked (optional).
  210. //    hIcon -- Specifies the icon (optional).
  211. //    hMonitor -- Specifies the default monitor (optional).
  212. //
  213. //
  214. // IContextMenu::GetCommandString
  215. //
  216. //   This member function is called by the explorer either to get the
  217. //  canonical (language independent) command name (uFlags == GCS_VERB) or
  218. //  the help text ((uFlags & GCS_HELPTEXT) != 0) for the specified command.
  219. //  The retrieved canonical string may be passed to its InvokeCommand
  220. //  member function to invoke a command programmatically. The explorer
  221. //  displays the help texts in its status bar; therefore, the length of
  222. //  the help text should be reasonably short (<40 characters).
  223. //
  224. //  Parameters:
  225. //   idCmd -- Specifies menuitem ID offset (from idCmdFirst)
  226. //   uFlags -- Either GCS_VERB or GCS_HELPTEXT
  227. //   pwReserved -- Reserved (must pass NULL when calling, must ignore when called)
  228. //   pszName -- Specifies the string buffer.
  229. //   cchMax -- Specifies the size of the string buffer.
  230. //
  231. //===========================================================================
  232. // QueryContextMenu uFlags
  233. #define CMF_NORMAL              0x00000000
  234. #define CMF_DEFAULTONLY         0x00000001
  235. #define CMF_VERBSONLY           0x00000002
  236. #define CMF_EXPLORE             0x00000004
  237. #define CMF_NOVERBS             0x00000008
  238. #define CMF_CANRENAME           0x00000010
  239. #define CMF_NODEFAULT           0x00000020
  240. #define CMF_INCLUDESTATIC       0x00000040
  241. #define CMF_EXTENDEDVERBS       0x00000100      // rarely used verbs
  242. #define CMF_RESERVED            0xffff0000      // View specific
  243. // GetCommandString uFlags
  244. #define GCS_VERBA        0x00000000     // canonical verb
  245. #define GCS_HELPTEXTA    0x00000001     // help text (for status bar)
  246. #define GCS_VALIDATEA    0x00000002     // validate command exists
  247. #define GCS_VERBW        0x00000004     // canonical verb (unicode)
  248. #define GCS_HELPTEXTW    0x00000005     // help text (unicode version)
  249. #define GCS_VALIDATEW    0x00000006     // validate command exists (unicode)
  250. #define GCS_UNICODE      0x00000004     // for bit testing - Unicode string
  251. #ifdef UNICODE
  252. #define GCS_VERB        GCS_VERBW
  253. #define GCS_HELPTEXT    GCS_HELPTEXTW
  254. #define GCS_VALIDATE    GCS_VALIDATEW
  255. #else
  256. #define GCS_VERB        GCS_VERBA
  257. #define GCS_HELPTEXT    GCS_HELPTEXTA
  258. #define GCS_VALIDATE    GCS_VALIDATEA
  259. #endif
  260. #define CMDSTR_NEWFOLDERA   "NewFolder"
  261. #define CMDSTR_VIEWLISTA    "ViewList"
  262. #define CMDSTR_VIEWDETAILSA "ViewDetails"
  263. #define CMDSTR_NEWFOLDERW   L"NewFolder"
  264. #define CMDSTR_VIEWLISTW    L"ViewList"
  265. #define CMDSTR_VIEWDETAILSW L"ViewDetails"
  266. #ifdef UNICODE
  267. #define CMDSTR_NEWFOLDER    CMDSTR_NEWFOLDERW
  268. #define CMDSTR_VIEWLIST     CMDSTR_VIEWLISTW
  269. #define CMDSTR_VIEWDETAILS  CMDSTR_VIEWDETAILSW
  270. #else
  271. #define CMDSTR_NEWFOLDER    CMDSTR_NEWFOLDERA
  272. #define CMDSTR_VIEWLIST     CMDSTR_VIEWLISTA
  273. #define CMDSTR_VIEWDETAILS  CMDSTR_VIEWDETAILSA
  274. #endif
  275. #define CMIC_MASK_HOTKEY        SEE_MASK_HOTKEY
  276. #define CMIC_MASK_ICON          SEE_MASK_ICON
  277. #define CMIC_MASK_FLAG_NO_UI    SEE_MASK_FLAG_NO_UI
  278. #define CMIC_MASK_UNICODE       SEE_MASK_UNICODE
  279. #define CMIC_MASK_NO_CONSOLE    SEE_MASK_NO_CONSOLE
  280. #define CMIC_MASK_HASLINKNAME   SEE_MASK_HASLINKNAME
  281. #define CMIC_MASK_FLAG_SEP_VDM  SEE_MASK_FLAG_SEPVDM
  282. #define CMIC_MASK_HASTITLE      SEE_MASK_HASTITLE
  283. #define CMIC_MASK_ASYNCOK       SEE_MASK_ASYNCOK
  284. #if (_WIN32_IE >= 0x0501)
  285. #define CMIC_MASK_SHIFT_DOWN    0x10000000
  286. #define CMIC_MASK_CONTROL_DOWN  0x20000000
  287. #endif // (_WIN32_IE >= 0x501)
  288. #if (_WIN32_IE >= 0x0560)
  289. #define CMIC_MASK_FLAG_LOG_USAGE SEE_MASK_FLAG_LOG_USAGE
  290. #endif // (_WIN32_IE >= 0x560)
  291. #if (_WIN32_IE >= 0x0400)
  292. #define CMIC_MASK_PTINVOKE      0x20000000
  293. #endif
  294. #include <pshpack8.h>
  295. //NOTE: When SEE_MASK_HMONITOR is set, hIcon is treated as hMonitor
  296. typedef struct _CMINVOKECOMMANDINFO {
  297.     DWORD cbSize;        // sizeof(CMINVOKECOMMANDINFO)
  298.     DWORD fMask;         // any combination of CMIC_MASK_*
  299.     HWND hwnd;           // might be NULL (indicating no owner window)
  300.     LPCSTR lpVerb;       // either a string or MAKEINTRESOURCE(idOffset)
  301.     LPCSTR lpParameters; // might be NULL (indicating no parameter)
  302.     LPCSTR lpDirectory;  // might be NULL (indicating no specific directory)
  303.     int nShow;           // one of SW_ values for ShowWindow() API
  304.     DWORD dwHotKey;
  305.     HANDLE hIcon;
  306. } CMINVOKECOMMANDINFO,  *LPCMINVOKECOMMANDINFO;
  307. typedef struct _CMInvokeCommandInfoEx {
  308.     DWORD cbSize;        // must be sizeof(CMINVOKECOMMANDINFOEX)
  309.     DWORD fMask;         // any combination of CMIC_MASK_*
  310.     HWND hwnd;           // might be NULL (indicating no owner window)
  311.     LPCSTR lpVerb;       // either a string or MAKEINTRESOURCE(idOffset)
  312.     LPCSTR lpParameters; // might be NULL (indicating no parameter)
  313.     LPCSTR lpDirectory;  // might be NULL (indicating no specific directory)
  314.     int nShow;           // one of SW_ values for ShowWindow() API
  315.     DWORD dwHotKey;
  316.     HANDLE hIcon;
  317.     LPCSTR lpTitle;      // For CreateProcess-StartupInfo.lpTitle
  318.     LPCWSTR lpVerbW;        // Unicode verb (for those who can use it)
  319.     LPCWSTR lpParametersW;  // Unicode parameters (for those who can use it)
  320.     LPCWSTR lpDirectoryW;   // Unicode directory (for those who can use it)
  321.     LPCWSTR lpTitleW;       // Unicode title (for those who can use it)
  322. #if (_WIN32_IE >= 0x0400)
  323.     POINT   ptInvoke;       // Point where it's invoked
  324. #endif
  325. } CMINVOKECOMMANDINFOEX,  *LPCMINVOKECOMMANDINFOEX;
  326. #include <poppack.h>        /* Return to byte packing */
  327. #undef  INTERFACE
  328. #define INTERFACE   IContextMenu
  329. DECLARE_INTERFACE_(IContextMenu, IUnknown)
  330. {
  331.     // *** IUnknown methods ***
  332.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  333.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  334.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  335.     STDMETHOD(QueryContextMenu)(THIS_
  336.                                 HMENU hmenu,
  337.                                 UINT indexMenu,
  338.                                 UINT idCmdFirst,
  339.                                 UINT idCmdLast,
  340.                                 UINT uFlags) PURE;
  341.     STDMETHOD(InvokeCommand)(THIS_
  342.                              LPCMINVOKECOMMANDINFO lpici) PURE;
  343.     STDMETHOD(GetCommandString)(THIS_
  344.                                 UINT_PTR    idCmd,
  345.                                 UINT        uType,
  346.                                 UINT      * pwReserved,
  347.                                 LPSTR       pszName,
  348.                                 UINT        cchMax) PURE;
  349. };
  350. typedef IContextMenu *  LPCONTEXTMENU;
  351. //
  352. // IContextMenu2 (IContextMenu with one new member)
  353. //
  354. // IContextMenu2::HandleMenuMsg
  355. //
  356. //  This function is called, if the client of IContextMenu is aware of
  357. // IContextMenu2 interface and receives one of following messages while
  358. // it is calling TrackPopupMenu (in the window proc of hwnd):
  359. //      WM_INITPOPUP, WM_DRAWITEM and WM_MEASUREITEM
  360. //  The callee may handle these messages to draw owner draw menuitems.
  361. //
  362. #undef  INTERFACE
  363. #define INTERFACE   IContextMenu2
  364. DECLARE_INTERFACE_(IContextMenu2, IContextMenu)
  365. {
  366.     // *** IUnknown methods ***
  367.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  368.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  369.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  370.     // *** IContextMenu methods ***
  371.     STDMETHOD(QueryContextMenu)(THIS_
  372.                                 HMENU hmenu,
  373.                                 UINT indexMenu,
  374.                                 UINT idCmdFirst,
  375.                                 UINT idCmdLast,
  376.                                 UINT uFlags) PURE;
  377.     STDMETHOD(InvokeCommand)(THIS_
  378.                              LPCMINVOKECOMMANDINFO lpici) PURE;
  379.     STDMETHOD(GetCommandString)(THIS_
  380.                                 UINT_PTR    idCmd,
  381.                                 UINT        uType,
  382.                                 UINT      * pwReserved,
  383.                                 LPSTR       pszName,
  384.                                 UINT        cchMax) PURE;
  385.     // *** IContextMenu2 methods ***
  386.     STDMETHOD(HandleMenuMsg)(THIS_
  387.                              UINT uMsg,
  388.                              WPARAM wParam,
  389.                              LPARAM lParam) PURE;
  390. };
  391. typedef IContextMenu2 * LPCONTEXTMENU2;
  392. //
  393. // IContextMenu3 (IContextMenu with one new member)
  394. //
  395. // IContextMenu3::HandleMenuMsg2
  396. //
  397. //  This function is called, if the client of IContextMenu is aware of
  398. // IContextMenu3 interface and receives a menu message while
  399. // it is calling TrackPopupMenu (in the window proc of hwnd):
  400. //
  401. #undef  INTERFACE
  402. #define INTERFACE   IContextMenu3
  403. DECLARE_INTERFACE_(IContextMenu3, IContextMenu2)
  404. {
  405.     // *** IUnknown methods ***
  406.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  407.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  408.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  409.     // *** IContextMenu methods ***
  410.     STDMETHOD(QueryContextMenu)(THIS_
  411.                                 HMENU hmenu,
  412.                                 UINT indexMenu,
  413.                                 UINT idCmdFirst,
  414.                                 UINT idCmdLast,
  415.                                 UINT uFlags) PURE;
  416.     STDMETHOD(InvokeCommand)(THIS_
  417.                              LPCMINVOKECOMMANDINFO lpici) PURE;
  418.     STDMETHOD(GetCommandString)(THIS_
  419.                                 UINT_PTR    idCmd,
  420.                                 UINT        uType,
  421.                                 UINT      * pwReserved,
  422.                                 LPSTR       pszName,
  423.                                 UINT        cchMax) PURE;
  424.     // *** IContextMenu2 methods ***
  425.     STDMETHOD(HandleMenuMsg)(THIS_
  426.                              UINT uMsg,
  427.                              WPARAM wParam,
  428.                              LPARAM lParam) PURE;
  429.     // *** IContextMenu3 methods ***
  430.     STDMETHOD(HandleMenuMsg2)(THIS_
  431.                              UINT uMsg,
  432.                              WPARAM wParam,
  433.                              LPARAM lParam,
  434.                              LRESULT* plResult) PURE;
  435. };
  436. typedef IContextMenu3 * LPCONTEXTMENU3;
  437. #if (_WIN32_IE >= 0x0500)
  438. #undef  INTERFACE
  439. #define INTERFACE   IPersistFolder3
  440. #define CSIDL_FLAG_PFTI_TRACKTARGET CSIDL_FLAG_DONT_VERIFY
  441. // DESCRIPTION: PERSIST_FOLDER_TARGET_INFO
  442. //    This stucture is used for Folder Shortcuts which allow the shell to
  443. // have a file system folder act like another area in the name space.
  444. // One of pidlTargetFolder, szTargetParsingName, or csidl needs to
  445. // specify the destination name space.
  446. //
  447. // pidlTargetFolder: This is a full pidl to the target folder.  Can be NULL in the IPersistFolder3::InitializeEx()
  448. //                   call but not in the GetFolderTargetInfo() return structure.
  449. // szTargetParsingName: Empty string if not specified. Ortherwise, it is the parsible name
  450. //                       to the target.  This name can be parsed by IShellFolder::
  451. //                       ParsedName() from the desktop.
  452. // szNetworkProvider: Can be an empty string.  If not empty, it specifies the type of network
  453. //                    provider that will be used when binding to the target.  This is used
  454. //                    for performance optimizations for the WNet APIs.
  455. // dwAttributes: -1 if not known.  These are the SFGAO_ flags for IShellFolder::GetAttributesOf()
  456. // csidl: This is -1 if it's not used.  This can be used instead of pidlTargetFolder or
  457. //        szTargetParsingName to indicate the TargetFolder.  See the list of CSIDL_ folders
  458. //        below.  CSIDL_FLAG_PFTI_TRACKTARGET means that the IShellFolder's target folder
  459. //        should change if the user changes the target of the underlying CSIDL value.
  460. //        You can also pass CSIDL_FLAG_CREATE to indicate that the target folder
  461. //        should be created if it does not exist.  No other CSIDL_FLAG_* values are supported.
  462. #include <pshpack8.h>
  463. typedef struct
  464. {
  465.     LPITEMIDLIST  pidlTargetFolder;               // pidl for the folder we want to intiailize
  466.     WCHAR         szTargetParsingName[MAX_PATH];  // optional parsing name for the target
  467.     WCHAR         szNetworkProvider[MAX_PATH];    // optional network provider
  468.     DWORD         dwAttributes;                   // optional FILE_ATTRIBUTES_ flags (-1 if not used)
  469.     int           csidl;                          // optional folder index (SHGetFolderPath()) -1 if not used
  470. } PERSIST_FOLDER_TARGET_INFO;
  471. #include <poppack.h>        /* Return to byte packing */
  472. // DESCRIPTION: IPersistFolder3
  473. //    This interface is implemented by an IShellFolder object that wants non-default
  474. // handling of Folder Shortcuts.  In general, shell name space extensions should use
  475. // pidlRoot (the alias pidl) as their location in the name space and pass it to public
  476. // APIs, such as ShellExecute().  The one exception is that pidlTarget should be used
  477. // when sending ChangeNotifies or registering to listen for change notifies
  478. // (see SFVM_GETNOTIFY).
  479. //
  480. // InitializeEx: This method initializes an IShellFolder and specifies where
  481. //               it is rooted in the name space.
  482. //      pbc: May be NULL.
  483. //      pidlRoot: This is the same parameter as IPersistFolder::Initialize(). Caller allocates
  484. //                and frees this parameter.
  485. //      ppfti: May be NULL, in which case this is the same as a call to IPersistFolder::Initialize().
  486. //             Otherwise this is a Folder Shortcut and this structure specifies the target
  487. //             folder and it's attributes.
  488. // GetFolderTargetInfo: This is used by the caller to find information about
  489. //             the folder shortcut.  This structure may not be initialized by the caller,
  490. //             so the callee needs to initialize every member.  The callee allocates
  491. //             pidlTargetFolder and the caller will free it.  Filling in pidlTargetFolder is
  492. //             ALWAYS required.
  493. DECLARE_INTERFACE_(IPersistFolder3, IPersistFolder2)
  494. {
  495.     // *** IUnknown methods ***
  496.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
  497.     STDMETHOD_(ULONG,AddRef)(THIS)  PURE;
  498.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  499.     // *** IPersist methods ***
  500.     STDMETHOD(GetClassID)(THIS_ LPCLSID lpClassID) PURE;
  501.     // *** IPersistFolder methods ***
  502.     STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST pidl) PURE;
  503.     // *** IPersistFolder2 methods ***
  504.     STDMETHOD(GetCurFolder)(THIS_ LPITEMIDLIST *ppidl) PURE;
  505.     // *** IPersistFolder3 methods ***
  506.     STDMETHOD(InitializeEx)(THIS_ IBindCtx *pbc, LPCITEMIDLIST pidlRoot, const PERSIST_FOLDER_TARGET_INFO *ppfti) PURE;
  507.     STDMETHOD(GetFolderTargetInfo)(THIS_ PERSIST_FOLDER_TARGET_INFO *ppfti) PURE;
  508. };
  509. #endif
  510. //
  511. //===========================================================================
  512. //
  513. // IExtractIcon interface
  514. //
  515. //  This interface is used in two different places in the shell.
  516. //
  517. // Case-1: Icons of sub-folders for the scope-pane of the explorer.
  518. //
  519. //  It is used by the explorer to get the "icon location" of
  520. // sub-folders from each shell folders. When the user expands a folder
  521. // in the scope pane of the explorer, the explorer does following:
  522. //  (1) binds to the folder (gets IShellFolder),
  523. //  (2) enumerates its sub-folders by calling its EnumObjects member,
  524. //  (3) calls its GetUIObjectOf member to get IExtractIcon interface
  525. //     for each sub-folders.
  526. //  In this case, the explorer uses only IExtractIcon::GetIconLocation
  527. // member to get the location of the appropriate icon. An icon location
  528. // always consists of a file name (typically DLL or EXE) and either an icon
  529. // resource or an icon index.
  530. //
  531. //
  532. // Case-2: Extracting an icon image from a file
  533. //
  534. //  It is used by the shell when it extracts an icon image
  535. // from a file. When the shell is extracting an icon from a file,
  536. // it does following:
  537. //  (1) creates the icon extraction handler object (by getting its CLSID
  538. //     under the {ProgID}shellExtractIconHanler key and calling
  539. //     CoCreateInstance requesting for IExtractIcon interface).
  540. //  (2) Calls IExtractIcon::GetIconLocation.
  541. //  (3) Then, calls IExtractIcon::ExtractIcon with the location/index pair.
  542. //  (4) If (3) returns NOERROR, it uses the returned icon.
  543. //  (5) Otherwise, it recursively calls this logic with new location
  544. //     assuming that the location string contains a fully qualified path name.
  545. //
  546. //  From extension programmer's point of view, there are only two cases
  547. // where they provide implementations of IExtractIcon:
  548. //  Case-1) providing explorer extensions (i.e., IShellFolder).
  549. //  Case-2) providing per-instance icons for some types of files.
  550. //
  551. // Because Case-1 is described above, we'll explain only Case-2 here.
  552. //
  553. // When the shell is about display an icon for a file, it does following:
  554. //  (1) Finds its ProgID and ClassID.
  555. //  (2) If the file has a ClassID, it gets the icon location string from the
  556. //    "DefaultIcon" key under it. The string indicates either per-class
  557. //    icon (e.g., "FOOBAR.DLL,2") or per-instance icon (e.g., "%1,1").
  558. //  (3) If a per-instance icon is specified, the shell creates an icon
  559. //    extraction handler object for it, and extracts the icon from it
  560. //    (which is described above).
  561. //
  562. //  It is important to note that the shell calls IExtractIcon::GetIconLocation
  563. // first, then calls IExtractIcon::Extract. Most application programs
  564. // that support per-instance icons will probably store an icon location
  565. // (DLL/EXE name and index/id) rather than an icon image in each file.
  566. // In those cases, a programmer needs to implement only the GetIconLocation
  567. // member and it Extract member simply returns S_FALSE. They need to
  568. // implement Extract member only if they decided to store the icon images
  569. // within files themselved or some other database (which is very rare).
  570. //
  571. //
  572. //
  573. // [Member functions]
  574. //
  575. //
  576. // IExtractIcon::GetIconLocation
  577. //
  578. //  This function returns an icon location.
  579. //
  580. //  Parameters:
  581. //   uFlags     [in]  -- Specifies if it is opened or not (GIL_OPENICON or 0)
  582. //   szIconFile [out] -- Specifies the string buffer buffer for a location name.
  583. //   cchMax     [in]  -- Specifies the size of szIconFile (almost always MAX_PATH)
  584. //   piIndex    [out] -- Sepcifies the address of UINT for the index.
  585. //   pwFlags    [out] -- Returns GIL_* flags
  586. //  Returns:
  587. //   NOERROR, if it returns a valid location; S_FALSE, if the shell use a
  588. //   default icon.
  589. //
  590. //  Notes: The location may or may not be a path to a file. The caller can
  591. //   not assume anything unless the subsequent Extract member call returns
  592. //   S_FALSE.
  593. //
  594. //   if the returned location is not a path to a file, GIL_NOTFILENAME should
  595. //   be set in the returned flags.
  596. //
  597. // IExtractIcon::Extract
  598. //
  599. //  This function extracts an icon image from a specified file.
  600. //
  601. //  Parameters:
  602. //   pszFile [in] -- Specifies the icon location (typically a path to a file).
  603. //   nIconIndex [in] -- Specifies the icon index.
  604. //   phiconLarge [out] -- Specifies the HICON variable for large icon.
  605. //   phiconSmall [out] -- Specifies the HICON variable for small icon.
  606. //   nIconSize [in] -- Specifies the size icon required (size of large icon)
  607. //                     LOWORD is the requested large icon size
  608. //                     HIWORD is the requested small icon size
  609. //  Returns:
  610. //   NOERROR, if it extracted the from the file.
  611. //   S_FALSE, if the caller should extract from the file specified in the
  612. //           location.
  613. //
  614. //===========================================================================
  615. // GetIconLocation() input flags
  616. #define GIL_OPENICON     0x0001      // allows containers to specify an "open" look
  617. #define GIL_FORSHELL     0x0002      // icon is to be displayed in a ShellFolder
  618. #define GIL_ASYNC        0x0020      // this is an async extract, return E_PENDING
  619. #define GIL_DEFAULTICON  0x0040      // get the default icon location if the final one takes too long to get
  620. #define GIL_FORSHORTCUT  0x0080      // the icon is for a shortcut to the object
  621. // GetIconLocation() return flags
  622. #define GIL_SIMULATEDOC  0x0001      // simulate this document icon for this
  623. #define GIL_PERINSTANCE  0x0002      // icons from this class are per instance (each file has its own)
  624. #define GIL_PERCLASS     0x0004      // icons from this class per class (shared for all files of this type)
  625. #define GIL_NOTFILENAME  0x0008      // location is not a filename, must call ::ExtractIcon
  626. #define GIL_DONTCACHE    0x0010      // this icon should not be cached
  627. #undef  INTERFACE
  628. #define INTERFACE   IExtractIconA
  629. DECLARE_INTERFACE_(IExtractIconA, IUnknown)     // exic
  630. {
  631.     // *** IUnknown methods ***
  632.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  633.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  634.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  635.     // *** IExtractIcon methods ***
  636.     STDMETHOD(GetIconLocation)(THIS_
  637.                          UINT   uFlags,
  638.                          LPSTR  szIconFile,
  639.                          UINT   cchMax,
  640.                          int   * piIndex,
  641.                          UINT  * pwFlags) PURE;
  642.     STDMETHOD(Extract)(THIS_
  643.                            LPCSTR pszFile,
  644.                            UINT   nIconIndex,
  645.                            HICON   *phiconLarge,
  646.                            HICON   *phiconSmall,
  647.                            UINT    nIconSize) PURE;
  648. };
  649. typedef IExtractIconA * LPEXTRACTICONA;
  650. #undef  INTERFACE
  651. #define INTERFACE   IExtractIconW
  652. DECLARE_INTERFACE_(IExtractIconW, IUnknown)     // exic
  653. {
  654.     // *** IUnknown methods ***
  655.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  656.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  657.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  658.     // *** IExtractIcon methods ***
  659.     STDMETHOD(GetIconLocation)(THIS_
  660.                          UINT   uFlags,
  661.                          LPWSTR szIconFile,
  662.                          UINT   cchMax,
  663.                          int   * piIndex,
  664.                          UINT  * pwFlags) PURE;
  665.     STDMETHOD(Extract)(THIS_
  666.                            LPCWSTR pszFile,
  667.                            UINT   nIconIndex,
  668.                            HICON   *phiconLarge,
  669.                            HICON   *phiconSmall,
  670.                            UINT    nIconSize) PURE;
  671. };
  672. typedef IExtractIconW * LPEXTRACTICONW;
  673. #ifdef UNICODE
  674. #define IExtractIcon        IExtractIconW
  675. #define IExtractIconVtbl    IExtractIconWVtbl
  676. #define LPEXTRACTICON       LPEXTRACTICONW
  677. #else
  678. #define IExtractIcon        IExtractIconA
  679. #define IExtractIconVtbl    IExtractIconAVtbl
  680. #define LPEXTRACTICON       LPEXTRACTICONA
  681. #endif
  682. //===========================================================================
  683. //
  684. // IShellIcon Interface
  685. //
  686. // used to get a icon index for a IShellFolder object.
  687. //
  688. // this interface can be implemented by a IShellFolder, as a quick way to
  689. // return the icon for a object in the folder.
  690. //
  691. // a instance of this interface is only created once for the folder, unlike
  692. // IExtractIcon witch is created once for each object.
  693. //
  694. // if a ShellFolder does not implement this interface, the standard
  695. // GetUIObject(....IExtractIcon) method will be used to get a icon
  696. // for all objects.
  697. //
  698. // the following standard imagelist indexs can be returned:
  699. //
  700. //      0   document (blank page) (not associated)
  701. //      1   document (with stuff on the page)
  702. //      2   application (exe, com, bat)
  703. //      3   folder (plain)
  704. //      4   folder (open)
  705. //
  706. // IShellIcon:GetIconOf(pidl, flags, lpIconIndex)
  707. //
  708. //      pidl            object to get icon for.
  709. //      flags           GIL_* input flags (GIL_OPEN, ...)
  710. //      lpIconIndex     place to return icon index.
  711. //
  712. //  returns:
  713. //      NOERROR, if lpIconIndex contains the correct system imagelist index.
  714. //      S_FALSE, if unable to get icon for this object, go through
  715. //               GetUIObject, IExtractIcon, methods.
  716. //
  717. //===========================================================================
  718. #undef  INTERFACE
  719. #define INTERFACE   IShellIcon
  720. DECLARE_INTERFACE_(IShellIcon, IUnknown)      // shi
  721. {
  722.     // *** IUnknown methods ***
  723.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  724.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  725.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  726.     // *** IShellIcon methods ***
  727.     STDMETHOD(GetIconOf)(THIS_ LPCITEMIDLIST pidl, UINT flags,
  728.                     LPINT lpIconIndex) PURE;
  729. };
  730. typedef IShellIcon *LPSHELLICON;
  731. //===========================================================================
  732. //
  733. // IShellIconOverlayIdentifier
  734. //
  735. // Used to identify a file as a member of the group of files that have this specific
  736. // icon overlay
  737. //
  738. // Users can create new IconOverlayIdentifiers and place them in the following registry
  739. // location together with the Icon overlay image and their priority.
  740. // HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\ShellIconOverlayIdentifiers"
  741. //
  742. // The shell will enumerate through all IconOverlayIdentifiers at start, and prioritize
  743. // them according to internal rules, in case the internal rules don't apply, we use their
  744. // input priority
  745. //
  746. // IShellIconOverlayIdentifier:IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib)
  747. //      pwszPath        full path of the file
  748. //      dwAttrib        attribute of this file
  749. //
  750. //  returns:
  751. //      S_OK,    if the file is a member
  752. //      S_FALSE, if the file is not a member
  753. //      E_FAIL,  if the operation failed due to bad WIN32_FIND_DATA
  754. //
  755. // IShellIconOverlayIdentifier::GetOverlayInfo(LPWSTR pwszIconFile, int * pIndex, DWORD * dwFlags) PURE;
  756. //      pszIconFile    the path of the icon file
  757. //      pIndex         Depend on the flags, this could contain the IconIndex
  758. //      dwFlags        defined below
  759. //
  760. // IShellIconOverlayIdentifier::GetPriority(int * pIPriority) PURE;
  761. //      pIPriority     the priority of this Overlay Identifier
  762. //
  763. //===========================================================================
  764. #undef  INTERFACE
  765. #define INTERFACE   IShellIconOverlayIdentifier
  766. DECLARE_INTERFACE_(IShellIconOverlayIdentifier, IUnknown)
  767. {
  768.     // *** IUnknown methods ***
  769.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  770.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  771.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  772.     // *** IShellIconOverlayIdentifier methods ***
  773.     STDMETHOD (IsMemberOf)(THIS_ LPCWSTR pwszPath, DWORD dwAttrib) PURE;
  774.     STDMETHOD (GetOverlayInfo)(THIS_ LPWSTR pwszIconFile, int cchMax, int * pIndex, DWORD * pdwFlags) PURE;
  775.     STDMETHOD (GetPriority)(THIS_ int * pIPriority) PURE;
  776. };
  777. #define ISIOI_ICONFILE            0x00000001          // path is returned through pwszIconFile
  778. #define ISIOI_ICONINDEX           0x00000002          // icon index in pwszIconFile is returned through pIndex
  779. //===========================================================================
  780. //
  781. // IShellIconOverlay
  782. //
  783. // Used to return the icon overlay index or its icon index for an IShellFolder object,
  784. // this is always implemented with IShellFolder
  785. //
  786. // IShellIconOverlay:GetOverlayIndex(LPCITEMIDLIST pidl, DWORD * pdwIndex)
  787. //      pidl            object to identify icon overlay for.
  788. //      pdwIndex        the Overlay Index in the system image list
  789. //
  790. // IShellIconOverlay:GetOverlayIconIndex(LPCITEMIDLIST pidl, DWORD * pdwIndex)
  791. //      pdwIconIndex    the Overlay Icon index in the system image list
  792. // This method is only used for those who are interested in seeing the real bits
  793. // of the Overlay Icon
  794. //
  795. //  returns:
  796. //      S_OK,  if the index of an Overlay is found
  797. //      S_FALSE, if no Overlay exists for this file
  798. //      E_FAIL, if pidl is bad
  799. //
  800. //===========================================================================
  801. #undef  INTERFACE
  802. #define INTERFACE   IShellIconOverlay
  803. DECLARE_INTERFACE_(IShellIconOverlay, IUnknown)
  804. {
  805.     // *** IUnknown methods ***
  806.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  807.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  808.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  809.     // *** IShellIconOverlay methods ***
  810.     STDMETHOD(GetOverlayIndex)(THIS_ LPCITEMIDLIST pidl, int * pIndex) PURE;
  811.     STDMETHOD(GetOverlayIconIndex)(THIS_ LPCITEMIDLIST pidl, int * pIconIndex) PURE;
  812. };
  813. #define OI_ASYNC 0xFFFFEEEE
  814. //-------------------------------------------------------------------------
  815. //
  816. // SHGetIconOverlayIndex
  817. //
  818. // This function takes the path and icon/res id to the icon and convert it into
  819. // an overlay index in the system image list.
  820. // Note: there are totally only 15 slots for system image overlays, some of which
  821. // was reserved by the system, or taken by the overlayidentifiers, so it's possible
  822. // that this function would fail and return -1;
  823. //
  824. // To get the default overlays in the system, such as the share hand, link shortcut
  825. // and slow files, pass NULL as the file name, then the IDO_SHGIOI_* flags as the icon index
  826. //-------------------------------------------------------------------------
  827. #define IDO_SHGIOI_SHARE  0x0FFFFFFF
  828. #define IDO_SHGIOI_LINK   0x0FFFFFFE
  829. #define IDO_SHGIOI_SLOWFILE 0x0FFFFFFFD
  830. SHSTDAPI_(int) SHGetIconOverlayIndexA(LPCSTR pszIconPath, int iIconIndex);
  831. SHSTDAPI_(int) SHGetIconOverlayIndexW(LPCWSTR pszIconPath, int iIconIndex);
  832. #ifdef UNICODE
  833. #define SHGetIconOverlayIndex  SHGetIconOverlayIndexW
  834. #else
  835. #define SHGetIconOverlayIndex  SHGetIconOverlayIndexA
  836. #endif // !UNICODE
  837. #if (_WIN32_IE >= 0x0400)
  838. // IShellLinkDataList::GetFlags()/SetFlags()
  839. typedef enum {
  840.    SLDF_HAS_ID_LIST         = 0x00000001,   // Shell link saved with ID list
  841.    SLDF_HAS_LINK_INFO       = 0x00000002,   // Shell link saved with LinkInfo
  842.    SLDF_HAS_NAME            = 0x00000004,
  843.    SLDF_HAS_RELPATH         = 0x00000008,
  844.    SLDF_HAS_WORKINGDIR      = 0x00000010,
  845.    SLDF_HAS_ARGS            = 0x00000020,
  846.    SLDF_HAS_ICONLOCATION    = 0x00000040,
  847.    SLDF_UNICODE             = 0x00000080,   // the strings are unicode
  848.    SLDF_FORCE_NO_LINKINFO   = 0x00000100,   // don't create a LINKINFO (make a dumb link)
  849.    SLDF_HAS_EXP_SZ          = 0x00000200,   // the link contains expandable env strings
  850.    SLDF_RUN_IN_SEPARATE     = 0x00000400,   // Run the 16-bit target exe in a separate VDM/WOW
  851.    SLDF_HAS_LOGO3ID         = 0x00000800,   // this link is a special Logo3/MSICD link
  852.    SLDF_HAS_DARWINID        = 0x00001000,   // this link is a special Darwin link
  853.    SLDF_RUNAS_USER          = 0x00002000,   // Run this link as a different user
  854.    SLDF_HAS_EXP_ICON_SZ     = 0x00004000,   // contains expandable env string for icon path
  855.    SLDF_NO_PIDL_ALIAS       = 0x00008000,   // don't ever resolve to a logical location
  856.    SLDF_FORCE_UNCNAME       = 0x00010000,   // make GetPath() prefer the UNC name to the local name
  857.    SLDF_RUN_WITH_SHIMLAYER  = 0x00020000,   // Launch the target of this link w/ shim layer active
  858.    SLDF_RESERVED            = 0x80000000,   // Reserved-- so we can use the low word as an index value in the future
  859. } SHELL_LINK_DATA_FLAGS;
  860. typedef struct tagDATABLOCKHEADER
  861. {
  862.     DWORD   cbSize;             // Size of this extra data block
  863.     DWORD   dwSignature;        // signature of this extra data block
  864. } DATABLOCK_HEADER, *LPDATABLOCK_HEADER, *LPDBLIST;
  865. typedef struct {
  866. #ifdef __cplusplus
  867.     DATABLOCK_HEADER dbh;
  868. #else
  869.     DATABLOCK_HEADER;
  870. #endif
  871.     WORD     wFillAttribute;         // fill attribute for console
  872.     WORD     wPopupFillAttribute;    // fill attribute for console popups
  873.     COORD    dwScreenBufferSize;     // screen buffer size for console
  874.     COORD    dwWindowSize;           // window size for console
  875.     COORD    dwWindowOrigin;         // window origin for console
  876.     DWORD    nFont;
  877.     DWORD    nInputBufferSize;
  878.     COORD    dwFontSize;
  879.     UINT     uFontFamily;
  880.     UINT     uFontWeight;
  881.     WCHAR    FaceName[LF_FACESIZE];
  882.     UINT     uCursorSize;
  883.     BOOL     bFullScreen;
  884.     BOOL     bQuickEdit;
  885.     BOOL     bInsertMode;
  886.     BOOL     bAutoPosition;
  887.     UINT     uHistoryBufferSize;
  888.     UINT     uNumberOfHistoryBuffers;
  889.     BOOL     bHistoryNoDup;
  890.     COLORREF ColorTable[ 16 ];
  891. } NT_CONSOLE_PROPS, *LPNT_CONSOLE_PROPS;
  892. #define NT_CONSOLE_PROPS_SIG 0xA0000002
  893. // This is a FE Console property
  894. typedef struct {
  895. #ifdef __cplusplus
  896.     DATABLOCK_HEADER dbh;
  897. #else
  898.     DATABLOCK_HEADER;
  899. #endif
  900.     UINT     uCodePage;
  901. } NT_FE_CONSOLE_PROPS, *LPNT_FE_CONSOLE_PROPS;
  902. #define NT_FE_CONSOLE_PROPS_SIG 0xA0000004
  903. #if (_WIN32_IE >= 0x0500)
  904. typedef struct {
  905. #ifdef __cplusplus
  906.     DATABLOCK_HEADER dbh;
  907. #else
  908.     DATABLOCK_HEADER;
  909. #endif
  910.     CHAR        szDarwinID[MAX_PATH];  // ANSI darwin ID associated with link
  911.     WCHAR       szwDarwinID[MAX_PATH]; // UNICODE darwin ID associated with link
  912. } EXP_DARWIN_LINK, *LPEXP_DARWIN_LINK;
  913. #define EXP_DARWIN_ID_SIG       0xA0000006
  914. // BUGBUG (reinerf) - this has the same value as EXP_SZ_ICON_SIG?!?!?!
  915. #define EXP_LOGO3_ID_SIG        0xA0000007
  916. #endif
  917. #define EXP_SPECIAL_FOLDER_SIG         0xA0000005   // LPEXP_SPECIAL_FOLDER
  918. typedef struct
  919. {
  920.     DWORD       cbSize;             // Size of this extra data block
  921.     DWORD       dwSignature;        // signature of this extra data block
  922.     DWORD       idSpecialFolder;    // special folder id this link points into
  923.     DWORD       cbOffset;           // ofset into pidl from SLDF_HAS_ID_LIST for child
  924. } EXP_SPECIAL_FOLDER, *LPEXP_SPECIAL_FOLDER;
  925. typedef struct
  926. {
  927.     DWORD       cbSize;             // Size of this extra data block
  928.     DWORD       dwSignature;        // signature of this extra data block
  929.     CHAR        szTarget[ MAX_PATH ];   // ANSI target name w/EXP_SZ in it
  930.     WCHAR       swzTarget[ MAX_PATH ];  // UNICODE target name w/EXP_SZ in it
  931. } EXP_SZ_LINK, *LPEXP_SZ_LINK;
  932. #define EXP_SZ_LINK_SIG                0xA0000001   // LPEXP_SZ_LINK (target)
  933. #define EXP_SZ_ICON_SIG                0xA0000007   // LPEXP_SZ_LINK (icon)
  934. #undef  INTERFACE
  935. #define INTERFACE IShellLinkDataList
  936. DECLARE_INTERFACE_(IShellLinkDataList, IUnknown)
  937. {
  938.     // *** IUnknown methods ***
  939.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  940.     STDMETHOD_(ULONG, AddRef) (THIS)  PURE;
  941.     STDMETHOD_(ULONG, Release) (THIS) PURE;
  942.     // *** IShellLinkDataList methods ***
  943.     STDMETHOD(AddDataBlock)(THIS_ void * pDataBlock) PURE;
  944.     STDMETHOD(CopyDataBlock)(THIS_ DWORD dwSig, void **ppDataBlock) PURE;
  945.     STDMETHOD(RemoveDataBlock)(THIS_ DWORD dwSig) PURE;
  946.     STDMETHOD(GetFlags)(THIS_ DWORD *pdwFlags) PURE;
  947.     STDMETHOD(SetFlags)(THIS_ DWORD dwFlags) PURE;
  948. };
  949. #endif // (_WIN32_IE >= 0x0400)
  950. #if (_WIN32_IE >= 0x0500)
  951. #undef  INTERFACE
  952. #define INTERFACE IResolveShellLink
  953. DECLARE_INTERFACE_(IResolveShellLink, IUnknown)
  954. {
  955.     // *** IUnknown methods ***
  956.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  957.     STDMETHOD_(ULONG, AddRef) (THIS)  PURE;
  958.     STDMETHOD_(ULONG, Release) (THIS) PURE;
  959.     // *** IResolveShellLink methods ***
  960.     STDMETHOD(ResolveShellLink)(THIS_ IUnknown* punk, HWND hwnd, DWORD fFlags) PURE;
  961. };
  962. #endif // (_WIN32_IE >= 0x0500)
  963. #ifdef _INC_SHELLAPI    /* for LPSHELLEXECUTEINFO */
  964. //===========================================================================
  965. //
  966. // IShellExecuteHook Interface
  967. //
  968. //===========================================================================
  969. #undef  INTERFACE
  970. #define INTERFACE   IShellExecuteHookA
  971. DECLARE_INTERFACE_(IShellExecuteHookA, IUnknown) // shexhk
  972. {
  973.     // *** IUnknown methods ***
  974.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  975.     STDMETHOD_(ULONG, AddRef) (THIS)  PURE;
  976.     STDMETHOD_(ULONG, Release) (THIS) PURE;
  977.     // *** IShellExecuteHookA methods ***
  978.     STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOA pei) PURE;
  979. };
  980. #undef  INTERFACE
  981. #define INTERFACE   IShellExecuteHookW
  982. DECLARE_INTERFACE_(IShellExecuteHookW, IUnknown) // shexhk
  983. {
  984.     // *** IUnknown methods ***
  985.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  986.     STDMETHOD_(ULONG, AddRef) (THIS)  PURE;
  987.     STDMETHOD_(ULONG, Release) (THIS) PURE;
  988.     // *** IShellExecuteHookW methods ***
  989.     STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOW pei) PURE;
  990. };
  991. #ifdef UNICODE
  992. #define IShellExecuteHook       IShellExecuteHookW
  993. #define IShellExecuteHookVtbl   IShellExecuteHookWVtbl
  994. #else
  995. #define IShellExecuteHook       IShellExecuteHookA
  996. #define IShellExecuteHookVtbl   IShellExecuteHookAVtbl
  997. #endif
  998. #endif
  999. //===========================================================================
  1000. //
  1001. // IURLSearchHook Interface
  1002. //
  1003. //===========================================================================
  1004. #undef  INTERFACE
  1005. #define INTERFACE   IURLSearchHook
  1006. DECLARE_INTERFACE_(IURLSearchHook, IUnknown)
  1007. {
  1008.     // *** IUnknown methods ***
  1009.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  1010.     STDMETHOD_(ULONG, AddRef) (THIS)  PURE;
  1011.     STDMETHOD_(ULONG, Release) (THIS) PURE;
  1012.     // *** IURLSearchHook methods ***
  1013.     STDMETHOD(Translate)(THIS_ LPWSTR lpwszSearchURL, DWORD cchBufferSize) PURE;
  1014. };
  1015. #undef  INTERFACE
  1016. #define INTERFACE   ISearchContext
  1017. DECLARE_INTERFACE_(ISearchContext, IUnknown)
  1018. {
  1019.     // *** IUnknown methods ***
  1020.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  1021.     STDMETHOD_(ULONG, AddRef) (THIS)  PURE;
  1022.     STDMETHOD_(ULONG, Release) (THIS) PURE;
  1023.     // *** ISearchContext methods ***
  1024.     STDMETHOD(GetSearchUrl)(THIS_ BSTR * pbstrSearchUrl) PURE;
  1025.     STDMETHOD(GetSearchText)(THIS_ BSTR * pbstrSearchText) PURE;
  1026.     STDMETHOD(GetSearchStyle)(THIS_ DWORD * pdwSearchStyle) PURE;
  1027. };
  1028. #undef  INTERFACE
  1029. #define INTERFACE   IURLSearchHook2
  1030. DECLARE_INTERFACE_(IURLSearchHook2, IURLSearchHook)
  1031. {
  1032.     // *** IURLSearchHook2 methods ***
  1033.     STDMETHOD(TranslateWithSearchContext)(THIS_ LPWSTR lpwszSearchURL, DWORD cchBufferSize, ISearchContext * pSearchContext) PURE;
  1034. };
  1035. //===========================================================================
  1036. //
  1037. // INewShortcutHook Interface
  1038. //
  1039. //===========================================================================
  1040. #undef  INTERFACE
  1041. #define INTERFACE   INewShortcutHookA
  1042. DECLARE_INTERFACE_(INewShortcutHookA, IUnknown) // nshhk
  1043. {
  1044.     // *** IUnknown methods ***
  1045.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  1046.     STDMETHOD_(ULONG, AddRef) (THIS)  PURE;
  1047.     STDMETHOD_(ULONG, Release) (THIS) PURE;
  1048.     // *** INewShortcutHook methods ***
  1049.     STDMETHOD(SetReferent)(THIS_ LPCSTR pcszReferent, HWND hwnd) PURE;
  1050.     STDMETHOD(GetReferent)(THIS_ LPSTR pszReferent, int cchReferent) PURE;
  1051.     STDMETHOD(SetFolder)(THIS_ LPCSTR pcszFolder) PURE;
  1052.     STDMETHOD(GetFolder)(THIS_ LPSTR pszFolder, int cchFolder) PURE;
  1053.     STDMETHOD(GetName)(THIS_ LPSTR pszName, int cchName) PURE;
  1054.     STDMETHOD(GetExtension)(THIS_ LPSTR pszExtension, int cchExtension) PURE;
  1055. };
  1056. #undef  INTERFACE
  1057. #define INTERFACE   INewShortcutHookW
  1058. DECLARE_INTERFACE_(INewShortcutHookW, IUnknown) // nshhk
  1059. {
  1060.     // *** IUnknown methods ***
  1061.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  1062.     STDMETHOD_(ULONG, AddRef) (THIS)  PURE;
  1063.     STDMETHOD_(ULONG, Release) (THIS) PURE;
  1064.     // *** INewShortcutHook methods ***
  1065.     STDMETHOD(SetReferent)(THIS_ LPCWSTR pcszReferent, HWND hwnd) PURE;
  1066.     STDMETHOD(GetReferent)(THIS_ LPWSTR pszReferent, int cchReferent) PURE;
  1067.     STDMETHOD(SetFolder)(THIS_ LPCWSTR pcszFolder) PURE;
  1068.     STDMETHOD(GetFolder)(THIS_ LPWSTR pszFolder, int cchFolder) PURE;
  1069.     STDMETHOD(GetName)(THIS_ LPWSTR pszName, int cchName) PURE;
  1070.     STDMETHOD(GetExtension)(THIS_ LPWSTR pszExtension, int cchExtension) PURE;
  1071. };
  1072. #ifdef UNICODE
  1073. #define INewShortcutHook        INewShortcutHookW
  1074. #define INewShortcutHookVtbl    INewShortcutHookWVtbl
  1075. #else
  1076. #define INewShortcutHook        INewShortcutHookA
  1077. #define INewShortcutHookVtbl    INewShortcutHookAVtbl
  1078. #endif
  1079. //===========================================================================
  1080. //
  1081. // ICopyHook Interface
  1082. //
  1083. //  The copy hook is called whenever file system directories are
  1084. //  copy/moved/deleted/renamed via the shell.  It is also called by the shell
  1085. //  on changes of status of printers.
  1086. //
  1087. //  Clients register their id under STRREG_SHEX_COPYHOOK for file system hooks
  1088. //  and STRREG_SHEx_PRNCOPYHOOK for printer hooks.
  1089. //  the CopyCallback is called prior to the action, so the hook has the chance
  1090. //  to allow, deny or cancel the operation by returning the falues:
  1091. //     IDYES  -  means allow the operation
  1092. //     IDNO   -  means disallow the operation on this file, but continue with
  1093. //              any other operations (eg. batch copy)
  1094. //     IDCANCEL - means disallow the current operation and cancel any pending
  1095. //              operations
  1096. //
  1097. //   arguments to the CopyCallback
  1098. //      hwnd - window to use for any UI
  1099. //      wFunc - what operation is being done
  1100. //      wFlags - and flags (FOF_*) set in the initial call to the file operation
  1101. //      pszSrcFile - name of the source file
  1102. //      dwSrcAttribs - file attributes of the source file
  1103. //      pszDestFile - name of the destiation file (for move and renames)
  1104. //      dwDestAttribs - file attributes of the destination file
  1105. //
  1106. //
  1107. //===========================================================================
  1108. #ifndef FO_MOVE //these need to be kept in sync with the ones in shellapi.h
  1109. // file operations
  1110. #define FO_MOVE           0x0001
  1111. #define FO_COPY           0x0002
  1112. #define FO_DELETE         0x0003
  1113. #define FO_RENAME         0x0004
  1114. #define FOF_MULTIDESTFILES         0x0001
  1115. #define FOF_CONFIRMMOUSE           0x0002
  1116. #define FOF_SILENT                 0x0004  // don't create progress/report
  1117. #define FOF_RENAMEONCOLLISION      0x0008
  1118. #define FOF_NOCONFIRMATION         0x0010  // Don't prompt the user.
  1119. #define FOF_WANTMAPPINGHANDLE      0x0020  // Fill in SHFILEOPSTRUCT.hNameMappings
  1120.                                       // Must be freed using SHFreeNameMappings
  1121. #define FOF_ALLOWUNDO              0x0040
  1122. #define FOF_FILESONLY              0x0080  // on *.*, do only files
  1123. #define FOF_SIMPLEPROGRESS         0x0100  // means don't show names of files
  1124. #define FOF_NOCONFIRMMKDIR         0x0200  // don't confirm making any needed dirs
  1125. #define FOF_NOERRORUI              0x0400  // don't put up error UI
  1126. #define FOF_NOCOPYSECURITYATTRIBS  0x0800  // dont copy NT file Security Attributes
  1127. #define FOF_NORECURSION            0x1000  // don't recurse into directories.
  1128. #if (_WIN32_IE >= 0x500)
  1129. #define FOF_NO_CONNECTED_ELEMENTS  0x2000  // don't operate on connected file elements.
  1130. #define FOF_WANTNUKEWARNING        0x4000  // during delete operation, warn if nuking instead of recycling (partially overrides FOF_NOCONFIRMATION)
  1131. #endif // _WIN32_IE >= 0x500
  1132. #if (_WIN32_WINNT >= 0x0501)
  1133. #define FOF_NORECURSEREPARSE       0x8000  // treat reparse points as objects, not containers
  1134. #endif // (_WIN32_WINNT >= 0x501)
  1135. typedef WORD FILEOP_FLAGS;
  1136. // printer operations
  1137. #define PO_DELETE       0x0013  // printer is being deleted
  1138. #define PO_RENAME       0x0014  // printer is being renamed
  1139. #define PO_PORTCHANGE   0x0020  // port this printer connected to is being changed
  1140.                                 // if this id is set, the strings received by
  1141.                                 // the copyhook are a doubly-null terminated
  1142.                                 // list of strings.  The first is the printer
  1143.                                 // name and the second is the printer port.
  1144. #define PO_REN_PORT     0x0034  // PO_RENAME and PO_PORTCHANGE at same time.
  1145. // no POF_ flags currently defined
  1146. typedef UINT PRINTEROP_FLAGS;
  1147. #endif // FO_MOVE
  1148. #undef  INTERFACE
  1149. #define INTERFACE   ICopyHookA
  1150. DECLARE_INTERFACE_(ICopyHookA, IUnknown)        // sl
  1151. {
  1152.     // *** IUnknown methods ***
  1153.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  1154.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  1155.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  1156.     // *** ICopyHook methods ***
  1157.     STDMETHOD_(UINT,CopyCallback) (THIS_ HWND hwnd, UINT wFunc, UINT wFlags, LPCSTR pszSrcFile, DWORD dwSrcAttribs,
  1158.                                    LPCSTR pszDestFile, DWORD dwDestAttribs) PURE;
  1159. };
  1160. typedef ICopyHookA *    LPCOPYHOOKA;
  1161. #undef  INTERFACE
  1162. #define INTERFACE   ICopyHookW
  1163. DECLARE_INTERFACE_(ICopyHookW, IUnknown)        // sl
  1164. {
  1165.     // *** IUnknown methods ***
  1166.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  1167.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  1168.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  1169.     // *** ICopyHook methods ***
  1170.     STDMETHOD_(UINT,CopyCallback) (THIS_ HWND hwnd, UINT wFunc, UINT wFlags, LPCWSTR pszSrcFile, DWORD dwSrcAttribs,
  1171.                                    LPCWSTR pszDestFile, DWORD dwDestAttribs) PURE;
  1172. };
  1173. typedef ICopyHookW *    LPCOPYHOOKW;
  1174. #ifdef UNICODE
  1175. #define ICopyHook       ICopyHookW
  1176. #define ICopyHookVtbl   ICopyHookWVtbl
  1177. #define LPCOPYHOOK      LPCOPYHOOKW
  1178. #else
  1179. #define ICopyHook       ICopyHookA
  1180. #define ICopyHookVtbl   ICopyHookAVtbl
  1181. #define LPCOPYHOOK      LPCOPYHOOKA
  1182. #endif
  1183. //===========================================================================
  1184. //
  1185. // IFileViewerSite Interface
  1186. //
  1187. //===========================================================================
  1188. #undef  INTERFACE
  1189. #define INTERFACE   IFileViewerSite
  1190. DECLARE_INTERFACE_(IFileViewerSite, IUnknown)
  1191. {
  1192.     // *** IUnknown methods ***
  1193.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  1194.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  1195.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  1196.     // *** IFileViewerSite methods ***
  1197.     STDMETHOD(SetPinnedWindow) (THIS_ HWND hwnd) PURE;
  1198.     STDMETHOD(GetPinnedWindow) (THIS_ HWND *phwnd) PURE;
  1199. };
  1200. typedef IFileViewerSite * LPFILEVIEWERSITE;
  1201. //===========================================================================
  1202. //
  1203. // IFileViewer Interface
  1204. //
  1205. // Implemented in a FileViewer component object.  Used to tell a
  1206. // FileViewer to PrintTo or to view, the latter happening though
  1207. // ShowInitialize and Show.  The filename is always given to the
  1208. // viewer through IPersistFile.
  1209. //
  1210. //===========================================================================
  1211. #include <pshpack8.h>
  1212. typedef struct
  1213. {
  1214.     // Stuff passed into viewer (in)
  1215.     DWORD cbSize;           // Size of structure for future expansion...
  1216.     HWND hwndOwner;         // who is the owner window.
  1217.     int iShow;              // The show command
  1218.     // Passed in and updated  (in/Out)
  1219.     DWORD dwFlags;          // flags
  1220.     RECT rect;              // Where to create the window may have defaults
  1221.     IUnknown *punkRel;      // Relese this interface when window is visible
  1222.     // Stuff that might be returned from viewer (out)
  1223.     OLECHAR strNewFile[MAX_PATH];   // New File to view.
  1224. } FVSHOWINFO, *LPFVSHOWINFO;
  1225. #include <poppack.h>        /* Return to byte packing */
  1226.     // Define File View Show Info Flags.
  1227. #define FVSIF_RECT      0x00000001      // The rect variable has valid data.
  1228. #define FVSIF_PINNED    0x00000002      // We should Initialize pinned
  1229. #define FVSIF_NEWFAILED 0x08000000      // The new file passed back failed
  1230.                                         // to be viewed.
  1231. #define FVSIF_NEWFILE   0x80000000      // A new file to view has been returned
  1232. #define FVSIF_CANVIEWIT 0x40000000      // The viewer can view it.
  1233. #undef  INTERFACE
  1234. #define INTERFACE   IFileViewerA
  1235. DECLARE_INTERFACE(IFileViewerA)
  1236. {
  1237.     // *** IUnknown methods ***
  1238.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  1239.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  1240.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  1241.     // *** IFileViewer methods ***
  1242.     STDMETHOD(ShowInitialize) (THIS_ LPFILEVIEWERSITE lpfsi) PURE;
  1243.     STDMETHOD(Show) (THIS_ LPFVSHOWINFO pvsi) PURE;
  1244.     STDMETHOD(PrintTo) (THIS_ LPSTR pszDriver, BOOL fSuppressUI) PURE;
  1245. };
  1246. typedef IFileViewerA * LPFILEVIEWERA;
  1247. #undef  INTERFACE
  1248. #define INTERFACE   IFileViewerW
  1249. DECLARE_INTERFACE(IFileViewerW)
  1250. {
  1251.     // *** IUnknown methods ***
  1252.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  1253.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  1254.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  1255.     // *** IFileViewer methods ***
  1256.     STDMETHOD(ShowInitialize) (THIS_ LPFILEVIEWERSITE lpfsi) PURE;
  1257.     STDMETHOD(Show) (THIS_ LPFVSHOWINFO pvsi) PURE;
  1258.     STDMETHOD(PrintTo) (THIS_ LPWSTR pszDriver, BOOL fSuppressUI) PURE;
  1259. };
  1260. typedef IFileViewerW * LPFILEVIEWERW;
  1261. #ifdef UNICODE
  1262. #define IFileViewer IFileViewerW
  1263. #define LPFILEVIEWER LPFILEVIEWERW
  1264. #else
  1265. #define IFileViewer IFileViewerA
  1266. #define LPFILEVIEWER LPFILEVIEWERA
  1267. #endif
  1268. //==========================================================================
  1269. //
  1270. // IShellBrowser/IShellView/IShellFolder interface
  1271. //
  1272. //  These three interfaces are used when the shell communicates with
  1273. // name space extensions. The shell (explorer) provides IShellBrowser
  1274. // interface, and extensions implements IShellFolder and IShellView
  1275. // interfaces.
  1276. //
  1277. //==========================================================================
  1278. //--------------------------------------------------------------------------
  1279. //
  1280. // Command/menuitem IDs
  1281. //
  1282. //  The explorer dispatches WM_COMMAND messages based on the range of
  1283. // command/menuitem IDs. All the IDs of menuitems that the view (right
  1284. // pane) inserts must be in FCIDM_SHVIEWFIRST/LAST (otherwise, the explorer
  1285. // won't dispatch them). The view should not deal with any menuitems
  1286. // in FCIDM_BROWSERFIRST/LAST (otherwise, it won't work with the future
  1287. // version of the shell).
  1288. //
  1289. //  FCIDM_SHVIEWFIRST/LAST      for the right pane (IShellView)
  1290. //  FCIDM_BROWSERFIRST/LAST     for the explorer frame (IShellBrowser)
  1291. //  FCIDM_GLOBAL/LAST           for the explorer's submenu IDs
  1292. //
  1293. //--------------------------------------------------------------------------
  1294. #define FCIDM_SHVIEWFIRST           0x0000
  1295. #define FCIDM_SHVIEWLAST            0x7fff
  1296. #define FCIDM_BROWSERFIRST          0xa000
  1297. #define FCIDM_BROWSERLAST           0xbf00
  1298. #define FCIDM_GLOBALFIRST           0x8000
  1299. #define FCIDM_GLOBALLAST            0x9fff
  1300. //
  1301. // Global submenu IDs and separator IDs
  1302. //
  1303. #define FCIDM_MENU_FILE             (FCIDM_GLOBALFIRST+0x0000)
  1304. #define FCIDM_MENU_EDIT             (FCIDM_GLOBALFIRST+0x0040)
  1305. #define FCIDM_MENU_VIEW             (FCIDM_GLOBALFIRST+0x0080)
  1306. #define FCIDM_MENU_VIEW_SEP_OPTIONS (FCIDM_GLOBALFIRST+0x0081)
  1307. #define FCIDM_MENU_TOOLS            (FCIDM_GLOBALFIRST+0x00c0) // for Win9x compat
  1308. #define FCIDM_MENU_TOOLS_SEP_GOTO   (FCIDM_GLOBALFIRST+0x00c1) // for Win9x compat
  1309. #define FCIDM_MENU_HELP             (FCIDM_GLOBALFIRST+0x0100)
  1310. #define FCIDM_MENU_FIND             (FCIDM_GLOBALFIRST+0x0140)
  1311. #define FCIDM_MENU_EXPLORE          (FCIDM_GLOBALFIRST+0x0150)
  1312. #define FCIDM_MENU_FAVORITES        (FCIDM_GLOBALFIRST+0x0170)
  1313. //--------------------------------------------------------------------------
  1314. // control IDs known to the view
  1315. //--------------------------------------------------------------------------
  1316. #define FCIDM_TOOLBAR      (FCIDM_BROWSERFIRST + 0)
  1317. #define FCIDM_STATUS       (FCIDM_BROWSERFIRST + 1)
  1318. #if (_WIN32_IE >= 0x0400)
  1319. //--------------------------------------------------------------------------
  1320. //
  1321. // The resource id of the offline cursor
  1322. // This cursor is avaialble in shdocvw.dll
  1323. #define IDC_OFFLINE_HAND        103
  1324. //
  1325. //--------------------------------------------------------------------------
  1326. #endif
  1327. //-------------------------------------------------------------------------
  1328. // ICommDlgBrowser interface
  1329. //
  1330. //  ICommDlgBrowser interface is the interface that is provided by the new
  1331. // common dialog window to hook and modify the behavior of IShellView.  When
  1332. // a default view is created, it queries its parent IShellBrowser for the
  1333. // ICommDlgBrowser interface.  If supported, it calls out to that interface
  1334. // in several cases that need to behave differently in a dialog.
  1335. //
  1336. // Member functions:
  1337. //
  1338. //  ICommDlgBrowser::OnDefaultCommand()
  1339. //    Called when the user double-clicks in the view or presses Enter.  The
  1340. //   browser should return S_OK if it processed the action itself, S_FALSE
  1341. //   to let the view perform the default action.
  1342. //
  1343. //  ICommDlgBrowser::OnStateChange(ULONG uChange)
  1344. //    Called when some states in the view change.  'uChange' is one of the
  1345. //   CDBOSC_* values.  This call is made after the state (selection, focus,
  1346. //   etc) has changed.  There is no return value.
  1347. //
  1348. //  ICommDlgBrowser::IncludeObject(LPCITEMIDLIST pidl)
  1349. //    Called when the view is enumerating objects.  'pidl' is a relative
  1350. //   IDLIST.  The browser should return S_OK to include the object in the
  1351. //   view, S_FALSE to hide it
  1352. //
  1353. //-------------------------------------------------------------------------
  1354. #define CDBOSC_SETFOCUS     0x00000000
  1355. #define CDBOSC_KILLFOCUS    0x00000001
  1356. #define CDBOSC_SELCHANGE    0x00000002
  1357. #define CDBOSC_RENAME       0x00000003
  1358. #define CDBOSC_STATECHANGE  0x00000004
  1359. #undef  INTERFACE
  1360. #define INTERFACE   ICommDlgBrowser
  1361. DECLARE_INTERFACE_(ICommDlgBrowser, IUnknown)
  1362. {
  1363.     // *** IUnknown methods ***
  1364.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  1365.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  1366.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  1367.     // *** ICommDlgBrowser methods ***
  1368.     STDMETHOD(OnDefaultCommand) (THIS_ struct IShellView * ppshv) PURE;
  1369.     STDMETHOD(OnStateChange) (THIS_ struct IShellView * ppshv,
  1370.                 ULONG uChange) PURE;
  1371.     STDMETHOD(IncludeObject) (THIS_ struct IShellView * ppshv,
  1372.                 LPCITEMIDLIST pidl) PURE;
  1373. };
  1374. typedef ICommDlgBrowser * LPCOMMDLGBROWSER;
  1375. //-------------------------------------------------------------------------
  1376. // ICommDlgBrowser2 interface
  1377. //
  1378. // Member functions:
  1379. //
  1380. //  ICommDlgBrowser2::Notify(IShellView *pshv, DWORD dwNotfyType)
  1381. //   Called when the view is wants to notify common dialog when an event
  1382. //  occurrs.
  1383. //
  1384. //  CDB2N_CONTEXTMENU_START indicates the context menu has started.
  1385. //  CDB2N_CONTEXTMENU_DONE  indicates the context menu has completed.
  1386. //
  1387. //  ICommDlgBrowser2::GetDefaultMenuText(IShellView *pshv,
  1388. //                                      WCHAR *pszText, INT cchMax)
  1389. //   Called when the view wants to get the default context menu text.
  1390. //  pszText points to buffer and cchMax specifies the size of the
  1391. //  buffer in characters.  The browser on return has filled the buffer
  1392. //  with the default context menu text.  The Shell will call this method
  1393. //  with at least a buffer size of MAX_PATH.  The browser should return
  1394. //  S_OK if it returned a new default menu text, S_FALSE to let the view
  1395. //  to use the normal default menu text.
  1396. //
  1397. //  ICommDlgBrowser2::GetViewFlags(DWORD *pdwFlags)
  1398. //     Called when the view wants to determine  if special customization needs to
  1399. //    be done for the common dialog browser. For example View calls this function to
  1400. //    determin if all files(hidden and system)needs to be shown. If the GetViewFlags returns a DWORD with
  1401. //    CDB2GVF_SHOWALLFILES  flag set then it will show all the files.
  1402. //-------------------------------------------------------------------------
  1403. #define CDB2N_CONTEXTMENU_DONE  0x00000001
  1404. #define CDB2N_CONTEXTMENU_START 0x00000002
  1405. //GetViewFlags
  1406. #define CDB2GVF_SHOWALLFILES        0x00000001
  1407. #undef  INTERFACE
  1408. #define INTERFACE   ICommDlgBrowser2
  1409. DECLARE_INTERFACE_(ICommDlgBrowser2, IUnknown)
  1410. {
  1411.     // *** IUnknown methods ***
  1412.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
  1413.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  1414.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  1415.     // *** ICommDlgBrowser methods ***
  1416.     STDMETHOD(OnDefaultCommand) (THIS_ struct IShellView * ppshv) PURE;
  1417.     STDMETHOD(OnStateChange) (THIS_ struct IShellView * ppshv,
  1418.                 ULONG uChange) PURE;
  1419.     STDMETHOD(IncludeObject) (THIS_ struct IShellView * ppshv,
  1420.                 LPCITEMIDLIST pidl) PURE;
  1421.     // *** ICommDlgBrowser2 methods ***
  1422.     STDMETHOD(Notify) (THIS_ struct IShellView * ppshv,
  1423.                 DWORD dwNotifyType) PURE;
  1424.     STDMETHOD(GetDefaultMenuText) (THIS_ struct IShellView * ppshv,
  1425.                 WCHAR *pszText, INT cchMax) PURE;
  1426.     STDMETHOD(GetViewFlags)(THIS_ DWORD *pdwFlags) PURE;
  1427. };
  1428. typedef ICommDlgBrowser2 * LPCOMMDLGBROWSER2;
  1429. //
  1430. // function assumes the size of the buffer (MAX_PATH). The pidl
  1431. // should point to a file system object.
  1432. SHSTDAPI_(BOOL) SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath);
  1433. SHSTDAPI_(BOOL) SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath);
  1434. #ifdef UNICODE
  1435. #define SHGetPathFromIDList  SHGetPathFromIDListW
  1436. #else
  1437. #define SHGetPathFromIDList  SHGetPathFromIDListA
  1438. #endif // !UNICODE
  1439. SHSTDAPI_(int) SHCreateDirectoryExA(HWND hwnd, LPCSTR pszPath, SECURITY_ATTRIBUTES *psa);
  1440. SHSTDAPI_(int) SHCreateDirectoryExW(HWND hwnd, LPCWSTR pszPath, SECURITY_ATTRIBUTES *psa);
  1441. #ifdef UNICODE
  1442. #define SHCreateDirectoryEx  SHCreateDirectoryExW
  1443. #else
  1444. #define SHCreateDirectoryEx  SHCreateDirectoryExA
  1445. #endif // !UNICODE
  1446. SHSTDAPI SHOpenFolderAndSelectItems(LPCITEMIDLIST pidlFolder, UINT cidl, LPCITEMIDLIST *apidl, DWORD dwFlags);
  1447. //-------------------------------------------------------------------------
  1448. //
  1449. // SHGetSpecialFolderLocation
  1450. //
  1451. //  Caller should use SHGetMalloc to obtain an allocator that can free the pidl
  1452. //
  1453. //
  1454. //-------------------------------------------------------------------------
  1455. //
  1456. // registry entries for special paths are kept in :
  1457. #define REGSTR_PATH_SPECIAL_FOLDERS    REGSTR_PATH_EXPLORER TEXT("\Shell Folders")
  1458. #define CSIDL_DESKTOP                   0x0000        // <desktop>
  1459. #define CSIDL_INTERNET                  0x0001        // Internet Explorer (icon on desktop)
  1460. #define CSIDL_PROGRAMS                  0x0002        // Start MenuPrograms
  1461. #define CSIDL_CONTROLS                  0x0003        // My ComputerControl Panel
  1462. #define CSIDL_PRINTERS                  0x0004        // My ComputerPrinters
  1463. #define CSIDL_PERSONAL                  0x0005        // My Documents
  1464. #define CSIDL_FAVORITES                 0x0006        // <user name>Favorites
  1465. #define CSIDL_STARTUP                   0x0007        // Start MenuProgramsStartup
  1466. #define CSIDL_RECENT                    0x0008        // <user name>Recent
  1467. #define CSIDL_SENDTO                    0x0009        // <user name>SendTo
  1468. #define CSIDL_BITBUCKET                 0x000a        // <desktop>Recycle Bin
  1469. #define CSIDL_STARTMENU                 0x000b        // <user name>Start Menu
  1470. #define CSIDL_MYDOCUMENTS               0x000c        // logical "My Documents" desktop icon
  1471. #define CSIDL_MYMUSIC                   0x000d        // "My Music" folder
  1472. #define CSIDL_MYVIDEO                   0x000e        // "My Videos" folder
  1473. #define CSIDL_DESKTOPDIRECTORY          0x0010        // <user name>Desktop
  1474. #define CSIDL_DRIVES                    0x0011        // My Computer
  1475. #define CSIDL_NETWORK                   0x0012        // Network Neighborhood (My Network Places)
  1476. #define CSIDL_NETHOOD                   0x0013        // <user name>nethood
  1477. #define CSIDL_FONTS                     0x0014        // windowsfonts
  1478. #define CSIDL_TEMPLATES                 0x0015
  1479. #define CSIDL_COMMON_STARTMENU          0x0016        // All UsersStart Menu
  1480. #define CSIDL_COMMON_PROGRAMS           0X0017        // All UsersStart MenuPrograms
  1481. #define CSIDL_COMMON_STARTUP            0x0018        // All UsersStartup
  1482. #define CSIDL_COMMON_DESKTOPDIRECTORY   0x0019        // All UsersDesktop
  1483. #define CSIDL_APPDATA                   0x001a        // <user name>Application Data
  1484. #define CSIDL_PRINTHOOD                 0x001b        // <user name>PrintHood
  1485. #ifndef CSIDL_LOCAL_APPDATA
  1486. #define CSIDL_LOCAL_APPDATA             0x001c        // <user name>Local SettingsApplicaiton Data (non roaming)
  1487. #endif // CSIDL_LOCAL_APPDATA
  1488. #define CSIDL_ALTSTARTUP                0x001d        // non localized startup
  1489. #define CSIDL_COMMON_ALTSTARTUP         0x001e        // non localized common startup
  1490. #define CSIDL_COMMON_FAVORITES          0x001f
  1491. #ifndef _SHFOLDER_H_
  1492. #define CSIDL_INTERNET_CACHE            0x0020
  1493. #define CSIDL_COOKIES                   0x0021
  1494. #define CSIDL_HISTORY                   0x0022
  1495. #define CSIDL_COMMON_APPDATA            0x0023        // All UsersApplication Data
  1496. #define CSIDL_WINDOWS                   0x0024        // GetWindowsDirectory()
  1497. #define CSIDL_SYSTEM                    0x0025        // GetSystemDirectory()
  1498. #define CSIDL_PROGRAM_FILES             0x0026        // C:Program Files
  1499. #define CSIDL_MYPICTURES                0x0027        // C:Program FilesMy Pictures
  1500. #endif // _SHFOLDER_H_
  1501. #define CSIDL_PROFILE                   0x0028        // USERPROFILE
  1502. #define CSIDL_SYSTEMX86                 0x0029        // x86 system directory on RISC
  1503. #define CSIDL_PROGRAM_FILESX86          0x002a        // x86 C:Program Files on RISC
  1504. #ifndef _SHFOLDER_H_
  1505. #define CSIDL_PROGRAM_FILES_COMMON      0x002b        // C:Program FilesCommon
  1506. #endif // _SHFOLDER_H_
  1507. #define CSIDL_PROGRAM_FILES_COMMONX86   0x002c        // x86 Program FilesCommon on RISC
  1508. #define CSIDL_COMMON_TEMPLATES          0x002d        // All UsersTemplates
  1509. #ifndef _SHFOLDER_H_
  1510. #define CSIDL_COMMON_DOCUMENTS          0x002e        // All UsersDocuments
  1511. #define CSIDL_COMMON_ADMINTOOLS         0x002f        // All UsersStart MenuProgramsAdministrative Tools
  1512. #define CSIDL_ADMINTOOLS                0x0030        // <user name>Start MenuProgramsAdministrative Tools
  1513. #endif // _SHFOLDER_H_
  1514. #define CSIDL_CONNECTIONS               0x0031        // Network and Dial-up Connections
  1515. #define CSIDL_COMMON_MUSIC              0x0035        // All UsersMy Music
  1516. #define CSIDL_COMMON_PICTURES           0x0036        // All UsersMy Pictures
  1517. #define CSIDL_COMMON_VIDEO              0x0037        // All UsersMy Video
  1518. #define CSIDL_RESOURCES                 0x0038        // Resource Direcotry
  1519. #ifndef _SHFOLDER_H_
  1520. #define CSIDL_RESOURCES_LOCALIZED       0x0039        // Localized Resource Direcotry
  1521. #endif // _SHFOLDER_H_
  1522. #define CSIDL_COMMON_OEM_LINKS          0x003a        // Links to All Users OEM specific apps
  1523. #define CSIDL_CDBURN_AREA               0x003b        // USERPROFILELocal SettingsApplication DataMicrosoftCD Burning
  1524. // unused                               0x003c
  1525. #define CSIDL_COMPUTERSNEARME           0x003d        // Computers Near Me (computered from Workgroup membership)
  1526. #ifndef _SHFOLDER_H_
  1527. #define CSIDL_FLAG_CREATE               0x8000        // combine with CSIDL_ value to force folder creation in SHGetFolderPath()
  1528. #endif // _SHFOLDER_H_
  1529. #define CSIDL_FLAG_DONT_VERIFY          0x4000        // combine with CSIDL_ value to return an unverified folder path
  1530. #define CSIDL_FLAG_NO_ALIAS             0x1000        // combine with CSIDL_ value to insure non-alias versions of the pidl
  1531. #define CSIDL_FLAG_PER_USER_INIT        0x0800        // combine with CSIDL_ value to indicate per-user init (eg. upgrade)
  1532. #define CSIDL_FLAG_MASK                 0xFF00        // mask for all possible flag values
  1533. SHSTDAPI SHGetSpecialFolderLocation(HWND hwnd, int csidl, LPITEMIDLIST *ppidl);
  1534. #if (_WIN32_IE >= 0x0400)
  1535. SHSTDAPI_(BOOL) SHGetSpecialFolderPathA(HWND hwnd, LPSTR pszPath, int csidl, BOOL fCreate);
  1536. SHSTDAPI_(BOOL) SHGetSpecialFolderPathW(HWND hwnd, LPWSTR pszPath, int csidl, BOOL fCreate);
  1537. #ifdef UNICODE
  1538. #define SHGetSpecialFolderPath  SHGetSpecialFolderPathW
  1539. #else
  1540. #define SHGetSpecialFolderPath  SHGetSpecialFolderPathA
  1541. #endif // !UNICODE
  1542. #if (_WIN32_IE >= 0x0500)
  1543. typedef enum {
  1544.     SHGFP_TYPE_CURRENT  = 0,   // current value for user, verify it exists
  1545.     SHGFP_TYPE_DEFAULT  = 1,   // default value, may not exist
  1546. } SHGFP_TYPE;