1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW API for MS-Windows 4.0
5  *
6  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
7  * Source: $(DRUNTIMESRC src/core/sys/windows/_shlobj.d)
8  */
9 module core.sys.windows.shlobj;
version(Windows)10 version (Windows):
11 @system:
12 
13 version (ANSI) {} else version = Unicode;
14 pragma(lib, "shell32");
15 
16 // TODO: fix bitfields
17 // TODO: CMIC_VALID_SEE_FLAGS
18 // SHGetFolderPath in shfolder.dll on W9x, NT4, also in shell32.dll on W2K
19 
20 import core.sys.windows.commctrl, core.sys.windows.ole2, core.sys.windows.shlguid, core.sys.windows.shellapi;
21 import core.sys.windows.prsht, core.sys.windows.unknwn, core.sys.windows.w32api, core.sys.windows.winbase,
22   core.sys.windows.winnt, core.sys.windows.winuser, core.sys.windows.wtypes, core.sys.windows.objfwd, core.sys.windows.objidl;
23 import core.sys.windows.winnetwk; // for NETRESOURCE
24 import core.sys.windows.oaidl : VARIANT;
25 
26 
27 // FIXME: clean up Windows version support
28 
29 align(1):
30 
31 enum BIF_RETURNONLYFSDIRS = 1;
32 enum BIF_DONTGOBELOWDOMAIN = 2;
33 enum BIF_STATUSTEXT = 4;
34 enum BIF_RETURNFSANCESTORS = 8;
35 enum BIF_EDITBOX = 16;
36 enum BIF_VALIDATE = 32;
37 enum BIF_NEWDIALOGSTYLE = 64;
38 enum BIF_BROWSEINCLUDEURLS = 128;
39 enum BIF_USENEWUI =  BIF_EDITBOX | BIF_NEWDIALOGSTYLE;
40 enum BIF_BROWSEFORCOMPUTER = 0x1000;
41 enum BIF_BROWSEFORPRINTER = 0x2000;
42 enum BIF_BROWSEINCLUDEFILES = 0x4000;
43 enum BIF_SHAREABLE = 0x8000;
44 enum BFFM_INITIALIZED = 1;
45 enum BFFM_SELCHANGED = 2;
46 enum BFFM_VALIDATEFAILEDA = 3;
47 enum BFFM_VALIDATEFAILEDW = 4;
48 enum BFFM_SETSTATUSTEXTA = WM_USER + 100;
49 enum BFFM_ENABLEOK = WM_USER + 101;
50 enum BFFM_SETSELECTIONA = WM_USER + 102;
51 enum BFFM_SETSELECTIONW = WM_USER + 103;
52 enum BFFM_SETSTATUSTEXTW = WM_USER + 104;
53 enum BFFM_SETOKTEXT = WM_USER + 105;
54 enum BFFM_SETEXPANDED = WM_USER + 106;
55 
version(Unicode)56 version (Unicode) {
57     alias BFFM_SETSTATUSTEXTW BFFM_SETSTATUSTEXT;
58     alias BFFM_SETSELECTIONW BFFM_SETSELECTION;
59     alias BFFM_VALIDATEFAILEDW BFFM_VALIDATEFAILED;
60 } else {
61     alias BFFM_SETSTATUSTEXTA BFFM_SETSTATUSTEXT;
62     alias BFFM_SETSELECTIONA BFFM_SETSELECTION;
63     alias BFFM_VALIDATEFAILEDA BFFM_VALIDATEFAILED;
64 }
65 
66 enum DVASPECT_SHORTNAME = 2;
67 
68 enum SHARD {
69     SHARD_PIDL            = 1,
70     SHARD_PATHA,
71     SHARD_PATHW,
72     SHARD_APPIDINFO,
73     SHARD_APPIDINFOIDLIST,
74     SHARD_LINK,
75     SHARD_APPIDINFOLINK,
76     SHARD_SHELLITEM,   // = 8
77     SHARD_PATH = (_WIN32_UNICODE ? SHARD_PATHW : SHARD_PATHA)
78 }
79 
80 enum SHCNE_RENAMEITEM = 1;
81 enum SHCNE_CREATE = 2;
82 enum SHCNE_DELETE = 4;
83 enum SHCNE_MKDIR = 8;
84 enum SHCNE_RMDIR = 16;
85 enum SHCNE_MEDIAINSERTED = 32;
86 enum SHCNE_MEDIAREMOVED = 64;
87 enum SHCNE_DRIVEREMOVED = 128;
88 enum SHCNE_DRIVEADD = 256;
89 enum SHCNE_NETSHARE = 512;
90 enum SHCNE_NETUNSHARE = 1024;
91 enum SHCNE_ATTRIBUTES = 2048;
92 enum SHCNE_UPDATEDIR = 4096;
93 enum SHCNE_UPDATEITEM = 8192;
94 enum SHCNE_SERVERDISCONNECT = 16384;
95 enum SHCNE_UPDATEIMAGE = 32768;
96 enum SHCNE_DRIVEADDGUI = 65536;
97 enum SHCNE_RENAMEFOLDER = 0x20000;
98 enum SHCNE_FREESPACE = 0x40000;
99 enum SHCNE_ASSOCCHANGED = 0x8000000;
100 enum SHCNE_DISKEVENTS = 0x2381F;
101 enum SHCNE_GLOBALEVENTS = 0xC0581E0;
102 enum SHCNE_ALLEVENTS = 0x7FFFFFFF;
103 enum SHCNE_INTERRUPT = 0x80000000;
104 
105 enum SHCNF_IDLIST = 0;
106 enum SHCNF_PATHA = 1;
107 enum SHCNF_PRINTERA = 2;
108 enum SHCNF_DWORD = 3;
109 enum SHCNF_PATHW = 5;
110 enum SHCNF_PRINTERW = 6;
111 enum SHCNF_TYPE = 0xFF;
112 enum SHCNF_FLUSH = 0x1000;
113 enum SHCNF_FLUSHNOWAIT = 0x2000;
114 
version(Unicode)115 version (Unicode) {
116     alias SHCNF_PATHW SHCNF_PATH;
117     alias SHCNF_PRINTERW SHCNF_PRINTER;
118 } else {
119     alias SHCNF_PATHA SHCNF_PATH;
120     alias SHCNF_PRINTERA SHCNF_PRINTER;
121 }
122 
123 enum SFGAOF : DWORD {
124     SFGAO_CANCOPY         = DROPEFFECT.DROPEFFECT_COPY,
125     SFGAO_CANMOVE         = DROPEFFECT.DROPEFFECT_MOVE,
126     SFGAO_CANLINK         = DROPEFFECT.DROPEFFECT_LINK,
127     SFGAO_CANRENAME       = 0x00000010L,
128     SFGAO_CANDELETE       = 0x00000020L,
129     SFGAO_HASPROPSHEET    = 0x00000040L,
130     SFGAO_DROPTARGET      = 0x00000100L,
131     SFGAO_CAPABILITYMASK  = 0x00000177L,
132     SFGAO_ISSLOW          = 0x00004000L,
133     SFGAO_GHOSTED         = 0x00008000L,
134     SFGAO_LINK            = 0x00010000L,
135     SFGAO_SHARE           = 0x00020000L,
136     SFGAO_READONLY        = 0x00040000L,
137     SFGAO_HIDDEN          = 0x00080000L,
138     SFGAO_DISPLAYATTRMASK = (SFGAO_ISSLOW | SFGAO_GHOSTED | SFGAO_LINK
139                             | SFGAO_SHARE | SFGAO_READONLY | SFGAO_HIDDEN),
140     SFGAO_FILESYSANCESTOR = 0x10000000L,
141     SFGAO_FOLDER          = 0x20000000L,
142     SFGAO_FILESYSTEM      = 0x40000000L,
143     SFGAO_HASSUBFOLDER    = 0x80000000L,
144     SFGAO_CONTENTSMASK    = 0x80000000L,
145     SFGAO_VALIDATE        = 0x01000000L,
146     SFGAO_REMOVABLE       = 0x02000000L,
147     SFGAO_COMPRESSED      = 0x04000000L
148 }
149 enum STRRET_WSTR = 0;
150 enum STRRET_OFFSET = 1;
151 enum STRRET_CSTR = 2;
152 
153 enum {
154     SHGDFIL_FINDDATA = 1,
155     SHGDFIL_NETRESOURCE,
156     SHGDFIL_DESCRIPTIONID
157 }
158 
159 enum {
160     SHDID_ROOT_REGITEM = 1,
161     SHDID_FS_FILE,
162     SHDID_FS_DIRECTORY,
163     SHDID_FS_OTHER,
164     SHDID_COMPUTER_DRIVE35,
165     SHDID_COMPUTER_DRIVE525,
166     SHDID_COMPUTER_REMOVABLE,
167     SHDID_COMPUTER_FIXED,
168     SHDID_COMPUTER_NETDRIVE,
169     SHDID_COMPUTER_CDROM,
170     SHDID_COMPUTER_RAMDISK,
171     SHDID_COMPUTER_OTHER,
172     SHDID_NET_DOMAIN,
173     SHDID_NET_SERVER,
174     SHDID_NET_SHARE,
175     SHDID_NET_RESTOFNET,
176     SHDID_NET_OTHER
177 }
178 
179 const TCHAR[] REGSTR_PATH_EXPLORER = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer";
180 const TCHAR[] REGSTR_PATH_SPECIAL_FOLDERS=REGSTR_PATH_EXPLORER ~ "\\Shell Folders";
181 
182 enum {
183     CSIDL_DESKTOP            =  0,
184     CSIDL_INTERNET,
185     CSIDL_PROGRAMS,
186     CSIDL_CONTROLS,
187     CSIDL_PRINTERS,
188     CSIDL_PERSONAL,
189     CSIDL_FAVORITES,
190     CSIDL_STARTUP,
191     CSIDL_RECENT,
192     CSIDL_SENDTO,
193     CSIDL_BITBUCKET,
194     CSIDL_STARTMENU,      // = 11
195     CSIDL_MYMUSIC            = 13,
196     CSIDL_MYVIDEO,        // = 14
197     CSIDL_DESKTOPDIRECTORY   = 16,
198     CSIDL_DRIVES,
199     CSIDL_NETWORK,
200     CSIDL_NETHOOD,
201     CSIDL_FONTS,
202     CSIDL_TEMPLATES,
203     CSIDL_COMMON_STARTMENU,
204     CSIDL_COMMON_PROGRAMS,
205     CSIDL_COMMON_STARTUP,
206     CSIDL_COMMON_DESKTOPDIRECTORY,
207     CSIDL_APPDATA,
208     CSIDL_PRINTHOOD,
209     CSIDL_LOCAL_APPDATA,
210     CSIDL_ALTSTARTUP,
211     CSIDL_COMMON_ALTSTARTUP,
212     CSIDL_COMMON_FAVORITES,
213     CSIDL_INTERNET_CACHE,
214     CSIDL_COOKIES,
215     CSIDL_HISTORY,
216     CSIDL_COMMON_APPDATA,
217     CSIDL_WINDOWS,
218     CSIDL_SYSTEM,
219     CSIDL_PROGRAM_FILES,
220     CSIDL_MYPICTURES,
221     CSIDL_PROFILE,
222     CSIDL_SYSTEMX86,
223     CSIDL_PROGRAM_FILESX86,
224     CSIDL_PROGRAM_FILES_COMMON,
225     CSIDL_PROGRAM_FILES_COMMONX86,
226     CSIDL_COMMON_TEMPLATES,
227     CSIDL_COMMON_DOCUMENTS,
228     CSIDL_COMMON_ADMINTOOLS,
229     CSIDL_ADMINTOOLS,
230     CSIDL_CONNECTIONS,  // = 49
231     CSIDL_COMMON_MUSIC     = 53,
232     CSIDL_COMMON_PICTURES,
233     CSIDL_COMMON_VIDEO,
234     CSIDL_RESOURCES,
235     CSIDL_RESOURCES_LOCALIZED,
236     CSIDL_COMMON_OEM_LINKS,
237     CSIDL_CDBURN_AREA,  // = 59
238     CSIDL_COMPUTERSNEARME  = 61,
239     CSIDL_FLAG_DONT_VERIFY = 0x4000,
240     CSIDL_FLAG_CREATE      = 0x8000,
241     CSIDL_FLAG_MASK        = 0xFF00
242 }
243 
244 const TCHAR[]
245     CFSTR_SHELLIDLIST       = "Shell IDList Array",
246     CFSTR_SHELLIDLISTOFFSET = "Shell Object Offsets",
247     CFSTR_NETRESOURCES      = "Net Resource",
248     CFSTR_FILECONTENTS      = "FileContents",
249     CFSTR_FILENAMEA         = "FileName",
250     CFSTR_FILENAMEMAPA      = "FileNameMap",
251     CFSTR_FILEDESCRIPTORA   = "FileGroupDescriptor",
252     CFSTR_INETURLA          = "UniformResourceLocator",
253     CFSTR_SHELLURL          = CFSTR_INETURLA,
254     CFSTR_FILENAMEW         = "FileNameW",
255     CFSTR_FILENAMEMAPW      = "FileNameMapW",
256     CFSTR_FILEDESCRIPTORW   = "FileGroupDescriptorW",
257     CFSTR_INETURLW          = "UniformResourceLocatorW";
258 
version(Unicode)259 version (Unicode) {
260     alias CFSTR_FILENAMEW CFSTR_FILENAME;
261     alias CFSTR_FILENAMEMAPW CFSTR_FILENAMEMAP;
262     alias CFSTR_FILEDESCRIPTORW CFSTR_FILEDESCRIPTOR;
263     alias CFSTR_INETURLW CFSTR_INETURL;
264 } else {
265     alias CFSTR_FILENAMEA CFSTR_FILENAME;
266     alias CFSTR_FILENAMEMAPA CFSTR_FILENAMEMAP;
267     alias CFSTR_FILEDESCRIPTORA CFSTR_FILEDESCRIPTOR;
268     alias CFSTR_INETURLA CFSTR_INETURL;
269 }
270 const TCHAR[]
271     CFSTR_PRINTERGROUP        = "PrinterFriendlyName",
272     CFSTR_INDRAGLOOP          = "InShellDragLoop",
273     CFSTR_PASTESUCCEEDED      = "Paste Succeeded",
274     CFSTR_PERFORMEDDROPEFFECT = "Performed DropEffect",
275     CFSTR_PREFERREDDROPEFFECT = "Preferred DropEffect";
276 
277 enum CMF_NORMAL=0;
278 enum CMF_DEFAULTONLY=1;
279 enum CMF_VERBSONLY=2;
280 enum CMF_EXPLORE=4;
281 enum CMF_NOVERBS=8;
282 enum CMF_CANRENAME=16;
283 enum CMF_NODEFAULT=32;
284 enum CMF_INCLUDESTATIC=64;
285 enum CMF_RESERVED=0xffff0000;
286 enum GCS_VERBA=0;
287 enum GCS_HELPTEXTA=1;
288 enum GCS_VALIDATEA=2;
289 enum GCS_VERBW=4;
290 enum GCS_HELPTEXTW=5;
291 enum GCS_VALIDATEW=6;
292 enum GCS_UNICODE=4;
293 
version(Unicode)294 version (Unicode) {
295     alias GCS_VERBW GCS_VERB;
296     alias GCS_HELPTEXTW GCS_HELPTEXT;
297     alias GCS_VALIDATEW GCS_VALIDATE;
298 } else {
299     alias GCS_VERBA GCS_VERB;
300     alias GCS_HELPTEXTA GCS_HELPTEXT;
301     alias GCS_VALIDATEA GCS_VALIDATE;
302 }
303 
304 const TCHAR[]
305     CMDSTR_NEWFOLDER   = "NewFolder",
306     CMDSTR_VIEWLIST    = "ViewList",
307     CMDSTR_VIEWDETAILS = "ViewDetails";
308 
309 enum CMIC_MASK_HOTKEY     = SEE_MASK_HOTKEY;
310 enum CMIC_MASK_ICON       = SEE_MASK_ICON;
311 enum CMIC_MASK_FLAG_NO_UI = SEE_MASK_FLAG_NO_UI;
312 enum CMIC_MASK_MODAL      = 0x80000000;
313 // TODO: This isn't defined anywhere in MinGW.
314 //const CMIC_VALID_SEE_FLAGS=SEE_VALID_CMIC_FLAGS;
315 
316 enum GIL_OPENICON = 1;
317 enum GIL_FORSHELL = 2;
318 enum GIL_SIMULATEDOC = 1;
319 enum GIL_PERINSTANCE = 2;
320 enum GIL_PERCLASS = 4;
321 enum GIL_NOTFILENAME = 8;
322 enum GIL_DONTCACHE = 16;
323 
324 enum FVSIF_RECT = 1;
325 enum FVSIF_PINNED = 2;
326 enum FVSIF_NEWFAILED = 0x8000000;
327 enum FVSIF_NEWFILE = 0x80000000;
328 enum FVSIF_CANVIEWIT = 0x40000000;
329 
330 enum CDBOSC_SETFOCUS = 0;
331 enum CDBOSC_KILLFOCUS = 1;
332 enum CDBOSC_SELCHANGE = 2;
333 enum CDBOSC_RENAME = 3;
334 
335 enum FCIDM_SHVIEWFIRST = 0;
336 enum FCIDM_SHVIEWLAST = 0x7fff;
337 enum FCIDM_BROWSERFIRST = 0xa000;
338 enum FCIDM_BROWSERLAST = 0xbf00;
339 enum FCIDM_GLOBALFIRST = 0x8000;
340 enum FCIDM_GLOBALLAST = 0x9fff;
341 enum FCIDM_MENU_FILE = FCIDM_GLOBALFIRST;
342 enum FCIDM_MENU_EDIT = FCIDM_GLOBALFIRST+0x0040;
343 enum FCIDM_MENU_VIEW = FCIDM_GLOBALFIRST+0x0080;
344 enum FCIDM_MENU_VIEW_SEP_OPTIONS = FCIDM_GLOBALFIRST+0x0081;
345 enum FCIDM_MENU_TOOLS = FCIDM_GLOBALFIRST+0x00c0;
346 enum FCIDM_MENU_TOOLS_SEP_GOTO = FCIDM_GLOBALFIRST+0x00c1;
347 enum FCIDM_MENU_HELP = FCIDM_GLOBALFIRST+0x0100;
348 enum FCIDM_MENU_FIND = FCIDM_GLOBALFIRST+0x0140;
349 enum FCIDM_MENU_EXPLORE = FCIDM_GLOBALFIRST+0x0150;
350 enum FCIDM_MENU_FAVORITES = FCIDM_GLOBALFIRST+0x0170;
351 enum FCIDM_TOOLBAR = FCIDM_BROWSERFIRST;
352 enum FCIDM_STATUS = FCIDM_BROWSERFIRST+1;
353 
354 enum SBSP_DEFBROWSER = 0;
355 enum SBSP_SAMEBROWSER = 1;
356 enum SBSP_NEWBROWSER = 2;
357 enum SBSP_DEFMODE = 0;
358 enum SBSP_OPENMODE = 16;
359 enum SBSP_EXPLOREMODE = 32;
360 enum SBSP_ABSOLUTE = 0;
361 enum SBSP_RELATIVE = 0x1000;
362 enum SBSP_PARENT = 0x2000;
363 enum SBSP_INITIATEDBYHLINKFRAME = 0x80000000;
364 enum SBSP_REDIRECT = 0x40000000;
365 
366 enum {
367     FCW_STATUS=1,
368     FCW_TOOLBAR,
369     FCW_TREE
370 }
371 
372 enum FCT_MERGE=1;
373 enum FCT_CONFIGABLE=2;
374 enum FCT_ADDTOEND=4;
375 
376 enum SVSI_DESELECT=0;
377 enum SVSI_SELECT=1;
378 enum SVSI_EDIT=3;
379 enum SVSI_DESELECTOTHERS=4;
380 enum SVSI_ENSUREVISIBLE=8;
381 enum SVSI_FOCUSED=16;
382 
383 enum SVGIO_BACKGROUND=0;
384 enum SVGIO_SELECTION=1;
385 enum SVGIO_ALLVIEW=2;
386 
387 enum UINT SV2GV_CURRENTVIEW=-1;
388 enum UINT SV2GV_DEFAULTVIEW=-2;
389 
390 alias DWORD SHGDNF;
391 
392 struct CIDA {
393     UINT    cidl;
394     UINT[1] aoffset;
395 }
396 alias CIDA* LPIDA;
397 
398 struct SHITEMID {
399     USHORT  cb;
400     BYTE[1] abID;
401 }
402 alias SHITEMID*        LPSHITEMID;
403 alias const(SHITEMID)* LPCSHITEMID;
404 
405 struct ITEMIDLIST {
406     SHITEMID mkid;
407 }
408 alias ITEMIDLIST*        LPITEMIDLIST;
409 alias const(ITEMIDLIST)* LPCITEMIDLIST;
410 
411 extern (Windows) alias int function(HWND, UINT, LPARAM, LPARAM) BFFCALLBACK;
412 
413 align (8) {
414 struct BROWSEINFOA {
415     HWND          hwndOwner;
416     LPCITEMIDLIST pidlRoot;
417     LPSTR         pszDisplayName;
418     LPCSTR        lpszTitle;
419     UINT          ulFlags;
420     BFFCALLBACK   lpfn;
421     LPARAM        lParam;
422     int           iImage;
423 }
424 alias BROWSEINFOA* PBROWSEINFOA, LPBROWSEINFOA;
425 
426 struct BROWSEINFOW {
427     HWND          hwndOwner;
428     LPCITEMIDLIST pidlRoot;
429     LPWSTR        pszDisplayName;
430     LPCWSTR       lpszTitle;
431     UINT          ulFlags;
432     BFFCALLBACK   lpfn;
433     LPARAM        lParam;
434     int           iImage;
435 }
436 alias BROWSEINFOW* PBROWSEINFOW, LPBROWSEINFOW;
437 } // align (8)
438 
439 struct CMINVOKECOMMANDINFO {
440     DWORD cbSize = this.sizeof;
441     DWORD fMask;
442     HWND hwnd;
443     LPCSTR lpVerb;
444     LPCSTR lpParameters;
445     LPCSTR lpDirectory;
446     int nShow;
447     DWORD dwHotKey;
448     HANDLE hIcon;
449 }
450 alias CMINVOKECOMMANDINFO* LPCMINVOKECOMMANDINFO;
451 
452 struct DROPFILES {
453     DWORD pFiles;
454     POINT pt;
455     BOOL fNC;
456     BOOL fWide;
457 }
458 alias DROPFILES* LPDROPFILES;
459 
460 enum SHGNO {
461     SHGDN_NORMAL             = 0,
462     SHGDN_INFOLDER,
463     SHGDN_FOREDITING         = 0x1000,
464     SHGDN_INCLUDE_NONFILESYS = 0x2000,
465     SHGDN_FORADDRESSBAR      = 0x4000,
466     SHGDN_FORPARSING         = 0x8000
467 }
468 
469 enum SHCONTF {
470     SHCONTF_FOLDERS            = 32,
471     SHCONTF_NONFOLDERS         = 64,
472     SHCONTF_INCLUDEHIDDEN      = 128,
473     SHCONTF_INIT_ON_FIRST_NEXT = 256,
474     SHCONTF_NETPRINTERSRCH     = 512,
475     SHCONTF_SHAREABLE          = 1024,
476     SHCONTF_STORAGE            = 2048
477 }
478 
479 align(8) struct STRRET {
480     UINT uType;
481     union {
482         LPWSTR pOleStr;
483         UINT uOffset;
484         char[MAX_PATH] cStr;
485     }
486 }
487 alias STRRET* LPSTRRET;
488 
489 enum FD_FLAGS {
490     FD_CLSID      = 1,
491     FD_SIZEPOINT  = 2,
492     FD_ATTRIBUTES = 4,
493     FD_CREATETIME = 8,
494     FD_ACCESSTIME = 16,
495     FD_WRITESTIME = 32,
496     FD_FILESIZE   = 64,
497     FD_LINKUI     = 0x8000
498 }
499 
500 struct FILEDESCRIPTORA {
501     DWORD dwFlags;
502     CLSID clsid;
503     SIZEL sizel;
504     POINTL pointl;
505     DWORD dwFileAttributes;
506     FILETIME ftCreationTime;
507     FILETIME ftLastAccessTime;
508     FILETIME ftLastWriteTime;
509     DWORD nFileSizeHigh;
510     DWORD nFileSizeLow;
511     CHAR[MAX_PATH] cFileName = 0;
512 }
513 alias FILEDESCRIPTORA* LPFILEDESCRIPTORA;
514 
515 struct FILEDESCRIPTORW {
516     DWORD dwFlags;
517     CLSID clsid;
518     SIZEL sizel;
519     POINTL pointl;
520     DWORD dwFileAttributes;
521     FILETIME ftCreationTime;
522     FILETIME ftLastAccessTime;
523     FILETIME ftLastWriteTime;
524     DWORD nFileSizeHigh;
525     DWORD nFileSizeLow;
526     WCHAR[MAX_PATH] cFileName = 0;
527 }
528 alias FILEDESCRIPTORW* LPFILEDESCRIPTORW;
529 
530 struct FILEGROUPDESCRIPTORA {
531     UINT cItems;
532     FILEDESCRIPTORA[1] fgd;
533 }
534 alias FILEGROUPDESCRIPTORA* LPFILEGROUPDESCRIPTORA;
535 
536 struct FILEGROUPDESCRIPTORW {
537     UINT cItems;
538     FILEDESCRIPTORW[1] fgd;
539 }
540 alias FILEGROUPDESCRIPTORW* LPFILEGROUPDESCRIPTORW;
541 
542 enum SLR_FLAGS {
543     SLR_NO_UI      = 1,
544     SLR_ANY_MATCH  = 2,
545     SLR_UPDATE     = 4,
546     SLR_NOUPDATE   = 8,
547     SLR_NOSEARCH   = 16,
548     SLR_NOTRACK    = 32,
549     SLR_NOLINKINFO = 64,
550     SLR_INVOKE_MSI = 128
551 }
552 
553 enum SLGP_FLAGS {
554     SLGP_SHORTPATH=1,
555     SLGP_UNCPRIORITY=2,
556     SLGP_RAWPATH=4
557 }
558 
559 alias PBYTE LPVIEWSETTINGS;
560 
561 enum FOLDERFLAGS {
562     FWF_AUTOARRANGE         = 1,
563     FWF_ABBREVIATEDNAMES    = 2,
564     FWF_SNAPTOGRID          = 4,
565     FWF_OWNERDATA           = 8,
566     FWF_BESTFITWINDOW       = 16,
567     FWF_DESKTOP             = 32,
568     FWF_SINGLESEL           = 64,
569     FWF_NOSUBFOLDERS        = 128,
570     FWF_TRANSPARENT         = 256,
571     FWF_NOCLIENTEDGE        = 512,
572     FWF_NOSCROLL            = 0x400,
573     FWF_ALIGNLEFT           = 0x800,
574     FWF_SINGLECLICKACTIVATE = 0x8000
575 }
576 
577 enum FOLDERVIEWMODE {
578     FVM_ICON      = 1,
579     FVM_SMALLICON,
580     FVM_LIST,
581     FVM_DETAILS
582 }
583 
584 struct FOLDERSETTINGS {
585     UINT ViewMode;
586     UINT fFlags;
587 }
588 alias FOLDERSETTINGS*        LPFOLDERSETTINGS;
589 alias const(FOLDERSETTINGS)* LPCFOLDERSETTINGS;
590 
591 struct FVSHOWINFO {
592     DWORD cbSize = this.sizeof;
593     HWND hwndOwner;
594     int iShow;
595     DWORD dwFlags;
596     RECT rect;
597     LPUNKNOWN punkRel;
598     OLECHAR[MAX_PATH] strNewFile = 0;
599 }
600 alias FVSHOWINFO* LPFVSHOWINFO;
601 
602 struct NRESARRAY {
603     UINT cItems;
604     NETRESOURCE[1] nr;
605 }
606 alias NRESARRAY* LPNRESARRAY;
607 
608 enum {
609     SBSC_HIDE,
610     SBSC_SHOW,
611     SBSC_TOGGLE,
612     SBSC_QUERY
613 }
614 
615 enum {
616     SBCMDID_ENABLESHOWTREE,
617     SBCMDID_SHOWCONTROL,
618     SBCMDID_CANCELNAVIGATION,
619     SBCMDID_MAYSAVECHANGES,
620     SBCMDID_SETHLINKFRAME,
621     SBCMDID_ENABLESTOP,
622     SBCMDID_OPTIONS
623 }
624 enum SVUIA_STATUS {
625     SVUIA_DEACTIVATE,
626     SVUIA_ACTIVATE_NOFOCUS,
627     SVUIA_ACTIVATE_FOCUS,
628     SVUIA_INPLACEACTIVATE
629 }
630 
631 static if (_WIN32_IE >= 0x500) {
632 
633     struct EXTRASEARCH
634      {
635         GUID guidSearch;
636         WCHAR[80] wszFriendlyName = 0;
637         WCHAR[2084] wszUrl = 0;
638     }
639     alias EXTRASEARCH* LPEXTRASEARCH;
640 
641     alias DWORD SHCOLSTATEF;
642 
643     struct SHCOLUMNID {
644         GUID fmtid;
645         DWORD pid;
646     }
647     alias SHCOLUMNID*        LPSHCOLUMNID;
648     alias const(SHCOLUMNID)* LPCSHCOLUMNID;
649 
650     struct SHELLDETAILS {
651         int fmt;
652         int cxChar;
653         STRRET str;
654     }
655     alias SHELLDETAILS* LPSHELLDETAILS;
656 
657     struct PERSIST_FOLDER_TARGET_INFO
658      {
659         LPITEMIDLIST pidlTargetFolder;
660         WCHAR[MAX_PATH] szTargetParsingName = 0;
661         WCHAR[MAX_PATH] szNetworkProvider = 0;
662         DWORD dwAttributes;
663         int csidl;
664     }
665 
666     enum SHGFP_TYPE {
667         SHGFP_TYPE_CURRENT = 0,
668         SHGFP_TYPE_DEFAULT = 1,
669     }
670 
671 }
672 
673 interface IEnumIDList : IUnknown {
674     HRESULT Next(ULONG, LPITEMIDLIST*, ULONG*);
675     HRESULT Skip(ULONG);
676     HRESULT Reset();
677     HRESULT Clone(IEnumIDList*);
678 }
679 alias IEnumIDList LPENUMIDLIST;
680 
681 interface IObjMgr : IUnknown {
682     HRESULT Append(IUnknown);
683     HRESULT Remove(IUnknown);
684 }
685 
686 interface IContextMenu : IUnknown {
687     HRESULT QueryContextMenu(HMENU, UINT, UINT, UINT, UINT);
688     HRESULT InvokeCommand(LPCMINVOKECOMMANDINFO);
689     HRESULT GetCommandString(UINT_PTR, UINT, PUINT, LPSTR, UINT);
690 }
691 alias IContextMenu LPCONTEXTMENU;
692 
693 interface IContextMenu2 : IContextMenu {
694     HRESULT HandleMenuMsg(UINT, WPARAM, LPARAM);
695 }
696 alias IContextMenu2 LPCONTEXTMENU2;
697 
698 static if (_WIN32_IE >= 0x500) {
699     align(8) {
700         struct SHCOLUMNINIT {
701             ULONG dwFlags;
702             ULONG dwReserved;
703             WCHAR[MAX_PATH] wszFolder = 0;
704         }
705         alias SHCOLUMNINIT*        LPSHCOLUMNINIT;
706         alias const(SHCOLUMNINIT)* LPCSHCOLUMNINIT;
707 
708         struct SHCOLUMNDATA {
709             ULONG dwFlags;
710             DWORD dwFileAttributes;
711             ULONG dwReserved;
712             WCHAR *pwszExt = null;
713             WCHAR[MAX_PATH] wszFile = 0;
714         }
715         alias SHCOLUMNDATA*        LPSHCOLUMNDATA;
716         alias const(SHCOLUMNDATA)* LPCSHCOLUMNDATA;
717     }
718 
719 enum MAX_COLUMN_NAME_LEN = 80;
720 enum MAX_COLUMN_DESC_LEN = 128;
721 
722     align(1) struct SHCOLUMNINFO {
723         align(1):
724         SHCOLUMNID scid;
725         VARTYPE vt;
726         DWORD fmt;
727         UINT cChars;
728         DWORD csFlags;
729         WCHAR[MAX_COLUMN_NAME_LEN] wszTitle = 0;
730         WCHAR[MAX_COLUMN_DESC_LEN] wszDescription = 0;
731     }
732     alias SHCOLUMNINFO*        LPSHCOLUMNINFO;
733     alias const(SHCOLUMNINFO)* LPCSHCOLUMNINFO;
734 
735     enum SHCOLSTATE {
736         SHCOLSTATE_TYPE_STR      = 0x00000001,
737         SHCOLSTATE_TYPE_INT      = 0x00000002,
738         SHCOLSTATE_TYPE_DATE     = 0x00000003,
739         SHCOLSTATE_TYPEMASK      = 0x0000000f,
740         SHCOLSTATE_ONBYDEFAULT   = 0x00000010,
741         SHCOLSTATE_SLOW          = 0x00000020,
742         SHCOLSTATE_EXTENDED      = 0x00000040,
743         SHCOLSTATE_SECONDARYUI   = 0x00000080,
744         SHCOLSTATE_HIDDEN        = 0x00000100,
745         SHCOLSTATE_PREFER_VARCMP = 0x00000200
746     }
747 
748     interface IColumnProvider : IUnknown {
749         HRESULT Initialize(LPCSHCOLUMNINIT);
750         HRESULT GetColumnInfo(DWORD, SHCOLUMNINFO*);
751         HRESULT GetItemData(LPCSHCOLUMNID, LPCSHCOLUMNDATA, VARIANT*);
752     }
753 }/* _WIN32_IE >= 0x500 */
754 
755 interface IQueryInfo : IUnknown {
756     HRESULT GetInfoTip(DWORD, WCHAR**);
757     HRESULT GetInfoFlags(DWORD*);
758 }
759 
760 interface IShellExtInit : IUnknown {
761     HRESULT Initialize(LPCITEMIDLIST, LPDATAOBJECT, HKEY);
762 }
763 alias IShellExtInit LPSHELLEXTINIT;
764 
765 interface IShellPropSheetExt : IUnknown {
766     HRESULT AddPages(LPFNADDPROPSHEETPAGE, LPARAM);
767     HRESULT ReplacePage(UINT, LPFNADDPROPSHEETPAGE, LPARAM);
768 }
769 alias IShellPropSheetExt LPSHELLPROPSHEETEXT;
770 
771 interface IExtractIconA : IUnknown {
772     HRESULT GetIconLocation(UINT, LPSTR, UINT, int*, PUINT);
773     HRESULT Extract(LPCSTR, UINT, HICON*, HICON*, UINT);
774 }
775 alias IExtractIconA LPEXTRACTICONA;
776 
777 interface IExtractIconW : IUnknown {
778     HRESULT GetIconLocation(UINT, LPWSTR, UINT, int*, PUINT);
779     HRESULT Extract(LPCWSTR, UINT, HICON*, HICON*, UINT);
780 }
781 alias IExtractIconW LPEXTRACTICONW;
782 
783 version (Unicode) {
784     alias IExtractIconW IExtractIcon;
785     alias LPEXTRACTICONW LPEXTRACTICON;
786 } else {
787     alias IExtractIconA IExtractIcon;
788     alias LPEXTRACTICONA LPEXTRACTICON;
789 }
790 
791 interface IShellLinkA : IUnknown {
792     HRESULT GetPath(LPSTR, int, WIN32_FIND_DATAA*, DWORD);
793     HRESULT GetIDList(LPITEMIDLIST*);
794     HRESULT SetIDList(LPCITEMIDLIST);
795     HRESULT GetDescription(LPSTR, int);
796     HRESULT SetDescription(LPCSTR);
797     HRESULT GetWorkingDirectory(LPSTR, int);
798     HRESULT SetWorkingDirectory(LPCSTR);
799     HRESULT GetArguments(LPSTR, int);
800     HRESULT SetArguments(LPCSTR);
801     HRESULT GetHotkey(PWORD);
802     HRESULT SetHotkey(WORD);
803     HRESULT GetShowCmd(int*);
804     HRESULT SetShowCmd(int);
805     HRESULT GetIconLocation(LPSTR, int, int*);
806     HRESULT SetIconLocation(LPCSTR, int);
807     HRESULT SetRelativePath(LPCSTR , DWORD);
808     HRESULT Resolve(HWND, DWORD);
809     HRESULT SetPath(LPCSTR);
810 }
811 
812 interface IShellLinkW : IUnknown {
813     HRESULT GetPath(LPWSTR, int, WIN32_FIND_DATAW*, DWORD);
814     HRESULT GetIDList(LPITEMIDLIST*);
815     HRESULT SetIDList(LPCITEMIDLIST);
816     HRESULT GetDescription(LPWSTR, int);
817     HRESULT SetDescription(LPCWSTR);
818     HRESULT GetWorkingDirectory(LPWSTR, int);
819     HRESULT SetWorkingDirectory(LPCWSTR);
820     HRESULT GetArguments(LPWSTR, int);
821     HRESULT SetArguments(LPCWSTR);
822     HRESULT GetHotkey(PWORD);
823     HRESULT SetHotkey(WORD);
824     HRESULT GetShowCmd(int*);
825     HRESULT SetShowCmd(int);
826     HRESULT GetIconLocation(LPWSTR, int, int*);
827     HRESULT SetIconLocation(LPCWSTR, int);
828     HRESULT SetRelativePath(LPCWSTR , DWORD);
829     HRESULT Resolve(HWND, DWORD);
830     HRESULT SetPath(LPCWSTR);
831 }
832 
833 
834 interface IShellFolder : IUnknown {
835     HRESULT ParseDisplayName(HWND, LPBC, LPOLESTR, PULONG, LPITEMIDLIST*, PULONG);
836     HRESULT EnumObjects(HWND, DWORD, LPENUMIDLIST*);
837     HRESULT BindToObject(LPCITEMIDLIST, LPBC, REFIID, PVOID*);
838     HRESULT BindToStorage(LPCITEMIDLIST, LPBC, REFIID, PVOID*);
839     HRESULT CompareIDs(LPARAM, LPCITEMIDLIST, LPCITEMIDLIST);
840     HRESULT CreateViewObject(HWND, REFIID, PVOID*);
841     HRESULT GetAttributesOf(UINT, LPCITEMIDLIST*, PULONG);
842     HRESULT GetUIObjectOf(HWND, UINT, LPCITEMIDLIST*, REFIID, PUINT, PVOID*);
843     HRESULT GetDisplayNameOf(LPCITEMIDLIST, DWORD, LPSTRRET);
844     HRESULT SetNameOf(HWND, LPCITEMIDLIST, LPCOLESTR, DWORD, LPITEMIDLIST*);
845 }
846 alias IShellFolder LPSHELLFOLDER;
847 
848 static if (_WIN32_IE >= 0x500) {
849 
850 interface IEnumExtraSearch: IUnknown {
851     HRESULT Next(ULONG, LPEXTRASEARCH*, ULONG*);
852     HRESULT Skip(ULONG);
853     HRESULT Reset();
854     HRESULT Clone(IEnumExtraSearch*);
855 }
856 alias IEnumExtraSearch LPENUMEXTRASEARCH;
857 
858 interface IShellFolder2 : IShellFolder {
859     HRESULT GetDefaultSearchGUID(GUID*);
860     HRESULT EnumSearches(IEnumExtraSearch*);
861     HRESULT GetDefaultColumn(DWORD, ULONG*, ULONG*);
862     HRESULT GetDefaultColumnState(UINT, SHCOLSTATEF*);
863     HRESULT GetDetailsEx(LPCITEMIDLIST, const(SHCOLUMNID)*, VARIANT*);
864     HRESULT GetDetailsOf(LPCITEMIDLIST, UINT, SHELLDETAILS*);
865     HRESULT MapColumnToSCID(UINT, SHCOLUMNID*);
866 }
867 alias IShellFolder2 LPSHELLFOLDER2;
868 
869 } /* _WIN32_IE >= 0x500 */
870 
871 interface ICopyHook : IUnknown {
872     UINT CopyCallback(HWND, UINT, UINT, LPCSTR, DWORD, LPCSTR, DWORD);
873 }
874 alias ICopyHook LPCOPYHOOK;
875 
876 interface IFileViewerSite : IUnknown {
877     HRESULT SetPinnedWindow(HWND);
878     HRESULT GetPinnedWindow(HWND*);
879 }
880 alias IFileViewerSite LPFILEVIEWERSITE;
881 
882 interface IFileViewer : IUnknown {
883     HRESULT ShowInitialize(LPFILEVIEWERSITE);
884     HRESULT Show(LPFVSHOWINFO);
885     HRESULT PrintTo(LPSTR, BOOL);
886 }
887 alias IFileViewer LPFILEVIEWER;
888 
889 interface IFileSystemBindData : IUnknown {
890     HRESULT SetFindData(const(WIN32_FIND_DATAW)*);
891     HRESULT GetFindData(WIN32_FIND_DATAW*);
892 }
893 
894 interface IPersistFolder : IPersist {
895     HRESULT GetClassID(CLSID*);
896     HRESULT Initialize(LPCITEMIDLIST);
897 }
898 alias IPersistFolder LPPERSISTFOLDER;
899 
900 static if (_WIN32_IE >= 0x400 || _WIN32_WINNT >= 0x500) {
901 
902 interface IPersistFolder2 : IPersistFolder {
903     HRESULT GetClassID(CLSID*);
904     HRESULT Initialize(LPCITEMIDLIST);
905     HRESULT GetCurFolder(LPITEMIDLIST*);
906 }
907 alias IPersistFolder2 LPPERSISTFOLDER2;
908 
909 }/* _WIN32_IE >= 0x400 || _WIN32_WINNT >= 0x500 */
910 
911 static if (_WIN32_IE >= 0x500) {
912 
913 interface IPersistFolder3 : IPersistFolder2 {
914     HRESULT GetClassID(CLSID*);
915     HRESULT Initialize(LPCITEMIDLIST);
916     HRESULT GetCurFolder(LPITEMIDLIST*);
917     HRESULT InitializeEx(IBindCtx, LPCITEMIDLIST, const(PERSIST_FOLDER_TARGET_INFO)*);
918     HRESULT GetFolderTargetInfo(PERSIST_FOLDER_TARGET_INFO*);
919 }
920 alias IPersistFolder3 LPPERSISTFOLDER3;
921 
922 } /* _WIN32_IE >= 0x500 */
923 
924 alias IShellBrowser LPSHELLBROWSER;
925 alias IShellView LPSHELLVIEW;
926 
927 interface IShellBrowser : IOleWindow {
928     HRESULT GetWindow(HWND*);
929     HRESULT ContextSensitiveHelp(BOOL);
930     HRESULT InsertMenusSB(HMENU, LPOLEMENUGROUPWIDTHS);
931     HRESULT SetMenuSB(HMENU, HOLEMENU, HWND);
932     HRESULT RemoveMenusSB(HMENU);
933     HRESULT SetStatusTextSB(LPCOLESTR);
934     HRESULT EnableModelessSB(BOOL);
935     HRESULT TranslateAcceleratorSB(LPMSG, WORD);
936     HRESULT BrowseObject(LPCITEMIDLIST, UINT);
937     HRESULT GetViewStateStream(DWORD, LPSTREAM*);
938     HRESULT GetControlWindow(UINT, HWND*);
939     HRESULT SendControlMsg(UINT, UINT, WPARAM, LPARAM, LRESULT*);
940     HRESULT QueryActiveShellView(LPSHELLVIEW*);
941     HRESULT OnViewWindowActive(LPSHELLVIEW);
942     HRESULT SetToolbarItems(LPTBBUTTON, UINT, UINT);
943 }
944 
945 interface IShellView : IOleWindow {
946     HRESULT GetWindow(HWND*);
947     HRESULT ContextSensitiveHelp(BOOL);
948     HRESULT TranslateAccelerator(LPMSG);
949 //[No] #ifdef _FIX_ENABLEMODELESS_CONFLICT
950 //[No]  STDMETHOD(EnableModelessSV)(THIS_ BOOL) PURE;
951 //[Yes] #else
952     HRESULT EnableModeless(BOOL);
953 //[Yes] #endif
954     HRESULT UIActivate(UINT);
955     HRESULT Refresh();
956     HRESULT CreateViewWindow(IShellView, LPCFOLDERSETTINGS, LPSHELLBROWSER, RECT*, HWND*);
957     HRESULT DestroyViewWindow();
958     HRESULT GetCurrentInfo(LPFOLDERSETTINGS);
959     HRESULT AddPropertySheetPages(DWORD, LPFNADDPROPSHEETPAGE, LPARAM);
960     HRESULT SaveViewState();
961     HRESULT SelectItem(LPCITEMIDLIST, UINT);
962     HRESULT GetItemObject(UINT, REFIID, PVOID*);
963 }
964 
965 interface ICommDlgBrowser : IUnknown {
966     HRESULT OnDefaultCommand(IShellView);
967     HRESULT OnStateChange(IShellView, ULONG);
968     HRESULT IncludeObject(IShellView, LPCITEMIDLIST);
969 }
970 alias ICommDlgBrowser LPCOMMDLGBROWSER;
971 
972 alias GUID SHELLVIEWID;
973 
974 struct SV2CVW2_PARAMS {
975     DWORD cbSize = this.sizeof;
976     IShellView psvPrev;
977     FOLDERSETTINGS  *pfs;
978     IShellBrowser psbOwner;
979     RECT *prcView;
980 const(SHELLVIEWID)* pvid;
981     HWND hwndView;
982 }
983 alias SV2CVW2_PARAMS* LPSV2CVW2_PARAMS;
984 
985 interface IShellView2 : IShellView {
986     HRESULT GetWindow(HWND*);
987     HRESULT ContextSensitiveHelp(BOOL);
988     HRESULT TranslateAccelerator(LPMSG);
989 //[No] #ifdef _FIX_ENABLEMODELESS_CONFLICT
990 //[No]  STDMETHOD(EnableModelessSV)(THIS_ BOOL) PURE;
991 //[Yes] #else
992     HRESULT EnableModeless(BOOL);
993 //[Yes] #endif
994     HRESULT UIActivate(UINT);
995     HRESULT Refresh();
996     HRESULT CreateViewWindow(IShellView, LPCFOLDERSETTINGS, LPSHELLBROWSER, RECT*, HWND*);
997     HRESULT DestroyViewWindow();
998     HRESULT GetCurrentInfo(LPFOLDERSETTINGS);
999     HRESULT AddPropertySheetPages(DWORD, LPFNADDPROPSHEETPAGE, LPARAM);
1000     HRESULT SaveViewState();
1001     HRESULT SelectItem(LPCITEMIDLIST, UINT);
1002     HRESULT GetItemObject(UINT, REFIID, PVOID*);
1003     HRESULT GetView(SHELLVIEWID*, ULONG);
1004     HRESULT CreateViewWindow2(LPSV2CVW2_PARAMS);
1005 }
1006 
1007 interface IShellExecuteHookA : IUnknown {
1008     HRESULT Execute(LPSHELLEXECUTEINFOA);
1009 }
1010 
1011 interface IShellExecuteHookW : IUnknown {
1012     HRESULT Execute(LPSHELLEXECUTEINFOW);
1013 }
1014 
1015 interface IShellIcon : IUnknown {
1016     HRESULT GetIconOf(LPCITEMIDLIST, UINT, PINT);
1017 }
1018 alias IShellIcon LPSHELLICON;
1019 
1020 struct SHELLFLAGSTATE {
1021     short _bf;
1022 /*
1023     BOOL fShowAllObjects : 1;
1024     BOOL fShowExtensions : 1;
1025     BOOL fNoConfirmRecycle : 1;
1026     BOOL fShowSysFiles : 1;
1027     BOOL fShowCompColor : 1;
1028     BOOL fDoubleClickInWebView : 1;
1029     BOOL fDesktopHTML : 1;
1030     BOOL fWin95Classic : 1;
1031     BOOL fDontPrettyPath : 1;
1032     BOOL fShowAttribCol : 1;
1033     BOOL fMapNetDrvBtn : 1;
1034     BOOL fShowInfoTip : 1;
1035     BOOL fHideIcons : 1;
1036     UINT fRestFlags : 3;
1037 */
1038     @property bool fShowAllObjects()       { return cast(bool) (_bf & 0x0001); }
1039     @property bool fShowExtensions()       { return cast(bool) (_bf & 0x0002); }
1040     @property bool fNoConfirmRecycle()     { return cast(bool) (_bf & 0x0004); }
1041     @property bool fShowSysFiles()         { return cast(bool) (_bf & 0x0008); }
1042     @property bool fShowCompColor()        { return cast(bool) (_bf & 0x0010); }
1043     @property bool fDoubleClickInWebView() { return cast(bool) (_bf & 0x0020); }
1044     @property bool fDesktopHTML()          { return cast(bool) (_bf & 0x0040); }
1045     @property bool fWin95Classic()         { return cast(bool) (_bf & 0x0080); }
1046     @property bool fDontPrettyPath()       { return cast(bool) (_bf & 0x0100); }
1047     @property bool fShowAttribCol()        { return cast(bool) (_bf & 0x0200); }
1048     @property bool fMapNetDrvBtn()         { return cast(bool) (_bf & 0x0400); }
1049     @property bool fShowInfoTip()          { return cast(bool) (_bf & 0x0800); }
1050     @property bool fHideIcons()            { return cast(bool) (_bf & 0x1000); }
1051     @property ubyte fRestFlags()           { return cast(ubyte) (_bf >> 13); }
1052 
1053     @property bool fShowAllObjects(bool f)       { _bf = cast(ushort) ((_bf & ~0xFFFE) | f);        return f; }
1054     @property bool fShowExtensions(bool f)       { _bf = cast(ushort) ((_bf & ~0xFFFD) | (f <<  1)); return f; }
1055     @property bool fNoConfirmRecycle(bool f)     { _bf = cast(ushort) ((_bf & ~0xFFFB) | (f <<  2)); return f; }
1056     @property bool fShowSysFiles(bool f)         { _bf = cast(ushort) ((_bf & ~0xFFF8) | (f <<  3)); return f; }
1057     @property bool fShowCompColor(bool f)        { _bf = cast(ushort) ((_bf & ~0xFFEF) | (f <<  4)); return f; }
1058     @property bool fDoubleClickInWebView(bool f) { _bf = cast(ushort) ((_bf & ~0xFFDF) | (f <<  5)); return f; }
1059     @property bool fDesktopHTML(bool f)          { _bf = cast(ushort) ((_bf & ~0xFFBF) | (f <<  6)); return f; }
1060     @property bool fWin95Classic(bool f)         { _bf = cast(ushort) ((_bf & ~0xFF8F) | (f <<  7)); return f; }
1061     @property bool fDontPrettyPath(bool f)       { _bf = cast(ushort) ((_bf & ~0xFEFF) | (f <<  8)); return f; }
1062     @property bool fShowAttribCol(bool f)        { _bf = cast(ushort) ((_bf & ~0xFDFF) | (f <<  9)); return f; }
1063     @property bool fMapNetDrvBtn(bool f)         { _bf = cast(ushort) ((_bf & ~0xFBFF) | (f << 10)); return f; }
1064     @property bool fShowInfoTip(bool f)          { _bf = cast(ushort) ((_bf & ~0xF8FF) | (f << 11)); return f; }
1065     @property bool fHideIcons(bool f)            { _bf = cast(ushort) ((_bf & ~0xEFFF) | (f << 12)); return f; }
1066     @property ubyte fRestFlags(ubyte f)          { _bf = cast(ushort) ((_bf & ~0x1FFF) | (f << 13)); return cast(ubyte) (f & 7); }
1067 }
1068 alias SHELLFLAGSTATE* LPSHELLFLAGSTATE;
1069 
1070 enum SSF_SHOWALLOBJECTS = 0x1;
1071 enum SSF_SHOWEXTENSIONS = 0x2;
1072 enum SSF_SHOWCOMPCOLOR = 0x8;
1073 enum SSF_SHOWSYSFILES = 0x20;
1074 enum SSF_DOUBLECLICKINWEBVIEW = 0x80;
1075 enum SSF_SHOWATTRIBCOL = 0x100;
1076 enum SSF_DESKTOPHTML = 0x200;
1077 enum SSF_WIN95CLASSIC = 0x400;
1078 enum SSF_DONTPRETTYPATH = 0x800;
1079 enum SSF_MAPNETDRVBUTTON = 0x1000;
1080 enum SSF_SHOWINFOTIP = 0x2000;
1081 enum SSF_HIDEICONS = 0x4000;
1082 enum SSF_NOCONFIRMRECYCLE = 0x8000;
1083 
1084 interface IShellIconOverlayIdentifier : IUnknown {
1085     HRESULT IsMemberOf(LPCWSTR, DWORD);
1086     HRESULT GetOverlayInfo(LPWSTR, int, int*, DWORD*);
1087     HRESULT GetPriority(int*);
1088 }
1089 
1090 enum ISIOI_ICONFILE  = 0x00000001;
1091 enum ISIOI_ICONINDEX = 0x00000002;
1092 
1093 static if (_WIN32_WINNT >= 0x500) {
1094     struct SHELLSTATE {
1095         uint _bf1;
1096         DWORD dwWin95Unused;
1097         UINT uWin95Unused;
1098         LONG lParamSort;
1099         int iSortDirection;
1100         UINT _version;
1101         UINT uNotUsed;
1102         uint _bf2;
1103     /*
1104         BOOL fShowAllObjects : 1;
1105         BOOL fShowExtensions : 1;
1106         BOOL fNoConfirmRecycle : 1;
1107         BOOL fShowSysFiles : 1;
1108         BOOL fShowCompColor : 1;
1109         BOOL fDoubleClickInWebView : 1;
1110         BOOL fDesktopHTML : 1;
1111         BOOL fWin95Classic : 1;
1112         BOOL fDontPrettyPath : 1;
1113         BOOL fShowAttribCol : 1;
1114         BOOL fMapNetDrvBtn : 1;
1115         BOOL fShowInfoTip : 1;
1116         BOOL fHideIcons : 1;
1117         BOOL fWebView : 1;
1118         BOOL fFilter : 1;
1119         BOOL fShowSuperHidden : 1;
1120         BOOL fNoNetCrawling : 1;
1121     */
1122         @property bool fShowAllObjects()       { return cast(bool) (_bf1 & 0x00000001); }
1123         @property bool fShowExtensions()       { return cast(bool) (_bf1 & 0x00000002); }
1124         @property bool fNoConfirmRecycle()     { return cast(bool) (_bf1 & 0x00000004); }
1125         @property bool fShowSysFiles()         { return cast(bool) (_bf1 & 0x00000008); }
1126         @property bool fShowCompColor()        { return cast(bool) (_bf1 & 0x00000010); }
1127         @property bool fDoubleClickInWebView() { return cast(bool) (_bf1 & 0x00000020); }
1128         @property bool fDesktopHTML()          { return cast(bool) (_bf1 & 0x00000040); }
1129         @property bool fWin95Classic()         { return cast(bool) (_bf1 & 0x00000080); }
1130         @property bool fDontPrettyPath()       { return cast(bool) (_bf1 & 0x00000100); }
1131         @property bool fShowAttribCol()        { return cast(bool) (_bf1 & 0x00000200); }
1132         @property bool fMapNetDrvBtn()         { return cast(bool) (_bf1 & 0x00000400); }
1133         @property bool fShowInfoTip()          { return cast(bool) (_bf1 & 0x00000800); }
1134         @property bool fHideIcons()            { return cast(bool) (_bf1 & 0x00001000); }
1135         @property bool fWebView()              { return cast(bool) (_bf1 & 0x00002000); }
1136         @property bool fFilter()               { return cast(bool) (_bf1 & 0x00004000); }
1137         @property bool fShowSuperHidden()      { return cast(bool) (_bf1 & 0x00008000); }
1138         @property bool fNoNetCrawling()        { return cast(bool) (_bf1 & 0x00010000); }
1139 
1140         @property bool fShowAllObjects(bool f)       { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFFE) | f);         return f; }
1141         @property bool fShowExtensions(bool f)       { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFFD) | (f <<  1)); return f; }
1142         @property bool fNoConfirmRecycle(bool f)     { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFFB) | (f <<  2)); return f; }
1143         @property bool fShowSysFiles(bool f)         { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFF8) | (f <<  3)); return f; }
1144         @property bool fShowCompColor(bool f)        { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFEF) | (f <<  4)); return f; }
1145         @property bool fDoubleClickInWebView(bool f) { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFDF) | (f <<  5)); return f; }
1146         @property bool fDesktopHTML(bool f)          { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFBF) | (f <<  6)); return f; }
1147         @property bool fWin95Classic(bool f)         { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFF8F) | (f <<  7)); return f; }
1148         @property bool fDontPrettyPath(bool f)       { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFEFF) | (f <<  8)); return f; }
1149         @property bool fShowAttribCol(bool f)        { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFDFF) | (f <<  9)); return f; }
1150         @property bool fMapNetDrvBtn(bool f)         { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFBFF) | (f << 10)); return f; }
1151         @property bool fShowInfoTip(bool f)          { _bf1 = cast(uint) ((_bf1 & ~0xFFFFF8FF) | (f << 11)); return f; }
1152         @property bool fHideIcons(bool f)            { _bf1 = cast(uint) ((_bf1 & ~0xFFFFEFFF) | (f << 12)); return f; }
1153         @property bool fWebView(bool f)              { _bf1 = cast(uint) ((_bf1 & ~0xFFFFDFFF) | (f << 13)); return f; }
1154         @property bool fFilter(bool f)               { _bf1 = cast(uint) ((_bf1 & ~0xFFFFBFFF) | (f << 14)); return f; }
1155         @property bool fShowSuperHidden(bool f)      { _bf1 = cast(uint) ((_bf1 & ~0xFFFF8FFF) | (f << 15)); return f; }
1156         @property bool fNoNetCrawling(bool f)        { _bf1 = cast(uint) ((_bf1 & ~0xFFFEFFFF) | (f << 16)); return f; }
1157     /*
1158         BOOL fSepProcess : 1;
1159         BOOL fStartPanelOn : 1;
1160         BOOL fShowStartPage : 1;
1161         UINT fSpareFlags : 13;
1162     */
1163         @property bool fSepProcess()           { return cast(bool) (_bf2 & 0x00000001); }
1164         @property bool fStartPanelOn()         { return cast(bool) (_bf2 & 0x00000002); }
1165         @property bool fShowStartPage()        { return cast(bool) (_bf2 & 0x00000004); }
1166         @property ushort fSpareFlags()         { return cast(ushort) ((_bf2 & 0x0000FFF8) >> 3); }
1167 
1168         @property bool fSepProcess(bool f)     { _bf2 = cast(uint) ((_bf2 & ~0xFFFFFFFE) | f);        return f; }
1169         @property bool fStartPanelOn(bool f)   { _bf2 = cast(uint) ((_bf2 & ~0xFFFFFFFD) | (f << 1)); return f; }
1170         @property bool fShowStartPage(bool f)  { _bf2 = cast(uint) ((_bf2 & ~0xFFFFFFFB) | (f << 2)); return f; }
1171         @property ushort fSpareFlags(ushort f) {
1172             _bf2 = cast(ushort) ((_bf2 & ~0xFFFF0007) | ((f & 0x1FFF) << 3));
1173             return cast(ushort) (f & 0x1FFF);
1174         }
1175     }
1176     alias SHELLSTATE* LPSHELLSTATE;
1177 }
1178 
1179 static if (_WIN32_IE >= 0x500) {
1180     align(8) {
1181         struct SHDRAGIMAGE {
1182             SIZE sizeDragImage;
1183             POINT ptOffset;
1184             HBITMAP hbmpDragImage;
1185             COLORREF crColorKey;
1186         }
1187         alias SHDRAGIMAGE* LPSHDRAGIMAGE;
1188     }
1189 
1190     interface IDragSourceHelper : IUnknown {
1191         HRESULT InitializeFromBitmap(LPSHDRAGIMAGE pshdi, IDataObject pDataObject);
1192         HRESULT InitializeFromWindow(HWND hwnd, POINT* ppt, IDataObject pDataObject);
1193     }
1194 
1195     interface IDropTargetHelper : IUnknown {
1196         HRESULT DragEnter(HWND hwndTarget, IDataObject pDataObject, POINT* ppt, DWORD dwEffect);
1197         HRESULT DragLeave();
1198         HRESULT DragOver(POINT* ppt, DWORD dwEffect);
1199         HRESULT Drop(IDataObject pDataObject, POINT* ppt, DWORD dwEffect);
1200         HRESULT Show(BOOL fShow);
1201     }
1202 }
1203 
1204 extern (Windows):
1205 void SHAddToRecentDocs(UINT, PCVOID);
1206 LPITEMIDLIST SHBrowseForFolderA(PBROWSEINFOA);
1207 LPITEMIDLIST SHBrowseForFolderW(PBROWSEINFOW);
1208 void SHChangeNotify(LONG, UINT, PCVOID, PCVOID);
1209 HRESULT SHGetDataFromIDListA(LPSHELLFOLDER, LPCITEMIDLIST, int, PVOID, int);
1210 HRESULT SHGetDataFromIDListW(LPSHELLFOLDER, LPCITEMIDLIST, int, PVOID, int);
1211 HRESULT SHGetDesktopFolder(LPSHELLFOLDER*);
1212 HRESULT SHGetInstanceExplorer(IUnknown*);
1213 HRESULT SHGetMalloc(LPMALLOC*);
1214 BOOL SHGetPathFromIDListA(LPCITEMIDLIST, LPSTR);
1215 BOOL SHGetPathFromIDListW(LPCITEMIDLIST, LPWSTR);
1216 HRESULT SHGetSpecialFolderLocation(HWND, int, LPITEMIDLIST*);
1217 HRESULT SHLoadInProc(REFCLSID);
1218 
1219 static if (_WIN32_IE >= 0x400) {
1220     BOOL SHGetSpecialFolderPathA(HWND, LPSTR, int, BOOL);
1221     BOOL SHGetSpecialFolderPathW(HWND, LPWSTR, int, BOOL);
1222 }
1223 
1224 /* SHGetFolderPath in shfolder.dll on W9x, NT4, also in shell32.dll on W2K */
1225 HRESULT SHGetFolderPathA(HWND, int, HANDLE, DWORD, LPSTR);
1226 HRESULT SHGetFolderPathW(HWND, int, HANDLE, DWORD, LPWSTR);
1227 
1228 static if (_WIN32_WINNT >= 0x500) {
1229     INT SHGetIconOverlayIndexW(LPCWSTR pszIconPath, int iIconIndex);
1230     INT SHGetIconOverlayIndexA(LPCSTR pszIconPath, int iIconIndex);
1231     HRESULT SHGetFolderLocation(HWND, int, HANDLE, DWORD, LPITEMIDLIST*);
1232     INT SHCreateDirectoryExA(HWND, LPCSTR, LPSECURITY_ATTRIBUTES);
1233     INT SHCreateDirectoryExW(HWND, LPCWSTR, LPSECURITY_ATTRIBUTES);
1234     HRESULT SHBindToParent(LPCITEMIDLIST, REFIID, VOID**, LPCITEMIDLIST*);
1235 }
1236 
1237 static if (_WIN32_WINNT >= 0x501) {
1238     enum {
1239         PRF_VERIFYEXISTS         = 0x0001,
1240         PRF_TRYPROGRAMEXTENSIONS = (0x0002 | PRF_VERIFYEXISTS),
1241         PRF_FIRSTDIRDEF          = 0x0004,
1242         PRF_DONTFINDLNK          = 0x0008,
1243         IDO_SHGIOI_SHARE         = 0x0FFFFFFF,
1244         IDO_SHGIOI_LINK          = 0x0FFFFFFE,
1245         IDO_SHGIOI_SLOWFILE      = 0x0FFFFFFD,
1246         IDO_SHGIOI_DEFAULT       = 0x0FFFFFFC
1247     }
1248 
1249     struct SHDESCRIPTIONID {
1250         DWORD dwDescriptionId;
1251         CLSID clsid;
1252     }
1253     alias SHDESCRIPTIONID* LPSHDESCRIPTIONID;
1254 
1255     BOOL PathResolve(LPWSTR, LPCWSTR*, UINT);
1256     HRESULT SHGetFolderPathAndSubDirA(HWND, int, HANDLE, DWORD, LPCSTR, LPSTR);
1257     HRESULT SHGetFolderPathAndSubDirW(HWND, int, HANDLE, DWORD, LPCWSTR, LPWSTR);
1258     HRESULT SHParseDisplayName(LPCWSTR, IBindCtx, LPITEMIDLIST, SFGAOF, SFGAOF*);
1259 }
1260 
1261 void SHGetSettings(LPSHELLFLAGSTATE, DWORD);
1262 
1263 static if (_WIN32_WINNT >= 0x500) {
1264     void SHGetSetSettings(LPSHELLSTATE, DWORD, BOOL);
1265     BOOL ILIsEqual(LPCITEMIDLIST, LPCITEMIDLIST);
1266     BOOL ILIsParent(LPCITEMIDLIST, LPCITEMIDLIST, BOOL);
1267     BOOL ILRemoveLastID(LPITEMIDLIST);
1268     HRESULT ILLoadFromStream(IStream, LPITEMIDLIST*);
1269     HRESULT ILSaveToStream(IStream, LPCITEMIDLIST);
1270     LPITEMIDLIST ILAppendID(LPITEMIDLIST, LPCSHITEMID, BOOL);
1271     LPITEMIDLIST ILClone(LPCITEMIDLIST);
1272     LPITEMIDLIST ILCloneFirst(LPCITEMIDLIST);
1273     LPITEMIDLIST ILCombine(LPCITEMIDLIST, LPCITEMIDLIST);
1274     LPITEMIDLIST ILFindChild(LPCITEMIDLIST, LPCITEMIDLIST);
1275     LPITEMIDLIST ILFindLastID(LPCITEMIDLIST);
1276     LPITEMIDLIST ILGetNext(LPCITEMIDLIST);
1277     UINT ILGetSize(LPCITEMIDLIST);
1278     void ILFree(LPITEMIDLIST);
1279 
1280     HRESULT SHCoCreateInstance(LPCWSTR, REFCLSID, IUnknown, REFIID, void**);
1281 }
1282 
1283 version (Unicode) {
1284     alias IShellExecuteHookW IShellExecuteHook;
1285     alias IShellLinkW IShellLink;
1286     alias BROWSEINFOW BROWSEINFO;
1287     alias SHBrowseForFolderW SHBrowseForFolder;
1288     alias SHGetDataFromIDListW SHGetDataFromIDList;
1289     alias SHGetPathFromIDListW SHGetPathFromIDList;
1290     static if (_WIN32_IE >= 0x400) {
1291         alias SHGetSpecialFolderPathW SHGetSpecialFolderPath;
1292     }
1293     alias SHGetFolderPathW SHGetFolderPath;
1294     static if (_WIN32_WINNT >= 0x500) {
1295         alias SHGetIconOverlayIndexW SHGetIconOverlayIndex;
1296         alias SHCreateDirectoryExW SHCreateDirectoryEx;
1297     }
1298     static if (_WIN32_WINNT >= 0x501) {
1299         alias SHGetFolderPathAndSubDirW SHGetFolderPathAndSubDir;
1300     }
1301     alias FILEDESCRIPTORW FILEDESCRIPTOR;
1302     alias LPFILEDESCRIPTORW LPFILEDESCRIPTOR;
1303     alias FILEGROUPDESCRIPTORW FILEGROUPDESCRIPTOR;
1304     alias LPFILEGROUPDESCRIPTORW LPFILEGROUPDESCRIPTOR;
1305 
1306 } else {
1307     alias IShellExecuteHookA IShellExecuteHook;
1308     alias IShellLinkA IShellLink;
1309     alias BROWSEINFOA BROWSEINFO;
1310     alias SHBrowseForFolderA SHBrowseForFolder;
1311     alias SHGetDataFromIDListA SHGetDataFromIDList;
1312     alias SHGetPathFromIDListA SHGetPathFromIDList;
1313     static if (_WIN32_IE >= 0x400) {
1314         alias SHGetSpecialFolderPathA SHGetSpecialFolderPath;
1315     }
1316     alias SHGetFolderPathA SHGetFolderPath;
1317     static if (_WIN32_WINNT >= 0x500) {
1318         alias SHGetIconOverlayIndexA SHGetIconOverlayIndex;
1319         alias SHCreateDirectoryExA SHCreateDirectoryEx;
1320     }
1321     static if (_WIN32_WINNT >= 0x501) {
1322         alias SHGetFolderPathAndSubDirA SHGetFolderPathAndSubDir;
1323     }
1324     alias FILEDESCRIPTORA FILEDESCRIPTOR;
1325     alias LPFILEDESCRIPTORA LPFILEDESCRIPTOR;
1326     alias FILEGROUPDESCRIPTORA FILEGROUPDESCRIPTOR;
1327     alias LPFILEGROUPDESCRIPTORA LPFILEGROUPDESCRIPTOR;
1328 }
1329 alias BROWSEINFO* PBROWSEINFO, LPBROWSEINFO;
1330 
1331 static if (_WIN32_WINNT >= 0x501) {
1332     interface IFolderView : IUnknown {
1333        HRESULT GetAutoArrange();
1334        HRESULT GetCurrentViewMode(UINT);
1335        HRESULT GetDefaultSpacing(POINT*);
1336        HRESULT GetFocusedItem(int*);
1337        HRESULT GetFolder(REFIID, PVOID*);
1338        HRESULT GetItemPosition(LPCITEMIDLIST, POINT*);
1339        HRESULT GetSelectionMarkedItem(int*);
1340        HRESULT GetSpacing(POINT*);
1341        HRESULT Item(int, LPITEMIDLIST*);
1342        HRESULT ItemCount(UINT, int*);
1343        HRESULT Items(UINT, REFIID, PVOID*);
1344        HRESULT SelectAndPositionItems(UINT, LPCITEMIDLIST*, POINT*, DWORD);
1345        HRESULT SelectItem(int, DWORD);
1346        HRESULT SetCurrentViewMode(UINT);
1347     }
1348     alias IFolderView LPFOLDERVIEW;
1349 }
1350