#ifndef _SHLOBJ_H
#define _SHLOBJ_H
#if __GNUC__ >= 3
#pragma GCC system_header
#endif

#ifdef __cplusplus
extern "C" {
#endif

#include <ole2.h>
#include <shlguid.h>
#include <shellapi.h>
#include <shtypes.h>
#include <commctrl.h>

#pragma pack(push,1)

#define BIF_RETURNONLYFSDIRS 1
#define BIF_DONTGOBELOWDOMAIN 2
#define BIF_STATUSTEXT 4
#define BIF_RETURNFSANCESTORS 8
#define BIF_EDITBOX 16
#define BIF_VALIDATE 32
#define BIF_NEWDIALOGSTYLE 64
#define BIF_BROWSEINCLUDEURLS 128
#define BIF_USENEWUI ( BIF_EDITBOX | BIF_NEWDIALOGSTYLE )
#define BIF_BROWSEFORCOMPUTER 0x1000
#define BIF_BROWSEFORPRINTER 0x2000
#define BIF_BROWSEINCLUDEFILES 0x4000
#define BIF_SHAREABLE 0x8000
#define BFFM_INITIALIZED 1
#define BFFM_SELCHANGED 2
#define BFFM_VALIDATEFAILEDA 3
#define BFFM_VALIDATEFAILEDW 4
#define BFFM_SETSTATUSTEXTA (WM_USER + 100)
#define BFFM_SETSTATUSTEXTW (WM_USER + 104)
#define BFFM_ENABLEOK (WM_USER + 101)
#define BFFM_SETSELECTIONA (WM_USER + 102)
#define BFFM_SETSELECTIONW (WM_USER + 103)
#define BFFM_SETOKTEXT (WM_USER + 105)
#define BFFM_SETEXPANDED (WM_USER + 106)
#ifdef UNICODE
#define BFFM_SETSTATUSTEXT  BFFM_SETSTATUSTEXTW
#define BFFM_SETSELECTION   BFFM_SETSELECTIONW
#define BFFM_VALIDATEFAILED BFFM_VALIDATEFAILEDW
#else
#define BFFM_SETSTATUSTEXT  BFFM_SETSTATUSTEXTA
#define BFFM_SETSELECTION   BFFM_SETSELECTIONA
#define BFFM_VALIDATEFAILED BFFM_VALIDATEFAILEDA
#endif
#define DVASPECT_SHORTNAME 2
#define SHARD_PIDL	1
#define SHARD_PATHA	2
#define SHARD_PATHW	3
#ifdef UNICODE
#define SHARD_PATH	SHARD_PATHW
#else
#define SHARD_PATH	SHARD_PATHA
#endif
#define SHCNE_RENAMEITEM	1
#define SHCNE_CREATE	2
#define SHCNE_DELETE	4
#define SHCNE_MKDIR	8
#define SHCNE_RMDIR	16
#define SHCNE_MEDIAINSERTED	32
#define SHCNE_MEDIAREMOVED	64
#define SHCNE_DRIVEREMOVED	128
#define SHCNE_DRIVEADD	256
#define SHCNE_NETSHARE	512
#define SHCNE_NETUNSHARE	1024
#define SHCNE_ATTRIBUTES	2048
#define SHCNE_UPDATEDIR	4096
#define SHCNE_UPDATEITEM	8192
#define SHCNE_SERVERDISCONNECT	16384
#define SHCNE_UPDATEIMAGE	32768
#define SHCNE_DRIVEADDGUI	65536
#define SHCNE_RENAMEFOLDER	0x20000
#define SHCNE_FREESPACE	0x40000
#define SHCNE_ASSOCCHANGED	0x8000000
#define SHCNE_DISKEVENTS	0x2381F
#define SHCNE_GLOBALEVENTS	0xC0581E0
#define SHCNE_ALLEVENTS	0x7FFFFFFF
#define SHCNE_INTERRUPT	0x80000000
#define SHCNF_IDLIST	0
#define SHCNF_PATHA	1
#define SHCNF_PRINTERA	2
#define SHCNF_DWORD	3
#define SHCNF_PATHW	5
#define SHCNF_PRINTERW	6
#define SHCNF_TYPE	0xFF
#define SHCNF_FLUSH	0x1000
#define SHCNF_FLUSHNOWAIT	0x2000
#ifdef UNICODE
#define SHCNF_PATH      SHCNF_PATHW
#define SHCNF_PRINTER   SHCNF_PRINTERW
#else
#define SHCNF_PATH      SHCNF_PATHA
#define SHCNF_PRINTER   SHCNF_PRINTERA
#endif
#define SFGAO_CANCOPY	DROPEFFECT_COPY
#define SFGAO_CANMOVE	DROPEFFECT_MOVE
#define SFGAO_CANLINK	DROPEFFECT_LINK
#define SFGAO_STORAGE		0x00000008L
#define SFGAO_CANRENAME		0x00000010L
#define SFGAO_CANDELETE		0x00000020L
#define SFGAO_HASPROPSHEET	0x00000040L
#define SFGAO_DROPTARGET	0x00000100L
#define SFGAO_CAPABILITYMASK	0x00000177L
#define SFGAO_ISSLOW            0x00004000L
#define SFGAO_GHOSTED		0x00008000L
#define SFGAO_LINK		0x00010000L
#define SFGAO_SHARE		0x00020000L
#define SFGAO_READONLY		0x00040000L
#define SFGAO_HIDDEN		0x00080000L
#define SFGAO_DISPLAYATTRMASK	0x000F0000L
#define SFGAO_FILESYSANCESTOR	0x10000000L
#define SFGAO_FOLDER		0x20000000L
#define SFGAO_FILESYSTEM	0x40000000L
#define SFGAO_HASSUBFOLDER	0x80000000L
#define SFGAO_CONTENTSMASK	0x80000000L
#define SFGAO_VALIDATE		0x01000000L
#define SFGAO_REMOVABLE		0x02000000L
#define SFGAO_COMPRESSED	0x04000000L
#define SFGAO_STORAGEANCESTOR	0x00800000L
#define STRRET_WSTR	0
#define STRRET_OFFSET	1
#define STRRET_CSTR	2
#define SHGDFIL_FINDDATA	1
#define SHGDFIL_NETRESOURCE	2
#define SHGDFIL_DESCRIPTIONID	3
#define SHDID_ROOT_REGITEM	1
#define SHDID_FS_FILE	2
#define SHDID_FS_DIRECTORY	3
#define SHDID_FS_OTHER	4
#define SHDID_COMPUTER_DRIVE35	5
#define SHDID_COMPUTER_DRIVE525	6
#define SHDID_COMPUTER_REMOVABLE	7
#define SHDID_COMPUTER_FIXED	8
#define SHDID_COMPUTER_NETDRIVE	9
#define SHDID_COMPUTER_CDROM	10
#define SHDID_COMPUTER_RAMDISK	11
#define SHDID_COMPUTER_OTHER	12
#define SHDID_NET_DOMAIN	13
#define SHDID_NET_SERVER	14
#define SHDID_NET_SHARE	15
#define SHDID_NET_RESTOFNET	16
#define SHDID_NET_OTHER	17
#ifndef REGSTR_PATH_EXPLORER
#define REGSTR_PATH_EXPLORER	TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer")
#endif
#define REGSTR_PATH_SPECIAL_FOLDERS	REGSTR_PATH_EXPLORER TEXT("\\Shell Folders")

#define CSIDL_DESKTOP		0x0000
#define CSIDL_INTERNET		0x0001
#define CSIDL_PROGRAMS		0x0002
#define CSIDL_CONTROLS		0x0003
#define CSIDL_PRINTERS		0x0004
#define CSIDL_PERSONAL		0x0005
#define CSIDL_FAVORITES		0x0006
#define CSIDL_STARTUP		0x0007
#define CSIDL_RECENT		0x0008
#define CSIDL_SENDTO		0x0009
#define CSIDL_BITBUCKET		0x000a
#define CSIDL_STARTMENU		0x000b
#define CSIDL_MYDOCUMENTS	0x000c
#define CSIDL_MYMUSIC		0x000d
#define CSIDL_MYVIDEO		0x000e
#define CSIDL_DESKTOPDIRECTORY	0x0010
#define CSIDL_DRIVES		0x0011
#define CSIDL_NETWORK		0x0012
#define CSIDL_NETHOOD		0x0013
#define CSIDL_FONTS		0x0014
#define CSIDL_TEMPLATES		0x0015
#define CSIDL_COMMON_STARTMENU	0x0016
#define CSIDL_COMMON_PROGRAMS	0X0017
#define CSIDL_COMMON_STARTUP	0x0018
#define CSIDL_COMMON_DESKTOPDIRECTORY	0x0019
#define CSIDL_APPDATA		0x001a
#define CSIDL_PRINTHOOD		0x001b
#define CSIDL_LOCAL_APPDATA	0x001c
#define CSIDL_ALTSTARTUP	0x001d
#define CSIDL_COMMON_ALTSTARTUP	0x001e
#define CSIDL_COMMON_FAVORITES  0x001f
#define CSIDL_INTERNET_CACHE	0x0020
#define CSIDL_COOKIES		0x0021
#define CSIDL_HISTORY		0x0022
#define CSIDL_COMMON_APPDATA	0x0023
#define CSIDL_WINDOWS		0x0024
#define CSIDL_SYSTEM		0x0025
#define CSIDL_PROGRAM_FILES	0x0026
#define CSIDL_MYPICTURES	0x0027
#define CSIDL_PROFILE		0x0028
#define CSIDL_SYSTEMX86		0x0029
#define CSIDL_PROGRAM_FILESX86	0x002a
#define CSIDL_PROGRAM_FILES_COMMON	0x002b
#define CSIDL_PROGRAM_FILES_COMMONX86	0x002c
#define CSIDL_COMMON_TEMPLATES	0x002d
#define CSIDL_COMMON_DOCUMENTS	0x002e
#define CSIDL_COMMON_ADMINTOOLS	0x002f
#define CSIDL_ADMINTOOLS	0x0030
#define CSIDL_CONNECTIONS	0x0031
#define CSIDL_COMMON_MUSIC	0x0035
#define CSIDL_COMMON_PICTURES	0x0036
#define CSIDL_COMMON_VIDEO	0x0037
#define CSIDL_RESOURCES		0x0038
#define CSIDL_RESOURCES_LOCALIZED 0x0039
#define CSIDL_COMMON_OEM_LINKS	0x003a
#define CSIDL_CDBURN_AREA	0x003b
#define CSIDL_COMPUTERSNEARME	0x003d
#define CSIDL_PROFILES		0x003e
#define CSIDL_FOLDER_MASK	0x00ff
#define CSIDL_FLAG_PER_USER_INIT 0x0800
#define CSIDL_FLAG_NO_ALIAS	0x1000
#define CSIDL_FLAG_DONT_VERIFY	0x4000
#define CSIDL_FLAG_CREATE	0x8000
#define CSIDL_FLAG_MASK		0xff00

#define CFSTR_SHELLIDLIST	TEXT("Shell IDList Array")
#define CFSTR_SHELLIDLISTOFFSET	TEXT("Shell Object Offsets")
#define CFSTR_NETRESOURCES	TEXT("Net Resource")
#define CFSTR_FILECONTENTS	TEXT("FileContents")
#define CFSTR_FILENAMEA		TEXT("FileName")
#define CFSTR_FILENAMEMAPA	TEXT("FileNameMap")
#define CFSTR_FILEDESCRIPTORA	TEXT("FileGroupDescriptor")
#define CFSTR_INETURLA		TEXT("UniformResourceLocator")
#define CFSTR_SHELLURL		CFSTR_INETURLA
#define CFSTR_FILENAMEW		TEXT("FileNameW")
#define CFSTR_FILENAMEMAPW	TEXT("FileNameMapW")
#define CFSTR_FILEDESCRIPTORW	TEXT("FileGroupDescriptorW")
#define CFSTR_INETURLW		TEXT("UniformResourceLocatorW")
#ifdef UNICODE
#define CFSTR_FILENAME		CFSTR_FILENAMEW
#define CFSTR_FILENAMEMAP	CFSTR_FILENAMEMAPW
#define CFSTR_FILEDESCRIPTOR	CFSTR_FILEDESCRIPTORW
#define CFSTR_INETURL		CFSTR_INETURLW
#else
#define CFSTR_FILENAME		CFSTR_FILENAMEA
#define CFSTR_FILENAMEMAP	CFSTR_FILENAMEMAPA
#define CFSTR_FILEDESCRIPTOR	CFSTR_FILEDESCRIPTORA
#define CFSTR_INETURL		CFSTR_INETURLA
#endif
#define CFSTR_PRINTERGROUP	TEXT("PrinterFriendlyName")
#define CFSTR_INDRAGLOOP	TEXT("InShellDragLoop")
#define CFSTR_PASTESUCCEEDED	TEXT("Paste Succeeded")
#define CFSTR_PERFORMEDDROPEFFECT	TEXT("Performed DropEffect")
#define CFSTR_PREFERREDDROPEFFECT	TEXT("Preferred DropEffect")
#define CMF_NORMAL	0
#define CMF_DEFAULTONLY	1
#define CMF_VERBSONLY	2
#define CMF_EXPLORE	4
#define CMF_NOVERBS	8
#define CMF_CANRENAME	16
#define CMF_NODEFAULT	32
#define CMF_INCLUDESTATIC	64
#define CMF_RESERVED	0xffff0000
#define GCS_VERBA        0
#define GCS_HELPTEXTA    1
#define GCS_VALIDATEA    2
#define GCS_VERBW        4
#define GCS_HELPTEXTW    5
#define GCS_VALIDATEW    6
#define GCS_UNICODE      4
#ifdef UNICODE
#define GCS_VERB        GCS_VERBW
#define GCS_HELPTEXT    GCS_HELPTEXTW
#define GCS_VALIDATE    GCS_VALIDATEW
#else
#define GCS_VERB        GCS_VERBA
#define GCS_HELPTEXT    GCS_HELPTEXTA
#define GCS_VALIDATE    GCS_VALIDATEA
#endif
#define CMDSTR_NEWFOLDERA	"NewFolder"
#define CMDSTR_VIEWLISTA	"ViewList"
#define CMDSTR_VIEWDETAILSA	"ViewDetails"
#define CMDSTR_NEWFOLDERW	L"NewFolder"
#define CMDSTR_VIEWLISTW	L"ViewList"
#define CMDSTR_VIEWDETAILSW	L"ViewDetails"
#ifdef UNICODE
#define CMDSTR_NEWFOLDER	CMDSTR_NEWFOLDERW
#define CMDSTR_VIEWLIST		CMDSTR_VIEWLISTW
#define CMDSTR_VIEWDETAILS	CMDSTR_VIEWDETAILSW
#else
#define CMDSTR_NEWFOLDER	CMDSTR_NEWFOLDER
#define CMDSTR_VIEWLIST		CMDSTR_VIEWLIST
#define CMDSTR_VIEWDETAILS	CMDSTR_VIEWDETAILS
#endif
#define CMIC_MASK_HOTKEY	SEE_MASK_HOTKEY
#define CMIC_MASK_ICON	SEE_MASK_ICON
#define CMIC_MASK_FLAG_NO_UI	SEE_MASK_FLAG_NO_UI
#define CMIC_MASK_UNICODE	SEE_MASK_UNICODE
#define CMIC_MASK_MODAL	0x80000000
#define CMIC_VALID_SEE_FLAGS	SEE_VALID_CMIC_FLAGS
#define GIL_OPENICON	1
#define GIL_FORSHELL	2
#define GIL_ASYNC	32
#define GIL_DEFAULTICON	64
#define GIL_FORSHORTCUT	128
#define GIL_SIMULATEDOC	1
#define GIL_PERINSTANCE	2
#define GIL_PERCLASS	4
#define GIL_NOTFILENAME	8
#define GIL_DONTCACHE	16
#define FVSIF_RECT	1
#define FVSIF_PINNED	2
#define FVSIF_NEWFAILED 0x8000000
#define FVSIF_NEWFILE	0x80000000
#define FVSIF_CANVIEWIT 0x40000000
#define CDBOSC_SETFOCUS	0
#define CDBOSC_KILLFOCUS	1
#define CDBOSC_SELCHANGE	2
#define CDBOSC_RENAME	3
#define FCIDM_SHVIEWFIRST	0
#define FCIDM_SHVIEWLAST	0x7fff
#define FCIDM_BROWSERFIRST	0xa000
#define FCIDM_BROWSERLAST	0xbf00
#define FCIDM_GLOBALFIRST	0x8000
#define FCIDM_GLOBALLAST	0x9fff
#define FCIDM_MENU_FILE	FCIDM_GLOBALFIRST
#define FCIDM_MENU_EDIT	(FCIDM_GLOBALFIRST+0x0040)
#define FCIDM_MENU_VIEW	(FCIDM_GLOBALFIRST+0x0080)
#define FCIDM_MENU_VIEW_SEP_OPTIONS	(FCIDM_GLOBALFIRST+0x0081)
#define FCIDM_MENU_TOOLS	(FCIDM_GLOBALFIRST+0x00c0)
#define FCIDM_MENU_TOOLS_SEP_GOTO	(FCIDM_GLOBALFIRST+0x00c1)
#define FCIDM_MENU_HELP	(FCIDM_GLOBALFIRST+0x0100)
#define FCIDM_MENU_FIND	(FCIDM_GLOBALFIRST+0x0140)
#define FCIDM_MENU_EXPLORE	(FCIDM_GLOBALFIRST+0x0150)
#define FCIDM_MENU_FAVORITES	(FCIDM_GLOBALFIRST+0x0170)
#define FCIDM_TOOLBAR	FCIDM_BROWSERFIRST
#define FCIDM_STATUS	(FCIDM_BROWSERFIRST+1)
#define SBSP_DEFBROWSER	0
#define SBSP_SAMEBROWSER	1
#define SBSP_NEWBROWSER	2
#define SBSP_DEFMODE	0
#define SBSP_OPENMODE	16
#define SBSP_EXPLOREMODE	32
#define SBSP_ABSOLUTE	0
#define SBSP_HELPMODE	0x40
#define SBSP_NOTRANSFERHIST	0x80
#define SBSP_RELATIVE	0x1000
#define SBSP_PARENT	0x2000
#define SBSP_NAVIGATEBACK	0x4000
#define SBSP_NAVIGATEFORWARD	0x8000
#define SBSP_ALLOW_AUTONAVIGATE	0x10000
#define SBSP_NOAUTOSELECT	0x4000000
#define SBSP_WRITENOHISTORY	0x8000000
#define SBSP_INITIATEDBYHLINKFRAME	0x80000000
#define SBSP_REDIRECT	0x40000000
#define FCW_STATUS	1
#define FCW_TOOLBAR	2
#define FCW_TREE	3
#define FCW_INTERNETBAR	6
#define FCW_PROGRESS	8
#define FCT_MERGE	1
#define FCT_CONFIGABLE	2
#define FCT_ADDTOEND	4
#define SVSI_DESELECT	0
#define SVSI_SELECT	1
#define SVSI_EDIT	3
#define SVSI_DESELECTOTHERS	4
#define SVSI_ENSUREVISIBLE	8
#define SVSI_FOCUSED	16
#define SVGIO_BACKGROUND	0
#define SVGIO_SELECTION	1
#define SVGIO_ALLVIEW	2
#define SV2GV_CURRENTVIEW ((UINT)-1)
#define SV2GV_DEFAULTVIEW ((UINT)-2)
#define SHCNE_RENAMEITEM	0x00000001
#define SHCNE_CREATE		0x00000002
#define SHCNE_DELETE		0x00000004
#define SHCNE_MKDIR		0x00000008
#define SHCNE_RMDIR		0x00000010
#define SHCNE_MEDIAINSERTED	0x00000020
#define SHCNE_MEDIAREMOVED	0x00000040
#define SHCNE_DRIVEREMOVED	0x00000080
#define SHCNE_DRIVEADD		0x00000100
#define SHCNE_NETSHARE		0x00000200
#define SHCNE_NETUNSHARE	0x00000400
#define SHCNE_ATTRIBUTES	0x00000800
#define SHCNE_UPDATEDIR		0x00001000
#define SHCNE_UPDATEITEM	0x00002000
#define SHCNE_SERVERDISCONNECT	0x00004000
#define SHCNE_UPDATEIMAGE	0x00008000
#define SHCNE_DRIVEADDGUI	0x00010000
#define SHCNE_RENAMEFOLDER	0x00020000
#define SHCNE_FREESPACE		0x00040000
#define SHCNE_EXTENDED_EVENT	0x04000000
#define SHCNE_ASSOCCHANGED	0x08000000
#define SHCNE_DISKEVENTS	0x0002381F
#define SHCNE_GLOBALEVENTS	0x0C0581E0
#define SHCNE_ALLEVENTS		0x7FFFFFFF
#define SHCNE_INTERRUPT		0x80000000
#define SHCNEE_ORDERCHANGED	0x0002L
#define SHCNEE_MSI_CHANGE	0x0004L
#define SHCNEE_MSI_UNINSTALL	0x0005L
#define SHCNF_IDLIST		0x0000
#define SHCNF_PATHA		0x0001
#define SHCNF_PRINTERA		0x0002
#define SHCNF_DWORD		0x0003
#define SHCNF_PATHW		0x0005
#define SHCNF_PRINTERW		0x0006
#define SHCNF_TYPE		0x00FF
#define SHCNF_FLUSH		0x1000
#define SHCNF_FLUSHNOWAIT	0x2000
#ifdef UNICODE
#define SHCNF_PATH              SHCNF_PATHW
#define SHCNF_PRINTER           SHCNF_PRINTERW
#else
#define SHCNF_PATH              SHCNF_PATHA
#define SHCNF_PRINTER           SHCNF_PRINTERA
#endif
#define PCS_FATAL		0x80000000
#define PCS_REPLACEDCHAR	0x00000001
#define PCS_REMOVEDCHAR		0x00000002
#define PCS_TRUNCATED		0x00000004
#define PCS_PATHTOOLONG		0x00000008
#define SHFMT_ERROR		0xFFFFFFFFL
#define SHFMT_CANCEL		0xFFFFFFFEL
#define SHFMT_NOFORMAT		0xFFFFFFFDL
#define EXP_SZ_LINK_SIG         0xa0000001
#define NT_CONSOLE_PROPS_SIG    0xa0000002
#define NT_FE_CONSOLE_PROPS_SIG 0xa0000004
#define EXP_SPECIAL_FOLDER_SIG  0xa0000005
#define EXP_DARWIN_ID_SIG       0xa0000006
#define EXP_LOGO3_ID_SIG        0xa0000007
#define EXP_SZ_ICON_SIG         0xa0000007
#define SHOP_PRINTERNAME	0x01
#define SHOP_FILEPATH		0x02
#define SHOP_VOLUMEGUID		0x04

typedef ULONG SFGAOF;
typedef DWORD SHGDNF;

typedef struct _IDA {
	UINT cidl;
	UINT aoffset[1];
} CIDA,*LPIDA;
typedef int (CALLBACK* BFFCALLBACK)(HWND,UINT,LPARAM,LPARAM);
typedef struct _browseinfoA {
	HWND	hwndOwner;
	LPCITEMIDLIST	pidlRoot;
	LPSTR	pszDisplayName;
	LPCSTR	lpszTitle;
	UINT	ulFlags;
	BFFCALLBACK	lpfn;
	LPARAM	lParam;
	int	iImage;
} BROWSEINFOA,*PBROWSEINFOA,*LPBROWSEINFOA;
typedef struct _browseinfoW {
	HWND	hwndOwner;
	LPCITEMIDLIST	pidlRoot;
	LPWSTR	pszDisplayName;
	LPCWSTR	lpszTitle;
	UINT	ulFlags;
	BFFCALLBACK	lpfn;
	LPARAM	lParam;
	int	iImage;
} BROWSEINFOW,*PBROWSEINFOW,*LPBROWSEINFOW;
typedef struct _CMInvokeCommandInfo {
	DWORD cbSize;
	DWORD fMask;
	HWND hwnd;
	LPCSTR lpVerb;
	LPCSTR lpParameters;
	LPCSTR lpDirectory;
	int nShow;
	DWORD dwHotKey;
	HANDLE hIcon;
} CMINVOKECOMMANDINFO,*LPCMINVOKECOMMANDINFO;
typedef struct _CMInvokeCommandInfoEx {
	DWORD cbSize;
	DWORD fMask;
	HWND hwnd;
	LPCSTR lpVerb;
	LPCSTR lpParameters;
	LPCSTR lpDirectory;
	INT nShow;
	DWORD dwHotKey;
	HANDLE hIcon;
	LPCSTR lpTitle;
	LPCWSTR lpVerbW;
	LPCWSTR lpParametersW;
	LPCWSTR lpDirectoryW;
	LPCWSTR lpTitleW;
	POINT ptInvoke;
} CMINVOKECOMMANDINFOEX, *LPCMINVOKECOMMANDINFOEX;
typedef struct _DROPFILES {
	DWORD pFiles;
	POINT pt;
	BOOL fNC;
	BOOL fWide;
} DROPFILES,*LPDROPFILES;
typedef enum tagSHGDN {
	SHGDN_NORMAL=0,
	SHGDN_INFOLDER,
	SHGDN_FOREDITING=0x1000,
	SHGDN_INCLUDE_NONFILESYS=0x2000,
	SHGDN_FORADDRESSBAR=0x4000,
	SHGDN_FORPARSING=0x8000
} SHGNO;
typedef enum {
	SHGFP_TYPE_CURRENT = 0,
	SHGFP_TYPE_DEFAULT = 1
} SHGFP_TYPE;
typedef enum tagSHCONTF {
	SHCONTF_FOLDERS = 32,
	SHCONTF_NONFOLDERS = 64,
	SHCONTF_INCLUDEHIDDEN = 128,
	SHCONTF_INIT_ON_FIRST_NEXT = 256,
	SHCONTF_NETPRINTERSRCH = 512,
	SHCONTF_SHAREABLE = 1024,
	SHCONTF_STORAGE = 2048
} SHCONTF;
typedef enum {
	FD_CLSID=1,FD_SIZEPOINT=2,FD_ATTRIBUTES=4,FD_CREATETIME=8,FD_ACCESSTIME=16,
	FD_WRITESTIME=32,FD_FILESIZE=64,FD_LINKUI=0x8000
} FD_FLAGS;
typedef struct _FILEDESCRIPTOR {
	DWORD dwFlags;
	CLSID clsid;
	SIZEL sizel;
	POINTL pointl;
	DWORD dwFileAttributes;
	FILETIME ftCreationTime;
	FILETIME ftLastAccessTime;
	FILETIME ftLastWriteTime;
	DWORD nFileSizeHigh;
	DWORD nFileSizeLow;
	CHAR cFileName[MAX_PATH];
} FILEDESCRIPTOR,*LPFILEDESCRIPTOR;
typedef struct _FILEGROUPDESCRIPTOR {
	UINT cItems;
	FILEDESCRIPTOR fgd[1];
} FILEGROUPDESCRIPTOR,*LPFILEGROUPDESCRIPTOR;
typedef enum {
	SLR_NO_UI=1,
	SLR_ANY_MATCH=2,
	SLR_UPDATE=4,
	SLR_NOUPDATE=8,
	SLR_NOSEARCH=16,
	SLR_NOTRACK=32,
	SLR_NOLINKINFO=64,
	SLR_INVOKE_MSI=128
} SLR_FLAGS;
typedef enum {
	SLGP_SHORTPATH=0x1,
	SLGP_UNCPRIORITY=0x2,
	SLGP_RAWPATH=0x4
} SLGP_FLAGS;
typedef PBYTE LPVIEWSETTINGS;
typedef enum {
	FWF_AUTOARRANGE=1,FWF_ABBREVIATEDNAMES=2,FWF_SNAPTOGRID=4,FWF_OWNERDATA=8,
	FWF_BESTFITWINDOW=16,FWF_DESKTOP=32,FWF_SINGLESEL=64,FWF_NOSUBFOLDERS=128,
	FWF_TRANSPARENT=256,FWF_NOCLIENTEDGE=512,FWF_NOSCROLL=0x400,FWF_ALIGNLEFT=0x800,
	FWF_SINGLECLICKACTIVATE=0x8000
} FOLDERFLAGS;
typedef enum {
	FVM_ICON=1,
	FVM_SMALLICON,
	FVM_LIST,
	FVM_DETAILS
} FOLDERVIEWMODE;
typedef struct {
	UINT ViewMode;
	UINT fFlags;
} FOLDERSETTINGS,*LPFOLDERSETTINGS;
typedef const FOLDERSETTINGS *LPCFOLDERSETTINGS;
typedef struct {
    DWORD cbSize;
	HWND hwndOwner;
	int iShow;
	DWORD dwFlags;
	RECT rect;
	LPUNKNOWN punkRel;
	OLECHAR strNewFile[MAX_PATH];
} FVSHOWINFO,*LPFVSHOWINFO;
typedef struct _NRESARRAY {
	UINT cItems;
	NETRESOURCE nr[1];
} NRESARRAY, *LPNRESARRAY;
enum { SBSC_HIDE,SBSC_SHOW,SBSC_TOGGLE,SBSC_QUERY };
enum {
	SBCMDID_ENABLESHOWTREE,SBCMDID_SHOWCONTROL,SBCMDID_CANCELNAVIGATION,
	SBCMDID_MAYSAVECHANGES,SBCMDID_SETHLINKFRAME,SBCMDID_ENABLESTOP,SBCMDID_OPTIONS
};
typedef enum {
	SVUIA_DEACTIVATE,SVUIA_ACTIVATE_NOFOCUS,SVUIA_ACTIVATE_FOCUS,
	SVUIA_INPLACEACTIVATE
} SVUIA_STATUS;
#if (_WIN32_IE >= 0x0500)
typedef struct tagEXTRASEARCH
{
	GUID guidSearch;
	WCHAR wszFriendlyName[80];
	WCHAR wszUrl[2084];
} EXTRASEARCH, *LPEXTRASEARCH;
typedef DWORD SHCOLSTATEF;
typedef struct
{
	GUID fmtid;
	DWORD pid;
} SHCOLUMNID, *LPSHCOLUMNID;
typedef const SHCOLUMNID *LPCSHCOLUMNID;
typedef struct
{
	LPITEMIDLIST pidlTargetFolder;
	WCHAR szTargetParsingName[MAX_PATH];
	WCHAR szNetworkProvider[MAX_PATH];
	DWORD dwAttributes;
	int csidl;
} PERSIST_FOLDER_TARGET_INFO;
#endif
typedef struct _SHChangeNotifyEntry
{
    LPCITEMIDLIST pidl;
    BOOL   fRecursive;
} SHChangeNotifyEntry;
#define NUM_POINTS 3
typedef struct
{
    int   iNextSample;
    DWORD dwLastScroll;
    BOOL  bFull;
    POINT pts[NUM_POINTS];
    DWORD dwTimes[NUM_POINTS];
} AUTO_SCROLL_DATA;
typedef struct
{
    WORD cLength;
    WORD nVersion;
    BOOL fFullPathTitle:1;
    BOOL fSaveLocalView:1;
    BOOL fNotShell:1;
    BOOL fSimpleDefault:1;
    BOOL fDontShowDescBar:1;
    BOOL fNewWindowMode:1;
    BOOL fShowCompColor:1;
    BOOL fDontPrettyNames:1;
    BOOL fAdminsCreateCommonGroups:1;
    UINT fUnusedFlags:7;
    UINT fMenuEnumFilter;
} CABINETSTATE, *LPCABINETSTATE;
typedef enum RESTRICTIONS
{
	REST_NONE			= 0x00000000,
	REST_NORUN			= 0x00000001,
	REST_NOCLOSE			= 0x00000002,
	REST_NOSAVESET			= 0x00000004,
	REST_NOFILEMENU			= 0x00000008,
	REST_NOSETFOLDERS		= 0x00000010,
	REST_NOSETTASKBAR		= 0x00000020,
	REST_NODESKTOP			= 0x00000040,
	REST_NOFIND			= 0x00000080,
	REST_NODRIVES			= 0x00000100,
	REST_NODRIVEAUTORUN		= 0x00000200,
	REST_NODRIVETYPEAUTORUN		= 0x00000400,
	REST_NONETHOOD			= 0x00000800,
	REST_STARTBANNER		= 0x00001000,
	REST_RESTRICTRUN		= 0x00002000,
	REST_NOPRINTERTABS		= 0x00004000,
	REST_NOPRINTERDELETE		= 0x00008000,
	REST_NOPRINTERADD		= 0x00010000,
	REST_NOSTARTMENUSUBFOLDERS	= 0x00020000,
	REST_MYDOCSONNET		= 0x00040000,
	REST_NOEXITTODOS		= 0x00080000,
	REST_ENFORCESHELLEXTSECURITY	= 0x00100000,
	REST_LINKRESOLVEIGNORELINKINFO	= 0x00200000,
	REST_NOCOMMONGROUPS		= 0x00400000,
	REST_SEPARATEDESKTOPPROCESS	= 0x00800000,
	REST_NOWEB			= 0x01000000,
	REST_NOTRAYCONTEXTMENU		= 0x02000000,
	REST_NOVIEWCONTEXTMENU		= 0x04000000,
	REST_NONETCONNECTDISCONNECT	= 0x08000000,
	REST_STARTMENULOGOFF		= 0x10000000,
	REST_NOSETTINGSASSIST		= 0x20000000,
	REST_NOINTERNETICON		= 0x40000001,
	REST_NORECENTDOCSHISTORY,
	REST_NORECENTDOCSMENU,
	REST_NOACTIVEDESKTOP,
	REST_NOACTIVEDESKTOPCHANGES,
	REST_NOFAVORITESMENU,
	REST_CLEARRECENTDOCSONEXIT,
	REST_CLASSICSHELL,
	REST_NOCUSTOMIZEWEBVIEW,

	REST_NOHTMLWALLPAPER		= 0x40000010,
	REST_NOCHANGINGWALLPAPER,
	REST_NODESKCOMP,
	REST_NOADDDESKCOMP,
	REST_NODELDESKCOMP,
	REST_NOCLOSEDESKCOMP,
	REST_NOCLOSE_DRAGDROPBAND,
	REST_NOMOVINGBAND,
	REST_NOEDITDESKCOMP,
	REST_NORESOLVESEARCH,
	REST_NORESOLVETRACK,
	REST_FORCECOPYACLWITHFILE,
	REST_NOLOGO3CHANNELNOTIFY,
	REST_NOFORGETSOFTWAREUPDATE,
	REST_NOSETACTIVEDESKTOP,
	REST_NOUPDATEWINDOWS,
	REST_NOCHANGESTARMENU,		/* 0x40000020 */
	REST_NOFOLDEROPTIONS,
	REST_HASFINDCOMPUTERS,
	REST_INTELLIMENUS,
	REST_RUNDLGMEMCHECKBOX,
	REST_ARP_ShowPostSetup,
	REST_NOCSC,
	REST_NOCONTROLPANEL,
	REST_ENUMWORKGROUP,
	REST_ARP_NOARP,
	REST_ARP_NOREMOVEPAGE,
	REST_ARP_NOADDPAGE,
	REST_ARP_NOWINSETUPPAGE,
	REST_GREYMSIADS,
	REST_NOCHANGEMAPPEDDRIVELABEL,
	REST_NOCHANGEMAPPEDDRIVECOMMENT,
	REST_MaxRecentDocs,		/* 0x40000030 */
	REST_NONETWORKCONNECTIONS,
	REST_FORCESTARTMENULOGOFF,
	REST_NOWEBVIEW,
	REST_NOCUSTOMIZETHISFOLDER,
	REST_NOENCRYPTION,

	REST_ALLOWFRENCHENCRYPTION,	/* not documented */

	REST_DONTSHOWSUPERHIDDEN,
	REST_NOSHELLSEARCHBUTTON,
	REST_NOHARDWARETAB,
	REST_NORUNASINSTALLPROMPT,
	REST_PROMPTRUNASINSTALLNETPATH,
	REST_NOMANAGEMYCOMPUTERVERB,
	REST_NORECENTDOCSNETHOOD,
	REST_DISALLOWRUN,
	REST_NOWELCOMESCREEN,
	REST_RESTRICTCPL,		/* 0x40000040 */
	REST_DISALLOWCPL,
	REST_NOSMBALLOONTIP,
	REST_NOSMHELP,
	REST_NOWINKEYS,
	REST_NOENCRYPTONMOVE,
	REST_NOLOCALMACHINERUN,
	REST_NOCURRENTUSERRUN,
	REST_NOLOCALMACHINERUNONCE,
	REST_NOCURRENTUSERRUNONCE,
	REST_FORCEACTIVEDESKTOPON,
	REST_NOCOMPUTERSNEARME,
	REST_NOVIEWONDRIVE,
	REST_NONETCRAWL,
	REST_NOSHAREDDOCUMENTS,
	REST_NOSMMYDOCS,
	REST_NOSMMYPICS,		/* 0x40000050 */
	REST_ALLOWBITBUCKDRIVES,
	REST_NONLEGACYSHELLMODE,
	REST_NOCONTROLPANELBARRICADE,
	REST_NOSTARTPAGE,
	REST_NOAUTOTRAYNOTIFY,
	REST_NOTASKGROUPING,
	REST_NOCDBURNING,
	REST_MYCOMPNOPROP,
	REST_MYDOCSNOPROP,
	REST_NOSTARTPANEL,
	REST_NODISPLAYAPPEARANCEPAGE,
	REST_NOTHEMESTAB,
	REST_NOVISUALSTYLECHOICE,
	REST_NOSIZECHOICE,
	REST_NOCOLORCHOICE,
	REST_SETVISUALSTYLE,		/* 0x40000060 */
	REST_STARTRUNNOHOMEPATH,
	REST_NOUSERNAMEINSTARTPANEL,
	REST_NOMYCOMPUTERICON,
	REST_NOSMNETWORKPLACES,
	REST_NOSMPINNEDLIST,
	REST_NOSMMYMUSIC,
	REST_NOSMEJECTPC,
	REST_NOSMMOREPROGRAMS,
	REST_NOSMMFUPROGRAMS,
	REST_NOTRAYITEMSDISPLAY,
	REST_NOTOOLBARSONTASKBAR,
	/* 0x4000006C
	   0x4000006D
	   0x4000006E */
	REST_NOSMCONFIGUREPROGRAMS	= 0x4000006F,
	REST_HIDECLOCK,			/* 0x40000070 */
	REST_NOLOWDISKSPACECHECKS,
	REST_NOENTIRENETWORK,
	REST_NODESKTOPCLEANUP,
	REST_BITBUCKNUKEONDELETE,
	REST_BITBUCKCONFIRMDELETE,
	REST_BITBUCKNOPROP,
	REST_NODISPBACKGROUND,
	REST_NODISPSCREENSAVEPG,
	REST_NODISPSETTINGSPG,
	REST_NODISPSCREENSAVEPREVIEW,
	REST_NODISPLAYCPL,
	REST_HIDERUNASVERB,
	REST_NOTHUMBNAILCACHE,
	REST_NOSTRCMPLOGICAL,
	REST_NOPUBLISHWIZARD,
	REST_NOONLINEPRINTSWIZARD,	/* 0x40000080 */
	REST_NOWEBSERVICES,
	REST_ALLOWUNHASHEDWEBVIEW,
	REST_ALLOWLEGACYWEBVIEW,
	REST_REVERTWEBVIEWSECURITY,

	REST_INHERITCONSOLEHANDLES	= 0x40000086,

	REST_NODISCONNECT		= 0x41000001,
	REST_NOSECURITY,
	REST_NOFILEASSOCIATE,		/* 0x41000003 */
} RESTRICTIONS;

typedef enum {
    SLDF_HAS_ID_LIST = 0x00000001,
    SLDF_HAS_LINK_INFO = 0x00000002,
    SLDF_HAS_NAME = 0x00000004,
    SLDF_HAS_RELPATH = 0x00000008,
    SLDF_HAS_WORKINGDIR = 0x00000010,
    SLDF_HAS_ARGS = 0x00000020,
    SLDF_HAS_ICONLOCATION = 0x00000040,
    SLDF_UNICODE = 0x00000080,
    SLDF_FORCE_NO_LINKINFO = 0x00000100,
    SLDF_HAS_EXP_SZ = 0x00000200,
    SLDF_RUN_IN_SEPERATE = 0x00000400,
    SLDF_HAS_LOGO3ID = 0x00000800,
    SLDF_HAS_DARWINID = 0x00001000,
    SLDF_RUNAS_USER = 0x00002000,
    SLDF_HAS_EXP_ICON_SZ = 0x00004000,
    SLDF_NO_PIDL_ALIAS = 0x00008000,
    SLDF_FORCE_UNCNAME = 0x00010000,
    SLDF_RUN_WITH_SHIMLAYER = 0x00020000,
    SLDF_RESERVED = 0x80000000,
} SHELL_LINK_DATA_FLAGS;

typedef struct tagDATABLOCKHEADER
{
    DWORD cbSize;
    DWORD dwSignature;
} DATABLOCK_HEADER, *LPDATABLOCK_HEADER, *LPDBLIST;

typedef struct {
    DATABLOCK_HEADER dbh;
    CHAR szDarwinID[MAX_PATH];
    WCHAR szwDarwinID[MAX_PATH];
} EXP_DARWIN_LINK, *LPEXP_DARWIN_LINK;

DECLARE_ENUMERATOR_(IEnumIDList,LPITEMIDLIST);
typedef IEnumIDList *LPENUMIDLIST;

#ifdef COBJMACROS
#define IEnumIDList_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IEnumIDList_Release(T) (T)->lpVtbl->AddRef(T)
#define IEnumIDList_AddRef(T) (T)->lpVtbl->Release(T)
#define IEnumIDList_Next(T,a,b,c) (T)->lpVtbl->Next(T,a,b,c)
#define IEnumIDList_Skip(T,a) (T)->lpVtbl->Skip(T,a)
#define IEnumIDList_Reset(T) (T)->lpVtbl->Reset(T)
#define IEnumIDList_Clone(T,a) (T)->lpVtbl->Clone(T,a)
#endif

#define INTERFACE IContextMenu
DECLARE_INTERFACE_(IContextMenu,IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(QueryContextMenu)(THIS_ HMENU,UINT,UINT,UINT,UINT) PURE;
	STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO) PURE;
	STDMETHOD(GetCommandString)(THIS_ UINT,UINT,PUINT,LPSTR,UINT) PURE;
};
typedef IContextMenu *LPCONTEXTMENU;

#ifdef COBJMACROS
#define IContextMenu_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IContextMenu_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IContextMenu_Release(T) (T)->lpVtbl->Release(T)
#define IContextMenu_QueryContextMenu(T,a,b,c,d,e) (T)->lpVtbl->QueryContextMenu(T,a,b,c,d,e)
#define IContextMenu_InvokeCommand(T,a) (T)->lpVtbl->InvokeCommand(T,a)
#define IContextMenu_GetCommandString(T,a,b,c,d,e) (T)->lpVtbl->GetCommandString(T,a,b,c,d,e)
#endif

#define INTERFACE IContextMenu2
DECLARE_INTERFACE_(IContextMenu2,IContextMenu)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(QueryContextMenu)(THIS_ HMENU,UINT,UINT,UINT,UINT) PURE;
	STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO) PURE;
	STDMETHOD(GetCommandString)(THIS_ UINT,UINT,PUINT,LPSTR,UINT) PURE;
	STDMETHOD(HandleMenuMsg)(THIS_ UINT,WPARAM,LPARAM) PURE;
};
#undef INTERFACE
typedef IContextMenu2 *LPCONTEXTMENU2;

#if (_WIN32_IE >= 0x0500)
#pragma pack(push,8)
typedef struct {
	ULONG dwFlags;
	ULONG dwReserved;
	WCHAR wszFolder[MAX_PATH];
} SHCOLUMNINIT,*LPSHCOLUMNINIT;
typedef const SHCOLUMNINIT* LPCSHCOLUMNINIT;
typedef struct {
	ULONG dwFlags;
	DWORD dwFileAttributes;
	ULONG dwReserved;
	WCHAR *pwszExt;
	WCHAR wszFile[MAX_PATH];
} SHCOLUMNDATA,*LPSHCOLUMNDATA;
typedef const SHCOLUMNDATA* LPCSHCOLUMNDATA;
#pragma pack(pop)

#define MAX_COLUMN_NAME_LEN 80
#define MAX_COLUMN_DESC_LEN 128

#pragma pack(push,1)
typedef struct {
	SHCOLUMNID scid;
	VARTYPE vt;
	DWORD fmt;
	UINT cChars;
	DWORD csFlags;
	WCHAR wszTitle[MAX_COLUMN_NAME_LEN];
	WCHAR wszDescription[MAX_COLUMN_DESC_LEN];
} SHCOLUMNINFO,*LPSHCOLUMNINFO;
typedef const SHCOLUMNINFO* LPCSHCOLUMNINFO;
#pragma pack(pop)

typedef enum {
	SHCOLSTATE_TYPE_STR = 0x00000001,
	SHCOLSTATE_TYPE_INT = 0x00000002,
	SHCOLSTATE_TYPE_DATE = 0x00000003,
	SHCOLSTATE_TYPEMASK = 0x0000000f,
	SHCOLSTATE_ONBYDEFAULT = 0x00000010,
	SHCOLSTATE_SLOW = 0x00000020,
	SHCOLSTATE_EXTENDED = 0x00000040,
	SHCOLSTATE_SECONDARYUI = 0x00000080,
	SHCOLSTATE_HIDDEN = 0x00000100,
	SHCOLSTATE_PREFER_VARCMP = 0x00000200
} SHCOLSTATE;

#ifdef COBJMACROS
#define IContextMenu2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IContextMenu2_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IContextMenu2_Release(T) (T)->lpVtbl->Release(T)
#define IContextMenu2_QueryContextMenu(T,a,b,c,d,e) (T)->lpVtbl->QueryContextMenu(T,a,b,c,d,e)
#define IContextMenu2_InvokeCommand(T,a) (T)->lpVtbl->InvokeCommand(T,a)
#define IContextMenu2_GetCommandString(T,a,b,c,d,e) (T)->lpVtbl->GetCommandString(T,a,b,c,d,e)
#define IContextMenu2_HandleMenuMsg(T,a,b,c) (T)->lpVtbl->HandleMenuMsg(T,a,b,c)
#endif

#define INTERFACE IColumnProvider
DECLARE_INTERFACE_(IColumnProvider,IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(Initialize)(THIS_ LPCSHCOLUMNINIT) PURE;
	STDMETHOD(GetColumnInfo)(THIS_ DWORD,SHCOLUMNINFO*) PURE;
	STDMETHOD(GetItemData)(THIS_ LPCSHCOLUMNID,LPCSHCOLUMNDATA,VARIANT*) PURE;
};
#undef INTERFACE
#endif  /* _WIN32_IE >= 0x0500 */

#define INTERFACE IQueryInfo
DECLARE_INTERFACE_(IQueryInfo,IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(GetInfoTip)(THIS_ DWORD,WCHAR**) PURE;
	STDMETHOD(GetInfoFlags)(THIS_ DWORD*) PURE;
};
#undef INTERFACE

#if !defined(__cplusplus) || defined(CINTERFACE)
/*** IUnknown methods ***/
#define IQueryInfo_QueryInterface(p,a,b)      (p)->lpVtbl->QueryInterface(p,a,b)
#define IQueryInfo_AddRef(p)                  (p)->lpVtbl->AddRef(p)
#define IQueryInfo_Release(p)                 (p)->lpVtbl->Release(p)
/*** IQueryInfo methods ***/
#define IQueryInfo_GetInfoTip(p,a,b)          (p)->lpVtbl->GetInfoTip(p,a,b)
#define IQueryInfo_GetInfoFlags(p,a)          (p)->lpVtbl->GetInfoFlags(p,a)
#endif

#define INTERFACE IShellExtInit
DECLARE_INTERFACE_(IShellExtInit, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST,LPDATAOBJECT,HKEY) PURE;
};
#undef INTERFACE
typedef IShellExtInit *LPSHELLEXTINIT;

#define INTERFACE IShellPropSheetExt
DECLARE_INTERFACE_(IShellPropSheetExt, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(AddPages)(THIS_ LPFNADDPROPSHEETPAGE,LPARAM) PURE;
	STDMETHOD(ReplacePage)(THIS_ UINT,LPFNADDPROPSHEETPAGE,LPARAM) PURE;
};
#undef INTERFACE
typedef IShellPropSheetExt *LPSHELLPROPSHEETEXT;

#define INTERFACE IExtractIconA
DECLARE_INTERFACE_(IExtractIconA, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(GetIconLocation)(THIS_ UINT,LPSTR,UINT,int*,PUINT) PURE;
	STDMETHOD(Extract)(THIS_ LPCSTR,UINT,HICON*,HICON*,UINT) PURE;
};
#undef INTERFACE
typedef IExtractIconA *LPEXTRACTICONA;

#ifdef COBJMACROS
#define IExtractIconA_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IExtractIconA_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IExtractIconA_Release(T) (T)->lpVtbl->Release(T)
#define IExtractIconA_GetIconLocation(T,a,b,c,d,e) (T)->lpVtbl->GetIconLocation(T,a,b,c,d,e)
#define IExtractIconA_Extract(T,a,b,c,d,e) (T)->lpVtbl->Extract(T,a,b,c,d,e)
#endif

#define INTERFACE IExtractIconW
DECLARE_INTERFACE_(IExtractIconW, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(GetIconLocation)(THIS_ UINT,LPWSTR,UINT,int*,PUINT) PURE;
	STDMETHOD(Extract)(THIS_ LPCWSTR,UINT,HICON*,HICON*,UINT) PURE;
};
#undef INTERFACE
typedef IExtractIconW *LPEXTRACTICONW;

#ifdef COBJMACROS
#define IExtractIconW_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IExtractIconW_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IExtractIconW_Release(T) (T)->lpVtbl->Release(T)
#define IExtractIconW_GetIconLocation(T,a,b,c,d,e) (T)->lpVtbl->GetIconLocation(T,a,b,c,d,e)
#define IExtractIconW_Extract(T,a,b,c,d,e) (T)->lpVtbl->Extract(T,a,b,c,d,e)
#endif

#ifdef UNICODE
#define IExtractIcon IExtractIconW
#define LPEXTRACTICON LPEXTRACTICONW
#else
#define IExtractIcon IExtractIconA
#define LPEXTRACTICON LPEXTRACTICONA
#endif

#define INTERFACE IShellLinkA
DECLARE_INTERFACE_(IShellLinkA, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(GetPath)(THIS_ LPSTR,int,WIN32_FIND_DATAA*,DWORD) PURE;
	STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST*) PURE;
	STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST) PURE;
	STDMETHOD(GetDescription)(THIS_ LPSTR,int) PURE;
	STDMETHOD(SetDescription)(THIS_ LPCSTR) PURE;
	STDMETHOD(GetWorkingDirectory)(THIS_ LPSTR,int) PURE;
	STDMETHOD(SetWorkingDirectory)(THIS_ LPCSTR) PURE;
	STDMETHOD(GetArguments)(THIS_ LPSTR,int) PURE;
	STDMETHOD(SetArguments)(THIS_ LPCSTR) PURE;
	STDMETHOD(GetHotkey)(THIS_ PWORD) PURE;
	STDMETHOD(SetHotkey)(THIS_ WORD) PURE;
	STDMETHOD(GetShowCmd)(THIS_ int*) PURE;
	STDMETHOD(SetShowCmd)(THIS_ int) PURE;
	STDMETHOD(GetIconLocation)(THIS_ LPSTR,int,int*) PURE;
	STDMETHOD(SetIconLocation)(THIS_ LPCSTR,int) PURE;
	STDMETHOD(SetRelativePath)(THIS_ LPCSTR ,DWORD) PURE;
	STDMETHOD(Resolve)(THIS_ HWND,DWORD) PURE;
	STDMETHOD(SetPath)(THIS_ LPCSTR) PURE;
};
#undef INTERFACE

#ifdef COBJMACROS
#define IShellLinkA_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IShellLinkA_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IShellLinkA_Release(T) (T)->lpVtbl->Release(T)
#define IShellLinkA_GetPath(T,a,b,c,d) (T)->lpVtbl->GetPath(T,a,b,c,d)
#define IShellLinkA_GetIDList(T,a) (T)->lpVtbl->GetIDList(T,a)
#define IShellLinkA_SetIDList(T,a) (T)->lpVtbl->SetIDList(T,a)
#define IShellLinkA_GetDescription(T,a,b) (T)->lpVtbl->GetDescription(T,a,b)
#define IShellLinkA_SetDescription(T,a) (T)->lpVtbl->SetDescription(T,a)
#define IShellLinkA_GetWorkingDirectory(T,a,b) (T)->lpVtbl->GetWorkingDirectory(T,a,b)
#define IShellLinkA_SetWorkingDirectory(T,a) (T)->lpVtbl->SetWorkingDirectory(T,a)
#define IShellLinkA_GetArguments(T,a,b) (T)->lpVtbl->GetArguments(T,a,b)
#define IShellLinkA_SetArguments(T,a) (T)->lpVtbl->SetArguments(T,a)
#define IShellLinkA_GetHotkey(T,a) (T)->lpVtbl->GetHotkey(T,a)
#define IShellLinkA_SetHotkey(T,a) (T)->lpVtbl->SetHotkey(T,a)
#define IShellLinkA_GetShowCmd(T,a) (T)->lpVtbl->GetShowCmd(T,a)
#define IShellLinkA_SetShowCmd(T,a) (T)->lpVtbl->SetShowCmd(T,a)
#define IShellLinkA_GetIconLocation(T,a,b,c) (T)->lpVtbl->GetIconLocation(T,a,b,c)
#define IShellLinkA_SetIconLocation(T,a,b) (T)->lpVtbl->SetIconLocation(T,a,b)
#define IShellLinkA_SetRelativePath(T,a,b) (T)->lpVtbl->SetRelativePath(T,a,b)
#define IShellLinkA_Resolve(T,a,b) (T)->lpVtbl->Resolve(T,a,b)
#define IShellLinkA_SetPath(T,a) (T)->lpVtbl->SetPath(T,a)
#endif

#define INTERFACE IShellLinkW
DECLARE_INTERFACE_(IShellLinkW, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(GetPath)(THIS_ LPWSTR,int,WIN32_FIND_DATAW*,DWORD) PURE;
	STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST*) PURE;
	STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST) PURE;
	STDMETHOD(GetDescription)(THIS_ LPWSTR,int) PURE;
	STDMETHOD(SetDescription)(THIS_ LPCWSTR) PURE;
	STDMETHOD(GetWorkingDirectory)(THIS_ LPWSTR,int) PURE;
	STDMETHOD(SetWorkingDirectory)(THIS_ LPCWSTR) PURE;
	STDMETHOD(GetArguments)(THIS_ LPWSTR,int) PURE;
	STDMETHOD(SetArguments)(THIS_ LPCWSTR) PURE;
	STDMETHOD(GetHotkey)(THIS_ PWORD) PURE;
	STDMETHOD(SetHotkey)(THIS_ WORD) PURE;
	STDMETHOD(GetShowCmd)(THIS_ int*) PURE;
	STDMETHOD(SetShowCmd)(THIS_ int) PURE;
	STDMETHOD(GetIconLocation)(THIS_ LPWSTR,int,int*) PURE;
	STDMETHOD(SetIconLocation)(THIS_ LPCWSTR,int) PURE;
	STDMETHOD(SetRelativePath)(THIS_ LPCWSTR ,DWORD) PURE;
	STDMETHOD(Resolve)(THIS_ HWND,DWORD) PURE;
	STDMETHOD(SetPath)(THIS_ LPCWSTR) PURE;
};
#undef INTERFACE

#ifdef COBJMACROS
#define IShellLinkW_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IShellLinkW_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IShellLinkW_Release(T) (T)->lpVtbl->Release(T)
#define IShellLinkW_GetPath(T,a,b,c,d) (T)->lpVtbl->GetPath(T,a,b,c,d)
#define IShellLinkW_GetIDList(T,a) (T)->lpVtbl->GetIDList(T,a)
#define IShellLinkW_SetIDList(T,a) (T)->lpVtbl->SetIDList(T,a)
#define IShellLinkW_GetDescription(T,a,b) (T)->lpVtbl->GetDescription(T,a,b)
#define IShellLinkW_SetDescription(T,a) (T)->lpVtbl->SetDescription(T,a)
#define IShellLinkW_GetWorkingDirectory(T,a,b) (T)->lpVtbl->GetWorkingDirectory(T,a,b)
#define IShellLinkW_SetWorkingDirectory(T,a) (T)->lpVtbl->SetWorkingDirectory(T,a)
#define IShellLinkW_GetArguments(T,a,b) (T)->lpVtbl->GetArguments(T,a,b)
#define IShellLinkW_SetArguments(T,a) (T)->lpVtbl->SetArguments(T,a)
#define IShellLinkW_GetHotkey(T,a) (T)->lpVtbl->GetHotkey(T,a)
#define IShellLinkW_SetHotkey(T,a) (T)->lpVtbl->SetHotkey(T,a)
#define IShellLinkW_GetShowCmd(T,a) (T)->lpVtbl->GetShowCmd(T,a)
#define IShellLinkW_SetShowCmd(T,a) (T)->lpVtbl->SetShowCmd(T,a)
#define IShellLinkW_GetIconLocation(T,a,b,c) (T)->lpVtbl->GetIconLocation(T,a,b,c)
#define IShellLinkW_SetIconLocation(T,a,b) (T)->lpVtbl->SetIconLocation(T,a,b)
#define IShellLinkW_SetRelativePath(T,a,b) (T)->lpVtbl->SetRelativePath(T,a,b)
#define IShellLinkW_Resolve(T,a,b) (T)->lpVtbl->Resolve(T,a,b)
#define IShellLinkW_SetPath(T,a) (T)->lpVtbl->SetPath(T,a)
#endif

#define INTERFACE IShellLinkDataList
DECLARE_INTERFACE_(IShellLinkDataList, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(AddDataBlock)(THIS_ PVOID) PURE;
	STDMETHOD(CopyDataBlock)(THIS_ DWORD,PVOID*) PURE;
	STDMETHOD(RemoveDataBlock)(THIS_ DWORD) PURE;
	STDMETHOD(GetFlags)(THIS_ PDWORD) PURE;
	STDMETHOD(SetFlags)(THIS_ DWORD) PURE;
};
#undef INTERFACE

#ifdef COBJMACROS
#define IShellLinkDataList_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IShellLinkDataList_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IShellLinkDataList_Release(T) (T)->lpVtbl->Release(T)
#define IShellLinkDataList_AddDataBlock(T,a) (T)->lpVtbl->AddDataBlock(T,a)
#define IShellLinkDataList_CopyDataBlock(T,a,b) (T)->lpVtbl->CopyDataBlock(T,a,b)
#define IShellLinkDataList_RemoveDataBlock(T,a) (T)->lpVtbl->RemoveDataBlock(T,a)
#define IShellLinkDataList_GetFlags(T,a) (T)->lpVtbl->GetFlags(T,a)
#define IShellLinkDataList_SetFlags(T,a) (T)->lpVtbl->SetFlags(T,a)
#endif

#define INTERFACE IShellFolder
DECLARE_INTERFACE_(IShellFolder, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(ParseDisplayName)(THIS_ HWND,LPBC,LPOLESTR,PULONG,LPITEMIDLIST*,PULONG) PURE;
	STDMETHOD(EnumObjects)(THIS_ HWND,DWORD,LPENUMIDLIST*) PURE;
	STDMETHOD(BindToObject)(THIS_ LPCITEMIDLIST,LPBC,REFIID,PVOID*) PURE;
	STDMETHOD(BindToStorage)(THIS_ LPCITEMIDLIST,LPBC,REFIID,PVOID*) PURE;
	STDMETHOD(CompareIDs)(THIS_ LPARAM,LPCITEMIDLIST,LPCITEMIDLIST) PURE;
	STDMETHOD(CreateViewObject)(THIS_ HWND,REFIID,PVOID*) PURE;
	STDMETHOD(GetAttributesOf)(THIS_ UINT,LPCITEMIDLIST*,PULONG) PURE;
	STDMETHOD(GetUIObjectOf)(THIS_ HWND,UINT,LPCITEMIDLIST*,REFIID,PUINT,PVOID*) PURE;
	STDMETHOD(GetDisplayNameOf)(THIS_ LPCITEMIDLIST,DWORD,LPSTRRET) PURE;
	STDMETHOD(SetNameOf)(THIS_ HWND,LPCITEMIDLIST,LPCOLESTR,DWORD,LPITEMIDLIST*) PURE;
};
#undef INTERFACE
typedef IShellFolder *LPSHELLFOLDER;

#ifdef COBJMACROS
#define IShellFolder_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IShellFolder_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IShellFolder_Release(T) (T)->lpVtbl->Release(T)
#define IShellFolder_ParseDisplayName(T,a,b,c,d,e,f) (T)->lpVtbl->ParseDisplayName(T,a,b,c,d,e,f)
#define IShellFolder_EnumObjects(T,a,b,c) (T)->lpVtbl->EnumObjects(T,a,b,c)
#define IShellFolder_BindToObject(T,a,b,c,d) (T)->lpVtbl->BindToObject(T,a,b,c,d)
#define IShellFolder_BindToStorage(T,a,b,c,d) (T)->lpVtbl->BindToStorage(T,a,b,c,d)
#define IShellFolder_CompareIDs(T,a,b,c) (T)->lpVtbl->CompareIDs(T,a,b,c)
#define IShellFolder_CreateViewObject(T,a,b,c) (T)->lpVtbl->CreateViewObject(T,a,b,c)
#define IShellFolder_GetAttributesOf(T,a,b,c) (T)->lpVtbl->GetAttributesOf(T,a,b,c)
#define IShellFolder_GetUIObjectOf(T,a,b,c,d,e,f) (T)->lpVtbl->GetUIObjectOf(T,a,b,c,d,e,f)
#define IShellFolder_GetDisplayNameOf(T,a,b,c) (T)->lpVtbl->GetDisplayNameOf(T,a,b,c)
#define IShellFolder_SetNameOf(T,a,b,c,d,e) (T)->lpVtbl->SetNameOf(T,a,b,c,d,e)
#endif

#if (_WIN32_IE >= 0x0500)

DECLARE_ENUMERATOR_(IEnumExtraSearch,LPEXTRASEARCH);
typedef IEnumExtraSearch *LPENUMEXTRASEARCH;

#define INTERFACE IShellFolder2
DECLARE_INTERFACE_(IShellFolder2, IShellFolder)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(ParseDisplayName)(THIS_ HWND,LPBC,LPOLESTR,PULONG,LPITEMIDLIST*,PULONG) PURE;
	STDMETHOD(EnumObjects)(THIS_ HWND,DWORD,LPENUMIDLIST*) PURE;
	STDMETHOD(BindToObject)(THIS_ LPCITEMIDLIST,LPBC,REFIID,PVOID*) PURE;
	STDMETHOD(BindToStorage)(THIS_ LPCITEMIDLIST,LPBC,REFIID,PVOID*) PURE;
	STDMETHOD(CompareIDs)(THIS_ LPARAM,LPCITEMIDLIST,LPCITEMIDLIST) PURE;
	STDMETHOD(CreateViewObject)(THIS_ HWND,REFIID,PVOID*) PURE;
	STDMETHOD(GetAttributesOf)(THIS_ UINT,LPCITEMIDLIST*,PULONG) PURE;
	STDMETHOD(GetUIObjectOf)(THIS_ HWND,UINT,LPCITEMIDLIST*,REFIID,PUINT,PVOID*) PURE;
	STDMETHOD(GetDisplayNameOf)(THIS_ LPCITEMIDLIST,DWORD,LPSTRRET) PURE;
	STDMETHOD(SetNameOf)(THIS_ HWND,LPCITEMIDLIST,LPCOLESTR,DWORD,LPITEMIDLIST*) PURE;
	STDMETHOD(GetDefaultSearchGUID)(THIS_ GUID*) PURE;
	STDMETHOD(EnumSearches)(THIS_ IEnumExtraSearch**) PURE;
	STDMETHOD(GetDefaultColumn)(THIS_ DWORD,ULONG*,ULONG*) PURE;
	STDMETHOD(GetDefaultColumnState)(THIS_ UINT,SHCOLSTATEF*) PURE;
	STDMETHOD(GetDetailsEx)(THIS_ LPCITEMIDLIST,const SHCOLUMNID*,VARIANT*) PURE;
	STDMETHOD(GetDetailsOf)(THIS_ LPCITEMIDLIST,UINT,SHELLDETAILS*) PURE;
	STDMETHOD(MapColumnToSCID)(THIS_ UINT,SHCOLUMNID*) PURE;
};
#undef INTERFACE
typedef IShellFolder2 *LPSHELLFOLDER2;

#ifdef COBJMACROS
#define IShellFolder2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IShellFolder2_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IShellFolder2_Release(T) (T)->lpVtbl->Release(T)
#define IShellFolder2_ParseDisplayName(T,a,b,c,d,e,f) (T)->lpVtbl->ParseDisplayName(T,a,b,c,d,e,f)
#define IShellFolder2_EnumObjects(T,a,b,c) (T)->lpVtbl->EnumObjects(T,a,b,c)
#define IShellFolder2_BindToObject(T,a,b,c,d) (T)->lpVtbl->BindToObject(T,a,b,c,d)
#define IShellFolder2_BindToStorage(T,a,b,c,d) (T)->lpVtbl->BindToStorage(T,a,b,c,d)
#define IShellFolder2_CompareIDs(T,a,b,c) (T)->lpVtbl->CompareIDs(T,a,b,c)
#define IShellFolder2_CreateViewObject(T,a,b) (T)->lpVtbl->CreateViewObject(T,a,b)
#define IShellFolder2_GetAttributesOf(T,a,b,c) (T)->lpVtbl->GetAttributesOf(T,a,b,c)
#define IShellFolder2_GetUIObjectOf(T,a,b,c,d,e,f) (T)->lpVtbl->GetUIObjectOf(T,a,b,c,d,e,f)
#define IShellFolder2_GetDisplayNameOf(T,a,b,c) (T)->lpVtbl->GetDisplayNameOf(T,a,b,c)
#define IShellFolder2_SetNameOf(T,a,b,c,d,e) (T)->lpVtbl->SetNameOf(T,a,b,c,d,e)
#define IShellFolder2_GetDefaultSearchGUID(T,a) (T)->lpVtbl->GetDefaultSearchGUID(T,a)
#define IShellFolder2_EnumSearches(T,a) (T)->lpVtbl->EnumSearches(T,a)
#define IShellFolder2_GetDefaultColumn(T,a,b,c) (T)->lpVtbl->GetDefaultColumn(T,a,b,c)
#define IShellFolder2_GetDefaultColumnState(T,a,b) (T)->lpVtbl->GetDefaultColumnState(T,a,b)
#define IShellFolder2_GetDetailsEx(T,a,b,c) (T)->lpVtbl->GetDetailsEx(T,a,b,c)
#define IShellFolder2_GetDetailsOf(T,a,b,c) (T)->lpVtbl->GetDetailsOf(T,a,b,c)
#define IShellFolder2_MapColumnToSCID(T,a,b) (T)->lpVtbl->MapColumnToSCID(T,a,b)
#endif

#endif /* _WIN32_IE >= 0x0500 */
#define INTERFACE ICopyHook
DECLARE_INTERFACE_(ICopyHook, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD_(UINT,CopyCallback)(THIS_ HWND,UINT,UINT,LPCSTR,DWORD,LPCSTR,DWORD) PURE;
};
#undef INTERFACE
typedef ICopyHook *LPCOPYHOOK;

#define INTERFACE IFileViewerSite
DECLARE_INTERFACE(IFileViewerSite)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(SetPinnedWindow)(THIS_ HWND) PURE;
	STDMETHOD(GetPinnedWindow)(THIS_ HWND*) PURE;
};
#undef INTERFACE
typedef IFileViewerSite *LPFILEVIEWERSITE;

#define INTERFACE IFileViewer
DECLARE_INTERFACE(IFileViewer)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(ShowInitialize)(THIS_ LPFILEVIEWERSITE) PURE;
	STDMETHOD(Show)(THIS_ LPFVSHOWINFO) PURE;
	STDMETHOD(PrintTo)(THIS_ LPSTR,BOOL) PURE;
};
#undef INTERFACE
typedef IFileViewer *LPFILEVIEWER;

#define INTERFACE IFileSystemBindData
DECLARE_INTERFACE_(IFileSystemBindData, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(SetFindData)(THIS_ const WIN32_FIND_DATAW*) PURE;
	STDMETHOD(GetFindData)(THIS_ WIN32_FIND_DATAW*) PURE;
};
#undef INTERFACE

#define INTERFACE IPersistFolder
DECLARE_INTERFACE_(IPersistFolder,IPersist)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(GetClassID)(THIS_ CLSID*) PURE;
	STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST) PURE;
};
#undef INTERFACE
typedef IPersistFolder *LPPERSISTFOLDER;

#ifdef COBJMACROS
#define IPersistFolder_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IPersistFolder_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IPersistFolder_Release(T) (T)->lpVtbl->Release(T)
#define IPersistFolder_GetClassID(T,a) (T)->lpVtbl->GetClassID(T,a)
#define IPersistFolder_Initialize(T,a) (T)->lpVtbl->Initialize(T,a)
#endif

#if (_WIN32_IE >= 0x0400 || _WIN32_WINNT >= 0x0500)

#define INTERFACE IPersistFolder2
DECLARE_INTERFACE_(IPersistFolder2,IPersistFolder)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(GetClassID)(THIS_ CLSID*) PURE;
	STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST) PURE;
	STDMETHOD(GetCurFolder)(THIS_ LPITEMIDLIST*) PURE;
};
#undef INTERFACE
typedef IPersistFolder2 *LPPERSISTFOLDER2;

#ifdef COBJMACROS
#define IPersistFolder2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IPersistFolder2_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IPersistFolder2_Release(T) (T)->lpVtbl->Release(T)
#define IPersistFolder2_GetClassID(T,a) (T)->lpVtbl->GetClassID(T,a)
#define IPersistFolder2_Initialize(T,a) (T)->lpVtbl->Initialize(T,a)
#define IPersistFolder2_GetCurFolder(T,a) (T)->lpVtbl->GetCurFolder(T,a)
#endif

#endif /* _WIN32_IE >= 0x0400 || _WIN32_WINNT >= 0x0500 */

#if (_WIN32_IE >= 0x0500)

#define INTERFACE IPersistFolder3
DECLARE_INTERFACE_(IPersistFolder3,IPersistFolder2)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(GetClassID)(THIS_ CLSID*) PURE;
	STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST) PURE;
	STDMETHOD(GetCurFolder)(THIS_ LPITEMIDLIST*) PURE;
	STDMETHOD(InitializeEx)(THIS_ IBindCtx*,LPCITEMIDLIST,const PERSIST_FOLDER_TARGET_INFO*) PURE;
	STDMETHOD(GetFolderTargetInfo)(THIS_ PERSIST_FOLDER_TARGET_INFO*) PURE;
};
#undef INTERFACE
typedef IPersistFolder3 *LPPERSISTFOLDER3;

#ifdef COBJMACROS
#define IPersistFolder3_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IPersistFolder3_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IPersistFolder3_Release(T) (T)->lpVtbl->Release(T)
#define IPersistFolder3_GetClassID(T,a) (T)->lpVtbl->GetClassID(T,a)
#define IPersistFolder3_Initialize(T,a) (T)->lpVtbl->Initialize(T,a)
#define IPersistFolder3_GetCurFolder(T,a) (T)->lpVtbl->GetCurFolder(T,a)
#define IPersistFolder3_InitializeEx(T,a,b,c) (T)->lpVtbl->InitializeEx(T,a,b,c)
#define IPersistFolder3_GetFolderTargetInfo(T,a) (T)->lpVtbl->GetFolderTargetInfo(T,a)
#endif

#endif /* _WIN32_IE >= 0x0500 */

typedef interface IShellBrowser *LPSHELLBROWSER;
typedef interface IShellView *LPSHELLVIEW;

#define INTERFACE IShellBrowser
DECLARE_INTERFACE_(IShellBrowser,IOleWindow)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(GetWindow)(THIS_ HWND*) PURE;
	STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE;
	STDMETHOD(InsertMenusSB)(THIS_ HMENU,LPOLEMENUGROUPWIDTHS) PURE;
	STDMETHOD(SetMenuSB)(THIS_ HMENU,HOLEMENU,HWND) PURE;
	STDMETHOD(RemoveMenusSB)(THIS_ HMENU) PURE;
	STDMETHOD(SetStatusTextSB)(THIS_ LPCOLESTR) PURE;
	STDMETHOD(EnableModelessSB)(THIS_ BOOL) PURE;
	STDMETHOD(TranslateAcceleratorSB) (THIS_ LPMSG,WORD) PURE;
	STDMETHOD(BrowseObject)(THIS_ LPCITEMIDLIST,UINT) PURE;
	STDMETHOD(GetViewStateStream)(THIS_ DWORD,LPSTREAM*) PURE;
	STDMETHOD(GetControlWindow)(THIS_ UINT,HWND*) PURE;
	STDMETHOD(SendControlMsg)(THIS_ UINT,UINT,WPARAM,LPARAM,LRESULT*) PURE;
	STDMETHOD(QueryActiveShellView)(THIS_ LPSHELLVIEW*) PURE;
	STDMETHOD(OnViewWindowActive)(THIS_ LPSHELLVIEW) PURE;
	STDMETHOD(SetToolbarItems)(THIS_ LPTBBUTTON,UINT,UINT) PURE;
};
#undef INTERFACE

#ifdef COBJMACROS
#define IShellBrowser_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IShellBrowser_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IShellBrowser_Release(T) (T)->lpVtbl->Release(T)
#define IShellBrowser_GetWindow(T,a) (T)->lpVtbl->GetWindow(T,a)
#define IShellBrowser_ContextSensitiveHelp(T,a) (T)->lpVtbl->ContextSensitiveHelp(T,a)
#define IShellBrowser_InsertMenusSB(T,a,b) (T)->lpVtbl->InsertMenusSB(T,a,b)
#define IShellBrowser_SetMenuSB(T,a,b,c) (T)->lpVtbl->SetMenuSB(T,a,b,c)
#define IShellBrowser_RemoveMenusSB(T,a) (T)->lpVtbl->RemoveMenusSB(T,a)
#define IShellBrowser_SetStatusTextSB(T,a) (T)->lpVtbl->SetStatusTextSB(T,a)
#define IShellBrowser_EnableModelessSB(T,a) (T)->lpVtbl->EnableModelessSB(T,a)
#define IShellBrowser_TranslateAcceleratorSB(T,a,b) (T)->lpVtbl->TranslateAcceleratorSB(T,a,b)
#define IShellBrowser_BrowseObject(T,a,b) (T)->lpVtbl->BrowseObject(T,a,b)
#define IShellBrowser_GetViewStateStream(T,a,b) (T)->lpVtbl->GetViewStateStream(T,a,b)
#define IShellBrowser_GetControlWindow(T,a,b) (T)->lpVtbl->GetControlWindow(T,a,b)
#define IShellBrowser_SendControlMsg(T,a,b,c,d,e) (T)->lpVtbl->SendControlMsg(T,a,b,c,d,e)
#define IShellBrowser_QueryActiveShellView(T,a) (T)->lpVtbl->QueryActiveShellView(T,a)
#define IShellBrowser_OnViewWindowActive(T,a) (T)->lpVtbl->OnViewWindowActive(T,a)
#define IShellBrowser_SetToolbarItems(T,a,b,c) (T)->lpVtbl->SetToolbarItems(T,a,b,c)
#endif

#define INTERFACE IShellView
DECLARE_INTERFACE_(IShellView,IOleWindow)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(GetWindow)(THIS_ HWND*) PURE;
	STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE;
	STDMETHOD(TranslateAccelerator) (THIS_ LPMSG) PURE;
#ifdef _FIX_ENABLEMODELESS_CONFLICT
	STDMETHOD(EnableModelessSV)(THIS_ BOOL) PURE;
#else
	STDMETHOD(EnableModeless)(THIS_ BOOL) PURE;
#endif
	STDMETHOD(UIActivate)(THIS_ UINT) PURE;
	STDMETHOD(Refresh) (THIS) PURE;
	STDMETHOD(CreateViewWindow)(THIS_ IShellView*,LPCFOLDERSETTINGS,LPSHELLBROWSER,RECT*,HWND*) PURE;
	STDMETHOD(DestroyViewWindow)(THIS) PURE;
	STDMETHOD(GetCurrentInfo)(THIS_ LPFOLDERSETTINGS) PURE;
	STDMETHOD(AddPropertySheetPages)(THIS_ DWORD,LPFNADDPROPSHEETPAGE,LPARAM) PURE;
	STDMETHOD(SaveViewState)(THIS) PURE;
	STDMETHOD(SelectItem)(THIS_ LPCITEMIDLIST,UINT) PURE;
	STDMETHOD(GetItemObject)(THIS_ UINT,REFIID,PVOID*) PURE;
};
#undef INTERFACE

#ifdef COBJMACROS
#define IShellView_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IShellView_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IShellView_Release(T) (T)->lpVtbl->Release(T)
#define IShellView_GetWindow(T,a) (T)->lpVtbl->GetWindow(T,a)
#define IShellView_ContextSensitiveHelp(T,a) (T)->lpVtbl->ContextSensitiveHelp(T,a)
#define IShellView_TranslateAccelerator(T,a) (T)->lpVtbl->TranslateAccelerator(T,a)
#ifdef _FIX_ENABLEMODELESS_CONFLICT
#define IShellView_EnableModeless(T,a) (T)->lpVtbl->EnableModelessSV(T,a)
#else
#define IShellView_EnableModeless(T,a) (T)->lpVtbl->EnableModeless(T,a)
#endif
#define IShellView_UIActivate(T,a) (T)->lpVtbl->UIActivate(T,a)
#define IShellView_Refresh(T) (T)->lpVtbl->Refresh(T)
#define IShellView_CreateViewWindow(T,a,b,c,d,e) (T)->lpVtbl->CreateViewWindow(T,a,b,c,d,e)
#define IShellView_DestroyViewWindow(T) (T)->lpVtbl->DestroyViewWindow(T)
#define IShellView_GetCurrentInfo(T,a) (T)->lpVtbl->GetCurrentInfo(T,a)
#define IShellView_AddPropertySheetPages(T,a,b,c) (T)->lpVtbl->AddPropertySheetPages(T,a,b,c)
#define IShellView_SaveViewState(T) (T)->lpVtbl->SaveViewState(T)
#define IShellView_SelectItem(T,a,b) (T)->lpVtbl->SelectItem(T,a,b)
#define IShellView_GetItemObject(T,a,b,c) (T)->lpVtbl->GetItemObject(T,a,b,c)
#endif

#define INTERFACE ICommDlgBrowser
DECLARE_INTERFACE_(ICommDlgBrowser,IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(OnDefaultCommand)(THIS_ IShellView*) PURE;
	STDMETHOD(OnStateChange)(THIS_ IShellView*,ULONG) PURE;
	STDMETHOD(IncludeObject)(THIS_ IShellView*,LPCITEMIDLIST) PURE;
};
#undef INTERFACE
typedef ICommDlgBrowser *LPCOMMDLGBROWSER;

#ifdef COBJMACROS
#define ICommDlgBrowser_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define ICommDlgBrowser_AddRef(T) (T)->lpVtbl->AddRef(T)
#define ICommDlgBrowser_Release(T) (T)->lpVtbl->Release(T)
#define ICommDlgBrowser_OnDefaultCommand(T,a) (T)->lpVtbl->OnDefaultCommand(T,a)
#define ICommDlgBrowser_OnStateChange(T,a,b) (T)->lpVtbl->OnStateChange(T,a,b)
#define ICommDlgBrowser_IncludeObject(T,a,b) (T)->lpVtbl->IncludeObject(T,a,b)
#endif

typedef GUID SHELLVIEWID;
typedef struct _SV2CVW2_PARAMS {
	DWORD cbSize;
	IShellView *psvPrev;
	FOLDERSETTINGS const *pfs;
	IShellBrowser *psbOwner;
	RECT *prcView;
	SHELLVIEWID const *pvid;
	HWND hwndView;
} SV2CVW2_PARAMS,*LPSV2CVW2_PARAMS;
#define INTERFACE IShellView2
DECLARE_INTERFACE_(IShellView2,IShellView)
{

	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(GetWindow)(THIS_ HWND*) PURE;
	STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL) PURE;
	STDMETHOD(TranslateAccelerator) (THIS_ LPMSG) PURE;
#ifdef _FIX_ENABLEMODELESS_CONFLICT
	STDMETHOD(EnableModelessSV)(THIS_ BOOL) PURE;
#else
	STDMETHOD(EnableModeless)(THIS_ BOOL) PURE;
#endif
	STDMETHOD(UIActivate)(THIS_ UINT) PURE;
	STDMETHOD(Refresh) (THIS) PURE;
	STDMETHOD(CreateViewWindow)(THIS_ IShellView*,LPCFOLDERSETTINGS,LPSHELLBROWSER,RECT*,HWND*) PURE;
	STDMETHOD(DestroyViewWindow)(THIS) PURE;
	STDMETHOD(GetCurrentInfo)(THIS_ LPFOLDERSETTINGS) PURE;
	STDMETHOD(AddPropertySheetPages)(THIS_ DWORD,LPFNADDPROPSHEETPAGE,LPARAM) PURE;
	STDMETHOD(SaveViewState)(THIS) PURE;
	STDMETHOD(SelectItem)(THIS_ LPCITEMIDLIST,UINT) PURE;
	STDMETHOD(GetItemObject)(THIS_ UINT,REFIID,PVOID*) PURE;
	STDMETHOD(GetView)(THIS_ SHELLVIEWID*,ULONG) PURE;
	STDMETHOD(CreateViewWindow2)(THIS_ LPSV2CVW2_PARAMS) PURE;
    STDMETHOD(HandleRename)(THIS_ PCUITEMID_CHILD) PURE;
    STDMETHOD(SelectAndPositionItem)(THIS_ PCUITEMID_CHILD,UINT,POINT*) PURE;
};
#undef INTERFACE
#ifdef COBJMACROS
#define IShellView2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b)
#define IShellView2_AddRef(T) (T)->lpVtbl->AddRef(T)
#define IShellView2_Release(T) (T)->lpVtbl->Release(T)
#define IShellView2_GetWindow(T,a) (T)->lpVtbl->GetWindow(T,a)
#define IShellView2_ContextSensitiveHelp(T,a) (T)->lpVtbl->ContextSensitiveHelp(T,a)
#define IShellView2_TranslateAccelerator(T,a) (T)->lpVtbl->TranslateAccelerator(T,a)
#ifdef _FIX_ENABLEMODELESS_CONFLICT
#define IShellView2_EnableModeless(T,a) (T)->lpVtbl->EnableModelessSV(T,a)
#else
#define IShellView2_EnableModeless(T,a) (T)->lpVtbl->EnableModeless(T,a)
#endif
#define IShellView2_UIActivate(T,a) (T)->lpVtbl->UIActivate(T,a)
#define IShellView2_Refresh(T) (T)->lpVtbl->Refresh(T)
#define IShellView2_CreateViewWindow(T,a,b,c,d,e) (T)->lpVtbl->CreateViewWindow(T,a,b,c,d,e)
#define IShellView2_DestroyViewWindow(T) (T)->lpVtbl->DestroyViewWindow(T)
#define IShellView2_GetCurrentInfo(T,a) (T)->lpVtbl->GetCurrentInfo(T,a)
#define IShellView2_AddPropertySheetPages(T,a,b,c) (T)->lpVtbl->AddPropertySheetPages(T,a,b,c)
#define IShellView2_SaveViewState(T) (T)->lpVtbl->SaveViewState(T)
#define IShellView2_SelectItem(T,a,b) (T)->lpVtbl->SelectItem(T,a,b)
#define IShellView2_GetItemObject(T,a,b,c) (T)->lpVtbl->GetItemObject(T,a,b,c)
#define IShellView2_GetView(T,a,b) (T)->lpVtbl->GetView(T,a,b)
#define IShellView2_CreateViewWindow2(T,a) (T)->lpVtbl->CreateViewWindow2(T,a)
#define IShellView2_HandleRename(T,a) (T)->lpVtbl->HandleRename(T,a)
#define IShellView2_SelectAndPositionItem(T,a,b,c) (T)->lpVtbl->SelectAndPositionItem(T,a,b,c)
#endif

#define INTERFACE IShellExecuteHookA
DECLARE_INTERFACE_(IShellExecuteHookA,IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOA) PURE;
};
#undef INTERFACE

#define INTERFACE IShellExecuteHookW
DECLARE_INTERFACE_(IShellExecuteHookW,IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOW) PURE;
};
#undef INTERFACE

#define INTERFACE IShellIcon
DECLARE_INTERFACE_(IShellIcon,IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(GetIconOf)(THIS_ LPCITEMIDLIST,UINT,PINT) PURE;
};
#undef INTERFACE
typedef IShellIcon *LPSHELLICON;

typedef struct {
	BOOL fShowAllObjects : 1;
	BOOL fShowExtensions : 1;
	BOOL fNoConfirmRecycle : 1;
	BOOL fShowSysFiles : 1;
	BOOL fShowCompColor : 1;
	BOOL fDoubleClickInWebView : 1;
	BOOL fDesktopHTML : 1;
	BOOL fWin95Classic : 1;
	BOOL fDontPrettyPath : 1;
	BOOL fShowAttribCol : 1;
	BOOL fMapNetDrvBtn : 1;
	BOOL fShowInfoTip : 1;
	BOOL fHideIcons : 1;
	UINT fRestFlags : 3;
} SHELLFLAGSTATE, * LPSHELLFLAGSTATE;

#define SSF_SHOWALLOBJECTS 0x1
#define SSF_SHOWEXTENSIONS 0x2
#define SSF_SHOWCOMPCOLOR 0x8
#define SSF_SHOWSYSFILES 0x20
#define SSF_DOUBLECLICKINWEBVIEW 0x80
#define SSF_SHOWATTRIBCOL 0x100
#define SSF_DESKTOPHTML 0x200
#define SSF_WIN95CLASSIC 0x400
#define SSF_DONTPRETTYPATH 0x800
#define SSF_MAPNETDRVBUTTON 0x1000
#define SSF_SHOWINFOTIP 0x2000
#define SSF_HIDEICONS 0x4000
#define SSF_NOCONFIRMRECYCLE 0x8000

#undef  INTERFACE
#define INTERFACE IShellIconOverlayIdentifier
DECLARE_INTERFACE_(IShellIconOverlayIdentifier,IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD(IsMemberOf)(THIS_ LPCWSTR,DWORD) PURE;
	STDMETHOD(GetOverlayInfo)(THIS_ LPWSTR,int,int*,DWORD*) PURE;
	STDMETHOD(GetPriority)(THIS_ int*) PURE;
};

#define ISIOI_ICONFILE 0x00000001
#define ISIOI_ICONINDEX 0x00000002

#if (_WIN32_WINNT >= 0x0500) /* W2K */
typedef struct {
	BOOL fShowAllObjects : 1;
	BOOL fShowExtensions : 1;
	BOOL fNoConfirmRecycle : 1;
	BOOL fShowSysFiles : 1;
	BOOL fShowCompColor : 1;
	BOOL fDoubleClickInWebView : 1;
	BOOL fDesktopHTML : 1;
	BOOL fWin95Classic : 1;
	BOOL fDontPrettyPath : 1;
	BOOL fShowAttribCol : 1;
	BOOL fMapNetDrvBtn : 1;
	BOOL fShowInfoTip : 1;
	BOOL fHideIcons : 1;
	BOOL fWebView : 1;
	BOOL fFilter : 1;
	BOOL fShowSuperHidden : 1;
	BOOL fNoNetCrawling : 1;
	DWORD dwWin95Unused;
	UINT uWin95Unused;
	LONG lParamSort;
	int iSortDirection;
	UINT version;
	UINT uNotUsed;
	BOOL fSepProcess : 1;
	BOOL fStartPanelOn : 1;
	BOOL fShowStartPage : 1;
	UINT fSpareFlags : 13;
} SHELLSTATE, *LPSHELLSTATE;
#endif /* _WIN32_WINNT >= 0x0500 */

#if (_WIN32_IE >= 0x0500)
#pragma pack(push,8)
typedef struct
{
	SIZE sizeDragImage;
	POINT ptOffset;
	HBITMAP hbmpDragImage;
	COLORREF crColorKey;
} SHDRAGIMAGE, *LPSHDRAGIMAGE;
#pragma pack(pop)

#define INTERFACE IDragSourceHelper
DECLARE_INTERFACE_(IDragSourceHelper, IUnknown)
{
	STDMETHOD (QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
	STDMETHOD_(ULONG, AddRef) (THIS) PURE;
	STDMETHOD_(ULONG, Release) (THIS) PURE;
	STDMETHOD (InitializeFromBitmap)(THIS_ LPSHDRAGIMAGE pshdi, IDataObject* pDataObject) PURE;
	STDMETHOD (InitializeFromWindow)(THIS_ HWND hwnd, POINT* ppt, IDataObject* pDataObject) PURE;
};
#undef INTERFACE

#define INTERFACE IDropTargetHelper
DECLARE_INTERFACE_(IDropTargetHelper, IUnknown)
{
	STDMETHOD (QueryInterface)(THIS_ REFIID riid, void** ppv) PURE;
	STDMETHOD_(ULONG, AddRef) (THIS) PURE;
	STDMETHOD_(ULONG, Release) (THIS) PURE;
	STDMETHOD (DragEnter)(THIS_ HWND hwndTarget, IDataObject* pDataObject, POINT* ppt, DWORD dwEffect) PURE;
	STDMETHOD (DragLeave)(THIS) PURE;
	STDMETHOD (DragOver)(THIS_ POINT* ppt, DWORD dwEffect) PURE;
	STDMETHOD (Drop)(THIS_ IDataObject* pDataObject, POINT* ppt, DWORD dwEffect) PURE;
	STDMETHOD (Show)(THIS_ BOOL fShow) PURE;
};
#undef INTERFACE
#endif /* _WIN32_IE >= 0x0500 */

#if defined(COBJMACROS)
/*** IUnknown methods ***/
#define IDropTargetHelper_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDropTargetHelper_AddRef(p)             (p)->lpVtbl->AddRef(p)
#define IDropTargetHelper_Release(p)            (p)->lpVtbl->Release(p)
/*** IDropTargetHelper methods ***/
#define IDropTargetHelper_DragEnter(p,a,b,c,d)  (p)->lpVtbl->DragEnter(p,a,b,c,d)
#define IDropTargetHelper_DragLeave(p)          (p)->lpVtbl->DragLeave(p)
#define IDropTargetHelper_DragOver(p,a,b)       (p)->lpVtbl->DragOver(p,a,b)
#define IDropTargetHelper_Drop(p,a,b,c)         (p)->lpVtbl->Drop(p,a,b,c)
#define IDropTargetHelper_Show(p,a)             (p)->lpVtbl->Show(p,a)
#endif

#define INTERFACE IInputObject
DECLARE_INTERFACE_(IInputObject,IUnknown)
{
    /*** IUnknown methods ***/
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
    STDMETHOD_(ULONG,Release)(THIS) PURE;
    /*** IInputObject methods ***/
    STDMETHOD(UIActivateIO)(THIS_ BOOL bActivating, LPMSG lpMsg) PURE;
    STDMETHOD(HasFocusIO)(THIS) PURE;
    STDMETHOD(TranslateAcceleratorIO)(THIS_ LPMSG lpMsg) PURE;
};
#undef INTERFACE

#if defined(COBJMACROS)
/*** IUnknown methods ***/
#define IInputObject_QueryInterface(p,a,b)       (p)->lpVtbl->QueryInterface(p,a,b)
#define IInputObject_AddRef(p)                   (p)->lpVtbl->AddRef(p)
#define IInputObject_Release(p)                  (p)->lpVtbl->Release(p)
/*** IInputObject methods ***/
#define IInputObject_UIActivateIO(p,a,b)         (p)->lpVtbl->UIActivateIO(p,a,b)
#define IInputObject_HasFocusIO(p)               (p)->lpVtbl->HasFocusIO(p)
#define IInputObject_TranslateAcceleratorIO(p,a) (p)->lpVtbl->TranslateAcceleratorIO(p,a)
#endif

#define INTERFACE IInputObjectSite
DECLARE_INTERFACE_(IInputObjectSite,IUnknown)
{
    /*** IUnknown methods ***/
    STDMETHOD_(HRESULT,QueryInterface) (THIS_ REFIID riid, void** ppvObject) PURE;
    STDMETHOD_(ULONG,AddRef) (THIS) PURE;
    STDMETHOD_(ULONG,Release) (THIS) PURE;
    /*** IInputObjectSite methods ***/
    STDMETHOD(OnFocusChangeIS)(THIS_ LPUNKNOWN lpUnknown, BOOL bFocus) PURE;
};
#undef INTERFACE

#if defined(COBJMACROS)
/*** IUnknown methods ***/
#define IInputObjectSite_QueryInterface(p,a,b)  (p)->lpVtbl->QueryInterface(p,a,b)
#define IInputObjectSite_AddRef(p)              (p)->lpVtbl->AddRef(p)
#define IInputObjectSite_Release(p)             (p)->lpVtbl->Release(p)
/*** IInputObject methods ***/
#define IInputObjectSite_OnFocusChangeIS(p,a,b) (p)->lpVtbl->OnFocusChangeIS(p,a,b)
#endif

typedef HRESULT (CALLBACK *LPFNVIEWCALLBACK)(
	IShellView* dwUser,
	IShellFolder* pshf,
	HWND hWnd,
	UINT uMsg,
	WPARAM wParam,
	LPARAM lParam);
typedef struct _CSFV
{
  UINT             uSize;
  IShellFolder*    pshf;
  IShellView*      psvOuter;
  LPCITEMIDLIST    pidlFolder;
  LONG             lEvents;
  LPFNVIEWCALLBACK pfnCallback;
  FOLDERVIEWMODE   fvm;
} CSFV, *LPCSFV;

#define INTERFACE IShellFolderViewCB
DECLARE_INTERFACE_(IShellFolderViewCB,IUnknown)
{
    /*** IUnknown methods ***/
    STDMETHOD_(HRESULT,QueryInterface) (THIS_ REFIID riid, void** ppvObject) PURE;
    STDMETHOD_(ULONG,AddRef) (THIS) PURE;
    STDMETHOD_(ULONG,Release) (THIS) PURE;
    /*** IShellFolderViewCB methods ***/
    STDMETHOD(MessageSFVCB)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE;
};
#undef INTERFACE

#define SFVM_MERGEMENU	1
#define SFVM_INVOKECOMMAND	2
#define SFVM_GETHELPTEXT	3
#define SFVM_GETTOOLTIPTEXT	4
#define SFVM_GETBUTTONINFO	5
#define SFVM_GETBUTTONS	6
#define SFVM_INITMENUPOPUP	7
#define SFVM_FSNOTIFY	14
#define SFVM_WINDOWCREATED	15
#define SFVM_GETDETAILSOF	23
#define SFVM_COLUMNCLICK	24
#define SFVM_QUERYFSNOTIFY	25
#define SFVM_DEFITEMCOUNT	26
#define SFVM_DEFVIEWMODE	27
#define SFVM_UNMERGEMENU	28
#define SFVM_UPDATESTATUSBAR	31
#define SFVM_BACKGROUNDENUM	32
#define SFVM_DIDDRAGDROP	36
#define SFVM_SETISFV	39
#define SFVM_THISIDLIST	41
#define SFVM_ADDPROPERTYPAGES	47
#define SFVM_BACKGROUNDENUMDONE	48
#define SFVM_GETNOTIFY	49
#define SFVM_GETSORTDEFAULTS	53
#define SFVM_SIZE	57
#define SFVM_GETZONE	58
#define SFVM_GETPANE	59
#define SFVM_GETHELPTOPIC	63
#define SFVM_GETANIMATION	68

typedef struct _SFV_CREATE
{
    UINT cbSize;
    IShellFolder *pshf;
    IShellView *psvOuter;
    IShellFolderViewCB *psfvcb;
} SFV_CREATE;

void WINAPI SHAddToRecentDocs(UINT,PCVOID);
LPITEMIDLIST WINAPI SHBrowseForFolderA(PBROWSEINFOA);
LPITEMIDLIST WINAPI SHBrowseForFolderW(PBROWSEINFOW);
DWORD WINAPI SHCLSIDFromStringA(LPCSTR,CLSID*);
DWORD WINAPI SHCLSIDFromStringW(LPCWSTR,CLSID*);
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE*,IShellView**);
HRESULT WINAPI SHCreateShellFolderViewEx(LPCSFV pshfvi, IShellView **ppshv);
void WINAPI SHChangeNotify(LONG,UINT,PCVOID,PCVOID);
HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER,LPCITEMIDLIST,int,PVOID,int);
HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER,LPCITEMIDLIST,int,PVOID,int);
HRESULT WINAPI SHGetDesktopFolder(LPSHELLFOLDER*);
HRESULT WINAPI SHGetInstanceExplorer(IUnknown **);
HRESULT WINAPI SHGetMalloc(LPMALLOC*);
BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST,LPSTR);
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST,LPWSTR);
HRESULT WINAPI SHGetSpecialFolderLocation(HWND,int,LPITEMIDLIST*);
HRESULT WINAPI SHLoadInProc(REFCLSID);
#if (_WIN32_IE >= 0x0400)
BOOL WINAPI SHGetSpecialFolderPathA(HWND,LPSTR,int,BOOL);
BOOL WINAPI SHGetSpecialFolderPathW(HWND,LPWSTR,int,BOOL);
#endif
/* SHGetFolderPath in shfolder.dll on W9x, NT4, also in shell32.dll on W2K */
HRESULT WINAPI SHGetFolderPathA(HWND,int,HANDLE,DWORD,LPSTR);
HRESULT WINAPI SHGetFolderPathW(HWND,int,HANDLE,DWORD,LPWSTR);
#if (_WIN32_WINDOWS >= 0x0490) || (_WIN32_WINNT >= 0x0500) /* ME or W2K */
HRESULT WINAPI SHGetFolderLocation(HWND,int,HANDLE,DWORD,LPITEMIDLIST*);
#endif
#if (_WIN32_WINNT >= 0x0500)
INT WINAPI SHCreateDirectoryExA(HWND,LPCSTR,LPSECURITY_ATTRIBUTES);
INT WINAPI SHCreateDirectoryExW(HWND,LPCWSTR,LPSECURITY_ATTRIBUTES);
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST,REFIID,VOID**,LPCITEMIDLIST*);
#endif
#if (_WIN32_WINNT >= 0x0501) /* XP */
HRESULT WINAPI SHGetFolderPathAndSubDirA(HWND,int,HANDLE,DWORD,LPCSTR,LPSTR);
HRESULT WINAPI SHGetFolderPathAndSubDirW(HWND,int,HANDLE,DWORD,LPCWSTR,LPWSTR);
#endif
void WINAPI SHGetSettings(LPSHELLFLAGSTATE,DWORD);
#if (_WIN32_WINNT >= 0x0500) /* W2K */
void WINAPI SHGetSetSettings(LPSHELLSTATE,DWORD,BOOL);
#endif

#if (_WIN32_WINNT >= 0x0500) /* W2K */
BOOL WINAPI ILIsEqual(LPCITEMIDLIST, LPCITEMIDLIST);
BOOL WINAPI ILIsParent(LPCITEMIDLIST, LPCITEMIDLIST, BOOL);
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST);
HRESULT WINAPI ILLoadFromStream(IStream*, LPITEMIDLIST*);
HRESULT WINAPI ILSaveToStream(IStream*, LPCITEMIDLIST);
LPITEMIDLIST WINAPI ILAppendID(LPITEMIDLIST, LPCSHITEMID, BOOL);
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST);
LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST);
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST, LPCITEMIDLIST);
LPITEMIDLIST WINAPI ILCreateFromPathA(LPCSTR);
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR);
#ifdef UNICODE
#define ILCreateFromPath ILCreateFromPathW
#else
#define ILCreateFromPath ILCreateFromPathA
#endif
LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST, LPCITEMIDLIST);
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST);
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST);
UINT WINAPI ILGetSize(LPCITEMIDLIST);
void WINAPI ILFree(LPITEMIDLIST);

void WINAPI SHFree(LPVOID);
LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND,DWORD,BOOL);

HRESULT WINAPI SHCoCreateInstance(LPCWSTR,REFCLSID,IUnknown*,REFIID,void**);
BOOL WINAPI SHObjectProperties(HWND,DWORD,LPCWSTR,LPCWSTR);
#endif

int WINAPI RestartDialog(HWND,LPCWSTR,DWORD);
int WINAPI RestartDialogEx(HWND,LPCWSTR,DWORD,DWORD);

ULONG WINAPI SHChangeNotifyRegister(HWND,int,LONG,UINT,int,SHChangeNotifyEntry *);
BOOL WINAPI SHChangeNotifyDeregister(ULONG);

#ifdef UNICODE
typedef IShellExecuteHookW IShellExecuteHook;
typedef IShellLinkW IShellLink;
typedef BROWSEINFOW BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;
#define SHBrowseForFolder SHBrowseForFolderW
#define SHCLSIDFromString SHCLSIDFromStringW
#define SHGetDataFromIDList SHGetDataFromIDListW
#define SHGetPathFromIDList SHGetPathFromIDListW
#if (_WIN32_IE >= 0x0400)
#define SHGetSpecialFolderPath SHGetSpecialFolderPathW
#endif
#define SHGetFolderPath SHGetFolderPathW
#if (_WIN32_WINNT >= 0x0500)
#define SHCreateDirectoryEx SHCreateDirectoryExW
#endif
#if (_WIN32_WINNT >= 0x0501)
#define SHGetFolderPathAndSubDir SHGetFolderPathAndSubDirW
#endif

#else
typedef IShellExecuteHookA IShellExecuteHook;
typedef IShellLinkA IShellLink;
typedef BROWSEINFOA BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;
#define SHBrowseForFolder SHBrowseForFolderA
#define SHCLSIDFromString SHCLSIDFromStringA
#define SHGetDataFromIDList SHGetDataFromIDListA
#define SHGetPathFromIDList SHGetPathFromIDListA
#if (_WIN32_IE >= 0x0400)
#define SHGetSpecialFolderPath SHGetSpecialFolderPathA
#endif
#define SHGetFolderPath SHGetFolderPathA
#if (_WIN32_WINNT >= 0x0500)
#define SHCreateDirectoryEx SHCreateDirectoryExA
#endif
#if (_WIN32_WINNT >= 0x0501)
#define SHGetFolderPathAndSubDir SHGetFolderPathAndSubDirA
#endif
#endif /* UNICODE */

#pragma pack(pop)
#ifdef __cplusplus
}
#endif


#endif /* _SHLOBJ_H */
