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