ShellAPI.h 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982
  1. /*****************************************************************************\
  2. * *
  3. * shellapi.h - SHELL.DLL functions, types, and definitions *
  4. * *
  5. * Copyright (c) Microsoft Corporation. All rights reserved. *
  6. * *
  7. \*****************************************************************************/
  8. #ifndef _INC_SHELLAPI
  9. #define _INC_SHELLAPI
  10. //
  11. // Define API decoration for direct importing of DLL references.
  12. //
  13. #ifndef WINSHELLAPI
  14. #if !defined(_SHELL32_)
  15. #define WINSHELLAPI DECLSPEC_IMPORT
  16. #else
  17. #define WINSHELLAPI
  18. #endif
  19. #endif // WINSHELLAPI
  20. #ifndef SHSTDAPI
  21. #if !defined(_SHELL32_)
  22. #define SHSTDAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
  23. #define SHSTDAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
  24. #else
  25. #define SHSTDAPI STDAPI
  26. #define SHSTDAPI_(type) STDAPI_(type)
  27. #endif
  28. #endif // SHSTDAPI
  29. #ifndef SHDOCAPI
  30. #if !defined(_SHDOCVW_)
  31. #define SHDOCAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
  32. #define SHDOCAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
  33. #else
  34. #define SHDOCAPI STDAPI
  35. #define SHDOCAPI_(type) STDAPI_(type)
  36. #endif
  37. #endif // SHDOCAPI
  38. #if !defined(_WIN64)
  39. #include <pshpack1.h>
  40. #endif
  41. #ifdef __cplusplus
  42. extern "C" { /* Assume C declarations for C++ */
  43. #endif /* __cplusplus */
  44. DECLARE_HANDLE(HDROP);
  45. SHSTDAPI_(UINT) DragQueryFileA(HDROP,UINT,LPSTR,UINT);
  46. SHSTDAPI_(UINT) DragQueryFileW(HDROP,UINT,LPWSTR,UINT);
  47. #ifdef UNICODE
  48. #define DragQueryFile DragQueryFileW
  49. #else
  50. #define DragQueryFile DragQueryFileA
  51. #endif // !UNICODE
  52. SHSTDAPI_(BOOL) DragQueryPoint(HDROP,LPPOINT);
  53. SHSTDAPI_(void) DragFinish(HDROP);
  54. SHSTDAPI_(void) DragAcceptFiles(HWND,BOOL);
  55. SHSTDAPI_(HINSTANCE) ShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
  56. SHSTDAPI_(HINSTANCE) ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);
  57. #ifdef UNICODE
  58. #define ShellExecute ShellExecuteW
  59. #else
  60. #define ShellExecute ShellExecuteA
  61. #endif // !UNICODE
  62. SHSTDAPI_(HINSTANCE) FindExecutableA(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult);
  63. SHSTDAPI_(HINSTANCE) FindExecutableW(LPCWSTR lpFile, LPCWSTR lpDirectory, LPWSTR lpResult);
  64. #ifdef UNICODE
  65. #define FindExecutable FindExecutableW
  66. #else
  67. #define FindExecutable FindExecutableA
  68. #endif // !UNICODE
  69. SHSTDAPI_(LPWSTR *) CommandLineToArgvW(LPCWSTR lpCmdLine, int*pNumArgs);
  70. SHSTDAPI_(INT) ShellAboutA(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon);
  71. SHSTDAPI_(INT) ShellAboutW(HWND hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff, HICON hIcon);
  72. #ifdef UNICODE
  73. #define ShellAbout ShellAboutW
  74. #else
  75. #define ShellAbout ShellAboutA
  76. #endif // !UNICODE
  77. SHSTDAPI_(HICON) DuplicateIcon(HINSTANCE hInst, HICON hIcon);
  78. SHSTDAPI_(HICON) ExtractAssociatedIconA(HINSTANCE hInst, LPSTR lpIconPath, LPWORD lpiIcon);
  79. SHSTDAPI_(HICON) ExtractAssociatedIconW(HINSTANCE hInst, LPWSTR lpIconPath, LPWORD lpiIcon);
  80. #ifdef UNICODE
  81. #define ExtractAssociatedIcon ExtractAssociatedIconW
  82. #else
  83. #define ExtractAssociatedIcon ExtractAssociatedIconA
  84. #endif // !UNICODE
  85. #if (_WIN32_IE >= 0x0601)
  86. SHSTDAPI_(HICON) ExtractAssociatedIconExA(HINSTANCE hInst,LPSTR lpIconPath,LPWORD lpiIconIndex, LPWORD lpiIconId);
  87. SHSTDAPI_(HICON) ExtractAssociatedIconExW(HINSTANCE hInst,LPWSTR lpIconPath,LPWORD lpiIconIndex, LPWORD lpiIconId);
  88. #ifdef UNICODE
  89. #define ExtractAssociatedIconEx ExtractAssociatedIconExW
  90. #else
  91. #define ExtractAssociatedIconEx ExtractAssociatedIconExA
  92. #endif // !UNICODE
  93. #endif // (_WIN32_IE >= 0x0601)
  94. SHSTDAPI_(HICON) ExtractIconA(HINSTANCE hInst, LPCSTR lpszExeFileName, UINT nIconIndex);
  95. SHSTDAPI_(HICON) ExtractIconW(HINSTANCE hInst, LPCWSTR lpszExeFileName, UINT nIconIndex);
  96. #ifdef UNICODE
  97. #define ExtractIcon ExtractIconW
  98. #else
  99. #define ExtractIcon ExtractIconA
  100. #endif // !UNICODE
  101. #if(WINVER >= 0x0400)
  102. typedef struct _DRAGINFOA {
  103. UINT uSize; /* init with sizeof(DRAGINFO) */
  104. POINT pt;
  105. BOOL fNC;
  106. LPSTR lpFileList;
  107. DWORD grfKeyState;
  108. } DRAGINFOA, *LPDRAGINFOA;
  109. typedef struct _DRAGINFOW {
  110. UINT uSize; /* init with sizeof(DRAGINFO) */
  111. POINT pt;
  112. BOOL fNC;
  113. LPWSTR lpFileList;
  114. DWORD grfKeyState;
  115. } DRAGINFOW, *LPDRAGINFOW;
  116. #ifdef UNICODE
  117. typedef DRAGINFOW DRAGINFO;
  118. typedef LPDRAGINFOW LPDRAGINFO;
  119. #else
  120. typedef DRAGINFOA DRAGINFO;
  121. typedef LPDRAGINFOA LPDRAGINFO;
  122. #endif // UNICODE
  123. ////
  124. //// AppBar stuff
  125. ////
  126. #define ABM_NEW 0x00000000
  127. #define ABM_REMOVE 0x00000001
  128. #define ABM_QUERYPOS 0x00000002
  129. #define ABM_SETPOS 0x00000003
  130. #define ABM_GETSTATE 0x00000004
  131. #define ABM_GETTASKBARPOS 0x00000005
  132. #define ABM_ACTIVATE 0x00000006 // lParam == TRUE/FALSE means activate/deactivate
  133. #define ABM_GETAUTOHIDEBAR 0x00000007
  134. #define ABM_SETAUTOHIDEBAR 0x00000008 // this can fail at any time. MUST check the result
  135. // lParam = TRUE/FALSE Set/Unset
  136. // uEdge = what edge
  137. #define ABM_WINDOWPOSCHANGED 0x0000009
  138. #define ABM_SETSTATE 0x0000000a
  139. // these are put in the wparam of callback messages
  140. #define ABN_STATECHANGE 0x0000000
  141. #define ABN_POSCHANGED 0x0000001
  142. #define ABN_FULLSCREENAPP 0x0000002
  143. #define ABN_WINDOWARRANGE 0x0000003 // lParam == TRUE means hide
  144. // flags for get state
  145. #define ABS_AUTOHIDE 0x0000001
  146. #define ABS_ALWAYSONTOP 0x0000002
  147. #define ABE_LEFT 0
  148. #define ABE_TOP 1
  149. #define ABE_RIGHT 2
  150. #define ABE_BOTTOM 3
  151. typedef struct _AppBarData
  152. {
  153. DWORD cbSize;
  154. HWND hWnd;
  155. UINT uCallbackMessage;
  156. UINT uEdge;
  157. RECT rc;
  158. LPARAM lParam; // message specific
  159. } APPBARDATA, *PAPPBARDATA;
  160. SHSTDAPI_(UINT_PTR) SHAppBarMessage(DWORD dwMessage, PAPPBARDATA pData);
  161. ////
  162. //// EndAppBar
  163. ////
  164. SHSTDAPI_(DWORD) DoEnvironmentSubstA(LPSTR szString, UINT cchString);
  165. SHSTDAPI_(DWORD) DoEnvironmentSubstW(LPWSTR szString, UINT cchString);
  166. #ifdef UNICODE
  167. #define DoEnvironmentSubst DoEnvironmentSubstW
  168. #else
  169. #define DoEnvironmentSubst DoEnvironmentSubstA
  170. #endif // !UNICODE
  171. #define EIRESID(x) (-1 * (int)(x))
  172. SHSTDAPI_(UINT) ExtractIconExA(LPCSTR lpszFile, int nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons);
  173. SHSTDAPI_(UINT) ExtractIconExW(LPCWSTR lpszFile, int nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons);
  174. #ifdef UNICODE
  175. #define ExtractIconEx ExtractIconExW
  176. #else
  177. #define ExtractIconEx ExtractIconExA
  178. #endif // !UNICODE
  179. ////
  180. //// Shell File Operations
  181. ////
  182. #ifndef FO_MOVE //these need to be kept in sync with the ones in shlobj.h
  183. #define FO_MOVE 0x0001
  184. #define FO_COPY 0x0002
  185. #define FO_DELETE 0x0003
  186. #define FO_RENAME 0x0004
  187. #define FOF_MULTIDESTFILES 0x0001
  188. #define FOF_CONFIRMMOUSE 0x0002
  189. #define FOF_SILENT 0x0004 // don't create progress/report
  190. #define FOF_RENAMEONCOLLISION 0x0008
  191. #define FOF_NOCONFIRMATION 0x0010 // Don't prompt the user.
  192. #define FOF_WANTMAPPINGHANDLE 0x0020 // Fill in SHFILEOPSTRUCT.hNameMappings
  193. // Must be freed using SHFreeNameMappings
  194. #define FOF_ALLOWUNDO 0x0040
  195. #define FOF_FILESONLY 0x0080 // on *.*, do only files
  196. #define FOF_SIMPLEPROGRESS 0x0100 // means don't show names of files
  197. #define FOF_NOCONFIRMMKDIR 0x0200 // don't confirm making any needed dirs
  198. #define FOF_NOERRORUI 0x0400 // don't put up error UI
  199. #define FOF_NOCOPYSECURITYATTRIBS 0x0800 // dont copy NT file Security Attributes
  200. #define FOF_NORECURSION 0x1000 // don't recurse into directories.
  201. #if (_WIN32_IE >= 0x0500)
  202. #define FOF_NO_CONNECTED_ELEMENTS 0x2000 // don't operate on connected elements.
  203. #define FOF_WANTNUKEWARNING 0x4000 // during delete operation, warn if nuking instead of recycling (partially overrides FOF_NOCONFIRMATION)
  204. #endif // (_WIN32_IE >= 0x500)
  205. #if (_WIN32_WINNT >= 0x0501)
  206. #define FOF_NORECURSEREPARSE 0x8000 // treat reparse points as objects, not containers
  207. #endif // (_WIN32_WINNT >= 0x501)
  208. typedef WORD FILEOP_FLAGS;
  209. #define PO_DELETE 0x0013 // printer is being deleted
  210. #define PO_RENAME 0x0014 // printer is being renamed
  211. #define PO_PORTCHANGE 0x0020 // port this printer connected to is being changed
  212. // if this id is set, the strings received by
  213. // the copyhook are a doubly-null terminated
  214. // list of strings. The first is the printer
  215. // name and the second is the printer port.
  216. #define PO_REN_PORT 0x0034 // PO_RENAME and PO_PORTCHANGE at same time.
  217. // no POF_ flags currently defined
  218. typedef WORD PRINTEROP_FLAGS;
  219. #endif // FO_MOVE
  220. // implicit parameters are:
  221. // if pFrom or pTo are unqualified names the current directories are
  222. // taken from the global current drive/directory settings managed
  223. // by Get/SetCurrentDrive/Directory
  224. //
  225. // the global confirmation settings
  226. typedef struct _SHFILEOPSTRUCTA
  227. {
  228. HWND hwnd;
  229. UINT wFunc;
  230. LPCSTR pFrom;
  231. LPCSTR pTo;
  232. FILEOP_FLAGS fFlags;
  233. BOOL fAnyOperationsAborted;
  234. LPVOID hNameMappings;
  235. LPCSTR lpszProgressTitle; // only used if FOF_SIMPLEPROGRESS
  236. } SHFILEOPSTRUCTA, *LPSHFILEOPSTRUCTA;
  237. typedef struct _SHFILEOPSTRUCTW
  238. {
  239. HWND hwnd;
  240. UINT wFunc;
  241. LPCWSTR pFrom;
  242. LPCWSTR pTo;
  243. FILEOP_FLAGS fFlags;
  244. BOOL fAnyOperationsAborted;
  245. LPVOID hNameMappings;
  246. LPCWSTR lpszProgressTitle; // only used if FOF_SIMPLEPROGRESS
  247. } SHFILEOPSTRUCTW, *LPSHFILEOPSTRUCTW;
  248. #ifdef UNICODE
  249. typedef SHFILEOPSTRUCTW SHFILEOPSTRUCT;
  250. typedef LPSHFILEOPSTRUCTW LPSHFILEOPSTRUCT;
  251. #else
  252. typedef SHFILEOPSTRUCTA SHFILEOPSTRUCT;
  253. typedef LPSHFILEOPSTRUCTA LPSHFILEOPSTRUCT;
  254. #endif // UNICODE
  255. SHSTDAPI_(int) SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp);
  256. SHSTDAPI_(int) SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp);
  257. #ifdef UNICODE
  258. #define SHFileOperation SHFileOperationW
  259. #else
  260. #define SHFileOperation SHFileOperationA
  261. #endif // !UNICODE
  262. SHSTDAPI_(void) SHFreeNameMappings(HANDLE hNameMappings);
  263. typedef struct _SHNAMEMAPPINGA
  264. {
  265. LPSTR pszOldPath;
  266. LPSTR pszNewPath;
  267. int cchOldPath;
  268. int cchNewPath;
  269. } SHNAMEMAPPINGA, *LPSHNAMEMAPPINGA;
  270. typedef struct _SHNAMEMAPPINGW
  271. {
  272. LPWSTR pszOldPath;
  273. LPWSTR pszNewPath;
  274. int cchOldPath;
  275. int cchNewPath;
  276. } SHNAMEMAPPINGW, *LPSHNAMEMAPPINGW;
  277. #ifdef UNICODE
  278. typedef SHNAMEMAPPINGW SHNAMEMAPPING;
  279. typedef LPSHNAMEMAPPINGW LPSHNAMEMAPPING;
  280. #else
  281. typedef SHNAMEMAPPINGA SHNAMEMAPPING;
  282. typedef LPSHNAMEMAPPINGA LPSHNAMEMAPPING;
  283. #endif // UNICODE
  284. ////
  285. //// End Shell File Operations
  286. ////
  287. ////
  288. //// Begin ShellExecuteEx and family
  289. ////
  290. /* ShellExecute() and ShellExecuteEx() error codes */
  291. /* regular WinExec() codes */
  292. #define SE_ERR_FNF 2 // file not found
  293. #define SE_ERR_PNF 3 // path not found
  294. #define SE_ERR_ACCESSDENIED 5 // access denied
  295. #define SE_ERR_OOM 8 // out of memory
  296. #define SE_ERR_DLLNOTFOUND 32
  297. #endif /* WINVER >= 0x0400 */
  298. /* error values for ShellExecute() beyond the regular WinExec() codes */
  299. #define SE_ERR_SHARE 26
  300. #define SE_ERR_ASSOCINCOMPLETE 27
  301. #define SE_ERR_DDETIMEOUT 28
  302. #define SE_ERR_DDEFAIL 29
  303. #define SE_ERR_DDEBUSY 30
  304. #define SE_ERR_NOASSOC 31
  305. #if(WINVER >= 0x0400)
  306. // Note CLASSKEY overrides CLASSNAME
  307. #define SEE_MASK_CLASSNAME 0x00000001
  308. #define SEE_MASK_CLASSKEY 0x00000003
  309. // Note INVOKEIDLIST overrides IDLIST
  310. #define SEE_MASK_IDLIST 0x00000004
  311. #define SEE_MASK_INVOKEIDLIST 0x0000000c
  312. #define SEE_MASK_ICON 0x00000010
  313. #define SEE_MASK_HOTKEY 0x00000020
  314. #define SEE_MASK_NOCLOSEPROCESS 0x00000040
  315. #define SEE_MASK_CONNECTNETDRV 0x00000080
  316. #define SEE_MASK_FLAG_DDEWAIT 0x00000100
  317. #define SEE_MASK_DOENVSUBST 0x00000200
  318. #define SEE_MASK_FLAG_NO_UI 0x00000400
  319. #define SEE_MASK_UNICODE 0x00004000
  320. #define SEE_MASK_NO_CONSOLE 0x00008000
  321. #define SEE_MASK_ASYNCOK 0x00100000
  322. #define SEE_MASK_HMONITOR 0x00200000
  323. #if (_WIN32_IE >= 0x0560)
  324. #define SEE_MASK_NOZONECHECKS 0x00800000
  325. #endif // (_WIN32_IE >= 0x560)
  326. #if (_WIN32_IE >= 0x0500)
  327. #define SEE_MASK_NOQUERYCLASSSTORE 0x01000000
  328. #define SEE_MASK_WAITFORINPUTIDLE 0x02000000
  329. #endif // (_WIN32_IE >= 0x500)
  330. #if (_WIN32_IE >= 0x0560)
  331. #define SEE_MASK_FLAG_LOG_USAGE 0x04000000
  332. #endif // (_WIN32_IE >= 0x560)
  333. //
  334. // For compilers that don't support nameless unions
  335. //
  336. #ifndef DUMMYUNIONNAME
  337. #ifdef NONAMELESSUNION
  338. #define DUMMYUNIONNAME u
  339. #define DUMMYUNIONNAME2 u2
  340. #define DUMMYUNIONNAME3 u3
  341. #define DUMMYUNIONNAME4 u4
  342. #define DUMMYUNIONNAME5 u5
  343. #else
  344. #define DUMMYUNIONNAME
  345. #define DUMMYUNIONNAME2
  346. #define DUMMYUNIONNAME3
  347. #define DUMMYUNIONNAME4
  348. #define DUMMYUNIONNAME5
  349. #endif
  350. #endif // DUMMYUNIONNAME
  351. typedef struct _SHELLEXECUTEINFOA
  352. {
  353. DWORD cbSize;
  354. ULONG fMask;
  355. HWND hwnd;
  356. LPCSTR lpVerb;
  357. LPCSTR lpFile;
  358. LPCSTR lpParameters;
  359. LPCSTR lpDirectory;
  360. int nShow;
  361. HINSTANCE hInstApp;
  362. // Optional fields
  363. LPVOID lpIDList;
  364. LPCSTR lpClass;
  365. HKEY hkeyClass;
  366. DWORD dwHotKey;
  367. union {
  368. HANDLE hIcon;
  369. HANDLE hMonitor;
  370. } DUMMYUNIONNAME;
  371. HANDLE hProcess;
  372. } SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA;
  373. typedef struct _SHELLEXECUTEINFOW
  374. {
  375. DWORD cbSize;
  376. ULONG fMask;
  377. HWND hwnd;
  378. LPCWSTR lpVerb;
  379. LPCWSTR lpFile;
  380. LPCWSTR lpParameters;
  381. LPCWSTR lpDirectory;
  382. int nShow;
  383. HINSTANCE hInstApp;
  384. // Optional fields
  385. LPVOID lpIDList;
  386. LPCWSTR lpClass;
  387. HKEY hkeyClass;
  388. DWORD dwHotKey;
  389. union {
  390. HANDLE hIcon;
  391. HANDLE hMonitor;
  392. } DUMMYUNIONNAME;
  393. HANDLE hProcess;
  394. } SHELLEXECUTEINFOW, *LPSHELLEXECUTEINFOW;
  395. #ifdef UNICODE
  396. typedef SHELLEXECUTEINFOW SHELLEXECUTEINFO;
  397. typedef LPSHELLEXECUTEINFOW LPSHELLEXECUTEINFO;
  398. #else
  399. typedef SHELLEXECUTEINFOA SHELLEXECUTEINFO;
  400. typedef LPSHELLEXECUTEINFOA LPSHELLEXECUTEINFO;
  401. #endif // UNICODE
  402. SHSTDAPI_(BOOL) ShellExecuteExA(LPSHELLEXECUTEINFOA lpExecInfo);
  403. SHSTDAPI_(BOOL) ShellExecuteExW(LPSHELLEXECUTEINFOW lpExecInfo);
  404. #ifdef UNICODE
  405. #define ShellExecuteEx ShellExecuteExW
  406. #else
  407. #define ShellExecuteEx ShellExecuteExA
  408. #endif // !UNICODE
  409. SHSTDAPI_(void) WinExecErrorA(HWND hwnd, int error, LPCSTR lpstrFileName, LPCSTR lpstrTitle);
  410. SHSTDAPI_(void) WinExecErrorW(HWND hwnd, int error, LPCWSTR lpstrFileName, LPCWSTR lpstrTitle);
  411. #ifdef UNICODE
  412. #define WinExecError WinExecErrorW
  413. #else
  414. #define WinExecError WinExecErrorA
  415. #endif // !UNICODE
  416. //
  417. // SHCreateProcessAsUser()
  418. typedef struct _SHCREATEPROCESSINFOW
  419. {
  420. DWORD cbSize;
  421. ULONG fMask;
  422. HWND hwnd;
  423. LPCWSTR pszFile;
  424. LPCWSTR pszParameters;
  425. LPCWSTR pszCurrentDirectory;
  426. IN HANDLE hUserToken;
  427. IN LPSECURITY_ATTRIBUTES lpProcessAttributes;
  428. IN LPSECURITY_ATTRIBUTES lpThreadAttributes;
  429. IN BOOL bInheritHandles;
  430. IN DWORD dwCreationFlags;
  431. IN LPSTARTUPINFOW lpStartupInfo;
  432. OUT LPPROCESS_INFORMATION lpProcessInformation;
  433. } SHCREATEPROCESSINFOW, *PSHCREATEPROCESSINFOW;
  434. SHSTDAPI_(BOOL) SHCreateProcessAsUserW(PSHCREATEPROCESSINFOW pscpi);
  435. ////
  436. //// End ShellExecuteEx and family
  437. ////
  438. //
  439. // RecycleBin
  440. //
  441. // struct for query recycle bin info
  442. typedef struct _SHQUERYRBINFO {
  443. DWORD cbSize;
  444. #if !defined(_MAC) || defined(_MAC_INT_64)
  445. __int64 i64Size;
  446. __int64 i64NumItems;
  447. #else
  448. DWORDLONG i64Size;
  449. DWORDLONG i64NumItems;
  450. #endif
  451. } SHQUERYRBINFO, *LPSHQUERYRBINFO;
  452. // flags for SHEmptyRecycleBin
  453. //
  454. #define SHERB_NOCONFIRMATION 0x00000001
  455. #define SHERB_NOPROGRESSUI 0x00000002
  456. #define SHERB_NOSOUND 0x00000004
  457. SHSTDAPI SHQueryRecycleBinA(LPCSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo);
  458. SHSTDAPI SHQueryRecycleBinW(LPCWSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo);
  459. #ifdef UNICODE
  460. #define SHQueryRecycleBin SHQueryRecycleBinW
  461. #else
  462. #define SHQueryRecycleBin SHQueryRecycleBinA
  463. #endif // !UNICODE
  464. SHSTDAPI SHEmptyRecycleBinA(HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags);
  465. SHSTDAPI SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags);
  466. #ifdef UNICODE
  467. #define SHEmptyRecycleBin SHEmptyRecycleBinW
  468. #else
  469. #define SHEmptyRecycleBin SHEmptyRecycleBinA
  470. #endif // !UNICODE
  471. ////
  472. //// end of RecycleBin
  473. ////
  474. //// Tray notification definitions
  475. ////
  476. typedef struct _NOTIFYICONDATAA {
  477. DWORD cbSize;
  478. HWND hWnd;
  479. UINT uID;
  480. UINT uFlags;
  481. UINT uCallbackMessage;
  482. HICON hIcon;
  483. #if (_WIN32_IE < 0x0500)
  484. CHAR szTip[64];
  485. #else
  486. CHAR szTip[128];
  487. #endif
  488. #if (_WIN32_IE >= 0x0500)
  489. DWORD dwState;
  490. DWORD dwStateMask;
  491. CHAR szInfo[256];
  492. union {
  493. UINT uTimeout;
  494. UINT uVersion;
  495. } DUMMYUNIONNAME;
  496. CHAR szInfoTitle[64];
  497. DWORD dwInfoFlags;
  498. #endif
  499. #if (_WIN32_IE >= 0x600)
  500. GUID guidItem;
  501. #endif
  502. } NOTIFYICONDATAA, *PNOTIFYICONDATAA;
  503. typedef struct _NOTIFYICONDATAW {
  504. DWORD cbSize;
  505. HWND hWnd;
  506. UINT uID;
  507. UINT uFlags;
  508. UINT uCallbackMessage;
  509. HICON hIcon;
  510. #if (_WIN32_IE < 0x0500)
  511. WCHAR szTip[64];
  512. #else
  513. WCHAR szTip[128];
  514. #endif
  515. #if (_WIN32_IE >= 0x0500)
  516. DWORD dwState;
  517. DWORD dwStateMask;
  518. WCHAR szInfo[256];
  519. union {
  520. UINT uTimeout;
  521. UINT uVersion;
  522. } DUMMYUNIONNAME;
  523. WCHAR szInfoTitle[64];
  524. DWORD dwInfoFlags;
  525. #endif
  526. #if (_WIN32_IE >= 0x600)
  527. GUID guidItem;
  528. #endif
  529. } NOTIFYICONDATAW, *PNOTIFYICONDATAW;
  530. #ifdef UNICODE
  531. typedef NOTIFYICONDATAW NOTIFYICONDATA;
  532. typedef PNOTIFYICONDATAW PNOTIFYICONDATA;
  533. #else
  534. typedef NOTIFYICONDATAA NOTIFYICONDATA;
  535. typedef PNOTIFYICONDATAA PNOTIFYICONDATA;
  536. #endif // UNICODE
  537. #define NOTIFYICONDATAA_V1_SIZE FIELD_OFFSET(NOTIFYICONDATAA, szTip[64])
  538. #define NOTIFYICONDATAW_V1_SIZE FIELD_OFFSET(NOTIFYICONDATAW, szTip[64])
  539. #ifdef UNICODE
  540. #define NOTIFYICONDATA_V1_SIZE NOTIFYICONDATAW_V1_SIZE
  541. #else
  542. #define NOTIFYICONDATA_V1_SIZE NOTIFYICONDATAA_V1_SIZE
  543. #endif
  544. #define NOTIFYICONDATAA_V2_SIZE FIELD_OFFSET(NOTIFYICONDATAA, guidItem)
  545. #define NOTIFYICONDATAW_V2_SIZE FIELD_OFFSET(NOTIFYICONDATAW, guidItem)
  546. #ifdef UNICODE
  547. #define NOTIFYICONDATA_V2_SIZE NOTIFYICONDATAW_V2_SIZE
  548. #else
  549. #define NOTIFYICONDATA_V2_SIZE NOTIFYICONDATAA_V2_SIZE
  550. #endif
  551. #if (_WIN32_IE >= 0x0500)
  552. #define NIN_SELECT (WM_USER + 0)
  553. #define NINF_KEY 0x1
  554. #define NIN_KEYSELECT (NIN_SELECT | NINF_KEY)
  555. #endif
  556. #if (_WIN32_IE >= 0x0501)
  557. #define NIN_BALLOONSHOW (WM_USER + 2)
  558. #define NIN_BALLOONHIDE (WM_USER + 3)
  559. #define NIN_BALLOONTIMEOUT (WM_USER + 4)
  560. #define NIN_BALLOONUSERCLICK (WM_USER + 5)
  561. #endif
  562. #define NIM_ADD 0x00000000
  563. #define NIM_MODIFY 0x00000001
  564. #define NIM_DELETE 0x00000002
  565. #if (_WIN32_IE >= 0x0500)
  566. #define NIM_SETFOCUS 0x00000003
  567. #define NIM_SETVERSION 0x00000004
  568. #define NOTIFYICON_VERSION 3
  569. #endif
  570. #define NIF_MESSAGE 0x00000001
  571. #define NIF_ICON 0x00000002
  572. #define NIF_TIP 0x00000004
  573. #if (_WIN32_IE >= 0x0500)
  574. #define NIF_STATE 0x00000008
  575. #define NIF_INFO 0x00000010
  576. #endif
  577. #if (_WIN32_IE >= 0x600)
  578. #define NIF_GUID 0x00000020
  579. #endif
  580. #if (_WIN32_IE >= 0x0500)
  581. #define NIS_HIDDEN 0x00000001
  582. #define NIS_SHAREDICON 0x00000002
  583. // says this is the source of a shared icon
  584. // Notify Icon Infotip flags
  585. #define NIIF_NONE 0x00000000
  586. // icon flags are mutually exclusive
  587. // and take only the lowest 2 bits
  588. #define NIIF_INFO 0x00000001
  589. #define NIIF_WARNING 0x00000002
  590. #define NIIF_ERROR 0x00000003
  591. #if (_WIN32_IE >= 0x0600)
  592. #define NIIF_USER 0x00000004
  593. #endif
  594. #define NIIF_ICON_MASK 0x0000000F
  595. #if (_WIN32_IE >= 0x0501)
  596. #define NIIF_NOSOUND 0x00000010
  597. #endif
  598. #endif
  599. SHSTDAPI_(BOOL) Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA lpData);
  600. SHSTDAPI_(BOOL) Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW lpData);
  601. #ifdef UNICODE
  602. #define Shell_NotifyIcon Shell_NotifyIconW
  603. #else
  604. #define Shell_NotifyIcon Shell_NotifyIconA
  605. #endif // !UNICODE
  606. ////
  607. //// End Tray Notification Icons
  608. ////
  609. #ifndef SHFILEINFO_DEFINED
  610. #define SHFILEINFO_DEFINED
  611. ////
  612. //// Begin SHGetFileInfo
  613. ////
  614. /*
  615. * The SHGetFileInfo API provides an easy way to get attributes
  616. * for a file given a pathname.
  617. *
  618. * PARAMETERS
  619. *
  620. * pszPath file name to get info about
  621. * dwFileAttributes file attribs, only used with SHGFI_USEFILEATTRIBUTES
  622. * psfi place to return file info
  623. * cbFileInfo size of structure
  624. * uFlags flags
  625. *
  626. * RETURN
  627. * TRUE if things worked
  628. */
  629. typedef struct _SHFILEINFOA
  630. {
  631. HICON hIcon; // out: icon
  632. int iIcon; // out: icon index
  633. DWORD dwAttributes; // out: SFGAO_ flags
  634. CHAR szDisplayName[MAX_PATH]; // out: display name (or path)
  635. CHAR szTypeName[80]; // out: type name
  636. } SHFILEINFOA;
  637. typedef struct _SHFILEINFOW
  638. {
  639. HICON hIcon; // out: icon
  640. int iIcon; // out: icon index
  641. DWORD dwAttributes; // out: SFGAO_ flags
  642. WCHAR szDisplayName[MAX_PATH]; // out: display name (or path)
  643. WCHAR szTypeName[80]; // out: type name
  644. } SHFILEINFOW;
  645. #ifdef UNICODE
  646. typedef SHFILEINFOW SHFILEINFO;
  647. #else
  648. typedef SHFILEINFOA SHFILEINFO;
  649. #endif // UNICODE
  650. // NOTE: This is also in shlwapi.h. Please keep in synch.
  651. #endif // !SHFILEINFO_DEFINED
  652. #define SHGFI_ICON 0x000000100 // get icon
  653. #define SHGFI_DISPLAYNAME 0x000000200 // get display name
  654. #define SHGFI_TYPENAME 0x000000400 // get type name
  655. #define SHGFI_ATTRIBUTES 0x000000800 // get attributes
  656. #define SHGFI_ICONLOCATION 0x000001000 // get icon location
  657. #define SHGFI_EXETYPE 0x000002000 // return exe type
  658. #define SHGFI_SYSICONINDEX 0x000004000 // get system icon index
  659. #define SHGFI_LINKOVERLAY 0x000008000 // put a link overlay on icon
  660. #define SHGFI_SELECTED 0x000010000 // show icon in selected state
  661. #define SHGFI_ATTR_SPECIFIED 0x000020000 // get only specified attributes
  662. #define SHGFI_LARGEICON 0x000000000 // get large icon
  663. #define SHGFI_SMALLICON 0x000000001 // get small icon
  664. #define SHGFI_OPENICON 0x000000002 // get open icon
  665. #define SHGFI_SHELLICONSIZE 0x000000004 // get shell size icon
  666. #define SHGFI_PIDL 0x000000008 // pszPath is a pidl
  667. #define SHGFI_USEFILEATTRIBUTES 0x000000010 // use passed dwFileAttribute
  668. #if (_WIN32_IE >= 0x0500)
  669. #define SHGFI_ADDOVERLAYS 0x000000020 // apply the appropriate overlays
  670. #define SHGFI_OVERLAYINDEX 0x000000040 // Get the index of the overlay
  671. // in the upper 8 bits of the iIcon
  672. #endif
  673. SHSTDAPI_(DWORD_PTR) SHGetFileInfoA(LPCSTR pszPath, DWORD dwFileAttributes, SHFILEINFOA *psfi, UINT cbFileInfo, UINT uFlags);
  674. SHSTDAPI_(DWORD_PTR) SHGetFileInfoW(LPCWSTR pszPath, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags);
  675. #ifdef UNICODE
  676. #define SHGetFileInfo SHGetFileInfoW
  677. #else
  678. #define SHGetFileInfo SHGetFileInfoA
  679. #endif // !UNICODE
  680. #define SHGetDiskFreeSpace SHGetDiskFreeSpaceEx
  681. SHSTDAPI_(BOOL) SHGetDiskFreeSpaceExA(LPCSTR pszDirectoryName, ULARGE_INTEGER* pulFreeBytesAvailableToCaller, ULARGE_INTEGER* pulTotalNumberOfBytes, ULARGE_INTEGER* pulTotalNumberOfFreeBytes);
  682. SHSTDAPI_(BOOL) SHGetDiskFreeSpaceExW(LPCWSTR pszDirectoryName, ULARGE_INTEGER* pulFreeBytesAvailableToCaller, ULARGE_INTEGER* pulTotalNumberOfBytes, ULARGE_INTEGER* pulTotalNumberOfFreeBytes);
  683. #ifdef UNICODE
  684. #define SHGetDiskFreeSpaceEx SHGetDiskFreeSpaceExW
  685. #else
  686. #define SHGetDiskFreeSpaceEx SHGetDiskFreeSpaceExA
  687. #endif // !UNICODE
  688. SHSTDAPI_(BOOL) SHGetNewLinkInfoA(LPCSTR pszLinkTo, LPCSTR pszDir, LPSTR pszName, BOOL *pfMustCopy, UINT uFlags);
  689. SHSTDAPI_(BOOL) SHGetNewLinkInfoW(LPCWSTR pszLinkTo, LPCWSTR pszDir, LPWSTR pszName, BOOL *pfMustCopy, UINT uFlags);
  690. #ifdef UNICODE
  691. #define SHGetNewLinkInfo SHGetNewLinkInfoW
  692. #else
  693. #define SHGetNewLinkInfo SHGetNewLinkInfoA
  694. #endif // !UNICODE
  695. #define SHGNLI_PIDL 0x000000001 // pszLinkTo is a pidl
  696. #define SHGNLI_PREFIXNAME 0x000000002 // Make name "Shortcut to xxx"
  697. #define SHGNLI_NOUNIQUE 0x000000004 // don't do the unique name generation
  698. #if (_WIN32_IE >= 0x0501)
  699. #define SHGNLI_NOLNK 0x000000008 // don't add ".lnk" extension
  700. #endif // _WIN2_IE >= 0x0501
  701. ////
  702. //// End SHGetFileInfo
  703. ////
  704. // Printer stuff
  705. #define PRINTACTION_OPEN 0
  706. #define PRINTACTION_PROPERTIES 1
  707. #define PRINTACTION_NETINSTALL 2
  708. #define PRINTACTION_NETINSTALLLINK 3
  709. #define PRINTACTION_TESTPAGE 4
  710. #define PRINTACTION_OPENNETPRN 5
  711. #ifdef WINNT
  712. #define PRINTACTION_DOCUMENTDEFAULTS 6
  713. #define PRINTACTION_SERVERPROPERTIES 7
  714. #endif
  715. SHSTDAPI_(BOOL) SHInvokePrinterCommandA(HWND hwnd, UINT uAction, LPCSTR lpBuf1, LPCSTR lpBuf2, BOOL fModal);
  716. SHSTDAPI_(BOOL) SHInvokePrinterCommandW(HWND hwnd, UINT uAction, LPCWSTR lpBuf1, LPCWSTR lpBuf2, BOOL fModal);
  717. #ifdef UNICODE
  718. #define SHInvokePrinterCommand SHInvokePrinterCommandW
  719. #else
  720. #define SHInvokePrinterCommand SHInvokePrinterCommandA
  721. #endif // !UNICODE
  722. #endif /* WINVER >= 0x0400 */
  723. #if (_WIN32_WINNT >= 0x0500) || (_WIN32_WINDOWS >= 0x0500)
  724. //
  725. // The SHLoadNonloadedIconOverlayIdentifiers API causes the shell's
  726. // icon overlay manager to load any registered icon overlay
  727. // identifers that are not currently loaded. This is useful if an
  728. // overlay identifier did not load at shell startup but is needed
  729. // and can be loaded at a later time. Identifiers already loaded
  730. // are not affected. Overlay identifiers implement the
  731. // IShellIconOverlayIdentifier interface.
  732. //
  733. // Returns:
  734. // S_OK
  735. //
  736. SHSTDAPI SHLoadNonloadedIconOverlayIdentifiers(void);
  737. //
  738. // The SHIsFileAvailableOffline API determines whether a file
  739. // or folder is available for offline use.
  740. //
  741. // Parameters:
  742. // pwszPath file name to get info about
  743. // pdwStatus (optional) OFFLINE_STATUS_* flags returned here
  744. //
  745. // Returns:
  746. // S_OK File/directory is available offline, unless
  747. // OFFLINE_STATUS_INCOMPLETE is returned.
  748. // E_INVALIDARG Path is invalid, or not a net path
  749. // E_FAIL File/directory is not available offline
  750. //
  751. // Notes:
  752. // OFFLINE_STATUS_INCOMPLETE is never returned for directories.
  753. // Both OFFLINE_STATUS_LOCAL and OFFLINE_STATUS_REMOTE may be returned,
  754. // indicating "open in both places." This is common when the server is online.
  755. //
  756. SHSTDAPI SHIsFileAvailableOffline(LPCWSTR pwszPath, LPDWORD pdwStatus);
  757. #define OFFLINE_STATUS_LOCAL 0x0001 // If open, it's open locally
  758. #define OFFLINE_STATUS_REMOTE 0x0002 // If open, it's open remotely
  759. #define OFFLINE_STATUS_INCOMPLETE 0x0004 // The local copy is currently imcomplete.
  760. // The file will not be available offline
  761. // until it has been synchronized.
  762. #endif
  763. // sets the specified path to use the string resource
  764. // as the UI instead of the file system name
  765. SHSTDAPI SHSetLocalizedName(LPWSTR pszPath, LPCWSTR pszResModule, int idsRes);
  766. //====== ShellMessageBox ================================================
  767. // If lpcTitle is NULL, the title is taken from hWnd
  768. // If lpcText is NULL, this is assumed to be an Out Of Memory message
  769. // If the selector of lpcTitle or lpcText is NULL, the offset should be a
  770. // string resource ID
  771. // The variable arguments must all be 32-bit values (even if fewer bits
  772. // are actually used)
  773. // lpcText (or whatever string resource it causes to be loaded) should
  774. // be a formatting string similar to wsprintf except that only the
  775. // following formats are available:
  776. // %% formats to a single '%'
  777. // %nn%s the nn-th arg is a string which is inserted
  778. // %nn%ld the nn-th arg is a DWORD, and formatted decimal
  779. // %nn%lx the nn-th arg is a DWORD, and formatted hex
  780. // note that lengths are allowed on the %s, %ld, and %lx, just
  781. // like wsprintf
  782. //
  783. #if (_WIN32_IE >= 0x0601)
  784. int _cdecl ShellMessageBoxA(
  785. HINSTANCE hAppInst,
  786. HWND hWnd,
  787. LPCSTR lpcText,
  788. LPCSTR lpcTitle,
  789. UINT fuStyle,
  790. ...);
  791. int _cdecl ShellMessageBoxW(
  792. HINSTANCE hAppInst,
  793. HWND hWnd,
  794. LPCWSTR lpcText,
  795. LPCWSTR lpcTitle,
  796. UINT fuStyle,
  797. ...);
  798. #ifdef UNICODE
  799. #define ShellMessageBox ShellMessageBoxW
  800. #else
  801. #define ShellMessageBox ShellMessageBoxA
  802. #endif // !UNICODE
  803. #endif // (_WIN32_IE >= 0x0601)
  804. #if (_WIN32_IE >= 0x0601)
  805. SHSTDAPI_(BOOL) IsLFNDriveA(LPCSTR pszPath);
  806. SHSTDAPI_(BOOL) IsLFNDriveW(LPCWSTR pszPath);
  807. #ifdef UNICODE
  808. #define IsLFNDrive IsLFNDriveW
  809. #else
  810. #define IsLFNDrive IsLFNDriveA
  811. #endif // !UNICODE
  812. #endif // (_WIN32_IE >= 0x0601)
  813. #if _WIN32_IE >= 0x0600
  814. STDAPI SHEnumerateUnreadMailAccountsA(HKEY hKeyUser, DWORD dwIndex, LPSTR pszMailAddress, int cchMailAddress);
  815. STDAPI SHEnumerateUnreadMailAccountsW(HKEY hKeyUser, DWORD dwIndex, LPWSTR pszMailAddress, int cchMailAddress);
  816. #ifdef UNICODE
  817. #define SHEnumerateUnreadMailAccounts SHEnumerateUnreadMailAccountsW
  818. #else
  819. #define SHEnumerateUnreadMailAccounts SHEnumerateUnreadMailAccountsA
  820. #endif // !UNICODE
  821. STDAPI SHGetUnreadMailCountA(HKEY hKeyUser, LPCSTR pszMailAddress, DWORD *pdwCount, FILETIME *pFileTime, LPSTR pszShellExecuteCommand, int cchShellExecuteCommand);
  822. STDAPI SHGetUnreadMailCountW(HKEY hKeyUser, LPCWSTR pszMailAddress, DWORD *pdwCount, FILETIME *pFileTime, LPWSTR pszShellExecuteCommand, int cchShellExecuteCommand);
  823. #ifdef UNICODE
  824. #define SHGetUnreadMailCount SHGetUnreadMailCountW
  825. #else
  826. #define SHGetUnreadMailCount SHGetUnreadMailCountA
  827. #endif // !UNICODE
  828. STDAPI SHSetUnreadMailCountA(LPCSTR pszMailAddress, DWORD dwCount, LPCSTR pszShellExecuteCommand);
  829. STDAPI SHSetUnreadMailCountW(LPCWSTR pszMailAddress, DWORD dwCount, LPCWSTR pszShellExecuteCommand);
  830. #ifdef UNICODE
  831. #define SHSetUnreadMailCount SHSetUnreadMailCountW
  832. #else
  833. #define SHSetUnreadMailCount SHSetUnreadMailCountA
  834. #endif // !UNICODE
  835. #endif /* _WIN32_IE >= 0x0600 */
  836. #if (_WIN32_IE >= 0x0601)
  837. STDAPI_(BOOL) SHTestTokenMembership(HANDLE hToken, ULONG ulRID);
  838. #endif // (_WIN32_IE >= 0x0601)
  839. #if _WIN32_IE >= 0x0600
  840. STDAPI SHGetImageList(int iImageList, REFIID riid, void **ppvObj);
  841. #define SHIL_LARGE 0 // normally 32x32
  842. #define SHIL_SMALL 1 // normally 16x16
  843. #define SHIL_EXTRALARGE 2
  844. #define SHIL_SYSSMALL 3 // like SHIL_SMALL, but tracks system small icon metric correctly
  845. #define SHIL_LAST SHIL_SYSSMALL
  846. // Function call types for ntshrui folder sharing helpers
  847. typedef HRESULT (STDMETHODCALLTYPE *PFNCANSHAREFOLDERW)(IN LPCWSTR pszPath);
  848. typedef HRESULT (STDMETHODCALLTYPE *PFNSHOWSHAREFOLDERUIW)(IN HWND hwndParent, IN LPCWSTR pszPath);
  849. #endif /* _WIN32_IE >= 0x0600 */
  850. #ifdef __cplusplus
  851. }
  852. #endif /* __cplusplus */
  853. #if !defined(_WIN64)
  854. #include <poppack.h>
  855. #endif
  856. #endif /* _INC_SHELLAPI */