/*** Autogenerated by WIDL 6.0-rc3 from include/shobjidl.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __shobjidl_h__
#define __shobjidl_h__

/* Forward declarations */

#ifndef __IContextMenu_FWD_DEFINED__
#define __IContextMenu_FWD_DEFINED__
typedef interface IContextMenu IContextMenu;
#ifdef __cplusplus
interface IContextMenu;
#endif /* __cplusplus */
#endif

#ifndef __IContextMenu2_FWD_DEFINED__
#define __IContextMenu2_FWD_DEFINED__
typedef interface IContextMenu2 IContextMenu2;
#ifdef __cplusplus
interface IContextMenu2;
#endif /* __cplusplus */
#endif

#ifndef __IContextMenu3_FWD_DEFINED__
#define __IContextMenu3_FWD_DEFINED__
typedef interface IContextMenu3 IContextMenu3;
#ifdef __cplusplus
interface IContextMenu3;
#endif /* __cplusplus */
#endif

#ifndef __IExecuteCommand_FWD_DEFINED__
#define __IExecuteCommand_FWD_DEFINED__
typedef interface IExecuteCommand IExecuteCommand;
#ifdef __cplusplus
interface IExecuteCommand;
#endif /* __cplusplus */
#endif

#ifndef __IPersistFolder_FWD_DEFINED__
#define __IPersistFolder_FWD_DEFINED__
typedef interface IPersistFolder IPersistFolder;
#ifdef __cplusplus
interface IPersistFolder;
#endif /* __cplusplus */
#endif

#ifndef __IRunnableTask_FWD_DEFINED__
#define __IRunnableTask_FWD_DEFINED__
typedef interface IRunnableTask IRunnableTask;
#ifdef __cplusplus
interface IRunnableTask;
#endif /* __cplusplus */
#endif

#ifndef __IShellTaskScheduler_FWD_DEFINED__
#define __IShellTaskScheduler_FWD_DEFINED__
typedef interface IShellTaskScheduler IShellTaskScheduler;
#ifdef __cplusplus
interface IShellTaskScheduler;
#endif /* __cplusplus */
#endif

#ifndef __IQueryCodePage_FWD_DEFINED__
#define __IQueryCodePage_FWD_DEFINED__
typedef interface IQueryCodePage IQueryCodePage;
#ifdef __cplusplus
interface IQueryCodePage;
#endif /* __cplusplus */
#endif

#ifndef __IPersistFolder2_FWD_DEFINED__
#define __IPersistFolder2_FWD_DEFINED__
typedef interface IPersistFolder2 IPersistFolder2;
#ifdef __cplusplus
interface IPersistFolder2;
#endif /* __cplusplus */
#endif

#ifndef __IPersistFolder3_FWD_DEFINED__
#define __IPersistFolder3_FWD_DEFINED__
typedef interface IPersistFolder3 IPersistFolder3;
#ifdef __cplusplus
interface IPersistFolder3;
#endif /* __cplusplus */
#endif

#ifndef __IPersistIDList_FWD_DEFINED__
#define __IPersistIDList_FWD_DEFINED__
typedef interface IPersistIDList IPersistIDList;
#ifdef __cplusplus
interface IPersistIDList;
#endif /* __cplusplus */
#endif

#ifndef __IEnumIDList_FWD_DEFINED__
#define __IEnumIDList_FWD_DEFINED__
typedef interface IEnumIDList IEnumIDList;
#ifdef __cplusplus
interface IEnumIDList;
#endif /* __cplusplus */
#endif

#ifndef __IEnumFullIDList_FWD_DEFINED__
#define __IEnumFullIDList_FWD_DEFINED__
typedef interface IEnumFullIDList IEnumFullIDList;
#ifdef __cplusplus
interface IEnumFullIDList;
#endif /* __cplusplus */
#endif

#ifndef __IObjectWithFolderEnumMode_FWD_DEFINED__
#define __IObjectWithFolderEnumMode_FWD_DEFINED__
typedef interface IObjectWithFolderEnumMode IObjectWithFolderEnumMode;
#ifdef __cplusplus
interface IObjectWithFolderEnumMode;
#endif /* __cplusplus */
#endif

#ifndef __IParseAndCreateItem_FWD_DEFINED__
#define __IParseAndCreateItem_FWD_DEFINED__
typedef interface IParseAndCreateItem IParseAndCreateItem;
#ifdef __cplusplus
interface IParseAndCreateItem;
#endif /* __cplusplus */
#endif

#ifndef __IShellFolder_FWD_DEFINED__
#define __IShellFolder_FWD_DEFINED__
typedef interface IShellFolder IShellFolder;
#ifdef __cplusplus
interface IShellFolder;
#endif /* __cplusplus */
#endif

#ifndef __IEnumExtraSearch_FWD_DEFINED__
#define __IEnumExtraSearch_FWD_DEFINED__
typedef interface IEnumExtraSearch IEnumExtraSearch;
#ifdef __cplusplus
interface IEnumExtraSearch;
#endif /* __cplusplus */
#endif

#ifndef __IShellFolder2_FWD_DEFINED__
#define __IShellFolder2_FWD_DEFINED__
typedef interface IShellFolder2 IShellFolder2;
#ifdef __cplusplus
interface IShellFolder2;
#endif /* __cplusplus */
#endif

#ifndef __IFolderViewOptions_FWD_DEFINED__
#define __IFolderViewOptions_FWD_DEFINED__
typedef interface IFolderViewOptions IFolderViewOptions;
#ifdef __cplusplus
interface IFolderViewOptions;
#endif /* __cplusplus */
#endif

#ifndef __IShellView_FWD_DEFINED__
#define __IShellView_FWD_DEFINED__
typedef interface IShellView IShellView;
#ifdef __cplusplus
interface IShellView;
#endif /* __cplusplus */
#endif

#ifndef __IShellView2_FWD_DEFINED__
#define __IShellView2_FWD_DEFINED__
typedef interface IShellView2 IShellView2;
#ifdef __cplusplus
interface IShellView2;
#endif /* __cplusplus */
#endif

#ifndef __IShellView3_FWD_DEFINED__
#define __IShellView3_FWD_DEFINED__
typedef interface IShellView3 IShellView3;
#ifdef __cplusplus
interface IShellView3;
#endif /* __cplusplus */
#endif

#ifndef __IFolderView_FWD_DEFINED__
#define __IFolderView_FWD_DEFINED__
typedef interface IFolderView IFolderView;
#ifdef __cplusplus
interface IFolderView;
#endif /* __cplusplus */
#endif

#ifndef __ISearchBoxInfo_FWD_DEFINED__
#define __ISearchBoxInfo_FWD_DEFINED__
typedef interface ISearchBoxInfo ISearchBoxInfo;
#ifdef __cplusplus
interface ISearchBoxInfo;
#endif /* __cplusplus */
#endif

#ifndef __IFolderView2_FWD_DEFINED__
#define __IFolderView2_FWD_DEFINED__
typedef interface IFolderView2 IFolderView2;
#ifdef __cplusplus
interface IFolderView2;
#endif /* __cplusplus */
#endif

#ifndef __IFolderViewSettings_FWD_DEFINED__
#define __IFolderViewSettings_FWD_DEFINED__
typedef interface IFolderViewSettings IFolderViewSettings;
#ifdef __cplusplus
interface IFolderViewSettings;
#endif /* __cplusplus */
#endif

#ifndef __IPreviewHandlerVisuals_FWD_DEFINED__
#define __IPreviewHandlerVisuals_FWD_DEFINED__
typedef interface IPreviewHandlerVisuals IPreviewHandlerVisuals;
#ifdef __cplusplus
interface IPreviewHandlerVisuals;
#endif /* __cplusplus */
#endif

#ifndef __IVisualProperties_FWD_DEFINED__
#define __IVisualProperties_FWD_DEFINED__
typedef interface IVisualProperties IVisualProperties;
#ifdef __cplusplus
interface IVisualProperties;
#endif /* __cplusplus */
#endif

#ifndef __ICommDlgBrowser_FWD_DEFINED__
#define __ICommDlgBrowser_FWD_DEFINED__
typedef interface ICommDlgBrowser ICommDlgBrowser;
#ifdef __cplusplus
interface ICommDlgBrowser;
#endif /* __cplusplus */
#endif

#ifndef __ICommDlgBrowser2_FWD_DEFINED__
#define __ICommDlgBrowser2_FWD_DEFINED__
typedef interface ICommDlgBrowser2 ICommDlgBrowser2;
#ifdef __cplusplus
interface ICommDlgBrowser2;
#endif /* __cplusplus */
#endif

#ifndef __ICommDlgBrowser3_FWD_DEFINED__
#define __ICommDlgBrowser3_FWD_DEFINED__
typedef interface ICommDlgBrowser3 ICommDlgBrowser3;
#ifdef __cplusplus
interface ICommDlgBrowser3;
#endif /* __cplusplus */
#endif

#ifndef __IColumnManager_FWD_DEFINED__
#define __IColumnManager_FWD_DEFINED__
typedef interface IColumnManager IColumnManager;
#ifdef __cplusplus
interface IColumnManager;
#endif /* __cplusplus */
#endif

#ifndef __IFolderFilterSite_FWD_DEFINED__
#define __IFolderFilterSite_FWD_DEFINED__
typedef interface IFolderFilterSite IFolderFilterSite;
#ifdef __cplusplus
interface IFolderFilterSite;
#endif /* __cplusplus */
#endif

#ifndef __IFolderFilter_FWD_DEFINED__
#define __IFolderFilter_FWD_DEFINED__
typedef interface IFolderFilter IFolderFilter;
#ifdef __cplusplus
interface IFolderFilter;
#endif /* __cplusplus */
#endif

#ifndef __IInputObjectSite_FWD_DEFINED__
#define __IInputObjectSite_FWD_DEFINED__
typedef interface IInputObjectSite IInputObjectSite;
#ifdef __cplusplus
interface IInputObjectSite;
#endif /* __cplusplus */
#endif

#ifndef __IInputObject_FWD_DEFINED__
#define __IInputObject_FWD_DEFINED__
typedef interface IInputObject IInputObject;
#ifdef __cplusplus
interface IInputObject;
#endif /* __cplusplus */
#endif

#ifndef __IInputObject2_FWD_DEFINED__
#define __IInputObject2_FWD_DEFINED__
typedef interface IInputObject2 IInputObject2;
#ifdef __cplusplus
interface IInputObject2;
#endif /* __cplusplus */
#endif

#ifndef __IShellIcon_FWD_DEFINED__
#define __IShellIcon_FWD_DEFINED__
typedef interface IShellIcon IShellIcon;
#ifdef __cplusplus
interface IShellIcon;
#endif /* __cplusplus */
#endif

#ifndef __IShellBrowser_FWD_DEFINED__
#define __IShellBrowser_FWD_DEFINED__
typedef interface IShellBrowser IShellBrowser;
#ifdef __cplusplus
interface IShellBrowser;
#endif /* __cplusplus */
#endif

#ifndef __IProfferService_FWD_DEFINED__
#define __IProfferService_FWD_DEFINED__
typedef interface IProfferService IProfferService;
#ifdef __cplusplus
interface IProfferService;
#endif /* __cplusplus */
#endif

#ifndef __IShellItem_FWD_DEFINED__
#define __IShellItem_FWD_DEFINED__
typedef interface IShellItem IShellItem;
#ifdef __cplusplus
interface IShellItem;
#endif /* __cplusplus */
#endif

#ifndef __IShellItem2_FWD_DEFINED__
#define __IShellItem2_FWD_DEFINED__
typedef interface IShellItem2 IShellItem2;
#ifdef __cplusplus
interface IShellItem2;
#endif /* __cplusplus */
#endif

#ifndef __IShellItemImageFactory_FWD_DEFINED__
#define __IShellItemImageFactory_FWD_DEFINED__
typedef interface IShellItemImageFactory IShellItemImageFactory;
#ifdef __cplusplus
interface IShellItemImageFactory;
#endif /* __cplusplus */
#endif

#ifndef __IUserAccountChangeCallback_FWD_DEFINED__
#define __IUserAccountChangeCallback_FWD_DEFINED__
typedef interface IUserAccountChangeCallback IUserAccountChangeCallback;
#ifdef __cplusplus
interface IUserAccountChangeCallback;
#endif /* __cplusplus */
#endif

#ifndef __IEnumShellItems_FWD_DEFINED__
#define __IEnumShellItems_FWD_DEFINED__
typedef interface IEnumShellItems IEnumShellItems;
#ifdef __cplusplus
interface IEnumShellItems;
#endif /* __cplusplus */
#endif

#ifndef __ITransferAdviseSink_FWD_DEFINED__
#define __ITransferAdviseSink_FWD_DEFINED__
typedef interface ITransferAdviseSink ITransferAdviseSink;
#ifdef __cplusplus
interface ITransferAdviseSink;
#endif /* __cplusplus */
#endif

#ifndef __ITransferSource_FWD_DEFINED__
#define __ITransferSource_FWD_DEFINED__
typedef interface ITransferSource ITransferSource;
#ifdef __cplusplus
interface ITransferSource;
#endif /* __cplusplus */
#endif

#ifndef __IEnumResources_FWD_DEFINED__
#define __IEnumResources_FWD_DEFINED__
typedef interface IEnumResources IEnumResources;
#ifdef __cplusplus
interface IEnumResources;
#endif /* __cplusplus */
#endif

#ifndef __IShellItemResources_FWD_DEFINED__
#define __IShellItemResources_FWD_DEFINED__
typedef interface IShellItemResources IShellItemResources;
#ifdef __cplusplus
interface IShellItemResources;
#endif /* __cplusplus */
#endif

#ifndef __ITransferDestination_FWD_DEFINED__
#define __ITransferDestination_FWD_DEFINED__
typedef interface ITransferDestination ITransferDestination;
#ifdef __cplusplus
interface ITransferDestination;
#endif /* __cplusplus */
#endif

#ifndef __IStreamAsync_FWD_DEFINED__
#define __IStreamAsync_FWD_DEFINED__
typedef interface IStreamAsync IStreamAsync;
#ifdef __cplusplus
interface IStreamAsync;
#endif /* __cplusplus */
#endif

#ifndef __IStreamUnbufferedInfo_FWD_DEFINED__
#define __IStreamUnbufferedInfo_FWD_DEFINED__
typedef interface IStreamUnbufferedInfo IStreamUnbufferedInfo;
#ifdef __cplusplus
interface IStreamUnbufferedInfo;
#endif /* __cplusplus */
#endif

#ifndef __IFileOperationProgressSink_FWD_DEFINED__
#define __IFileOperationProgressSink_FWD_DEFINED__
typedef interface IFileOperationProgressSink IFileOperationProgressSink;
#ifdef __cplusplus
interface IFileOperationProgressSink;
#endif /* __cplusplus */
#endif

#ifndef __IShellItemArray_FWD_DEFINED__
#define __IShellItemArray_FWD_DEFINED__
typedef interface IShellItemArray IShellItemArray;
#ifdef __cplusplus
interface IShellItemArray;
#endif /* __cplusplus */
#endif

#ifndef __IInitializeWithItem_FWD_DEFINED__
#define __IInitializeWithItem_FWD_DEFINED__
typedef interface IInitializeWithItem IInitializeWithItem;
#ifdef __cplusplus
interface IInitializeWithItem;
#endif /* __cplusplus */
#endif

#ifndef __IObjectWithSelection_FWD_DEFINED__
#define __IObjectWithSelection_FWD_DEFINED__
typedef interface IObjectWithSelection IObjectWithSelection;
#ifdef __cplusplus
interface IObjectWithSelection;
#endif /* __cplusplus */
#endif

#ifndef __IObjectWithBackReferences_FWD_DEFINED__
#define __IObjectWithBackReferences_FWD_DEFINED__
typedef interface IObjectWithBackReferences IObjectWithBackReferences;
#ifdef __cplusplus
interface IObjectWithBackReferences;
#endif /* __cplusplus */
#endif

#ifndef __IPropertyUI_FWD_DEFINED__
#define __IPropertyUI_FWD_DEFINED__
typedef interface IPropertyUI IPropertyUI;
#ifdef __cplusplus
interface IPropertyUI;
#endif /* __cplusplus */
#endif

#ifndef __ICategoryProvider_FWD_DEFINED__
#define __ICategoryProvider_FWD_DEFINED__
typedef interface ICategoryProvider ICategoryProvider;
#ifdef __cplusplus
interface ICategoryProvider;
#endif /* __cplusplus */
#endif

#ifndef __ICategorizer_FWD_DEFINED__
#define __ICategorizer_FWD_DEFINED__
typedef interface ICategorizer ICategorizer;
#ifdef __cplusplus
interface ICategorizer;
#endif /* __cplusplus */
#endif

#ifndef __IDropTargetHelper_FWD_DEFINED__
#define __IDropTargetHelper_FWD_DEFINED__
typedef interface IDropTargetHelper IDropTargetHelper;
#ifdef __cplusplus
interface IDropTargetHelper;
#endif /* __cplusplus */
#endif

#ifndef __IDragSourceHelper_FWD_DEFINED__
#define __IDragSourceHelper_FWD_DEFINED__
typedef interface IDragSourceHelper IDragSourceHelper;
#ifdef __cplusplus
interface IDragSourceHelper;
#endif /* __cplusplus */
#endif

#ifndef __IDragSourceHelper2_FWD_DEFINED__
#define __IDragSourceHelper2_FWD_DEFINED__
typedef interface IDragSourceHelper2 IDragSourceHelper2;
#ifdef __cplusplus
interface IDragSourceHelper2;
#endif /* __cplusplus */
#endif

#ifndef __IShellLinkA_FWD_DEFINED__
#define __IShellLinkA_FWD_DEFINED__
typedef interface IShellLinkA IShellLinkA;
#ifdef __cplusplus
interface IShellLinkA;
#endif /* __cplusplus */
#endif

#ifndef __IShellLinkW_FWD_DEFINED__
#define __IShellLinkW_FWD_DEFINED__
typedef interface IShellLinkW IShellLinkW;
#ifdef __cplusplus
interface IShellLinkW;
#endif /* __cplusplus */
#endif

#ifndef __IShellLinkDataList_FWD_DEFINED__
#define __IShellLinkDataList_FWD_DEFINED__
typedef interface IShellLinkDataList IShellLinkDataList;
#ifdef __cplusplus
interface IShellLinkDataList;
#endif /* __cplusplus */
#endif

#ifndef __IResolveShellLink_FWD_DEFINED__
#define __IResolveShellLink_FWD_DEFINED__
typedef interface IResolveShellLink IResolveShellLink;
#ifdef __cplusplus
interface IResolveShellLink;
#endif /* __cplusplus */
#endif

#ifndef __IActionProgressDialog_FWD_DEFINED__
#define __IActionProgressDialog_FWD_DEFINED__
typedef interface IActionProgressDialog IActionProgressDialog;
#ifdef __cplusplus
interface IActionProgressDialog;
#endif /* __cplusplus */
#endif

#ifndef __IHWEventHandler_FWD_DEFINED__
#define __IHWEventHandler_FWD_DEFINED__
typedef interface IHWEventHandler IHWEventHandler;
#ifdef __cplusplus
interface IHWEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IHWEventHandler2_FWD_DEFINED__
#define __IHWEventHandler2_FWD_DEFINED__
typedef interface IHWEventHandler2 IHWEventHandler2;
#ifdef __cplusplus
interface IHWEventHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IQueryCancelAutoPlay_FWD_DEFINED__
#define __IQueryCancelAutoPlay_FWD_DEFINED__
typedef interface IQueryCancelAutoPlay IQueryCancelAutoPlay;
#ifdef __cplusplus
interface IQueryCancelAutoPlay;
#endif /* __cplusplus */
#endif

#ifndef __IDynamicHWHandler_FWD_DEFINED__
#define __IDynamicHWHandler_FWD_DEFINED__
typedef interface IDynamicHWHandler IDynamicHWHandler;
#ifdef __cplusplus
interface IDynamicHWHandler;
#endif /* __cplusplus */
#endif

#ifndef __IActionProgress_FWD_DEFINED__
#define __IActionProgress_FWD_DEFINED__
typedef interface IActionProgress IActionProgress;
#ifdef __cplusplus
interface IActionProgress;
#endif /* __cplusplus */
#endif

#ifndef __IShellExtInit_FWD_DEFINED__
#define __IShellExtInit_FWD_DEFINED__
typedef interface IShellExtInit IShellExtInit;
#ifdef __cplusplus
interface IShellExtInit;
#endif /* __cplusplus */
#endif

#ifndef __IShellPropSheetExt_FWD_DEFINED__
#define __IShellPropSheetExt_FWD_DEFINED__
typedef interface IShellPropSheetExt IShellPropSheetExt;
#ifdef __cplusplus
interface IShellPropSheetExt;
#endif /* __cplusplus */
#endif

#ifndef __IRemoteComputer_FWD_DEFINED__
#define __IRemoteComputer_FWD_DEFINED__
typedef interface IRemoteComputer IRemoteComputer;
#ifdef __cplusplus
interface IRemoteComputer;
#endif /* __cplusplus */
#endif

#ifndef __IQueryContinue_FWD_DEFINED__
#define __IQueryContinue_FWD_DEFINED__
typedef interface IQueryContinue IQueryContinue;
#ifdef __cplusplus
interface IQueryContinue;
#endif /* __cplusplus */
#endif

#ifndef __IObjectWithCancelEvent_FWD_DEFINED__
#define __IObjectWithCancelEvent_FWD_DEFINED__
typedef interface IObjectWithCancelEvent IObjectWithCancelEvent;
#ifdef __cplusplus
interface IObjectWithCancelEvent;
#endif /* __cplusplus */
#endif

#ifndef __IUserNotification_FWD_DEFINED__
#define __IUserNotification_FWD_DEFINED__
typedef interface IUserNotification IUserNotification;
#ifdef __cplusplus
interface IUserNotification;
#endif /* __cplusplus */
#endif

#ifndef __IUserNotificationCallback_FWD_DEFINED__
#define __IUserNotificationCallback_FWD_DEFINED__
typedef interface IUserNotificationCallback IUserNotificationCallback;
#ifdef __cplusplus
interface IUserNotificationCallback;
#endif /* __cplusplus */
#endif

#ifndef __IUserNotification2_FWD_DEFINED__
#define __IUserNotification2_FWD_DEFINED__
typedef interface IUserNotification2 IUserNotification2;
#ifdef __cplusplus
interface IUserNotification2;
#endif /* __cplusplus */
#endif

#ifndef __IItemNameLimits_FWD_DEFINED__
#define __IItemNameLimits_FWD_DEFINED__
typedef interface IItemNameLimits IItemNameLimits;
#ifdef __cplusplus
interface IItemNameLimits;
#endif /* __cplusplus */
#endif

#ifndef __ISearchFolderItemFactory_FWD_DEFINED__
#define __ISearchFolderItemFactory_FWD_DEFINED__
typedef interface ISearchFolderItemFactory ISearchFolderItemFactory;
#ifdef __cplusplus
interface ISearchFolderItemFactory;
#endif /* __cplusplus */
#endif

#ifndef __IExtractImage_FWD_DEFINED__
#define __IExtractImage_FWD_DEFINED__
typedef interface IExtractImage IExtractImage;
#ifdef __cplusplus
interface IExtractImage;
#endif /* __cplusplus */
#endif

#ifndef __IExtractImage2_FWD_DEFINED__
#define __IExtractImage2_FWD_DEFINED__
typedef interface IExtractImage2 IExtractImage2;
#ifdef __cplusplus
interface IExtractImage2;
#endif /* __cplusplus */
#endif

#ifndef __IThumbnailHandlerFactory_FWD_DEFINED__
#define __IThumbnailHandlerFactory_FWD_DEFINED__
typedef interface IThumbnailHandlerFactory IThumbnailHandlerFactory;
#ifdef __cplusplus
interface IThumbnailHandlerFactory;
#endif /* __cplusplus */
#endif

#ifndef __IParentAndItem_FWD_DEFINED__
#define __IParentAndItem_FWD_DEFINED__
typedef interface IParentAndItem IParentAndItem;
#ifdef __cplusplus
interface IParentAndItem;
#endif /* __cplusplus */
#endif

#ifndef __IDockingWindow_FWD_DEFINED__
#define __IDockingWindow_FWD_DEFINED__
typedef interface IDockingWindow IDockingWindow;
#ifdef __cplusplus
interface IDockingWindow;
#endif /* __cplusplus */
#endif

#ifndef __IDeskBand_FWD_DEFINED__
#define __IDeskBand_FWD_DEFINED__
typedef interface IDeskBand IDeskBand;
#ifdef __cplusplus
interface IDeskBand;
#endif /* __cplusplus */
#endif

#ifndef __IDeskBandInfo_FWD_DEFINED__
#define __IDeskBandInfo_FWD_DEFINED__
typedef interface IDeskBandInfo IDeskBandInfo;
#ifdef __cplusplus
interface IDeskBandInfo;
#endif /* __cplusplus */
#endif

#ifndef __IDeskBand2_FWD_DEFINED__
#define __IDeskBand2_FWD_DEFINED__
typedef interface IDeskBand2 IDeskBand2;
#ifdef __cplusplus
interface IDeskBand2;
#endif /* __cplusplus */
#endif

#ifndef __ITaskbarList_FWD_DEFINED__
#define __ITaskbarList_FWD_DEFINED__
typedef interface ITaskbarList ITaskbarList;
#ifdef __cplusplus
interface ITaskbarList;
#endif /* __cplusplus */
#endif

#ifndef __ITaskbarList2_FWD_DEFINED__
#define __ITaskbarList2_FWD_DEFINED__
typedef interface ITaskbarList2 ITaskbarList2;
#ifdef __cplusplus
interface ITaskbarList2;
#endif /* __cplusplus */
#endif

#ifndef __ITaskbarList3_FWD_DEFINED__
#define __ITaskbarList3_FWD_DEFINED__
typedef interface ITaskbarList3 ITaskbarList3;
#ifdef __cplusplus
interface ITaskbarList3;
#endif /* __cplusplus */
#endif

#ifndef __ITaskbarList4_FWD_DEFINED__
#define __ITaskbarList4_FWD_DEFINED__
typedef interface ITaskbarList4 ITaskbarList4;
#ifdef __cplusplus
interface ITaskbarList4;
#endif /* __cplusplus */
#endif

#ifndef __IStartMenuPinnedList_FWD_DEFINED__
#define __IStartMenuPinnedList_FWD_DEFINED__
typedef interface IStartMenuPinnedList IStartMenuPinnedList;
#ifdef __cplusplus
interface IStartMenuPinnedList;
#endif /* __cplusplus */
#endif

#ifndef __ICDBurn_FWD_DEFINED__
#define __ICDBurn_FWD_DEFINED__
typedef interface ICDBurn ICDBurn;
#ifdef __cplusplus
interface ICDBurn;
#endif /* __cplusplus */
#endif

#ifndef __IWizardSite_FWD_DEFINED__
#define __IWizardSite_FWD_DEFINED__
typedef interface IWizardSite IWizardSite;
#ifdef __cplusplus
interface IWizardSite;
#endif /* __cplusplus */
#endif

#ifndef __IWizardExtension_FWD_DEFINED__
#define __IWizardExtension_FWD_DEFINED__
typedef interface IWizardExtension IWizardExtension;
#ifdef __cplusplus
interface IWizardExtension;
#endif /* __cplusplus */
#endif

#ifndef __IWebWizardExtension_FWD_DEFINED__
#define __IWebWizardExtension_FWD_DEFINED__
typedef interface IWebWizardExtension IWebWizardExtension;
#ifdef __cplusplus
interface IWebWizardExtension;
#endif /* __cplusplus */
#endif

#ifndef __IPublishingWizard_FWD_DEFINED__
#define __IPublishingWizard_FWD_DEFINED__
typedef interface IPublishingWizard IPublishingWizard;
#ifdef __cplusplus
interface IPublishingWizard;
#endif /* __cplusplus */
#endif

#ifndef __IFolderViewHost_FWD_DEFINED__
#define __IFolderViewHost_FWD_DEFINED__
typedef interface IFolderViewHost IFolderViewHost;
#ifdef __cplusplus
interface IFolderViewHost;
#endif /* __cplusplus */
#endif

#ifndef __IExplorerBrowserEvents_FWD_DEFINED__
#define __IExplorerBrowserEvents_FWD_DEFINED__
typedef interface IExplorerBrowserEvents IExplorerBrowserEvents;
#ifdef __cplusplus
interface IExplorerBrowserEvents;
#endif /* __cplusplus */
#endif

#ifndef __IExplorerBrowser_FWD_DEFINED__
#define __IExplorerBrowser_FWD_DEFINED__
typedef interface IExplorerBrowser IExplorerBrowser;
#ifdef __cplusplus
interface IExplorerBrowser;
#endif /* __cplusplus */
#endif

#ifndef __IAccessibleObject_FWD_DEFINED__
#define __IAccessibleObject_FWD_DEFINED__
typedef interface IAccessibleObject IAccessibleObject;
#ifdef __cplusplus
interface IAccessibleObject;
#endif /* __cplusplus */
#endif

#ifndef __IResultsFolder_FWD_DEFINED__
#define __IResultsFolder_FWD_DEFINED__
typedef interface IResultsFolder IResultsFolder;
#ifdef __cplusplus
interface IResultsFolder;
#endif /* __cplusplus */
#endif

#ifndef __IEnumObjects_FWD_DEFINED__
#define __IEnumObjects_FWD_DEFINED__
typedef interface IEnumObjects IEnumObjects;
#ifdef __cplusplus
interface IEnumObjects;
#endif /* __cplusplus */
#endif

#ifndef __IOperationsProgressDialog_FWD_DEFINED__
#define __IOperationsProgressDialog_FWD_DEFINED__
typedef interface IOperationsProgressDialog IOperationsProgressDialog;
#ifdef __cplusplus
interface IOperationsProgressDialog;
#endif /* __cplusplus */
#endif

#ifndef __IIOCancelInformation_FWD_DEFINED__
#define __IIOCancelInformation_FWD_DEFINED__
typedef interface IIOCancelInformation IIOCancelInformation;
#ifdef __cplusplus
interface IIOCancelInformation;
#endif /* __cplusplus */
#endif

#ifndef __IFileOperation_FWD_DEFINED__
#define __IFileOperation_FWD_DEFINED__
typedef interface IFileOperation IFileOperation;
#ifdef __cplusplus
interface IFileOperation;
#endif /* __cplusplus */
#endif

#ifndef __IObjectProvider_FWD_DEFINED__
#define __IObjectProvider_FWD_DEFINED__
typedef interface IObjectProvider IObjectProvider;
#ifdef __cplusplus
interface IObjectProvider;
#endif /* __cplusplus */
#endif

#ifndef __INamespaceWalkCB_FWD_DEFINED__
#define __INamespaceWalkCB_FWD_DEFINED__
typedef interface INamespaceWalkCB INamespaceWalkCB;
#ifdef __cplusplus
interface INamespaceWalkCB;
#endif /* __cplusplus */
#endif

#ifndef __INamespaceWalkCB2_FWD_DEFINED__
#define __INamespaceWalkCB2_FWD_DEFINED__
typedef interface INamespaceWalkCB2 INamespaceWalkCB2;
#ifdef __cplusplus
interface INamespaceWalkCB2;
#endif /* __cplusplus */
#endif

#ifndef __INamespaceWalk_FWD_DEFINED__
#define __INamespaceWalk_FWD_DEFINED__
typedef interface INamespaceWalk INamespaceWalk;
#ifdef __cplusplus
interface INamespaceWalk;
#endif /* __cplusplus */
#endif

#ifndef __IAutoCompleteDropDown_FWD_DEFINED__
#define __IAutoCompleteDropDown_FWD_DEFINED__
typedef interface IAutoCompleteDropDown IAutoCompleteDropDown;
#ifdef __cplusplus
interface IAutoCompleteDropDown;
#endif /* __cplusplus */
#endif

#ifndef __IBandSite_FWD_DEFINED__
#define __IBandSite_FWD_DEFINED__
typedef interface IBandSite IBandSite;
#ifdef __cplusplus
interface IBandSite;
#endif /* __cplusplus */
#endif

#ifndef __IModalWindow_FWD_DEFINED__
#define __IModalWindow_FWD_DEFINED__
typedef interface IModalWindow IModalWindow;
#ifdef __cplusplus
interface IModalWindow;
#endif /* __cplusplus */
#endif

#ifndef __ICDBurnExt_FWD_DEFINED__
#define __ICDBurnExt_FWD_DEFINED__
typedef interface ICDBurnExt ICDBurnExt;
#ifdef __cplusplus
interface ICDBurnExt;
#endif /* __cplusplus */
#endif

#ifndef __IContextMenuSite_FWD_DEFINED__
#define __IContextMenuSite_FWD_DEFINED__
typedef interface IContextMenuSite IContextMenuSite;
#ifdef __cplusplus
interface IContextMenuSite;
#endif /* __cplusplus */
#endif

#ifndef __IEnumReadyCallback_FWD_DEFINED__
#define __IEnumReadyCallback_FWD_DEFINED__
typedef interface IEnumReadyCallback IEnumReadyCallback;
#ifdef __cplusplus
interface IEnumReadyCallback;
#endif /* __cplusplus */
#endif

#ifndef __IEnumerableView_FWD_DEFINED__
#define __IEnumerableView_FWD_DEFINED__
typedef interface IEnumerableView IEnumerableView;
#ifdef __cplusplus
interface IEnumerableView;
#endif /* __cplusplus */
#endif

#ifndef __IInsertItem_FWD_DEFINED__
#define __IInsertItem_FWD_DEFINED__
typedef interface IInsertItem IInsertItem;
#ifdef __cplusplus
interface IInsertItem;
#endif /* __cplusplus */
#endif

#ifndef __IMenuBand_FWD_DEFINED__
#define __IMenuBand_FWD_DEFINED__
typedef interface IMenuBand IMenuBand;
#ifdef __cplusplus
interface IMenuBand;
#endif /* __cplusplus */
#endif

#ifndef __IFolderBandPriv_FWD_DEFINED__
#define __IFolderBandPriv_FWD_DEFINED__
typedef interface IFolderBandPriv IFolderBandPriv;
#ifdef __cplusplus
interface IFolderBandPriv;
#endif /* __cplusplus */
#endif

#ifndef __IRegTreeItem_FWD_DEFINED__
#define __IRegTreeItem_FWD_DEFINED__
typedef interface IRegTreeItem IRegTreeItem;
#ifdef __cplusplus
interface IRegTreeItem;
#endif /* __cplusplus */
#endif

#ifndef __IImageRecompress_FWD_DEFINED__
#define __IImageRecompress_FWD_DEFINED__
typedef interface IImageRecompress IImageRecompress;
#ifdef __cplusplus
interface IImageRecompress;
#endif /* __cplusplus */
#endif

#ifndef __IDeskBar_FWD_DEFINED__
#define __IDeskBar_FWD_DEFINED__
typedef interface IDeskBar IDeskBar;
#ifdef __cplusplus
interface IDeskBar;
#endif /* __cplusplus */
#endif

#ifndef __IMenuPopup_FWD_DEFINED__
#define __IMenuPopup_FWD_DEFINED__
typedef interface IMenuPopup IMenuPopup;
#ifdef __cplusplus
interface IMenuPopup;
#endif /* __cplusplus */
#endif

#ifndef __IFileIsInUse_FWD_DEFINED__
#define __IFileIsInUse_FWD_DEFINED__
typedef interface IFileIsInUse IFileIsInUse;
#ifdef __cplusplus
interface IFileIsInUse;
#endif /* __cplusplus */
#endif

#ifndef __IFileDialogEvents_FWD_DEFINED__
#define __IFileDialogEvents_FWD_DEFINED__
typedef interface IFileDialogEvents IFileDialogEvents;
#ifdef __cplusplus
interface IFileDialogEvents;
#endif /* __cplusplus */
#endif

#ifndef __IFileDialog_FWD_DEFINED__
#define __IFileDialog_FWD_DEFINED__
typedef interface IFileDialog IFileDialog;
#ifdef __cplusplus
interface IFileDialog;
#endif /* __cplusplus */
#endif

#ifndef __IFileSaveDialog_FWD_DEFINED__
#define __IFileSaveDialog_FWD_DEFINED__
typedef interface IFileSaveDialog IFileSaveDialog;
#ifdef __cplusplus
interface IFileSaveDialog;
#endif /* __cplusplus */
#endif

#ifndef __IFileOpenDialog_FWD_DEFINED__
#define __IFileOpenDialog_FWD_DEFINED__
typedef interface IFileOpenDialog IFileOpenDialog;
#ifdef __cplusplus
interface IFileOpenDialog;
#endif /* __cplusplus */
#endif

#ifndef __IFileDialogCustomize_FWD_DEFINED__
#define __IFileDialogCustomize_FWD_DEFINED__
typedef interface IFileDialogCustomize IFileDialogCustomize;
#ifdef __cplusplus
interface IFileDialogCustomize;
#endif /* __cplusplus */
#endif

#ifndef __IFileDialogControlEvents_FWD_DEFINED__
#define __IFileDialogControlEvents_FWD_DEFINED__
typedef interface IFileDialogControlEvents IFileDialogControlEvents;
#ifdef __cplusplus
interface IFileDialogControlEvents;
#endif /* __cplusplus */
#endif

#ifndef __IFileDialog2_FWD_DEFINED__
#define __IFileDialog2_FWD_DEFINED__
typedef interface IFileDialog2 IFileDialog2;
#ifdef __cplusplus
interface IFileDialog2;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationAssociationRegistration_FWD_DEFINED__
#define __IApplicationAssociationRegistration_FWD_DEFINED__
typedef interface IApplicationAssociationRegistration IApplicationAssociationRegistration;
#ifdef __cplusplus
interface IApplicationAssociationRegistration;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationAssociationRegistrationUI_FWD_DEFINED__
#define __IApplicationAssociationRegistrationUI_FWD_DEFINED__
typedef interface IApplicationAssociationRegistrationUI IApplicationAssociationRegistrationUI;
#ifdef __cplusplus
interface IApplicationAssociationRegistrationUI;
#endif /* __cplusplus */
#endif

#ifndef __IDelegateFolder_FWD_DEFINED__
#define __IDelegateFolder_FWD_DEFINED__
typedef interface IDelegateFolder IDelegateFolder;
#ifdef __cplusplus
interface IDelegateFolder;
#endif /* __cplusplus */
#endif

#ifndef __IBrowserFrameOptions_FWD_DEFINED__
#define __IBrowserFrameOptions_FWD_DEFINED__
typedef interface IBrowserFrameOptions IBrowserFrameOptions;
#ifdef __cplusplus
interface IBrowserFrameOptions;
#endif /* __cplusplus */
#endif

#ifndef __INewWindowManager_FWD_DEFINED__
#define __INewWindowManager_FWD_DEFINED__
typedef interface INewWindowManager INewWindowManager;
#ifdef __cplusplus
interface INewWindowManager;
#endif /* __cplusplus */
#endif

#ifndef __IAttachmentExecute_FWD_DEFINED__
#define __IAttachmentExecute_FWD_DEFINED__
typedef interface IAttachmentExecute IAttachmentExecute;
#ifdef __cplusplus
interface IAttachmentExecute;
#endif /* __cplusplus */
#endif

#ifndef __IShellMenuCallback_FWD_DEFINED__
#define __IShellMenuCallback_FWD_DEFINED__
typedef interface IShellMenuCallback IShellMenuCallback;
#ifdef __cplusplus
interface IShellMenuCallback;
#endif /* __cplusplus */
#endif

#ifndef __IShellMenu_FWD_DEFINED__
#define __IShellMenu_FWD_DEFINED__
typedef interface IShellMenu IShellMenu;
#ifdef __cplusplus
interface IShellMenu;
#endif /* __cplusplus */
#endif

#ifndef __IShellRunDll_FWD_DEFINED__
#define __IShellRunDll_FWD_DEFINED__
typedef interface IShellRunDll IShellRunDll;
#ifdef __cplusplus
interface IShellRunDll;
#endif /* __cplusplus */
#endif

#ifndef __IKnownFolder_FWD_DEFINED__
#define __IKnownFolder_FWD_DEFINED__
typedef interface IKnownFolder IKnownFolder;
#ifdef __cplusplus
interface IKnownFolder;
#endif /* __cplusplus */
#endif

#ifndef __IKnownFolderManager_FWD_DEFINED__
#define __IKnownFolderManager_FWD_DEFINED__
typedef interface IKnownFolderManager IKnownFolderManager;
#ifdef __cplusplus
interface IKnownFolderManager;
#endif /* __cplusplus */
#endif

#ifndef __ISharingConfigurationManager_FWD_DEFINED__
#define __ISharingConfigurationManager_FWD_DEFINED__
typedef interface ISharingConfigurationManager ISharingConfigurationManager;
#ifdef __cplusplus
interface ISharingConfigurationManager;
#endif /* __cplusplus */
#endif

#ifndef __IPreviousVersionsInfo_FWD_DEFINED__
#define __IPreviousVersionsInfo_FWD_DEFINED__
typedef interface IPreviousVersionsInfo IPreviousVersionsInfo;
#ifdef __cplusplus
interface IPreviousVersionsInfo;
#endif /* __cplusplus */
#endif

#ifndef __IRelatedItem_FWD_DEFINED__
#define __IRelatedItem_FWD_DEFINED__
typedef interface IRelatedItem IRelatedItem;
#ifdef __cplusplus
interface IRelatedItem;
#endif /* __cplusplus */
#endif

#ifndef __IIdentityName_FWD_DEFINED__
#define __IIdentityName_FWD_DEFINED__
typedef interface IIdentityName IIdentityName;
#ifdef __cplusplus
interface IIdentityName;
#endif /* __cplusplus */
#endif

#ifndef __IDelegateItem_FWD_DEFINED__
#define __IDelegateItem_FWD_DEFINED__
typedef interface IDelegateItem IDelegateItem;
#ifdef __cplusplus
interface IDelegateItem;
#endif /* __cplusplus */
#endif

#ifndef __ICurrentItem_FWD_DEFINED__
#define __ICurrentItem_FWD_DEFINED__
typedef interface ICurrentItem ICurrentItem;
#ifdef __cplusplus
interface ICurrentItem;
#endif /* __cplusplus */
#endif

#ifndef __ITransferMediumItem_FWD_DEFINED__
#define __ITransferMediumItem_FWD_DEFINED__
typedef interface ITransferMediumItem ITransferMediumItem;
#ifdef __cplusplus
interface ITransferMediumItem;
#endif /* __cplusplus */
#endif

#ifndef __IUseToBrowseItem_FWD_DEFINED__
#define __IUseToBrowseItem_FWD_DEFINED__
typedef interface IUseToBrowseItem IUseToBrowseItem;
#ifdef __cplusplus
interface IUseToBrowseItem;
#endif /* __cplusplus */
#endif

#ifndef __IDisplayItem_FWD_DEFINED__
#define __IDisplayItem_FWD_DEFINED__
typedef interface IDisplayItem IDisplayItem;
#ifdef __cplusplus
interface IDisplayItem;
#endif /* __cplusplus */
#endif

#ifndef __IViewStateIdentityItem_FWD_DEFINED__
#define __IViewStateIdentityItem_FWD_DEFINED__
typedef interface IViewStateIdentityItem IViewStateIdentityItem;
#ifdef __cplusplus
interface IViewStateIdentityItem;
#endif /* __cplusplus */
#endif

#ifndef __IPreviewItem_FWD_DEFINED__
#define __IPreviewItem_FWD_DEFINED__
typedef interface IPreviewItem IPreviewItem;
#ifdef __cplusplus
interface IPreviewItem;
#endif /* __cplusplus */
#endif

#ifndef __IDestinationStreamFactory_FWD_DEFINED__
#define __IDestinationStreamFactory_FWD_DEFINED__
typedef interface IDestinationStreamFactory IDestinationStreamFactory;
#ifdef __cplusplus
interface IDestinationStreamFactory;
#endif /* __cplusplus */
#endif

#ifndef __INewMenuClient_FWD_DEFINED__
#define __INewMenuClient_FWD_DEFINED__
typedef interface INewMenuClient INewMenuClient;
#ifdef __cplusplus
interface INewMenuClient;
#endif /* __cplusplus */
#endif

#ifndef __IInitializeWithBindCtx_FWD_DEFINED__
#define __IInitializeWithBindCtx_FWD_DEFINED__
typedef interface IInitializeWithBindCtx IInitializeWithBindCtx;
#ifdef __cplusplus
interface IInitializeWithBindCtx;
#endif /* __cplusplus */
#endif

#ifndef __IShellItemFilter_FWD_DEFINED__
#define __IShellItemFilter_FWD_DEFINED__
typedef interface IShellItemFilter IShellItemFilter;
#ifdef __cplusplus
interface IShellItemFilter;
#endif /* __cplusplus */
#endif

#ifndef __INameSpaceTreeControl_FWD_DEFINED__
#define __INameSpaceTreeControl_FWD_DEFINED__
typedef interface INameSpaceTreeControl INameSpaceTreeControl;
#ifdef __cplusplus
interface INameSpaceTreeControl;
#endif /* __cplusplus */
#endif

#ifndef __INameSpaceTreeControl2_FWD_DEFINED__
#define __INameSpaceTreeControl2_FWD_DEFINED__
typedef interface INameSpaceTreeControl2 INameSpaceTreeControl2;
#ifdef __cplusplus
interface INameSpaceTreeControl2;
#endif /* __cplusplus */
#endif

#ifndef __INameSpaceTreeControlEvents_FWD_DEFINED__
#define __INameSpaceTreeControlEvents_FWD_DEFINED__
typedef interface INameSpaceTreeControlEvents INameSpaceTreeControlEvents;
#ifdef __cplusplus
interface INameSpaceTreeControlEvents;
#endif /* __cplusplus */
#endif

#ifndef __INameSpaceTreeControlDropHandler_FWD_DEFINED__
#define __INameSpaceTreeControlDropHandler_FWD_DEFINED__
typedef interface INameSpaceTreeControlDropHandler INameSpaceTreeControlDropHandler;
#ifdef __cplusplus
interface INameSpaceTreeControlDropHandler;
#endif /* __cplusplus */
#endif

#ifndef __INameSpaceTreeAccessible_FWD_DEFINED__
#define __INameSpaceTreeAccessible_FWD_DEFINED__
typedef interface INameSpaceTreeAccessible INameSpaceTreeAccessible;
#ifdef __cplusplus
interface INameSpaceTreeAccessible;
#endif /* __cplusplus */
#endif

#ifndef __INameSpaceTreeControlCustomDraw_FWD_DEFINED__
#define __INameSpaceTreeControlCustomDraw_FWD_DEFINED__
typedef interface INameSpaceTreeControlCustomDraw INameSpaceTreeControlCustomDraw;
#ifdef __cplusplus
interface INameSpaceTreeControlCustomDraw;
#endif /* __cplusplus */
#endif

#ifndef __INameSpaceTreeControlFolderCapabilities_FWD_DEFINED__
#define __INameSpaceTreeControlFolderCapabilities_FWD_DEFINED__
typedef interface INameSpaceTreeControlFolderCapabilities INameSpaceTreeControlFolderCapabilities;
#ifdef __cplusplus
interface INameSpaceTreeControlFolderCapabilities;
#endif /* __cplusplus */
#endif

#ifndef __IPreviewHandler_FWD_DEFINED__
#define __IPreviewHandler_FWD_DEFINED__
typedef interface IPreviewHandler IPreviewHandler;
#ifdef __cplusplus
interface IPreviewHandler;
#endif /* __cplusplus */
#endif

#ifndef __IPreviewHandlerFrame_FWD_DEFINED__
#define __IPreviewHandlerFrame_FWD_DEFINED__
typedef interface IPreviewHandlerFrame IPreviewHandlerFrame;
#ifdef __cplusplus
interface IPreviewHandlerFrame;
#endif /* __cplusplus */
#endif

#ifndef __ITrayDeskBand_FWD_DEFINED__
#define __ITrayDeskBand_FWD_DEFINED__
typedef interface ITrayDeskBand ITrayDeskBand;
#ifdef __cplusplus
interface ITrayDeskBand;
#endif /* __cplusplus */
#endif

#ifndef __IBandHost_FWD_DEFINED__
#define __IBandHost_FWD_DEFINED__
typedef interface IBandHost IBandHost;
#ifdef __cplusplus
interface IBandHost;
#endif /* __cplusplus */
#endif

#ifndef __IExplorerPaneVisibility_FWD_DEFINED__
#define __IExplorerPaneVisibility_FWD_DEFINED__
typedef interface IExplorerPaneVisibility IExplorerPaneVisibility;
#ifdef __cplusplus
interface IExplorerPaneVisibility;
#endif /* __cplusplus */
#endif

#ifndef __IContextMenuCB_FWD_DEFINED__
#define __IContextMenuCB_FWD_DEFINED__
typedef interface IContextMenuCB IContextMenuCB;
#ifdef __cplusplus
interface IContextMenuCB;
#endif /* __cplusplus */
#endif

#ifndef __IDefaultExtractIconInit_FWD_DEFINED__
#define __IDefaultExtractIconInit_FWD_DEFINED__
typedef interface IDefaultExtractIconInit IDefaultExtractIconInit;
#ifdef __cplusplus
interface IDefaultExtractIconInit;
#endif /* __cplusplus */
#endif

#ifndef __IExplorerCommand_FWD_DEFINED__
#define __IExplorerCommand_FWD_DEFINED__
typedef interface IExplorerCommand IExplorerCommand;
#ifdef __cplusplus
interface IExplorerCommand;
#endif /* __cplusplus */
#endif

#ifndef __IExplorerCommandState_FWD_DEFINED__
#define __IExplorerCommandState_FWD_DEFINED__
typedef interface IExplorerCommandState IExplorerCommandState;
#ifdef __cplusplus
interface IExplorerCommandState;
#endif /* __cplusplus */
#endif

#ifndef __IInitializeCommand_FWD_DEFINED__
#define __IInitializeCommand_FWD_DEFINED__
typedef interface IInitializeCommand IInitializeCommand;
#ifdef __cplusplus
interface IInitializeCommand;
#endif /* __cplusplus */
#endif

#ifndef __IEnumExplorerCommand_FWD_DEFINED__
#define __IEnumExplorerCommand_FWD_DEFINED__
typedef interface IEnumExplorerCommand IEnumExplorerCommand;
#ifdef __cplusplus
interface IEnumExplorerCommand;
#endif /* __cplusplus */
#endif

#ifndef __IExplorerCommandProvider_FWD_DEFINED__
#define __IExplorerCommandProvider_FWD_DEFINED__
typedef interface IExplorerCommandProvider IExplorerCommandProvider;
#ifdef __cplusplus
interface IExplorerCommandProvider;
#endif /* __cplusplus */
#endif

#ifndef __IInitializeNetworkFolder_FWD_DEFINED__
#define __IInitializeNetworkFolder_FWD_DEFINED__
typedef interface IInitializeNetworkFolder IInitializeNetworkFolder;
#ifdef __cplusplus
interface IInitializeNetworkFolder;
#endif /* __cplusplus */
#endif

#ifndef __IOpenControlPanel_FWD_DEFINED__
#define __IOpenControlPanel_FWD_DEFINED__
typedef interface IOpenControlPanel IOpenControlPanel;
#ifdef __cplusplus
interface IOpenControlPanel;
#endif /* __cplusplus */
#endif

#ifndef __IComputerInfoChangeNotify_FWD_DEFINED__
#define __IComputerInfoChangeNotify_FWD_DEFINED__
typedef interface IComputerInfoChangeNotify IComputerInfoChangeNotify;
#ifdef __cplusplus
interface IComputerInfoChangeNotify;
#endif /* __cplusplus */
#endif

#ifndef __IFileSystemBindData_FWD_DEFINED__
#define __IFileSystemBindData_FWD_DEFINED__
typedef interface IFileSystemBindData IFileSystemBindData;
#ifdef __cplusplus
interface IFileSystemBindData;
#endif /* __cplusplus */
#endif

#ifndef __IFileSystemBindData2_FWD_DEFINED__
#define __IFileSystemBindData2_FWD_DEFINED__
typedef interface IFileSystemBindData2 IFileSystemBindData2;
#ifdef __cplusplus
interface IFileSystemBindData2;
#endif /* __cplusplus */
#endif

#ifndef __ICustomDestinationList_FWD_DEFINED__
#define __ICustomDestinationList_FWD_DEFINED__
typedef interface ICustomDestinationList ICustomDestinationList;
#ifdef __cplusplus
interface ICustomDestinationList;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationDestinations_FWD_DEFINED__
#define __IApplicationDestinations_FWD_DEFINED__
typedef interface IApplicationDestinations IApplicationDestinations;
#ifdef __cplusplus
interface IApplicationDestinations;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationDocumentLists_FWD_DEFINED__
#define __IApplicationDocumentLists_FWD_DEFINED__
typedef interface IApplicationDocumentLists IApplicationDocumentLists;
#ifdef __cplusplus
interface IApplicationDocumentLists;
#endif /* __cplusplus */
#endif

#ifndef __IObjectWithAppUserModelID_FWD_DEFINED__
#define __IObjectWithAppUserModelID_FWD_DEFINED__
typedef interface IObjectWithAppUserModelID IObjectWithAppUserModelID;
#ifdef __cplusplus
interface IObjectWithAppUserModelID;
#endif /* __cplusplus */
#endif

#ifndef __IObjectWithProgID_FWD_DEFINED__
#define __IObjectWithProgID_FWD_DEFINED__
typedef interface IObjectWithProgID IObjectWithProgID;
#ifdef __cplusplus
interface IObjectWithProgID;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateIDList_FWD_DEFINED__
#define __IUpdateIDList_FWD_DEFINED__
typedef interface IUpdateIDList IUpdateIDList;
#ifdef __cplusplus
interface IUpdateIDList;
#endif /* __cplusplus */
#endif

#ifndef __IDesktopGadget_FWD_DEFINED__
#define __IDesktopGadget_FWD_DEFINED__
typedef interface IDesktopGadget IDesktopGadget;
#ifdef __cplusplus
interface IDesktopGadget;
#endif /* __cplusplus */
#endif

#ifndef __IDesktopWallpaper_FWD_DEFINED__
#define __IDesktopWallpaper_FWD_DEFINED__
typedef interface IDesktopWallpaper IDesktopWallpaper;
#ifdef __cplusplus
interface IDesktopWallpaper;
#endif /* __cplusplus */
#endif

#ifndef __IHomeGroup_FWD_DEFINED__
#define __IHomeGroup_FWD_DEFINED__
typedef interface IHomeGroup IHomeGroup;
#ifdef __cplusplus
interface IHomeGroup;
#endif /* __cplusplus */
#endif

#ifndef __IInitializeWithPropertyStore_FWD_DEFINED__
#define __IInitializeWithPropertyStore_FWD_DEFINED__
typedef interface IInitializeWithPropertyStore IInitializeWithPropertyStore;
#ifdef __cplusplus
interface IInitializeWithPropertyStore;
#endif /* __cplusplus */
#endif

#ifndef __IOpenSearchSource_FWD_DEFINED__
#define __IOpenSearchSource_FWD_DEFINED__
typedef interface IOpenSearchSource IOpenSearchSource;
#ifdef __cplusplus
interface IOpenSearchSource;
#endif /* __cplusplus */
#endif

#ifndef __IShellLibrary_FWD_DEFINED__
#define __IShellLibrary_FWD_DEFINED__
typedef interface IShellLibrary IShellLibrary;
#ifdef __cplusplus
interface IShellLibrary;
#endif /* __cplusplus */
#endif

#ifndef __IPlaybackManagerEvents_FWD_DEFINED__
#define __IPlaybackManagerEvents_FWD_DEFINED__
typedef interface IPlaybackManagerEvents IPlaybackManagerEvents;
#ifdef __cplusplus
interface IPlaybackManagerEvents;
#endif /* __cplusplus */
#endif

#ifndef __IPlaybackManager_FWD_DEFINED__
#define __IPlaybackManager_FWD_DEFINED__
typedef interface IPlaybackManager IPlaybackManager;
#ifdef __cplusplus
interface IPlaybackManager;
#endif /* __cplusplus */
#endif

#ifndef __IDefaultFolderMenuInitialize_FWD_DEFINED__
#define __IDefaultFolderMenuInitialize_FWD_DEFINED__
typedef interface IDefaultFolderMenuInitialize IDefaultFolderMenuInitialize;
#ifdef __cplusplus
interface IDefaultFolderMenuInitialize;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationActivationManager_FWD_DEFINED__
#define __IApplicationActivationManager_FWD_DEFINED__
typedef interface IApplicationActivationManager IApplicationActivationManager;
#ifdef __cplusplus
interface IApplicationActivationManager;
#endif /* __cplusplus */
#endif

#ifndef __DesktopWallpaper_FWD_DEFINED__
#define __DesktopWallpaper_FWD_DEFINED__
#ifdef __cplusplus
typedef class DesktopWallpaper DesktopWallpaper;
#else
typedef struct DesktopWallpaper DesktopWallpaper;
#endif /* defined __cplusplus */
#endif /* defined __DesktopWallpaper_FWD_DEFINED__ */

#ifndef __ShellDesktop_FWD_DEFINED__
#define __ShellDesktop_FWD_DEFINED__
#ifdef __cplusplus
typedef class ShellDesktop ShellDesktop;
#else
typedef struct ShellDesktop ShellDesktop;
#endif /* defined __cplusplus */
#endif /* defined __ShellDesktop_FWD_DEFINED__ */

#ifndef __ShellFSFolder_FWD_DEFINED__
#define __ShellFSFolder_FWD_DEFINED__
#ifdef __cplusplus
typedef class ShellFSFolder ShellFSFolder;
#else
typedef struct ShellFSFolder ShellFSFolder;
#endif /* defined __cplusplus */
#endif /* defined __ShellFSFolder_FWD_DEFINED__ */

#ifndef __NetworkPlaces_FWD_DEFINED__
#define __NetworkPlaces_FWD_DEFINED__
#ifdef __cplusplus
typedef class NetworkPlaces NetworkPlaces;
#else
typedef struct NetworkPlaces NetworkPlaces;
#endif /* defined __cplusplus */
#endif /* defined __NetworkPlaces_FWD_DEFINED__ */

#ifndef __ShellLink_FWD_DEFINED__
#define __ShellLink_FWD_DEFINED__
#ifdef __cplusplus
typedef class ShellLink ShellLink;
#else
typedef struct ShellLink ShellLink;
#endif /* defined __cplusplus */
#endif /* defined __ShellLink_FWD_DEFINED__ */

#ifndef __QueryCancelAutoPlay_FWD_DEFINED__
#define __QueryCancelAutoPlay_FWD_DEFINED__
#ifdef __cplusplus
typedef class QueryCancelAutoPlay QueryCancelAutoPlay;
#else
typedef struct QueryCancelAutoPlay QueryCancelAutoPlay;
#endif /* defined __cplusplus */
#endif /* defined __QueryCancelAutoPlay_FWD_DEFINED__ */

#ifndef __DriveSizeCategorizer_FWD_DEFINED__
#define __DriveSizeCategorizer_FWD_DEFINED__
#ifdef __cplusplus
typedef class DriveSizeCategorizer DriveSizeCategorizer;
#else
typedef struct DriveSizeCategorizer DriveSizeCategorizer;
#endif /* defined __cplusplus */
#endif /* defined __DriveSizeCategorizer_FWD_DEFINED__ */

#ifndef __DriveTypeCategorizer_FWD_DEFINED__
#define __DriveTypeCategorizer_FWD_DEFINED__
#ifdef __cplusplus
typedef class DriveTypeCategorizer DriveTypeCategorizer;
#else
typedef struct DriveTypeCategorizer DriveTypeCategorizer;
#endif /* defined __cplusplus */
#endif /* defined __DriveTypeCategorizer_FWD_DEFINED__ */

#ifndef __FreeSpaceCategorizer_FWD_DEFINED__
#define __FreeSpaceCategorizer_FWD_DEFINED__
#ifdef __cplusplus
typedef class FreeSpaceCategorizer FreeSpaceCategorizer;
#else
typedef struct FreeSpaceCategorizer FreeSpaceCategorizer;
#endif /* defined __cplusplus */
#endif /* defined __FreeSpaceCategorizer_FWD_DEFINED__ */

#ifndef __TimeCategorizer_FWD_DEFINED__
#define __TimeCategorizer_FWD_DEFINED__
#ifdef __cplusplus
typedef class TimeCategorizer TimeCategorizer;
#else
typedef struct TimeCategorizer TimeCategorizer;
#endif /* defined __cplusplus */
#endif /* defined __TimeCategorizer_FWD_DEFINED__ */

#ifndef __SizeCategorizer_FWD_DEFINED__
#define __SizeCategorizer_FWD_DEFINED__
#ifdef __cplusplus
typedef class SizeCategorizer SizeCategorizer;
#else
typedef struct SizeCategorizer SizeCategorizer;
#endif /* defined __cplusplus */
#endif /* defined __SizeCategorizer_FWD_DEFINED__ */

#ifndef __AlphabeticalCategorizer_FWD_DEFINED__
#define __AlphabeticalCategorizer_FWD_DEFINED__
#ifdef __cplusplus
typedef class AlphabeticalCategorizer AlphabeticalCategorizer;
#else
typedef struct AlphabeticalCategorizer AlphabeticalCategorizer;
#endif /* defined __cplusplus */
#endif /* defined __AlphabeticalCategorizer_FWD_DEFINED__ */

#ifndef __MergedCategorizer_FWD_DEFINED__
#define __MergedCategorizer_FWD_DEFINED__
#ifdef __cplusplus
typedef class MergedCategorizer MergedCategorizer;
#else
typedef struct MergedCategorizer MergedCategorizer;
#endif /* defined __cplusplus */
#endif /* defined __MergedCategorizer_FWD_DEFINED__ */

#ifndef __ImageProperties_FWD_DEFINED__
#define __ImageProperties_FWD_DEFINED__
#ifdef __cplusplus
typedef class ImageProperties ImageProperties;
#else
typedef struct ImageProperties ImageProperties;
#endif /* defined __cplusplus */
#endif /* defined __ImageProperties_FWD_DEFINED__ */

#ifndef __PropertiesUI_FWD_DEFINED__
#define __PropertiesUI_FWD_DEFINED__
#ifdef __cplusplus
typedef class PropertiesUI PropertiesUI;
#else
typedef struct PropertiesUI PropertiesUI;
#endif /* defined __cplusplus */
#endif /* defined __PropertiesUI_FWD_DEFINED__ */

#ifndef __UserNotification_FWD_DEFINED__
#define __UserNotification_FWD_DEFINED__
#ifdef __cplusplus
typedef class UserNotification UserNotification;
#else
typedef struct UserNotification UserNotification;
#endif /* defined __cplusplus */
#endif /* defined __UserNotification_FWD_DEFINED__ */

#ifndef __CDBurn_FWD_DEFINED__
#define __CDBurn_FWD_DEFINED__
#ifdef __cplusplus
typedef class CDBurn CDBurn;
#else
typedef struct CDBurn CDBurn;
#endif /* defined __cplusplus */
#endif /* defined __CDBurn_FWD_DEFINED__ */

#ifndef __TaskbarList_FWD_DEFINED__
#define __TaskbarList_FWD_DEFINED__
#ifdef __cplusplus
typedef class TaskbarList TaskbarList;
#else
typedef struct TaskbarList TaskbarList;
#endif /* defined __cplusplus */
#endif /* defined __TaskbarList_FWD_DEFINED__ */

#ifndef __StartMenuPin_FWD_DEFINED__
#define __StartMenuPin_FWD_DEFINED__
#ifdef __cplusplus
typedef class StartMenuPin StartMenuPin;
#else
typedef struct StartMenuPin StartMenuPin;
#endif /* defined __cplusplus */
#endif /* defined __StartMenuPin_FWD_DEFINED__ */

#ifndef __WebWizardHost_FWD_DEFINED__
#define __WebWizardHost_FWD_DEFINED__
#ifdef __cplusplus
typedef class WebWizardHost WebWizardHost;
#else
typedef struct WebWizardHost WebWizardHost;
#endif /* defined __cplusplus */
#endif /* defined __WebWizardHost_FWD_DEFINED__ */

#ifndef __PublishDropTarget_FWD_DEFINED__
#define __PublishDropTarget_FWD_DEFINED__
#ifdef __cplusplus
typedef class PublishDropTarget PublishDropTarget;
#else
typedef struct PublishDropTarget PublishDropTarget;
#endif /* defined __cplusplus */
#endif /* defined __PublishDropTarget_FWD_DEFINED__ */

#ifndef __PublishingWizard_FWD_DEFINED__
#define __PublishingWizard_FWD_DEFINED__
#ifdef __cplusplus
typedef class PublishingWizard PublishingWizard;
#else
typedef struct PublishingWizard PublishingWizard;
#endif /* defined __cplusplus */
#endif /* defined __PublishingWizard_FWD_DEFINED__ */

#ifndef __InternetPrintOrdering_FWD_DEFINED__
#define __InternetPrintOrdering_FWD_DEFINED__
#ifdef __cplusplus
typedef class InternetPrintOrdering InternetPrintOrdering;
#else
typedef struct InternetPrintOrdering InternetPrintOrdering;
#endif /* defined __cplusplus */
#endif /* defined __InternetPrintOrdering_FWD_DEFINED__ */

#ifndef __FolderViewHost_FWD_DEFINED__
#define __FolderViewHost_FWD_DEFINED__
#ifdef __cplusplus
typedef class FolderViewHost FolderViewHost;
#else
typedef struct FolderViewHost FolderViewHost;
#endif /* defined __cplusplus */
#endif /* defined __FolderViewHost_FWD_DEFINED__ */

#ifndef __ExplorerBrowser_FWD_DEFINED__
#define __ExplorerBrowser_FWD_DEFINED__
#ifdef __cplusplus
typedef class ExplorerBrowser ExplorerBrowser;
#else
typedef struct ExplorerBrowser ExplorerBrowser;
#endif /* defined __cplusplus */
#endif /* defined __ExplorerBrowser_FWD_DEFINED__ */

#ifndef __ImageRecompress_FWD_DEFINED__
#define __ImageRecompress_FWD_DEFINED__
#ifdef __cplusplus
typedef class ImageRecompress ImageRecompress;
#else
typedef struct ImageRecompress ImageRecompress;
#endif /* defined __cplusplus */
#endif /* defined __ImageRecompress_FWD_DEFINED__ */

#ifndef __TrayBandSiteService_FWD_DEFINED__
#define __TrayBandSiteService_FWD_DEFINED__
#ifdef __cplusplus
typedef class TrayBandSiteService TrayBandSiteService;
#else
typedef struct TrayBandSiteService TrayBandSiteService;
#endif /* defined __cplusplus */
#endif /* defined __TrayBandSiteService_FWD_DEFINED__ */

#ifndef __TrayDeskBand_FWD_DEFINED__
#define __TrayDeskBand_FWD_DEFINED__
#ifdef __cplusplus
typedef class TrayDeskBand TrayDeskBand;
#else
typedef struct TrayDeskBand TrayDeskBand;
#endif /* defined __cplusplus */
#endif /* defined __TrayDeskBand_FWD_DEFINED__ */

#ifndef __AttachmentServices_FWD_DEFINED__
#define __AttachmentServices_FWD_DEFINED__
#ifdef __cplusplus
typedef class AttachmentServices AttachmentServices;
#else
typedef struct AttachmentServices AttachmentServices;
#endif /* defined __cplusplus */
#endif /* defined __AttachmentServices_FWD_DEFINED__ */

#ifndef __DocPropShellExtension_FWD_DEFINED__
#define __DocPropShellExtension_FWD_DEFINED__
#ifdef __cplusplus
typedef class DocPropShellExtension DocPropShellExtension;
#else
typedef struct DocPropShellExtension DocPropShellExtension;
#endif /* defined __cplusplus */
#endif /* defined __DocPropShellExtension_FWD_DEFINED__ */

#ifndef __ShellItem_FWD_DEFINED__
#define __ShellItem_FWD_DEFINED__
#ifdef __cplusplus
typedef class ShellItem ShellItem;
#else
typedef struct ShellItem ShellItem;
#endif /* defined __cplusplus */
#endif /* defined __ShellItem_FWD_DEFINED__ */

#ifndef __NamespaceWalker_FWD_DEFINED__
#define __NamespaceWalker_FWD_DEFINED__
#ifdef __cplusplus
typedef class NamespaceWalker NamespaceWalker;
#else
typedef struct NamespaceWalker NamespaceWalker;
#endif /* defined __cplusplus */
#endif /* defined __NamespaceWalker_FWD_DEFINED__ */

#ifndef __FileOperation_FWD_DEFINED__
#define __FileOperation_FWD_DEFINED__
#ifdef __cplusplus
typedef class FileOperation FileOperation;
#else
typedef struct FileOperation FileOperation;
#endif /* defined __cplusplus */
#endif /* defined __FileOperation_FWD_DEFINED__ */

#ifndef __FileOpenDialog_FWD_DEFINED__
#define __FileOpenDialog_FWD_DEFINED__
#ifdef __cplusplus
typedef class FileOpenDialog FileOpenDialog;
#else
typedef struct FileOpenDialog FileOpenDialog;
#endif /* defined __cplusplus */
#endif /* defined __FileOpenDialog_FWD_DEFINED__ */

#ifndef __FileSaveDialog_FWD_DEFINED__
#define __FileSaveDialog_FWD_DEFINED__
#ifdef __cplusplus
typedef class FileSaveDialog FileSaveDialog;
#else
typedef struct FileSaveDialog FileSaveDialog;
#endif /* defined __cplusplus */
#endif /* defined __FileSaveDialog_FWD_DEFINED__ */

#ifndef __KnownFolderManager_FWD_DEFINED__
#define __KnownFolderManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class KnownFolderManager KnownFolderManager;
#else
typedef struct KnownFolderManager KnownFolderManager;
#endif /* defined __cplusplus */
#endif /* defined __KnownFolderManager_FWD_DEFINED__ */

#ifndef __FSCopyHandler_FWD_DEFINED__
#define __FSCopyHandler_FWD_DEFINED__
#ifdef __cplusplus
typedef class FSCopyHandler FSCopyHandler;
#else
typedef struct FSCopyHandler FSCopyHandler;
#endif /* defined __cplusplus */
#endif /* defined __FSCopyHandler_FWD_DEFINED__ */

#ifndef __SharingConfigurationManager_FWD_DEFINED__
#define __SharingConfigurationManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class SharingConfigurationManager SharingConfigurationManager;
#else
typedef struct SharingConfigurationManager SharingConfigurationManager;
#endif /* defined __cplusplus */
#endif /* defined __SharingConfigurationManager_FWD_DEFINED__ */

#ifndef __PreviousVersions_FWD_DEFINED__
#define __PreviousVersions_FWD_DEFINED__
#ifdef __cplusplus
typedef class PreviousVersions PreviousVersions;
#else
typedef struct PreviousVersions PreviousVersions;
#endif /* defined __cplusplus */
#endif /* defined __PreviousVersions_FWD_DEFINED__ */

#ifndef __NetworkConnections_FWD_DEFINED__
#define __NetworkConnections_FWD_DEFINED__
#ifdef __cplusplus
typedef class NetworkConnections NetworkConnections;
#else
typedef struct NetworkConnections NetworkConnections;
#endif /* defined __cplusplus */
#endif /* defined __NetworkConnections_FWD_DEFINED__ */

#ifndef __NamespaceTreeControl_FWD_DEFINED__
#define __NamespaceTreeControl_FWD_DEFINED__
#ifdef __cplusplus
typedef class NamespaceTreeControl NamespaceTreeControl;
#else
typedef struct NamespaceTreeControl NamespaceTreeControl;
#endif /* defined __cplusplus */
#endif /* defined __NamespaceTreeControl_FWD_DEFINED__ */

#ifndef __IENamespaceTreeControl_FWD_DEFINED__
#define __IENamespaceTreeControl_FWD_DEFINED__
#ifdef __cplusplus
typedef class IENamespaceTreeControl IENamespaceTreeControl;
#else
typedef struct IENamespaceTreeControl IENamespaceTreeControl;
#endif /* defined __cplusplus */
#endif /* defined __IENamespaceTreeControl_FWD_DEFINED__ */

#ifndef __ScheduledTasks_FWD_DEFINED__
#define __ScheduledTasks_FWD_DEFINED__
#ifdef __cplusplus
typedef class ScheduledTasks ScheduledTasks;
#else
typedef struct ScheduledTasks ScheduledTasks;
#endif /* defined __cplusplus */
#endif /* defined __ScheduledTasks_FWD_DEFINED__ */

#ifndef __ApplicationAssociationRegistration_FWD_DEFINED__
#define __ApplicationAssociationRegistration_FWD_DEFINED__
#ifdef __cplusplus
typedef class ApplicationAssociationRegistration ApplicationAssociationRegistration;
#else
typedef struct ApplicationAssociationRegistration ApplicationAssociationRegistration;
#endif /* defined __cplusplus */
#endif /* defined __ApplicationAssociationRegistration_FWD_DEFINED__ */

#ifndef __ApplicationAssociationRegistrationUI_FWD_DEFINED__
#define __ApplicationAssociationRegistrationUI_FWD_DEFINED__
#ifdef __cplusplus
typedef class ApplicationAssociationRegistrationUI ApplicationAssociationRegistrationUI;
#else
typedef struct ApplicationAssociationRegistrationUI ApplicationAssociationRegistrationUI;
#endif /* defined __cplusplus */
#endif /* defined __ApplicationAssociationRegistrationUI_FWD_DEFINED__ */

#ifndef __SearchFolderItemFactory_FWD_DEFINED__
#define __SearchFolderItemFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class SearchFolderItemFactory SearchFolderItemFactory;
#else
typedef struct SearchFolderItemFactory SearchFolderItemFactory;
#endif /* defined __cplusplus */
#endif /* defined __SearchFolderItemFactory_FWD_DEFINED__ */

#ifndef __OpenControlPanel_FWD_DEFINED__
#define __OpenControlPanel_FWD_DEFINED__
#ifdef __cplusplus
typedef class OpenControlPanel OpenControlPanel;
#else
typedef struct OpenControlPanel OpenControlPanel;
#endif /* defined __cplusplus */
#endif /* defined __OpenControlPanel_FWD_DEFINED__ */

#ifndef __MailRecipient_FWD_DEFINED__
#define __MailRecipient_FWD_DEFINED__
#ifdef __cplusplus
typedef class MailRecipient MailRecipient;
#else
typedef struct MailRecipient MailRecipient;
#endif /* defined __cplusplus */
#endif /* defined __MailRecipient_FWD_DEFINED__ */

#ifndef __NetworkExplorerFolder_FWD_DEFINED__
#define __NetworkExplorerFolder_FWD_DEFINED__
#ifdef __cplusplus
typedef class NetworkExplorerFolder NetworkExplorerFolder;
#else
typedef struct NetworkExplorerFolder NetworkExplorerFolder;
#endif /* defined __cplusplus */
#endif /* defined __NetworkExplorerFolder_FWD_DEFINED__ */

#ifndef __DestinationList_FWD_DEFINED__
#define __DestinationList_FWD_DEFINED__
#ifdef __cplusplus
typedef class DestinationList DestinationList;
#else
typedef struct DestinationList DestinationList;
#endif /* defined __cplusplus */
#endif /* defined __DestinationList_FWD_DEFINED__ */

#ifndef __ApplicationDestinations_FWD_DEFINED__
#define __ApplicationDestinations_FWD_DEFINED__
#ifdef __cplusplus
typedef class ApplicationDestinations ApplicationDestinations;
#else
typedef struct ApplicationDestinations ApplicationDestinations;
#endif /* defined __cplusplus */
#endif /* defined __ApplicationDestinations_FWD_DEFINED__ */

#ifndef __ApplicationDocumentLists_FWD_DEFINED__
#define __ApplicationDocumentLists_FWD_DEFINED__
#ifdef __cplusplus
typedef class ApplicationDocumentLists ApplicationDocumentLists;
#else
typedef struct ApplicationDocumentLists ApplicationDocumentLists;
#endif /* defined __cplusplus */
#endif /* defined __ApplicationDocumentLists_FWD_DEFINED__ */

#ifndef __HomeGroup_FWD_DEFINED__
#define __HomeGroup_FWD_DEFINED__
#ifdef __cplusplus
typedef class HomeGroup HomeGroup;
#else
typedef struct HomeGroup HomeGroup;
#endif /* defined __cplusplus */
#endif /* defined __HomeGroup_FWD_DEFINED__ */

#ifndef __ShellLibrary_FWD_DEFINED__
#define __ShellLibrary_FWD_DEFINED__
#ifdef __cplusplus
typedef class ShellLibrary ShellLibrary;
#else
typedef struct ShellLibrary ShellLibrary;
#endif /* defined __cplusplus */
#endif /* defined __ShellLibrary_FWD_DEFINED__ */

#ifndef __AppStartupLink_FWD_DEFINED__
#define __AppStartupLink_FWD_DEFINED__
#ifdef __cplusplus
typedef class AppStartupLink AppStartupLink;
#else
typedef struct AppStartupLink AppStartupLink;
#endif /* defined __cplusplus */
#endif /* defined __AppStartupLink_FWD_DEFINED__ */

#ifndef __EnumerableObjectCollection_FWD_DEFINED__
#define __EnumerableObjectCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class EnumerableObjectCollection EnumerableObjectCollection;
#else
typedef struct EnumerableObjectCollection EnumerableObjectCollection;
#endif /* defined __cplusplus */
#endif /* defined __EnumerableObjectCollection_FWD_DEFINED__ */

#ifndef __DesktopGadget_FWD_DEFINED__
#define __DesktopGadget_FWD_DEFINED__
#ifdef __cplusplus
typedef class DesktopGadget DesktopGadget;
#else
typedef struct DesktopGadget DesktopGadget;
#endif /* defined __cplusplus */
#endif /* defined __DesktopGadget_FWD_DEFINED__ */

#ifndef __PlaybackManager_FWD_DEFINED__
#define __PlaybackManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class PlaybackManager PlaybackManager;
#else
typedef struct PlaybackManager PlaybackManager;
#endif /* defined __cplusplus */
#endif /* defined __PlaybackManager_FWD_DEFINED__ */

#ifndef __AccessibilityDockingService_FWD_DEFINED__
#define __AccessibilityDockingService_FWD_DEFINED__
#ifdef __cplusplus
typedef class AccessibilityDockingService AccessibilityDockingService;
#else
typedef struct AccessibilityDockingService AccessibilityDockingService;
#endif /* defined __cplusplus */
#endif /* defined __AccessibilityDockingService_FWD_DEFINED__ */

#ifndef __FrameworkInputPane_FWD_DEFINED__
#define __FrameworkInputPane_FWD_DEFINED__
#ifdef __cplusplus
typedef class FrameworkInputPane FrameworkInputPane;
#else
typedef struct FrameworkInputPane FrameworkInputPane;
#endif /* defined __cplusplus */
#endif /* defined __FrameworkInputPane_FWD_DEFINED__ */

#ifndef __DefFolderMenu_FWD_DEFINED__
#define __DefFolderMenu_FWD_DEFINED__
#ifdef __cplusplus
typedef class DefFolderMenu DefFolderMenu;
#else
typedef struct DefFolderMenu DefFolderMenu;
#endif /* defined __cplusplus */
#endif /* defined __DefFolderMenu_FWD_DEFINED__ */

#ifndef __AppVisibility_FWD_DEFINED__
#define __AppVisibility_FWD_DEFINED__
#ifdef __cplusplus
typedef class AppVisibility AppVisibility;
#else
typedef struct AppVisibility AppVisibility;
#endif /* defined __cplusplus */
#endif /* defined __AppVisibility_FWD_DEFINED__ */

#ifndef __AppShellVerbHandler_FWD_DEFINED__
#define __AppShellVerbHandler_FWD_DEFINED__
#ifdef __cplusplus
typedef class AppShellVerbHandler AppShellVerbHandler;
#else
typedef struct AppShellVerbHandler AppShellVerbHandler;
#endif /* defined __cplusplus */
#endif /* defined __AppShellVerbHandler_FWD_DEFINED__ */

#ifndef __ExecuteUnknown_FWD_DEFINED__
#define __ExecuteUnknown_FWD_DEFINED__
#ifdef __cplusplus
typedef class ExecuteUnknown ExecuteUnknown;
#else
typedef struct ExecuteUnknown ExecuteUnknown;
#endif /* defined __cplusplus */
#endif /* defined __ExecuteUnknown_FWD_DEFINED__ */

#ifndef __PackageDebugSettings_FWD_DEFINED__
#define __PackageDebugSettings_FWD_DEFINED__
#ifdef __cplusplus
typedef class PackageDebugSettings PackageDebugSettings;
#else
typedef struct PackageDebugSettings PackageDebugSettings;
#endif /* defined __cplusplus */
#endif /* defined __PackageDebugSettings_FWD_DEFINED__ */

#ifndef __ApplicationActivationManager_FWD_DEFINED__
#define __ApplicationActivationManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class ApplicationActivationManager ApplicationActivationManager;
#else
typedef struct ApplicationActivationManager ApplicationActivationManager;
#endif /* defined __cplusplus */
#endif /* defined __ApplicationActivationManager_FWD_DEFINED__ */

#ifndef __ApplicationDesignModeSettings_FWD_DEFINED__
#define __ApplicationDesignModeSettings_FWD_DEFINED__
#ifdef __cplusplus
typedef class ApplicationDesignModeSettings ApplicationDesignModeSettings;
#else
typedef struct ApplicationDesignModeSettings ApplicationDesignModeSettings;
#endif /* defined __cplusplus */
#endif /* defined __ApplicationDesignModeSettings_FWD_DEFINED__ */

#ifndef __ExecuteFolder_FWD_DEFINED__
#define __ExecuteFolder_FWD_DEFINED__
#ifdef __cplusplus
typedef class ExecuteFolder ExecuteFolder;
#else
typedef struct ExecuteFolder ExecuteFolder;
#endif /* defined __cplusplus */
#endif /* defined __ExecuteFolder_FWD_DEFINED__ */

#ifndef __IAssocHandlerInvoker_FWD_DEFINED__
#define __IAssocHandlerInvoker_FWD_DEFINED__
typedef interface IAssocHandlerInvoker IAssocHandlerInvoker;
#ifdef __cplusplus
interface IAssocHandlerInvoker;
#endif /* __cplusplus */
#endif

#ifndef __IAssocHandler_FWD_DEFINED__
#define __IAssocHandler_FWD_DEFINED__
typedef interface IAssocHandler IAssocHandler;
#ifdef __cplusplus
interface IAssocHandler;
#endif /* __cplusplus */
#endif

#ifndef __IEnumAssocHandlers_FWD_DEFINED__
#define __IEnumAssocHandlers_FWD_DEFINED__
typedef interface IEnumAssocHandlers IEnumAssocHandlers;
#ifdef __cplusplus
interface IEnumAssocHandlers;
#endif /* __cplusplus */
#endif

#ifndef __IDataObjectProvider_FWD_DEFINED__
#define __IDataObjectProvider_FWD_DEFINED__
typedef interface IDataObjectProvider IDataObjectProvider;
#ifdef __cplusplus
interface IDataObjectProvider;
#endif /* __cplusplus */
#endif

#ifndef __IDataTransferManagerInterop_FWD_DEFINED__
#define __IDataTransferManagerInterop_FWD_DEFINED__
typedef interface IDataTransferManagerInterop IDataTransferManagerInterop;
#ifdef __cplusplus
interface IDataTransferManagerInterop;
#endif /* __cplusplus */
#endif

#ifndef __IFrameworkInputPaneHandler_FWD_DEFINED__
#define __IFrameworkInputPaneHandler_FWD_DEFINED__
typedef interface IFrameworkInputPaneHandler IFrameworkInputPaneHandler;
#ifdef __cplusplus
interface IFrameworkInputPaneHandler;
#endif /* __cplusplus */
#endif

#ifndef __IFrameworkInputPane_FWD_DEFINED__
#define __IFrameworkInputPane_FWD_DEFINED__
typedef interface IFrameworkInputPane IFrameworkInputPane;
#ifdef __cplusplus
interface IFrameworkInputPane;
#endif /* __cplusplus */
#endif

#ifndef __ISearchableApplication_FWD_DEFINED__
#define __ISearchableApplication_FWD_DEFINED__
typedef interface ISearchableApplication ISearchableApplication;
#ifdef __cplusplus
interface ISearchableApplication;
#endif /* __cplusplus */
#endif

#ifndef __IAccessibilityDockingServiceCallback_FWD_DEFINED__
#define __IAccessibilityDockingServiceCallback_FWD_DEFINED__
typedef interface IAccessibilityDockingServiceCallback IAccessibilityDockingServiceCallback;
#ifdef __cplusplus
interface IAccessibilityDockingServiceCallback;
#endif /* __cplusplus */
#endif

#ifndef __IAccessibilityDockingService_FWD_DEFINED__
#define __IAccessibilityDockingService_FWD_DEFINED__
typedef interface IAccessibilityDockingService IAccessibilityDockingService;
#ifdef __cplusplus
interface IAccessibilityDockingService;
#endif /* __cplusplus */
#endif

#ifndef __IAppVisibilityEvents_FWD_DEFINED__
#define __IAppVisibilityEvents_FWD_DEFINED__
typedef interface IAppVisibilityEvents IAppVisibilityEvents;
#ifdef __cplusplus
interface IAppVisibilityEvents;
#endif /* __cplusplus */
#endif

#ifndef __IAppVisibility_FWD_DEFINED__
#define __IAppVisibility_FWD_DEFINED__
typedef interface IAppVisibility IAppVisibility;
#ifdef __cplusplus
interface IAppVisibility;
#endif /* __cplusplus */
#endif

#ifndef __IPackageExecutionStateChangeNotification_FWD_DEFINED__
#define __IPackageExecutionStateChangeNotification_FWD_DEFINED__
typedef interface IPackageExecutionStateChangeNotification IPackageExecutionStateChangeNotification;
#ifdef __cplusplus
interface IPackageExecutionStateChangeNotification;
#endif /* __cplusplus */
#endif

#ifndef __IPackageDebugSettings_FWD_DEFINED__
#define __IPackageDebugSettings_FWD_DEFINED__
typedef interface IPackageDebugSettings IPackageDebugSettings;
#ifdef __cplusplus
interface IPackageDebugSettings;
#endif /* __cplusplus */
#endif

#ifndef __IExecuteCommandApplicationHostEnvironment_FWD_DEFINED__
#define __IExecuteCommandApplicationHostEnvironment_FWD_DEFINED__
typedef interface IExecuteCommandApplicationHostEnvironment IExecuteCommandApplicationHostEnvironment;
#ifdef __cplusplus
interface IExecuteCommandApplicationHostEnvironment;
#endif /* __cplusplus */
#endif

#ifndef __IExecuteCommandHost_FWD_DEFINED__
#define __IExecuteCommandHost_FWD_DEFINED__
typedef interface IExecuteCommandHost IExecuteCommandHost;
#ifdef __cplusplus
interface IExecuteCommandHost;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationDesignModeSettings_FWD_DEFINED__
#define __IApplicationDesignModeSettings_FWD_DEFINED__
typedef interface IApplicationDesignModeSettings IApplicationDesignModeSettings;
#ifdef __cplusplus
interface IApplicationDesignModeSettings;
#endif /* __cplusplus */
#endif

#ifndef __IInitializeWithWindow_FWD_DEFINED__
#define __IInitializeWithWindow_FWD_DEFINED__
typedef interface IInitializeWithWindow IInitializeWithWindow;
#ifdef __cplusplus
interface IInitializeWithWindow;
#endif /* __cplusplus */
#endif

#ifndef __IHandlerInfo_FWD_DEFINED__
#define __IHandlerInfo_FWD_DEFINED__
typedef interface IHandlerInfo IHandlerInfo;
#ifdef __cplusplus
interface IHandlerInfo;
#endif /* __cplusplus */
#endif

#ifndef __IHandlerActivationHost_FWD_DEFINED__
#define __IHandlerActivationHost_FWD_DEFINED__
typedef interface IHandlerActivationHost IHandlerActivationHost;
#ifdef __cplusplus
interface IHandlerActivationHost;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <objidl.h>
#include <oleidl.h>
#include <oaidl.h>
#include <docobj.h>
#include <shtypes.h>
#include <servprov.h>
#include <comcat.h>
#include <propidl.h>
#include <prsht.h>
#include <msxml.h>
#include <wtypes.h>
#include <propsys.h>
#include <objectarray.h>
#include <structuredquerycondition.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

#include <_mingw_unicode.h>


#include <sherrors.h>

#ifndef SHSTDAPI
#ifdef _SHELL32_
#define SHSTDAPI STDAPI
#define SHSTDAPI_(type) STDAPI_(type)
#else
#define SHSTDAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
#define SHSTDAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
#endif
#endif

#define CMF_NORMAL 0x0
#define CMF_DEFAULTONLY 0x1
#define CMF_VERBSONLY 0x2
#define CMF_EXPLORE 0x4
#define CMF_NOVERBS 0x8
#define CMF_CANRENAME 0x10
#define CMF_NODEFAULT 0x20
#if NTDDI_VERSION < NTDDI_VISTA
#define CMF_INCLUDESTATIC 0x40
#endif
#if NTDDI_VERSION >= NTDDI_VISTA
#define CMF_ITEMMENU 0x80
#endif
#define CMF_EXTENDEDVERBS 0x100
#if NTDDI_VERSION >= NTDDI_VISTA
#define CMF_DISABLEDVERBS 0x200
#endif
#define CMF_ASYNCVERBSTATE 0x400
#define CMF_OPTIMIZEFORINVOKE 0x800
#define CMF_SYNCCASCADEMENU 0x1000
#define CMF_DONOTPICKDEFAULT 0x2000
#define CMF_RESERVED 0xffff0000

#define GCS_VERBA 0x0
#define GCS_HELPTEXTA 0x1
#define GCS_VALIDATEA 0x2
#define GCS_VERBW 0x4
#define GCS_HELPTEXTW 0x5
#define GCS_VALIDATEW 0x6
#define GCS_VERBICONW 0x14
#define GCS_UNICODE 0x4

#define GCS_VERB __MINGW_NAME_AW(GCS_VERB)
#define GCS_HELPTEXT __MINGW_NAME_AW(GCS_HELPTEXT)
#define GCS_VALIDATE __MINGW_NAME_AW(GCS_VALIDATE)

#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"

#define CMDSTR_NEWFOLDER __MINGW_NAME_AW(CMDSTR_NEWFOLDER)
#define CMDSTR_VIEWLIST __MINGW_NAME_AW(CMDSTR_VIEWLIST)
#define CMDSTR_VIEWDETAILS __MINGW_NAME_AW(CMDSTR_VIEWDETAILS)

#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_NO_CONSOLE SEE_MASK_NO_CONSOLE
#if NTDDI_VERSION < NTDDI_VISTA
#define CMIC_MASK_HASLINKNAME SEE_MASK_HASLINKNAME
#define CMIC_MASK_HASTITLE SEE_MASK_HASTITLE
#endif
#define CMIC_MASK_FLAG_SEP_VDM SEE_MASK_FLAG_SEPVDM
#define CMIC_MASK_ASYNCOK SEE_MASK_ASYNCOK
#if NTDDI_VERSION >= NTDDI_VISTA
#define CMIC_MASK_NOASYNC SEE_MASK_NOASYNC
#endif
#define CMIC_MASK_SHIFT_DOWN 0x10000000
#define CMIC_MASK_CONTROL_DOWN 0x40000000
#define CMIC_MASK_FLAG_LOG_USAGE SEE_MASK_FLAG_LOG_USAGE
#define CMIC_MASK_NOZONECHECKS SEE_MASK_NOZONECHECKS
#define CMIC_MASK_PTINVOKE 0x20000000

#include <pshpack8.h>
typedef struct _CMINVOKECOMMANDINFO {
    DWORD cbSize;
    DWORD fMask;
    HWND hwnd;
    LPCSTR lpVerb;
    LPCSTR lpParameters;
    LPCSTR lpDirectory;
    int nShow;
    DWORD dwHotKey;
    HANDLE hIcon;
} CMINVOKECOMMANDINFO;

typedef CMINVOKECOMMANDINFO *LPCMINVOKECOMMANDINFO;
typedef const CMINVOKECOMMANDINFO *PCCMINVOKECOMMANDINFO;

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;

typedef CMINVOKECOMMANDINFOEX *LPCMINVOKECOMMANDINFOEX;
typedef const CMINVOKECOMMANDINFOEX *PCCMINVOKECOMMANDINFOEX;
#include <poppack.h>

/*****************************************************************************
 * IContextMenu interface
 */
#ifndef __IContextMenu_INTERFACE_DEFINED__
#define __IContextMenu_INTERFACE_DEFINED__

DEFINE_GUID(IID_IContextMenu, 0x000214e4, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214e4-0000-0000-c000-000000000046")
IContextMenu : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryContextMenu(
        HMENU hmenu,
        UINT indexMenu,
        UINT idCmdFirst,
        UINT idCmdLast,
        UINT uFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvokeCommand(
        CMINVOKECOMMANDINFO *pici) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCommandString(
        UINT_PTR idCmd,
        UINT uType,
        UINT *pReserved,
        CHAR *pszName,
        UINT cchMax) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IContextMenu, 0x000214e4, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IContextMenuVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IContextMenu *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IContextMenu *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IContextMenu *This);

    /*** IContextMenu methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryContextMenu)(
        IContextMenu *This,
        HMENU hmenu,
        UINT indexMenu,
        UINT idCmdFirst,
        UINT idCmdLast,
        UINT uFlags);

    HRESULT (STDMETHODCALLTYPE *InvokeCommand)(
        IContextMenu *This,
        CMINVOKECOMMANDINFO *pici);

    HRESULT (STDMETHODCALLTYPE *GetCommandString)(
        IContextMenu *This,
        UINT_PTR idCmd,
        UINT uType,
        UINT *pReserved,
        CHAR *pszName,
        UINT cchMax);

    END_INTERFACE
} IContextMenuVtbl;

interface IContextMenu {
    CONST_VTBL IContextMenuVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IContextMenu_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IContextMenu_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IContextMenu_Release(This) (This)->lpVtbl->Release(This)
/*** IContextMenu methods ***/
#define IContextMenu_QueryContextMenu(This,hmenu,indexMenu,idCmdFirst,idCmdLast,uFlags) (This)->lpVtbl->QueryContextMenu(This,hmenu,indexMenu,idCmdFirst,idCmdLast,uFlags)
#define IContextMenu_InvokeCommand(This,pici) (This)->lpVtbl->InvokeCommand(This,pici)
#define IContextMenu_GetCommandString(This,idCmd,uType,pReserved,pszName,cchMax) (This)->lpVtbl->GetCommandString(This,idCmd,uType,pReserved,pszName,cchMax)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IContextMenu_QueryInterface(IContextMenu* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IContextMenu_AddRef(IContextMenu* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IContextMenu_Release(IContextMenu* This) {
    return This->lpVtbl->Release(This);
}
/*** IContextMenu methods ***/
static FORCEINLINE HRESULT IContextMenu_QueryContextMenu(IContextMenu* This,HMENU hmenu,UINT indexMenu,UINT idCmdFirst,UINT idCmdLast,UINT uFlags) {
    return This->lpVtbl->QueryContextMenu(This,hmenu,indexMenu,idCmdFirst,idCmdLast,uFlags);
}
static FORCEINLINE HRESULT IContextMenu_InvokeCommand(IContextMenu* This,CMINVOKECOMMANDINFO *pici) {
    return This->lpVtbl->InvokeCommand(This,pici);
}
static FORCEINLINE HRESULT IContextMenu_GetCommandString(IContextMenu* This,UINT_PTR idCmd,UINT uType,UINT *pReserved,CHAR *pszName,UINT cchMax) {
    return This->lpVtbl->GetCommandString(This,idCmd,uType,pReserved,pszName,cchMax);
}
#endif
#endif

#endif


#endif  /* __IContextMenu_INTERFACE_DEFINED__ */

typedef IContextMenu *LPCONTEXTMENU;

/*****************************************************************************
 * IContextMenu2 interface
 */
#ifndef __IContextMenu2_INTERFACE_DEFINED__
#define __IContextMenu2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IContextMenu2, 0x000214f4, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214f4-0000-0000-c000-000000000046")
IContextMenu2 : public IContextMenu
{
    virtual HRESULT STDMETHODCALLTYPE HandleMenuMsg(
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IContextMenu2, 0x000214f4, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IContextMenu2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IContextMenu2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IContextMenu2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IContextMenu2 *This);

    /*** IContextMenu methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryContextMenu)(
        IContextMenu2 *This,
        HMENU hmenu,
        UINT indexMenu,
        UINT idCmdFirst,
        UINT idCmdLast,
        UINT uFlags);

    HRESULT (STDMETHODCALLTYPE *InvokeCommand)(
        IContextMenu2 *This,
        CMINVOKECOMMANDINFO *pici);

    HRESULT (STDMETHODCALLTYPE *GetCommandString)(
        IContextMenu2 *This,
        UINT_PTR idCmd,
        UINT uType,
        UINT *pReserved,
        CHAR *pszName,
        UINT cchMax);

    /*** IContextMenu2 methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleMenuMsg)(
        IContextMenu2 *This,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam);

    END_INTERFACE
} IContextMenu2Vtbl;

interface IContextMenu2 {
    CONST_VTBL IContextMenu2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IContextMenu2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IContextMenu2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IContextMenu2_Release(This) (This)->lpVtbl->Release(This)
/*** IContextMenu methods ***/
#define IContextMenu2_QueryContextMenu(This,hmenu,indexMenu,idCmdFirst,idCmdLast,uFlags) (This)->lpVtbl->QueryContextMenu(This,hmenu,indexMenu,idCmdFirst,idCmdLast,uFlags)
#define IContextMenu2_InvokeCommand(This,pici) (This)->lpVtbl->InvokeCommand(This,pici)
#define IContextMenu2_GetCommandString(This,idCmd,uType,pReserved,pszName,cchMax) (This)->lpVtbl->GetCommandString(This,idCmd,uType,pReserved,pszName,cchMax)
/*** IContextMenu2 methods ***/
#define IContextMenu2_HandleMenuMsg(This,uMsg,wParam,lParam) (This)->lpVtbl->HandleMenuMsg(This,uMsg,wParam,lParam)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IContextMenu2_QueryInterface(IContextMenu2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IContextMenu2_AddRef(IContextMenu2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IContextMenu2_Release(IContextMenu2* This) {
    return This->lpVtbl->Release(This);
}
/*** IContextMenu methods ***/
static FORCEINLINE HRESULT IContextMenu2_QueryContextMenu(IContextMenu2* This,HMENU hmenu,UINT indexMenu,UINT idCmdFirst,UINT idCmdLast,UINT uFlags) {
    return This->lpVtbl->QueryContextMenu(This,hmenu,indexMenu,idCmdFirst,idCmdLast,uFlags);
}
static FORCEINLINE HRESULT IContextMenu2_InvokeCommand(IContextMenu2* This,CMINVOKECOMMANDINFO *pici) {
    return This->lpVtbl->InvokeCommand(This,pici);
}
static FORCEINLINE HRESULT IContextMenu2_GetCommandString(IContextMenu2* This,UINT_PTR idCmd,UINT uType,UINT *pReserved,CHAR *pszName,UINT cchMax) {
    return This->lpVtbl->GetCommandString(This,idCmd,uType,pReserved,pszName,cchMax);
}
/*** IContextMenu2 methods ***/
static FORCEINLINE HRESULT IContextMenu2_HandleMenuMsg(IContextMenu2* This,UINT uMsg,WPARAM wParam,LPARAM lParam) {
    return This->lpVtbl->HandleMenuMsg(This,uMsg,wParam,lParam);
}
#endif
#endif

#endif


#endif  /* __IContextMenu2_INTERFACE_DEFINED__ */

typedef IContextMenu2 *LPCONTEXTMENU2;

/*****************************************************************************
 * IContextMenu3 interface
 */
#ifndef __IContextMenu3_INTERFACE_DEFINED__
#define __IContextMenu3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IContextMenu3, 0xbcfce0a0, 0xec17, 0x11d0, 0x8d,0x10, 0x00,0xa0,0xc9,0x0f,0x27,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bcfce0a0-ec17-11d0-8d10-00a0c90f2719")
IContextMenu3 : public IContextMenu2
{
    virtual HRESULT STDMETHODCALLTYPE HandleMenuMsg2(
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam,
        LRESULT *plResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IContextMenu3, 0xbcfce0a0, 0xec17, 0x11d0, 0x8d,0x10, 0x00,0xa0,0xc9,0x0f,0x27,0x19)
#endif
#else
typedef struct IContextMenu3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IContextMenu3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IContextMenu3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IContextMenu3 *This);

    /*** IContextMenu methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryContextMenu)(
        IContextMenu3 *This,
        HMENU hmenu,
        UINT indexMenu,
        UINT idCmdFirst,
        UINT idCmdLast,
        UINT uFlags);

    HRESULT (STDMETHODCALLTYPE *InvokeCommand)(
        IContextMenu3 *This,
        CMINVOKECOMMANDINFO *pici);

    HRESULT (STDMETHODCALLTYPE *GetCommandString)(
        IContextMenu3 *This,
        UINT_PTR idCmd,
        UINT uType,
        UINT *pReserved,
        CHAR *pszName,
        UINT cchMax);

    /*** IContextMenu2 methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleMenuMsg)(
        IContextMenu3 *This,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam);

    /*** IContextMenu3 methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleMenuMsg2)(
        IContextMenu3 *This,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam,
        LRESULT *plResult);

    END_INTERFACE
} IContextMenu3Vtbl;

interface IContextMenu3 {
    CONST_VTBL IContextMenu3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IContextMenu3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IContextMenu3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IContextMenu3_Release(This) (This)->lpVtbl->Release(This)
/*** IContextMenu methods ***/
#define IContextMenu3_QueryContextMenu(This,hmenu,indexMenu,idCmdFirst,idCmdLast,uFlags) (This)->lpVtbl->QueryContextMenu(This,hmenu,indexMenu,idCmdFirst,idCmdLast,uFlags)
#define IContextMenu3_InvokeCommand(This,pici) (This)->lpVtbl->InvokeCommand(This,pici)
#define IContextMenu3_GetCommandString(This,idCmd,uType,pReserved,pszName,cchMax) (This)->lpVtbl->GetCommandString(This,idCmd,uType,pReserved,pszName,cchMax)
/*** IContextMenu2 methods ***/
#define IContextMenu3_HandleMenuMsg(This,uMsg,wParam,lParam) (This)->lpVtbl->HandleMenuMsg(This,uMsg,wParam,lParam)
/*** IContextMenu3 methods ***/
#define IContextMenu3_HandleMenuMsg2(This,uMsg,wParam,lParam,plResult) (This)->lpVtbl->HandleMenuMsg2(This,uMsg,wParam,lParam,plResult)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IContextMenu3_QueryInterface(IContextMenu3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IContextMenu3_AddRef(IContextMenu3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IContextMenu3_Release(IContextMenu3* This) {
    return This->lpVtbl->Release(This);
}
/*** IContextMenu methods ***/
static FORCEINLINE HRESULT IContextMenu3_QueryContextMenu(IContextMenu3* This,HMENU hmenu,UINT indexMenu,UINT idCmdFirst,UINT idCmdLast,UINT uFlags) {
    return This->lpVtbl->QueryContextMenu(This,hmenu,indexMenu,idCmdFirst,idCmdLast,uFlags);
}
static FORCEINLINE HRESULT IContextMenu3_InvokeCommand(IContextMenu3* This,CMINVOKECOMMANDINFO *pici) {
    return This->lpVtbl->InvokeCommand(This,pici);
}
static FORCEINLINE HRESULT IContextMenu3_GetCommandString(IContextMenu3* This,UINT_PTR idCmd,UINT uType,UINT *pReserved,CHAR *pszName,UINT cchMax) {
    return This->lpVtbl->GetCommandString(This,idCmd,uType,pReserved,pszName,cchMax);
}
/*** IContextMenu2 methods ***/
static FORCEINLINE HRESULT IContextMenu3_HandleMenuMsg(IContextMenu3* This,UINT uMsg,WPARAM wParam,LPARAM lParam) {
    return This->lpVtbl->HandleMenuMsg(This,uMsg,wParam,lParam);
}
/*** IContextMenu3 methods ***/
static FORCEINLINE HRESULT IContextMenu3_HandleMenuMsg2(IContextMenu3* This,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT *plResult) {
    return This->lpVtbl->HandleMenuMsg2(This,uMsg,wParam,lParam,plResult);
}
#endif
#endif

#endif


#endif  /* __IContextMenu3_INTERFACE_DEFINED__ */

typedef IContextMenu3 *LPCONTEXTMENU3;

/*****************************************************************************
 * IExecuteCommand interface
 */
#ifndef __IExecuteCommand_INTERFACE_DEFINED__
#define __IExecuteCommand_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExecuteCommand, 0x7f9185b0, 0xcb92, 0x43c5, 0x80,0xa9, 0x92,0x27,0x7a,0x4f,0x7b,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7f9185b0-cb92-43c5-80a9-92277a4f7b54")
IExecuteCommand : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetKeyState(
        DWORD grfKeyState) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetParameters(
        LPCWSTR pszParameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPosition(
        POINT pt) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetShowWindow(
        int nShow) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetNoShowUI(
        WINBOOL fNoShowUI) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDirectory(
        LPCWSTR pszDirectory) = 0;

    virtual HRESULT STDMETHODCALLTYPE Execute(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExecuteCommand, 0x7f9185b0, 0xcb92, 0x43c5, 0x80,0xa9, 0x92,0x27,0x7a,0x4f,0x7b,0x54)
#endif
#else
typedef struct IExecuteCommandVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IExecuteCommand *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IExecuteCommand *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IExecuteCommand *This);

    /*** IExecuteCommand methods ***/
    HRESULT (STDMETHODCALLTYPE *SetKeyState)(
        IExecuteCommand *This,
        DWORD grfKeyState);

    HRESULT (STDMETHODCALLTYPE *SetParameters)(
        IExecuteCommand *This,
        LPCWSTR pszParameters);

    HRESULT (STDMETHODCALLTYPE *SetPosition)(
        IExecuteCommand *This,
        POINT pt);

    HRESULT (STDMETHODCALLTYPE *SetShowWindow)(
        IExecuteCommand *This,
        int nShow);

    HRESULT (STDMETHODCALLTYPE *SetNoShowUI)(
        IExecuteCommand *This,
        WINBOOL fNoShowUI);

    HRESULT (STDMETHODCALLTYPE *SetDirectory)(
        IExecuteCommand *This,
        LPCWSTR pszDirectory);

    HRESULT (STDMETHODCALLTYPE *Execute)(
        IExecuteCommand *This);

    END_INTERFACE
} IExecuteCommandVtbl;

interface IExecuteCommand {
    CONST_VTBL IExecuteCommandVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExecuteCommand_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExecuteCommand_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExecuteCommand_Release(This) (This)->lpVtbl->Release(This)
/*** IExecuteCommand methods ***/
#define IExecuteCommand_SetKeyState(This,grfKeyState) (This)->lpVtbl->SetKeyState(This,grfKeyState)
#define IExecuteCommand_SetParameters(This,pszParameters) (This)->lpVtbl->SetParameters(This,pszParameters)
#define IExecuteCommand_SetPosition(This,pt) (This)->lpVtbl->SetPosition(This,pt)
#define IExecuteCommand_SetShowWindow(This,nShow) (This)->lpVtbl->SetShowWindow(This,nShow)
#define IExecuteCommand_SetNoShowUI(This,fNoShowUI) (This)->lpVtbl->SetNoShowUI(This,fNoShowUI)
#define IExecuteCommand_SetDirectory(This,pszDirectory) (This)->lpVtbl->SetDirectory(This,pszDirectory)
#define IExecuteCommand_Execute(This) (This)->lpVtbl->Execute(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IExecuteCommand_QueryInterface(IExecuteCommand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IExecuteCommand_AddRef(IExecuteCommand* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IExecuteCommand_Release(IExecuteCommand* This) {
    return This->lpVtbl->Release(This);
}
/*** IExecuteCommand methods ***/
static FORCEINLINE HRESULT IExecuteCommand_SetKeyState(IExecuteCommand* This,DWORD grfKeyState) {
    return This->lpVtbl->SetKeyState(This,grfKeyState);
}
static FORCEINLINE HRESULT IExecuteCommand_SetParameters(IExecuteCommand* This,LPCWSTR pszParameters) {
    return This->lpVtbl->SetParameters(This,pszParameters);
}
static FORCEINLINE HRESULT IExecuteCommand_SetPosition(IExecuteCommand* This,POINT pt) {
    return This->lpVtbl->SetPosition(This,pt);
}
static FORCEINLINE HRESULT IExecuteCommand_SetShowWindow(IExecuteCommand* This,int nShow) {
    return This->lpVtbl->SetShowWindow(This,nShow);
}
static FORCEINLINE HRESULT IExecuteCommand_SetNoShowUI(IExecuteCommand* This,WINBOOL fNoShowUI) {
    return This->lpVtbl->SetNoShowUI(This,fNoShowUI);
}
static FORCEINLINE HRESULT IExecuteCommand_SetDirectory(IExecuteCommand* This,LPCWSTR pszDirectory) {
    return This->lpVtbl->SetDirectory(This,pszDirectory);
}
static FORCEINLINE HRESULT IExecuteCommand_Execute(IExecuteCommand* This) {
    return This->lpVtbl->Execute(This);
}
#endif
#endif

#endif


#endif  /* __IExecuteCommand_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IPersistFolder interface
 */
#ifndef __IPersistFolder_INTERFACE_DEFINED__
#define __IPersistFolder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPersistFolder, 0x000214ea, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214ea-0000-0000-c000-000000000046")
IPersistFolder : public IPersist
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        PCIDLIST_ABSOLUTE pidl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPersistFolder, 0x000214ea, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IPersistFolderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPersistFolder *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPersistFolder *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPersistFolder *This);

    /*** IPersist methods ***/
    HRESULT (STDMETHODCALLTYPE *GetClassID)(
        IPersistFolder *This,
        CLSID *pClassID);

    /*** IPersistFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IPersistFolder *This,
        PCIDLIST_ABSOLUTE pidl);

    END_INTERFACE
} IPersistFolderVtbl;

interface IPersistFolder {
    CONST_VTBL IPersistFolderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPersistFolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPersistFolder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPersistFolder_Release(This) (This)->lpVtbl->Release(This)
/*** IPersist methods ***/
#define IPersistFolder_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
/*** IPersistFolder methods ***/
#define IPersistFolder_Initialize(This,pidl) (This)->lpVtbl->Initialize(This,pidl)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPersistFolder_QueryInterface(IPersistFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPersistFolder_AddRef(IPersistFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPersistFolder_Release(IPersistFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersist methods ***/
static FORCEINLINE HRESULT IPersistFolder_GetClassID(IPersistFolder* This,CLSID *pClassID) {
    return This->lpVtbl->GetClassID(This,pClassID);
}
/*** IPersistFolder methods ***/
static FORCEINLINE HRESULT IPersistFolder_Initialize(IPersistFolder* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->Initialize(This,pidl);
}
#endif
#endif

#endif


#endif  /* __IPersistFolder_INTERFACE_DEFINED__ */

typedef IPersistFolder *LPPERSISTFOLDER;

#define IRTIR_TASK_NOT_RUNNING   0
#define IRTIR_TASK_RUNNING       1
#define IRTIR_TASK_SUSPENDED     2
#define IRTIR_TASK_PENDING       3
#define IRTIR_TASK_FINISHED      4

/*****************************************************************************
 * IRunnableTask interface
 */
#ifndef __IRunnableTask_INTERFACE_DEFINED__
#define __IRunnableTask_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRunnableTask, 0x85788d00, 0x6807, 0x11d0, 0xb8,0x10, 0x00,0xc0,0x4f,0xd7,0x06,0xec);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("85788d00-6807-11d0-b810-00c04fd706ec")
IRunnableTask : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Run(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Kill(
        WINBOOL bWait) = 0;

    virtual HRESULT STDMETHODCALLTYPE Suspend(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resume(
        ) = 0;

    virtual ULONG STDMETHODCALLTYPE IsRunning(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRunnableTask, 0x85788d00, 0x6807, 0x11d0, 0xb8,0x10, 0x00,0xc0,0x4f,0xd7,0x06,0xec)
#endif
#else
typedef struct IRunnableTaskVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRunnableTask *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRunnableTask *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRunnableTask *This);

    /*** IRunnableTask methods ***/
    HRESULT (STDMETHODCALLTYPE *Run)(
        IRunnableTask *This);

    HRESULT (STDMETHODCALLTYPE *Kill)(
        IRunnableTask *This,
        WINBOOL bWait);

    HRESULT (STDMETHODCALLTYPE *Suspend)(
        IRunnableTask *This);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IRunnableTask *This);

    ULONG (STDMETHODCALLTYPE *IsRunning)(
        IRunnableTask *This);

    END_INTERFACE
} IRunnableTaskVtbl;

interface IRunnableTask {
    CONST_VTBL IRunnableTaskVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRunnableTask_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRunnableTask_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRunnableTask_Release(This) (This)->lpVtbl->Release(This)
/*** IRunnableTask methods ***/
#define IRunnableTask_Run(This) (This)->lpVtbl->Run(This)
#define IRunnableTask_Kill(This,bWait) (This)->lpVtbl->Kill(This,bWait)
#define IRunnableTask_Suspend(This) (This)->lpVtbl->Suspend(This)
#define IRunnableTask_Resume(This) (This)->lpVtbl->Resume(This)
#define IRunnableTask_IsRunning(This) (This)->lpVtbl->IsRunning(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRunnableTask_QueryInterface(IRunnableTask* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRunnableTask_AddRef(IRunnableTask* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRunnableTask_Release(IRunnableTask* This) {
    return This->lpVtbl->Release(This);
}
/*** IRunnableTask methods ***/
static FORCEINLINE HRESULT IRunnableTask_Run(IRunnableTask* This) {
    return This->lpVtbl->Run(This);
}
static FORCEINLINE HRESULT IRunnableTask_Kill(IRunnableTask* This,WINBOOL bWait) {
    return This->lpVtbl->Kill(This,bWait);
}
static FORCEINLINE HRESULT IRunnableTask_Suspend(IRunnableTask* This) {
    return This->lpVtbl->Suspend(This);
}
static FORCEINLINE HRESULT IRunnableTask_Resume(IRunnableTask* This) {
    return This->lpVtbl->Resume(This);
}
static FORCEINLINE ULONG IRunnableTask_IsRunning(IRunnableTask* This) {
    return This->lpVtbl->IsRunning(This);
}
#endif
#endif

#endif


#endif  /* __IRunnableTask_INTERFACE_DEFINED__ */


#define TOID_NULL GUID_NULL
#define ITSAT_DEFAULT_LPARAM ((DWORD_PTR)-1)

#define ITSAT_DEFAULT_PRIORITY 0x10000000
#define ITSAT_MAX_PRIORITY 0x7fffffff
#define ITSAT_MIN_PRIORITY 0x00000000

#define ITSSFLAG_COMPLETE_ON_DESTROY 0x0
#define ITSSFLAG_KILL_ON_DESTROY 0x1

#define ITSSFLAG_FLAGS_MASK 0x3

#define ITSS_THREAD_DESTROY_DEFAULT_TIMEOUT (10 * 1000)
#define ITSS_THREAD_TERMINATE_TIMEOUT (INFINITE)
#define ITSS_THREAD_TIMEOUT_NO_CHANGE (INFINITE - 1)

/*****************************************************************************
 * IShellTaskScheduler interface
 */
#ifndef __IShellTaskScheduler_INTERFACE_DEFINED__
#define __IShellTaskScheduler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellTaskScheduler, 0x6ccb7be0, 0x6807, 0x11d0, 0xb8,0x10, 0x00,0xc0,0x4f,0xd7,0x06,0xec);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6ccb7be0-6807-11d0-b810-00c04fd706ec")
IShellTaskScheduler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddTask(
        IRunnableTask *prt,
        REFTASKOWNERID rtoid,
        DWORD_PTR lParam,
        DWORD dwPriority) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveTasks(
        REFTASKOWNERID rtoid,
        DWORD_PTR lParam,
        WINBOOL bWaitIfRunning) = 0;

    virtual UINT STDMETHODCALLTYPE CountTasks(
        REFTASKOWNERID rtoid) = 0;

    virtual HRESULT STDMETHODCALLTYPE Status(
        DWORD dwReleaseStatus,
        DWORD dwThreadTimeout) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellTaskScheduler, 0x6ccb7be0, 0x6807, 0x11d0, 0xb8,0x10, 0x00,0xc0,0x4f,0xd7,0x06,0xec)
#endif
#else
typedef struct IShellTaskSchedulerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellTaskScheduler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellTaskScheduler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellTaskScheduler *This);

    /*** IShellTaskScheduler methods ***/
    HRESULT (STDMETHODCALLTYPE *AddTask)(
        IShellTaskScheduler *This,
        IRunnableTask *prt,
        REFTASKOWNERID rtoid,
        DWORD_PTR lParam,
        DWORD dwPriority);

    HRESULT (STDMETHODCALLTYPE *RemoveTasks)(
        IShellTaskScheduler *This,
        REFTASKOWNERID rtoid,
        DWORD_PTR lParam,
        WINBOOL bWaitIfRunning);

    UINT (STDMETHODCALLTYPE *CountTasks)(
        IShellTaskScheduler *This,
        REFTASKOWNERID rtoid);

    HRESULT (STDMETHODCALLTYPE *Status)(
        IShellTaskScheduler *This,
        DWORD dwReleaseStatus,
        DWORD dwThreadTimeout);

    END_INTERFACE
} IShellTaskSchedulerVtbl;

interface IShellTaskScheduler {
    CONST_VTBL IShellTaskSchedulerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellTaskScheduler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellTaskScheduler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellTaskScheduler_Release(This) (This)->lpVtbl->Release(This)
/*** IShellTaskScheduler methods ***/
#define IShellTaskScheduler_AddTask(This,prt,rtoid,lParam,dwPriority) (This)->lpVtbl->AddTask(This,prt,rtoid,lParam,dwPriority)
#define IShellTaskScheduler_RemoveTasks(This,rtoid,lParam,bWaitIfRunning) (This)->lpVtbl->RemoveTasks(This,rtoid,lParam,bWaitIfRunning)
#define IShellTaskScheduler_CountTasks(This,rtoid) (This)->lpVtbl->CountTasks(This,rtoid)
#define IShellTaskScheduler_Status(This,dwReleaseStatus,dwThreadTimeout) (This)->lpVtbl->Status(This,dwReleaseStatus,dwThreadTimeout)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellTaskScheduler_QueryInterface(IShellTaskScheduler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellTaskScheduler_AddRef(IShellTaskScheduler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellTaskScheduler_Release(IShellTaskScheduler* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellTaskScheduler methods ***/
static FORCEINLINE HRESULT IShellTaskScheduler_AddTask(IShellTaskScheduler* This,IRunnableTask *prt,REFTASKOWNERID rtoid,DWORD_PTR lParam,DWORD dwPriority) {
    return This->lpVtbl->AddTask(This,prt,rtoid,lParam,dwPriority);
}
static FORCEINLINE HRESULT IShellTaskScheduler_RemoveTasks(IShellTaskScheduler* This,REFTASKOWNERID rtoid,DWORD_PTR lParam,WINBOOL bWaitIfRunning) {
    return This->lpVtbl->RemoveTasks(This,rtoid,lParam,bWaitIfRunning);
}
static FORCEINLINE UINT IShellTaskScheduler_CountTasks(IShellTaskScheduler* This,REFTASKOWNERID rtoid) {
    return This->lpVtbl->CountTasks(This,rtoid);
}
static FORCEINLINE HRESULT IShellTaskScheduler_Status(IShellTaskScheduler* This,DWORD dwReleaseStatus,DWORD dwThreadTimeout) {
    return This->lpVtbl->Status(This,dwReleaseStatus,dwThreadTimeout);
}
#endif
#endif

#endif


#endif  /* __IShellTaskScheduler_INTERFACE_DEFINED__ */


#define SID_ShellTaskScheduler IID_IShellTaskScheduler

/*****************************************************************************
 * IQueryCodePage interface
 */
#ifndef __IQueryCodePage_INTERFACE_DEFINED__
#define __IQueryCodePage_INTERFACE_DEFINED__

DEFINE_GUID(IID_IQueryCodePage, 0xc7b236ce, 0xee80, 0x11d0, 0x98,0x5f, 0x00,0x60,0x08,0x05,0x93,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c7b236ce-ee80-11d0-985f-006008059382")
IQueryCodePage : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCodePage(
        UINT *puiCodePage) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCodePage(
        UINT uiCodePage) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IQueryCodePage, 0xc7b236ce, 0xee80, 0x11d0, 0x98,0x5f, 0x00,0x60,0x08,0x05,0x93,0x82)
#endif
#else
typedef struct IQueryCodePageVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IQueryCodePage *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IQueryCodePage *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IQueryCodePage *This);

    /*** IQueryCodePage methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCodePage)(
        IQueryCodePage *This,
        UINT *puiCodePage);

    HRESULT (STDMETHODCALLTYPE *SetCodePage)(
        IQueryCodePage *This,
        UINT uiCodePage);

    END_INTERFACE
} IQueryCodePageVtbl;

interface IQueryCodePage {
    CONST_VTBL IQueryCodePageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IQueryCodePage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IQueryCodePage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IQueryCodePage_Release(This) (This)->lpVtbl->Release(This)
/*** IQueryCodePage methods ***/
#define IQueryCodePage_GetCodePage(This,puiCodePage) (This)->lpVtbl->GetCodePage(This,puiCodePage)
#define IQueryCodePage_SetCodePage(This,uiCodePage) (This)->lpVtbl->SetCodePage(This,uiCodePage)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IQueryCodePage_QueryInterface(IQueryCodePage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IQueryCodePage_AddRef(IQueryCodePage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IQueryCodePage_Release(IQueryCodePage* This) {
    return This->lpVtbl->Release(This);
}
/*** IQueryCodePage methods ***/
static FORCEINLINE HRESULT IQueryCodePage_GetCodePage(IQueryCodePage* This,UINT *puiCodePage) {
    return This->lpVtbl->GetCodePage(This,puiCodePage);
}
static FORCEINLINE HRESULT IQueryCodePage_SetCodePage(IQueryCodePage* This,UINT uiCodePage) {
    return This->lpVtbl->SetCodePage(This,uiCodePage);
}
#endif
#endif

#endif


#endif  /* __IQueryCodePage_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IPersistFolder2 interface
 */
#ifndef __IPersistFolder2_INTERFACE_DEFINED__
#define __IPersistFolder2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPersistFolder2, 0x1ac3d9f0, 0x175c, 0x11d1, 0x95,0xbe, 0x00,0x60,0x97,0x97,0xea,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1ac3d9f0-175c-11d1-95be-00609797ea4f")
IPersistFolder2 : public IPersistFolder
{
    virtual HRESULT STDMETHODCALLTYPE GetCurFolder(
        PIDLIST_ABSOLUTE *ppidl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPersistFolder2, 0x1ac3d9f0, 0x175c, 0x11d1, 0x95,0xbe, 0x00,0x60,0x97,0x97,0xea,0x4f)
#endif
#else
typedef struct IPersistFolder2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPersistFolder2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPersistFolder2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPersistFolder2 *This);

    /*** IPersist methods ***/
    HRESULT (STDMETHODCALLTYPE *GetClassID)(
        IPersistFolder2 *This,
        CLSID *pClassID);

    /*** IPersistFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IPersistFolder2 *This,
        PCIDLIST_ABSOLUTE pidl);

    /*** IPersistFolder2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurFolder)(
        IPersistFolder2 *This,
        PIDLIST_ABSOLUTE *ppidl);

    END_INTERFACE
} IPersistFolder2Vtbl;

interface IPersistFolder2 {
    CONST_VTBL IPersistFolder2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPersistFolder2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPersistFolder2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPersistFolder2_Release(This) (This)->lpVtbl->Release(This)
/*** IPersist methods ***/
#define IPersistFolder2_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
/*** IPersistFolder methods ***/
#define IPersistFolder2_Initialize(This,pidl) (This)->lpVtbl->Initialize(This,pidl)
/*** IPersistFolder2 methods ***/
#define IPersistFolder2_GetCurFolder(This,ppidl) (This)->lpVtbl->GetCurFolder(This,ppidl)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPersistFolder2_QueryInterface(IPersistFolder2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPersistFolder2_AddRef(IPersistFolder2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPersistFolder2_Release(IPersistFolder2* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersist methods ***/
static FORCEINLINE HRESULT IPersistFolder2_GetClassID(IPersistFolder2* This,CLSID *pClassID) {
    return This->lpVtbl->GetClassID(This,pClassID);
}
/*** IPersistFolder methods ***/
static FORCEINLINE HRESULT IPersistFolder2_Initialize(IPersistFolder2* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->Initialize(This,pidl);
}
/*** IPersistFolder2 methods ***/
static FORCEINLINE HRESULT IPersistFolder2_GetCurFolder(IPersistFolder2* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetCurFolder(This,ppidl);
}
#endif
#endif

#endif


#endif  /* __IPersistFolder2_INTERFACE_DEFINED__ */


#define CSIDL_FLAG_PFTI_TRACKTARGET CSIDL_FLAG_DONT_VERIFY

#include <pshpack8.h>
typedef struct _PERSIST_FOLDER_TARGET_INFO {
    PIDLIST_ABSOLUTE pidlTargetFolder;
    WCHAR szTargetParsingName[260];
    WCHAR szNetworkProvider[260];
    DWORD dwAttributes;
    int csidl;
} PERSIST_FOLDER_TARGET_INFO;
#include <poppack.h>

/*****************************************************************************
 * IPersistFolder3 interface
 */
#ifndef __IPersistFolder3_INTERFACE_DEFINED__
#define __IPersistFolder3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPersistFolder3, 0xcef04fdf, 0xfe72, 0x11d2, 0x87,0xa5, 0x00,0xc0,0x4f,0x68,0x37,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cef04fdf-fe72-11d2-87a5-00c04f6837cf")
IPersistFolder3 : public IPersistFolder2
{
    virtual HRESULT STDMETHODCALLTYPE InitializeEx(
        IBindCtx *pbc,
        PCIDLIST_ABSOLUTE pidlRoot,
        const PERSIST_FOLDER_TARGET_INFO *ppfti) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolderTargetInfo(
        PERSIST_FOLDER_TARGET_INFO *ppfti) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPersistFolder3, 0xcef04fdf, 0xfe72, 0x11d2, 0x87,0xa5, 0x00,0xc0,0x4f,0x68,0x37,0xcf)
#endif
#else
typedef struct IPersistFolder3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPersistFolder3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPersistFolder3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPersistFolder3 *This);

    /*** IPersist methods ***/
    HRESULT (STDMETHODCALLTYPE *GetClassID)(
        IPersistFolder3 *This,
        CLSID *pClassID);

    /*** IPersistFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IPersistFolder3 *This,
        PCIDLIST_ABSOLUTE pidl);

    /*** IPersistFolder2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurFolder)(
        IPersistFolder3 *This,
        PIDLIST_ABSOLUTE *ppidl);

    /*** IPersistFolder3 methods ***/
    HRESULT (STDMETHODCALLTYPE *InitializeEx)(
        IPersistFolder3 *This,
        IBindCtx *pbc,
        PCIDLIST_ABSOLUTE pidlRoot,
        const PERSIST_FOLDER_TARGET_INFO *ppfti);

    HRESULT (STDMETHODCALLTYPE *GetFolderTargetInfo)(
        IPersistFolder3 *This,
        PERSIST_FOLDER_TARGET_INFO *ppfti);

    END_INTERFACE
} IPersistFolder3Vtbl;

interface IPersistFolder3 {
    CONST_VTBL IPersistFolder3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPersistFolder3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPersistFolder3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPersistFolder3_Release(This) (This)->lpVtbl->Release(This)
/*** IPersist methods ***/
#define IPersistFolder3_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
/*** IPersistFolder methods ***/
#define IPersistFolder3_Initialize(This,pidl) (This)->lpVtbl->Initialize(This,pidl)
/*** IPersistFolder2 methods ***/
#define IPersistFolder3_GetCurFolder(This,ppidl) (This)->lpVtbl->GetCurFolder(This,ppidl)
/*** IPersistFolder3 methods ***/
#define IPersistFolder3_InitializeEx(This,pbc,pidlRoot,ppfti) (This)->lpVtbl->InitializeEx(This,pbc,pidlRoot,ppfti)
#define IPersistFolder3_GetFolderTargetInfo(This,ppfti) (This)->lpVtbl->GetFolderTargetInfo(This,ppfti)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPersistFolder3_QueryInterface(IPersistFolder3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPersistFolder3_AddRef(IPersistFolder3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPersistFolder3_Release(IPersistFolder3* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersist methods ***/
static FORCEINLINE HRESULT IPersistFolder3_GetClassID(IPersistFolder3* This,CLSID *pClassID) {
    return This->lpVtbl->GetClassID(This,pClassID);
}
/*** IPersistFolder methods ***/
static FORCEINLINE HRESULT IPersistFolder3_Initialize(IPersistFolder3* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->Initialize(This,pidl);
}
/*** IPersistFolder2 methods ***/
static FORCEINLINE HRESULT IPersistFolder3_GetCurFolder(IPersistFolder3* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetCurFolder(This,ppidl);
}
/*** IPersistFolder3 methods ***/
static FORCEINLINE HRESULT IPersistFolder3_InitializeEx(IPersistFolder3* This,IBindCtx *pbc,PCIDLIST_ABSOLUTE pidlRoot,const PERSIST_FOLDER_TARGET_INFO *ppfti) {
    return This->lpVtbl->InitializeEx(This,pbc,pidlRoot,ppfti);
}
static FORCEINLINE HRESULT IPersistFolder3_GetFolderTargetInfo(IPersistFolder3* This,PERSIST_FOLDER_TARGET_INFO *ppfti) {
    return This->lpVtbl->GetFolderTargetInfo(This,ppfti);
}
#endif
#endif

#endif


#endif  /* __IPersistFolder3_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IPersistIDList interface
 */
#ifndef __IPersistIDList_INTERFACE_DEFINED__
#define __IPersistIDList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPersistIDList, 0x1079acfc, 0x29bd, 0x11d3, 0x8e,0x0d, 0x00,0xc0,0x4f,0x68,0x37,0xd5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1079acfc-29bd-11d3-8e0d-00c04f6837d5")
IPersistIDList : public IPersist
{
    virtual HRESULT STDMETHODCALLTYPE SetIDList(
        PCIDLIST_ABSOLUTE pidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIDList(
        PIDLIST_ABSOLUTE *ppidl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPersistIDList, 0x1079acfc, 0x29bd, 0x11d3, 0x8e,0x0d, 0x00,0xc0,0x4f,0x68,0x37,0xd5)
#endif
#else
typedef struct IPersistIDListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPersistIDList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPersistIDList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPersistIDList *This);

    /*** IPersist methods ***/
    HRESULT (STDMETHODCALLTYPE *GetClassID)(
        IPersistIDList *This,
        CLSID *pClassID);

    /*** IPersistIDList methods ***/
    HRESULT (STDMETHODCALLTYPE *SetIDList)(
        IPersistIDList *This,
        PCIDLIST_ABSOLUTE pidl);

    HRESULT (STDMETHODCALLTYPE *GetIDList)(
        IPersistIDList *This,
        PIDLIST_ABSOLUTE *ppidl);

    END_INTERFACE
} IPersistIDListVtbl;

interface IPersistIDList {
    CONST_VTBL IPersistIDListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPersistIDList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPersistIDList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPersistIDList_Release(This) (This)->lpVtbl->Release(This)
/*** IPersist methods ***/
#define IPersistIDList_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
/*** IPersistIDList methods ***/
#define IPersistIDList_SetIDList(This,pidl) (This)->lpVtbl->SetIDList(This,pidl)
#define IPersistIDList_GetIDList(This,ppidl) (This)->lpVtbl->GetIDList(This,ppidl)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPersistIDList_QueryInterface(IPersistIDList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPersistIDList_AddRef(IPersistIDList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPersistIDList_Release(IPersistIDList* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersist methods ***/
static FORCEINLINE HRESULT IPersistIDList_GetClassID(IPersistIDList* This,CLSID *pClassID) {
    return This->lpVtbl->GetClassID(This,pClassID);
}
/*** IPersistIDList methods ***/
static FORCEINLINE HRESULT IPersistIDList_SetIDList(IPersistIDList* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->SetIDList(This,pidl);
}
static FORCEINLINE HRESULT IPersistIDList_GetIDList(IPersistIDList* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetIDList(This,ppidl);
}
#endif
#endif

#endif


#endif  /* __IPersistIDList_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IEnumIDList interface
 */
#ifndef __IEnumIDList_INTERFACE_DEFINED__
#define __IEnumIDList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumIDList, 0x000214f2, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214f2-0000-0000-c000-000000000046")
IEnumIDList : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        PITEMID_CHILD *rgelt,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumIDList **ppenum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumIDList, 0x000214f2, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IEnumIDListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumIDList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumIDList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumIDList *This);

    /*** IEnumIDList methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumIDList *This,
        ULONG celt,
        PITEMID_CHILD *rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumIDList *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumIDList *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumIDList *This,
        IEnumIDList **ppenum);

    END_INTERFACE
} IEnumIDListVtbl;

interface IEnumIDList {
    CONST_VTBL IEnumIDListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumIDList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumIDList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumIDList_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumIDList methods ***/
#define IEnumIDList_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IEnumIDList_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumIDList_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumIDList_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumIDList_QueryInterface(IEnumIDList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumIDList_AddRef(IEnumIDList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumIDList_Release(IEnumIDList* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumIDList methods ***/
static FORCEINLINE HRESULT IEnumIDList_Next(IEnumIDList* This,ULONG celt,PITEMID_CHILD *rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static FORCEINLINE HRESULT IEnumIDList_Skip(IEnumIDList* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumIDList_Reset(IEnumIDList* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumIDList_Clone(IEnumIDList* This,IEnumIDList **ppenum) {
    return This->lpVtbl->Clone(This,ppenum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEnumIDList_RemoteNext_Proxy(
    IEnumIDList* This,
    ULONG celt,
    PITEMID_CHILD *rgelt,
    ULONG *pceltFetched);
void __RPC_STUB IEnumIDList_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumIDList_Next_Proxy(
    IEnumIDList* This,
    ULONG celt,
    PITEMID_CHILD *rgelt,
    ULONG *pceltFetched);
HRESULT __RPC_STUB IEnumIDList_Next_Stub(
    IEnumIDList* This,
    ULONG celt,
    PITEMID_CHILD *rgelt,
    ULONG *pceltFetched);

#endif  /* __IEnumIDList_INTERFACE_DEFINED__ */

typedef IEnumIDList *LPENUMIDLIST;

/*****************************************************************************
 * IEnumFullIDList interface
 */
#ifndef __IEnumFullIDList_INTERFACE_DEFINED__
#define __IEnumFullIDList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumFullIDList, 0xd0191542, 0x7954, 0x4908, 0xbc,0x06, 0xb2,0x36,0x0b,0xbe,0x45,0xba);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d0191542-7954-4908-bc06-b2360bbe45ba")
IEnumFullIDList : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        PIDLIST_ABSOLUTE *rgelt,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumFullIDList **ppenum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumFullIDList, 0xd0191542, 0x7954, 0x4908, 0xbc,0x06, 0xb2,0x36,0x0b,0xbe,0x45,0xba)
#endif
#else
typedef struct IEnumFullIDListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumFullIDList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumFullIDList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumFullIDList *This);

    /*** IEnumFullIDList methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumFullIDList *This,
        ULONG celt,
        PIDLIST_ABSOLUTE *rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumFullIDList *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumFullIDList *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumFullIDList *This,
        IEnumFullIDList **ppenum);

    END_INTERFACE
} IEnumFullIDListVtbl;

interface IEnumFullIDList {
    CONST_VTBL IEnumFullIDListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumFullIDList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumFullIDList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumFullIDList_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumFullIDList methods ***/
#define IEnumFullIDList_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IEnumFullIDList_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumFullIDList_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumFullIDList_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumFullIDList_QueryInterface(IEnumFullIDList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumFullIDList_AddRef(IEnumFullIDList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumFullIDList_Release(IEnumFullIDList* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumFullIDList methods ***/
static FORCEINLINE HRESULT IEnumFullIDList_Next(IEnumFullIDList* This,ULONG celt,PIDLIST_ABSOLUTE *rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static FORCEINLINE HRESULT IEnumFullIDList_Skip(IEnumFullIDList* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumFullIDList_Reset(IEnumFullIDList* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumFullIDList_Clone(IEnumFullIDList* This,IEnumFullIDList **ppenum) {
    return This->lpVtbl->Clone(This,ppenum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEnumFullIDList_RemoteNext_Proxy(
    IEnumFullIDList* This,
    ULONG celt,
    PIDLIST_ABSOLUTE *rgelt,
    ULONG *pceltFetched);
void __RPC_STUB IEnumFullIDList_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumFullIDList_Next_Proxy(
    IEnumFullIDList* This,
    ULONG celt,
    PIDLIST_ABSOLUTE *rgelt,
    ULONG *pceltFetched);
HRESULT __RPC_STUB IEnumFullIDList_Next_Stub(
    IEnumFullIDList* This,
    ULONG celt,
    PIDLIST_ABSOLUTE *rgelt,
    ULONG *pceltFetched);

#endif  /* __IEnumFullIDList_INTERFACE_DEFINED__ */


enum _SHGDNF {
    SHGDN_NORMAL = 0x0,
    SHGDN_INFOLDER = 0x1,
    SHGDN_FOREDITING = 0x1000,
    SHGDN_FORADDRESSBAR = 0x4000,
    SHGDN_FORPARSING = 0x8000
};

typedef DWORD SHGDNF;

enum _SHCONTF {
    SHCONTF_CHECKING_FOR_CHILDREN = 0x10,
    SHCONTF_FOLDERS = 0x20,
    SHCONTF_NONFOLDERS = 0x40,
    SHCONTF_INCLUDEHIDDEN = 0x80,
    SHCONTF_INIT_ON_FIRST_NEXT = 0x100,
    SHCONTF_NETPRINTERSRCH = 0x200,
    SHCONTF_SHAREABLE = 0x400,
    SHCONTF_STORAGE = 0x800,
    SHCONTF_NAVIGATION_ENUM = 0x1000,
    SHCONTF_FASTITEMS = 0x2000,
    SHCONTF_FLATLIST = 0x4000,
    SHCONTF_ENABLE_ASYNC = 0x8000,
    SHCONTF_INCLUDESUPERHIDDEN = 0x10000
};

typedef DWORD SHCONTF;

#define SHCIDS_ALLFIELDS __MSABI_LONG(0x80000000)
#define SHCIDS_CANONICALONLY __MSABI_LONG(0x10000000)
#define SHCIDS_BITMASK __MSABI_LONG(0xffff0000)
#define SHCIDS_COLUMNMASK __MSABI_LONG(0x0000ffff)

#define SFGAO_CANCOPY DROPEFFECT_COPY
#define SFGAO_CANMOVE DROPEFFECT_MOVE
#define SFGAO_CANLINK DROPEFFECT_LINK
#define SFGAO_STORAGE __MSABI_LONG(0x8)
#define SFGAO_CANRENAME __MSABI_LONG(0x10)
#define SFGAO_CANDELETE __MSABI_LONG(0x20)
#define SFGAO_HASPROPSHEET __MSABI_LONG(0x40)
#define SFGAO_DROPTARGET __MSABI_LONG(0x100)

#define SFGAO_CAPABILITYMASK __MSABI_LONG(0x177)

#define SFGAO_SYSTEM __MSABI_LONG(0x1000)
#define SFGAO_ENCRYPTED __MSABI_LONG(0x2000)
#define SFGAO_ISSLOW __MSABI_LONG(0x4000)
#define SFGAO_GHOSTED __MSABI_LONG(0x8000)
#define SFGAO_LINK __MSABI_LONG(0x10000)
#define SFGAO_SHARE __MSABI_LONG(0x20000)
#define SFGAO_READONLY __MSABI_LONG(0x40000)
#define SFGAO_HIDDEN __MSABI_LONG(0x80000)

#define SFGAO_DISPLAYATTRMASK __MSABI_LONG(0xfc000)

#define SFGAO_FILESYSANCESTOR __MSABI_LONG(0x10000000)
#define SFGAO_FOLDER __MSABI_LONG(0x20000000)
#define SFGAO_FILESYSTEM __MSABI_LONG(0x40000000)
#define SFGAO_HASSUBFOLDER __MSABI_LONG(0x80000000)

#define SFGAO_CONTENTSMASK __MSABI_LONG(0x80000000)

#define SFGAO_VALIDATE __MSABI_LONG(0x1000000)
#define SFGAO_REMOVABLE __MSABI_LONG(0x2000000)
#define SFGAO_COMPRESSED __MSABI_LONG(0x4000000)
#define SFGAO_BROWSABLE __MSABI_LONG(0x8000000)
#define SFGAO_NONENUMERATED __MSABI_LONG(0x100000)
#define SFGAO_NEWCONTENT __MSABI_LONG(0x200000)
#define SFGAO_CANMONIKER __MSABI_LONG(0x400000)
#define SFGAO_HASSTORAGE __MSABI_LONG(0x400000)
#define SFGAO_STREAM __MSABI_LONG(0x400000)
#define SFGAO_STORAGEANCESTOR __MSABI_LONG(0x00800000)

#define SFGAO_STORAGECAPMASK __MSABI_LONG(0x70c50008)
#define SFGAO_PKEYSFGAOMASK __MSABI_LONG(0x81044000)

typedef ULONG SFGAOF;

#define STR_BIND_FORCE_FOLDER_SHORTCUT_RESOLVE L"Force Folder Shortcut Resolve"
#define STR_AVOID_DRIVE_RESTRICTION_POLICY L"Avoid Drive Restriction Policy"
#define STR_AVOID_DRIVE_RESTRICTION_POLICY L"Avoid Drive Restriction Policy"
#define STR_SKIP_BINDING_CLSID L"Skip Binding CLSID"
#define STR_PARSE_PREFER_FOLDER_BROWSING L"Parse Prefer Folder Browsing"
#define STR_DONT_PARSE_RELATIVE L"Don't Parse Relative"
#define STR_PARSE_TRANSLATE_ALIASES L"Parse Translate Aliases"
#define STR_PARSE_SKIP_NET_CACHE L"Skip Net Resource Cache"
#define STR_PARSE_SHELL_PROTOCOL_TO_FILE_OBJECTS L"Parse Shell Protocol To File Objects"
#if _WIN32_IE >= 0x0700
#define STR_TRACK_CLSID L"Track the CLSID"
#define STR_INTERNAL_NAVIGATE L"Internal Navigation"
#define STR_PARSE_PROPERTYSTORE L"DelegateNamedProperties"
#define STR_NO_VALIDATE_FILENAME_CHARS L"NoValidateFilenameChars"
#define STR_BIND_DELEGATE_CREATE_OBJECT L"Delegate Object Creation"
#define STR_PARSE_ALLOW_INTERNET_SHELL_FOLDERS L"Allow binding to Internet shell folder handlers and negate STR_PARSE_PREFER_WEB_BROWSING"
#define STR_PARSE_PREFER_WEB_BROWSING L"Do not bind to Internet shell folder handlers"
#define STR_PARSE_SHOW_NET_DIAGNOSTICS_UI L"Show network diagnostics UI"
#define STR_PARSE_DONT_REQUIRE_VALIDATED_URLS L"Do not require validated URLs"
#define STR_INTERNETFOLDER_PARSE_ONLY_URLMON_BINDABLE L"Validate URL"
#endif

#if NTDDI_VERSION >= NTDDI_WIN8
#define BIND_INTERRUPTABLE 0xffffffff
#endif

#if NTDDI_VERSION >= NTDDI_WIN7
#define STR_BIND_FOLDERS_READ_ONLY L"Folders As Read Only"
#define STR_BIND_FOLDER_ENUM_MODE L"Folder Enum Mode"

typedef enum FOLDER_ENUM_MODE {
    FEM_VIEWRESULT = 0,
    FEM_NAVIGATION = 1
} FOLDER_ENUM_MODE;

/*****************************************************************************
 * IObjectWithFolderEnumMode interface
 */
#ifndef __IObjectWithFolderEnumMode_INTERFACE_DEFINED__
#define __IObjectWithFolderEnumMode_INTERFACE_DEFINED__

DEFINE_GUID(IID_IObjectWithFolderEnumMode, 0x6a9d9026, 0x0e6e, 0x464c, 0xb0,0x00, 0x42,0xec,0xc0,0x7d,0xe6,0x73);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6a9d9026-0e6e-464c-b000-42ecc07de673")
IObjectWithFolderEnumMode : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetMode(
        FOLDER_ENUM_MODE feMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMode(
        FOLDER_ENUM_MODE *pfeMode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IObjectWithFolderEnumMode, 0x6a9d9026, 0x0e6e, 0x464c, 0xb0,0x00, 0x42,0xec,0xc0,0x7d,0xe6,0x73)
#endif
#else
typedef struct IObjectWithFolderEnumModeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IObjectWithFolderEnumMode *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IObjectWithFolderEnumMode *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IObjectWithFolderEnumMode *This);

    /*** IObjectWithFolderEnumMode methods ***/
    HRESULT (STDMETHODCALLTYPE *SetMode)(
        IObjectWithFolderEnumMode *This,
        FOLDER_ENUM_MODE feMode);

    HRESULT (STDMETHODCALLTYPE *GetMode)(
        IObjectWithFolderEnumMode *This,
        FOLDER_ENUM_MODE *pfeMode);

    END_INTERFACE
} IObjectWithFolderEnumModeVtbl;

interface IObjectWithFolderEnumMode {
    CONST_VTBL IObjectWithFolderEnumModeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IObjectWithFolderEnumMode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectWithFolderEnumMode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectWithFolderEnumMode_Release(This) (This)->lpVtbl->Release(This)
/*** IObjectWithFolderEnumMode methods ***/
#define IObjectWithFolderEnumMode_SetMode(This,feMode) (This)->lpVtbl->SetMode(This,feMode)
#define IObjectWithFolderEnumMode_GetMode(This,pfeMode) (This)->lpVtbl->GetMode(This,pfeMode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IObjectWithFolderEnumMode_QueryInterface(IObjectWithFolderEnumMode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IObjectWithFolderEnumMode_AddRef(IObjectWithFolderEnumMode* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IObjectWithFolderEnumMode_Release(IObjectWithFolderEnumMode* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectWithFolderEnumMode methods ***/
static FORCEINLINE HRESULT IObjectWithFolderEnumMode_SetMode(IObjectWithFolderEnumMode* This,FOLDER_ENUM_MODE feMode) {
    return This->lpVtbl->SetMode(This,feMode);
}
static FORCEINLINE HRESULT IObjectWithFolderEnumMode_GetMode(IObjectWithFolderEnumMode* This,FOLDER_ENUM_MODE *pfeMode) {
    return This->lpVtbl->GetMode(This,pfeMode);
}
#endif
#endif

#endif


#endif  /* __IObjectWithFolderEnumMode_INTERFACE_DEFINED__ */


#define STR_PARSE_WITH_EXPLICIT_PROGID L"ExplicitProgid"
#define STR_PARSE_WITH_EXPLICIT_ASSOCAPP L"ExplicitAssociationApp"
#define STR_PARSE_EXPLICIT_ASSOCIATION_SUCCESSFUL L"ExplicitAssociationSuccessful"
#define STR_PARSE_AND_CREATE_ITEM L"ParseAndCreateItem"
#define STR_PROPERTYBAG_PARAM L"SHBindCtxPropertyBag"
#define STR_ENUM_ITEMS_FLAGS L"SHCONTF"

#ifndef __IShellItem_FWD_DEFINED__
#define __IShellItem_FWD_DEFINED__
typedef interface IShellItem IShellItem;
#ifdef __cplusplus
interface IShellItem;
#endif /* __cplusplus */
#endif


/*****************************************************************************
 * IParseAndCreateItem interface
 */
#ifndef __IParseAndCreateItem_INTERFACE_DEFINED__
#define __IParseAndCreateItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IParseAndCreateItem, 0x67efed0e, 0xe827, 0x4408, 0xb4,0x93, 0x78,0xf3,0x98,0x2b,0x68,0x5c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("67efed0e-e827-4408-b493-78f3982b685c")
IParseAndCreateItem : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetItem(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItem(
        REFIID riid,
        void **ppv) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IParseAndCreateItem, 0x67efed0e, 0xe827, 0x4408, 0xb4,0x93, 0x78,0xf3,0x98,0x2b,0x68,0x5c)
#endif
#else
typedef struct IParseAndCreateItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IParseAndCreateItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IParseAndCreateItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IParseAndCreateItem *This);

    /*** IParseAndCreateItem methods ***/
    HRESULT (STDMETHODCALLTYPE *SetItem)(
        IParseAndCreateItem *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IParseAndCreateItem *This,
        REFIID riid,
        void **ppv);

    END_INTERFACE
} IParseAndCreateItemVtbl;

interface IParseAndCreateItem {
    CONST_VTBL IParseAndCreateItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IParseAndCreateItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IParseAndCreateItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IParseAndCreateItem_Release(This) (This)->lpVtbl->Release(This)
/*** IParseAndCreateItem methods ***/
#define IParseAndCreateItem_SetItem(This,psi) (This)->lpVtbl->SetItem(This,psi)
#define IParseAndCreateItem_GetItem(This,riid,ppv) (This)->lpVtbl->GetItem(This,riid,ppv)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IParseAndCreateItem_QueryInterface(IParseAndCreateItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IParseAndCreateItem_AddRef(IParseAndCreateItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IParseAndCreateItem_Release(IParseAndCreateItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IParseAndCreateItem methods ***/
static FORCEINLINE HRESULT IParseAndCreateItem_SetItem(IParseAndCreateItem* This,IShellItem *psi) {
    return This->lpVtbl->SetItem(This,psi);
}
static FORCEINLINE HRESULT IParseAndCreateItem_GetItem(IParseAndCreateItem* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetItem(This,riid,ppv);
}
#endif
#endif

#endif


#endif  /* __IParseAndCreateItem_INTERFACE_DEFINED__ */


#define STR_ITEM_CACHE_CONTEXT L"ItemCacheContext"
#endif

#ifndef __IShellFolder_FWD_DEFINED__
#define __IShellFolder_FWD_DEFINED__
typedef interface IShellFolder IShellFolder;
#ifdef __cplusplus
interface IShellFolder;
#endif /* __cplusplus */
#endif


/*****************************************************************************
 * IShellFolder interface
 */
#ifndef __IShellFolder_INTERFACE_DEFINED__
#define __IShellFolder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellFolder, 0x000214e6, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214e6-0000-0000-c000-000000000046")
IShellFolder : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ParseDisplayName(
        HWND hwnd,
        IBindCtx *pbc,
        LPWSTR pszDisplayName,
        ULONG *pchEaten,
        PIDLIST_RELATIVE *ppidl,
        ULONG *pdwAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumObjects(
        HWND hwnd,
        SHCONTF grfFlags,
        IEnumIDList **ppenumIDList) = 0;

    virtual HRESULT STDMETHODCALLTYPE BindToObject(
        PCUIDLIST_RELATIVE pidl,
        IBindCtx *pbc,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE BindToStorage(
        PCUIDLIST_RELATIVE pidl,
        IBindCtx *pbc,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE CompareIDs(
        LPARAM lParam,
        PCUIDLIST_RELATIVE pidl1,
        PCUIDLIST_RELATIVE pidl2) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateViewObject(
        HWND hwndOwner,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAttributesOf(
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        SFGAOF *rgfInOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUIObjectOf(
        HWND hwndOwner,
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        REFIID riid,
        UINT *rgfReserved,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDisplayNameOf(
        PCUITEMID_CHILD pidl,
        SHGDNF uFlags,
        STRRET *pName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetNameOf(
        HWND hwnd,
        PCUITEMID_CHILD pidl,
        LPCWSTR pszName,
        SHGDNF uFlags,
        PITEMID_CHILD *ppidlOut) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellFolder, 0x000214e6, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IShellFolderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellFolder *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellFolder *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellFolder *This);

    /*** IShellFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *ParseDisplayName)(
        IShellFolder *This,
        HWND hwnd,
        IBindCtx *pbc,
        LPWSTR pszDisplayName,
        ULONG *pchEaten,
        PIDLIST_RELATIVE *ppidl,
        ULONG *pdwAttributes);

    HRESULT (STDMETHODCALLTYPE *EnumObjects)(
        IShellFolder *This,
        HWND hwnd,
        SHCONTF grfFlags,
        IEnumIDList **ppenumIDList);

    HRESULT (STDMETHODCALLTYPE *BindToObject)(
        IShellFolder *This,
        PCUIDLIST_RELATIVE pidl,
        IBindCtx *pbc,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *BindToStorage)(
        IShellFolder *This,
        PCUIDLIST_RELATIVE pidl,
        IBindCtx *pbc,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *CompareIDs)(
        IShellFolder *This,
        LPARAM lParam,
        PCUIDLIST_RELATIVE pidl1,
        PCUIDLIST_RELATIVE pidl2);

    HRESULT (STDMETHODCALLTYPE *CreateViewObject)(
        IShellFolder *This,
        HWND hwndOwner,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetAttributesOf)(
        IShellFolder *This,
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        SFGAOF *rgfInOut);

    HRESULT (STDMETHODCALLTYPE *GetUIObjectOf)(
        IShellFolder *This,
        HWND hwndOwner,
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        REFIID riid,
        UINT *rgfReserved,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetDisplayNameOf)(
        IShellFolder *This,
        PCUITEMID_CHILD pidl,
        SHGDNF uFlags,
        STRRET *pName);

    HRESULT (STDMETHODCALLTYPE *SetNameOf)(
        IShellFolder *This,
        HWND hwnd,
        PCUITEMID_CHILD pidl,
        LPCWSTR pszName,
        SHGDNF uFlags,
        PITEMID_CHILD *ppidlOut);

    END_INTERFACE
} IShellFolderVtbl;

interface IShellFolder {
    CONST_VTBL IShellFolderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellFolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellFolder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellFolder_Release(This) (This)->lpVtbl->Release(This)
/*** IShellFolder methods ***/
#define IShellFolder_ParseDisplayName(This,hwnd,pbc,pszDisplayName,pchEaten,ppidl,pdwAttributes) (This)->lpVtbl->ParseDisplayName(This,hwnd,pbc,pszDisplayName,pchEaten,ppidl,pdwAttributes)
#define IShellFolder_EnumObjects(This,hwnd,grfFlags,ppenumIDList) (This)->lpVtbl->EnumObjects(This,hwnd,grfFlags,ppenumIDList)
#define IShellFolder_BindToObject(This,pidl,pbc,riid,ppv) (This)->lpVtbl->BindToObject(This,pidl,pbc,riid,ppv)
#define IShellFolder_BindToStorage(This,pidl,pbc,riid,ppv) (This)->lpVtbl->BindToStorage(This,pidl,pbc,riid,ppv)
#define IShellFolder_CompareIDs(This,lParam,pidl1,pidl2) (This)->lpVtbl->CompareIDs(This,lParam,pidl1,pidl2)
#define IShellFolder_CreateViewObject(This,hwndOwner,riid,ppv) (This)->lpVtbl->CreateViewObject(This,hwndOwner,riid,ppv)
#define IShellFolder_GetAttributesOf(This,cidl,apidl,rgfInOut) (This)->lpVtbl->GetAttributesOf(This,cidl,apidl,rgfInOut)
#define IShellFolder_GetUIObjectOf(This,hwndOwner,cidl,apidl,riid,rgfReserved,ppv) (This)->lpVtbl->GetUIObjectOf(This,hwndOwner,cidl,apidl,riid,rgfReserved,ppv)
#define IShellFolder_GetDisplayNameOf(This,pidl,uFlags,pName) (This)->lpVtbl->GetDisplayNameOf(This,pidl,uFlags,pName)
#define IShellFolder_SetNameOf(This,hwnd,pidl,pszName,uFlags,ppidlOut) (This)->lpVtbl->SetNameOf(This,hwnd,pidl,pszName,uFlags,ppidlOut)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellFolder_QueryInterface(IShellFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellFolder_AddRef(IShellFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellFolder_Release(IShellFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellFolder methods ***/
static FORCEINLINE HRESULT IShellFolder_ParseDisplayName(IShellFolder* This,HWND hwnd,IBindCtx *pbc,LPWSTR pszDisplayName,ULONG *pchEaten,PIDLIST_RELATIVE *ppidl,ULONG *pdwAttributes) {
    return This->lpVtbl->ParseDisplayName(This,hwnd,pbc,pszDisplayName,pchEaten,ppidl,pdwAttributes);
}
static FORCEINLINE HRESULT IShellFolder_EnumObjects(IShellFolder* This,HWND hwnd,SHCONTF grfFlags,IEnumIDList **ppenumIDList) {
    return This->lpVtbl->EnumObjects(This,hwnd,grfFlags,ppenumIDList);
}
static FORCEINLINE HRESULT IShellFolder_BindToObject(IShellFolder* This,PCUIDLIST_RELATIVE pidl,IBindCtx *pbc,REFIID riid,void **ppv) {
    return This->lpVtbl->BindToObject(This,pidl,pbc,riid,ppv);
}
static FORCEINLINE HRESULT IShellFolder_BindToStorage(IShellFolder* This,PCUIDLIST_RELATIVE pidl,IBindCtx *pbc,REFIID riid,void **ppv) {
    return This->lpVtbl->BindToStorage(This,pidl,pbc,riid,ppv);
}
static FORCEINLINE HRESULT IShellFolder_CompareIDs(IShellFolder* This,LPARAM lParam,PCUIDLIST_RELATIVE pidl1,PCUIDLIST_RELATIVE pidl2) {
    return This->lpVtbl->CompareIDs(This,lParam,pidl1,pidl2);
}
static FORCEINLINE HRESULT IShellFolder_CreateViewObject(IShellFolder* This,HWND hwndOwner,REFIID riid,void **ppv) {
    return This->lpVtbl->CreateViewObject(This,hwndOwner,riid,ppv);
}
static FORCEINLINE HRESULT IShellFolder_GetAttributesOf(IShellFolder* This,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,SFGAOF *rgfInOut) {
    return This->lpVtbl->GetAttributesOf(This,cidl,apidl,rgfInOut);
}
static FORCEINLINE HRESULT IShellFolder_GetUIObjectOf(IShellFolder* This,HWND hwndOwner,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,REFIID riid,UINT *rgfReserved,void **ppv) {
    return This->lpVtbl->GetUIObjectOf(This,hwndOwner,cidl,apidl,riid,rgfReserved,ppv);
}
static FORCEINLINE HRESULT IShellFolder_GetDisplayNameOf(IShellFolder* This,PCUITEMID_CHILD pidl,SHGDNF uFlags,STRRET *pName) {
    return This->lpVtbl->GetDisplayNameOf(This,pidl,uFlags,pName);
}
static FORCEINLINE HRESULT IShellFolder_SetNameOf(IShellFolder* This,HWND hwnd,PCUITEMID_CHILD pidl,LPCWSTR pszName,SHGDNF uFlags,PITEMID_CHILD *ppidlOut) {
    return This->lpVtbl->SetNameOf(This,hwnd,pidl,pszName,uFlags,ppidlOut);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IShellFolder_RemoteSetNameOf_Proxy(
    IShellFolder* This,
    HWND hwnd,
    PCUITEMID_CHILD pidl,
    LPCWSTR pszName,
    SHGDNF uFlags,
    PITEMID_CHILD *ppidlOut);
void __RPC_STUB IShellFolder_RemoteSetNameOf_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IShellFolder_SetNameOf_Proxy(
    IShellFolder* This,
    HWND hwnd,
    PCUITEMID_CHILD pidl,
    LPCWSTR pszName,
    SHGDNF uFlags,
    PITEMID_CHILD *ppidlOut);
HRESULT __RPC_STUB IShellFolder_SetNameOf_Stub(
    IShellFolder* This,
    HWND hwnd,
    PCUITEMID_CHILD pidl,
    LPCWSTR pszName,
    SHGDNF uFlags,
    PITEMID_CHILD *ppidlOut);

#endif  /* __IShellFolder_INTERFACE_DEFINED__ */

typedef IShellFolder *LPSHELLFOLDER;

typedef struct EXTRASEARCH {
    GUID guidSearch;
    WCHAR wszFriendlyName[80];
    WCHAR wszUrl[2084];
} EXTRASEARCH;
typedef struct EXTRASEARCH *LPEXTRASEARCH;

/*****************************************************************************
 * IEnumExtraSearch interface
 */
#ifndef __IEnumExtraSearch_INTERFACE_DEFINED__
#define __IEnumExtraSearch_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumExtraSearch, 0x0e700be1, 0x9db6, 0x11d1, 0xa1,0xce, 0x00,0xc0,0x4f,0xd7,0x5d,0x13);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0e700be1-9db6-11d1-a1ce-00c04fd75d13")
IEnumExtraSearch : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        EXTRASEARCH *rgelt,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumExtraSearch **ppenum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumExtraSearch, 0x0e700be1, 0x9db6, 0x11d1, 0xa1,0xce, 0x00,0xc0,0x4f,0xd7,0x5d,0x13)
#endif
#else
typedef struct IEnumExtraSearchVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumExtraSearch *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumExtraSearch *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumExtraSearch *This);

    /*** IEnumExtraSearch methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumExtraSearch *This,
        ULONG celt,
        EXTRASEARCH *rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumExtraSearch *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumExtraSearch *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumExtraSearch *This,
        IEnumExtraSearch **ppenum);

    END_INTERFACE
} IEnumExtraSearchVtbl;

interface IEnumExtraSearch {
    CONST_VTBL IEnumExtraSearchVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumExtraSearch_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumExtraSearch_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumExtraSearch_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumExtraSearch methods ***/
#define IEnumExtraSearch_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IEnumExtraSearch_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumExtraSearch_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumExtraSearch_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumExtraSearch_QueryInterface(IEnumExtraSearch* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumExtraSearch_AddRef(IEnumExtraSearch* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumExtraSearch_Release(IEnumExtraSearch* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumExtraSearch methods ***/
static FORCEINLINE HRESULT IEnumExtraSearch_Next(IEnumExtraSearch* This,ULONG celt,EXTRASEARCH *rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static FORCEINLINE HRESULT IEnumExtraSearch_Skip(IEnumExtraSearch* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumExtraSearch_Reset(IEnumExtraSearch* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumExtraSearch_Clone(IEnumExtraSearch* This,IEnumExtraSearch **ppenum) {
    return This->lpVtbl->Clone(This,ppenum);
}
#endif
#endif

#endif


#endif  /* __IEnumExtraSearch_INTERFACE_DEFINED__ */

typedef IEnumExtraSearch *LPENUMEXTRASEARCH;

/*****************************************************************************
 * IShellFolder2 interface
 */
#ifndef __IShellFolder2_INTERFACE_DEFINED__
#define __IShellFolder2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellFolder2, 0x93f2f68c, 0x1d1b, 0x11d3, 0xa3,0x0e, 0x00,0xc0,0x4f,0x79,0xab,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("93f2f68c-1d1b-11d3-a30e-00c04f79abd1")
IShellFolder2 : public IShellFolder
{
    virtual HRESULT STDMETHODCALLTYPE GetDefaultSearchGUID(
        GUID *pguid) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumSearches(
        IEnumExtraSearch **ppenum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultColumn(
        DWORD dwRes,
        ULONG *pSort,
        ULONG *pDisplay) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultColumnState(
        UINT iColumn,
        SHCOLSTATEF *pcsFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDetailsEx(
        PCUITEMID_CHILD pidl,
        const SHCOLUMNID *pscid,
        VARIANT *pv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDetailsOf(
        PCUITEMID_CHILD pidl,
        UINT iColumn,
        SHELLDETAILS *psd) = 0;

    virtual HRESULT STDMETHODCALLTYPE MapColumnToSCID(
        UINT iColumn,
        SHCOLUMNID *pscid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellFolder2, 0x93f2f68c, 0x1d1b, 0x11d3, 0xa3,0x0e, 0x00,0xc0,0x4f,0x79,0xab,0xd1)
#endif
#else
typedef struct IShellFolder2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellFolder2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellFolder2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellFolder2 *This);

    /*** IShellFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *ParseDisplayName)(
        IShellFolder2 *This,
        HWND hwnd,
        IBindCtx *pbc,
        LPWSTR pszDisplayName,
        ULONG *pchEaten,
        PIDLIST_RELATIVE *ppidl,
        ULONG *pdwAttributes);

    HRESULT (STDMETHODCALLTYPE *EnumObjects)(
        IShellFolder2 *This,
        HWND hwnd,
        SHCONTF grfFlags,
        IEnumIDList **ppenumIDList);

    HRESULT (STDMETHODCALLTYPE *BindToObject)(
        IShellFolder2 *This,
        PCUIDLIST_RELATIVE pidl,
        IBindCtx *pbc,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *BindToStorage)(
        IShellFolder2 *This,
        PCUIDLIST_RELATIVE pidl,
        IBindCtx *pbc,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *CompareIDs)(
        IShellFolder2 *This,
        LPARAM lParam,
        PCUIDLIST_RELATIVE pidl1,
        PCUIDLIST_RELATIVE pidl2);

    HRESULT (STDMETHODCALLTYPE *CreateViewObject)(
        IShellFolder2 *This,
        HWND hwndOwner,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetAttributesOf)(
        IShellFolder2 *This,
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        SFGAOF *rgfInOut);

    HRESULT (STDMETHODCALLTYPE *GetUIObjectOf)(
        IShellFolder2 *This,
        HWND hwndOwner,
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        REFIID riid,
        UINT *rgfReserved,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetDisplayNameOf)(
        IShellFolder2 *This,
        PCUITEMID_CHILD pidl,
        SHGDNF uFlags,
        STRRET *pName);

    HRESULT (STDMETHODCALLTYPE *SetNameOf)(
        IShellFolder2 *This,
        HWND hwnd,
        PCUITEMID_CHILD pidl,
        LPCWSTR pszName,
        SHGDNF uFlags,
        PITEMID_CHILD *ppidlOut);

    /*** IShellFolder2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDefaultSearchGUID)(
        IShellFolder2 *This,
        GUID *pguid);

    HRESULT (STDMETHODCALLTYPE *EnumSearches)(
        IShellFolder2 *This,
        IEnumExtraSearch **ppenum);

    HRESULT (STDMETHODCALLTYPE *GetDefaultColumn)(
        IShellFolder2 *This,
        DWORD dwRes,
        ULONG *pSort,
        ULONG *pDisplay);

    HRESULT (STDMETHODCALLTYPE *GetDefaultColumnState)(
        IShellFolder2 *This,
        UINT iColumn,
        SHCOLSTATEF *pcsFlags);

    HRESULT (STDMETHODCALLTYPE *GetDetailsEx)(
        IShellFolder2 *This,
        PCUITEMID_CHILD pidl,
        const SHCOLUMNID *pscid,
        VARIANT *pv);

    HRESULT (STDMETHODCALLTYPE *GetDetailsOf)(
        IShellFolder2 *This,
        PCUITEMID_CHILD pidl,
        UINT iColumn,
        SHELLDETAILS *psd);

    HRESULT (STDMETHODCALLTYPE *MapColumnToSCID)(
        IShellFolder2 *This,
        UINT iColumn,
        SHCOLUMNID *pscid);

    END_INTERFACE
} IShellFolder2Vtbl;

interface IShellFolder2 {
    CONST_VTBL IShellFolder2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellFolder2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellFolder2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellFolder2_Release(This) (This)->lpVtbl->Release(This)
/*** IShellFolder methods ***/
#define IShellFolder2_ParseDisplayName(This,hwnd,pbc,pszDisplayName,pchEaten,ppidl,pdwAttributes) (This)->lpVtbl->ParseDisplayName(This,hwnd,pbc,pszDisplayName,pchEaten,ppidl,pdwAttributes)
#define IShellFolder2_EnumObjects(This,hwnd,grfFlags,ppenumIDList) (This)->lpVtbl->EnumObjects(This,hwnd,grfFlags,ppenumIDList)
#define IShellFolder2_BindToObject(This,pidl,pbc,riid,ppv) (This)->lpVtbl->BindToObject(This,pidl,pbc,riid,ppv)
#define IShellFolder2_BindToStorage(This,pidl,pbc,riid,ppv) (This)->lpVtbl->BindToStorage(This,pidl,pbc,riid,ppv)
#define IShellFolder2_CompareIDs(This,lParam,pidl1,pidl2) (This)->lpVtbl->CompareIDs(This,lParam,pidl1,pidl2)
#define IShellFolder2_CreateViewObject(This,hwndOwner,riid,ppv) (This)->lpVtbl->CreateViewObject(This,hwndOwner,riid,ppv)
#define IShellFolder2_GetAttributesOf(This,cidl,apidl,rgfInOut) (This)->lpVtbl->GetAttributesOf(This,cidl,apidl,rgfInOut)
#define IShellFolder2_GetUIObjectOf(This,hwndOwner,cidl,apidl,riid,rgfReserved,ppv) (This)->lpVtbl->GetUIObjectOf(This,hwndOwner,cidl,apidl,riid,rgfReserved,ppv)
#define IShellFolder2_GetDisplayNameOf(This,pidl,uFlags,pName) (This)->lpVtbl->GetDisplayNameOf(This,pidl,uFlags,pName)
#define IShellFolder2_SetNameOf(This,hwnd,pidl,pszName,uFlags,ppidlOut) (This)->lpVtbl->SetNameOf(This,hwnd,pidl,pszName,uFlags,ppidlOut)
/*** IShellFolder2 methods ***/
#define IShellFolder2_GetDefaultSearchGUID(This,pguid) (This)->lpVtbl->GetDefaultSearchGUID(This,pguid)
#define IShellFolder2_EnumSearches(This,ppenum) (This)->lpVtbl->EnumSearches(This,ppenum)
#define IShellFolder2_GetDefaultColumn(This,dwRes,pSort,pDisplay) (This)->lpVtbl->GetDefaultColumn(This,dwRes,pSort,pDisplay)
#define IShellFolder2_GetDefaultColumnState(This,iColumn,pcsFlags) (This)->lpVtbl->GetDefaultColumnState(This,iColumn,pcsFlags)
#define IShellFolder2_GetDetailsEx(This,pidl,pscid,pv) (This)->lpVtbl->GetDetailsEx(This,pidl,pscid,pv)
#define IShellFolder2_GetDetailsOf(This,pidl,iColumn,psd) (This)->lpVtbl->GetDetailsOf(This,pidl,iColumn,psd)
#define IShellFolder2_MapColumnToSCID(This,iColumn,pscid) (This)->lpVtbl->MapColumnToSCID(This,iColumn,pscid)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellFolder2_QueryInterface(IShellFolder2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellFolder2_AddRef(IShellFolder2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellFolder2_Release(IShellFolder2* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellFolder methods ***/
static FORCEINLINE HRESULT IShellFolder2_ParseDisplayName(IShellFolder2* This,HWND hwnd,IBindCtx *pbc,LPWSTR pszDisplayName,ULONG *pchEaten,PIDLIST_RELATIVE *ppidl,ULONG *pdwAttributes) {
    return This->lpVtbl->ParseDisplayName(This,hwnd,pbc,pszDisplayName,pchEaten,ppidl,pdwAttributes);
}
static FORCEINLINE HRESULT IShellFolder2_EnumObjects(IShellFolder2* This,HWND hwnd,SHCONTF grfFlags,IEnumIDList **ppenumIDList) {
    return This->lpVtbl->EnumObjects(This,hwnd,grfFlags,ppenumIDList);
}
static FORCEINLINE HRESULT IShellFolder2_BindToObject(IShellFolder2* This,PCUIDLIST_RELATIVE pidl,IBindCtx *pbc,REFIID riid,void **ppv) {
    return This->lpVtbl->BindToObject(This,pidl,pbc,riid,ppv);
}
static FORCEINLINE HRESULT IShellFolder2_BindToStorage(IShellFolder2* This,PCUIDLIST_RELATIVE pidl,IBindCtx *pbc,REFIID riid,void **ppv) {
    return This->lpVtbl->BindToStorage(This,pidl,pbc,riid,ppv);
}
static FORCEINLINE HRESULT IShellFolder2_CompareIDs(IShellFolder2* This,LPARAM lParam,PCUIDLIST_RELATIVE pidl1,PCUIDLIST_RELATIVE pidl2) {
    return This->lpVtbl->CompareIDs(This,lParam,pidl1,pidl2);
}
static FORCEINLINE HRESULT IShellFolder2_CreateViewObject(IShellFolder2* This,HWND hwndOwner,REFIID riid,void **ppv) {
    return This->lpVtbl->CreateViewObject(This,hwndOwner,riid,ppv);
}
static FORCEINLINE HRESULT IShellFolder2_GetAttributesOf(IShellFolder2* This,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,SFGAOF *rgfInOut) {
    return This->lpVtbl->GetAttributesOf(This,cidl,apidl,rgfInOut);
}
static FORCEINLINE HRESULT IShellFolder2_GetUIObjectOf(IShellFolder2* This,HWND hwndOwner,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,REFIID riid,UINT *rgfReserved,void **ppv) {
    return This->lpVtbl->GetUIObjectOf(This,hwndOwner,cidl,apidl,riid,rgfReserved,ppv);
}
static FORCEINLINE HRESULT IShellFolder2_GetDisplayNameOf(IShellFolder2* This,PCUITEMID_CHILD pidl,SHGDNF uFlags,STRRET *pName) {
    return This->lpVtbl->GetDisplayNameOf(This,pidl,uFlags,pName);
}
static FORCEINLINE HRESULT IShellFolder2_SetNameOf(IShellFolder2* This,HWND hwnd,PCUITEMID_CHILD pidl,LPCWSTR pszName,SHGDNF uFlags,PITEMID_CHILD *ppidlOut) {
    return This->lpVtbl->SetNameOf(This,hwnd,pidl,pszName,uFlags,ppidlOut);
}
/*** IShellFolder2 methods ***/
static FORCEINLINE HRESULT IShellFolder2_GetDefaultSearchGUID(IShellFolder2* This,GUID *pguid) {
    return This->lpVtbl->GetDefaultSearchGUID(This,pguid);
}
static FORCEINLINE HRESULT IShellFolder2_EnumSearches(IShellFolder2* This,IEnumExtraSearch **ppenum) {
    return This->lpVtbl->EnumSearches(This,ppenum);
}
static FORCEINLINE HRESULT IShellFolder2_GetDefaultColumn(IShellFolder2* This,DWORD dwRes,ULONG *pSort,ULONG *pDisplay) {
    return This->lpVtbl->GetDefaultColumn(This,dwRes,pSort,pDisplay);
}
static FORCEINLINE HRESULT IShellFolder2_GetDefaultColumnState(IShellFolder2* This,UINT iColumn,SHCOLSTATEF *pcsFlags) {
    return This->lpVtbl->GetDefaultColumnState(This,iColumn,pcsFlags);
}
static FORCEINLINE HRESULT IShellFolder2_GetDetailsEx(IShellFolder2* This,PCUITEMID_CHILD pidl,const SHCOLUMNID *pscid,VARIANT *pv) {
    return This->lpVtbl->GetDetailsEx(This,pidl,pscid,pv);
}
static FORCEINLINE HRESULT IShellFolder2_GetDetailsOf(IShellFolder2* This,PCUITEMID_CHILD pidl,UINT iColumn,SHELLDETAILS *psd) {
    return This->lpVtbl->GetDetailsOf(This,pidl,iColumn,psd);
}
static FORCEINLINE HRESULT IShellFolder2_MapColumnToSCID(IShellFolder2* This,UINT iColumn,SHCOLUMNID *pscid) {
    return This->lpVtbl->MapColumnToSCID(This,iColumn,pscid);
}
#endif
#endif

#endif


#endif  /* __IShellFolder2_INTERFACE_DEFINED__ */

typedef char *LPVIEWSETTINGS;

typedef enum FOLDERFLAGS {
    FWF_NONE = 0x0,
    FWF_AUTOARRANGE = 0x1,
    FWF_ABBREVIATEDNAMES = 0x2,
    FWF_SNAPTOGRID = 0x4,
    FWF_OWNERDATA = 0x8,
    FWF_BESTFITWINDOW = 0x10,
    FWF_DESKTOP = 0x20,
    FWF_SINGLESEL = 0x40,
    FWF_NOSUBFOLDERS = 0x80,
    FWF_TRANSPARENT = 0x100,
    FWF_NOCLIENTEDGE = 0x200,
    FWF_NOSCROLL = 0x400,
    FWF_ALIGNLEFT = 0x800,
    FWF_NOICONS = 0x1000,
    FWF_SHOWSELALWAYS = 0x2000,
    FWF_NOVISIBLE = 0x4000,
    FWF_SINGLECLICKACTIVATE = 0x8000,
    FWF_NOWEBVIEW = 0x10000,
    FWF_HIDEFILENAMES = 0x20000,
    FWF_CHECKSELECT = 0x40000,
    FWF_NOENUMREFRESH = 0x80000,
    FWF_NOGROUPING = 0x100000,
    FWF_FULLROWSELECT = 0x200000,
    FWF_NOFILTERS = 0x400000,
    FWF_NOCOLUMNHEADER = 0x800000,
    FWF_NOHEADERINALLVIEWS = 0x1000000,
    FWF_EXTENDEDTILES = 0x2000000,
    FWF_TRICHECKSELECT = 0x4000000,
    FWF_AUTOCHECKSELECT = 0x8000000,
    FWF_NOBROWSERVIEWSTATE = 0x10000000,
    FWF_SUBSETGROUPS = 0x20000000,
    FWF_USESEARCHFOLDER = 0x40000000,
    FWF_ALLOWRTLREADING = 0x80000000
} FOLDERFLAGS;

DEFINE_ENUM_FLAG_OPERATORS(FOLDERFLAGS)

typedef enum FOLDERVIEWMODE {
    FVM_AUTO = -1,
    FVM_FIRST = 1,
    FVM_ICON = 1,
    FVM_SMALLICON = 2,
    FVM_LIST = 3,
    FVM_DETAILS = 4,
    FVM_THUMBNAIL = 5,
    FVM_TILE = 6,
    FVM_THUMBSTRIP = 7,
    FVM_CONTENT = 8,
    FVM_LAST = 8
} FOLDERVIEWMODE;

#if NTDDI_VERSION >= NTDDI_VISTA
typedef enum FOLDERLOGICALVIEWMODE {
    FLVM_UNSPECIFIED = -1,
    FLVM_FIRST = 1,
    FLVM_DETAILS = 1,
    FLVM_TILES = 2,
    FLVM_ICONS = 3,
    FLVM_LIST = 4,
    FLVM_CONTENT = 5,
    FLVM_LAST = 5
} FOLDERLOGICALVIEWMODE;
#endif
typedef struct FOLDERSETTINGS {
    UINT ViewMode;
    UINT fFlags;
} FOLDERSETTINGS;

typedef FOLDERSETTINGS *LPFOLDERSETTINGS;
typedef const FOLDERSETTINGS *LPCFOLDERSETTINGS;
typedef FOLDERSETTINGS *PFOLDERSETTINGS;

/*****************************************************************************
 * IFolderViewOptions interface
 */
#ifndef __IFolderViewOptions_INTERFACE_DEFINED__
#define __IFolderViewOptions_INTERFACE_DEFINED__

typedef enum FOLDERVIEWOPTIONS {
    FVO_DEFAULT = 0x0,
    FVO_VISTALAYOUT = 0x1,
    FVO_CUSTOMPOSITION = 0x2,
    FVO_CUSTOMORDERING = 0x4,
    FVO_SUPPORTHYPERLINKS = 0x8,
    FVO_NOANIMATIONS = 0x10,
    FVO_NOSCROLLTIPS = 0x20
} FOLDERVIEWOPTIONS;

DEFINE_ENUM_FLAG_OPERATORS(FOLDERVIEWOPTIONS)

DEFINE_GUID(IID_IFolderViewOptions, 0x3cc974d2, 0xb302, 0x4d36, 0xad,0x3e, 0x06,0xd9,0x3f,0x69,0x5d,0x3f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3cc974d2-b302-4d36-ad3e-06d93f695d3f")
IFolderViewOptions : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetFolderViewOptions(
        FOLDERVIEWOPTIONS fvoMask,
        FOLDERVIEWOPTIONS fvoFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolderViewOptions(
        FOLDERVIEWOPTIONS *pfvoFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFolderViewOptions, 0x3cc974d2, 0xb302, 0x4d36, 0xad,0x3e, 0x06,0xd9,0x3f,0x69,0x5d,0x3f)
#endif
#else
typedef struct IFolderViewOptionsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFolderViewOptions *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFolderViewOptions *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFolderViewOptions *This);

    /*** IFolderViewOptions methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFolderViewOptions)(
        IFolderViewOptions *This,
        FOLDERVIEWOPTIONS fvoMask,
        FOLDERVIEWOPTIONS fvoFlags);

    HRESULT (STDMETHODCALLTYPE *GetFolderViewOptions)(
        IFolderViewOptions *This,
        FOLDERVIEWOPTIONS *pfvoFlags);

    END_INTERFACE
} IFolderViewOptionsVtbl;

interface IFolderViewOptions {
    CONST_VTBL IFolderViewOptionsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFolderViewOptions_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFolderViewOptions_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFolderViewOptions_Release(This) (This)->lpVtbl->Release(This)
/*** IFolderViewOptions methods ***/
#define IFolderViewOptions_SetFolderViewOptions(This,fvoMask,fvoFlags) (This)->lpVtbl->SetFolderViewOptions(This,fvoMask,fvoFlags)
#define IFolderViewOptions_GetFolderViewOptions(This,pfvoFlags) (This)->lpVtbl->GetFolderViewOptions(This,pfvoFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFolderViewOptions_QueryInterface(IFolderViewOptions* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFolderViewOptions_AddRef(IFolderViewOptions* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFolderViewOptions_Release(IFolderViewOptions* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderViewOptions methods ***/
static FORCEINLINE HRESULT IFolderViewOptions_SetFolderViewOptions(IFolderViewOptions* This,FOLDERVIEWOPTIONS fvoMask,FOLDERVIEWOPTIONS fvoFlags) {
    return This->lpVtbl->SetFolderViewOptions(This,fvoMask,fvoFlags);
}
static FORCEINLINE HRESULT IFolderViewOptions_GetFolderViewOptions(IFolderViewOptions* This,FOLDERVIEWOPTIONS *pfvoFlags) {
    return This->lpVtbl->GetFolderViewOptions(This,pfvoFlags);
}
#endif
#endif

#endif


#endif  /* __IFolderViewOptions_INTERFACE_DEFINED__ */

typedef enum _SVSIF {
    SVSI_DESELECT = 0x0,
    SVSI_SELECT = 0x1,
    SVSI_EDIT = 0x3,
    SVSI_DESELECTOTHERS = 0x4,
    SVSI_ENSUREVISIBLE = 0x8,
    SVSI_FOCUSED = 0x10,
    SVSI_TRANSLATEPT = 0x20,
    SVSI_SELECTIONMARK = 0x40,
    SVSI_POSITIONITEM = 0x80,
    SVSI_CHECK = 0x100,
    SVSI_CHECK2 = 0x200,
    SVSI_KEYBOARDSELECT = 0x401,
    SVSI_NOTAKEFOCUS = 0x40000000
} _SVSIF;

#define SVSI_NOSTATECHANGE   ((UINT)0x80000000)

typedef UINT SVSIF;

typedef enum _SVGIO {
    SVGIO_BACKGROUND = 0x0,
    SVGIO_SELECTION = 0x1,
    SVGIO_ALLVIEW = 0x2,
    SVGIO_CHECKED = 0x3,
    SVGIO_TYPE_MASK = 0xf,
    SVGIO_FLAG_VIEWORDER = 0x80000000
} _SVGIO;

DEFINE_ENUM_FLAG_OPERATORS(_SVGIO)

typedef int SVGIO;

typedef enum SVUIA_STATUS {
    SVUIA_DEACTIVATE = 0,
    SVUIA_ACTIVATE_NOFOCUS = 1,
    SVUIA_ACTIVATE_FOCUS = 2,
    SVUIA_INPLACEACTIVATE = 3
} SVUIA_STATUS;

#ifdef _FIX_ENABLEMODELESS_CONFLICT
#define EnableModeless EnableModelessSV
#endif

#if 0
typedef LPARAM LPFNSVADDPROPSHEETPAGE;
#else
#include <prsht.h>
typedef LPFNADDPROPSHEETPAGE LPFNSVADDPROPSHEETPAGE;
#endif

#ifndef __IShellBrowser_FWD_DEFINED__
#define __IShellBrowser_FWD_DEFINED__
typedef interface IShellBrowser IShellBrowser;
#ifdef __cplusplus
interface IShellBrowser;
#endif /* __cplusplus */
#endif


/*****************************************************************************
 * IShellView interface
 */
#ifndef __IShellView_INTERFACE_DEFINED__
#define __IShellView_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellView, 0x000214e3, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214e3-0000-0000-c000-000000000046")
IShellView : public IOleWindow
{
    virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(
        MSG *pmsg) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableModeless(
        WINBOOL fEnable) = 0;

    virtual HRESULT STDMETHODCALLTYPE UIActivate(
        UINT uState) = 0;

    virtual HRESULT STDMETHODCALLTYPE Refresh(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateViewWindow(
        IShellView *psvPrevious,
        LPCFOLDERSETTINGS pfs,
        IShellBrowser *psb,
        RECT *prcView,
        HWND *phWnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE DestroyViewWindow(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentInfo(
        LPFOLDERSETTINGS pfs) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddPropertySheetPages(
        DWORD dwReserved,
        LPFNSVADDPROPSHEETPAGE pfn,
        LPARAM lparam) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveViewState(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectItem(
        PCUITEMID_CHILD pidlItem,
        SVSIF uFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItemObject(
        UINT uItem,
        REFIID riid,
        void **ppv) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellView, 0x000214e3, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IShellViewVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellView *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellView *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellView *This);

    /*** IOleWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IShellView *This,
        HWND *phwnd);

    HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)(
        IShellView *This,
        WINBOOL fEnterMode);

    /*** IShellView methods ***/
    HRESULT (STDMETHODCALLTYPE *TranslateAccelerator)(
        IShellView *This,
        MSG *pmsg);

    HRESULT (STDMETHODCALLTYPE *EnableModeless)(
        IShellView *This,
        WINBOOL fEnable);

    HRESULT (STDMETHODCALLTYPE *UIActivate)(
        IShellView *This,
        UINT uState);

    HRESULT (STDMETHODCALLTYPE *Refresh)(
        IShellView *This);

    HRESULT (STDMETHODCALLTYPE *CreateViewWindow)(
        IShellView *This,
        IShellView *psvPrevious,
        LPCFOLDERSETTINGS pfs,
        IShellBrowser *psb,
        RECT *prcView,
        HWND *phWnd);

    HRESULT (STDMETHODCALLTYPE *DestroyViewWindow)(
        IShellView *This);

    HRESULT (STDMETHODCALLTYPE *GetCurrentInfo)(
        IShellView *This,
        LPFOLDERSETTINGS pfs);

    HRESULT (STDMETHODCALLTYPE *AddPropertySheetPages)(
        IShellView *This,
        DWORD dwReserved,
        LPFNSVADDPROPSHEETPAGE pfn,
        LPARAM lparam);

    HRESULT (STDMETHODCALLTYPE *SaveViewState)(
        IShellView *This);

    HRESULT (STDMETHODCALLTYPE *SelectItem)(
        IShellView *This,
        PCUITEMID_CHILD pidlItem,
        SVSIF uFlags);

    HRESULT (STDMETHODCALLTYPE *GetItemObject)(
        IShellView *This,
        UINT uItem,
        REFIID riid,
        void **ppv);

    END_INTERFACE
} IShellViewVtbl;

interface IShellView {
    CONST_VTBL IShellViewVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellView_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellView_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellView_Release(This) (This)->lpVtbl->Release(This)
/*** IOleWindow methods ***/
#define IShellView_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IShellView_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
/*** IShellView methods ***/
#define IShellView_TranslateAccelerator(This,pmsg) (This)->lpVtbl->TranslateAccelerator(This,pmsg)
#define IShellView_EnableModeless(This,fEnable) (This)->lpVtbl->EnableModeless(This,fEnable)
#define IShellView_UIActivate(This,uState) (This)->lpVtbl->UIActivate(This,uState)
#define IShellView_Refresh(This) (This)->lpVtbl->Refresh(This)
#define IShellView_CreateViewWindow(This,psvPrevious,pfs,psb,prcView,phWnd) (This)->lpVtbl->CreateViewWindow(This,psvPrevious,pfs,psb,prcView,phWnd)
#define IShellView_DestroyViewWindow(This) (This)->lpVtbl->DestroyViewWindow(This)
#define IShellView_GetCurrentInfo(This,pfs) (This)->lpVtbl->GetCurrentInfo(This,pfs)
#define IShellView_AddPropertySheetPages(This,dwReserved,pfn,lparam) (This)->lpVtbl->AddPropertySheetPages(This,dwReserved,pfn,lparam)
#define IShellView_SaveViewState(This) (This)->lpVtbl->SaveViewState(This)
#define IShellView_SelectItem(This,pidlItem,uFlags) (This)->lpVtbl->SelectItem(This,pidlItem,uFlags)
#define IShellView_GetItemObject(This,uItem,riid,ppv) (This)->lpVtbl->GetItemObject(This,uItem,riid,ppv)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellView_QueryInterface(IShellView* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellView_AddRef(IShellView* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellView_Release(IShellView* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static FORCEINLINE HRESULT IShellView_GetWindow(IShellView* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static FORCEINLINE HRESULT IShellView_ContextSensitiveHelp(IShellView* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IShellView methods ***/
static FORCEINLINE HRESULT IShellView_TranslateAccelerator(IShellView* This,MSG *pmsg) {
    return This->lpVtbl->TranslateAccelerator(This,pmsg);
}
static FORCEINLINE HRESULT IShellView_EnableModeless(IShellView* This,WINBOOL fEnable) {
    return This->lpVtbl->EnableModeless(This,fEnable);
}
static FORCEINLINE HRESULT IShellView_UIActivate(IShellView* This,UINT uState) {
    return This->lpVtbl->UIActivate(This,uState);
}
static FORCEINLINE HRESULT IShellView_Refresh(IShellView* This) {
    return This->lpVtbl->Refresh(This);
}
static FORCEINLINE HRESULT IShellView_CreateViewWindow(IShellView* This,IShellView *psvPrevious,LPCFOLDERSETTINGS pfs,IShellBrowser *psb,RECT *prcView,HWND *phWnd) {
    return This->lpVtbl->CreateViewWindow(This,psvPrevious,pfs,psb,prcView,phWnd);
}
static FORCEINLINE HRESULT IShellView_DestroyViewWindow(IShellView* This) {
    return This->lpVtbl->DestroyViewWindow(This);
}
static FORCEINLINE HRESULT IShellView_GetCurrentInfo(IShellView* This,LPFOLDERSETTINGS pfs) {
    return This->lpVtbl->GetCurrentInfo(This,pfs);
}
static FORCEINLINE HRESULT IShellView_AddPropertySheetPages(IShellView* This,DWORD dwReserved,LPFNSVADDPROPSHEETPAGE pfn,LPARAM lparam) {
    return This->lpVtbl->AddPropertySheetPages(This,dwReserved,pfn,lparam);
}
static FORCEINLINE HRESULT IShellView_SaveViewState(IShellView* This) {
    return This->lpVtbl->SaveViewState(This);
}
static FORCEINLINE HRESULT IShellView_SelectItem(IShellView* This,PCUITEMID_CHILD pidlItem,SVSIF uFlags) {
    return This->lpVtbl->SelectItem(This,pidlItem,uFlags);
}
static FORCEINLINE HRESULT IShellView_GetItemObject(IShellView* This,UINT uItem,REFIID riid,void **ppv) {
    return This->lpVtbl->GetItemObject(This,uItem,riid,ppv);
}
#endif
#endif

#endif


#endif  /* __IShellView_INTERFACE_DEFINED__ */

typedef IShellView *LPSHELLVIEW;

/*****************************************************************************
 * IShellView2 interface
 */
#ifndef __IShellView2_INTERFACE_DEFINED__
#define __IShellView2_INTERFACE_DEFINED__

typedef GUID SHELLVIEWID;

#define SV2GV_CURRENTVIEW ((UINT)-1)
#define SV2GV_DEFAULTVIEW ((UINT)-2)

#include <pshpack8.h>
typedef struct _SV2CVW2_PARAMS {
    DWORD cbSize;
    IShellView *psvPrev;
    LPCFOLDERSETTINGS pfs;
    IShellBrowser *psbOwner;
    RECT *prcView;
    const SHELLVIEWID *pvid;
    HWND hwndView;
} SV2CVW2_PARAMS;
typedef struct _SV2CVW2_PARAMS *LPSV2CVW2_PARAMS;
#include <poppack.h>

DEFINE_GUID(IID_IShellView2, 0x88e39e80, 0x3578, 0x11cf, 0xae,0x69, 0x08,0x00,0x2b,0x2e,0x12,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("88e39e80-3578-11cf-ae69-08002b2e1262")
IShellView2 : public IShellView
{
    virtual HRESULT STDMETHODCALLTYPE GetView(
        SHELLVIEWID *pvid,
        ULONG uView) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateViewWindow2(
        LPSV2CVW2_PARAMS lpParams) = 0;

    virtual HRESULT STDMETHODCALLTYPE HandleRename(
        PCUITEMID_CHILD pidlNew) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectAndPositionItem(
        PCUITEMID_CHILD pidlItem,
        UINT uFlags,
        POINT *ppt) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellView2, 0x88e39e80, 0x3578, 0x11cf, 0xae,0x69, 0x08,0x00,0x2b,0x2e,0x12,0x62)
#endif
#else
typedef struct IShellView2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellView2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellView2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellView2 *This);

    /*** IOleWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IShellView2 *This,
        HWND *phwnd);

    HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)(
        IShellView2 *This,
        WINBOOL fEnterMode);

    /*** IShellView methods ***/
    HRESULT (STDMETHODCALLTYPE *TranslateAccelerator)(
        IShellView2 *This,
        MSG *pmsg);

    HRESULT (STDMETHODCALLTYPE *EnableModeless)(
        IShellView2 *This,
        WINBOOL fEnable);

    HRESULT (STDMETHODCALLTYPE *UIActivate)(
        IShellView2 *This,
        UINT uState);

    HRESULT (STDMETHODCALLTYPE *Refresh)(
        IShellView2 *This);

    HRESULT (STDMETHODCALLTYPE *CreateViewWindow)(
        IShellView2 *This,
        IShellView *psvPrevious,
        LPCFOLDERSETTINGS pfs,
        IShellBrowser *psb,
        RECT *prcView,
        HWND *phWnd);

    HRESULT (STDMETHODCALLTYPE *DestroyViewWindow)(
        IShellView2 *This);

    HRESULT (STDMETHODCALLTYPE *GetCurrentInfo)(
        IShellView2 *This,
        LPFOLDERSETTINGS pfs);

    HRESULT (STDMETHODCALLTYPE *AddPropertySheetPages)(
        IShellView2 *This,
        DWORD dwReserved,
        LPFNSVADDPROPSHEETPAGE pfn,
        LPARAM lparam);

    HRESULT (STDMETHODCALLTYPE *SaveViewState)(
        IShellView2 *This);

    HRESULT (STDMETHODCALLTYPE *SelectItem)(
        IShellView2 *This,
        PCUITEMID_CHILD pidlItem,
        SVSIF uFlags);

    HRESULT (STDMETHODCALLTYPE *GetItemObject)(
        IShellView2 *This,
        UINT uItem,
        REFIID riid,
        void **ppv);

    /*** IShellView2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetView)(
        IShellView2 *This,
        SHELLVIEWID *pvid,
        ULONG uView);

    HRESULT (STDMETHODCALLTYPE *CreateViewWindow2)(
        IShellView2 *This,
        LPSV2CVW2_PARAMS lpParams);

    HRESULT (STDMETHODCALLTYPE *HandleRename)(
        IShellView2 *This,
        PCUITEMID_CHILD pidlNew);

    HRESULT (STDMETHODCALLTYPE *SelectAndPositionItem)(
        IShellView2 *This,
        PCUITEMID_CHILD pidlItem,
        UINT uFlags,
        POINT *ppt);

    END_INTERFACE
} IShellView2Vtbl;

interface IShellView2 {
    CONST_VTBL IShellView2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellView2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellView2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellView2_Release(This) (This)->lpVtbl->Release(This)
/*** IOleWindow methods ***/
#define IShellView2_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IShellView2_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
/*** IShellView methods ***/
#define IShellView2_TranslateAccelerator(This,pmsg) (This)->lpVtbl->TranslateAccelerator(This,pmsg)
#define IShellView2_EnableModeless(This,fEnable) (This)->lpVtbl->EnableModeless(This,fEnable)
#define IShellView2_UIActivate(This,uState) (This)->lpVtbl->UIActivate(This,uState)
#define IShellView2_Refresh(This) (This)->lpVtbl->Refresh(This)
#define IShellView2_CreateViewWindow(This,psvPrevious,pfs,psb,prcView,phWnd) (This)->lpVtbl->CreateViewWindow(This,psvPrevious,pfs,psb,prcView,phWnd)
#define IShellView2_DestroyViewWindow(This) (This)->lpVtbl->DestroyViewWindow(This)
#define IShellView2_GetCurrentInfo(This,pfs) (This)->lpVtbl->GetCurrentInfo(This,pfs)
#define IShellView2_AddPropertySheetPages(This,dwReserved,pfn,lparam) (This)->lpVtbl->AddPropertySheetPages(This,dwReserved,pfn,lparam)
#define IShellView2_SaveViewState(This) (This)->lpVtbl->SaveViewState(This)
#define IShellView2_SelectItem(This,pidlItem,uFlags) (This)->lpVtbl->SelectItem(This,pidlItem,uFlags)
#define IShellView2_GetItemObject(This,uItem,riid,ppv) (This)->lpVtbl->GetItemObject(This,uItem,riid,ppv)
/*** IShellView2 methods ***/
#define IShellView2_GetView(This,pvid,uView) (This)->lpVtbl->GetView(This,pvid,uView)
#define IShellView2_CreateViewWindow2(This,lpParams) (This)->lpVtbl->CreateViewWindow2(This,lpParams)
#define IShellView2_HandleRename(This,pidlNew) (This)->lpVtbl->HandleRename(This,pidlNew)
#define IShellView2_SelectAndPositionItem(This,pidlItem,uFlags,ppt) (This)->lpVtbl->SelectAndPositionItem(This,pidlItem,uFlags,ppt)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellView2_QueryInterface(IShellView2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellView2_AddRef(IShellView2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellView2_Release(IShellView2* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static FORCEINLINE HRESULT IShellView2_GetWindow(IShellView2* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static FORCEINLINE HRESULT IShellView2_ContextSensitiveHelp(IShellView2* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IShellView methods ***/
static FORCEINLINE HRESULT IShellView2_TranslateAccelerator(IShellView2* This,MSG *pmsg) {
    return This->lpVtbl->TranslateAccelerator(This,pmsg);
}
static FORCEINLINE HRESULT IShellView2_EnableModeless(IShellView2* This,WINBOOL fEnable) {
    return This->lpVtbl->EnableModeless(This,fEnable);
}
static FORCEINLINE HRESULT IShellView2_UIActivate(IShellView2* This,UINT uState) {
    return This->lpVtbl->UIActivate(This,uState);
}
static FORCEINLINE HRESULT IShellView2_Refresh(IShellView2* This) {
    return This->lpVtbl->Refresh(This);
}
static FORCEINLINE HRESULT IShellView2_CreateViewWindow(IShellView2* This,IShellView *psvPrevious,LPCFOLDERSETTINGS pfs,IShellBrowser *psb,RECT *prcView,HWND *phWnd) {
    return This->lpVtbl->CreateViewWindow(This,psvPrevious,pfs,psb,prcView,phWnd);
}
static FORCEINLINE HRESULT IShellView2_DestroyViewWindow(IShellView2* This) {
    return This->lpVtbl->DestroyViewWindow(This);
}
static FORCEINLINE HRESULT IShellView2_GetCurrentInfo(IShellView2* This,LPFOLDERSETTINGS pfs) {
    return This->lpVtbl->GetCurrentInfo(This,pfs);
}
static FORCEINLINE HRESULT IShellView2_AddPropertySheetPages(IShellView2* This,DWORD dwReserved,LPFNSVADDPROPSHEETPAGE pfn,LPARAM lparam) {
    return This->lpVtbl->AddPropertySheetPages(This,dwReserved,pfn,lparam);
}
static FORCEINLINE HRESULT IShellView2_SaveViewState(IShellView2* This) {
    return This->lpVtbl->SaveViewState(This);
}
static FORCEINLINE HRESULT IShellView2_SelectItem(IShellView2* This,PCUITEMID_CHILD pidlItem,SVSIF uFlags) {
    return This->lpVtbl->SelectItem(This,pidlItem,uFlags);
}
static FORCEINLINE HRESULT IShellView2_GetItemObject(IShellView2* This,UINT uItem,REFIID riid,void **ppv) {
    return This->lpVtbl->GetItemObject(This,uItem,riid,ppv);
}
/*** IShellView2 methods ***/
static FORCEINLINE HRESULT IShellView2_GetView(IShellView2* This,SHELLVIEWID *pvid,ULONG uView) {
    return This->lpVtbl->GetView(This,pvid,uView);
}
static FORCEINLINE HRESULT IShellView2_CreateViewWindow2(IShellView2* This,LPSV2CVW2_PARAMS lpParams) {
    return This->lpVtbl->CreateViewWindow2(This,lpParams);
}
static FORCEINLINE HRESULT IShellView2_HandleRename(IShellView2* This,PCUITEMID_CHILD pidlNew) {
    return This->lpVtbl->HandleRename(This,pidlNew);
}
static FORCEINLINE HRESULT IShellView2_SelectAndPositionItem(IShellView2* This,PCUITEMID_CHILD pidlItem,UINT uFlags,POINT *ppt) {
    return This->lpVtbl->SelectAndPositionItem(This,pidlItem,uFlags,ppt);
}
#endif
#endif

#endif


#endif  /* __IShellView2_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_VISTA
/*****************************************************************************
 * IShellView3 interface
 */
#ifndef __IShellView3_INTERFACE_DEFINED__
#define __IShellView3_INTERFACE_DEFINED__

enum _SV3CVW3_FLAGS {
    SV3CVW3_DEFAULT = 0x0,
    SV3CVW3_NONINTERACTIVE = 0x1,
    SV3CVW3_FORCEVIEWMODE = 0x2,
    SV3CVW3_FORCEFOLDERFLAGS = 0x4
};

typedef DWORD SV3CVW3_FLAGS;

DEFINE_GUID(IID_IShellView3, 0xec39fa88, 0xf8af, 0x41c5, 0x84,0x21, 0x38,0xbe,0xd2,0x8f,0x46,0x73);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ec39fa88-f8af-41c5-8421-38bed28f4673")
IShellView3 : public IShellView2
{
    virtual HRESULT STDMETHODCALLTYPE CreateViewWindow3(
        IShellBrowser *psbOwner,
        IShellView *psvPrev,
        SV3CVW3_FLAGS dwViewFlags,
        FOLDERFLAGS dwMask,
        FOLDERFLAGS dwFlags,
        FOLDERVIEWMODE fvMode,
        const SHELLVIEWID *pvid,
        const RECT *prcView,
        HWND *phwndView) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellView3, 0xec39fa88, 0xf8af, 0x41c5, 0x84,0x21, 0x38,0xbe,0xd2,0x8f,0x46,0x73)
#endif
#else
typedef struct IShellView3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellView3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellView3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellView3 *This);

    /*** IOleWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IShellView3 *This,
        HWND *phwnd);

    HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)(
        IShellView3 *This,
        WINBOOL fEnterMode);

    /*** IShellView methods ***/
    HRESULT (STDMETHODCALLTYPE *TranslateAccelerator)(
        IShellView3 *This,
        MSG *pmsg);

    HRESULT (STDMETHODCALLTYPE *EnableModeless)(
        IShellView3 *This,
        WINBOOL fEnable);

    HRESULT (STDMETHODCALLTYPE *UIActivate)(
        IShellView3 *This,
        UINT uState);

    HRESULT (STDMETHODCALLTYPE *Refresh)(
        IShellView3 *This);

    HRESULT (STDMETHODCALLTYPE *CreateViewWindow)(
        IShellView3 *This,
        IShellView *psvPrevious,
        LPCFOLDERSETTINGS pfs,
        IShellBrowser *psb,
        RECT *prcView,
        HWND *phWnd);

    HRESULT (STDMETHODCALLTYPE *DestroyViewWindow)(
        IShellView3 *This);

    HRESULT (STDMETHODCALLTYPE *GetCurrentInfo)(
        IShellView3 *This,
        LPFOLDERSETTINGS pfs);

    HRESULT (STDMETHODCALLTYPE *AddPropertySheetPages)(
        IShellView3 *This,
        DWORD dwReserved,
        LPFNSVADDPROPSHEETPAGE pfn,
        LPARAM lparam);

    HRESULT (STDMETHODCALLTYPE *SaveViewState)(
        IShellView3 *This);

    HRESULT (STDMETHODCALLTYPE *SelectItem)(
        IShellView3 *This,
        PCUITEMID_CHILD pidlItem,
        SVSIF uFlags);

    HRESULT (STDMETHODCALLTYPE *GetItemObject)(
        IShellView3 *This,
        UINT uItem,
        REFIID riid,
        void **ppv);

    /*** IShellView2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetView)(
        IShellView3 *This,
        SHELLVIEWID *pvid,
        ULONG uView);

    HRESULT (STDMETHODCALLTYPE *CreateViewWindow2)(
        IShellView3 *This,
        LPSV2CVW2_PARAMS lpParams);

    HRESULT (STDMETHODCALLTYPE *HandleRename)(
        IShellView3 *This,
        PCUITEMID_CHILD pidlNew);

    HRESULT (STDMETHODCALLTYPE *SelectAndPositionItem)(
        IShellView3 *This,
        PCUITEMID_CHILD pidlItem,
        UINT uFlags,
        POINT *ppt);

    /*** IShellView3 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateViewWindow3)(
        IShellView3 *This,
        IShellBrowser *psbOwner,
        IShellView *psvPrev,
        SV3CVW3_FLAGS dwViewFlags,
        FOLDERFLAGS dwMask,
        FOLDERFLAGS dwFlags,
        FOLDERVIEWMODE fvMode,
        const SHELLVIEWID *pvid,
        const RECT *prcView,
        HWND *phwndView);

    END_INTERFACE
} IShellView3Vtbl;

interface IShellView3 {
    CONST_VTBL IShellView3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellView3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellView3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellView3_Release(This) (This)->lpVtbl->Release(This)
/*** IOleWindow methods ***/
#define IShellView3_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IShellView3_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
/*** IShellView methods ***/
#define IShellView3_TranslateAccelerator(This,pmsg) (This)->lpVtbl->TranslateAccelerator(This,pmsg)
#define IShellView3_EnableModeless(This,fEnable) (This)->lpVtbl->EnableModeless(This,fEnable)
#define IShellView3_UIActivate(This,uState) (This)->lpVtbl->UIActivate(This,uState)
#define IShellView3_Refresh(This) (This)->lpVtbl->Refresh(This)
#define IShellView3_CreateViewWindow(This,psvPrevious,pfs,psb,prcView,phWnd) (This)->lpVtbl->CreateViewWindow(This,psvPrevious,pfs,psb,prcView,phWnd)
#define IShellView3_DestroyViewWindow(This) (This)->lpVtbl->DestroyViewWindow(This)
#define IShellView3_GetCurrentInfo(This,pfs) (This)->lpVtbl->GetCurrentInfo(This,pfs)
#define IShellView3_AddPropertySheetPages(This,dwReserved,pfn,lparam) (This)->lpVtbl->AddPropertySheetPages(This,dwReserved,pfn,lparam)
#define IShellView3_SaveViewState(This) (This)->lpVtbl->SaveViewState(This)
#define IShellView3_SelectItem(This,pidlItem,uFlags) (This)->lpVtbl->SelectItem(This,pidlItem,uFlags)
#define IShellView3_GetItemObject(This,uItem,riid,ppv) (This)->lpVtbl->GetItemObject(This,uItem,riid,ppv)
/*** IShellView2 methods ***/
#define IShellView3_GetView(This,pvid,uView) (This)->lpVtbl->GetView(This,pvid,uView)
#define IShellView3_CreateViewWindow2(This,lpParams) (This)->lpVtbl->CreateViewWindow2(This,lpParams)
#define IShellView3_HandleRename(This,pidlNew) (This)->lpVtbl->HandleRename(This,pidlNew)
#define IShellView3_SelectAndPositionItem(This,pidlItem,uFlags,ppt) (This)->lpVtbl->SelectAndPositionItem(This,pidlItem,uFlags,ppt)
/*** IShellView3 methods ***/
#define IShellView3_CreateViewWindow3(This,psbOwner,psvPrev,dwViewFlags,dwMask,dwFlags,fvMode,pvid,prcView,phwndView) (This)->lpVtbl->CreateViewWindow3(This,psbOwner,psvPrev,dwViewFlags,dwMask,dwFlags,fvMode,pvid,prcView,phwndView)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellView3_QueryInterface(IShellView3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellView3_AddRef(IShellView3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellView3_Release(IShellView3* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static FORCEINLINE HRESULT IShellView3_GetWindow(IShellView3* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static FORCEINLINE HRESULT IShellView3_ContextSensitiveHelp(IShellView3* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IShellView methods ***/
static FORCEINLINE HRESULT IShellView3_TranslateAccelerator(IShellView3* This,MSG *pmsg) {
    return This->lpVtbl->TranslateAccelerator(This,pmsg);
}
static FORCEINLINE HRESULT IShellView3_EnableModeless(IShellView3* This,WINBOOL fEnable) {
    return This->lpVtbl->EnableModeless(This,fEnable);
}
static FORCEINLINE HRESULT IShellView3_UIActivate(IShellView3* This,UINT uState) {
    return This->lpVtbl->UIActivate(This,uState);
}
static FORCEINLINE HRESULT IShellView3_Refresh(IShellView3* This) {
    return This->lpVtbl->Refresh(This);
}
static FORCEINLINE HRESULT IShellView3_CreateViewWindow(IShellView3* This,IShellView *psvPrevious,LPCFOLDERSETTINGS pfs,IShellBrowser *psb,RECT *prcView,HWND *phWnd) {
    return This->lpVtbl->CreateViewWindow(This,psvPrevious,pfs,psb,prcView,phWnd);
}
static FORCEINLINE HRESULT IShellView3_DestroyViewWindow(IShellView3* This) {
    return This->lpVtbl->DestroyViewWindow(This);
}
static FORCEINLINE HRESULT IShellView3_GetCurrentInfo(IShellView3* This,LPFOLDERSETTINGS pfs) {
    return This->lpVtbl->GetCurrentInfo(This,pfs);
}
static FORCEINLINE HRESULT IShellView3_AddPropertySheetPages(IShellView3* This,DWORD dwReserved,LPFNSVADDPROPSHEETPAGE pfn,LPARAM lparam) {
    return This->lpVtbl->AddPropertySheetPages(This,dwReserved,pfn,lparam);
}
static FORCEINLINE HRESULT IShellView3_SaveViewState(IShellView3* This) {
    return This->lpVtbl->SaveViewState(This);
}
static FORCEINLINE HRESULT IShellView3_SelectItem(IShellView3* This,PCUITEMID_CHILD pidlItem,SVSIF uFlags) {
    return This->lpVtbl->SelectItem(This,pidlItem,uFlags);
}
static FORCEINLINE HRESULT IShellView3_GetItemObject(IShellView3* This,UINT uItem,REFIID riid,void **ppv) {
    return This->lpVtbl->GetItemObject(This,uItem,riid,ppv);
}
/*** IShellView2 methods ***/
static FORCEINLINE HRESULT IShellView3_GetView(IShellView3* This,SHELLVIEWID *pvid,ULONG uView) {
    return This->lpVtbl->GetView(This,pvid,uView);
}
static FORCEINLINE HRESULT IShellView3_CreateViewWindow2(IShellView3* This,LPSV2CVW2_PARAMS lpParams) {
    return This->lpVtbl->CreateViewWindow2(This,lpParams);
}
static FORCEINLINE HRESULT IShellView3_HandleRename(IShellView3* This,PCUITEMID_CHILD pidlNew) {
    return This->lpVtbl->HandleRename(This,pidlNew);
}
static FORCEINLINE HRESULT IShellView3_SelectAndPositionItem(IShellView3* This,PCUITEMID_CHILD pidlItem,UINT uFlags,POINT *ppt) {
    return This->lpVtbl->SelectAndPositionItem(This,pidlItem,uFlags,ppt);
}
/*** IShellView3 methods ***/
static FORCEINLINE HRESULT IShellView3_CreateViewWindow3(IShellView3* This,IShellBrowser *psbOwner,IShellView *psvPrev,SV3CVW3_FLAGS dwViewFlags,FOLDERFLAGS dwMask,FOLDERFLAGS dwFlags,FOLDERVIEWMODE fvMode,const SHELLVIEWID *pvid,const RECT *prcView,HWND *phwndView) {
    return This->lpVtbl->CreateViewWindow3(This,psbOwner,psvPrev,dwViewFlags,dwMask,dwFlags,fvMode,pvid,prcView,phwndView);
}
#endif
#endif

#endif


#endif  /* __IShellView3_INTERFACE_DEFINED__ */

#endif
#ifdef _FIX_ENABLEMODELESS_CONFLICT
#undef EnableModeless
#endif

/*****************************************************************************
 * IFolderView interface
 */
#ifndef __IFolderView_INTERFACE_DEFINED__
#define __IFolderView_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFolderView, 0xcde725b0, 0xccc9, 0x4519, 0x91,0x7e, 0x32,0x5d,0x72,0xfa,0xb4,0xce);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cde725b0-ccc9-4519-917e-325d72fab4ce")
IFolderView : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCurrentViewMode(
        UINT *pViewMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCurrentViewMode(
        UINT ViewMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolder(
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        int iItemIndex,
        PITEMID_CHILD *ppidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE ItemCount(
        UINT uFlags,
        int *pcItems) = 0;

    virtual HRESULT STDMETHODCALLTYPE Items(
        UINT uFlags,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelectionMarkedItem(
        int *piItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFocusedItem(
        int *piItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItemPosition(
        PCUITEMID_CHILD pidl,
        POINT *ppt) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSpacing(
        POINT *ppt) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultSpacing(
        POINT *ppt) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAutoArrange(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectItem(
        int iItem,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectAndPositionItems(
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        POINT *apt,
        DWORD dwFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFolderView, 0xcde725b0, 0xccc9, 0x4519, 0x91,0x7e, 0x32,0x5d,0x72,0xfa,0xb4,0xce)
#endif
#else
typedef struct IFolderViewVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFolderView *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFolderView *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFolderView *This);

    /*** IFolderView methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurrentViewMode)(
        IFolderView *This,
        UINT *pViewMode);

    HRESULT (STDMETHODCALLTYPE *SetCurrentViewMode)(
        IFolderView *This,
        UINT ViewMode);

    HRESULT (STDMETHODCALLTYPE *GetFolder)(
        IFolderView *This,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IFolderView *This,
        int iItemIndex,
        PITEMID_CHILD *ppidl);

    HRESULT (STDMETHODCALLTYPE *ItemCount)(
        IFolderView *This,
        UINT uFlags,
        int *pcItems);

    HRESULT (STDMETHODCALLTYPE *Items)(
        IFolderView *This,
        UINT uFlags,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetSelectionMarkedItem)(
        IFolderView *This,
        int *piItem);

    HRESULT (STDMETHODCALLTYPE *GetFocusedItem)(
        IFolderView *This,
        int *piItem);

    HRESULT (STDMETHODCALLTYPE *GetItemPosition)(
        IFolderView *This,
        PCUITEMID_CHILD pidl,
        POINT *ppt);

    HRESULT (STDMETHODCALLTYPE *GetSpacing)(
        IFolderView *This,
        POINT *ppt);

    HRESULT (STDMETHODCALLTYPE *GetDefaultSpacing)(
        IFolderView *This,
        POINT *ppt);

    HRESULT (STDMETHODCALLTYPE *GetAutoArrange)(
        IFolderView *This);

    HRESULT (STDMETHODCALLTYPE *SelectItem)(
        IFolderView *This,
        int iItem,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *SelectAndPositionItems)(
        IFolderView *This,
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        POINT *apt,
        DWORD dwFlags);

    END_INTERFACE
} IFolderViewVtbl;

interface IFolderView {
    CONST_VTBL IFolderViewVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFolderView_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFolderView_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFolderView_Release(This) (This)->lpVtbl->Release(This)
/*** IFolderView methods ***/
#define IFolderView_GetCurrentViewMode(This,pViewMode) (This)->lpVtbl->GetCurrentViewMode(This,pViewMode)
#define IFolderView_SetCurrentViewMode(This,ViewMode) (This)->lpVtbl->SetCurrentViewMode(This,ViewMode)
#define IFolderView_GetFolder(This,riid,ppv) (This)->lpVtbl->GetFolder(This,riid,ppv)
#define IFolderView_Item(This,iItemIndex,ppidl) (This)->lpVtbl->Item(This,iItemIndex,ppidl)
#define IFolderView_ItemCount(This,uFlags,pcItems) (This)->lpVtbl->ItemCount(This,uFlags,pcItems)
#define IFolderView_Items(This,uFlags,riid,ppv) (This)->lpVtbl->Items(This,uFlags,riid,ppv)
#define IFolderView_GetSelectionMarkedItem(This,piItem) (This)->lpVtbl->GetSelectionMarkedItem(This,piItem)
#define IFolderView_GetFocusedItem(This,piItem) (This)->lpVtbl->GetFocusedItem(This,piItem)
#define IFolderView_GetItemPosition(This,pidl,ppt) (This)->lpVtbl->GetItemPosition(This,pidl,ppt)
#define IFolderView_GetSpacing(This,ppt) (This)->lpVtbl->GetSpacing(This,ppt)
#define IFolderView_GetDefaultSpacing(This,ppt) (This)->lpVtbl->GetDefaultSpacing(This,ppt)
#define IFolderView_GetAutoArrange(This) (This)->lpVtbl->GetAutoArrange(This)
#define IFolderView_SelectItem(This,iItem,dwFlags) (This)->lpVtbl->SelectItem(This,iItem,dwFlags)
#define IFolderView_SelectAndPositionItems(This,cidl,apidl,apt,dwFlags) (This)->lpVtbl->SelectAndPositionItems(This,cidl,apidl,apt,dwFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFolderView_QueryInterface(IFolderView* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFolderView_AddRef(IFolderView* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFolderView_Release(IFolderView* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderView methods ***/
static FORCEINLINE HRESULT IFolderView_GetCurrentViewMode(IFolderView* This,UINT *pViewMode) {
    return This->lpVtbl->GetCurrentViewMode(This,pViewMode);
}
static FORCEINLINE HRESULT IFolderView_SetCurrentViewMode(IFolderView* This,UINT ViewMode) {
    return This->lpVtbl->SetCurrentViewMode(This,ViewMode);
}
static FORCEINLINE HRESULT IFolderView_GetFolder(IFolderView* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetFolder(This,riid,ppv);
}
static FORCEINLINE HRESULT IFolderView_Item(IFolderView* This,int iItemIndex,PITEMID_CHILD *ppidl) {
    return This->lpVtbl->Item(This,iItemIndex,ppidl);
}
static FORCEINLINE HRESULT IFolderView_ItemCount(IFolderView* This,UINT uFlags,int *pcItems) {
    return This->lpVtbl->ItemCount(This,uFlags,pcItems);
}
static FORCEINLINE HRESULT IFolderView_Items(IFolderView* This,UINT uFlags,REFIID riid,void **ppv) {
    return This->lpVtbl->Items(This,uFlags,riid,ppv);
}
static FORCEINLINE HRESULT IFolderView_GetSelectionMarkedItem(IFolderView* This,int *piItem) {
    return This->lpVtbl->GetSelectionMarkedItem(This,piItem);
}
static FORCEINLINE HRESULT IFolderView_GetFocusedItem(IFolderView* This,int *piItem) {
    return This->lpVtbl->GetFocusedItem(This,piItem);
}
static FORCEINLINE HRESULT IFolderView_GetItemPosition(IFolderView* This,PCUITEMID_CHILD pidl,POINT *ppt) {
    return This->lpVtbl->GetItemPosition(This,pidl,ppt);
}
static FORCEINLINE HRESULT IFolderView_GetSpacing(IFolderView* This,POINT *ppt) {
    return This->lpVtbl->GetSpacing(This,ppt);
}
static FORCEINLINE HRESULT IFolderView_GetDefaultSpacing(IFolderView* This,POINT *ppt) {
    return This->lpVtbl->GetDefaultSpacing(This,ppt);
}
static FORCEINLINE HRESULT IFolderView_GetAutoArrange(IFolderView* This) {
    return This->lpVtbl->GetAutoArrange(This);
}
static FORCEINLINE HRESULT IFolderView_SelectItem(IFolderView* This,int iItem,DWORD dwFlags) {
    return This->lpVtbl->SelectItem(This,iItem,dwFlags);
}
static FORCEINLINE HRESULT IFolderView_SelectAndPositionItems(IFolderView* This,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,POINT *apt,DWORD dwFlags) {
    return This->lpVtbl->SelectAndPositionItems(This,cidl,apidl,apt,dwFlags);
}
#endif
#endif

#endif


#endif  /* __IFolderView_INTERFACE_DEFINED__ */


#define SID_SFolderView IID_IFolderView

#if NTDDI_VERSION >= NTDDI_WIN7
/*****************************************************************************
 * ISearchBoxInfo interface
 */
#ifndef __ISearchBoxInfo_INTERFACE_DEFINED__
#define __ISearchBoxInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISearchBoxInfo, 0x6af6e03f, 0xd664, 0x4ef4, 0x96,0x26, 0xf7,0xe0,0xed,0x36,0x75,0x5e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6af6e03f-d664-4ef4-9626-f7e0ed36755e")
ISearchBoxInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCondition(
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetText(
        LPWSTR *ppsz) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISearchBoxInfo, 0x6af6e03f, 0xd664, 0x4ef4, 0x96,0x26, 0xf7,0xe0,0xed,0x36,0x75,0x5e)
#endif
#else
typedef struct ISearchBoxInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISearchBoxInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISearchBoxInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISearchBoxInfo *This);

    /*** ISearchBoxInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCondition)(
        ISearchBoxInfo *This,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetText)(
        ISearchBoxInfo *This,
        LPWSTR *ppsz);

    END_INTERFACE
} ISearchBoxInfoVtbl;

interface ISearchBoxInfo {
    CONST_VTBL ISearchBoxInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISearchBoxInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISearchBoxInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISearchBoxInfo_Release(This) (This)->lpVtbl->Release(This)
/*** ISearchBoxInfo methods ***/
#define ISearchBoxInfo_GetCondition(This,riid,ppv) (This)->lpVtbl->GetCondition(This,riid,ppv)
#define ISearchBoxInfo_GetText(This,ppsz) (This)->lpVtbl->GetText(This,ppsz)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISearchBoxInfo_QueryInterface(ISearchBoxInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISearchBoxInfo_AddRef(ISearchBoxInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISearchBoxInfo_Release(ISearchBoxInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** ISearchBoxInfo methods ***/
static FORCEINLINE HRESULT ISearchBoxInfo_GetCondition(ISearchBoxInfo* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetCondition(This,riid,ppv);
}
static FORCEINLINE HRESULT ISearchBoxInfo_GetText(ISearchBoxInfo* This,LPWSTR *ppsz) {
    return This->lpVtbl->GetText(This,ppsz);
}
#endif
#endif

#endif


#endif  /* __ISearchBoxInfo_INTERFACE_DEFINED__ */

#endif

#if NTDDI_VERSION >= NTDDI_VISTA || _WIN32_IE >= _WIN32_IE_IE70
#ifndef NO_SHOBJIDL_SORTDIRECTION
enum tagSORTDIRECTION {
    SORT_DESCENDING = -1,
    SORT_ASCENDING = 1
};
#endif

typedef int SORTDIRECTION;

typedef struct SORTCOLUMN {
    PROPERTYKEY propkey;
    SORTDIRECTION direction;
} SORTCOLUMN;

typedef enum FVTEXTTYPE {
    FVST_EMPTYTEXT = 0
} FVTEXTTYPE;

#ifndef __IShellItemArray_FWD_DEFINED__
#define __IShellItemArray_FWD_DEFINED__
typedef interface IShellItemArray IShellItemArray;
#ifdef __cplusplus
interface IShellItemArray;
#endif /* __cplusplus */
#endif


typedef HRESULT DEPRECATED_HRESULT;

#ifdef __cplusplus
#define DEPRECATED_HRESULT HRESULT
#endif

/*****************************************************************************
 * IFolderView2 interface
 */
#ifndef __IFolderView2_INTERFACE_DEFINED__
#define __IFolderView2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFolderView2, 0x1af3a467, 0x214f, 0x4298, 0x90,0x8e, 0x06,0xb0,0x3e,0x0b,0x39,0xf9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1af3a467-214f-4298-908e-06b03e0b39f9")
IFolderView2 : public IFolderView
{
    virtual HRESULT STDMETHODCALLTYPE SetGroupBy(
        REFPROPERTYKEY key,
        WINBOOL fAscending) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGroupBy(
        PROPERTYKEY *pkey,
        WINBOOL *pfAscending) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetViewProperty(
        PCUITEMID_CHILD pidl,
        REFPROPERTYKEY propkey,
        REFPROPVARIANT propvar) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetViewProperty(
        PCUITEMID_CHILD pidl,
        REFPROPERTYKEY propkey,
        PROPVARIANT *ppropvar) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTileViewProperties(
        PCUITEMID_CHILD pidl,
        LPCWSTR pszPropList) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetExtendedTileViewProperties(
        PCUITEMID_CHILD pidl,
        LPCWSTR pszPropList) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetText(
        FVTEXTTYPE iType,
        LPCWSTR pwszText) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCurrentFolderFlags(
        DWORD dwMask,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentFolderFlags(
        DWORD *pdwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSortColumnCount(
        int *pcColumns) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSortColumns(
        const SORTCOLUMN *rgSortColumns,
        int cColumns) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSortColumns(
        SORTCOLUMN *rgSortColumns,
        int cColumns) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItem(
        int iItem,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVisibleItem(
        int iStart,
        WINBOOL fPrevious,
        int *piItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelectedItem(
        int iStart,
        int *piItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelection(
        WINBOOL fNoneImpliesFolder,
        IShellItemArray **ppsia) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelectionState(
        PCUITEMID_CHILD pidl,
        DWORD *pdwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvokeVerbOnSelection(
        LPCSTR pszVerb) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetViewModeAndIconSize(
        FOLDERVIEWMODE uViewMode,
        int iImageSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetViewModeAndIconSize(
        FOLDERVIEWMODE *puViewMode,
        int *piImageSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGroupSubsetCount(
        UINT cVisibleRows) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGroupSubsetCount(
        UINT *pcVisibleRows) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRedraw(
        WINBOOL fRedrawOn) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsMoveInSameFolder(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoRename(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFolderView2, 0x1af3a467, 0x214f, 0x4298, 0x90,0x8e, 0x06,0xb0,0x3e,0x0b,0x39,0xf9)
#endif
#else
typedef struct IFolderView2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFolderView2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFolderView2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFolderView2 *This);

    /*** IFolderView methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurrentViewMode)(
        IFolderView2 *This,
        UINT *pViewMode);

    HRESULT (STDMETHODCALLTYPE *SetCurrentViewMode)(
        IFolderView2 *This,
        UINT ViewMode);

    HRESULT (STDMETHODCALLTYPE *GetFolder)(
        IFolderView2 *This,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IFolderView2 *This,
        int iItemIndex,
        PITEMID_CHILD *ppidl);

    HRESULT (STDMETHODCALLTYPE *ItemCount)(
        IFolderView2 *This,
        UINT uFlags,
        int *pcItems);

    HRESULT (STDMETHODCALLTYPE *Items)(
        IFolderView2 *This,
        UINT uFlags,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetSelectionMarkedItem)(
        IFolderView2 *This,
        int *piItem);

    HRESULT (STDMETHODCALLTYPE *GetFocusedItem)(
        IFolderView2 *This,
        int *piItem);

    HRESULT (STDMETHODCALLTYPE *GetItemPosition)(
        IFolderView2 *This,
        PCUITEMID_CHILD pidl,
        POINT *ppt);

    HRESULT (STDMETHODCALLTYPE *GetSpacing)(
        IFolderView2 *This,
        POINT *ppt);

    HRESULT (STDMETHODCALLTYPE *GetDefaultSpacing)(
        IFolderView2 *This,
        POINT *ppt);

    HRESULT (STDMETHODCALLTYPE *GetAutoArrange)(
        IFolderView2 *This);

    HRESULT (STDMETHODCALLTYPE *SelectItem)(
        IFolderView2 *This,
        int iItem,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *SelectAndPositionItems)(
        IFolderView2 *This,
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        POINT *apt,
        DWORD dwFlags);

    /*** IFolderView2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetGroupBy)(
        IFolderView2 *This,
        REFPROPERTYKEY key,
        WINBOOL fAscending);

    HRESULT (STDMETHODCALLTYPE *GetGroupBy)(
        IFolderView2 *This,
        PROPERTYKEY *pkey,
        WINBOOL *pfAscending);

    HRESULT (STDMETHODCALLTYPE *SetViewProperty)(
        IFolderView2 *This,
        PCUITEMID_CHILD pidl,
        REFPROPERTYKEY propkey,
        REFPROPVARIANT propvar);

    HRESULT (STDMETHODCALLTYPE *GetViewProperty)(
        IFolderView2 *This,
        PCUITEMID_CHILD pidl,
        REFPROPERTYKEY propkey,
        PROPVARIANT *ppropvar);

    HRESULT (STDMETHODCALLTYPE *SetTileViewProperties)(
        IFolderView2 *This,
        PCUITEMID_CHILD pidl,
        LPCWSTR pszPropList);

    HRESULT (STDMETHODCALLTYPE *SetExtendedTileViewProperties)(
        IFolderView2 *This,
        PCUITEMID_CHILD pidl,
        LPCWSTR pszPropList);

    HRESULT (STDMETHODCALLTYPE *SetText)(
        IFolderView2 *This,
        FVTEXTTYPE iType,
        LPCWSTR pwszText);

    HRESULT (STDMETHODCALLTYPE *SetCurrentFolderFlags)(
        IFolderView2 *This,
        DWORD dwMask,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetCurrentFolderFlags)(
        IFolderView2 *This,
        DWORD *pdwFlags);

    HRESULT (STDMETHODCALLTYPE *GetSortColumnCount)(
        IFolderView2 *This,
        int *pcColumns);

    HRESULT (STDMETHODCALLTYPE *SetSortColumns)(
        IFolderView2 *This,
        const SORTCOLUMN *rgSortColumns,
        int cColumns);

    HRESULT (STDMETHODCALLTYPE *GetSortColumns)(
        IFolderView2 *This,
        SORTCOLUMN *rgSortColumns,
        int cColumns);

    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IFolderView2 *This,
        int iItem,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetVisibleItem)(
        IFolderView2 *This,
        int iStart,
        WINBOOL fPrevious,
        int *piItem);

    HRESULT (STDMETHODCALLTYPE *GetSelectedItem)(
        IFolderView2 *This,
        int iStart,
        int *piItem);

    HRESULT (STDMETHODCALLTYPE *GetSelection)(
        IFolderView2 *This,
        WINBOOL fNoneImpliesFolder,
        IShellItemArray **ppsia);

    HRESULT (STDMETHODCALLTYPE *GetSelectionState)(
        IFolderView2 *This,
        PCUITEMID_CHILD pidl,
        DWORD *pdwFlags);

    HRESULT (STDMETHODCALLTYPE *InvokeVerbOnSelection)(
        IFolderView2 *This,
        LPCSTR pszVerb);

    HRESULT (STDMETHODCALLTYPE *SetViewModeAndIconSize)(
        IFolderView2 *This,
        FOLDERVIEWMODE uViewMode,
        int iImageSize);

    HRESULT (STDMETHODCALLTYPE *GetViewModeAndIconSize)(
        IFolderView2 *This,
        FOLDERVIEWMODE *puViewMode,
        int *piImageSize);

    HRESULT (STDMETHODCALLTYPE *SetGroupSubsetCount)(
        IFolderView2 *This,
        UINT cVisibleRows);

    HRESULT (STDMETHODCALLTYPE *GetGroupSubsetCount)(
        IFolderView2 *This,
        UINT *pcVisibleRows);

    HRESULT (STDMETHODCALLTYPE *SetRedraw)(
        IFolderView2 *This,
        WINBOOL fRedrawOn);

    HRESULT (STDMETHODCALLTYPE *IsMoveInSameFolder)(
        IFolderView2 *This);

    HRESULT (STDMETHODCALLTYPE *DoRename)(
        IFolderView2 *This);

    END_INTERFACE
} IFolderView2Vtbl;

interface IFolderView2 {
    CONST_VTBL IFolderView2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFolderView2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFolderView2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFolderView2_Release(This) (This)->lpVtbl->Release(This)
/*** IFolderView methods ***/
#define IFolderView2_GetCurrentViewMode(This,pViewMode) (This)->lpVtbl->GetCurrentViewMode(This,pViewMode)
#define IFolderView2_SetCurrentViewMode(This,ViewMode) (This)->lpVtbl->SetCurrentViewMode(This,ViewMode)
#define IFolderView2_GetFolder(This,riid,ppv) (This)->lpVtbl->GetFolder(This,riid,ppv)
#define IFolderView2_Item(This,iItemIndex,ppidl) (This)->lpVtbl->Item(This,iItemIndex,ppidl)
#define IFolderView2_ItemCount(This,uFlags,pcItems) (This)->lpVtbl->ItemCount(This,uFlags,pcItems)
#define IFolderView2_Items(This,uFlags,riid,ppv) (This)->lpVtbl->Items(This,uFlags,riid,ppv)
#define IFolderView2_GetSelectionMarkedItem(This,piItem) (This)->lpVtbl->GetSelectionMarkedItem(This,piItem)
#define IFolderView2_GetFocusedItem(This,piItem) (This)->lpVtbl->GetFocusedItem(This,piItem)
#define IFolderView2_GetItemPosition(This,pidl,ppt) (This)->lpVtbl->GetItemPosition(This,pidl,ppt)
#define IFolderView2_GetSpacing(This,ppt) (This)->lpVtbl->GetSpacing(This,ppt)
#define IFolderView2_GetDefaultSpacing(This,ppt) (This)->lpVtbl->GetDefaultSpacing(This,ppt)
#define IFolderView2_GetAutoArrange(This) (This)->lpVtbl->GetAutoArrange(This)
#define IFolderView2_SelectItem(This,iItem,dwFlags) (This)->lpVtbl->SelectItem(This,iItem,dwFlags)
#define IFolderView2_SelectAndPositionItems(This,cidl,apidl,apt,dwFlags) (This)->lpVtbl->SelectAndPositionItems(This,cidl,apidl,apt,dwFlags)
/*** IFolderView2 methods ***/
#define IFolderView2_SetGroupBy(This,key,fAscending) (This)->lpVtbl->SetGroupBy(This,key,fAscending)
#define IFolderView2_GetGroupBy(This,pkey,pfAscending) (This)->lpVtbl->GetGroupBy(This,pkey,pfAscending)
#define IFolderView2_SetViewProperty(This,pidl,propkey,propvar) (This)->lpVtbl->SetViewProperty(This,pidl,propkey,propvar)
#define IFolderView2_GetViewProperty(This,pidl,propkey,ppropvar) (This)->lpVtbl->GetViewProperty(This,pidl,propkey,ppropvar)
#define IFolderView2_SetTileViewProperties(This,pidl,pszPropList) (This)->lpVtbl->SetTileViewProperties(This,pidl,pszPropList)
#define IFolderView2_SetExtendedTileViewProperties(This,pidl,pszPropList) (This)->lpVtbl->SetExtendedTileViewProperties(This,pidl,pszPropList)
#define IFolderView2_SetText(This,iType,pwszText) (This)->lpVtbl->SetText(This,iType,pwszText)
#define IFolderView2_SetCurrentFolderFlags(This,dwMask,dwFlags) (This)->lpVtbl->SetCurrentFolderFlags(This,dwMask,dwFlags)
#define IFolderView2_GetCurrentFolderFlags(This,pdwFlags) (This)->lpVtbl->GetCurrentFolderFlags(This,pdwFlags)
#define IFolderView2_GetSortColumnCount(This,pcColumns) (This)->lpVtbl->GetSortColumnCount(This,pcColumns)
#define IFolderView2_SetSortColumns(This,rgSortColumns,cColumns) (This)->lpVtbl->SetSortColumns(This,rgSortColumns,cColumns)
#define IFolderView2_GetSortColumns(This,rgSortColumns,cColumns) (This)->lpVtbl->GetSortColumns(This,rgSortColumns,cColumns)
#define IFolderView2_GetItem(This,iItem,riid,ppv) (This)->lpVtbl->GetItem(This,iItem,riid,ppv)
#define IFolderView2_GetVisibleItem(This,iStart,fPrevious,piItem) (This)->lpVtbl->GetVisibleItem(This,iStart,fPrevious,piItem)
#define IFolderView2_GetSelectedItem(This,iStart,piItem) (This)->lpVtbl->GetSelectedItem(This,iStart,piItem)
#define IFolderView2_GetSelection(This,fNoneImpliesFolder,ppsia) (This)->lpVtbl->GetSelection(This,fNoneImpliesFolder,ppsia)
#define IFolderView2_GetSelectionState(This,pidl,pdwFlags) (This)->lpVtbl->GetSelectionState(This,pidl,pdwFlags)
#define IFolderView2_InvokeVerbOnSelection(This,pszVerb) (This)->lpVtbl->InvokeVerbOnSelection(This,pszVerb)
#define IFolderView2_SetViewModeAndIconSize(This,uViewMode,iImageSize) (This)->lpVtbl->SetViewModeAndIconSize(This,uViewMode,iImageSize)
#define IFolderView2_GetViewModeAndIconSize(This,puViewMode,piImageSize) (This)->lpVtbl->GetViewModeAndIconSize(This,puViewMode,piImageSize)
#define IFolderView2_SetGroupSubsetCount(This,cVisibleRows) (This)->lpVtbl->SetGroupSubsetCount(This,cVisibleRows)
#define IFolderView2_GetGroupSubsetCount(This,pcVisibleRows) (This)->lpVtbl->GetGroupSubsetCount(This,pcVisibleRows)
#define IFolderView2_SetRedraw(This,fRedrawOn) (This)->lpVtbl->SetRedraw(This,fRedrawOn)
#define IFolderView2_IsMoveInSameFolder(This) (This)->lpVtbl->IsMoveInSameFolder(This)
#define IFolderView2_DoRename(This) (This)->lpVtbl->DoRename(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFolderView2_QueryInterface(IFolderView2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFolderView2_AddRef(IFolderView2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFolderView2_Release(IFolderView2* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderView methods ***/
static FORCEINLINE HRESULT IFolderView2_GetCurrentViewMode(IFolderView2* This,UINT *pViewMode) {
    return This->lpVtbl->GetCurrentViewMode(This,pViewMode);
}
static FORCEINLINE HRESULT IFolderView2_SetCurrentViewMode(IFolderView2* This,UINT ViewMode) {
    return This->lpVtbl->SetCurrentViewMode(This,ViewMode);
}
static FORCEINLINE HRESULT IFolderView2_GetFolder(IFolderView2* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetFolder(This,riid,ppv);
}
static FORCEINLINE HRESULT IFolderView2_Item(IFolderView2* This,int iItemIndex,PITEMID_CHILD *ppidl) {
    return This->lpVtbl->Item(This,iItemIndex,ppidl);
}
static FORCEINLINE HRESULT IFolderView2_ItemCount(IFolderView2* This,UINT uFlags,int *pcItems) {
    return This->lpVtbl->ItemCount(This,uFlags,pcItems);
}
static FORCEINLINE HRESULT IFolderView2_Items(IFolderView2* This,UINT uFlags,REFIID riid,void **ppv) {
    return This->lpVtbl->Items(This,uFlags,riid,ppv);
}
static FORCEINLINE HRESULT IFolderView2_GetSelectionMarkedItem(IFolderView2* This,int *piItem) {
    return This->lpVtbl->GetSelectionMarkedItem(This,piItem);
}
static FORCEINLINE HRESULT IFolderView2_GetFocusedItem(IFolderView2* This,int *piItem) {
    return This->lpVtbl->GetFocusedItem(This,piItem);
}
static FORCEINLINE HRESULT IFolderView2_GetItemPosition(IFolderView2* This,PCUITEMID_CHILD pidl,POINT *ppt) {
    return This->lpVtbl->GetItemPosition(This,pidl,ppt);
}
static FORCEINLINE HRESULT IFolderView2_GetSpacing(IFolderView2* This,POINT *ppt) {
    return This->lpVtbl->GetSpacing(This,ppt);
}
static FORCEINLINE HRESULT IFolderView2_GetDefaultSpacing(IFolderView2* This,POINT *ppt) {
    return This->lpVtbl->GetDefaultSpacing(This,ppt);
}
static FORCEINLINE HRESULT IFolderView2_GetAutoArrange(IFolderView2* This) {
    return This->lpVtbl->GetAutoArrange(This);
}
static FORCEINLINE HRESULT IFolderView2_SelectItem(IFolderView2* This,int iItem,DWORD dwFlags) {
    return This->lpVtbl->SelectItem(This,iItem,dwFlags);
}
static FORCEINLINE HRESULT IFolderView2_SelectAndPositionItems(IFolderView2* This,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,POINT *apt,DWORD dwFlags) {
    return This->lpVtbl->SelectAndPositionItems(This,cidl,apidl,apt,dwFlags);
}
/*** IFolderView2 methods ***/
static FORCEINLINE HRESULT IFolderView2_SetGroupBy(IFolderView2* This,REFPROPERTYKEY key,WINBOOL fAscending) {
    return This->lpVtbl->SetGroupBy(This,key,fAscending);
}
static FORCEINLINE HRESULT IFolderView2_GetGroupBy(IFolderView2* This,PROPERTYKEY *pkey,WINBOOL *pfAscending) {
    return This->lpVtbl->GetGroupBy(This,pkey,pfAscending);
}
static FORCEINLINE HRESULT IFolderView2_SetViewProperty(IFolderView2* This,PCUITEMID_CHILD pidl,REFPROPERTYKEY propkey,REFPROPVARIANT propvar) {
    return This->lpVtbl->SetViewProperty(This,pidl,propkey,propvar);
}
static FORCEINLINE HRESULT IFolderView2_GetViewProperty(IFolderView2* This,PCUITEMID_CHILD pidl,REFPROPERTYKEY propkey,PROPVARIANT *ppropvar) {
    return This->lpVtbl->GetViewProperty(This,pidl,propkey,ppropvar);
}
static FORCEINLINE HRESULT IFolderView2_SetTileViewProperties(IFolderView2* This,PCUITEMID_CHILD pidl,LPCWSTR pszPropList) {
    return This->lpVtbl->SetTileViewProperties(This,pidl,pszPropList);
}
static FORCEINLINE HRESULT IFolderView2_SetExtendedTileViewProperties(IFolderView2* This,PCUITEMID_CHILD pidl,LPCWSTR pszPropList) {
    return This->lpVtbl->SetExtendedTileViewProperties(This,pidl,pszPropList);
}
static FORCEINLINE HRESULT IFolderView2_SetText(IFolderView2* This,FVTEXTTYPE iType,LPCWSTR pwszText) {
    return This->lpVtbl->SetText(This,iType,pwszText);
}
static FORCEINLINE HRESULT IFolderView2_SetCurrentFolderFlags(IFolderView2* This,DWORD dwMask,DWORD dwFlags) {
    return This->lpVtbl->SetCurrentFolderFlags(This,dwMask,dwFlags);
}
static FORCEINLINE HRESULT IFolderView2_GetCurrentFolderFlags(IFolderView2* This,DWORD *pdwFlags) {
    return This->lpVtbl->GetCurrentFolderFlags(This,pdwFlags);
}
static FORCEINLINE HRESULT IFolderView2_GetSortColumnCount(IFolderView2* This,int *pcColumns) {
    return This->lpVtbl->GetSortColumnCount(This,pcColumns);
}
static FORCEINLINE HRESULT IFolderView2_SetSortColumns(IFolderView2* This,const SORTCOLUMN *rgSortColumns,int cColumns) {
    return This->lpVtbl->SetSortColumns(This,rgSortColumns,cColumns);
}
static FORCEINLINE HRESULT IFolderView2_GetSortColumns(IFolderView2* This,SORTCOLUMN *rgSortColumns,int cColumns) {
    return This->lpVtbl->GetSortColumns(This,rgSortColumns,cColumns);
}
static FORCEINLINE HRESULT IFolderView2_GetItem(IFolderView2* This,int iItem,REFIID riid,void **ppv) {
    return This->lpVtbl->GetItem(This,iItem,riid,ppv);
}
static FORCEINLINE HRESULT IFolderView2_GetVisibleItem(IFolderView2* This,int iStart,WINBOOL fPrevious,int *piItem) {
    return This->lpVtbl->GetVisibleItem(This,iStart,fPrevious,piItem);
}
static FORCEINLINE HRESULT IFolderView2_GetSelectedItem(IFolderView2* This,int iStart,int *piItem) {
    return This->lpVtbl->GetSelectedItem(This,iStart,piItem);
}
static FORCEINLINE HRESULT IFolderView2_GetSelection(IFolderView2* This,WINBOOL fNoneImpliesFolder,IShellItemArray **ppsia) {
    return This->lpVtbl->GetSelection(This,fNoneImpliesFolder,ppsia);
}
static FORCEINLINE HRESULT IFolderView2_GetSelectionState(IFolderView2* This,PCUITEMID_CHILD pidl,DWORD *pdwFlags) {
    return This->lpVtbl->GetSelectionState(This,pidl,pdwFlags);
}
static FORCEINLINE HRESULT IFolderView2_InvokeVerbOnSelection(IFolderView2* This,LPCSTR pszVerb) {
    return This->lpVtbl->InvokeVerbOnSelection(This,pszVerb);
}
static FORCEINLINE HRESULT IFolderView2_SetViewModeAndIconSize(IFolderView2* This,FOLDERVIEWMODE uViewMode,int iImageSize) {
    return This->lpVtbl->SetViewModeAndIconSize(This,uViewMode,iImageSize);
}
static FORCEINLINE HRESULT IFolderView2_GetViewModeAndIconSize(IFolderView2* This,FOLDERVIEWMODE *puViewMode,int *piImageSize) {
    return This->lpVtbl->GetViewModeAndIconSize(This,puViewMode,piImageSize);
}
static FORCEINLINE HRESULT IFolderView2_SetGroupSubsetCount(IFolderView2* This,UINT cVisibleRows) {
    return This->lpVtbl->SetGroupSubsetCount(This,cVisibleRows);
}
static FORCEINLINE HRESULT IFolderView2_GetGroupSubsetCount(IFolderView2* This,UINT *pcVisibleRows) {
    return This->lpVtbl->GetGroupSubsetCount(This,pcVisibleRows);
}
static FORCEINLINE HRESULT IFolderView2_SetRedraw(IFolderView2* This,WINBOOL fRedrawOn) {
    return This->lpVtbl->SetRedraw(This,fRedrawOn);
}
static FORCEINLINE HRESULT IFolderView2_IsMoveInSameFolder(IFolderView2* This) {
    return This->lpVtbl->IsMoveInSameFolder(This);
}
static FORCEINLINE HRESULT IFolderView2_DoRename(IFolderView2* This) {
    return This->lpVtbl->DoRename(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IFolderView2_RemoteGetGroupBy_Proxy(
    IFolderView2* This,
    PROPERTYKEY *pkey,
    WINBOOL *pfAscending);
void __RPC_STUB IFolderView2_RemoteGetGroupBy_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IFolderView2_GetGroupBy_Proxy(
    IFolderView2* This,
    PROPERTYKEY *pkey,
    WINBOOL *pfAscending);
HRESULT __RPC_STUB IFolderView2_GetGroupBy_Stub(
    IFolderView2* This,
    PROPERTYKEY *pkey,
    WINBOOL *pfAscending);

#endif  /* __IFolderView2_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_VISTA
/*****************************************************************************
 * IFolderViewSettings interface
 */
#ifndef __IFolderViewSettings_INTERFACE_DEFINED__
#define __IFolderViewSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFolderViewSettings, 0xae8c987d, 0x8797, 0x4ed3, 0xbe,0x72, 0x2a,0x47,0xdd,0x93,0x8d,0xb0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ae8c987d-8797-4ed3-be72-2a47dd938db0")
IFolderViewSettings : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetColumnPropertyList(
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGroupByProperty(
        PROPERTYKEY *pkey,
        WINBOOL *pfGroupAscending) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetViewMode(
        FOLDERLOGICALVIEWMODE *plvm) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIconSize(
        UINT *puIconSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolderFlags(
        FOLDERFLAGS *pfolderMask,
        FOLDERFLAGS *pfolderFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSortColumns(
        SORTCOLUMN *rgSortColumns,
        UINT cColumnsIn,
        UINT *pcColumnsOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGroupSubsetCount(
        UINT *pcVisibleRows) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFolderViewSettings, 0xae8c987d, 0x8797, 0x4ed3, 0xbe,0x72, 0x2a,0x47,0xdd,0x93,0x8d,0xb0)
#endif
#else
typedef struct IFolderViewSettingsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFolderViewSettings *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFolderViewSettings *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFolderViewSettings *This);

    /*** IFolderViewSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *GetColumnPropertyList)(
        IFolderViewSettings *This,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetGroupByProperty)(
        IFolderViewSettings *This,
        PROPERTYKEY *pkey,
        WINBOOL *pfGroupAscending);

    HRESULT (STDMETHODCALLTYPE *GetViewMode)(
        IFolderViewSettings *This,
        FOLDERLOGICALVIEWMODE *plvm);

    HRESULT (STDMETHODCALLTYPE *GetIconSize)(
        IFolderViewSettings *This,
        UINT *puIconSize);

    HRESULT (STDMETHODCALLTYPE *GetFolderFlags)(
        IFolderViewSettings *This,
        FOLDERFLAGS *pfolderMask,
        FOLDERFLAGS *pfolderFlags);

    HRESULT (STDMETHODCALLTYPE *GetSortColumns)(
        IFolderViewSettings *This,
        SORTCOLUMN *rgSortColumns,
        UINT cColumnsIn,
        UINT *pcColumnsOut);

    HRESULT (STDMETHODCALLTYPE *GetGroupSubsetCount)(
        IFolderViewSettings *This,
        UINT *pcVisibleRows);

    END_INTERFACE
} IFolderViewSettingsVtbl;

interface IFolderViewSettings {
    CONST_VTBL IFolderViewSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFolderViewSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFolderViewSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFolderViewSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IFolderViewSettings methods ***/
#define IFolderViewSettings_GetColumnPropertyList(This,riid,ppv) (This)->lpVtbl->GetColumnPropertyList(This,riid,ppv)
#define IFolderViewSettings_GetGroupByProperty(This,pkey,pfGroupAscending) (This)->lpVtbl->GetGroupByProperty(This,pkey,pfGroupAscending)
#define IFolderViewSettings_GetViewMode(This,plvm) (This)->lpVtbl->GetViewMode(This,plvm)
#define IFolderViewSettings_GetIconSize(This,puIconSize) (This)->lpVtbl->GetIconSize(This,puIconSize)
#define IFolderViewSettings_GetFolderFlags(This,pfolderMask,pfolderFlags) (This)->lpVtbl->GetFolderFlags(This,pfolderMask,pfolderFlags)
#define IFolderViewSettings_GetSortColumns(This,rgSortColumns,cColumnsIn,pcColumnsOut) (This)->lpVtbl->GetSortColumns(This,rgSortColumns,cColumnsIn,pcColumnsOut)
#define IFolderViewSettings_GetGroupSubsetCount(This,pcVisibleRows) (This)->lpVtbl->GetGroupSubsetCount(This,pcVisibleRows)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFolderViewSettings_QueryInterface(IFolderViewSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFolderViewSettings_AddRef(IFolderViewSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFolderViewSettings_Release(IFolderViewSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderViewSettings methods ***/
static FORCEINLINE HRESULT IFolderViewSettings_GetColumnPropertyList(IFolderViewSettings* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetColumnPropertyList(This,riid,ppv);
}
static FORCEINLINE HRESULT IFolderViewSettings_GetGroupByProperty(IFolderViewSettings* This,PROPERTYKEY *pkey,WINBOOL *pfGroupAscending) {
    return This->lpVtbl->GetGroupByProperty(This,pkey,pfGroupAscending);
}
static FORCEINLINE HRESULT IFolderViewSettings_GetViewMode(IFolderViewSettings* This,FOLDERLOGICALVIEWMODE *plvm) {
    return This->lpVtbl->GetViewMode(This,plvm);
}
static FORCEINLINE HRESULT IFolderViewSettings_GetIconSize(IFolderViewSettings* This,UINT *puIconSize) {
    return This->lpVtbl->GetIconSize(This,puIconSize);
}
static FORCEINLINE HRESULT IFolderViewSettings_GetFolderFlags(IFolderViewSettings* This,FOLDERFLAGS *pfolderMask,FOLDERFLAGS *pfolderFlags) {
    return This->lpVtbl->GetFolderFlags(This,pfolderMask,pfolderFlags);
}
static FORCEINLINE HRESULT IFolderViewSettings_GetSortColumns(IFolderViewSettings* This,SORTCOLUMN *rgSortColumns,UINT cColumnsIn,UINT *pcColumnsOut) {
    return This->lpVtbl->GetSortColumns(This,rgSortColumns,cColumnsIn,pcColumnsOut);
}
static FORCEINLINE HRESULT IFolderViewSettings_GetGroupSubsetCount(IFolderViewSettings* This,UINT *pcVisibleRows) {
    return This->lpVtbl->GetGroupSubsetCount(This,pcVisibleRows);
}
#endif
#endif

#endif


#endif  /* __IFolderViewSettings_INTERFACE_DEFINED__ */

#endif
#endif

#if _WIN32_IE >= _WIN32_IE_IE70
/*****************************************************************************
 * IPreviewHandlerVisuals interface
 */
#ifndef __IPreviewHandlerVisuals_INTERFACE_DEFINED__
#define __IPreviewHandlerVisuals_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPreviewHandlerVisuals, 0x196bf9a5, 0xb346, 0x4ef0, 0xaa,0x1e, 0x5d,0xcd,0xb7,0x67,0x68,0xb1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("196bf9a5-b346-4ef0-aa1e-5dcdb76768b1")
IPreviewHandlerVisuals : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetBackgroundColor(
        COLORREF color) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFont(
        const LOGFONTW *plf) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTextColor(
        COLORREF color) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPreviewHandlerVisuals, 0x196bf9a5, 0xb346, 0x4ef0, 0xaa,0x1e, 0x5d,0xcd,0xb7,0x67,0x68,0xb1)
#endif
#else
typedef struct IPreviewHandlerVisualsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPreviewHandlerVisuals *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPreviewHandlerVisuals *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPreviewHandlerVisuals *This);

    /*** IPreviewHandlerVisuals methods ***/
    HRESULT (STDMETHODCALLTYPE *SetBackgroundColor)(
        IPreviewHandlerVisuals *This,
        COLORREF color);

    HRESULT (STDMETHODCALLTYPE *SetFont)(
        IPreviewHandlerVisuals *This,
        const LOGFONTW *plf);

    HRESULT (STDMETHODCALLTYPE *SetTextColor)(
        IPreviewHandlerVisuals *This,
        COLORREF color);

    END_INTERFACE
} IPreviewHandlerVisualsVtbl;

interface IPreviewHandlerVisuals {
    CONST_VTBL IPreviewHandlerVisualsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPreviewHandlerVisuals_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPreviewHandlerVisuals_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPreviewHandlerVisuals_Release(This) (This)->lpVtbl->Release(This)
/*** IPreviewHandlerVisuals methods ***/
#define IPreviewHandlerVisuals_SetBackgroundColor(This,color) (This)->lpVtbl->SetBackgroundColor(This,color)
#define IPreviewHandlerVisuals_SetFont(This,plf) (This)->lpVtbl->SetFont(This,plf)
#define IPreviewHandlerVisuals_SetTextColor(This,color) (This)->lpVtbl->SetTextColor(This,color)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPreviewHandlerVisuals_QueryInterface(IPreviewHandlerVisuals* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPreviewHandlerVisuals_AddRef(IPreviewHandlerVisuals* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPreviewHandlerVisuals_Release(IPreviewHandlerVisuals* This) {
    return This->lpVtbl->Release(This);
}
/*** IPreviewHandlerVisuals methods ***/
static FORCEINLINE HRESULT IPreviewHandlerVisuals_SetBackgroundColor(IPreviewHandlerVisuals* This,COLORREF color) {
    return This->lpVtbl->SetBackgroundColor(This,color);
}
static FORCEINLINE HRESULT IPreviewHandlerVisuals_SetFont(IPreviewHandlerVisuals* This,const LOGFONTW *plf) {
    return This->lpVtbl->SetFont(This,plf);
}
static FORCEINLINE HRESULT IPreviewHandlerVisuals_SetTextColor(IPreviewHandlerVisuals* This,COLORREF color) {
    return This->lpVtbl->SetTextColor(This,color);
}
#endif
#endif

#endif


#endif  /* __IPreviewHandlerVisuals_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IVisualProperties interface
 */
#ifndef __IVisualProperties_INTERFACE_DEFINED__
#define __IVisualProperties_INTERFACE_DEFINED__

typedef enum VPWATERMARKFLAGS {
    VPWF_DEFAULT = 0x0,
    VPWF_ALPHABLEND = 0x1
} VPWATERMARKFLAGS;

typedef enum VPCOLORFLAGS {
    VPCF_TEXT = 1,
    VPCF_BACKGROUND = 2,
    VPCF_SORTCOLUMN = 3,
    VPCF_SUBTEXT = 4,
    VPCF_TEXTBACKGROUND = 5
} VPCOLORFLAGS;

DEFINE_ENUM_FLAG_OPERATORS(VPWATERMARKFLAGS)

DEFINE_GUID(IID_IVisualProperties, 0xe693cf68, 0xd967, 0x4112, 0x87,0x63, 0x99,0x17,0x2a,0xee,0x5e,0x5a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e693cf68-d967-4112-8763-99172aee5e5a")
IVisualProperties : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetWatermark(
        HBITMAP hbmp,
        VPWATERMARKFLAGS vpwf) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetColor(
        VPCOLORFLAGS vpcf,
        COLORREF cr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColor(
        VPCOLORFLAGS vpcf,
        COLORREF *pcr) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetItemHeight(
        int cyItemInPixels) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItemHeight(
        int *cyItemInPixels) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFont(
        const LOGFONTW *plf,
        WINBOOL bRedraw) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFont(
        LOGFONTW *plf) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTheme(
        LPCWSTR pszSubAppName,
        LPCWSTR pszSubIdList) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVisualProperties, 0xe693cf68, 0xd967, 0x4112, 0x87,0x63, 0x99,0x17,0x2a,0xee,0x5e,0x5a)
#endif
#else
typedef struct IVisualPropertiesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVisualProperties *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVisualProperties *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVisualProperties *This);

    /*** IVisualProperties methods ***/
    HRESULT (STDMETHODCALLTYPE *SetWatermark)(
        IVisualProperties *This,
        HBITMAP hbmp,
        VPWATERMARKFLAGS vpwf);

    HRESULT (STDMETHODCALLTYPE *SetColor)(
        IVisualProperties *This,
        VPCOLORFLAGS vpcf,
        COLORREF cr);

    HRESULT (STDMETHODCALLTYPE *GetColor)(
        IVisualProperties *This,
        VPCOLORFLAGS vpcf,
        COLORREF *pcr);

    HRESULT (STDMETHODCALLTYPE *SetItemHeight)(
        IVisualProperties *This,
        int cyItemInPixels);

    HRESULT (STDMETHODCALLTYPE *GetItemHeight)(
        IVisualProperties *This,
        int *cyItemInPixels);

    HRESULT (STDMETHODCALLTYPE *SetFont)(
        IVisualProperties *This,
        const LOGFONTW *plf,
        WINBOOL bRedraw);

    HRESULT (STDMETHODCALLTYPE *GetFont)(
        IVisualProperties *This,
        LOGFONTW *plf);

    HRESULT (STDMETHODCALLTYPE *SetTheme)(
        IVisualProperties *This,
        LPCWSTR pszSubAppName,
        LPCWSTR pszSubIdList);

    END_INTERFACE
} IVisualPropertiesVtbl;

interface IVisualProperties {
    CONST_VTBL IVisualPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVisualProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVisualProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVisualProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IVisualProperties methods ***/
#define IVisualProperties_SetWatermark(This,hbmp,vpwf) (This)->lpVtbl->SetWatermark(This,hbmp,vpwf)
#define IVisualProperties_SetColor(This,vpcf,cr) (This)->lpVtbl->SetColor(This,vpcf,cr)
#define IVisualProperties_GetColor(This,vpcf,pcr) (This)->lpVtbl->GetColor(This,vpcf,pcr)
#define IVisualProperties_SetItemHeight(This,cyItemInPixels) (This)->lpVtbl->SetItemHeight(This,cyItemInPixels)
#define IVisualProperties_GetItemHeight(This,cyItemInPixels) (This)->lpVtbl->GetItemHeight(This,cyItemInPixels)
#define IVisualProperties_SetFont(This,plf,bRedraw) (This)->lpVtbl->SetFont(This,plf,bRedraw)
#define IVisualProperties_GetFont(This,plf) (This)->lpVtbl->GetFont(This,plf)
#define IVisualProperties_SetTheme(This,pszSubAppName,pszSubIdList) (This)->lpVtbl->SetTheme(This,pszSubAppName,pszSubIdList)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVisualProperties_QueryInterface(IVisualProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVisualProperties_AddRef(IVisualProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVisualProperties_Release(IVisualProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IVisualProperties methods ***/
static FORCEINLINE HRESULT IVisualProperties_SetWatermark(IVisualProperties* This,HBITMAP hbmp,VPWATERMARKFLAGS vpwf) {
    return This->lpVtbl->SetWatermark(This,hbmp,vpwf);
}
static FORCEINLINE HRESULT IVisualProperties_SetColor(IVisualProperties* This,VPCOLORFLAGS vpcf,COLORREF cr) {
    return This->lpVtbl->SetColor(This,vpcf,cr);
}
static FORCEINLINE HRESULT IVisualProperties_GetColor(IVisualProperties* This,VPCOLORFLAGS vpcf,COLORREF *pcr) {
    return This->lpVtbl->GetColor(This,vpcf,pcr);
}
static FORCEINLINE HRESULT IVisualProperties_SetItemHeight(IVisualProperties* This,int cyItemInPixels) {
    return This->lpVtbl->SetItemHeight(This,cyItemInPixels);
}
static FORCEINLINE HRESULT IVisualProperties_GetItemHeight(IVisualProperties* This,int *cyItemInPixels) {
    return This->lpVtbl->GetItemHeight(This,cyItemInPixels);
}
static FORCEINLINE HRESULT IVisualProperties_SetFont(IVisualProperties* This,const LOGFONTW *plf,WINBOOL bRedraw) {
    return This->lpVtbl->SetFont(This,plf,bRedraw);
}
static FORCEINLINE HRESULT IVisualProperties_GetFont(IVisualProperties* This,LOGFONTW *plf) {
    return This->lpVtbl->GetFont(This,plf);
}
static FORCEINLINE HRESULT IVisualProperties_SetTheme(IVisualProperties* This,LPCWSTR pszSubAppName,LPCWSTR pszSubIdList) {
    return This->lpVtbl->SetTheme(This,pszSubAppName,pszSubIdList);
}
#endif
#endif

#endif


#endif  /* __IVisualProperties_INTERFACE_DEFINED__ */

#endif

#define CDBOSC_SETFOCUS 0x00000000
#define CDBOSC_KILLFOCUS 0x00000001
#define CDBOSC_SELCHANGE 0x00000002
#define CDBOSC_RENAME 0x00000003
#define CDBOSC_STATECHANGE 0x00000004

/*****************************************************************************
 * ICommDlgBrowser interface
 */
#ifndef __ICommDlgBrowser_INTERFACE_DEFINED__
#define __ICommDlgBrowser_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICommDlgBrowser, 0x000214f1, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214f1-0000-0000-c000-000000000046")
ICommDlgBrowser : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnDefaultCommand(
        IShellView *ppshv) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnStateChange(
        IShellView *ppshv,
        ULONG uChange) = 0;

    virtual HRESULT STDMETHODCALLTYPE IncludeObject(
        IShellView *ppshv,
        PCUITEMID_CHILD pidl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICommDlgBrowser, 0x000214f1, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ICommDlgBrowserVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICommDlgBrowser *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICommDlgBrowser *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICommDlgBrowser *This);

    /*** ICommDlgBrowser methods ***/
    HRESULT (STDMETHODCALLTYPE *OnDefaultCommand)(
        ICommDlgBrowser *This,
        IShellView *ppshv);

    HRESULT (STDMETHODCALLTYPE *OnStateChange)(
        ICommDlgBrowser *This,
        IShellView *ppshv,
        ULONG uChange);

    HRESULT (STDMETHODCALLTYPE *IncludeObject)(
        ICommDlgBrowser *This,
        IShellView *ppshv,
        PCUITEMID_CHILD pidl);

    END_INTERFACE
} ICommDlgBrowserVtbl;

interface ICommDlgBrowser {
    CONST_VTBL ICommDlgBrowserVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICommDlgBrowser_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICommDlgBrowser_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICommDlgBrowser_Release(This) (This)->lpVtbl->Release(This)
/*** ICommDlgBrowser methods ***/
#define ICommDlgBrowser_OnDefaultCommand(This,ppshv) (This)->lpVtbl->OnDefaultCommand(This,ppshv)
#define ICommDlgBrowser_OnStateChange(This,ppshv,uChange) (This)->lpVtbl->OnStateChange(This,ppshv,uChange)
#define ICommDlgBrowser_IncludeObject(This,ppshv,pidl) (This)->lpVtbl->IncludeObject(This,ppshv,pidl)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICommDlgBrowser_QueryInterface(ICommDlgBrowser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICommDlgBrowser_AddRef(ICommDlgBrowser* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICommDlgBrowser_Release(ICommDlgBrowser* This) {
    return This->lpVtbl->Release(This);
}
/*** ICommDlgBrowser methods ***/
static FORCEINLINE HRESULT ICommDlgBrowser_OnDefaultCommand(ICommDlgBrowser* This,IShellView *ppshv) {
    return This->lpVtbl->OnDefaultCommand(This,ppshv);
}
static FORCEINLINE HRESULT ICommDlgBrowser_OnStateChange(ICommDlgBrowser* This,IShellView *ppshv,ULONG uChange) {
    return This->lpVtbl->OnStateChange(This,ppshv,uChange);
}
static FORCEINLINE HRESULT ICommDlgBrowser_IncludeObject(ICommDlgBrowser* This,IShellView *ppshv,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->IncludeObject(This,ppshv,pidl);
}
#endif
#endif

#endif


#endif  /* __ICommDlgBrowser_INTERFACE_DEFINED__ */

typedef ICommDlgBrowser *LPCOMMDLGBROWSER;

#define SID_SExplorerBrowserFrame IID_ICommDlgBrowser

#define CDB2N_CONTEXTMENU_DONE 0x00000001
#define CDB2N_CONTEXTMENU_START 0x00000002

#define CDB2GVF_SHOWALLFILES 0x1
#if NTDDI_VERSION >= NTDDI_VISTA
#define CDB2GVF_ISFILESAVE 0x2
#define CDB2GVF_ALLOWPREVIEWPANE 0x4
#define CDB2GVF_NOSELECTVERB 0x8
#define CDB2GVF_NOINCLUDEITEM 0x10
#define CDB2GVF_ISFOLDERPICKER 0x20
#define CDB2GVF_ADDSHIELD 0x40
#endif

/*****************************************************************************
 * ICommDlgBrowser2 interface
 */
#ifndef __ICommDlgBrowser2_INTERFACE_DEFINED__
#define __ICommDlgBrowser2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICommDlgBrowser2, 0x10339516, 0x2894, 0x11d2, 0x90,0x39, 0x00,0xc0,0x4f,0x8e,0xeb,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("10339516-2894-11d2-9039-00c04f8eeb3e")
ICommDlgBrowser2 : public ICommDlgBrowser
{
    virtual HRESULT STDMETHODCALLTYPE Notify(
        IShellView *ppshv,
        DWORD dwNotifyType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultMenuText(
        IShellView *ppshv,
        LPWSTR pszText,
        int cchMax) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetViewFlags(
        DWORD *pdwFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICommDlgBrowser2, 0x10339516, 0x2894, 0x11d2, 0x90,0x39, 0x00,0xc0,0x4f,0x8e,0xeb,0x3e)
#endif
#else
typedef struct ICommDlgBrowser2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICommDlgBrowser2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICommDlgBrowser2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICommDlgBrowser2 *This);

    /*** ICommDlgBrowser methods ***/
    HRESULT (STDMETHODCALLTYPE *OnDefaultCommand)(
        ICommDlgBrowser2 *This,
        IShellView *ppshv);

    HRESULT (STDMETHODCALLTYPE *OnStateChange)(
        ICommDlgBrowser2 *This,
        IShellView *ppshv,
        ULONG uChange);

    HRESULT (STDMETHODCALLTYPE *IncludeObject)(
        ICommDlgBrowser2 *This,
        IShellView *ppshv,
        PCUITEMID_CHILD pidl);

    /*** ICommDlgBrowser2 methods ***/
    HRESULT (STDMETHODCALLTYPE *Notify)(
        ICommDlgBrowser2 *This,
        IShellView *ppshv,
        DWORD dwNotifyType);

    HRESULT (STDMETHODCALLTYPE *GetDefaultMenuText)(
        ICommDlgBrowser2 *This,
        IShellView *ppshv,
        LPWSTR pszText,
        int cchMax);

    HRESULT (STDMETHODCALLTYPE *GetViewFlags)(
        ICommDlgBrowser2 *This,
        DWORD *pdwFlags);

    END_INTERFACE
} ICommDlgBrowser2Vtbl;

interface ICommDlgBrowser2 {
    CONST_VTBL ICommDlgBrowser2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICommDlgBrowser2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICommDlgBrowser2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICommDlgBrowser2_Release(This) (This)->lpVtbl->Release(This)
/*** ICommDlgBrowser methods ***/
#define ICommDlgBrowser2_OnDefaultCommand(This,ppshv) (This)->lpVtbl->OnDefaultCommand(This,ppshv)
#define ICommDlgBrowser2_OnStateChange(This,ppshv,uChange) (This)->lpVtbl->OnStateChange(This,ppshv,uChange)
#define ICommDlgBrowser2_IncludeObject(This,ppshv,pidl) (This)->lpVtbl->IncludeObject(This,ppshv,pidl)
/*** ICommDlgBrowser2 methods ***/
#define ICommDlgBrowser2_Notify(This,ppshv,dwNotifyType) (This)->lpVtbl->Notify(This,ppshv,dwNotifyType)
#define ICommDlgBrowser2_GetDefaultMenuText(This,ppshv,pszText,cchMax) (This)->lpVtbl->GetDefaultMenuText(This,ppshv,pszText,cchMax)
#define ICommDlgBrowser2_GetViewFlags(This,pdwFlags) (This)->lpVtbl->GetViewFlags(This,pdwFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICommDlgBrowser2_QueryInterface(ICommDlgBrowser2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICommDlgBrowser2_AddRef(ICommDlgBrowser2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICommDlgBrowser2_Release(ICommDlgBrowser2* This) {
    return This->lpVtbl->Release(This);
}
/*** ICommDlgBrowser methods ***/
static FORCEINLINE HRESULT ICommDlgBrowser2_OnDefaultCommand(ICommDlgBrowser2* This,IShellView *ppshv) {
    return This->lpVtbl->OnDefaultCommand(This,ppshv);
}
static FORCEINLINE HRESULT ICommDlgBrowser2_OnStateChange(ICommDlgBrowser2* This,IShellView *ppshv,ULONG uChange) {
    return This->lpVtbl->OnStateChange(This,ppshv,uChange);
}
static FORCEINLINE HRESULT ICommDlgBrowser2_IncludeObject(ICommDlgBrowser2* This,IShellView *ppshv,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->IncludeObject(This,ppshv,pidl);
}
/*** ICommDlgBrowser2 methods ***/
static FORCEINLINE HRESULT ICommDlgBrowser2_Notify(ICommDlgBrowser2* This,IShellView *ppshv,DWORD dwNotifyType) {
    return This->lpVtbl->Notify(This,ppshv,dwNotifyType);
}
static FORCEINLINE HRESULT ICommDlgBrowser2_GetDefaultMenuText(ICommDlgBrowser2* This,IShellView *ppshv,LPWSTR pszText,int cchMax) {
    return This->lpVtbl->GetDefaultMenuText(This,ppshv,pszText,cchMax);
}
static FORCEINLINE HRESULT ICommDlgBrowser2_GetViewFlags(ICommDlgBrowser2* This,DWORD *pdwFlags) {
    return This->lpVtbl->GetViewFlags(This,pdwFlags);
}
#endif
#endif

#endif


#endif  /* __ICommDlgBrowser2_INTERFACE_DEFINED__ */

typedef ICommDlgBrowser2 *LPCOMMDLGBROWSER2;

#if _WIN32_IE >= _WIN32_IE_IE70
/*****************************************************************************
 * ICommDlgBrowser3 interface
 */
#ifndef __ICommDlgBrowser3_INTERFACE_DEFINED__
#define __ICommDlgBrowser3_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICommDlgBrowser3, 0xc8ad25a1, 0x3294, 0x41ee, 0x81,0x65, 0x71,0x17,0x4b,0xd0,0x1c,0x57);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c8ad25a1-3294-41ee-8165-71174bd01c57")
ICommDlgBrowser3 : public ICommDlgBrowser2
{
    virtual HRESULT STDMETHODCALLTYPE OnColumnClicked(
        IShellView *ppshv,
        int iColumn) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentFilter(
        LPWSTR pszFileSpec,
        int cchFileSpec) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnPreViewCreated(
        IShellView *ppshv) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICommDlgBrowser3, 0xc8ad25a1, 0x3294, 0x41ee, 0x81,0x65, 0x71,0x17,0x4b,0xd0,0x1c,0x57)
#endif
#else
typedef struct ICommDlgBrowser3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICommDlgBrowser3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICommDlgBrowser3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICommDlgBrowser3 *This);

    /*** ICommDlgBrowser methods ***/
    HRESULT (STDMETHODCALLTYPE *OnDefaultCommand)(
        ICommDlgBrowser3 *This,
        IShellView *ppshv);

    HRESULT (STDMETHODCALLTYPE *OnStateChange)(
        ICommDlgBrowser3 *This,
        IShellView *ppshv,
        ULONG uChange);

    HRESULT (STDMETHODCALLTYPE *IncludeObject)(
        ICommDlgBrowser3 *This,
        IShellView *ppshv,
        PCUITEMID_CHILD pidl);

    /*** ICommDlgBrowser2 methods ***/
    HRESULT (STDMETHODCALLTYPE *Notify)(
        ICommDlgBrowser3 *This,
        IShellView *ppshv,
        DWORD dwNotifyType);

    HRESULT (STDMETHODCALLTYPE *GetDefaultMenuText)(
        ICommDlgBrowser3 *This,
        IShellView *ppshv,
        LPWSTR pszText,
        int cchMax);

    HRESULT (STDMETHODCALLTYPE *GetViewFlags)(
        ICommDlgBrowser3 *This,
        DWORD *pdwFlags);

    /*** ICommDlgBrowser3 methods ***/
    HRESULT (STDMETHODCALLTYPE *OnColumnClicked)(
        ICommDlgBrowser3 *This,
        IShellView *ppshv,
        int iColumn);

    HRESULT (STDMETHODCALLTYPE *GetCurrentFilter)(
        ICommDlgBrowser3 *This,
        LPWSTR pszFileSpec,
        int cchFileSpec);

    HRESULT (STDMETHODCALLTYPE *OnPreViewCreated)(
        ICommDlgBrowser3 *This,
        IShellView *ppshv);

    END_INTERFACE
} ICommDlgBrowser3Vtbl;

interface ICommDlgBrowser3 {
    CONST_VTBL ICommDlgBrowser3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICommDlgBrowser3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICommDlgBrowser3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICommDlgBrowser3_Release(This) (This)->lpVtbl->Release(This)
/*** ICommDlgBrowser methods ***/
#define ICommDlgBrowser3_OnDefaultCommand(This,ppshv) (This)->lpVtbl->OnDefaultCommand(This,ppshv)
#define ICommDlgBrowser3_OnStateChange(This,ppshv,uChange) (This)->lpVtbl->OnStateChange(This,ppshv,uChange)
#define ICommDlgBrowser3_IncludeObject(This,ppshv,pidl) (This)->lpVtbl->IncludeObject(This,ppshv,pidl)
/*** ICommDlgBrowser2 methods ***/
#define ICommDlgBrowser3_Notify(This,ppshv,dwNotifyType) (This)->lpVtbl->Notify(This,ppshv,dwNotifyType)
#define ICommDlgBrowser3_GetDefaultMenuText(This,ppshv,pszText,cchMax) (This)->lpVtbl->GetDefaultMenuText(This,ppshv,pszText,cchMax)
#define ICommDlgBrowser3_GetViewFlags(This,pdwFlags) (This)->lpVtbl->GetViewFlags(This,pdwFlags)
/*** ICommDlgBrowser3 methods ***/
#define ICommDlgBrowser3_OnColumnClicked(This,ppshv,iColumn) (This)->lpVtbl->OnColumnClicked(This,ppshv,iColumn)
#define ICommDlgBrowser3_GetCurrentFilter(This,pszFileSpec,cchFileSpec) (This)->lpVtbl->GetCurrentFilter(This,pszFileSpec,cchFileSpec)
#define ICommDlgBrowser3_OnPreViewCreated(This,ppshv) (This)->lpVtbl->OnPreViewCreated(This,ppshv)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICommDlgBrowser3_QueryInterface(ICommDlgBrowser3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICommDlgBrowser3_AddRef(ICommDlgBrowser3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICommDlgBrowser3_Release(ICommDlgBrowser3* This) {
    return This->lpVtbl->Release(This);
}
/*** ICommDlgBrowser methods ***/
static FORCEINLINE HRESULT ICommDlgBrowser3_OnDefaultCommand(ICommDlgBrowser3* This,IShellView *ppshv) {
    return This->lpVtbl->OnDefaultCommand(This,ppshv);
}
static FORCEINLINE HRESULT ICommDlgBrowser3_OnStateChange(ICommDlgBrowser3* This,IShellView *ppshv,ULONG uChange) {
    return This->lpVtbl->OnStateChange(This,ppshv,uChange);
}
static FORCEINLINE HRESULT ICommDlgBrowser3_IncludeObject(ICommDlgBrowser3* This,IShellView *ppshv,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->IncludeObject(This,ppshv,pidl);
}
/*** ICommDlgBrowser2 methods ***/
static FORCEINLINE HRESULT ICommDlgBrowser3_Notify(ICommDlgBrowser3* This,IShellView *ppshv,DWORD dwNotifyType) {
    return This->lpVtbl->Notify(This,ppshv,dwNotifyType);
}
static FORCEINLINE HRESULT ICommDlgBrowser3_GetDefaultMenuText(ICommDlgBrowser3* This,IShellView *ppshv,LPWSTR pszText,int cchMax) {
    return This->lpVtbl->GetDefaultMenuText(This,ppshv,pszText,cchMax);
}
static FORCEINLINE HRESULT ICommDlgBrowser3_GetViewFlags(ICommDlgBrowser3* This,DWORD *pdwFlags) {
    return This->lpVtbl->GetViewFlags(This,pdwFlags);
}
/*** ICommDlgBrowser3 methods ***/
static FORCEINLINE HRESULT ICommDlgBrowser3_OnColumnClicked(ICommDlgBrowser3* This,IShellView *ppshv,int iColumn) {
    return This->lpVtbl->OnColumnClicked(This,ppshv,iColumn);
}
static FORCEINLINE HRESULT ICommDlgBrowser3_GetCurrentFilter(ICommDlgBrowser3* This,LPWSTR pszFileSpec,int cchFileSpec) {
    return This->lpVtbl->GetCurrentFilter(This,pszFileSpec,cchFileSpec);
}
static FORCEINLINE HRESULT ICommDlgBrowser3_OnPreViewCreated(ICommDlgBrowser3* This,IShellView *ppshv) {
    return This->lpVtbl->OnPreViewCreated(This,ppshv);
}
#endif
#endif

#endif


#endif  /* __ICommDlgBrowser3_INTERFACE_DEFINED__ */


typedef enum CM_MASK {
    CM_MASK_WIDTH = 0x1,
    CM_MASK_DEFAULTWIDTH = 0x2,
    CM_MASK_IDEALWIDTH = 0x4,
    CM_MASK_NAME = 0x8,
    CM_MASK_STATE = 0x10
} CM_MASK;

DEFINE_ENUM_FLAG_OPERATORS(CM_MASK)

typedef enum CM_STATE {
    CM_STATE_NONE = 0x0,
    CM_STATE_VISIBLE = 0x1,
    CM_STATE_FIXEDWIDTH = 0x2,
    CM_STATE_NOSORTBYFOLDERNESS = 0x4,
    CM_STATE_ALWAYSVISIBLE = 0x8
} CM_STATE;

DEFINE_ENUM_FLAG_OPERATORS(CM_STATE)

typedef enum CM_ENUM_FLAGS {
    CM_ENUM_ALL = 0x1,
    CM_ENUM_VISIBLE = 0x2
} CM_ENUM_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(CM_ENUM_FLAGS)

typedef enum CM_SET_WIDTH_VALUE {
    CM_WIDTH_USEDEFAULT = -1,
    CM_WIDTH_AUTOSIZE = -2
} CM_SET_WIDTH_VALUE;

typedef struct CM_COLUMNINFO {
    DWORD cbSize;
    DWORD dwMask;
    DWORD dwState;
    UINT uWidth;
    UINT uDefaultWidth;
    UINT uIdealWidth;
    WCHAR wszName[80];
} CM_COLUMNINFO;

/*****************************************************************************
 * IColumnManager interface
 */
#ifndef __IColumnManager_INTERFACE_DEFINED__
#define __IColumnManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IColumnManager, 0xd8ec27bb, 0x3f3b, 0x4042, 0xb1,0x0a, 0x4a,0xcf,0xd9,0x24,0xd4,0x53);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d8ec27bb-3f3b-4042-b10a-4acfd924d453")
IColumnManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetColumnInfo(
        REFPROPERTYKEY propkey,
        const CM_COLUMNINFO *pcmci) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColumnInfo(
        REFPROPERTYKEY propkey,
        CM_COLUMNINFO *pcmci) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColumnCount(
        CM_ENUM_FLAGS dwFlags,
        UINT *puCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColumns(
        CM_ENUM_FLAGS dwFlags,
        PROPERTYKEY *rgkeyOrder,
        UINT cColumns) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetColumns(
        const PROPERTYKEY *rgkeyOrder,
        UINT cVisible) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IColumnManager, 0xd8ec27bb, 0x3f3b, 0x4042, 0xb1,0x0a, 0x4a,0xcf,0xd9,0x24,0xd4,0x53)
#endif
#else
typedef struct IColumnManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IColumnManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IColumnManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IColumnManager *This);

    /*** IColumnManager methods ***/
    HRESULT (STDMETHODCALLTYPE *SetColumnInfo)(
        IColumnManager *This,
        REFPROPERTYKEY propkey,
        const CM_COLUMNINFO *pcmci);

    HRESULT (STDMETHODCALLTYPE *GetColumnInfo)(
        IColumnManager *This,
        REFPROPERTYKEY propkey,
        CM_COLUMNINFO *pcmci);

    HRESULT (STDMETHODCALLTYPE *GetColumnCount)(
        IColumnManager *This,
        CM_ENUM_FLAGS dwFlags,
        UINT *puCount);

    HRESULT (STDMETHODCALLTYPE *GetColumns)(
        IColumnManager *This,
        CM_ENUM_FLAGS dwFlags,
        PROPERTYKEY *rgkeyOrder,
        UINT cColumns);

    HRESULT (STDMETHODCALLTYPE *SetColumns)(
        IColumnManager *This,
        const PROPERTYKEY *rgkeyOrder,
        UINT cVisible);

    END_INTERFACE
} IColumnManagerVtbl;

interface IColumnManager {
    CONST_VTBL IColumnManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IColumnManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IColumnManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IColumnManager_Release(This) (This)->lpVtbl->Release(This)
/*** IColumnManager methods ***/
#define IColumnManager_SetColumnInfo(This,propkey,pcmci) (This)->lpVtbl->SetColumnInfo(This,propkey,pcmci)
#define IColumnManager_GetColumnInfo(This,propkey,pcmci) (This)->lpVtbl->GetColumnInfo(This,propkey,pcmci)
#define IColumnManager_GetColumnCount(This,dwFlags,puCount) (This)->lpVtbl->GetColumnCount(This,dwFlags,puCount)
#define IColumnManager_GetColumns(This,dwFlags,rgkeyOrder,cColumns) (This)->lpVtbl->GetColumns(This,dwFlags,rgkeyOrder,cColumns)
#define IColumnManager_SetColumns(This,rgkeyOrder,cVisible) (This)->lpVtbl->SetColumns(This,rgkeyOrder,cVisible)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IColumnManager_QueryInterface(IColumnManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IColumnManager_AddRef(IColumnManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IColumnManager_Release(IColumnManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IColumnManager methods ***/
static FORCEINLINE HRESULT IColumnManager_SetColumnInfo(IColumnManager* This,REFPROPERTYKEY propkey,const CM_COLUMNINFO *pcmci) {
    return This->lpVtbl->SetColumnInfo(This,propkey,pcmci);
}
static FORCEINLINE HRESULT IColumnManager_GetColumnInfo(IColumnManager* This,REFPROPERTYKEY propkey,CM_COLUMNINFO *pcmci) {
    return This->lpVtbl->GetColumnInfo(This,propkey,pcmci);
}
static FORCEINLINE HRESULT IColumnManager_GetColumnCount(IColumnManager* This,CM_ENUM_FLAGS dwFlags,UINT *puCount) {
    return This->lpVtbl->GetColumnCount(This,dwFlags,puCount);
}
static FORCEINLINE HRESULT IColumnManager_GetColumns(IColumnManager* This,CM_ENUM_FLAGS dwFlags,PROPERTYKEY *rgkeyOrder,UINT cColumns) {
    return This->lpVtbl->GetColumns(This,dwFlags,rgkeyOrder,cColumns);
}
static FORCEINLINE HRESULT IColumnManager_SetColumns(IColumnManager* This,const PROPERTYKEY *rgkeyOrder,UINT cVisible) {
    return This->lpVtbl->SetColumns(This,rgkeyOrder,cVisible);
}
#endif
#endif

#endif


#endif  /* __IColumnManager_INTERFACE_DEFINED__ */

#endif

/*****************************************************************************
 * IFolderFilterSite interface
 */
#ifndef __IFolderFilterSite_INTERFACE_DEFINED__
#define __IFolderFilterSite_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFolderFilterSite, 0xc0a651f5, 0xb48b, 0x11d2, 0xb5,0xed, 0x00,0x60,0x97,0xc6,0x86,0xf6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0a651f5-b48b-11d2-b5ed-006097c686f6")
IFolderFilterSite : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetFilter(
        IUnknown *punk) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFolderFilterSite, 0xc0a651f5, 0xb48b, 0x11d2, 0xb5,0xed, 0x00,0x60,0x97,0xc6,0x86,0xf6)
#endif
#else
typedef struct IFolderFilterSiteVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFolderFilterSite *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFolderFilterSite *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFolderFilterSite *This);

    /*** IFolderFilterSite methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFilter)(
        IFolderFilterSite *This,
        IUnknown *punk);

    END_INTERFACE
} IFolderFilterSiteVtbl;

interface IFolderFilterSite {
    CONST_VTBL IFolderFilterSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFolderFilterSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFolderFilterSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFolderFilterSite_Release(This) (This)->lpVtbl->Release(This)
/*** IFolderFilterSite methods ***/
#define IFolderFilterSite_SetFilter(This,punk) (This)->lpVtbl->SetFilter(This,punk)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFolderFilterSite_QueryInterface(IFolderFilterSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFolderFilterSite_AddRef(IFolderFilterSite* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFolderFilterSite_Release(IFolderFilterSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderFilterSite methods ***/
static FORCEINLINE HRESULT IFolderFilterSite_SetFilter(IFolderFilterSite* This,IUnknown *punk) {
    return This->lpVtbl->SetFilter(This,punk);
}
#endif
#endif

#endif


#endif  /* __IFolderFilterSite_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IFolderFilter interface
 */
#ifndef __IFolderFilter_INTERFACE_DEFINED__
#define __IFolderFilter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFolderFilter, 0x9cc22886, 0xdc8e, 0x11d2, 0xb1,0xd0, 0x00,0xc0,0x4f,0x8e,0xeb,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9cc22886-dc8e-11d2-b1d0-00c04f8eeb3e")
IFolderFilter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ShouldShow(
        IShellFolder *psf,
        PCIDLIST_ABSOLUTE pidlFolder,
        PCUITEMID_CHILD pidlItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnumFlags(
        IShellFolder *psf,
        PCIDLIST_ABSOLUTE pidlFolder,
        HWND *phwnd,
        DWORD *pgrfFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFolderFilter, 0x9cc22886, 0xdc8e, 0x11d2, 0xb1,0xd0, 0x00,0xc0,0x4f,0x8e,0xeb,0x3e)
#endif
#else
typedef struct IFolderFilterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFolderFilter *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFolderFilter *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFolderFilter *This);

    /*** IFolderFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *ShouldShow)(
        IFolderFilter *This,
        IShellFolder *psf,
        PCIDLIST_ABSOLUTE pidlFolder,
        PCUITEMID_CHILD pidlItem);

    HRESULT (STDMETHODCALLTYPE *GetEnumFlags)(
        IFolderFilter *This,
        IShellFolder *psf,
        PCIDLIST_ABSOLUTE pidlFolder,
        HWND *phwnd,
        DWORD *pgrfFlags);

    END_INTERFACE
} IFolderFilterVtbl;

interface IFolderFilter {
    CONST_VTBL IFolderFilterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFolderFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFolderFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFolderFilter_Release(This) (This)->lpVtbl->Release(This)
/*** IFolderFilter methods ***/
#define IFolderFilter_ShouldShow(This,psf,pidlFolder,pidlItem) (This)->lpVtbl->ShouldShow(This,psf,pidlFolder,pidlItem)
#define IFolderFilter_GetEnumFlags(This,psf,pidlFolder,phwnd,pgrfFlags) (This)->lpVtbl->GetEnumFlags(This,psf,pidlFolder,phwnd,pgrfFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFolderFilter_QueryInterface(IFolderFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFolderFilter_AddRef(IFolderFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFolderFilter_Release(IFolderFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderFilter methods ***/
static FORCEINLINE HRESULT IFolderFilter_ShouldShow(IFolderFilter* This,IShellFolder *psf,PCIDLIST_ABSOLUTE pidlFolder,PCUITEMID_CHILD pidlItem) {
    return This->lpVtbl->ShouldShow(This,psf,pidlFolder,pidlItem);
}
static FORCEINLINE HRESULT IFolderFilter_GetEnumFlags(IFolderFilter* This,IShellFolder *psf,PCIDLIST_ABSOLUTE pidlFolder,HWND *phwnd,DWORD *pgrfFlags) {
    return This->lpVtbl->GetEnumFlags(This,psf,pidlFolder,phwnd,pgrfFlags);
}
#endif
#endif

#endif


#endif  /* __IFolderFilter_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IInputObjectSite interface
 */
#ifndef __IInputObjectSite_INTERFACE_DEFINED__
#define __IInputObjectSite_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInputObjectSite, 0xf1db8392, 0x7331, 0x11d0, 0x8c,0x99, 0x00,0xa0,0xc9,0x2d,0xbf,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f1db8392-7331-11d0-8c99-00a0c92dbfe8")
IInputObjectSite : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnFocusChangeIS(
        IUnknown *punkObj,
        WINBOOL fSetFocus) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInputObjectSite, 0xf1db8392, 0x7331, 0x11d0, 0x8c,0x99, 0x00,0xa0,0xc9,0x2d,0xbf,0xe8)
#endif
#else
typedef struct IInputObjectSiteVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInputObjectSite *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInputObjectSite *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInputObjectSite *This);

    /*** IInputObjectSite methods ***/
    HRESULT (STDMETHODCALLTYPE *OnFocusChangeIS)(
        IInputObjectSite *This,
        IUnknown *punkObj,
        WINBOOL fSetFocus);

    END_INTERFACE
} IInputObjectSiteVtbl;

interface IInputObjectSite {
    CONST_VTBL IInputObjectSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInputObjectSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInputObjectSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInputObjectSite_Release(This) (This)->lpVtbl->Release(This)
/*** IInputObjectSite methods ***/
#define IInputObjectSite_OnFocusChangeIS(This,punkObj,fSetFocus) (This)->lpVtbl->OnFocusChangeIS(This,punkObj,fSetFocus)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInputObjectSite_QueryInterface(IInputObjectSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInputObjectSite_AddRef(IInputObjectSite* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInputObjectSite_Release(IInputObjectSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IInputObjectSite methods ***/
static FORCEINLINE HRESULT IInputObjectSite_OnFocusChangeIS(IInputObjectSite* This,IUnknown *punkObj,WINBOOL fSetFocus) {
    return This->lpVtbl->OnFocusChangeIS(This,punkObj,fSetFocus);
}
#endif
#endif

#endif


#endif  /* __IInputObjectSite_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IInputObject interface
 */
#ifndef __IInputObject_INTERFACE_DEFINED__
#define __IInputObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInputObject, 0x68284faa, 0x6a48, 0x11d0, 0x8c,0x78, 0x00,0xc0,0x4f,0xd9,0x18,0xb4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("68284faa-6a48-11d0-8c78-00c04fd918b4")
IInputObject : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE UIActivateIO(
        WINBOOL fActivate,
        MSG *pMsg) = 0;

    virtual HRESULT STDMETHODCALLTYPE HasFocusIO(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(
        MSG *pMsg) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInputObject, 0x68284faa, 0x6a48, 0x11d0, 0x8c,0x78, 0x00,0xc0,0x4f,0xd9,0x18,0xb4)
#endif
#else
typedef struct IInputObjectVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInputObject *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInputObject *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInputObject *This);

    /*** IInputObject methods ***/
    HRESULT (STDMETHODCALLTYPE *UIActivateIO)(
        IInputObject *This,
        WINBOOL fActivate,
        MSG *pMsg);

    HRESULT (STDMETHODCALLTYPE *HasFocusIO)(
        IInputObject *This);

    HRESULT (STDMETHODCALLTYPE *TranslateAcceleratorIO)(
        IInputObject *This,
        MSG *pMsg);

    END_INTERFACE
} IInputObjectVtbl;

interface IInputObject {
    CONST_VTBL IInputObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInputObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInputObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInputObject_Release(This) (This)->lpVtbl->Release(This)
/*** IInputObject methods ***/
#define IInputObject_UIActivateIO(This,fActivate,pMsg) (This)->lpVtbl->UIActivateIO(This,fActivate,pMsg)
#define IInputObject_HasFocusIO(This) (This)->lpVtbl->HasFocusIO(This)
#define IInputObject_TranslateAcceleratorIO(This,pMsg) (This)->lpVtbl->TranslateAcceleratorIO(This,pMsg)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInputObject_QueryInterface(IInputObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInputObject_AddRef(IInputObject* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInputObject_Release(IInputObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IInputObject methods ***/
static FORCEINLINE HRESULT IInputObject_UIActivateIO(IInputObject* This,WINBOOL fActivate,MSG *pMsg) {
    return This->lpVtbl->UIActivateIO(This,fActivate,pMsg);
}
static FORCEINLINE HRESULT IInputObject_HasFocusIO(IInputObject* This) {
    return This->lpVtbl->HasFocusIO(This);
}
static FORCEINLINE HRESULT IInputObject_TranslateAcceleratorIO(IInputObject* This,MSG *pMsg) {
    return This->lpVtbl->TranslateAcceleratorIO(This,pMsg);
}
#endif
#endif

#endif


#endif  /* __IInputObject_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IInputObject2 interface
 */
#ifndef __IInputObject2_INTERFACE_DEFINED__
#define __IInputObject2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInputObject2, 0x6915c085, 0x510b, 0x44cd, 0x94,0xaf, 0x28,0xdf,0xa5,0x6c,0xf9,0x2b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6915c085-510b-44cd-94af-28dfa56cf92b")
IInputObject2 : public IInputObject
{
    virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorGlobal(
        MSG *pMsg) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInputObject2, 0x6915c085, 0x510b, 0x44cd, 0x94,0xaf, 0x28,0xdf,0xa5,0x6c,0xf9,0x2b)
#endif
#else
typedef struct IInputObject2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInputObject2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInputObject2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInputObject2 *This);

    /*** IInputObject methods ***/
    HRESULT (STDMETHODCALLTYPE *UIActivateIO)(
        IInputObject2 *This,
        WINBOOL fActivate,
        MSG *pMsg);

    HRESULT (STDMETHODCALLTYPE *HasFocusIO)(
        IInputObject2 *This);

    HRESULT (STDMETHODCALLTYPE *TranslateAcceleratorIO)(
        IInputObject2 *This,
        MSG *pMsg);

    /*** IInputObject2 methods ***/
    HRESULT (STDMETHODCALLTYPE *TranslateAcceleratorGlobal)(
        IInputObject2 *This,
        MSG *pMsg);

    END_INTERFACE
} IInputObject2Vtbl;

interface IInputObject2 {
    CONST_VTBL IInputObject2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInputObject2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInputObject2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInputObject2_Release(This) (This)->lpVtbl->Release(This)
/*** IInputObject methods ***/
#define IInputObject2_UIActivateIO(This,fActivate,pMsg) (This)->lpVtbl->UIActivateIO(This,fActivate,pMsg)
#define IInputObject2_HasFocusIO(This) (This)->lpVtbl->HasFocusIO(This)
#define IInputObject2_TranslateAcceleratorIO(This,pMsg) (This)->lpVtbl->TranslateAcceleratorIO(This,pMsg)
/*** IInputObject2 methods ***/
#define IInputObject2_TranslateAcceleratorGlobal(This,pMsg) (This)->lpVtbl->TranslateAcceleratorGlobal(This,pMsg)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInputObject2_QueryInterface(IInputObject2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInputObject2_AddRef(IInputObject2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInputObject2_Release(IInputObject2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInputObject methods ***/
static FORCEINLINE HRESULT IInputObject2_UIActivateIO(IInputObject2* This,WINBOOL fActivate,MSG *pMsg) {
    return This->lpVtbl->UIActivateIO(This,fActivate,pMsg);
}
static FORCEINLINE HRESULT IInputObject2_HasFocusIO(IInputObject2* This) {
    return This->lpVtbl->HasFocusIO(This);
}
static FORCEINLINE HRESULT IInputObject2_TranslateAcceleratorIO(IInputObject2* This,MSG *pMsg) {
    return This->lpVtbl->TranslateAcceleratorIO(This,pMsg);
}
/*** IInputObject2 methods ***/
static FORCEINLINE HRESULT IInputObject2_TranslateAcceleratorGlobal(IInputObject2* This,MSG *pMsg) {
    return This->lpVtbl->TranslateAcceleratorGlobal(This,pMsg);
}
#endif
#endif

#endif


#endif  /* __IInputObject2_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IShellIcon interface
 */
#ifndef __IShellIcon_INTERFACE_DEFINED__
#define __IShellIcon_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellIcon, 0x000214e5, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214e5-0000-0000-c000-000000000046")
IShellIcon : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetIconOf(
        PCUITEMID_CHILD pidl,
        UINT flags,
        int *pIconIndex) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellIcon, 0x000214e5, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IShellIconVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellIcon *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellIcon *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellIcon *This);

    /*** IShellIcon methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIconOf)(
        IShellIcon *This,
        PCUITEMID_CHILD pidl,
        UINT flags,
        int *pIconIndex);

    END_INTERFACE
} IShellIconVtbl;

interface IShellIcon {
    CONST_VTBL IShellIconVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellIcon_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellIcon_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellIcon_Release(This) (This)->lpVtbl->Release(This)
/*** IShellIcon methods ***/
#define IShellIcon_GetIconOf(This,pidl,flags,pIconIndex) (This)->lpVtbl->GetIconOf(This,pidl,flags,pIconIndex)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellIcon_QueryInterface(IShellIcon* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellIcon_AddRef(IShellIcon* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellIcon_Release(IShellIcon* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellIcon methods ***/
static FORCEINLINE HRESULT IShellIcon_GetIconOf(IShellIcon* This,PCUITEMID_CHILD pidl,UINT flags,int *pIconIndex) {
    return This->lpVtbl->GetIconOf(This,pidl,flags,pIconIndex);
}
#endif
#endif

#endif


#endif  /* __IShellIcon_INTERFACE_DEFINED__ */


#define SBSP_DEFBROWSER 0x0000
#define SBSP_SAMEBROWSER 0x0001
#define SBSP_NEWBROWSER 0x0002

#define SBSP_DEFMODE 0x0000
#define SBSP_OPENMODE 0x0010
#define SBSP_EXPLOREMODE 0x0020
#define SBSP_HELPMODE 0x0040
#define SBSP_NOTRANSFERHIST 0x0080

#define SBSP_ABSOLUTE 0x0000
#define SBSP_RELATIVE 0x1000
#define SBSP_PARENT 0x2000
#define SBSP_NAVIGATEBACK 0x4000
#define SBSP_NAVIGATEFORWARD 0x8000
#define SBSP_ALLOW_AUTONAVIGATE 0x00010000
#if NTDDI_VERSION >= NTDDI_VISTA
#define SBSP_KEEPSAMETEMPLATE 0x00020000
#define SBSP_KEEPWORDWHEELTEXT 0x00040000
#define SBSP_ACTIVATE_NOFOCUS 0x00080000
#define SBSP_CREATENOHISTORY 0x00100000
#define SBSP_PLAYNOSOUND 0x00200000
#endif
#if _WIN32_IE >= _WIN32_IE_IE60SP2
#define SBSP_CALLERUNTRUSTED 0x00800000
#define SBSP_TRUSTFIRSTDOWNLOAD 0x01000000
#define SBSP_UNTRUSTEDFORDOWNLOAD 0x02000000
#endif
#define SBSP_NOAUTOSELECT 0x04000000
#define SBSP_WRITENOHISTORY 0x08000000
#if _WIN32_IE >= _WIN32_IE_IE60SP2
#define SBSP_TRUSTEDFORACTIVEX 0x10000000
#endif
#if _WIN32_IE >= _WIN32_IE_IE70
#define SBSP_FEEDNAVIGATION 0x20000000
#endif
#define SBSP_REDIRECT 0x40000000
#define SBSP_INITIATEDBYHLINKFRAME 0x80000000

#define FCW_STATUS 0x0001
#define FCW_TOOLBAR 0x0002
#define FCW_TREE 0x0003
#define FCW_INTERNETBAR 0x0006
#define FCW_PROGRESS 0x0008

#define FCT_MERGE 0x0001
#define FCT_CONFIGABLE 0x0002
#define FCT_ADDTOEND 0x0004

#if 0
typedef LPARAM LPTBBUTTONSB;
#else
#include <commctrl.h>

typedef LPTBBUTTON LPTBBUTTONSB;
#endif

/*****************************************************************************
 * IShellBrowser interface
 */
#ifndef __IShellBrowser_INTERFACE_DEFINED__
#define __IShellBrowser_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellBrowser, 0x000214e2, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214e2-0000-0000-c000-000000000046")
IShellBrowser : public IOleWindow
{
    virtual HRESULT STDMETHODCALLTYPE InsertMenusSB(
        HMENU hmenuShared,
        LPOLEMENUGROUPWIDTHS lpMenuWidths) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMenuSB(
        HMENU hmenuShared,
        HOLEMENU holemenuRes,
        HWND hwndActiveObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveMenusSB(
        HMENU hmenuShared) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStatusTextSB(
        LPCWSTR pszStatusText) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableModelessSB(
        WINBOOL fEnable) = 0;

    virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorSB(
        MSG *pmsg,
        WORD wID) = 0;

    virtual HRESULT STDMETHODCALLTYPE BrowseObject(
        PCUIDLIST_RELATIVE pidl,
        UINT wFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetViewStateStream(
        DWORD grfMode,
        IStream **ppStrm) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetControlWindow(
        UINT id,
        HWND *phwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendControlMsg(
        UINT id,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam,
        LRESULT *pret) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(
        IShellView **ppshv) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnViewWindowActive(
        IShellView *pshv) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetToolbarItems(
        LPTBBUTTONSB lpButtons,
        UINT nButtons,
        UINT uFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellBrowser, 0x000214e2, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IShellBrowserVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellBrowser *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellBrowser *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellBrowser *This);

    /*** IOleWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IShellBrowser *This,
        HWND *phwnd);

    HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)(
        IShellBrowser *This,
        WINBOOL fEnterMode);

    /*** IShellBrowser methods ***/
    HRESULT (STDMETHODCALLTYPE *InsertMenusSB)(
        IShellBrowser *This,
        HMENU hmenuShared,
        LPOLEMENUGROUPWIDTHS lpMenuWidths);

    HRESULT (STDMETHODCALLTYPE *SetMenuSB)(
        IShellBrowser *This,
        HMENU hmenuShared,
        HOLEMENU holemenuRes,
        HWND hwndActiveObject);

    HRESULT (STDMETHODCALLTYPE *RemoveMenusSB)(
        IShellBrowser *This,
        HMENU hmenuShared);

    HRESULT (STDMETHODCALLTYPE *SetStatusTextSB)(
        IShellBrowser *This,
        LPCWSTR pszStatusText);

    HRESULT (STDMETHODCALLTYPE *EnableModelessSB)(
        IShellBrowser *This,
        WINBOOL fEnable);

    HRESULT (STDMETHODCALLTYPE *TranslateAcceleratorSB)(
        IShellBrowser *This,
        MSG *pmsg,
        WORD wID);

    HRESULT (STDMETHODCALLTYPE *BrowseObject)(
        IShellBrowser *This,
        PCUIDLIST_RELATIVE pidl,
        UINT wFlags);

    HRESULT (STDMETHODCALLTYPE *GetViewStateStream)(
        IShellBrowser *This,
        DWORD grfMode,
        IStream **ppStrm);

    HRESULT (STDMETHODCALLTYPE *GetControlWindow)(
        IShellBrowser *This,
        UINT id,
        HWND *phwnd);

    HRESULT (STDMETHODCALLTYPE *SendControlMsg)(
        IShellBrowser *This,
        UINT id,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam,
        LRESULT *pret);

    HRESULT (STDMETHODCALLTYPE *QueryActiveShellView)(
        IShellBrowser *This,
        IShellView **ppshv);

    HRESULT (STDMETHODCALLTYPE *OnViewWindowActive)(
        IShellBrowser *This,
        IShellView *pshv);

    HRESULT (STDMETHODCALLTYPE *SetToolbarItems)(
        IShellBrowser *This,
        LPTBBUTTONSB lpButtons,
        UINT nButtons,
        UINT uFlags);

    END_INTERFACE
} IShellBrowserVtbl;

interface IShellBrowser {
    CONST_VTBL IShellBrowserVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellBrowser_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellBrowser_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellBrowser_Release(This) (This)->lpVtbl->Release(This)
/*** IOleWindow methods ***/
#define IShellBrowser_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IShellBrowser_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
/*** IShellBrowser methods ***/
#define IShellBrowser_InsertMenusSB(This,hmenuShared,lpMenuWidths) (This)->lpVtbl->InsertMenusSB(This,hmenuShared,lpMenuWidths)
#define IShellBrowser_SetMenuSB(This,hmenuShared,holemenuRes,hwndActiveObject) (This)->lpVtbl->SetMenuSB(This,hmenuShared,holemenuRes,hwndActiveObject)
#define IShellBrowser_RemoveMenusSB(This,hmenuShared) (This)->lpVtbl->RemoveMenusSB(This,hmenuShared)
#define IShellBrowser_SetStatusTextSB(This,pszStatusText) (This)->lpVtbl->SetStatusTextSB(This,pszStatusText)
#define IShellBrowser_EnableModelessSB(This,fEnable) (This)->lpVtbl->EnableModelessSB(This,fEnable)
#define IShellBrowser_TranslateAcceleratorSB(This,pmsg,wID) (This)->lpVtbl->TranslateAcceleratorSB(This,pmsg,wID)
#define IShellBrowser_BrowseObject(This,pidl,wFlags) (This)->lpVtbl->BrowseObject(This,pidl,wFlags)
#define IShellBrowser_GetViewStateStream(This,grfMode,ppStrm) (This)->lpVtbl->GetViewStateStream(This,grfMode,ppStrm)
#define IShellBrowser_GetControlWindow(This,id,phwnd) (This)->lpVtbl->GetControlWindow(This,id,phwnd)
#define IShellBrowser_SendControlMsg(This,id,uMsg,wParam,lParam,pret) (This)->lpVtbl->SendControlMsg(This,id,uMsg,wParam,lParam,pret)
#define IShellBrowser_QueryActiveShellView(This,ppshv) (This)->lpVtbl->QueryActiveShellView(This,ppshv)
#define IShellBrowser_OnViewWindowActive(This,pshv) (This)->lpVtbl->OnViewWindowActive(This,pshv)
#define IShellBrowser_SetToolbarItems(This,lpButtons,nButtons,uFlags) (This)->lpVtbl->SetToolbarItems(This,lpButtons,nButtons,uFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellBrowser_QueryInterface(IShellBrowser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellBrowser_AddRef(IShellBrowser* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellBrowser_Release(IShellBrowser* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static FORCEINLINE HRESULT IShellBrowser_GetWindow(IShellBrowser* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static FORCEINLINE HRESULT IShellBrowser_ContextSensitiveHelp(IShellBrowser* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IShellBrowser methods ***/
static FORCEINLINE HRESULT IShellBrowser_InsertMenusSB(IShellBrowser* This,HMENU hmenuShared,LPOLEMENUGROUPWIDTHS lpMenuWidths) {
    return This->lpVtbl->InsertMenusSB(This,hmenuShared,lpMenuWidths);
}
static FORCEINLINE HRESULT IShellBrowser_SetMenuSB(IShellBrowser* This,HMENU hmenuShared,HOLEMENU holemenuRes,HWND hwndActiveObject) {
    return This->lpVtbl->SetMenuSB(This,hmenuShared,holemenuRes,hwndActiveObject);
}
static FORCEINLINE HRESULT IShellBrowser_RemoveMenusSB(IShellBrowser* This,HMENU hmenuShared) {
    return This->lpVtbl->RemoveMenusSB(This,hmenuShared);
}
static FORCEINLINE HRESULT IShellBrowser_SetStatusTextSB(IShellBrowser* This,LPCWSTR pszStatusText) {
    return This->lpVtbl->SetStatusTextSB(This,pszStatusText);
}
static FORCEINLINE HRESULT IShellBrowser_EnableModelessSB(IShellBrowser* This,WINBOOL fEnable) {
    return This->lpVtbl->EnableModelessSB(This,fEnable);
}
static FORCEINLINE HRESULT IShellBrowser_TranslateAcceleratorSB(IShellBrowser* This,MSG *pmsg,WORD wID) {
    return This->lpVtbl->TranslateAcceleratorSB(This,pmsg,wID);
}
static FORCEINLINE HRESULT IShellBrowser_BrowseObject(IShellBrowser* This,PCUIDLIST_RELATIVE pidl,UINT wFlags) {
    return This->lpVtbl->BrowseObject(This,pidl,wFlags);
}
static FORCEINLINE HRESULT IShellBrowser_GetViewStateStream(IShellBrowser* This,DWORD grfMode,IStream **ppStrm) {
    return This->lpVtbl->GetViewStateStream(This,grfMode,ppStrm);
}
static FORCEINLINE HRESULT IShellBrowser_GetControlWindow(IShellBrowser* This,UINT id,HWND *phwnd) {
    return This->lpVtbl->GetControlWindow(This,id,phwnd);
}
static FORCEINLINE HRESULT IShellBrowser_SendControlMsg(IShellBrowser* This,UINT id,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT *pret) {
    return This->lpVtbl->SendControlMsg(This,id,uMsg,wParam,lParam,pret);
}
static FORCEINLINE HRESULT IShellBrowser_QueryActiveShellView(IShellBrowser* This,IShellView **ppshv) {
    return This->lpVtbl->QueryActiveShellView(This,ppshv);
}
static FORCEINLINE HRESULT IShellBrowser_OnViewWindowActive(IShellBrowser* This,IShellView *pshv) {
    return This->lpVtbl->OnViewWindowActive(This,pshv);
}
static FORCEINLINE HRESULT IShellBrowser_SetToolbarItems(IShellBrowser* This,LPTBBUTTONSB lpButtons,UINT nButtons,UINT uFlags) {
    return This->lpVtbl->SetToolbarItems(This,lpButtons,nButtons,uFlags);
}
#endif
#endif

#endif


#endif  /* __IShellBrowser_INTERFACE_DEFINED__ */


typedef IShellBrowser *LPSHELLBROWSER;

/*****************************************************************************
 * IProfferService interface
 */
#ifndef __IProfferService_INTERFACE_DEFINED__
#define __IProfferService_INTERFACE_DEFINED__

DEFINE_GUID(IID_IProfferService, 0xcb728b20, 0xf786, 0x11ce, 0x92,0xad, 0x00,0xaa,0x00,0xa7,0x4c,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cb728b20-f786-11ce-92ad-00aa00a74cd0")
IProfferService : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ProfferService(
        REFGUID guidService,
        IServiceProvider *psp,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RevokeService(
        DWORD dwCookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IProfferService, 0xcb728b20, 0xf786, 0x11ce, 0x92,0xad, 0x00,0xaa,0x00,0xa7,0x4c,0xd0)
#endif
#else
typedef struct IProfferServiceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IProfferService *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IProfferService *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IProfferService *This);

    /*** IProfferService methods ***/
    HRESULT (STDMETHODCALLTYPE *ProfferService)(
        IProfferService *This,
        REFGUID guidService,
        IServiceProvider *psp,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *RevokeService)(
        IProfferService *This,
        DWORD dwCookie);

    END_INTERFACE
} IProfferServiceVtbl;

interface IProfferService {
    CONST_VTBL IProfferServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IProfferService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IProfferService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IProfferService_Release(This) (This)->lpVtbl->Release(This)
/*** IProfferService methods ***/
#define IProfferService_ProfferService(This,guidService,psp,pdwCookie) (This)->lpVtbl->ProfferService(This,guidService,psp,pdwCookie)
#define IProfferService_RevokeService(This,dwCookie) (This)->lpVtbl->RevokeService(This,dwCookie)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IProfferService_QueryInterface(IProfferService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IProfferService_AddRef(IProfferService* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IProfferService_Release(IProfferService* This) {
    return This->lpVtbl->Release(This);
}
/*** IProfferService methods ***/
static FORCEINLINE HRESULT IProfferService_ProfferService(IProfferService* This,REFGUID guidService,IServiceProvider *psp,DWORD *pdwCookie) {
    return This->lpVtbl->ProfferService(This,guidService,psp,pdwCookie);
}
static FORCEINLINE HRESULT IProfferService_RevokeService(IProfferService* This,DWORD dwCookie) {
    return This->lpVtbl->RevokeService(This,dwCookie);
}
#endif
#endif

#endif


#endif  /* __IProfferService_INTERFACE_DEFINED__ */


#define SID_SProfferService IID_IProfferService
#define STR_DONT_RESOLVE_LINK L"Don't Resolve Link"
#define STR_GET_ASYNC_HANDLER L"GetAsyncHandler"

/*****************************************************************************
 * IShellItem interface
 */
#ifndef __IShellItem_INTERFACE_DEFINED__
#define __IShellItem_INTERFACE_DEFINED__

typedef enum _SIGDN {
    SIGDN_NORMALDISPLAY = 0x0,
    SIGDN_PARENTRELATIVEPARSING = (int)0x80018001,
    SIGDN_DESKTOPABSOLUTEPARSING = (int)0x80028000,
    SIGDN_PARENTRELATIVEEDITING = (int)0x80031001,
    SIGDN_DESKTOPABSOLUTEEDITING = (int)0x8004c000,
    SIGDN_FILESYSPATH = (int)0x80058000,
    SIGDN_URL = (int)0x80068000,
    SIGDN_PARENTRELATIVEFORADDRESSBAR = (int)0x8007c001,
    SIGDN_PARENTRELATIVE = (int)0x80080001,
    SIGDN_PARENTRELATIVEFORUI = (int)0x80094001
} SIGDN;

enum _SICHINTF {
    SICHINT_DISPLAY = 0x0,
    SICHINT_ALLFIELDS = (int)0x80000000,
    SICHINT_CANONICAL = 0x10000000,
    SICHINT_TEST_FILESYSPATH_IF_NOT_EQUAL = 0x20000000
};

typedef DWORD SICHINTF;

DEFINE_GUID(IID_IShellItem, 0x43826d1e, 0xe718, 0x42ee, 0xbc,0x55, 0xa1,0xe2,0x61,0xc3,0x7b,0xfe);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("43826d1e-e718-42ee-bc55-a1e261c37bfe")
IShellItem : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE BindToHandler(
        IBindCtx *pbc,
        REFGUID bhid,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetParent(
        IShellItem **ppsi) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDisplayName(
        SIGDN sigdnName,
        LPWSTR *ppszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAttributes(
        SFGAOF sfgaoMask,
        SFGAOF *psfgaoAttribs) = 0;

    virtual HRESULT STDMETHODCALLTYPE Compare(
        IShellItem *psi,
        SICHINTF hint,
        int *piOrder) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellItem, 0x43826d1e, 0xe718, 0x42ee, 0xbc,0x55, 0xa1,0xe2,0x61,0xc3,0x7b,0xfe)
#endif
#else
typedef struct IShellItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellItem *This);

    /*** IShellItem methods ***/
    HRESULT (STDMETHODCALLTYPE *BindToHandler)(
        IShellItem *This,
        IBindCtx *pbc,
        REFGUID bhid,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetParent)(
        IShellItem *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *GetDisplayName)(
        IShellItem *This,
        SIGDN sigdnName,
        LPWSTR *ppszName);

    HRESULT (STDMETHODCALLTYPE *GetAttributes)(
        IShellItem *This,
        SFGAOF sfgaoMask,
        SFGAOF *psfgaoAttribs);

    HRESULT (STDMETHODCALLTYPE *Compare)(
        IShellItem *This,
        IShellItem *psi,
        SICHINTF hint,
        int *piOrder);

    END_INTERFACE
} IShellItemVtbl;

interface IShellItem {
    CONST_VTBL IShellItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellItem_Release(This) (This)->lpVtbl->Release(This)
/*** IShellItem methods ***/
#define IShellItem_BindToHandler(This,pbc,bhid,riid,ppv) (This)->lpVtbl->BindToHandler(This,pbc,bhid,riid,ppv)
#define IShellItem_GetParent(This,ppsi) (This)->lpVtbl->GetParent(This,ppsi)
#define IShellItem_GetDisplayName(This,sigdnName,ppszName) (This)->lpVtbl->GetDisplayName(This,sigdnName,ppszName)
#define IShellItem_GetAttributes(This,sfgaoMask,psfgaoAttribs) (This)->lpVtbl->GetAttributes(This,sfgaoMask,psfgaoAttribs)
#define IShellItem_Compare(This,psi,hint,piOrder) (This)->lpVtbl->Compare(This,psi,hint,piOrder)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellItem_QueryInterface(IShellItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellItem_AddRef(IShellItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellItem_Release(IShellItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellItem methods ***/
static FORCEINLINE HRESULT IShellItem_BindToHandler(IShellItem* This,IBindCtx *pbc,REFGUID bhid,REFIID riid,void **ppv) {
    return This->lpVtbl->BindToHandler(This,pbc,bhid,riid,ppv);
}
static FORCEINLINE HRESULT IShellItem_GetParent(IShellItem* This,IShellItem **ppsi) {
    return This->lpVtbl->GetParent(This,ppsi);
}
static FORCEINLINE HRESULT IShellItem_GetDisplayName(IShellItem* This,SIGDN sigdnName,LPWSTR *ppszName) {
    return This->lpVtbl->GetDisplayName(This,sigdnName,ppszName);
}
static FORCEINLINE HRESULT IShellItem_GetAttributes(IShellItem* This,SFGAOF sfgaoMask,SFGAOF *psfgaoAttribs) {
    return This->lpVtbl->GetAttributes(This,sfgaoMask,psfgaoAttribs);
}
static FORCEINLINE HRESULT IShellItem_Compare(IShellItem* This,IShellItem *psi,SICHINTF hint,int *piOrder) {
    return This->lpVtbl->Compare(This,psi,hint,piOrder);
}
#endif
#endif

#endif


#endif  /* __IShellItem_INTERFACE_DEFINED__ */


SHSTDAPI_(PIDLIST_ABSOLUTE) SHSimpleIDListFromPath(PCWSTR pszPath);

#if _WIN32_IE >= _WIN32_IE_IE70
  SHSTDAPI SHCreateItemFromIDList(PCIDLIST_ABSOLUTE pidl, REFIID riid, void **ppv);
  SHSTDAPI SHCreateItemFromParsingName(PCWSTR pszPath, IBindCtx *pbc, REFIID riid, void **ppv);
  SHSTDAPI SHCreateItemWithParent(PCIDLIST_ABSOLUTE pidlParent, IShellFolder *psfParent, PCUITEMID_CHILD pidl, REFIID riid, void **ppvItem);
  SHSTDAPI SHCreateItemFromRelativeName(IShellItem *psiParent, PCWSTR pszName, IBindCtx *pbc, REFIID riid, void **ppv);
#endif
#if NTDDI_VERSION >= NTDDI_VISTA
  SHSTDAPI SHCreateItemInKnownFolder(REFKNOWNFOLDERID kfid, DWORD dwKFFlags, PCWSTR pszItem, REFIID riid, void **ppv);
  SHSTDAPI SHGetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl);
  SHSTDAPI SHGetItemFromObject(IUnknown *punk, REFIID riid, void **ppv);
  SHSTDAPI SHGetPropertyStoreFromIDList(PCIDLIST_ABSOLUTE pidl, GETPROPERTYSTOREFLAGS flags, REFIID riid, void **ppv);
  SHSTDAPI SHGetPropertyStoreFromParsingName(PCWSTR pszPath, IBindCtx *pbc, GETPROPERTYSTOREFLAGS flags, REFIID riid, void **ppv);
  SHSTDAPI SHGetNameFromIDList(PCIDLIST_ABSOLUTE pidl, SIGDN sigdnName, PWSTR *ppszName);
#endif
#if NTDDI_VERSION >= NTDDI_WIN7
typedef enum DATAOBJ_GET_ITEM_FLAGS {
    DOGIF_DEFAULT = 0x0,
    DOGIF_TRAVERSE_LINK = 0x1,
    DOGIF_NO_HDROP = 0x2,
    DOGIF_NO_URL = 0x4,
    DOGIF_ONLY_IF_ONE = 0x8
} DATAOBJ_GET_ITEM_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(DATAOBJ_GET_ITEM_FLAGS)

  STDAPI SHGetItemFromDataObject(IDataObject *pdtobj, DATAOBJ_GET_ITEM_FLAGS dwFlags, REFIID riid, void **ppv);
#endif

#define STR_GPS_HANDLERPROPERTIESONLY L"GPS_HANDLERPROPERTIESONLY"
#define STR_GPS_FASTPROPERTIESONLY L"GPS_FASTPROPERTIESONLY"
#define STR_GPS_OPENSLOWITEM L"GPS_OPENSLOWITEM"
#define STR_GPS_DELAYCREATION L"GPS_DELAYCREATION"
#define STR_GPS_BESTEFFORT L"GPS_BESTEFFORT"
#define STR_GPS_NO_OPLOCK L"GPS_NO_OPLOCK"

/*****************************************************************************
 * IShellItem2 interface
 */
#ifndef __IShellItem2_INTERFACE_DEFINED__
#define __IShellItem2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellItem2, 0x7e9fb0d3, 0x919f, 0x4307, 0xab,0x2e, 0x9b,0x18,0x60,0x31,0x0c,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7e9fb0d3-919f-4307-ab2e-9b1860310c93")
IShellItem2 : public IShellItem
{
    virtual HRESULT STDMETHODCALLTYPE GetPropertyStore(
        GETPROPERTYSTOREFLAGS flags,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyStoreWithCreateObject(
        GETPROPERTYSTOREFLAGS flags,
        IUnknown *punkCreateObject,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyStoreForKeys(
        const PROPERTYKEY *rgKeys,
        UINT cKeys,
        GETPROPERTYSTOREFLAGS flags,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyDescriptionList(
        REFPROPERTYKEY keyType,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE Update(
        IBindCtx *pbc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProperty(
        REFPROPERTYKEY key,
        PROPVARIANT *ppropvar) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCLSID(
        REFPROPERTYKEY key,
        CLSID *pclsid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileTime(
        REFPROPERTYKEY key,
        FILETIME *pft) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInt32(
        REFPROPERTYKEY key,
        int *pi) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetString(
        REFPROPERTYKEY key,
        LPWSTR *ppsz) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUInt32(
        REFPROPERTYKEY key,
        ULONG *pui) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUInt64(
        REFPROPERTYKEY key,
        ULONGLONG *pull) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBool(
        REFPROPERTYKEY key,
        WINBOOL *pf) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellItem2, 0x7e9fb0d3, 0x919f, 0x4307, 0xab,0x2e, 0x9b,0x18,0x60,0x31,0x0c,0x93)
#endif
#else
typedef struct IShellItem2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellItem2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellItem2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellItem2 *This);

    /*** IShellItem methods ***/
    HRESULT (STDMETHODCALLTYPE *BindToHandler)(
        IShellItem2 *This,
        IBindCtx *pbc,
        REFGUID bhid,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetParent)(
        IShellItem2 *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *GetDisplayName)(
        IShellItem2 *This,
        SIGDN sigdnName,
        LPWSTR *ppszName);

    HRESULT (STDMETHODCALLTYPE *GetAttributes)(
        IShellItem2 *This,
        SFGAOF sfgaoMask,
        SFGAOF *psfgaoAttribs);

    HRESULT (STDMETHODCALLTYPE *Compare)(
        IShellItem2 *This,
        IShellItem *psi,
        SICHINTF hint,
        int *piOrder);

    /*** IShellItem2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPropertyStore)(
        IShellItem2 *This,
        GETPROPERTYSTOREFLAGS flags,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetPropertyStoreWithCreateObject)(
        IShellItem2 *This,
        GETPROPERTYSTOREFLAGS flags,
        IUnknown *punkCreateObject,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetPropertyStoreForKeys)(
        IShellItem2 *This,
        const PROPERTYKEY *rgKeys,
        UINT cKeys,
        GETPROPERTYSTOREFLAGS flags,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetPropertyDescriptionList)(
        IShellItem2 *This,
        REFPROPERTYKEY keyType,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *Update)(
        IShellItem2 *This,
        IBindCtx *pbc);

    HRESULT (STDMETHODCALLTYPE *GetProperty)(
        IShellItem2 *This,
        REFPROPERTYKEY key,
        PROPVARIANT *ppropvar);

    HRESULT (STDMETHODCALLTYPE *GetCLSID)(
        IShellItem2 *This,
        REFPROPERTYKEY key,
        CLSID *pclsid);

    HRESULT (STDMETHODCALLTYPE *GetFileTime)(
        IShellItem2 *This,
        REFPROPERTYKEY key,
        FILETIME *pft);

    HRESULT (STDMETHODCALLTYPE *GetInt32)(
        IShellItem2 *This,
        REFPROPERTYKEY key,
        int *pi);

    HRESULT (STDMETHODCALLTYPE *GetString)(
        IShellItem2 *This,
        REFPROPERTYKEY key,
        LPWSTR *ppsz);

    HRESULT (STDMETHODCALLTYPE *GetUInt32)(
        IShellItem2 *This,
        REFPROPERTYKEY key,
        ULONG *pui);

    HRESULT (STDMETHODCALLTYPE *GetUInt64)(
        IShellItem2 *This,
        REFPROPERTYKEY key,
        ULONGLONG *pull);

    HRESULT (STDMETHODCALLTYPE *GetBool)(
        IShellItem2 *This,
        REFPROPERTYKEY key,
        WINBOOL *pf);

    END_INTERFACE
} IShellItem2Vtbl;

interface IShellItem2 {
    CONST_VTBL IShellItem2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellItem2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellItem2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellItem2_Release(This) (This)->lpVtbl->Release(This)
/*** IShellItem methods ***/
#define IShellItem2_BindToHandler(This,pbc,bhid,riid,ppv) (This)->lpVtbl->BindToHandler(This,pbc,bhid,riid,ppv)
#define IShellItem2_GetParent(This,ppsi) (This)->lpVtbl->GetParent(This,ppsi)
#define IShellItem2_GetDisplayName(This,sigdnName,ppszName) (This)->lpVtbl->GetDisplayName(This,sigdnName,ppszName)
#define IShellItem2_GetAttributes(This,sfgaoMask,psfgaoAttribs) (This)->lpVtbl->GetAttributes(This,sfgaoMask,psfgaoAttribs)
#define IShellItem2_Compare(This,psi,hint,piOrder) (This)->lpVtbl->Compare(This,psi,hint,piOrder)
/*** IShellItem2 methods ***/
#define IShellItem2_GetPropertyStore(This,flags,riid,ppv) (This)->lpVtbl->GetPropertyStore(This,flags,riid,ppv)
#define IShellItem2_GetPropertyStoreWithCreateObject(This,flags,punkCreateObject,riid,ppv) (This)->lpVtbl->GetPropertyStoreWithCreateObject(This,flags,punkCreateObject,riid,ppv)
#define IShellItem2_GetPropertyStoreForKeys(This,rgKeys,cKeys,flags,riid,ppv) (This)->lpVtbl->GetPropertyStoreForKeys(This,rgKeys,cKeys,flags,riid,ppv)
#define IShellItem2_GetPropertyDescriptionList(This,keyType,riid,ppv) (This)->lpVtbl->GetPropertyDescriptionList(This,keyType,riid,ppv)
#define IShellItem2_Update(This,pbc) (This)->lpVtbl->Update(This,pbc)
#define IShellItem2_GetProperty(This,key,ppropvar) (This)->lpVtbl->GetProperty(This,key,ppropvar)
#define IShellItem2_GetCLSID(This,key,pclsid) (This)->lpVtbl->GetCLSID(This,key,pclsid)
#define IShellItem2_GetFileTime(This,key,pft) (This)->lpVtbl->GetFileTime(This,key,pft)
#define IShellItem2_GetInt32(This,key,pi) (This)->lpVtbl->GetInt32(This,key,pi)
#define IShellItem2_GetString(This,key,ppsz) (This)->lpVtbl->GetString(This,key,ppsz)
#define IShellItem2_GetUInt32(This,key,pui) (This)->lpVtbl->GetUInt32(This,key,pui)
#define IShellItem2_GetUInt64(This,key,pull) (This)->lpVtbl->GetUInt64(This,key,pull)
#define IShellItem2_GetBool(This,key,pf) (This)->lpVtbl->GetBool(This,key,pf)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellItem2_QueryInterface(IShellItem2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellItem2_AddRef(IShellItem2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellItem2_Release(IShellItem2* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellItem methods ***/
static FORCEINLINE HRESULT IShellItem2_BindToHandler(IShellItem2* This,IBindCtx *pbc,REFGUID bhid,REFIID riid,void **ppv) {
    return This->lpVtbl->BindToHandler(This,pbc,bhid,riid,ppv);
}
static FORCEINLINE HRESULT IShellItem2_GetParent(IShellItem2* This,IShellItem **ppsi) {
    return This->lpVtbl->GetParent(This,ppsi);
}
static FORCEINLINE HRESULT IShellItem2_GetDisplayName(IShellItem2* This,SIGDN sigdnName,LPWSTR *ppszName) {
    return This->lpVtbl->GetDisplayName(This,sigdnName,ppszName);
}
static FORCEINLINE HRESULT IShellItem2_GetAttributes(IShellItem2* This,SFGAOF sfgaoMask,SFGAOF *psfgaoAttribs) {
    return This->lpVtbl->GetAttributes(This,sfgaoMask,psfgaoAttribs);
}
static FORCEINLINE HRESULT IShellItem2_Compare(IShellItem2* This,IShellItem *psi,SICHINTF hint,int *piOrder) {
    return This->lpVtbl->Compare(This,psi,hint,piOrder);
}
/*** IShellItem2 methods ***/
static FORCEINLINE HRESULT IShellItem2_GetPropertyStore(IShellItem2* This,GETPROPERTYSTOREFLAGS flags,REFIID riid,void **ppv) {
    return This->lpVtbl->GetPropertyStore(This,flags,riid,ppv);
}
static FORCEINLINE HRESULT IShellItem2_GetPropertyStoreWithCreateObject(IShellItem2* This,GETPROPERTYSTOREFLAGS flags,IUnknown *punkCreateObject,REFIID riid,void **ppv) {
    return This->lpVtbl->GetPropertyStoreWithCreateObject(This,flags,punkCreateObject,riid,ppv);
}
static FORCEINLINE HRESULT IShellItem2_GetPropertyStoreForKeys(IShellItem2* This,const PROPERTYKEY *rgKeys,UINT cKeys,GETPROPERTYSTOREFLAGS flags,REFIID riid,void **ppv) {
    return This->lpVtbl->GetPropertyStoreForKeys(This,rgKeys,cKeys,flags,riid,ppv);
}
static FORCEINLINE HRESULT IShellItem2_GetPropertyDescriptionList(IShellItem2* This,REFPROPERTYKEY keyType,REFIID riid,void **ppv) {
    return This->lpVtbl->GetPropertyDescriptionList(This,keyType,riid,ppv);
}
static FORCEINLINE HRESULT IShellItem2_Update(IShellItem2* This,IBindCtx *pbc) {
    return This->lpVtbl->Update(This,pbc);
}
static FORCEINLINE HRESULT IShellItem2_GetProperty(IShellItem2* This,REFPROPERTYKEY key,PROPVARIANT *ppropvar) {
    return This->lpVtbl->GetProperty(This,key,ppropvar);
}
static FORCEINLINE HRESULT IShellItem2_GetCLSID(IShellItem2* This,REFPROPERTYKEY key,CLSID *pclsid) {
    return This->lpVtbl->GetCLSID(This,key,pclsid);
}
static FORCEINLINE HRESULT IShellItem2_GetFileTime(IShellItem2* This,REFPROPERTYKEY key,FILETIME *pft) {
    return This->lpVtbl->GetFileTime(This,key,pft);
}
static FORCEINLINE HRESULT IShellItem2_GetInt32(IShellItem2* This,REFPROPERTYKEY key,int *pi) {
    return This->lpVtbl->GetInt32(This,key,pi);
}
static FORCEINLINE HRESULT IShellItem2_GetString(IShellItem2* This,REFPROPERTYKEY key,LPWSTR *ppsz) {
    return This->lpVtbl->GetString(This,key,ppsz);
}
static FORCEINLINE HRESULT IShellItem2_GetUInt32(IShellItem2* This,REFPROPERTYKEY key,ULONG *pui) {
    return This->lpVtbl->GetUInt32(This,key,pui);
}
static FORCEINLINE HRESULT IShellItem2_GetUInt64(IShellItem2* This,REFPROPERTYKEY key,ULONGLONG *pull) {
    return This->lpVtbl->GetUInt64(This,key,pull);
}
static FORCEINLINE HRESULT IShellItem2_GetBool(IShellItem2* This,REFPROPERTYKEY key,WINBOOL *pf) {
    return This->lpVtbl->GetBool(This,key,pf);
}
#endif
#endif

#endif


#endif  /* __IShellItem2_INTERFACE_DEFINED__ */


enum _SIIGBF {
    SIIGBF_RESIZETOFIT = 0x0,
    SIIGBF_BIGGERSIZEOK = 0x1,
    SIIGBF_MEMORYONLY = 0x2,
    SIIGBF_ICONONLY = 0x4,
    SIIGBF_THUMBNAILONLY = 0x8,
    SIIGBF_INCACHEONLY = 0x10,
    SIIGBF_CROPTOSQUARE = 0x20,
    SIIGBF_WIDETHUMBNAILS = 0x40,
    SIIGBF_ICONBACKGROUND = 0x80,
    SIIGBF_SCALEUP = 0x100
};

typedef int SIIGBF;

/*****************************************************************************
 * IShellItemImageFactory interface
 */
#ifndef __IShellItemImageFactory_INTERFACE_DEFINED__
#define __IShellItemImageFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellItemImageFactory, 0xbcc18b79, 0xba16, 0x442f, 0x80,0xc4, 0x8a,0x59,0xc3,0x0c,0x46,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bcc18b79-ba16-442f-80c4-8a59c30c463b")
IShellItemImageFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetImage(
        SIZE size,
        SIIGBF flags,
        HBITMAP *phbm) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellItemImageFactory, 0xbcc18b79, 0xba16, 0x442f, 0x80,0xc4, 0x8a,0x59,0xc3,0x0c,0x46,0x3b)
#endif
#else
typedef struct IShellItemImageFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellItemImageFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellItemImageFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellItemImageFactory *This);

    /*** IShellItemImageFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *GetImage)(
        IShellItemImageFactory *This,
        SIZE size,
        SIIGBF flags,
        HBITMAP *phbm);

    END_INTERFACE
} IShellItemImageFactoryVtbl;

interface IShellItemImageFactory {
    CONST_VTBL IShellItemImageFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellItemImageFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellItemImageFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellItemImageFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IShellItemImageFactory methods ***/
#define IShellItemImageFactory_GetImage(This,size,flags,phbm) (This)->lpVtbl->GetImage(This,size,flags,phbm)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellItemImageFactory_QueryInterface(IShellItemImageFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellItemImageFactory_AddRef(IShellItemImageFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellItemImageFactory_Release(IShellItemImageFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellItemImageFactory methods ***/
static FORCEINLINE HRESULT IShellItemImageFactory_GetImage(IShellItemImageFactory* This,SIZE size,SIIGBF flags,HBITMAP *phbm) {
    return This->lpVtbl->GetImage(This,size,flags,phbm);
}
#endif
#endif

#endif


#endif  /* __IShellItemImageFactory_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IUserAccountChangeCallback interface
 */
#ifndef __IUserAccountChangeCallback_INTERFACE_DEFINED__
#define __IUserAccountChangeCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUserAccountChangeCallback, 0xa561e69a, 0xb4b8, 0x4113, 0x91,0xa5, 0x64,0xc6,0xbc,0xca,0x34,0x30);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a561e69a-b4b8-4113-91a5-64c6bcca3430")
IUserAccountChangeCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnPictureChange(
        LPCWSTR pszUserName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUserAccountChangeCallback, 0xa561e69a, 0xb4b8, 0x4113, 0x91,0xa5, 0x64,0xc6,0xbc,0xca,0x34,0x30)
#endif
#else
typedef struct IUserAccountChangeCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUserAccountChangeCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUserAccountChangeCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUserAccountChangeCallback *This);

    /*** IUserAccountChangeCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnPictureChange)(
        IUserAccountChangeCallback *This,
        LPCWSTR pszUserName);

    END_INTERFACE
} IUserAccountChangeCallbackVtbl;

interface IUserAccountChangeCallback {
    CONST_VTBL IUserAccountChangeCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUserAccountChangeCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUserAccountChangeCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUserAccountChangeCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IUserAccountChangeCallback methods ***/
#define IUserAccountChangeCallback_OnPictureChange(This,pszUserName) (This)->lpVtbl->OnPictureChange(This,pszUserName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUserAccountChangeCallback_QueryInterface(IUserAccountChangeCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUserAccountChangeCallback_AddRef(IUserAccountChangeCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUserAccountChangeCallback_Release(IUserAccountChangeCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IUserAccountChangeCallback methods ***/
static FORCEINLINE HRESULT IUserAccountChangeCallback_OnPictureChange(IUserAccountChangeCallback* This,LPCWSTR pszUserName) {
    return This->lpVtbl->OnPictureChange(This,pszUserName);
}
#endif
#endif

#endif


#endif  /* __IUserAccountChangeCallback_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IEnumShellItems interface
 */
#ifndef __IEnumShellItems_INTERFACE_DEFINED__
#define __IEnumShellItems_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumShellItems, 0x70629033, 0xe363, 0x4a28, 0xa5,0x67, 0x0d,0xb7,0x80,0x06,0xe6,0xd7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("70629033-e363-4a28-a567-0db78006e6d7")
IEnumShellItems : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        IShellItem **rgelt,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumShellItems **ppenum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumShellItems, 0x70629033, 0xe363, 0x4a28, 0xa5,0x67, 0x0d,0xb7,0x80,0x06,0xe6,0xd7)
#endif
#else
typedef struct IEnumShellItemsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumShellItems *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumShellItems *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumShellItems *This);

    /*** IEnumShellItems methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumShellItems *This,
        ULONG celt,
        IShellItem **rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumShellItems *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumShellItems *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumShellItems *This,
        IEnumShellItems **ppenum);

    END_INTERFACE
} IEnumShellItemsVtbl;

interface IEnumShellItems {
    CONST_VTBL IEnumShellItemsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumShellItems_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumShellItems_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumShellItems_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumShellItems methods ***/
#define IEnumShellItems_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IEnumShellItems_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumShellItems_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumShellItems_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumShellItems_QueryInterface(IEnumShellItems* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumShellItems_AddRef(IEnumShellItems* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumShellItems_Release(IEnumShellItems* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumShellItems methods ***/
static FORCEINLINE HRESULT IEnumShellItems_Next(IEnumShellItems* This,ULONG celt,IShellItem **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static FORCEINLINE HRESULT IEnumShellItems_Skip(IEnumShellItems* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumShellItems_Reset(IEnumShellItems* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumShellItems_Clone(IEnumShellItems* This,IEnumShellItems **ppenum) {
    return This->lpVtbl->Clone(This,ppenum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEnumShellItems_RemoteNext_Proxy(
    IEnumShellItems* This,
    ULONG celt,
    IShellItem **rgelt,
    ULONG *pceltFetched);
void __RPC_STUB IEnumShellItems_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumShellItems_Next_Proxy(
    IEnumShellItems* This,
    ULONG celt,
    IShellItem **rgelt,
    ULONG *pceltFetched);
HRESULT __RPC_STUB IEnumShellItems_Next_Stub(
    IEnumShellItems* This,
    ULONG celt,
    IShellItem **rgelt,
    ULONG *pceltFetched);

#endif  /* __IEnumShellItems_INTERFACE_DEFINED__ */


typedef GUID STGTRANSCONFIRMATION;
typedef GUID *LPSTGTRANSCONFIRMATION;

typedef enum STGOP {
    STGOP_MOVE = 1,
    STGOP_COPY = 2,
    STGOP_SYNC = 3,
    STGOP_REMOVE = 5,
    STGOP_RENAME = 6,
    STGOP_APPLYPROPERTIES = 8,
    STGOP_NEW = 10
} STGOP;

enum _TRANSFER_SOURCE_FLAGS {
    TSF_NORMAL = 0x0,
    TSF_FAIL_EXIST = 0x0,
    TSF_RENAME_EXIST = 0x1,
    TSF_OVERWRITE_EXIST = 0x2,
    TSF_ALLOW_DECRYPTION = 0x4,
    TSF_NO_SECURITY = 0x8,
    TSF_COPY_CREATION_TIME = 0x10,
    TSF_COPY_WRITE_TIME = 0x20,
    TSF_USE_FULL_ACCESS = 0x40,
    TSF_DELETE_RECYCLE_IF_POSSIBLE = 0x80,
    TSF_COPY_HARD_LINK = 0x100,
    TSF_COPY_LOCALIZED_NAME = 0x200,
    TSF_MOVE_AS_COPY_DELETE = 0x400,
    TSF_SUSPEND_SHELLEVENTS = 0x800
};

typedef DWORD TRANSFER_SOURCE_FLAGS;

#if _WIN32_IE >= _WIN32_IE_IE70
/*****************************************************************************
 * ITransferAdviseSink interface
 */
#ifndef __ITransferAdviseSink_INTERFACE_DEFINED__
#define __ITransferAdviseSink_INTERFACE_DEFINED__

enum _TRANSFER_ADVISE_STATE {
    TS_NONE = 0x0,
    TS_PERFORMING = 0x1,
    TS_PREPARING = 0x2,
    TS_INDETERMINATE = 0x4
};

typedef DWORD TRANSFER_ADVISE_STATE;

DEFINE_GUID(IID_ITransferAdviseSink, 0xd594d0d8, 0x8da7, 0x457b, 0xb3,0xb4, 0xce,0x5d,0xba,0xac,0x0b,0x88);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d594d0d8-8da7-457b-b3b4-ce5dbaac0b88")
ITransferAdviseSink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE UpdateProgress(
        ULONGLONG ullSizeCurrent,
        ULONGLONG ullSizeTotal,
        int nFilesCurrent,
        int nFilesTotal,
        int nFoldersCurrent,
        int nFoldersTotal) = 0;

    virtual HRESULT STDMETHODCALLTYPE UpdateTransferState(
        TRANSFER_ADVISE_STATE ts) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConfirmOverwrite(
        IShellItem *psiSource,
        IShellItem *psiDestParent,
        LPCWSTR pszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConfirmEncryptionLoss(
        IShellItem *psiSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE FileFailure(
        IShellItem *psi,
        LPCWSTR pszItem,
        HRESULT hrError,
        LPWSTR pszRename,
        ULONG cchRename) = 0;

    virtual HRESULT STDMETHODCALLTYPE SubStreamFailure(
        IShellItem *psi,
        LPCWSTR pszStreamName,
        HRESULT hrError) = 0;

    virtual HRESULT STDMETHODCALLTYPE PropertyFailure(
        IShellItem *psi,
        const PROPERTYKEY *pkey,
        HRESULT hrError) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITransferAdviseSink, 0xd594d0d8, 0x8da7, 0x457b, 0xb3,0xb4, 0xce,0x5d,0xba,0xac,0x0b,0x88)
#endif
#else
typedef struct ITransferAdviseSinkVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITransferAdviseSink *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITransferAdviseSink *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITransferAdviseSink *This);

    /*** ITransferAdviseSink methods ***/
    HRESULT (STDMETHODCALLTYPE *UpdateProgress)(
        ITransferAdviseSink *This,
        ULONGLONG ullSizeCurrent,
        ULONGLONG ullSizeTotal,
        int nFilesCurrent,
        int nFilesTotal,
        int nFoldersCurrent,
        int nFoldersTotal);

    HRESULT (STDMETHODCALLTYPE *UpdateTransferState)(
        ITransferAdviseSink *This,
        TRANSFER_ADVISE_STATE ts);

    HRESULT (STDMETHODCALLTYPE *ConfirmOverwrite)(
        ITransferAdviseSink *This,
        IShellItem *psiSource,
        IShellItem *psiDestParent,
        LPCWSTR pszName);

    HRESULT (STDMETHODCALLTYPE *ConfirmEncryptionLoss)(
        ITransferAdviseSink *This,
        IShellItem *psiSource);

    HRESULT (STDMETHODCALLTYPE *FileFailure)(
        ITransferAdviseSink *This,
        IShellItem *psi,
        LPCWSTR pszItem,
        HRESULT hrError,
        LPWSTR pszRename,
        ULONG cchRename);

    HRESULT (STDMETHODCALLTYPE *SubStreamFailure)(
        ITransferAdviseSink *This,
        IShellItem *psi,
        LPCWSTR pszStreamName,
        HRESULT hrError);

    HRESULT (STDMETHODCALLTYPE *PropertyFailure)(
        ITransferAdviseSink *This,
        IShellItem *psi,
        const PROPERTYKEY *pkey,
        HRESULT hrError);

    END_INTERFACE
} ITransferAdviseSinkVtbl;

interface ITransferAdviseSink {
    CONST_VTBL ITransferAdviseSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITransferAdviseSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITransferAdviseSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITransferAdviseSink_Release(This) (This)->lpVtbl->Release(This)
/*** ITransferAdviseSink methods ***/
#define ITransferAdviseSink_UpdateProgress(This,ullSizeCurrent,ullSizeTotal,nFilesCurrent,nFilesTotal,nFoldersCurrent,nFoldersTotal) (This)->lpVtbl->UpdateProgress(This,ullSizeCurrent,ullSizeTotal,nFilesCurrent,nFilesTotal,nFoldersCurrent,nFoldersTotal)
#define ITransferAdviseSink_UpdateTransferState(This,ts) (This)->lpVtbl->UpdateTransferState(This,ts)
#define ITransferAdviseSink_ConfirmOverwrite(This,psiSource,psiDestParent,pszName) (This)->lpVtbl->ConfirmOverwrite(This,psiSource,psiDestParent,pszName)
#define ITransferAdviseSink_ConfirmEncryptionLoss(This,psiSource) (This)->lpVtbl->ConfirmEncryptionLoss(This,psiSource)
#define ITransferAdviseSink_FileFailure(This,psi,pszItem,hrError,pszRename,cchRename) (This)->lpVtbl->FileFailure(This,psi,pszItem,hrError,pszRename,cchRename)
#define ITransferAdviseSink_SubStreamFailure(This,psi,pszStreamName,hrError) (This)->lpVtbl->SubStreamFailure(This,psi,pszStreamName,hrError)
#define ITransferAdviseSink_PropertyFailure(This,psi,pkey,hrError) (This)->lpVtbl->PropertyFailure(This,psi,pkey,hrError)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITransferAdviseSink_QueryInterface(ITransferAdviseSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITransferAdviseSink_AddRef(ITransferAdviseSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITransferAdviseSink_Release(ITransferAdviseSink* This) {
    return This->lpVtbl->Release(This);
}
/*** ITransferAdviseSink methods ***/
static FORCEINLINE HRESULT ITransferAdviseSink_UpdateProgress(ITransferAdviseSink* This,ULONGLONG ullSizeCurrent,ULONGLONG ullSizeTotal,int nFilesCurrent,int nFilesTotal,int nFoldersCurrent,int nFoldersTotal) {
    return This->lpVtbl->UpdateProgress(This,ullSizeCurrent,ullSizeTotal,nFilesCurrent,nFilesTotal,nFoldersCurrent,nFoldersTotal);
}
static FORCEINLINE HRESULT ITransferAdviseSink_UpdateTransferState(ITransferAdviseSink* This,TRANSFER_ADVISE_STATE ts) {
    return This->lpVtbl->UpdateTransferState(This,ts);
}
static FORCEINLINE HRESULT ITransferAdviseSink_ConfirmOverwrite(ITransferAdviseSink* This,IShellItem *psiSource,IShellItem *psiDestParent,LPCWSTR pszName) {
    return This->lpVtbl->ConfirmOverwrite(This,psiSource,psiDestParent,pszName);
}
static FORCEINLINE HRESULT ITransferAdviseSink_ConfirmEncryptionLoss(ITransferAdviseSink* This,IShellItem *psiSource) {
    return This->lpVtbl->ConfirmEncryptionLoss(This,psiSource);
}
static FORCEINLINE HRESULT ITransferAdviseSink_FileFailure(ITransferAdviseSink* This,IShellItem *psi,LPCWSTR pszItem,HRESULT hrError,LPWSTR pszRename,ULONG cchRename) {
    return This->lpVtbl->FileFailure(This,psi,pszItem,hrError,pszRename,cchRename);
}
static FORCEINLINE HRESULT ITransferAdviseSink_SubStreamFailure(ITransferAdviseSink* This,IShellItem *psi,LPCWSTR pszStreamName,HRESULT hrError) {
    return This->lpVtbl->SubStreamFailure(This,psi,pszStreamName,hrError);
}
static FORCEINLINE HRESULT ITransferAdviseSink_PropertyFailure(ITransferAdviseSink* This,IShellItem *psi,const PROPERTYKEY *pkey,HRESULT hrError) {
    return This->lpVtbl->PropertyFailure(This,psi,pkey,hrError);
}
#endif
#endif

#endif


#endif  /* __ITransferAdviseSink_INTERFACE_DEFINED__ */

#endif

#if NTDDI_VERSION >= NTDDI_VISTA
/*****************************************************************************
 * ITransferSource interface
 */
#ifndef __ITransferSource_INTERFACE_DEFINED__
#define __ITransferSource_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITransferSource, 0x00adb003, 0xbde9, 0x45c6, 0x8e,0x29, 0xd0,0x9f,0x93,0x53,0xe1,0x08);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00adb003-bde9-45c6-8e29-d09f9353e108")
ITransferSource : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Advise(
        ITransferAdviseSink *psink,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unadvise(
        DWORD dwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProperties(
        IPropertyChangeArray *pproparray) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenItem(
        IShellItem *psi,
        TRANSFER_SOURCE_FLAGS flags,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveItem(
        IShellItem *psi,
        IShellItem *psiParentDst,
        LPCWSTR pszNameDst,
        TRANSFER_SOURCE_FLAGS flags,
        IShellItem **ppsiNew) = 0;

    virtual HRESULT STDMETHODCALLTYPE RecycleItem(
        IShellItem *psiSource,
        IShellItem *psiParentDest,
        TRANSFER_SOURCE_FLAGS flags,
        IShellItem **ppsiNewDest) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveItem(
        IShellItem *psiSource,
        TRANSFER_SOURCE_FLAGS flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE RenameItem(
        IShellItem *psiSource,
        LPCWSTR pszNewName,
        TRANSFER_SOURCE_FLAGS flags,
        IShellItem **ppsiNewDest) = 0;

    virtual HRESULT STDMETHODCALLTYPE LinkItem(
        IShellItem *psiSource,
        IShellItem *psiParentDest,
        LPCWSTR pszNewName,
        TRANSFER_SOURCE_FLAGS flags,
        IShellItem **ppsiNewDest) = 0;

    virtual HRESULT STDMETHODCALLTYPE ApplyPropertiesToItem(
        IShellItem *psiSource,
        IShellItem **ppsiNew) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultDestinationName(
        IShellItem *psiSource,
        IShellItem *psiParentDest,
        LPWSTR *ppszDestinationName) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnterFolder(
        IShellItem *psiChildFolderDest) = 0;

    virtual HRESULT STDMETHODCALLTYPE LeaveFolder(
        IShellItem *psiChildFolderDest) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITransferSource, 0x00adb003, 0xbde9, 0x45c6, 0x8e,0x29, 0xd0,0x9f,0x93,0x53,0xe1,0x08)
#endif
#else
typedef struct ITransferSourceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITransferSource *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITransferSource *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITransferSource *This);

    /*** ITransferSource methods ***/
    HRESULT (STDMETHODCALLTYPE *Advise)(
        ITransferSource *This,
        ITransferAdviseSink *psink,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        ITransferSource *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *SetProperties)(
        ITransferSource *This,
        IPropertyChangeArray *pproparray);

    HRESULT (STDMETHODCALLTYPE *OpenItem)(
        ITransferSource *This,
        IShellItem *psi,
        TRANSFER_SOURCE_FLAGS flags,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *MoveItem)(
        ITransferSource *This,
        IShellItem *psi,
        IShellItem *psiParentDst,
        LPCWSTR pszNameDst,
        TRANSFER_SOURCE_FLAGS flags,
        IShellItem **ppsiNew);

    HRESULT (STDMETHODCALLTYPE *RecycleItem)(
        ITransferSource *This,
        IShellItem *psiSource,
        IShellItem *psiParentDest,
        TRANSFER_SOURCE_FLAGS flags,
        IShellItem **ppsiNewDest);

    HRESULT (STDMETHODCALLTYPE *RemoveItem)(
        ITransferSource *This,
        IShellItem *psiSource,
        TRANSFER_SOURCE_FLAGS flags);

    HRESULT (STDMETHODCALLTYPE *RenameItem)(
        ITransferSource *This,
        IShellItem *psiSource,
        LPCWSTR pszNewName,
        TRANSFER_SOURCE_FLAGS flags,
        IShellItem **ppsiNewDest);

    HRESULT (STDMETHODCALLTYPE *LinkItem)(
        ITransferSource *This,
        IShellItem *psiSource,
        IShellItem *psiParentDest,
        LPCWSTR pszNewName,
        TRANSFER_SOURCE_FLAGS flags,
        IShellItem **ppsiNewDest);

    HRESULT (STDMETHODCALLTYPE *ApplyPropertiesToItem)(
        ITransferSource *This,
        IShellItem *psiSource,
        IShellItem **ppsiNew);

    HRESULT (STDMETHODCALLTYPE *GetDefaultDestinationName)(
        ITransferSource *This,
        IShellItem *psiSource,
        IShellItem *psiParentDest,
        LPWSTR *ppszDestinationName);

    HRESULT (STDMETHODCALLTYPE *EnterFolder)(
        ITransferSource *This,
        IShellItem *psiChildFolderDest);

    HRESULT (STDMETHODCALLTYPE *LeaveFolder)(
        ITransferSource *This,
        IShellItem *psiChildFolderDest);

    END_INTERFACE
} ITransferSourceVtbl;

interface ITransferSource {
    CONST_VTBL ITransferSourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITransferSource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITransferSource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITransferSource_Release(This) (This)->lpVtbl->Release(This)
/*** ITransferSource methods ***/
#define ITransferSource_Advise(This,psink,pdwCookie) (This)->lpVtbl->Advise(This,psink,pdwCookie)
#define ITransferSource_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
#define ITransferSource_SetProperties(This,pproparray) (This)->lpVtbl->SetProperties(This,pproparray)
#define ITransferSource_OpenItem(This,psi,flags,riid,ppv) (This)->lpVtbl->OpenItem(This,psi,flags,riid,ppv)
#define ITransferSource_MoveItem(This,psi,psiParentDst,pszNameDst,flags,ppsiNew) (This)->lpVtbl->MoveItem(This,psi,psiParentDst,pszNameDst,flags,ppsiNew)
#define ITransferSource_RecycleItem(This,psiSource,psiParentDest,flags,ppsiNewDest) (This)->lpVtbl->RecycleItem(This,psiSource,psiParentDest,flags,ppsiNewDest)
#define ITransferSource_RemoveItem(This,psiSource,flags) (This)->lpVtbl->RemoveItem(This,psiSource,flags)
#define ITransferSource_RenameItem(This,psiSource,pszNewName,flags,ppsiNewDest) (This)->lpVtbl->RenameItem(This,psiSource,pszNewName,flags,ppsiNewDest)
#define ITransferSource_LinkItem(This,psiSource,psiParentDest,pszNewName,flags,ppsiNewDest) (This)->lpVtbl->LinkItem(This,psiSource,psiParentDest,pszNewName,flags,ppsiNewDest)
#define ITransferSource_ApplyPropertiesToItem(This,psiSource,ppsiNew) (This)->lpVtbl->ApplyPropertiesToItem(This,psiSource,ppsiNew)
#define ITransferSource_GetDefaultDestinationName(This,psiSource,psiParentDest,ppszDestinationName) (This)->lpVtbl->GetDefaultDestinationName(This,psiSource,psiParentDest,ppszDestinationName)
#define ITransferSource_EnterFolder(This,psiChildFolderDest) (This)->lpVtbl->EnterFolder(This,psiChildFolderDest)
#define ITransferSource_LeaveFolder(This,psiChildFolderDest) (This)->lpVtbl->LeaveFolder(This,psiChildFolderDest)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITransferSource_QueryInterface(ITransferSource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITransferSource_AddRef(ITransferSource* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITransferSource_Release(ITransferSource* This) {
    return This->lpVtbl->Release(This);
}
/*** ITransferSource methods ***/
static FORCEINLINE HRESULT ITransferSource_Advise(ITransferSource* This,ITransferAdviseSink *psink,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,psink,pdwCookie);
}
static FORCEINLINE HRESULT ITransferSource_Unadvise(ITransferSource* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static FORCEINLINE HRESULT ITransferSource_SetProperties(ITransferSource* This,IPropertyChangeArray *pproparray) {
    return This->lpVtbl->SetProperties(This,pproparray);
}
static FORCEINLINE HRESULT ITransferSource_OpenItem(ITransferSource* This,IShellItem *psi,TRANSFER_SOURCE_FLAGS flags,REFIID riid,void **ppv) {
    return This->lpVtbl->OpenItem(This,psi,flags,riid,ppv);
}
static FORCEINLINE HRESULT ITransferSource_MoveItem(ITransferSource* This,IShellItem *psi,IShellItem *psiParentDst,LPCWSTR pszNameDst,TRANSFER_SOURCE_FLAGS flags,IShellItem **ppsiNew) {
    return This->lpVtbl->MoveItem(This,psi,psiParentDst,pszNameDst,flags,ppsiNew);
}
static FORCEINLINE HRESULT ITransferSource_RecycleItem(ITransferSource* This,IShellItem *psiSource,IShellItem *psiParentDest,TRANSFER_SOURCE_FLAGS flags,IShellItem **ppsiNewDest) {
    return This->lpVtbl->RecycleItem(This,psiSource,psiParentDest,flags,ppsiNewDest);
}
static FORCEINLINE HRESULT ITransferSource_RemoveItem(ITransferSource* This,IShellItem *psiSource,TRANSFER_SOURCE_FLAGS flags) {
    return This->lpVtbl->RemoveItem(This,psiSource,flags);
}
static FORCEINLINE HRESULT ITransferSource_RenameItem(ITransferSource* This,IShellItem *psiSource,LPCWSTR pszNewName,TRANSFER_SOURCE_FLAGS flags,IShellItem **ppsiNewDest) {
    return This->lpVtbl->RenameItem(This,psiSource,pszNewName,flags,ppsiNewDest);
}
static FORCEINLINE HRESULT ITransferSource_LinkItem(ITransferSource* This,IShellItem *psiSource,IShellItem *psiParentDest,LPCWSTR pszNewName,TRANSFER_SOURCE_FLAGS flags,IShellItem **ppsiNewDest) {
    return This->lpVtbl->LinkItem(This,psiSource,psiParentDest,pszNewName,flags,ppsiNewDest);
}
static FORCEINLINE HRESULT ITransferSource_ApplyPropertiesToItem(ITransferSource* This,IShellItem *psiSource,IShellItem **ppsiNew) {
    return This->lpVtbl->ApplyPropertiesToItem(This,psiSource,ppsiNew);
}
static FORCEINLINE HRESULT ITransferSource_GetDefaultDestinationName(ITransferSource* This,IShellItem *psiSource,IShellItem *psiParentDest,LPWSTR *ppszDestinationName) {
    return This->lpVtbl->GetDefaultDestinationName(This,psiSource,psiParentDest,ppszDestinationName);
}
static FORCEINLINE HRESULT ITransferSource_EnterFolder(ITransferSource* This,IShellItem *psiChildFolderDest) {
    return This->lpVtbl->EnterFolder(This,psiChildFolderDest);
}
static FORCEINLINE HRESULT ITransferSource_LeaveFolder(ITransferSource* This,IShellItem *psiChildFolderDest) {
    return This->lpVtbl->LeaveFolder(This,psiChildFolderDest);
}
#endif
#endif

#endif


#endif  /* __ITransferSource_INTERFACE_DEFINED__ */

#endif

typedef struct SHELL_ITEM_RESOURCE {
    GUID guidType;
    WCHAR szName[260];
} SHELL_ITEM_RESOURCE;

/*****************************************************************************
 * IEnumResources interface
 */
#ifndef __IEnumResources_INTERFACE_DEFINED__
#define __IEnumResources_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumResources, 0x2dd81fe3, 0xa83c, 0x4da9, 0xa3,0x30, 0x47,0x24,0x9d,0x34,0x5b,0xa1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2dd81fe3-a83c-4da9-a330-47249d345ba1")
IEnumResources : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        SHELL_ITEM_RESOURCE *psir,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumResources **ppenumr) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumResources, 0x2dd81fe3, 0xa83c, 0x4da9, 0xa3,0x30, 0x47,0x24,0x9d,0x34,0x5b,0xa1)
#endif
#else
typedef struct IEnumResourcesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumResources *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumResources *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumResources *This);

    /*** IEnumResources methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumResources *This,
        ULONG celt,
        SHELL_ITEM_RESOURCE *psir,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumResources *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumResources *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumResources *This,
        IEnumResources **ppenumr);

    END_INTERFACE
} IEnumResourcesVtbl;

interface IEnumResources {
    CONST_VTBL IEnumResourcesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumResources_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumResources_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumResources_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumResources methods ***/
#define IEnumResources_Next(This,celt,psir,pceltFetched) (This)->lpVtbl->Next(This,celt,psir,pceltFetched)
#define IEnumResources_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumResources_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumResources_Clone(This,ppenumr) (This)->lpVtbl->Clone(This,ppenumr)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumResources_QueryInterface(IEnumResources* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumResources_AddRef(IEnumResources* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumResources_Release(IEnumResources* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumResources methods ***/
static FORCEINLINE HRESULT IEnumResources_Next(IEnumResources* This,ULONG celt,SHELL_ITEM_RESOURCE *psir,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,psir,pceltFetched);
}
static FORCEINLINE HRESULT IEnumResources_Skip(IEnumResources* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumResources_Reset(IEnumResources* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumResources_Clone(IEnumResources* This,IEnumResources **ppenumr) {
    return This->lpVtbl->Clone(This,ppenumr);
}
#endif
#endif

#endif


#endif  /* __IEnumResources_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IShellItemResources interface
 */
#ifndef __IShellItemResources_INTERFACE_DEFINED__
#define __IShellItemResources_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellItemResources, 0xff5693be, 0x2ce0, 0x4d48, 0xb5,0xc5, 0x40,0x81,0x7d,0x1a,0xcd,0xb9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ff5693be-2ce0-4d48-b5c5-40817d1acdb9")
IShellItemResources : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetAttributes(
        DWORD *pdwAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSize(
        ULONGLONG *pullSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTimes(
        FILETIME *pftCreation,
        FILETIME *pftWrite,
        FILETIME *pftAccess) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTimes(
        const FILETIME *pftCreation,
        const FILETIME *pftWrite,
        const FILETIME *pftAccess) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResourceDescription(
        const SHELL_ITEM_RESOURCE *pcsir,
        LPWSTR *ppszDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumResources(
        IEnumResources **ppenumr) = 0;

    virtual HRESULT STDMETHODCALLTYPE SupportsResource(
        const SHELL_ITEM_RESOURCE *pcsir) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenResource(
        const SHELL_ITEM_RESOURCE *pcsir,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateResource(
        const SHELL_ITEM_RESOURCE *pcsir,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE MarkForDelete(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellItemResources, 0xff5693be, 0x2ce0, 0x4d48, 0xb5,0xc5, 0x40,0x81,0x7d,0x1a,0xcd,0xb9)
#endif
#else
typedef struct IShellItemResourcesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellItemResources *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellItemResources *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellItemResources *This);

    /*** IShellItemResources methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAttributes)(
        IShellItemResources *This,
        DWORD *pdwAttributes);

    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IShellItemResources *This,
        ULONGLONG *pullSize);

    HRESULT (STDMETHODCALLTYPE *GetTimes)(
        IShellItemResources *This,
        FILETIME *pftCreation,
        FILETIME *pftWrite,
        FILETIME *pftAccess);

    HRESULT (STDMETHODCALLTYPE *SetTimes)(
        IShellItemResources *This,
        const FILETIME *pftCreation,
        const FILETIME *pftWrite,
        const FILETIME *pftAccess);

    HRESULT (STDMETHODCALLTYPE *GetResourceDescription)(
        IShellItemResources *This,
        const SHELL_ITEM_RESOURCE *pcsir,
        LPWSTR *ppszDescription);

    HRESULT (STDMETHODCALLTYPE *EnumResources)(
        IShellItemResources *This,
        IEnumResources **ppenumr);

    HRESULT (STDMETHODCALLTYPE *SupportsResource)(
        IShellItemResources *This,
        const SHELL_ITEM_RESOURCE *pcsir);

    HRESULT (STDMETHODCALLTYPE *OpenResource)(
        IShellItemResources *This,
        const SHELL_ITEM_RESOURCE *pcsir,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *CreateResource)(
        IShellItemResources *This,
        const SHELL_ITEM_RESOURCE *pcsir,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *MarkForDelete)(
        IShellItemResources *This);

    END_INTERFACE
} IShellItemResourcesVtbl;

interface IShellItemResources {
    CONST_VTBL IShellItemResourcesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellItemResources_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellItemResources_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellItemResources_Release(This) (This)->lpVtbl->Release(This)
/*** IShellItemResources methods ***/
#define IShellItemResources_GetAttributes(This,pdwAttributes) (This)->lpVtbl->GetAttributes(This,pdwAttributes)
#define IShellItemResources_GetSize(This,pullSize) (This)->lpVtbl->GetSize(This,pullSize)
#define IShellItemResources_GetTimes(This,pftCreation,pftWrite,pftAccess) (This)->lpVtbl->GetTimes(This,pftCreation,pftWrite,pftAccess)
#define IShellItemResources_SetTimes(This,pftCreation,pftWrite,pftAccess) (This)->lpVtbl->SetTimes(This,pftCreation,pftWrite,pftAccess)
#define IShellItemResources_GetResourceDescription(This,pcsir,ppszDescription) (This)->lpVtbl->GetResourceDescription(This,pcsir,ppszDescription)
#define IShellItemResources_EnumResources(This,ppenumr) (This)->lpVtbl->EnumResources(This,ppenumr)
#define IShellItemResources_SupportsResource(This,pcsir) (This)->lpVtbl->SupportsResource(This,pcsir)
#define IShellItemResources_OpenResource(This,pcsir,riid,ppv) (This)->lpVtbl->OpenResource(This,pcsir,riid,ppv)
#define IShellItemResources_CreateResource(This,pcsir,riid,ppv) (This)->lpVtbl->CreateResource(This,pcsir,riid,ppv)
#define IShellItemResources_MarkForDelete(This) (This)->lpVtbl->MarkForDelete(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellItemResources_QueryInterface(IShellItemResources* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellItemResources_AddRef(IShellItemResources* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellItemResources_Release(IShellItemResources* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellItemResources methods ***/
static FORCEINLINE HRESULT IShellItemResources_GetAttributes(IShellItemResources* This,DWORD *pdwAttributes) {
    return This->lpVtbl->GetAttributes(This,pdwAttributes);
}
static FORCEINLINE HRESULT IShellItemResources_GetSize(IShellItemResources* This,ULONGLONG *pullSize) {
    return This->lpVtbl->GetSize(This,pullSize);
}
static FORCEINLINE HRESULT IShellItemResources_GetTimes(IShellItemResources* This,FILETIME *pftCreation,FILETIME *pftWrite,FILETIME *pftAccess) {
    return This->lpVtbl->GetTimes(This,pftCreation,pftWrite,pftAccess);
}
static FORCEINLINE HRESULT IShellItemResources_SetTimes(IShellItemResources* This,const FILETIME *pftCreation,const FILETIME *pftWrite,const FILETIME *pftAccess) {
    return This->lpVtbl->SetTimes(This,pftCreation,pftWrite,pftAccess);
}
static FORCEINLINE HRESULT IShellItemResources_GetResourceDescription(IShellItemResources* This,const SHELL_ITEM_RESOURCE *pcsir,LPWSTR *ppszDescription) {
    return This->lpVtbl->GetResourceDescription(This,pcsir,ppszDescription);
}
static FORCEINLINE HRESULT IShellItemResources_EnumResources(IShellItemResources* This,IEnumResources **ppenumr) {
    return This->lpVtbl->EnumResources(This,ppenumr);
}
static FORCEINLINE HRESULT IShellItemResources_SupportsResource(IShellItemResources* This,const SHELL_ITEM_RESOURCE *pcsir) {
    return This->lpVtbl->SupportsResource(This,pcsir);
}
static FORCEINLINE HRESULT IShellItemResources_OpenResource(IShellItemResources* This,const SHELL_ITEM_RESOURCE *pcsir,REFIID riid,void **ppv) {
    return This->lpVtbl->OpenResource(This,pcsir,riid,ppv);
}
static FORCEINLINE HRESULT IShellItemResources_CreateResource(IShellItemResources* This,const SHELL_ITEM_RESOURCE *pcsir,REFIID riid,void **ppv) {
    return This->lpVtbl->CreateResource(This,pcsir,riid,ppv);
}
static FORCEINLINE HRESULT IShellItemResources_MarkForDelete(IShellItemResources* This) {
    return This->lpVtbl->MarkForDelete(This);
}
#endif
#endif

#endif


#endif  /* __IShellItemResources_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ITransferDestination interface
 */
#ifndef __ITransferDestination_INTERFACE_DEFINED__
#define __ITransferDestination_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITransferDestination, 0x48addd32, 0x3ca5, 0x4124, 0xab,0xe3, 0xb5,0xa7,0x25,0x31,0xb2,0x07);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("48addd32-3ca5-4124-abe3-b5a72531b207")
ITransferDestination : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Advise(
        ITransferAdviseSink *psink,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unadvise(
        DWORD dwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateItem(
        LPCWSTR pszName,
        DWORD dwAttributes,
        ULONGLONG ullSize,
        TRANSFER_SOURCE_FLAGS flags,
        REFIID riidItem,
        void **ppvItem,
        REFIID riidResources,
        void **ppvResources) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITransferDestination, 0x48addd32, 0x3ca5, 0x4124, 0xab,0xe3, 0xb5,0xa7,0x25,0x31,0xb2,0x07)
#endif
#else
typedef struct ITransferDestinationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITransferDestination *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITransferDestination *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITransferDestination *This);

    /*** ITransferDestination methods ***/
    HRESULT (STDMETHODCALLTYPE *Advise)(
        ITransferDestination *This,
        ITransferAdviseSink *psink,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        ITransferDestination *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *CreateItem)(
        ITransferDestination *This,
        LPCWSTR pszName,
        DWORD dwAttributes,
        ULONGLONG ullSize,
        TRANSFER_SOURCE_FLAGS flags,
        REFIID riidItem,
        void **ppvItem,
        REFIID riidResources,
        void **ppvResources);

    END_INTERFACE
} ITransferDestinationVtbl;

interface ITransferDestination {
    CONST_VTBL ITransferDestinationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITransferDestination_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITransferDestination_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITransferDestination_Release(This) (This)->lpVtbl->Release(This)
/*** ITransferDestination methods ***/
#define ITransferDestination_Advise(This,psink,pdwCookie) (This)->lpVtbl->Advise(This,psink,pdwCookie)
#define ITransferDestination_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
#define ITransferDestination_CreateItem(This,pszName,dwAttributes,ullSize,flags,riidItem,ppvItem,riidResources,ppvResources) (This)->lpVtbl->CreateItem(This,pszName,dwAttributes,ullSize,flags,riidItem,ppvItem,riidResources,ppvResources)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITransferDestination_QueryInterface(ITransferDestination* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITransferDestination_AddRef(ITransferDestination* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITransferDestination_Release(ITransferDestination* This) {
    return This->lpVtbl->Release(This);
}
/*** ITransferDestination methods ***/
static FORCEINLINE HRESULT ITransferDestination_Advise(ITransferDestination* This,ITransferAdviseSink *psink,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,psink,pdwCookie);
}
static FORCEINLINE HRESULT ITransferDestination_Unadvise(ITransferDestination* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static FORCEINLINE HRESULT ITransferDestination_CreateItem(ITransferDestination* This,LPCWSTR pszName,DWORD dwAttributes,ULONGLONG ullSize,TRANSFER_SOURCE_FLAGS flags,REFIID riidItem,void **ppvItem,REFIID riidResources,void **ppvResources) {
    return This->lpVtbl->CreateItem(This,pszName,dwAttributes,ullSize,flags,riidItem,ppvItem,riidResources,ppvResources);
}
#endif
#endif

#endif


#endif  /* __ITransferDestination_INTERFACE_DEFINED__ */

#if 0
typedef struct _OVERLAPPED {
    ULONG_PTR Internal;
    ULONG_PTR InternalHigh;
    __C89_NAMELESS union {
        __C89_NAMELESS struct {
            DWORD Offset;
            DWORD OffsetHigh;
        } __C89_NAMELESSSTRUCTNAME;
        PVOID Pointer;
    } __C89_NAMELESSUNIONNAME;
    HANDLE hEvent;
} OVERLAPPED;
typedef struct _OVERLAPPED *LPOVERLAPPED;
#endif

/*****************************************************************************
 * IStreamAsync interface
 */
#ifndef __IStreamAsync_INTERFACE_DEFINED__
#define __IStreamAsync_INTERFACE_DEFINED__

DEFINE_GUID(IID_IStreamAsync, 0xfe0b6665, 0xe0ca, 0x49b9, 0xa1,0x78, 0x2b,0x5c,0xb4,0x8d,0x92,0xa5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fe0b6665-e0ca-49b9-a178-2b5cb48d92a5")
IStreamAsync : public IStream
{
    virtual HRESULT STDMETHODCALLTYPE ReadAsync(
        void *pv,
        DWORD cb,
        LPDWORD pcbRead,
        LPOVERLAPPED lpOverlapped) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteAsync(
        const void *lpBuffer,
        DWORD cb,
        LPDWORD pcbWritten,
        LPOVERLAPPED lpOverlapped) = 0;

    virtual HRESULT STDMETHODCALLTYPE OverlappedResult(
        LPOVERLAPPED lpOverlapped,
        LPDWORD lpNumberOfBytesTransferred,
        WINBOOL bWait) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelIo(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IStreamAsync, 0xfe0b6665, 0xe0ca, 0x49b9, 0xa1,0x78, 0x2b,0x5c,0xb4,0x8d,0x92,0xa5)
#endif
#else
typedef struct IStreamAsyncVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IStreamAsync *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IStreamAsync *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IStreamAsync *This);

    /*** ISequentialStream methods ***/
    HRESULT (STDMETHODCALLTYPE *Read)(
        IStreamAsync *This,
        void *pv,
        ULONG cb,
        ULONG *pcbRead);

    HRESULT (STDMETHODCALLTYPE *Write)(
        IStreamAsync *This,
        const void *pv,
        ULONG cb,
        ULONG *pcbWritten);

    /*** IStream methods ***/
    HRESULT (STDMETHODCALLTYPE *Seek)(
        IStreamAsync *This,
        LARGE_INTEGER dlibMove,
        DWORD dwOrigin,
        ULARGE_INTEGER *plibNewPosition);

    HRESULT (STDMETHODCALLTYPE *SetSize)(
        IStreamAsync *This,
        ULARGE_INTEGER libNewSize);

    HRESULT (STDMETHODCALLTYPE *CopyTo)(
        IStreamAsync *This,
        IStream *pstm,
        ULARGE_INTEGER cb,
        ULARGE_INTEGER *pcbRead,
        ULARGE_INTEGER *pcbWritten);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IStreamAsync *This,
        DWORD grfCommitFlags);

    HRESULT (STDMETHODCALLTYPE *Revert)(
        IStreamAsync *This);

    HRESULT (STDMETHODCALLTYPE *LockRegion)(
        IStreamAsync *This,
        ULARGE_INTEGER libOffset,
        ULARGE_INTEGER cb,
        DWORD dwLockType);

    HRESULT (STDMETHODCALLTYPE *UnlockRegion)(
        IStreamAsync *This,
        ULARGE_INTEGER libOffset,
        ULARGE_INTEGER cb,
        DWORD dwLockType);

    HRESULT (STDMETHODCALLTYPE *Stat)(
        IStreamAsync *This,
        STATSTG *pstatstg,
        DWORD grfStatFlag);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IStreamAsync *This,
        IStream **ppstm);

    /*** IStreamAsync methods ***/
    HRESULT (STDMETHODCALLTYPE *ReadAsync)(
        IStreamAsync *This,
        void *pv,
        DWORD cb,
        LPDWORD pcbRead,
        LPOVERLAPPED lpOverlapped);

    HRESULT (STDMETHODCALLTYPE *WriteAsync)(
        IStreamAsync *This,
        const void *lpBuffer,
        DWORD cb,
        LPDWORD pcbWritten,
        LPOVERLAPPED lpOverlapped);

    HRESULT (STDMETHODCALLTYPE *OverlappedResult)(
        IStreamAsync *This,
        LPOVERLAPPED lpOverlapped,
        LPDWORD lpNumberOfBytesTransferred,
        WINBOOL bWait);

    HRESULT (STDMETHODCALLTYPE *CancelIo)(
        IStreamAsync *This);

    END_INTERFACE
} IStreamAsyncVtbl;

interface IStreamAsync {
    CONST_VTBL IStreamAsyncVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IStreamAsync_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IStreamAsync_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IStreamAsync_Release(This) (This)->lpVtbl->Release(This)
/*** ISequentialStream methods ***/
#define IStreamAsync_Read(This,pv,cb,pcbRead) (This)->lpVtbl->Read(This,pv,cb,pcbRead)
#define IStreamAsync_Write(This,pv,cb,pcbWritten) (This)->lpVtbl->Write(This,pv,cb,pcbWritten)
/*** IStream methods ***/
#define IStreamAsync_Seek(This,dlibMove,dwOrigin,plibNewPosition) (This)->lpVtbl->Seek(This,dlibMove,dwOrigin,plibNewPosition)
#define IStreamAsync_SetSize(This,libNewSize) (This)->lpVtbl->SetSize(This,libNewSize)
#define IStreamAsync_CopyTo(This,pstm,cb,pcbRead,pcbWritten) (This)->lpVtbl->CopyTo(This,pstm,cb,pcbRead,pcbWritten)
#define IStreamAsync_Commit(This,grfCommitFlags) (This)->lpVtbl->Commit(This,grfCommitFlags)
#define IStreamAsync_Revert(This) (This)->lpVtbl->Revert(This)
#define IStreamAsync_LockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->LockRegion(This,libOffset,cb,dwLockType)
#define IStreamAsync_UnlockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->UnlockRegion(This,libOffset,cb,dwLockType)
#define IStreamAsync_Stat(This,pstatstg,grfStatFlag) (This)->lpVtbl->Stat(This,pstatstg,grfStatFlag)
#define IStreamAsync_Clone(This,ppstm) (This)->lpVtbl->Clone(This,ppstm)
/*** IStreamAsync methods ***/
#define IStreamAsync_ReadAsync(This,pv,cb,pcbRead,lpOverlapped) (This)->lpVtbl->ReadAsync(This,pv,cb,pcbRead,lpOverlapped)
#define IStreamAsync_WriteAsync(This,lpBuffer,cb,pcbWritten,lpOverlapped) (This)->lpVtbl->WriteAsync(This,lpBuffer,cb,pcbWritten,lpOverlapped)
#define IStreamAsync_OverlappedResult(This,lpOverlapped,lpNumberOfBytesTransferred,bWait) (This)->lpVtbl->OverlappedResult(This,lpOverlapped,lpNumberOfBytesTransferred,bWait)
#define IStreamAsync_CancelIo(This) (This)->lpVtbl->CancelIo(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IStreamAsync_QueryInterface(IStreamAsync* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IStreamAsync_AddRef(IStreamAsync* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IStreamAsync_Release(IStreamAsync* This) {
    return This->lpVtbl->Release(This);
}
/*** ISequentialStream methods ***/
static FORCEINLINE HRESULT IStreamAsync_Read(IStreamAsync* This,void *pv,ULONG cb,ULONG *pcbRead) {
    return This->lpVtbl->Read(This,pv,cb,pcbRead);
}
static FORCEINLINE HRESULT IStreamAsync_Write(IStreamAsync* This,const void *pv,ULONG cb,ULONG *pcbWritten) {
    return This->lpVtbl->Write(This,pv,cb,pcbWritten);
}
/*** IStream methods ***/
static FORCEINLINE HRESULT IStreamAsync_Seek(IStreamAsync* This,LARGE_INTEGER dlibMove,DWORD dwOrigin,ULARGE_INTEGER *plibNewPosition) {
    return This->lpVtbl->Seek(This,dlibMove,dwOrigin,plibNewPosition);
}
static FORCEINLINE HRESULT IStreamAsync_SetSize(IStreamAsync* This,ULARGE_INTEGER libNewSize) {
    return This->lpVtbl->SetSize(This,libNewSize);
}
static FORCEINLINE HRESULT IStreamAsync_CopyTo(IStreamAsync* This,IStream *pstm,ULARGE_INTEGER cb,ULARGE_INTEGER *pcbRead,ULARGE_INTEGER *pcbWritten) {
    return This->lpVtbl->CopyTo(This,pstm,cb,pcbRead,pcbWritten);
}
static FORCEINLINE HRESULT IStreamAsync_Commit(IStreamAsync* This,DWORD grfCommitFlags) {
    return This->lpVtbl->Commit(This,grfCommitFlags);
}
static FORCEINLINE HRESULT IStreamAsync_Revert(IStreamAsync* This) {
    return This->lpVtbl->Revert(This);
}
static FORCEINLINE HRESULT IStreamAsync_LockRegion(IStreamAsync* This,ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType) {
    return This->lpVtbl->LockRegion(This,libOffset,cb,dwLockType);
}
static FORCEINLINE HRESULT IStreamAsync_UnlockRegion(IStreamAsync* This,ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType) {
    return This->lpVtbl->UnlockRegion(This,libOffset,cb,dwLockType);
}
static FORCEINLINE HRESULT IStreamAsync_Stat(IStreamAsync* This,STATSTG *pstatstg,DWORD grfStatFlag) {
    return This->lpVtbl->Stat(This,pstatstg,grfStatFlag);
}
static FORCEINLINE HRESULT IStreamAsync_Clone(IStreamAsync* This,IStream **ppstm) {
    return This->lpVtbl->Clone(This,ppstm);
}
/*** IStreamAsync methods ***/
static FORCEINLINE HRESULT IStreamAsync_ReadAsync(IStreamAsync* This,void *pv,DWORD cb,LPDWORD pcbRead,LPOVERLAPPED lpOverlapped) {
    return This->lpVtbl->ReadAsync(This,pv,cb,pcbRead,lpOverlapped);
}
static FORCEINLINE HRESULT IStreamAsync_WriteAsync(IStreamAsync* This,const void *lpBuffer,DWORD cb,LPDWORD pcbWritten,LPOVERLAPPED lpOverlapped) {
    return This->lpVtbl->WriteAsync(This,lpBuffer,cb,pcbWritten,lpOverlapped);
}
static FORCEINLINE HRESULT IStreamAsync_OverlappedResult(IStreamAsync* This,LPOVERLAPPED lpOverlapped,LPDWORD lpNumberOfBytesTransferred,WINBOOL bWait) {
    return This->lpVtbl->OverlappedResult(This,lpOverlapped,lpNumberOfBytesTransferred,bWait);
}
static FORCEINLINE HRESULT IStreamAsync_CancelIo(IStreamAsync* This) {
    return This->lpVtbl->CancelIo(This);
}
#endif
#endif

#endif


#endif  /* __IStreamAsync_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IStreamUnbufferedInfo interface
 */
#ifndef __IStreamUnbufferedInfo_INTERFACE_DEFINED__
#define __IStreamUnbufferedInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IStreamUnbufferedInfo, 0x8a68fdda, 0x1fdc, 0x4c20, 0x8c,0xeb, 0x41,0x66,0x43,0xb5,0xa6,0x25);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8a68fdda-1fdc-4c20-8ceb-416643b5a625")
IStreamUnbufferedInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSectorSize(
        ULONG *pcbSectorSize) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IStreamUnbufferedInfo, 0x8a68fdda, 0x1fdc, 0x4c20, 0x8c,0xeb, 0x41,0x66,0x43,0xb5,0xa6,0x25)
#endif
#else
typedef struct IStreamUnbufferedInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IStreamUnbufferedInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IStreamUnbufferedInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IStreamUnbufferedInfo *This);

    /*** IStreamUnbufferedInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSectorSize)(
        IStreamUnbufferedInfo *This,
        ULONG *pcbSectorSize);

    END_INTERFACE
} IStreamUnbufferedInfoVtbl;

interface IStreamUnbufferedInfo {
    CONST_VTBL IStreamUnbufferedInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IStreamUnbufferedInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IStreamUnbufferedInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IStreamUnbufferedInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IStreamUnbufferedInfo methods ***/
#define IStreamUnbufferedInfo_GetSectorSize(This,pcbSectorSize) (This)->lpVtbl->GetSectorSize(This,pcbSectorSize)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IStreamUnbufferedInfo_QueryInterface(IStreamUnbufferedInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IStreamUnbufferedInfo_AddRef(IStreamUnbufferedInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IStreamUnbufferedInfo_Release(IStreamUnbufferedInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IStreamUnbufferedInfo methods ***/
static FORCEINLINE HRESULT IStreamUnbufferedInfo_GetSectorSize(IStreamUnbufferedInfo* This,ULONG *pcbSectorSize) {
    return This->lpVtbl->GetSectorSize(This,pcbSectorSize);
}
#endif
#endif

#endif


#endif  /* __IStreamUnbufferedInfo_INTERFACE_DEFINED__ */


#if _WIN32_IE >= _WIN32_IE_IE70
/*****************************************************************************
 * IFileOperationProgressSink interface
 */
#ifndef __IFileOperationProgressSink_INTERFACE_DEFINED__
#define __IFileOperationProgressSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFileOperationProgressSink, 0x04b0f1a7, 0x9490, 0x44bc, 0x96,0xe1, 0x42,0x96,0xa3,0x12,0x52,0xe2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("04b0f1a7-9490-44bc-96e1-4296a31252e2")
IFileOperationProgressSink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE StartOperations(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE FinishOperations(
        HRESULT hrResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE PreRenameItem(
        DWORD dwFlags,
        IShellItem *psiItem,
        LPCWSTR pszNewName) = 0;

    virtual HRESULT STDMETHODCALLTYPE PostRenameItem(
        DWORD dwFlags,
        IShellItem *psiItem,
        LPCWSTR pszNewName,
        HRESULT hrRename,
        IShellItem *psiNewlyCreated) = 0;

    virtual HRESULT STDMETHODCALLTYPE PreMoveItem(
        DWORD dwFlags,
        IShellItem *psiItem,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName) = 0;

    virtual HRESULT STDMETHODCALLTYPE PostMoveItem(
        DWORD dwFlags,
        IShellItem *psiItem,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName,
        HRESULT hrMove,
        IShellItem *psiNewlyCreated) = 0;

    virtual HRESULT STDMETHODCALLTYPE PreCopyItem(
        DWORD dwFlags,
        IShellItem *psiItem,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName) = 0;

    virtual HRESULT STDMETHODCALLTYPE PostCopyItem(
        DWORD dwFlags,
        IShellItem *psiItem,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName,
        HRESULT hrCopy,
        IShellItem *psiNewlyCreated) = 0;

    virtual HRESULT STDMETHODCALLTYPE PreDeleteItem(
        DWORD dwFlags,
        IShellItem *psiItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE PostDeleteItem(
        DWORD dwFlags,
        IShellItem *psiItem,
        HRESULT hrDelete,
        IShellItem *psiNewlyCreated) = 0;

    virtual HRESULT STDMETHODCALLTYPE PreNewItem(
        DWORD dwFlags,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName) = 0;

    virtual HRESULT STDMETHODCALLTYPE PostNewItem(
        DWORD dwFlags,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName,
        LPCWSTR pszTemplateName,
        DWORD dwFileAttributes,
        HRESULT hrNew,
        IShellItem *psiNewItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE UpdateProgress(
        UINT iWorkTotal,
        UINT iWorkSoFar) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResetTimer(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE PauseTimer(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResumeTimer(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileOperationProgressSink, 0x04b0f1a7, 0x9490, 0x44bc, 0x96,0xe1, 0x42,0x96,0xa3,0x12,0x52,0xe2)
#endif
#else
typedef struct IFileOperationProgressSinkVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFileOperationProgressSink *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFileOperationProgressSink *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFileOperationProgressSink *This);

    /*** IFileOperationProgressSink methods ***/
    HRESULT (STDMETHODCALLTYPE *StartOperations)(
        IFileOperationProgressSink *This);

    HRESULT (STDMETHODCALLTYPE *FinishOperations)(
        IFileOperationProgressSink *This,
        HRESULT hrResult);

    HRESULT (STDMETHODCALLTYPE *PreRenameItem)(
        IFileOperationProgressSink *This,
        DWORD dwFlags,
        IShellItem *psiItem,
        LPCWSTR pszNewName);

    HRESULT (STDMETHODCALLTYPE *PostRenameItem)(
        IFileOperationProgressSink *This,
        DWORD dwFlags,
        IShellItem *psiItem,
        LPCWSTR pszNewName,
        HRESULT hrRename,
        IShellItem *psiNewlyCreated);

    HRESULT (STDMETHODCALLTYPE *PreMoveItem)(
        IFileOperationProgressSink *This,
        DWORD dwFlags,
        IShellItem *psiItem,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName);

    HRESULT (STDMETHODCALLTYPE *PostMoveItem)(
        IFileOperationProgressSink *This,
        DWORD dwFlags,
        IShellItem *psiItem,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName,
        HRESULT hrMove,
        IShellItem *psiNewlyCreated);

    HRESULT (STDMETHODCALLTYPE *PreCopyItem)(
        IFileOperationProgressSink *This,
        DWORD dwFlags,
        IShellItem *psiItem,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName);

    HRESULT (STDMETHODCALLTYPE *PostCopyItem)(
        IFileOperationProgressSink *This,
        DWORD dwFlags,
        IShellItem *psiItem,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName,
        HRESULT hrCopy,
        IShellItem *psiNewlyCreated);

    HRESULT (STDMETHODCALLTYPE *PreDeleteItem)(
        IFileOperationProgressSink *This,
        DWORD dwFlags,
        IShellItem *psiItem);

    HRESULT (STDMETHODCALLTYPE *PostDeleteItem)(
        IFileOperationProgressSink *This,
        DWORD dwFlags,
        IShellItem *psiItem,
        HRESULT hrDelete,
        IShellItem *psiNewlyCreated);

    HRESULT (STDMETHODCALLTYPE *PreNewItem)(
        IFileOperationProgressSink *This,
        DWORD dwFlags,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName);

    HRESULT (STDMETHODCALLTYPE *PostNewItem)(
        IFileOperationProgressSink *This,
        DWORD dwFlags,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName,
        LPCWSTR pszTemplateName,
        DWORD dwFileAttributes,
        HRESULT hrNew,
        IShellItem *psiNewItem);

    HRESULT (STDMETHODCALLTYPE *UpdateProgress)(
        IFileOperationProgressSink *This,
        UINT iWorkTotal,
        UINT iWorkSoFar);

    HRESULT (STDMETHODCALLTYPE *ResetTimer)(
        IFileOperationProgressSink *This);

    HRESULT (STDMETHODCALLTYPE *PauseTimer)(
        IFileOperationProgressSink *This);

    HRESULT (STDMETHODCALLTYPE *ResumeTimer)(
        IFileOperationProgressSink *This);

    END_INTERFACE
} IFileOperationProgressSinkVtbl;

interface IFileOperationProgressSink {
    CONST_VTBL IFileOperationProgressSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileOperationProgressSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileOperationProgressSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileOperationProgressSink_Release(This) (This)->lpVtbl->Release(This)
/*** IFileOperationProgressSink methods ***/
#define IFileOperationProgressSink_StartOperations(This) (This)->lpVtbl->StartOperations(This)
#define IFileOperationProgressSink_FinishOperations(This,hrResult) (This)->lpVtbl->FinishOperations(This,hrResult)
#define IFileOperationProgressSink_PreRenameItem(This,dwFlags,psiItem,pszNewName) (This)->lpVtbl->PreRenameItem(This,dwFlags,psiItem,pszNewName)
#define IFileOperationProgressSink_PostRenameItem(This,dwFlags,psiItem,pszNewName,hrRename,psiNewlyCreated) (This)->lpVtbl->PostRenameItem(This,dwFlags,psiItem,pszNewName,hrRename,psiNewlyCreated)
#define IFileOperationProgressSink_PreMoveItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName) (This)->lpVtbl->PreMoveItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName)
#define IFileOperationProgressSink_PostMoveItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName,hrMove,psiNewlyCreated) (This)->lpVtbl->PostMoveItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName,hrMove,psiNewlyCreated)
#define IFileOperationProgressSink_PreCopyItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName) (This)->lpVtbl->PreCopyItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName)
#define IFileOperationProgressSink_PostCopyItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName,hrCopy,psiNewlyCreated) (This)->lpVtbl->PostCopyItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName,hrCopy,psiNewlyCreated)
#define IFileOperationProgressSink_PreDeleteItem(This,dwFlags,psiItem) (This)->lpVtbl->PreDeleteItem(This,dwFlags,psiItem)
#define IFileOperationProgressSink_PostDeleteItem(This,dwFlags,psiItem,hrDelete,psiNewlyCreated) (This)->lpVtbl->PostDeleteItem(This,dwFlags,psiItem,hrDelete,psiNewlyCreated)
#define IFileOperationProgressSink_PreNewItem(This,dwFlags,psiDestinationFolder,pszNewName) (This)->lpVtbl->PreNewItem(This,dwFlags,psiDestinationFolder,pszNewName)
#define IFileOperationProgressSink_PostNewItem(This,dwFlags,psiDestinationFolder,pszNewName,pszTemplateName,dwFileAttributes,hrNew,psiNewItem) (This)->lpVtbl->PostNewItem(This,dwFlags,psiDestinationFolder,pszNewName,pszTemplateName,dwFileAttributes,hrNew,psiNewItem)
#define IFileOperationProgressSink_UpdateProgress(This,iWorkTotal,iWorkSoFar) (This)->lpVtbl->UpdateProgress(This,iWorkTotal,iWorkSoFar)
#define IFileOperationProgressSink_ResetTimer(This) (This)->lpVtbl->ResetTimer(This)
#define IFileOperationProgressSink_PauseTimer(This) (This)->lpVtbl->PauseTimer(This)
#define IFileOperationProgressSink_ResumeTimer(This) (This)->lpVtbl->ResumeTimer(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFileOperationProgressSink_QueryInterface(IFileOperationProgressSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFileOperationProgressSink_AddRef(IFileOperationProgressSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFileOperationProgressSink_Release(IFileOperationProgressSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileOperationProgressSink methods ***/
static FORCEINLINE HRESULT IFileOperationProgressSink_StartOperations(IFileOperationProgressSink* This) {
    return This->lpVtbl->StartOperations(This);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_FinishOperations(IFileOperationProgressSink* This,HRESULT hrResult) {
    return This->lpVtbl->FinishOperations(This,hrResult);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_PreRenameItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem,LPCWSTR pszNewName) {
    return This->lpVtbl->PreRenameItem(This,dwFlags,psiItem,pszNewName);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_PostRenameItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem,LPCWSTR pszNewName,HRESULT hrRename,IShellItem *psiNewlyCreated) {
    return This->lpVtbl->PostRenameItem(This,dwFlags,psiItem,pszNewName,hrRename,psiNewlyCreated);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_PreMoveItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem,IShellItem *psiDestinationFolder,LPCWSTR pszNewName) {
    return This->lpVtbl->PreMoveItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_PostMoveItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem,IShellItem *psiDestinationFolder,LPCWSTR pszNewName,HRESULT hrMove,IShellItem *psiNewlyCreated) {
    return This->lpVtbl->PostMoveItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName,hrMove,psiNewlyCreated);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_PreCopyItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem,IShellItem *psiDestinationFolder,LPCWSTR pszNewName) {
    return This->lpVtbl->PreCopyItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_PostCopyItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem,IShellItem *psiDestinationFolder,LPCWSTR pszNewName,HRESULT hrCopy,IShellItem *psiNewlyCreated) {
    return This->lpVtbl->PostCopyItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName,hrCopy,psiNewlyCreated);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_PreDeleteItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem) {
    return This->lpVtbl->PreDeleteItem(This,dwFlags,psiItem);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_PostDeleteItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem,HRESULT hrDelete,IShellItem *psiNewlyCreated) {
    return This->lpVtbl->PostDeleteItem(This,dwFlags,psiItem,hrDelete,psiNewlyCreated);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_PreNewItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiDestinationFolder,LPCWSTR pszNewName) {
    return This->lpVtbl->PreNewItem(This,dwFlags,psiDestinationFolder,pszNewName);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_PostNewItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiDestinationFolder,LPCWSTR pszNewName,LPCWSTR pszTemplateName,DWORD dwFileAttributes,HRESULT hrNew,IShellItem *psiNewItem) {
    return This->lpVtbl->PostNewItem(This,dwFlags,psiDestinationFolder,pszNewName,pszTemplateName,dwFileAttributes,hrNew,psiNewItem);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_UpdateProgress(IFileOperationProgressSink* This,UINT iWorkTotal,UINT iWorkSoFar) {
    return This->lpVtbl->UpdateProgress(This,iWorkTotal,iWorkSoFar);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_ResetTimer(IFileOperationProgressSink* This) {
    return This->lpVtbl->ResetTimer(This);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_PauseTimer(IFileOperationProgressSink* This) {
    return This->lpVtbl->PauseTimer(This);
}
static FORCEINLINE HRESULT IFileOperationProgressSink_ResumeTimer(IFileOperationProgressSink* This) {
    return This->lpVtbl->ResumeTimer(This);
}
#endif
#endif

#endif


#endif  /* __IFileOperationProgressSink_INTERFACE_DEFINED__ */

#endif

/*****************************************************************************
 * IShellItemArray interface
 */
#ifndef __IShellItemArray_INTERFACE_DEFINED__
#define __IShellItemArray_INTERFACE_DEFINED__

typedef enum SIATTRIBFLAGS {
    SIATTRIBFLAGS_AND = 0x1,
    SIATTRIBFLAGS_OR = 0x2,
    SIATTRIBFLAGS_APPCOMPAT = 0x3,
    SIATTRIBFLAGS_MASK = 0x3,
    SIATTRIBFLAGS_ALLITEMS = 0x4000
} SIATTRIBFLAGS;

DEFINE_ENUM_FLAG_OPERATORS(SIATTRIBFLAGS)

DEFINE_GUID(IID_IShellItemArray, 0xb63ea76d, 0x1f85, 0x456f, 0xa1,0x9c, 0x48,0x15,0x9e,0xfa,0x85,0x8b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b63ea76d-1f85-456f-a19c-48159efa858b")
IShellItemArray : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE BindToHandler(
        IBindCtx *pbc,
        REFGUID bhid,
        REFIID riid,
        void **ppvOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyStore(
        GETPROPERTYSTOREFLAGS flags,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyDescriptionList(
        REFPROPERTYKEY keyType,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAttributes(
        SIATTRIBFLAGS AttribFlags,
        SFGAOF sfgaoMask,
        SFGAOF *psfgaoAttribs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCount(
        DWORD *pdwNumItems) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItemAt(
        DWORD dwIndex,
        IShellItem **ppsi) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumItems(
        IEnumShellItems **ppenumShellItems) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellItemArray, 0xb63ea76d, 0x1f85, 0x456f, 0xa1,0x9c, 0x48,0x15,0x9e,0xfa,0x85,0x8b)
#endif
#else
typedef struct IShellItemArrayVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellItemArray *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellItemArray *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellItemArray *This);

    /*** IShellItemArray methods ***/
    HRESULT (STDMETHODCALLTYPE *BindToHandler)(
        IShellItemArray *This,
        IBindCtx *pbc,
        REFGUID bhid,
        REFIID riid,
        void **ppvOut);

    HRESULT (STDMETHODCALLTYPE *GetPropertyStore)(
        IShellItemArray *This,
        GETPROPERTYSTOREFLAGS flags,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetPropertyDescriptionList)(
        IShellItemArray *This,
        REFPROPERTYKEY keyType,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetAttributes)(
        IShellItemArray *This,
        SIATTRIBFLAGS AttribFlags,
        SFGAOF sfgaoMask,
        SFGAOF *psfgaoAttribs);

    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IShellItemArray *This,
        DWORD *pdwNumItems);

    HRESULT (STDMETHODCALLTYPE *GetItemAt)(
        IShellItemArray *This,
        DWORD dwIndex,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *EnumItems)(
        IShellItemArray *This,
        IEnumShellItems **ppenumShellItems);

    END_INTERFACE
} IShellItemArrayVtbl;

interface IShellItemArray {
    CONST_VTBL IShellItemArrayVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellItemArray_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellItemArray_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellItemArray_Release(This) (This)->lpVtbl->Release(This)
/*** IShellItemArray methods ***/
#define IShellItemArray_BindToHandler(This,pbc,bhid,riid,ppvOut) (This)->lpVtbl->BindToHandler(This,pbc,bhid,riid,ppvOut)
#define IShellItemArray_GetPropertyStore(This,flags,riid,ppv) (This)->lpVtbl->GetPropertyStore(This,flags,riid,ppv)
#define IShellItemArray_GetPropertyDescriptionList(This,keyType,riid,ppv) (This)->lpVtbl->GetPropertyDescriptionList(This,keyType,riid,ppv)
#define IShellItemArray_GetAttributes(This,AttribFlags,sfgaoMask,psfgaoAttribs) (This)->lpVtbl->GetAttributes(This,AttribFlags,sfgaoMask,psfgaoAttribs)
#define IShellItemArray_GetCount(This,pdwNumItems) (This)->lpVtbl->GetCount(This,pdwNumItems)
#define IShellItemArray_GetItemAt(This,dwIndex,ppsi) (This)->lpVtbl->GetItemAt(This,dwIndex,ppsi)
#define IShellItemArray_EnumItems(This,ppenumShellItems) (This)->lpVtbl->EnumItems(This,ppenumShellItems)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellItemArray_QueryInterface(IShellItemArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellItemArray_AddRef(IShellItemArray* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellItemArray_Release(IShellItemArray* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellItemArray methods ***/
static FORCEINLINE HRESULT IShellItemArray_BindToHandler(IShellItemArray* This,IBindCtx *pbc,REFGUID bhid,REFIID riid,void **ppvOut) {
    return This->lpVtbl->BindToHandler(This,pbc,bhid,riid,ppvOut);
}
static FORCEINLINE HRESULT IShellItemArray_GetPropertyStore(IShellItemArray* This,GETPROPERTYSTOREFLAGS flags,REFIID riid,void **ppv) {
    return This->lpVtbl->GetPropertyStore(This,flags,riid,ppv);
}
static FORCEINLINE HRESULT IShellItemArray_GetPropertyDescriptionList(IShellItemArray* This,REFPROPERTYKEY keyType,REFIID riid,void **ppv) {
    return This->lpVtbl->GetPropertyDescriptionList(This,keyType,riid,ppv);
}
static FORCEINLINE HRESULT IShellItemArray_GetAttributes(IShellItemArray* This,SIATTRIBFLAGS AttribFlags,SFGAOF sfgaoMask,SFGAOF *psfgaoAttribs) {
    return This->lpVtbl->GetAttributes(This,AttribFlags,sfgaoMask,psfgaoAttribs);
}
static FORCEINLINE HRESULT IShellItemArray_GetCount(IShellItemArray* This,DWORD *pdwNumItems) {
    return This->lpVtbl->GetCount(This,pdwNumItems);
}
static FORCEINLINE HRESULT IShellItemArray_GetItemAt(IShellItemArray* This,DWORD dwIndex,IShellItem **ppsi) {
    return This->lpVtbl->GetItemAt(This,dwIndex,ppsi);
}
static FORCEINLINE HRESULT IShellItemArray_EnumItems(IShellItemArray* This,IEnumShellItems **ppenumShellItems) {
    return This->lpVtbl->EnumItems(This,ppenumShellItems);
}
#endif
#endif

#endif


#endif  /* __IShellItemArray_INTERFACE_DEFINED__ */


#if _WIN32_IE >= _WIN32_IE_IE70
  SHSTDAPI SHCreateShellItemArray(PCIDLIST_ABSOLUTE pidlParent, IShellFolder *psf, UINT cidl, PCUITEMID_CHILD_ARRAY ppidl, IShellItemArray **ppsiItemArray);
  SHSTDAPI SHCreateShellItemArrayFromDataObject(IDataObject *pdo, REFIID riid, void **ppv);
  SHSTDAPI SHCreateShellItemArrayFromIDLists(UINT cidl, PCIDLIST_ABSOLUTE_ARRAY rgpidl, IShellItemArray **ppsiItemArray);
  SHSTDAPI SHCreateShellItemArrayFromShellItem(IShellItem *psi, REFIID riid, void **ppv);
#endif

/*****************************************************************************
 * IInitializeWithItem interface
 */
#ifndef __IInitializeWithItem_INTERFACE_DEFINED__
#define __IInitializeWithItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInitializeWithItem, 0x7f73be3f, 0xfb79, 0x493c, 0xa6,0xc7, 0x7e,0xe1,0x4e,0x24,0x58,0x41);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7f73be3f-fb79-493c-a6c7-7ee14e245841")
IInitializeWithItem : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IShellItem *psi,
        DWORD grfMode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInitializeWithItem, 0x7f73be3f, 0xfb79, 0x493c, 0xa6,0xc7, 0x7e,0xe1,0x4e,0x24,0x58,0x41)
#endif
#else
typedef struct IInitializeWithItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInitializeWithItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInitializeWithItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInitializeWithItem *This);

    /*** IInitializeWithItem methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IInitializeWithItem *This,
        IShellItem *psi,
        DWORD grfMode);

    END_INTERFACE
} IInitializeWithItemVtbl;

interface IInitializeWithItem {
    CONST_VTBL IInitializeWithItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInitializeWithItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInitializeWithItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInitializeWithItem_Release(This) (This)->lpVtbl->Release(This)
/*** IInitializeWithItem methods ***/
#define IInitializeWithItem_Initialize(This,psi,grfMode) (This)->lpVtbl->Initialize(This,psi,grfMode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInitializeWithItem_QueryInterface(IInitializeWithItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInitializeWithItem_AddRef(IInitializeWithItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInitializeWithItem_Release(IInitializeWithItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IInitializeWithItem methods ***/
static FORCEINLINE HRESULT IInitializeWithItem_Initialize(IInitializeWithItem* This,IShellItem *psi,DWORD grfMode) {
    return This->lpVtbl->Initialize(This,psi,grfMode);
}
#endif
#endif

#endif


#endif  /* __IInitializeWithItem_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IObjectWithSelection interface
 */
#ifndef __IObjectWithSelection_INTERFACE_DEFINED__
#define __IObjectWithSelection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IObjectWithSelection, 0x1c9cd5bb, 0x98e9, 0x4491, 0xa6,0x0f, 0x31,0xaa,0xcc,0x72,0xb8,0x3c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1c9cd5bb-98e9-4491-a60f-31aacc72b83c")
IObjectWithSelection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetSelection(
        IShellItemArray *psia) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelection(
        REFIID riid,
        void **ppv) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IObjectWithSelection, 0x1c9cd5bb, 0x98e9, 0x4491, 0xa6,0x0f, 0x31,0xaa,0xcc,0x72,0xb8,0x3c)
#endif
#else
typedef struct IObjectWithSelectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IObjectWithSelection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IObjectWithSelection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IObjectWithSelection *This);

    /*** IObjectWithSelection methods ***/
    HRESULT (STDMETHODCALLTYPE *SetSelection)(
        IObjectWithSelection *This,
        IShellItemArray *psia);

    HRESULT (STDMETHODCALLTYPE *GetSelection)(
        IObjectWithSelection *This,
        REFIID riid,
        void **ppv);

    END_INTERFACE
} IObjectWithSelectionVtbl;

interface IObjectWithSelection {
    CONST_VTBL IObjectWithSelectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IObjectWithSelection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectWithSelection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectWithSelection_Release(This) (This)->lpVtbl->Release(This)
/*** IObjectWithSelection methods ***/
#define IObjectWithSelection_SetSelection(This,psia) (This)->lpVtbl->SetSelection(This,psia)
#define IObjectWithSelection_GetSelection(This,riid,ppv) (This)->lpVtbl->GetSelection(This,riid,ppv)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IObjectWithSelection_QueryInterface(IObjectWithSelection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IObjectWithSelection_AddRef(IObjectWithSelection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IObjectWithSelection_Release(IObjectWithSelection* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectWithSelection methods ***/
static FORCEINLINE HRESULT IObjectWithSelection_SetSelection(IObjectWithSelection* This,IShellItemArray *psia) {
    return This->lpVtbl->SetSelection(This,psia);
}
static FORCEINLINE HRESULT IObjectWithSelection_GetSelection(IObjectWithSelection* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetSelection(This,riid,ppv);
}
#endif
#endif

#endif


#endif  /* __IObjectWithSelection_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IObjectWithBackReferences interface
 */
#ifndef __IObjectWithBackReferences_INTERFACE_DEFINED__
#define __IObjectWithBackReferences_INTERFACE_DEFINED__

DEFINE_GUID(IID_IObjectWithBackReferences, 0x321a6a6a, 0xd61f, 0x4bf3, 0x97,0xae, 0x14,0xbe,0x29,0x86,0xbb,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("321a6a6a-d61f-4bf3-97ae-14be2986bb36")
IObjectWithBackReferences : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RemoveBackReferences(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IObjectWithBackReferences, 0x321a6a6a, 0xd61f, 0x4bf3, 0x97,0xae, 0x14,0xbe,0x29,0x86,0xbb,0x36)
#endif
#else
typedef struct IObjectWithBackReferencesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IObjectWithBackReferences *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IObjectWithBackReferences *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IObjectWithBackReferences *This);

    /*** IObjectWithBackReferences methods ***/
    HRESULT (STDMETHODCALLTYPE *RemoveBackReferences)(
        IObjectWithBackReferences *This);

    END_INTERFACE
} IObjectWithBackReferencesVtbl;

interface IObjectWithBackReferences {
    CONST_VTBL IObjectWithBackReferencesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IObjectWithBackReferences_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectWithBackReferences_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectWithBackReferences_Release(This) (This)->lpVtbl->Release(This)
/*** IObjectWithBackReferences methods ***/
#define IObjectWithBackReferences_RemoveBackReferences(This) (This)->lpVtbl->RemoveBackReferences(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IObjectWithBackReferences_QueryInterface(IObjectWithBackReferences* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IObjectWithBackReferences_AddRef(IObjectWithBackReferences* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IObjectWithBackReferences_Release(IObjectWithBackReferences* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectWithBackReferences methods ***/
static FORCEINLINE HRESULT IObjectWithBackReferences_RemoveBackReferences(IObjectWithBackReferences* This) {
    return This->lpVtbl->RemoveBackReferences(This);
}
#endif
#endif

#endif


#endif  /* __IObjectWithBackReferences_INTERFACE_DEFINED__ */


enum _PROPERTYUI_NAME_FLAGS {
    PUIFNF_DEFAULT = 0x0,
    PUIFNF_MNEMONIC = 0x1
};

typedef DWORD PROPERTYUI_NAME_FLAGS;

enum _PROPERTYUI_FLAGS {
    PUIF_DEFAULT = 0x0,
    PUIF_RIGHTALIGN = 0x1,
    PUIF_NOLABELININFOTIP = 0x2
};

typedef DWORD PROPERTYUI_FLAGS;

enum _PROPERTYUI_FORMAT_FLAGS {
    PUIFFDF_DEFAULT = 0x0,
    PUIFFDF_RIGHTTOLEFT = 0x1,
    PUIFFDF_SHORTFORMAT = 0x2,
    PUIFFDF_NOTIME = 0x4,
    PUIFFDF_FRIENDLYDATE = 0x8
};

typedef DWORD PROPERTYUI_FORMAT_FLAGS;

/*****************************************************************************
 * IPropertyUI interface
 */
#ifndef __IPropertyUI_INTERFACE_DEFINED__
#define __IPropertyUI_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPropertyUI, 0x757a7d9f, 0x919a, 0x4118, 0x99,0xd7, 0xdb,0xb2,0x08,0xc8,0xcc,0x66);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("757a7d9f-919a-4118-99d7-dbb208c8cc66")
IPropertyUI : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ParsePropertyName(
        LPCWSTR pszName,
        FMTID *pfmtid,
        PROPID *ppid,
        ULONG *pchEaten) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCannonicalName(
        REFFMTID fmtid,
        PROPID pid,
        LPWSTR pwszText,
        DWORD cchText) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDisplayName(
        REFFMTID fmtid,
        PROPID pid,
        PROPERTYUI_NAME_FLAGS flags,
        LPWSTR pwszText,
        DWORD cchText) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyDescription(
        REFFMTID fmtid,
        PROPID pid,
        LPWSTR pwszText,
        DWORD cchText) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultWidth(
        REFFMTID fmtid,
        PROPID pid,
        ULONG *pcxChars) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFlags(
        REFFMTID fmtid,
        PROPID pid,
        PROPERTYUI_FLAGS *pflags) = 0;

    virtual HRESULT STDMETHODCALLTYPE FormatForDisplay(
        REFFMTID fmtid,
        PROPID pid,
        const PROPVARIANT *ppropvar,
        PROPERTYUI_FORMAT_FLAGS puiff,
        LPWSTR pwszText,
        DWORD cchText) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHelpInfo(
        REFFMTID fmtid,
        PROPID pid,
        LPWSTR pwszHelpFile,
        DWORD cch,
        UINT *puHelpID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPropertyUI, 0x757a7d9f, 0x919a, 0x4118, 0x99,0xd7, 0xdb,0xb2,0x08,0xc8,0xcc,0x66)
#endif
#else
typedef struct IPropertyUIVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPropertyUI *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPropertyUI *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPropertyUI *This);

    /*** IPropertyUI methods ***/
    HRESULT (STDMETHODCALLTYPE *ParsePropertyName)(
        IPropertyUI *This,
        LPCWSTR pszName,
        FMTID *pfmtid,
        PROPID *ppid,
        ULONG *pchEaten);

    HRESULT (STDMETHODCALLTYPE *GetCannonicalName)(
        IPropertyUI *This,
        REFFMTID fmtid,
        PROPID pid,
        LPWSTR pwszText,
        DWORD cchText);

    HRESULT (STDMETHODCALLTYPE *GetDisplayName)(
        IPropertyUI *This,
        REFFMTID fmtid,
        PROPID pid,
        PROPERTYUI_NAME_FLAGS flags,
        LPWSTR pwszText,
        DWORD cchText);

    HRESULT (STDMETHODCALLTYPE *GetPropertyDescription)(
        IPropertyUI *This,
        REFFMTID fmtid,
        PROPID pid,
        LPWSTR pwszText,
        DWORD cchText);

    HRESULT (STDMETHODCALLTYPE *GetDefaultWidth)(
        IPropertyUI *This,
        REFFMTID fmtid,
        PROPID pid,
        ULONG *pcxChars);

    HRESULT (STDMETHODCALLTYPE *GetFlags)(
        IPropertyUI *This,
        REFFMTID fmtid,
        PROPID pid,
        PROPERTYUI_FLAGS *pflags);

    HRESULT (STDMETHODCALLTYPE *FormatForDisplay)(
        IPropertyUI *This,
        REFFMTID fmtid,
        PROPID pid,
        const PROPVARIANT *ppropvar,
        PROPERTYUI_FORMAT_FLAGS puiff,
        LPWSTR pwszText,
        DWORD cchText);

    HRESULT (STDMETHODCALLTYPE *GetHelpInfo)(
        IPropertyUI *This,
        REFFMTID fmtid,
        PROPID pid,
        LPWSTR pwszHelpFile,
        DWORD cch,
        UINT *puHelpID);

    END_INTERFACE
} IPropertyUIVtbl;

interface IPropertyUI {
    CONST_VTBL IPropertyUIVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPropertyUI_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPropertyUI_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPropertyUI_Release(This) (This)->lpVtbl->Release(This)
/*** IPropertyUI methods ***/
#define IPropertyUI_ParsePropertyName(This,pszName,pfmtid,ppid,pchEaten) (This)->lpVtbl->ParsePropertyName(This,pszName,pfmtid,ppid,pchEaten)
#define IPropertyUI_GetCannonicalName(This,fmtid,pid,pwszText,cchText) (This)->lpVtbl->GetCannonicalName(This,fmtid,pid,pwszText,cchText)
#define IPropertyUI_GetDisplayName(This,fmtid,pid,flags,pwszText,cchText) (This)->lpVtbl->GetDisplayName(This,fmtid,pid,flags,pwszText,cchText)
#define IPropertyUI_GetPropertyDescription(This,fmtid,pid,pwszText,cchText) (This)->lpVtbl->GetPropertyDescription(This,fmtid,pid,pwszText,cchText)
#define IPropertyUI_GetDefaultWidth(This,fmtid,pid,pcxChars) (This)->lpVtbl->GetDefaultWidth(This,fmtid,pid,pcxChars)
#define IPropertyUI_GetFlags(This,fmtid,pid,pflags) (This)->lpVtbl->GetFlags(This,fmtid,pid,pflags)
#define IPropertyUI_FormatForDisplay(This,fmtid,pid,ppropvar,puiff,pwszText,cchText) (This)->lpVtbl->FormatForDisplay(This,fmtid,pid,ppropvar,puiff,pwszText,cchText)
#define IPropertyUI_GetHelpInfo(This,fmtid,pid,pwszHelpFile,cch,puHelpID) (This)->lpVtbl->GetHelpInfo(This,fmtid,pid,pwszHelpFile,cch,puHelpID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPropertyUI_QueryInterface(IPropertyUI* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPropertyUI_AddRef(IPropertyUI* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPropertyUI_Release(IPropertyUI* This) {
    return This->lpVtbl->Release(This);
}
/*** IPropertyUI methods ***/
static FORCEINLINE HRESULT IPropertyUI_ParsePropertyName(IPropertyUI* This,LPCWSTR pszName,FMTID *pfmtid,PROPID *ppid,ULONG *pchEaten) {
    return This->lpVtbl->ParsePropertyName(This,pszName,pfmtid,ppid,pchEaten);
}
static FORCEINLINE HRESULT IPropertyUI_GetCannonicalName(IPropertyUI* This,REFFMTID fmtid,PROPID pid,LPWSTR pwszText,DWORD cchText) {
    return This->lpVtbl->GetCannonicalName(This,fmtid,pid,pwszText,cchText);
}
static FORCEINLINE HRESULT IPropertyUI_GetDisplayName(IPropertyUI* This,REFFMTID fmtid,PROPID pid,PROPERTYUI_NAME_FLAGS flags,LPWSTR pwszText,DWORD cchText) {
    return This->lpVtbl->GetDisplayName(This,fmtid,pid,flags,pwszText,cchText);
}
static FORCEINLINE HRESULT IPropertyUI_GetPropertyDescription(IPropertyUI* This,REFFMTID fmtid,PROPID pid,LPWSTR pwszText,DWORD cchText) {
    return This->lpVtbl->GetPropertyDescription(This,fmtid,pid,pwszText,cchText);
}
static FORCEINLINE HRESULT IPropertyUI_GetDefaultWidth(IPropertyUI* This,REFFMTID fmtid,PROPID pid,ULONG *pcxChars) {
    return This->lpVtbl->GetDefaultWidth(This,fmtid,pid,pcxChars);
}
static FORCEINLINE HRESULT IPropertyUI_GetFlags(IPropertyUI* This,REFFMTID fmtid,PROPID pid,PROPERTYUI_FLAGS *pflags) {
    return This->lpVtbl->GetFlags(This,fmtid,pid,pflags);
}
static FORCEINLINE HRESULT IPropertyUI_FormatForDisplay(IPropertyUI* This,REFFMTID fmtid,PROPID pid,const PROPVARIANT *ppropvar,PROPERTYUI_FORMAT_FLAGS puiff,LPWSTR pwszText,DWORD cchText) {
    return This->lpVtbl->FormatForDisplay(This,fmtid,pid,ppropvar,puiff,pwszText,cchText);
}
static FORCEINLINE HRESULT IPropertyUI_GetHelpInfo(IPropertyUI* This,REFFMTID fmtid,PROPID pid,LPWSTR pwszHelpFile,DWORD cch,UINT *puHelpID) {
    return This->lpVtbl->GetHelpInfo(This,fmtid,pid,pwszHelpFile,cch,puHelpID);
}
#endif
#endif

#endif


#endif  /* __IPropertyUI_INTERFACE_DEFINED__ */


#if _WIN32_IE >= _WIN32_IE_IE70
  SHSTDAPI SHRemovePersonalPropertyValues(IShellItemArray *psia);
  SHSTDAPI SHAddDefaultPropertiesByExt(PCWSTR pszExt, IPropertyStore *pPropStore);
  SHSTDAPI SHCreateDefaultPropertiesOp(IShellItem *psi, IFileOperation **ppFileOp);
  SHSTDAPI SHSetDefaultProperties(HWND hwnd, IShellItem *psi, DWORD dwFileOpFlags, IFileOperationProgressSink *pfops);
#endif

/*****************************************************************************
 * ICategoryProvider interface
 */
#ifndef __ICategoryProvider_INTERFACE_DEFINED__
#define __ICategoryProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICategoryProvider, 0x9af64809, 0x5864, 0x4c26, 0xa7,0x20, 0xc1,0xf7,0x8c,0x08,0x6e,0xe3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9af64809-5864-4c26-a720-c1f78c086ee3")
ICategoryProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CanCategorizeOnSCID(
        const SHCOLUMNID *pscid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultCategory(
        GUID *pguid,
        SHCOLUMNID *pscid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCategoryForSCID(
        const SHCOLUMNID *pscid,
        GUID *pguid) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumCategories(
        IEnumGUID **penum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCategoryName(
        const GUID *pguid,
        LPWSTR pszName,
        UINT cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCategory(
        const GUID *pguid,
        REFIID riid,
        void **ppv) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICategoryProvider, 0x9af64809, 0x5864, 0x4c26, 0xa7,0x20, 0xc1,0xf7,0x8c,0x08,0x6e,0xe3)
#endif
#else
typedef struct ICategoryProviderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICategoryProvider *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICategoryProvider *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICategoryProvider *This);

    /*** ICategoryProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *CanCategorizeOnSCID)(
        ICategoryProvider *This,
        const SHCOLUMNID *pscid);

    HRESULT (STDMETHODCALLTYPE *GetDefaultCategory)(
        ICategoryProvider *This,
        GUID *pguid,
        SHCOLUMNID *pscid);

    HRESULT (STDMETHODCALLTYPE *GetCategoryForSCID)(
        ICategoryProvider *This,
        const SHCOLUMNID *pscid,
        GUID *pguid);

    HRESULT (STDMETHODCALLTYPE *EnumCategories)(
        ICategoryProvider *This,
        IEnumGUID **penum);

    HRESULT (STDMETHODCALLTYPE *GetCategoryName)(
        ICategoryProvider *This,
        const GUID *pguid,
        LPWSTR pszName,
        UINT cch);

    HRESULT (STDMETHODCALLTYPE *CreateCategory)(
        ICategoryProvider *This,
        const GUID *pguid,
        REFIID riid,
        void **ppv);

    END_INTERFACE
} ICategoryProviderVtbl;

interface ICategoryProvider {
    CONST_VTBL ICategoryProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICategoryProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICategoryProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICategoryProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ICategoryProvider methods ***/
#define ICategoryProvider_CanCategorizeOnSCID(This,pscid) (This)->lpVtbl->CanCategorizeOnSCID(This,pscid)
#define ICategoryProvider_GetDefaultCategory(This,pguid,pscid) (This)->lpVtbl->GetDefaultCategory(This,pguid,pscid)
#define ICategoryProvider_GetCategoryForSCID(This,pscid,pguid) (This)->lpVtbl->GetCategoryForSCID(This,pscid,pguid)
#define ICategoryProvider_EnumCategories(This,penum) (This)->lpVtbl->EnumCategories(This,penum)
#define ICategoryProvider_GetCategoryName(This,pguid,pszName,cch) (This)->lpVtbl->GetCategoryName(This,pguid,pszName,cch)
#define ICategoryProvider_CreateCategory(This,pguid,riid,ppv) (This)->lpVtbl->CreateCategory(This,pguid,riid,ppv)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICategoryProvider_QueryInterface(ICategoryProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICategoryProvider_AddRef(ICategoryProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICategoryProvider_Release(ICategoryProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ICategoryProvider methods ***/
static FORCEINLINE HRESULT ICategoryProvider_CanCategorizeOnSCID(ICategoryProvider* This,const SHCOLUMNID *pscid) {
    return This->lpVtbl->CanCategorizeOnSCID(This,pscid);
}
static FORCEINLINE HRESULT ICategoryProvider_GetDefaultCategory(ICategoryProvider* This,GUID *pguid,SHCOLUMNID *pscid) {
    return This->lpVtbl->GetDefaultCategory(This,pguid,pscid);
}
static FORCEINLINE HRESULT ICategoryProvider_GetCategoryForSCID(ICategoryProvider* This,const SHCOLUMNID *pscid,GUID *pguid) {
    return This->lpVtbl->GetCategoryForSCID(This,pscid,pguid);
}
static FORCEINLINE HRESULT ICategoryProvider_EnumCategories(ICategoryProvider* This,IEnumGUID **penum) {
    return This->lpVtbl->EnumCategories(This,penum);
}
static FORCEINLINE HRESULT ICategoryProvider_GetCategoryName(ICategoryProvider* This,const GUID *pguid,LPWSTR pszName,UINT cch) {
    return This->lpVtbl->GetCategoryName(This,pguid,pszName,cch);
}
static FORCEINLINE HRESULT ICategoryProvider_CreateCategory(ICategoryProvider* This,const GUID *pguid,REFIID riid,void **ppv) {
    return This->lpVtbl->CreateCategory(This,pguid,riid,ppv);
}
#endif
#endif

#endif


#endif  /* __ICategoryProvider_INTERFACE_DEFINED__ */


typedef enum CATEGORYINFO_FLAGS {
    CATINFO_NORMAL = 0x0,
    CATINFO_COLLAPSED = 0x1,
    CATINFO_HIDDEN = 0x2,
    CATINFO_EXPANDED = 0x4,
    CATINFO_NOHEADER = 0x8,
    CATINFO_NOTCOLLAPSIBLE = 0x10,
    CATINFO_NOHEADERCOUNT = 0x20,
    CATINFO_SUBSETTED = 0x40
} CATEGORYINFO_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(CATEGORYINFO_FLAGS)

typedef enum CATSORT_FLAGS {
    CATSORT_DEFAULT = 0x0,
    CATSORT_NAME = 0x1
} CATSORT_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(CATSORT_FLAGS)

typedef struct CATEGORY_INFO {
    CATEGORYINFO_FLAGS cif;
    WCHAR wszName[260];
} CATEGORY_INFO;

/*****************************************************************************
 * ICategorizer interface
 */
#ifndef __ICategorizer_INTERFACE_DEFINED__
#define __ICategorizer_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICategorizer, 0xa3b14589, 0x9174, 0x49a8, 0x89,0xa3, 0x06,0xa1,0xae,0x2b,0x9b,0xa7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a3b14589-9174-49a8-89a3-06a1ae2b9ba7")
ICategorizer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDescription(
        LPWSTR pszDesc,
        UINT cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCategory(
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        DWORD *rgCategoryIds) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCategoryInfo(
        DWORD dwCategoryId,
        CATEGORY_INFO *pci) = 0;

    virtual HRESULT STDMETHODCALLTYPE CompareCategory(
        CATSORT_FLAGS csfFlags,
        DWORD dwCategoryId1,
        DWORD dwCategoryId2) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICategorizer, 0xa3b14589, 0x9174, 0x49a8, 0x89,0xa3, 0x06,0xa1,0xae,0x2b,0x9b,0xa7)
#endif
#else
typedef struct ICategorizerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICategorizer *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICategorizer *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICategorizer *This);

    /*** ICategorizer methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        ICategorizer *This,
        LPWSTR pszDesc,
        UINT cch);

    HRESULT (STDMETHODCALLTYPE *GetCategory)(
        ICategorizer *This,
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        DWORD *rgCategoryIds);

    HRESULT (STDMETHODCALLTYPE *GetCategoryInfo)(
        ICategorizer *This,
        DWORD dwCategoryId,
        CATEGORY_INFO *pci);

    HRESULT (STDMETHODCALLTYPE *CompareCategory)(
        ICategorizer *This,
        CATSORT_FLAGS csfFlags,
        DWORD dwCategoryId1,
        DWORD dwCategoryId2);

    END_INTERFACE
} ICategorizerVtbl;

interface ICategorizer {
    CONST_VTBL ICategorizerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICategorizer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICategorizer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICategorizer_Release(This) (This)->lpVtbl->Release(This)
/*** ICategorizer methods ***/
#define ICategorizer_GetDescription(This,pszDesc,cch) (This)->lpVtbl->GetDescription(This,pszDesc,cch)
#define ICategorizer_GetCategory(This,cidl,apidl,rgCategoryIds) (This)->lpVtbl->GetCategory(This,cidl,apidl,rgCategoryIds)
#define ICategorizer_GetCategoryInfo(This,dwCategoryId,pci) (This)->lpVtbl->GetCategoryInfo(This,dwCategoryId,pci)
#define ICategorizer_CompareCategory(This,csfFlags,dwCategoryId1,dwCategoryId2) (This)->lpVtbl->CompareCategory(This,csfFlags,dwCategoryId1,dwCategoryId2)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICategorizer_QueryInterface(ICategorizer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICategorizer_AddRef(ICategorizer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICategorizer_Release(ICategorizer* This) {
    return This->lpVtbl->Release(This);
}
/*** ICategorizer methods ***/
static FORCEINLINE HRESULT ICategorizer_GetDescription(ICategorizer* This,LPWSTR pszDesc,UINT cch) {
    return This->lpVtbl->GetDescription(This,pszDesc,cch);
}
static FORCEINLINE HRESULT ICategorizer_GetCategory(ICategorizer* This,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,DWORD *rgCategoryIds) {
    return This->lpVtbl->GetCategory(This,cidl,apidl,rgCategoryIds);
}
static FORCEINLINE HRESULT ICategorizer_GetCategoryInfo(ICategorizer* This,DWORD dwCategoryId,CATEGORY_INFO *pci) {
    return This->lpVtbl->GetCategoryInfo(This,dwCategoryId,pci);
}
static FORCEINLINE HRESULT ICategorizer_CompareCategory(ICategorizer* This,CATSORT_FLAGS csfFlags,DWORD dwCategoryId1,DWORD dwCategoryId2) {
    return This->lpVtbl->CompareCategory(This,csfFlags,dwCategoryId1,dwCategoryId2);
}
#endif
#endif

#endif


#endif  /* __ICategorizer_INTERFACE_DEFINED__ */


#include <pshpack8.h>
typedef struct SHDRAGIMAGE {
    SIZE sizeDragImage;
    POINT ptOffset;
    HBITMAP hbmpDragImage;
    COLORREF crColorKey;
} SHDRAGIMAGE;
typedef struct SHDRAGIMAGE *LPSHDRAGIMAGE;
#include <poppack.h>

#define DI_GETDRAGIMAGE     TEXT("ShellGetDragImage")

/*****************************************************************************
 * IDropTargetHelper interface
 */
#ifndef __IDropTargetHelper_INTERFACE_DEFINED__
#define __IDropTargetHelper_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDropTargetHelper, 0x4657278b, 0x411b, 0x11d2, 0x83,0x9a, 0x00,0xc0,0x4f,0xd9,0x18,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4657278b-411b-11d2-839a-00c04fd918d0")
IDropTargetHelper : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE DragEnter(
        HWND hwndTarget,
        IDataObject *pDataObject,
        POINT *ppt,
        DWORD dwEffect) = 0;

    virtual HRESULT STDMETHODCALLTYPE DragLeave(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE DragOver(
        POINT *ppt,
        DWORD dwEffect) = 0;

    virtual HRESULT STDMETHODCALLTYPE Drop(
        IDataObject *pDataObject,
        POINT *ppt,
        DWORD dwEffect) = 0;

    virtual HRESULT STDMETHODCALLTYPE Show(
        WINBOOL fShow) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDropTargetHelper, 0x4657278b, 0x411b, 0x11d2, 0x83,0x9a, 0x00,0xc0,0x4f,0xd9,0x18,0xd0)
#endif
#else
typedef struct IDropTargetHelperVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDropTargetHelper *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDropTargetHelper *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDropTargetHelper *This);

    /*** IDropTargetHelper methods ***/
    HRESULT (STDMETHODCALLTYPE *DragEnter)(
        IDropTargetHelper *This,
        HWND hwndTarget,
        IDataObject *pDataObject,
        POINT *ppt,
        DWORD dwEffect);

    HRESULT (STDMETHODCALLTYPE *DragLeave)(
        IDropTargetHelper *This);

    HRESULT (STDMETHODCALLTYPE *DragOver)(
        IDropTargetHelper *This,
        POINT *ppt,
        DWORD dwEffect);

    HRESULT (STDMETHODCALLTYPE *Drop)(
        IDropTargetHelper *This,
        IDataObject *pDataObject,
        POINT *ppt,
        DWORD dwEffect);

    HRESULT (STDMETHODCALLTYPE *Show)(
        IDropTargetHelper *This,
        WINBOOL fShow);

    END_INTERFACE
} IDropTargetHelperVtbl;

interface IDropTargetHelper {
    CONST_VTBL IDropTargetHelperVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDropTargetHelper_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDropTargetHelper_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDropTargetHelper_Release(This) (This)->lpVtbl->Release(This)
/*** IDropTargetHelper methods ***/
#define IDropTargetHelper_DragEnter(This,hwndTarget,pDataObject,ppt,dwEffect) (This)->lpVtbl->DragEnter(This,hwndTarget,pDataObject,ppt,dwEffect)
#define IDropTargetHelper_DragLeave(This) (This)->lpVtbl->DragLeave(This)
#define IDropTargetHelper_DragOver(This,ppt,dwEffect) (This)->lpVtbl->DragOver(This,ppt,dwEffect)
#define IDropTargetHelper_Drop(This,pDataObject,ppt,dwEffect) (This)->lpVtbl->Drop(This,pDataObject,ppt,dwEffect)
#define IDropTargetHelper_Show(This,fShow) (This)->lpVtbl->Show(This,fShow)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDropTargetHelper_QueryInterface(IDropTargetHelper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDropTargetHelper_AddRef(IDropTargetHelper* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDropTargetHelper_Release(IDropTargetHelper* This) {
    return This->lpVtbl->Release(This);
}
/*** IDropTargetHelper methods ***/
static FORCEINLINE HRESULT IDropTargetHelper_DragEnter(IDropTargetHelper* This,HWND hwndTarget,IDataObject *pDataObject,POINT *ppt,DWORD dwEffect) {
    return This->lpVtbl->DragEnter(This,hwndTarget,pDataObject,ppt,dwEffect);
}
static FORCEINLINE HRESULT IDropTargetHelper_DragLeave(IDropTargetHelper* This) {
    return This->lpVtbl->DragLeave(This);
}
static FORCEINLINE HRESULT IDropTargetHelper_DragOver(IDropTargetHelper* This,POINT *ppt,DWORD dwEffect) {
    return This->lpVtbl->DragOver(This,ppt,dwEffect);
}
static FORCEINLINE HRESULT IDropTargetHelper_Drop(IDropTargetHelper* This,IDataObject *pDataObject,POINT *ppt,DWORD dwEffect) {
    return This->lpVtbl->Drop(This,pDataObject,ppt,dwEffect);
}
static FORCEINLINE HRESULT IDropTargetHelper_Show(IDropTargetHelper* This,WINBOOL fShow) {
    return This->lpVtbl->Show(This,fShow);
}
#endif
#endif

#endif


#endif  /* __IDropTargetHelper_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDragSourceHelper interface
 */
#ifndef __IDragSourceHelper_INTERFACE_DEFINED__
#define __IDragSourceHelper_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDragSourceHelper, 0xde5bf786, 0x477a, 0x11d2, 0x83,0x9d, 0x00,0xc0,0x4f,0xd9,0x18,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("de5bf786-477a-11d2-839d-00c04fd918d0")
IDragSourceHelper : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InitializeFromBitmap(
        LPSHDRAGIMAGE pshdi,
        IDataObject *pDataObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeFromWindow(
        HWND hwnd,
        POINT *ppt,
        IDataObject *pDataObject) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDragSourceHelper, 0xde5bf786, 0x477a, 0x11d2, 0x83,0x9d, 0x00,0xc0,0x4f,0xd9,0x18,0xd0)
#endif
#else
typedef struct IDragSourceHelperVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDragSourceHelper *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDragSourceHelper *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDragSourceHelper *This);

    /*** IDragSourceHelper methods ***/
    HRESULT (STDMETHODCALLTYPE *InitializeFromBitmap)(
        IDragSourceHelper *This,
        LPSHDRAGIMAGE pshdi,
        IDataObject *pDataObject);

    HRESULT (STDMETHODCALLTYPE *InitializeFromWindow)(
        IDragSourceHelper *This,
        HWND hwnd,
        POINT *ppt,
        IDataObject *pDataObject);

    END_INTERFACE
} IDragSourceHelperVtbl;

interface IDragSourceHelper {
    CONST_VTBL IDragSourceHelperVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDragSourceHelper_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDragSourceHelper_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDragSourceHelper_Release(This) (This)->lpVtbl->Release(This)
/*** IDragSourceHelper methods ***/
#define IDragSourceHelper_InitializeFromBitmap(This,pshdi,pDataObject) (This)->lpVtbl->InitializeFromBitmap(This,pshdi,pDataObject)
#define IDragSourceHelper_InitializeFromWindow(This,hwnd,ppt,pDataObject) (This)->lpVtbl->InitializeFromWindow(This,hwnd,ppt,pDataObject)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDragSourceHelper_QueryInterface(IDragSourceHelper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDragSourceHelper_AddRef(IDragSourceHelper* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDragSourceHelper_Release(IDragSourceHelper* This) {
    return This->lpVtbl->Release(This);
}
/*** IDragSourceHelper methods ***/
static FORCEINLINE HRESULT IDragSourceHelper_InitializeFromBitmap(IDragSourceHelper* This,LPSHDRAGIMAGE pshdi,IDataObject *pDataObject) {
    return This->lpVtbl->InitializeFromBitmap(This,pshdi,pDataObject);
}
static FORCEINLINE HRESULT IDragSourceHelper_InitializeFromWindow(IDragSourceHelper* This,HWND hwnd,POINT *ppt,IDataObject *pDataObject) {
    return This->lpVtbl->InitializeFromWindow(This,hwnd,ppt,pDataObject);
}
#endif
#endif

#endif


#endif  /* __IDragSourceHelper_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_VISTA
typedef enum DSH_FLAGS {
    DSH_ALLOWDROPDESCRIPTIONTEXT = 0x1
} DSH_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(DSH_FLAGS)

/*****************************************************************************
 * IDragSourceHelper2 interface
 */
#ifndef __IDragSourceHelper2_INTERFACE_DEFINED__
#define __IDragSourceHelper2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDragSourceHelper2, 0x83e07d0d, 0x0c5f, 0x4163, 0xbf,0x1a, 0x60,0xb2,0x74,0x05,0x1e,0x40);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("83e07d0d-0c5f-4163-bf1a-60b274051e40")
IDragSourceHelper2 : public IDragSourceHelper
{
    virtual HRESULT STDMETHODCALLTYPE SetFlags(
        DWORD dwFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDragSourceHelper2, 0x83e07d0d, 0x0c5f, 0x4163, 0xbf,0x1a, 0x60,0xb2,0x74,0x05,0x1e,0x40)
#endif
#else
typedef struct IDragSourceHelper2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDragSourceHelper2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDragSourceHelper2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDragSourceHelper2 *This);

    /*** IDragSourceHelper methods ***/
    HRESULT (STDMETHODCALLTYPE *InitializeFromBitmap)(
        IDragSourceHelper2 *This,
        LPSHDRAGIMAGE pshdi,
        IDataObject *pDataObject);

    HRESULT (STDMETHODCALLTYPE *InitializeFromWindow)(
        IDragSourceHelper2 *This,
        HWND hwnd,
        POINT *ppt,
        IDataObject *pDataObject);

    /*** IDragSourceHelper2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFlags)(
        IDragSourceHelper2 *This,
        DWORD dwFlags);

    END_INTERFACE
} IDragSourceHelper2Vtbl;

interface IDragSourceHelper2 {
    CONST_VTBL IDragSourceHelper2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDragSourceHelper2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDragSourceHelper2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDragSourceHelper2_Release(This) (This)->lpVtbl->Release(This)
/*** IDragSourceHelper methods ***/
#define IDragSourceHelper2_InitializeFromBitmap(This,pshdi,pDataObject) (This)->lpVtbl->InitializeFromBitmap(This,pshdi,pDataObject)
#define IDragSourceHelper2_InitializeFromWindow(This,hwnd,ppt,pDataObject) (This)->lpVtbl->InitializeFromWindow(This,hwnd,ppt,pDataObject)
/*** IDragSourceHelper2 methods ***/
#define IDragSourceHelper2_SetFlags(This,dwFlags) (This)->lpVtbl->SetFlags(This,dwFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDragSourceHelper2_QueryInterface(IDragSourceHelper2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDragSourceHelper2_AddRef(IDragSourceHelper2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDragSourceHelper2_Release(IDragSourceHelper2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDragSourceHelper methods ***/
static FORCEINLINE HRESULT IDragSourceHelper2_InitializeFromBitmap(IDragSourceHelper2* This,LPSHDRAGIMAGE pshdi,IDataObject *pDataObject) {
    return This->lpVtbl->InitializeFromBitmap(This,pshdi,pDataObject);
}
static FORCEINLINE HRESULT IDragSourceHelper2_InitializeFromWindow(IDragSourceHelper2* This,HWND hwnd,POINT *ppt,IDataObject *pDataObject) {
    return This->lpVtbl->InitializeFromWindow(This,hwnd,ppt,pDataObject);
}
/*** IDragSourceHelper2 methods ***/
static FORCEINLINE HRESULT IDragSourceHelper2_SetFlags(IDragSourceHelper2* This,DWORD dwFlags) {
    return This->lpVtbl->SetFlags(This,dwFlags);
}
#endif
#endif

#endif


#endif  /* __IDragSourceHelper2_INTERFACE_DEFINED__ */

#endif

#define IShellLink __MINGW_NAME_AW(IShellLink)

typedef enum SLR_FLAGS {
    SLR_NO_UI = 0x1,
    SLR_ANY_MATCH = 0x2,
    SLR_UPDATE = 0x4,
    SLR_NOUPDATE = 0x8,
    SLR_NOSEARCH = 0x10,
    SLR_NOTRACK = 0x20,
    SLR_NOLINKINFO = 0x40,
    SLR_INVOKE_MSI = 0x80,
    SLR_NO_UI_WITH_MSG_PUMP = 0x101,
    SLR_OFFER_DELETE_WITHOUT_FILE = 0x200,
    SLR_KNOWNFOLDER = 0x400,
    SLR_MACHINE_IN_LOCAL_TARGET = 0x800,
    SLR_UPDATE_MACHINE_AND_SID = 0x1000
} SLR_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(SLR_FLAGS)

typedef enum SLGP_FLAGS {
    SLGP_SHORTPATH = 0x1,
    SLGP_UNCPRIORITY = 0x2,
    SLGP_RAWPATH = 0x4,
    SLGP_RELATIVEPRIORITY = 0x8
} SLGP_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(SLGP_FLAGS)

/*****************************************************************************
 * IShellLinkA interface
 */
#ifndef __IShellLinkA_INTERFACE_DEFINED__
#define __IShellLinkA_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellLinkA, 0x000214ee, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214ee-0000-0000-c000-000000000046")
IShellLinkA : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPath(
        LPSTR pszFile,
        int cch,
        WIN32_FIND_DATAA *pfd,
        DWORD fFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIDList(
        PIDLIST_ABSOLUTE *ppidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIDList(
        PCIDLIST_ABSOLUTE pidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDescription(
        LPSTR pszName,
        int cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDescription(
        LPCSTR pszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWorkingDirectory(
        LPSTR pszDir,
        int cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetWorkingDirectory(
        LPCSTR pszDir) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetArguments(
        LPSTR pszArgs,
        int cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetArguments(
        LPCSTR pszArgs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHotkey(
        WORD *pwHotkey) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHotkey(
        WORD wHotkey) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetShowCmd(
        int *piShowCmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetShowCmd(
        int iShowCmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIconLocation(
        LPSTR pszIconPath,
        int cch,
        int *piIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIconLocation(
        LPCSTR pszIconPath,
        int iIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRelativePath(
        LPCSTR pszPathRel,
        DWORD dwReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resolve(
        HWND hwnd,
        DWORD fFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPath(
        LPCSTR pszFile) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellLinkA, 0x000214ee, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IShellLinkAVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellLinkA *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellLinkA *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellLinkA *This);

    /*** IShellLinkA methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPath)(
        IShellLinkA *This,
        LPSTR pszFile,
        int cch,
        WIN32_FIND_DATAA *pfd,
        DWORD fFlags);

    HRESULT (STDMETHODCALLTYPE *GetIDList)(
        IShellLinkA *This,
        PIDLIST_ABSOLUTE *ppidl);

    HRESULT (STDMETHODCALLTYPE *SetIDList)(
        IShellLinkA *This,
        PCIDLIST_ABSOLUTE pidl);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IShellLinkA *This,
        LPSTR pszName,
        int cch);

    HRESULT (STDMETHODCALLTYPE *SetDescription)(
        IShellLinkA *This,
        LPCSTR pszName);

    HRESULT (STDMETHODCALLTYPE *GetWorkingDirectory)(
        IShellLinkA *This,
        LPSTR pszDir,
        int cch);

    HRESULT (STDMETHODCALLTYPE *SetWorkingDirectory)(
        IShellLinkA *This,
        LPCSTR pszDir);

    HRESULT (STDMETHODCALLTYPE *GetArguments)(
        IShellLinkA *This,
        LPSTR pszArgs,
        int cch);

    HRESULT (STDMETHODCALLTYPE *SetArguments)(
        IShellLinkA *This,
        LPCSTR pszArgs);

    HRESULT (STDMETHODCALLTYPE *GetHotkey)(
        IShellLinkA *This,
        WORD *pwHotkey);

    HRESULT (STDMETHODCALLTYPE *SetHotkey)(
        IShellLinkA *This,
        WORD wHotkey);

    HRESULT (STDMETHODCALLTYPE *GetShowCmd)(
        IShellLinkA *This,
        int *piShowCmd);

    HRESULT (STDMETHODCALLTYPE *SetShowCmd)(
        IShellLinkA *This,
        int iShowCmd);

    HRESULT (STDMETHODCALLTYPE *GetIconLocation)(
        IShellLinkA *This,
        LPSTR pszIconPath,
        int cch,
        int *piIcon);

    HRESULT (STDMETHODCALLTYPE *SetIconLocation)(
        IShellLinkA *This,
        LPCSTR pszIconPath,
        int iIcon);

    HRESULT (STDMETHODCALLTYPE *SetRelativePath)(
        IShellLinkA *This,
        LPCSTR pszPathRel,
        DWORD dwReserved);

    HRESULT (STDMETHODCALLTYPE *Resolve)(
        IShellLinkA *This,
        HWND hwnd,
        DWORD fFlags);

    HRESULT (STDMETHODCALLTYPE *SetPath)(
        IShellLinkA *This,
        LPCSTR pszFile);

    END_INTERFACE
} IShellLinkAVtbl;

interface IShellLinkA {
    CONST_VTBL IShellLinkAVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellLinkA_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellLinkA_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellLinkA_Release(This) (This)->lpVtbl->Release(This)
/*** IShellLinkA methods ***/
#define IShellLinkA_GetPath(This,pszFile,cch,pfd,fFlags) (This)->lpVtbl->GetPath(This,pszFile,cch,pfd,fFlags)
#define IShellLinkA_GetIDList(This,ppidl) (This)->lpVtbl->GetIDList(This,ppidl)
#define IShellLinkA_SetIDList(This,pidl) (This)->lpVtbl->SetIDList(This,pidl)
#define IShellLinkA_GetDescription(This,pszName,cch) (This)->lpVtbl->GetDescription(This,pszName,cch)
#define IShellLinkA_SetDescription(This,pszName) (This)->lpVtbl->SetDescription(This,pszName)
#define IShellLinkA_GetWorkingDirectory(This,pszDir,cch) (This)->lpVtbl->GetWorkingDirectory(This,pszDir,cch)
#define IShellLinkA_SetWorkingDirectory(This,pszDir) (This)->lpVtbl->SetWorkingDirectory(This,pszDir)
#define IShellLinkA_GetArguments(This,pszArgs,cch) (This)->lpVtbl->GetArguments(This,pszArgs,cch)
#define IShellLinkA_SetArguments(This,pszArgs) (This)->lpVtbl->SetArguments(This,pszArgs)
#define IShellLinkA_GetHotkey(This,pwHotkey) (This)->lpVtbl->GetHotkey(This,pwHotkey)
#define IShellLinkA_SetHotkey(This,wHotkey) (This)->lpVtbl->SetHotkey(This,wHotkey)
#define IShellLinkA_GetShowCmd(This,piShowCmd) (This)->lpVtbl->GetShowCmd(This,piShowCmd)
#define IShellLinkA_SetShowCmd(This,iShowCmd) (This)->lpVtbl->SetShowCmd(This,iShowCmd)
#define IShellLinkA_GetIconLocation(This,pszIconPath,cch,piIcon) (This)->lpVtbl->GetIconLocation(This,pszIconPath,cch,piIcon)
#define IShellLinkA_SetIconLocation(This,pszIconPath,iIcon) (This)->lpVtbl->SetIconLocation(This,pszIconPath,iIcon)
#define IShellLinkA_SetRelativePath(This,pszPathRel,dwReserved) (This)->lpVtbl->SetRelativePath(This,pszPathRel,dwReserved)
#define IShellLinkA_Resolve(This,hwnd,fFlags) (This)->lpVtbl->Resolve(This,hwnd,fFlags)
#define IShellLinkA_SetPath(This,pszFile) (This)->lpVtbl->SetPath(This,pszFile)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellLinkA_QueryInterface(IShellLinkA* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellLinkA_AddRef(IShellLinkA* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellLinkA_Release(IShellLinkA* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellLinkA methods ***/
static FORCEINLINE HRESULT IShellLinkA_GetPath(IShellLinkA* This,LPSTR pszFile,int cch,WIN32_FIND_DATAA *pfd,DWORD fFlags) {
    return This->lpVtbl->GetPath(This,pszFile,cch,pfd,fFlags);
}
static FORCEINLINE HRESULT IShellLinkA_GetIDList(IShellLinkA* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetIDList(This,ppidl);
}
static FORCEINLINE HRESULT IShellLinkA_SetIDList(IShellLinkA* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->SetIDList(This,pidl);
}
static FORCEINLINE HRESULT IShellLinkA_GetDescription(IShellLinkA* This,LPSTR pszName,int cch) {
    return This->lpVtbl->GetDescription(This,pszName,cch);
}
static FORCEINLINE HRESULT IShellLinkA_SetDescription(IShellLinkA* This,LPCSTR pszName) {
    return This->lpVtbl->SetDescription(This,pszName);
}
static FORCEINLINE HRESULT IShellLinkA_GetWorkingDirectory(IShellLinkA* This,LPSTR pszDir,int cch) {
    return This->lpVtbl->GetWorkingDirectory(This,pszDir,cch);
}
static FORCEINLINE HRESULT IShellLinkA_SetWorkingDirectory(IShellLinkA* This,LPCSTR pszDir) {
    return This->lpVtbl->SetWorkingDirectory(This,pszDir);
}
static FORCEINLINE HRESULT IShellLinkA_GetArguments(IShellLinkA* This,LPSTR pszArgs,int cch) {
    return This->lpVtbl->GetArguments(This,pszArgs,cch);
}
static FORCEINLINE HRESULT IShellLinkA_SetArguments(IShellLinkA* This,LPCSTR pszArgs) {
    return This->lpVtbl->SetArguments(This,pszArgs);
}
static FORCEINLINE HRESULT IShellLinkA_GetHotkey(IShellLinkA* This,WORD *pwHotkey) {
    return This->lpVtbl->GetHotkey(This,pwHotkey);
}
static FORCEINLINE HRESULT IShellLinkA_SetHotkey(IShellLinkA* This,WORD wHotkey) {
    return This->lpVtbl->SetHotkey(This,wHotkey);
}
static FORCEINLINE HRESULT IShellLinkA_GetShowCmd(IShellLinkA* This,int *piShowCmd) {
    return This->lpVtbl->GetShowCmd(This,piShowCmd);
}
static FORCEINLINE HRESULT IShellLinkA_SetShowCmd(IShellLinkA* This,int iShowCmd) {
    return This->lpVtbl->SetShowCmd(This,iShowCmd);
}
static FORCEINLINE HRESULT IShellLinkA_GetIconLocation(IShellLinkA* This,LPSTR pszIconPath,int cch,int *piIcon) {
    return This->lpVtbl->GetIconLocation(This,pszIconPath,cch,piIcon);
}
static FORCEINLINE HRESULT IShellLinkA_SetIconLocation(IShellLinkA* This,LPCSTR pszIconPath,int iIcon) {
    return This->lpVtbl->SetIconLocation(This,pszIconPath,iIcon);
}
static FORCEINLINE HRESULT IShellLinkA_SetRelativePath(IShellLinkA* This,LPCSTR pszPathRel,DWORD dwReserved) {
    return This->lpVtbl->SetRelativePath(This,pszPathRel,dwReserved);
}
static FORCEINLINE HRESULT IShellLinkA_Resolve(IShellLinkA* This,HWND hwnd,DWORD fFlags) {
    return This->lpVtbl->Resolve(This,hwnd,fFlags);
}
static FORCEINLINE HRESULT IShellLinkA_SetPath(IShellLinkA* This,LPCSTR pszFile) {
    return This->lpVtbl->SetPath(This,pszFile);
}
#endif
#endif

#endif


#endif  /* __IShellLinkA_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IShellLinkW interface
 */
#ifndef __IShellLinkW_INTERFACE_DEFINED__
#define __IShellLinkW_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellLinkW, 0x000214f9, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214f9-0000-0000-c000-000000000046")
IShellLinkW : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPath(
        LPWSTR pszFile,
        int cch,
        WIN32_FIND_DATAW *pfd,
        DWORD fFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIDList(
        PIDLIST_ABSOLUTE *ppidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIDList(
        PCIDLIST_ABSOLUTE pidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDescription(
        LPWSTR pszName,
        int cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDescription(
        LPCWSTR pszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWorkingDirectory(
        LPWSTR pszDir,
        int cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetWorkingDirectory(
        LPCWSTR pszDir) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetArguments(
        LPWSTR pszArgs,
        int cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetArguments(
        LPCWSTR pszArgs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHotkey(
        WORD *pwHotkey) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHotkey(
        WORD wHotkey) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetShowCmd(
        int *piShowCmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetShowCmd(
        int iShowCmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIconLocation(
        LPWSTR pszIconPath,
        int cch,
        int *piIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIconLocation(
        LPCWSTR pszIconPath,
        int iIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRelativePath(
        LPCWSTR pszPathRel,
        DWORD dwReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resolve(
        HWND hwnd,
        DWORD fFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPath(
        LPCWSTR pszFile) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellLinkW, 0x000214f9, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IShellLinkWVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellLinkW *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellLinkW *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellLinkW *This);

    /*** IShellLinkW methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPath)(
        IShellLinkW *This,
        LPWSTR pszFile,
        int cch,
        WIN32_FIND_DATAW *pfd,
        DWORD fFlags);

    HRESULT (STDMETHODCALLTYPE *GetIDList)(
        IShellLinkW *This,
        PIDLIST_ABSOLUTE *ppidl);

    HRESULT (STDMETHODCALLTYPE *SetIDList)(
        IShellLinkW *This,
        PCIDLIST_ABSOLUTE pidl);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IShellLinkW *This,
        LPWSTR pszName,
        int cch);

    HRESULT (STDMETHODCALLTYPE *SetDescription)(
        IShellLinkW *This,
        LPCWSTR pszName);

    HRESULT (STDMETHODCALLTYPE *GetWorkingDirectory)(
        IShellLinkW *This,
        LPWSTR pszDir,
        int cch);

    HRESULT (STDMETHODCALLTYPE *SetWorkingDirectory)(
        IShellLinkW *This,
        LPCWSTR pszDir);

    HRESULT (STDMETHODCALLTYPE *GetArguments)(
        IShellLinkW *This,
        LPWSTR pszArgs,
        int cch);

    HRESULT (STDMETHODCALLTYPE *SetArguments)(
        IShellLinkW *This,
        LPCWSTR pszArgs);

    HRESULT (STDMETHODCALLTYPE *GetHotkey)(
        IShellLinkW *This,
        WORD *pwHotkey);

    HRESULT (STDMETHODCALLTYPE *SetHotkey)(
        IShellLinkW *This,
        WORD wHotkey);

    HRESULT (STDMETHODCALLTYPE *GetShowCmd)(
        IShellLinkW *This,
        int *piShowCmd);

    HRESULT (STDMETHODCALLTYPE *SetShowCmd)(
        IShellLinkW *This,
        int iShowCmd);

    HRESULT (STDMETHODCALLTYPE *GetIconLocation)(
        IShellLinkW *This,
        LPWSTR pszIconPath,
        int cch,
        int *piIcon);

    HRESULT (STDMETHODCALLTYPE *SetIconLocation)(
        IShellLinkW *This,
        LPCWSTR pszIconPath,
        int iIcon);

    HRESULT (STDMETHODCALLTYPE *SetRelativePath)(
        IShellLinkW *This,
        LPCWSTR pszPathRel,
        DWORD dwReserved);

    HRESULT (STDMETHODCALLTYPE *Resolve)(
        IShellLinkW *This,
        HWND hwnd,
        DWORD fFlags);

    HRESULT (STDMETHODCALLTYPE *SetPath)(
        IShellLinkW *This,
        LPCWSTR pszFile);

    END_INTERFACE
} IShellLinkWVtbl;

interface IShellLinkW {
    CONST_VTBL IShellLinkWVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellLinkW_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellLinkW_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellLinkW_Release(This) (This)->lpVtbl->Release(This)
/*** IShellLinkW methods ***/
#define IShellLinkW_GetPath(This,pszFile,cch,pfd,fFlags) (This)->lpVtbl->GetPath(This,pszFile,cch,pfd,fFlags)
#define IShellLinkW_GetIDList(This,ppidl) (This)->lpVtbl->GetIDList(This,ppidl)
#define IShellLinkW_SetIDList(This,pidl) (This)->lpVtbl->SetIDList(This,pidl)
#define IShellLinkW_GetDescription(This,pszName,cch) (This)->lpVtbl->GetDescription(This,pszName,cch)
#define IShellLinkW_SetDescription(This,pszName) (This)->lpVtbl->SetDescription(This,pszName)
#define IShellLinkW_GetWorkingDirectory(This,pszDir,cch) (This)->lpVtbl->GetWorkingDirectory(This,pszDir,cch)
#define IShellLinkW_SetWorkingDirectory(This,pszDir) (This)->lpVtbl->SetWorkingDirectory(This,pszDir)
#define IShellLinkW_GetArguments(This,pszArgs,cch) (This)->lpVtbl->GetArguments(This,pszArgs,cch)
#define IShellLinkW_SetArguments(This,pszArgs) (This)->lpVtbl->SetArguments(This,pszArgs)
#define IShellLinkW_GetHotkey(This,pwHotkey) (This)->lpVtbl->GetHotkey(This,pwHotkey)
#define IShellLinkW_SetHotkey(This,wHotkey) (This)->lpVtbl->SetHotkey(This,wHotkey)
#define IShellLinkW_GetShowCmd(This,piShowCmd) (This)->lpVtbl->GetShowCmd(This,piShowCmd)
#define IShellLinkW_SetShowCmd(This,iShowCmd) (This)->lpVtbl->SetShowCmd(This,iShowCmd)
#define IShellLinkW_GetIconLocation(This,pszIconPath,cch,piIcon) (This)->lpVtbl->GetIconLocation(This,pszIconPath,cch,piIcon)
#define IShellLinkW_SetIconLocation(This,pszIconPath,iIcon) (This)->lpVtbl->SetIconLocation(This,pszIconPath,iIcon)
#define IShellLinkW_SetRelativePath(This,pszPathRel,dwReserved) (This)->lpVtbl->SetRelativePath(This,pszPathRel,dwReserved)
#define IShellLinkW_Resolve(This,hwnd,fFlags) (This)->lpVtbl->Resolve(This,hwnd,fFlags)
#define IShellLinkW_SetPath(This,pszFile) (This)->lpVtbl->SetPath(This,pszFile)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellLinkW_QueryInterface(IShellLinkW* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellLinkW_AddRef(IShellLinkW* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellLinkW_Release(IShellLinkW* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellLinkW methods ***/
static FORCEINLINE HRESULT IShellLinkW_GetPath(IShellLinkW* This,LPWSTR pszFile,int cch,WIN32_FIND_DATAW *pfd,DWORD fFlags) {
    return This->lpVtbl->GetPath(This,pszFile,cch,pfd,fFlags);
}
static FORCEINLINE HRESULT IShellLinkW_GetIDList(IShellLinkW* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetIDList(This,ppidl);
}
static FORCEINLINE HRESULT IShellLinkW_SetIDList(IShellLinkW* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->SetIDList(This,pidl);
}
static FORCEINLINE HRESULT IShellLinkW_GetDescription(IShellLinkW* This,LPWSTR pszName,int cch) {
    return This->lpVtbl->GetDescription(This,pszName,cch);
}
static FORCEINLINE HRESULT IShellLinkW_SetDescription(IShellLinkW* This,LPCWSTR pszName) {
    return This->lpVtbl->SetDescription(This,pszName);
}
static FORCEINLINE HRESULT IShellLinkW_GetWorkingDirectory(IShellLinkW* This,LPWSTR pszDir,int cch) {
    return This->lpVtbl->GetWorkingDirectory(This,pszDir,cch);
}
static FORCEINLINE HRESULT IShellLinkW_SetWorkingDirectory(IShellLinkW* This,LPCWSTR pszDir) {
    return This->lpVtbl->SetWorkingDirectory(This,pszDir);
}
static FORCEINLINE HRESULT IShellLinkW_GetArguments(IShellLinkW* This,LPWSTR pszArgs,int cch) {
    return This->lpVtbl->GetArguments(This,pszArgs,cch);
}
static FORCEINLINE HRESULT IShellLinkW_SetArguments(IShellLinkW* This,LPCWSTR pszArgs) {
    return This->lpVtbl->SetArguments(This,pszArgs);
}
static FORCEINLINE HRESULT IShellLinkW_GetHotkey(IShellLinkW* This,WORD *pwHotkey) {
    return This->lpVtbl->GetHotkey(This,pwHotkey);
}
static FORCEINLINE HRESULT IShellLinkW_SetHotkey(IShellLinkW* This,WORD wHotkey) {
    return This->lpVtbl->SetHotkey(This,wHotkey);
}
static FORCEINLINE HRESULT IShellLinkW_GetShowCmd(IShellLinkW* This,int *piShowCmd) {
    return This->lpVtbl->GetShowCmd(This,piShowCmd);
}
static FORCEINLINE HRESULT IShellLinkW_SetShowCmd(IShellLinkW* This,int iShowCmd) {
    return This->lpVtbl->SetShowCmd(This,iShowCmd);
}
static FORCEINLINE HRESULT IShellLinkW_GetIconLocation(IShellLinkW* This,LPWSTR pszIconPath,int cch,int *piIcon) {
    return This->lpVtbl->GetIconLocation(This,pszIconPath,cch,piIcon);
}
static FORCEINLINE HRESULT IShellLinkW_SetIconLocation(IShellLinkW* This,LPCWSTR pszIconPath,int iIcon) {
    return This->lpVtbl->SetIconLocation(This,pszIconPath,iIcon);
}
static FORCEINLINE HRESULT IShellLinkW_SetRelativePath(IShellLinkW* This,LPCWSTR pszPathRel,DWORD dwReserved) {
    return This->lpVtbl->SetRelativePath(This,pszPathRel,dwReserved);
}
static FORCEINLINE HRESULT IShellLinkW_Resolve(IShellLinkW* This,HWND hwnd,DWORD fFlags) {
    return This->lpVtbl->Resolve(This,hwnd,fFlags);
}
static FORCEINLINE HRESULT IShellLinkW_SetPath(IShellLinkW* This,LPCWSTR pszFile) {
    return This->lpVtbl->SetPath(This,pszFile);
}
#endif
#endif

#endif


#endif  /* __IShellLinkW_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IShellLinkDataList interface
 */
#ifndef __IShellLinkDataList_INTERFACE_DEFINED__
#define __IShellLinkDataList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellLinkDataList, 0x45e2b4ae, 0xb1c3, 0x11d0, 0xb9,0x2f, 0x00,0xa0,0xc9,0x03,0x12,0xe1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("45e2b4ae-b1c3-11d0-b92f-00a0c90312e1")
IShellLinkDataList : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddDataBlock(
        void *pDataBlock) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyDataBlock(
        DWORD dwSig,
        void **ppDataBlock) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveDataBlock(
        DWORD dwSig) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFlags(
        DWORD *pdwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFlags(
        DWORD dwFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellLinkDataList, 0x45e2b4ae, 0xb1c3, 0x11d0, 0xb9,0x2f, 0x00,0xa0,0xc9,0x03,0x12,0xe1)
#endif
#else
typedef struct IShellLinkDataListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellLinkDataList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellLinkDataList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellLinkDataList *This);

    /*** IShellLinkDataList methods ***/
    HRESULT (STDMETHODCALLTYPE *AddDataBlock)(
        IShellLinkDataList *This,
        void *pDataBlock);

    HRESULT (STDMETHODCALLTYPE *CopyDataBlock)(
        IShellLinkDataList *This,
        DWORD dwSig,
        void **ppDataBlock);

    HRESULT (STDMETHODCALLTYPE *RemoveDataBlock)(
        IShellLinkDataList *This,
        DWORD dwSig);

    HRESULT (STDMETHODCALLTYPE *GetFlags)(
        IShellLinkDataList *This,
        DWORD *pdwFlags);

    HRESULT (STDMETHODCALLTYPE *SetFlags)(
        IShellLinkDataList *This,
        DWORD dwFlags);

    END_INTERFACE
} IShellLinkDataListVtbl;

interface IShellLinkDataList {
    CONST_VTBL IShellLinkDataListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellLinkDataList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellLinkDataList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellLinkDataList_Release(This) (This)->lpVtbl->Release(This)
/*** IShellLinkDataList methods ***/
#define IShellLinkDataList_AddDataBlock(This,pDataBlock) (This)->lpVtbl->AddDataBlock(This,pDataBlock)
#define IShellLinkDataList_CopyDataBlock(This,dwSig,ppDataBlock) (This)->lpVtbl->CopyDataBlock(This,dwSig,ppDataBlock)
#define IShellLinkDataList_RemoveDataBlock(This,dwSig) (This)->lpVtbl->RemoveDataBlock(This,dwSig)
#define IShellLinkDataList_GetFlags(This,pdwFlags) (This)->lpVtbl->GetFlags(This,pdwFlags)
#define IShellLinkDataList_SetFlags(This,dwFlags) (This)->lpVtbl->SetFlags(This,dwFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellLinkDataList_QueryInterface(IShellLinkDataList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellLinkDataList_AddRef(IShellLinkDataList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellLinkDataList_Release(IShellLinkDataList* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellLinkDataList methods ***/
static FORCEINLINE HRESULT IShellLinkDataList_AddDataBlock(IShellLinkDataList* This,void *pDataBlock) {
    return This->lpVtbl->AddDataBlock(This,pDataBlock);
}
static FORCEINLINE HRESULT IShellLinkDataList_CopyDataBlock(IShellLinkDataList* This,DWORD dwSig,void **ppDataBlock) {
    return This->lpVtbl->CopyDataBlock(This,dwSig,ppDataBlock);
}
static FORCEINLINE HRESULT IShellLinkDataList_RemoveDataBlock(IShellLinkDataList* This,DWORD dwSig) {
    return This->lpVtbl->RemoveDataBlock(This,dwSig);
}
static FORCEINLINE HRESULT IShellLinkDataList_GetFlags(IShellLinkDataList* This,DWORD *pdwFlags) {
    return This->lpVtbl->GetFlags(This,pdwFlags);
}
static FORCEINLINE HRESULT IShellLinkDataList_SetFlags(IShellLinkDataList* This,DWORD dwFlags) {
    return This->lpVtbl->SetFlags(This,dwFlags);
}
#endif
#endif

#endif


#endif  /* __IShellLinkDataList_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IResolveShellLink interface
 */
#ifndef __IResolveShellLink_INTERFACE_DEFINED__
#define __IResolveShellLink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IResolveShellLink, 0x5cd52983, 0x9449, 0x11d2, 0x96,0x3a, 0x00,0xc0,0x4f,0x79,0xad,0xf0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5cd52983-9449-11d2-963a-00c04f79adf0")
IResolveShellLink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ResolveShellLink(
        IUnknown *punkLink,
        HWND hwnd,
        DWORD fFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IResolveShellLink, 0x5cd52983, 0x9449, 0x11d2, 0x96,0x3a, 0x00,0xc0,0x4f,0x79,0xad,0xf0)
#endif
#else
typedef struct IResolveShellLinkVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IResolveShellLink *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IResolveShellLink *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IResolveShellLink *This);

    /*** IResolveShellLink methods ***/
    HRESULT (STDMETHODCALLTYPE *ResolveShellLink)(
        IResolveShellLink *This,
        IUnknown *punkLink,
        HWND hwnd,
        DWORD fFlags);

    END_INTERFACE
} IResolveShellLinkVtbl;

interface IResolveShellLink {
    CONST_VTBL IResolveShellLinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IResolveShellLink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IResolveShellLink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IResolveShellLink_Release(This) (This)->lpVtbl->Release(This)
/*** IResolveShellLink methods ***/
#define IResolveShellLink_ResolveShellLink(This,punkLink,hwnd,fFlags) (This)->lpVtbl->ResolveShellLink(This,punkLink,hwnd,fFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IResolveShellLink_QueryInterface(IResolveShellLink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IResolveShellLink_AddRef(IResolveShellLink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IResolveShellLink_Release(IResolveShellLink* This) {
    return This->lpVtbl->Release(This);
}
/*** IResolveShellLink methods ***/
static FORCEINLINE HRESULT IResolveShellLink_ResolveShellLink(IResolveShellLink* This,IUnknown *punkLink,HWND hwnd,DWORD fFlags) {
    return This->lpVtbl->ResolveShellLink(This,punkLink,hwnd,fFlags);
}
#endif
#endif

#endif


#endif  /* __IResolveShellLink_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IActionProgressDialog interface
 */
#ifndef __IActionProgressDialog_INTERFACE_DEFINED__
#define __IActionProgressDialog_INTERFACE_DEFINED__

enum _SPINITF {
    SPINITF_NORMAL = 0x0,
    SPINITF_MODAL = 0x1,
    SPINITF_NOMINIMIZE = 0x8
};

typedef DWORD SPINITF;

DEFINE_GUID(IID_IActionProgressDialog, 0x49ff1172, 0xeadc, 0x446d, 0x92,0x85, 0x15,0x64,0x53,0xa6,0x43,0x1c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("49ff1172-eadc-446d-9285-156453a6431c")
IActionProgressDialog : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        SPINITF flags,
        LPCWSTR pszTitle,
        LPCWSTR pszCancel) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActionProgressDialog, 0x49ff1172, 0xeadc, 0x446d, 0x92,0x85, 0x15,0x64,0x53,0xa6,0x43,0x1c)
#endif
#else
typedef struct IActionProgressDialogVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IActionProgressDialog *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IActionProgressDialog *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IActionProgressDialog *This);

    /*** IActionProgressDialog methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IActionProgressDialog *This,
        SPINITF flags,
        LPCWSTR pszTitle,
        LPCWSTR pszCancel);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IActionProgressDialog *This);

    END_INTERFACE
} IActionProgressDialogVtbl;

interface IActionProgressDialog {
    CONST_VTBL IActionProgressDialogVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActionProgressDialog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActionProgressDialog_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActionProgressDialog_Release(This) (This)->lpVtbl->Release(This)
/*** IActionProgressDialog methods ***/
#define IActionProgressDialog_Initialize(This,flags,pszTitle,pszCancel) (This)->lpVtbl->Initialize(This,flags,pszTitle,pszCancel)
#define IActionProgressDialog_Stop(This) (This)->lpVtbl->Stop(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActionProgressDialog_QueryInterface(IActionProgressDialog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActionProgressDialog_AddRef(IActionProgressDialog* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActionProgressDialog_Release(IActionProgressDialog* This) {
    return This->lpVtbl->Release(This);
}
/*** IActionProgressDialog methods ***/
static FORCEINLINE HRESULT IActionProgressDialog_Initialize(IActionProgressDialog* This,SPINITF flags,LPCWSTR pszTitle,LPCWSTR pszCancel) {
    return This->lpVtbl->Initialize(This,flags,pszTitle,pszCancel);
}
static FORCEINLINE HRESULT IActionProgressDialog_Stop(IActionProgressDialog* This) {
    return This->lpVtbl->Stop(This);
}
#endif
#endif

#endif


#endif  /* __IActionProgressDialog_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IHWEventHandler interface
 */
#ifndef __IHWEventHandler_INTERFACE_DEFINED__
#define __IHWEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHWEventHandler, 0xc1fb73d0, 0xec3a, 0x4ba2, 0xb5,0x12, 0x8c,0xdb,0x91,0x87,0xb6,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c1fb73d0-ec3a-4ba2-b512-8cdb9187b6d1")
IHWEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        LPCWSTR pszParams) = 0;

    virtual HRESULT STDMETHODCALLTYPE HandleEvent(
        LPCWSTR pszDeviceID,
        LPCWSTR pszAltDeviceID,
        LPCWSTR pszEventType) = 0;

    virtual HRESULT STDMETHODCALLTYPE HandleEventWithContent(
        LPCWSTR pszDeviceID,
        LPCWSTR pszAltDeviceID,
        LPCWSTR pszEventType,
        LPCWSTR pszContentTypeHandler,
        IDataObject *pdataobject) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHWEventHandler, 0xc1fb73d0, 0xec3a, 0x4ba2, 0xb5,0x12, 0x8c,0xdb,0x91,0x87,0xb6,0xd1)
#endif
#else
typedef struct IHWEventHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHWEventHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHWEventHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHWEventHandler *This);

    /*** IHWEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IHWEventHandler *This,
        LPCWSTR pszParams);

    HRESULT (STDMETHODCALLTYPE *HandleEvent)(
        IHWEventHandler *This,
        LPCWSTR pszDeviceID,
        LPCWSTR pszAltDeviceID,
        LPCWSTR pszEventType);

    HRESULT (STDMETHODCALLTYPE *HandleEventWithContent)(
        IHWEventHandler *This,
        LPCWSTR pszDeviceID,
        LPCWSTR pszAltDeviceID,
        LPCWSTR pszEventType,
        LPCWSTR pszContentTypeHandler,
        IDataObject *pdataobject);

    END_INTERFACE
} IHWEventHandlerVtbl;

interface IHWEventHandler {
    CONST_VTBL IHWEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHWEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHWEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHWEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IHWEventHandler methods ***/
#define IHWEventHandler_Initialize(This,pszParams) (This)->lpVtbl->Initialize(This,pszParams)
#define IHWEventHandler_HandleEvent(This,pszDeviceID,pszAltDeviceID,pszEventType) (This)->lpVtbl->HandleEvent(This,pszDeviceID,pszAltDeviceID,pszEventType)
#define IHWEventHandler_HandleEventWithContent(This,pszDeviceID,pszAltDeviceID,pszEventType,pszContentTypeHandler,pdataobject) (This)->lpVtbl->HandleEventWithContent(This,pszDeviceID,pszAltDeviceID,pszEventType,pszContentTypeHandler,pdataobject)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHWEventHandler_QueryInterface(IHWEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHWEventHandler_AddRef(IHWEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHWEventHandler_Release(IHWEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IHWEventHandler methods ***/
static FORCEINLINE HRESULT IHWEventHandler_Initialize(IHWEventHandler* This,LPCWSTR pszParams) {
    return This->lpVtbl->Initialize(This,pszParams);
}
static FORCEINLINE HRESULT IHWEventHandler_HandleEvent(IHWEventHandler* This,LPCWSTR pszDeviceID,LPCWSTR pszAltDeviceID,LPCWSTR pszEventType) {
    return This->lpVtbl->HandleEvent(This,pszDeviceID,pszAltDeviceID,pszEventType);
}
static FORCEINLINE HRESULT IHWEventHandler_HandleEventWithContent(IHWEventHandler* This,LPCWSTR pszDeviceID,LPCWSTR pszAltDeviceID,LPCWSTR pszEventType,LPCWSTR pszContentTypeHandler,IDataObject *pdataobject) {
    return This->lpVtbl->HandleEventWithContent(This,pszDeviceID,pszAltDeviceID,pszEventType,pszContentTypeHandler,pdataobject);
}
#endif
#endif

#endif


#endif  /* __IHWEventHandler_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IHWEventHandler2 interface
 */
#ifndef __IHWEventHandler2_INTERFACE_DEFINED__
#define __IHWEventHandler2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHWEventHandler2, 0xcfcc809f, 0x295d, 0x42e8, 0x9f,0xfc, 0x42,0x4b,0x33,0xc4,0x87,0xe6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cfcc809f-295d-42e8-9ffc-424b33c487e6")
IHWEventHandler2 : public IHWEventHandler
{
    virtual HRESULT STDMETHODCALLTYPE HandleEventWithHWND(
        LPCWSTR pszDeviceID,
        LPCWSTR pszAltDeviceID,
        LPCWSTR pszEventType,
        HWND hwndOwner) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHWEventHandler2, 0xcfcc809f, 0x295d, 0x42e8, 0x9f,0xfc, 0x42,0x4b,0x33,0xc4,0x87,0xe6)
#endif
#else
typedef struct IHWEventHandler2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHWEventHandler2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHWEventHandler2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHWEventHandler2 *This);

    /*** IHWEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IHWEventHandler2 *This,
        LPCWSTR pszParams);

    HRESULT (STDMETHODCALLTYPE *HandleEvent)(
        IHWEventHandler2 *This,
        LPCWSTR pszDeviceID,
        LPCWSTR pszAltDeviceID,
        LPCWSTR pszEventType);

    HRESULT (STDMETHODCALLTYPE *HandleEventWithContent)(
        IHWEventHandler2 *This,
        LPCWSTR pszDeviceID,
        LPCWSTR pszAltDeviceID,
        LPCWSTR pszEventType,
        LPCWSTR pszContentTypeHandler,
        IDataObject *pdataobject);

    /*** IHWEventHandler2 methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleEventWithHWND)(
        IHWEventHandler2 *This,
        LPCWSTR pszDeviceID,
        LPCWSTR pszAltDeviceID,
        LPCWSTR pszEventType,
        HWND hwndOwner);

    END_INTERFACE
} IHWEventHandler2Vtbl;

interface IHWEventHandler2 {
    CONST_VTBL IHWEventHandler2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHWEventHandler2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHWEventHandler2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHWEventHandler2_Release(This) (This)->lpVtbl->Release(This)
/*** IHWEventHandler methods ***/
#define IHWEventHandler2_Initialize(This,pszParams) (This)->lpVtbl->Initialize(This,pszParams)
#define IHWEventHandler2_HandleEvent(This,pszDeviceID,pszAltDeviceID,pszEventType) (This)->lpVtbl->HandleEvent(This,pszDeviceID,pszAltDeviceID,pszEventType)
#define IHWEventHandler2_HandleEventWithContent(This,pszDeviceID,pszAltDeviceID,pszEventType,pszContentTypeHandler,pdataobject) (This)->lpVtbl->HandleEventWithContent(This,pszDeviceID,pszAltDeviceID,pszEventType,pszContentTypeHandler,pdataobject)
/*** IHWEventHandler2 methods ***/
#define IHWEventHandler2_HandleEventWithHWND(This,pszDeviceID,pszAltDeviceID,pszEventType,hwndOwner) (This)->lpVtbl->HandleEventWithHWND(This,pszDeviceID,pszAltDeviceID,pszEventType,hwndOwner)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHWEventHandler2_QueryInterface(IHWEventHandler2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHWEventHandler2_AddRef(IHWEventHandler2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHWEventHandler2_Release(IHWEventHandler2* This) {
    return This->lpVtbl->Release(This);
}
/*** IHWEventHandler methods ***/
static FORCEINLINE HRESULT IHWEventHandler2_Initialize(IHWEventHandler2* This,LPCWSTR pszParams) {
    return This->lpVtbl->Initialize(This,pszParams);
}
static FORCEINLINE HRESULT IHWEventHandler2_HandleEvent(IHWEventHandler2* This,LPCWSTR pszDeviceID,LPCWSTR pszAltDeviceID,LPCWSTR pszEventType) {
    return This->lpVtbl->HandleEvent(This,pszDeviceID,pszAltDeviceID,pszEventType);
}
static FORCEINLINE HRESULT IHWEventHandler2_HandleEventWithContent(IHWEventHandler2* This,LPCWSTR pszDeviceID,LPCWSTR pszAltDeviceID,LPCWSTR pszEventType,LPCWSTR pszContentTypeHandler,IDataObject *pdataobject) {
    return This->lpVtbl->HandleEventWithContent(This,pszDeviceID,pszAltDeviceID,pszEventType,pszContentTypeHandler,pdataobject);
}
/*** IHWEventHandler2 methods ***/
static FORCEINLINE HRESULT IHWEventHandler2_HandleEventWithHWND(IHWEventHandler2* This,LPCWSTR pszDeviceID,LPCWSTR pszAltDeviceID,LPCWSTR pszEventType,HWND hwndOwner) {
    return This->lpVtbl->HandleEventWithHWND(This,pszDeviceID,pszAltDeviceID,pszEventType,hwndOwner);
}
#endif
#endif

#endif


#endif  /* __IHWEventHandler2_INTERFACE_DEFINED__ */


#define ARCONTENT_AUTORUNINF 0x00000002
#define ARCONTENT_AUDIOCD 0x00000004
#define ARCONTENT_DVDMOVIE 0x00000008
#define ARCONTENT_BLANKCD 0x00000010
#define ARCONTENT_BLANKDVD 0x00000020
#define ARCONTENT_UNKNOWNCONTENT 0x00000040
#define ARCONTENT_AUTOPLAYPIX 0x00000080
#define ARCONTENT_AUTOPLAYMUSIC 0x00000100
#define ARCONTENT_AUTOPLAYVIDEO 0x00000200

#if NTDDI_VERSION >= NTDDI_VISTA
#define ARCONTENT_VCD 0x00000400
#define ARCONTENT_SVCD 0x00000800
#define ARCONTENT_DVDAUDIO 0x00001000
#define ARCONTENT_BLANKBD 0x00002000
#define ARCONTENT_BLURAY 0x00004000
#define ARCONTENT_CAMERASTORAGE 0x00008000
#define ARCONTENT_CUSTOMEVENT 0x00010000
#define ARCONTENT_NONE 0x00000000
#define ARCONTENT_MASK 0x0001FFFE

#define ARCONTENT_PHASE_UNKNOWN 0x00000000
#define ARCONTENT_PHASE_PRESNIFF 0x10000000
#define ARCONTENT_PHASE_SNIFFING 0x20000000
#define ARCONTENT_PHASE_FINAL 0x40000000
#define ARCONTENT_PHASE_MASK 0x70000000
#endif

/*****************************************************************************
 * IQueryCancelAutoPlay interface
 */
#ifndef __IQueryCancelAutoPlay_INTERFACE_DEFINED__
#define __IQueryCancelAutoPlay_INTERFACE_DEFINED__

DEFINE_GUID(IID_IQueryCancelAutoPlay, 0xddefe873, 0x6997, 0x4e68, 0xbe,0x26, 0x39,0xb6,0x33,0xad,0xbe,0x12);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ddefe873-6997-4e68-be26-39b633adbe12")
IQueryCancelAutoPlay : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AllowAutoPlay(
        LPCWSTR pszPath,
        DWORD dwContentType,
        LPCWSTR pszLabel,
        DWORD dwSerialNumber) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IQueryCancelAutoPlay, 0xddefe873, 0x6997, 0x4e68, 0xbe,0x26, 0x39,0xb6,0x33,0xad,0xbe,0x12)
#endif
#else
typedef struct IQueryCancelAutoPlayVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IQueryCancelAutoPlay *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IQueryCancelAutoPlay *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IQueryCancelAutoPlay *This);

    /*** IQueryCancelAutoPlay methods ***/
    HRESULT (STDMETHODCALLTYPE *AllowAutoPlay)(
        IQueryCancelAutoPlay *This,
        LPCWSTR pszPath,
        DWORD dwContentType,
        LPCWSTR pszLabel,
        DWORD dwSerialNumber);

    END_INTERFACE
} IQueryCancelAutoPlayVtbl;

interface IQueryCancelAutoPlay {
    CONST_VTBL IQueryCancelAutoPlayVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IQueryCancelAutoPlay_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IQueryCancelAutoPlay_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IQueryCancelAutoPlay_Release(This) (This)->lpVtbl->Release(This)
/*** IQueryCancelAutoPlay methods ***/
#define IQueryCancelAutoPlay_AllowAutoPlay(This,pszPath,dwContentType,pszLabel,dwSerialNumber) (This)->lpVtbl->AllowAutoPlay(This,pszPath,dwContentType,pszLabel,dwSerialNumber)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IQueryCancelAutoPlay_QueryInterface(IQueryCancelAutoPlay* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IQueryCancelAutoPlay_AddRef(IQueryCancelAutoPlay* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IQueryCancelAutoPlay_Release(IQueryCancelAutoPlay* This) {
    return This->lpVtbl->Release(This);
}
/*** IQueryCancelAutoPlay methods ***/
static FORCEINLINE HRESULT IQueryCancelAutoPlay_AllowAutoPlay(IQueryCancelAutoPlay* This,LPCWSTR pszPath,DWORD dwContentType,LPCWSTR pszLabel,DWORD dwSerialNumber) {
    return This->lpVtbl->AllowAutoPlay(This,pszPath,dwContentType,pszLabel,dwSerialNumber);
}
#endif
#endif

#endif


#endif  /* __IQueryCancelAutoPlay_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_VISTA
/*****************************************************************************
 * IDynamicHWHandler interface
 */
#ifndef __IDynamicHWHandler_INTERFACE_DEFINED__
#define __IDynamicHWHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDynamicHWHandler, 0xdc2601d7, 0x059e, 0x42fc, 0xa0,0x9d, 0x2a,0xfd,0x21,0xb6,0xd5,0xf7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dc2601d7-059e-42fc-a09d-2afd21b6d5f7")
IDynamicHWHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDynamicInfo(
        LPCWSTR pszDeviceID,
        DWORD dwContentType,
        LPWSTR *ppszAction) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDynamicHWHandler, 0xdc2601d7, 0x059e, 0x42fc, 0xa0,0x9d, 0x2a,0xfd,0x21,0xb6,0xd5,0xf7)
#endif
#else
typedef struct IDynamicHWHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDynamicHWHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDynamicHWHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDynamicHWHandler *This);

    /*** IDynamicHWHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDynamicInfo)(
        IDynamicHWHandler *This,
        LPCWSTR pszDeviceID,
        DWORD dwContentType,
        LPWSTR *ppszAction);

    END_INTERFACE
} IDynamicHWHandlerVtbl;

interface IDynamicHWHandler {
    CONST_VTBL IDynamicHWHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDynamicHWHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDynamicHWHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDynamicHWHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDynamicHWHandler methods ***/
#define IDynamicHWHandler_GetDynamicInfo(This,pszDeviceID,dwContentType,ppszAction) (This)->lpVtbl->GetDynamicInfo(This,pszDeviceID,dwContentType,ppszAction)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDynamicHWHandler_QueryInterface(IDynamicHWHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDynamicHWHandler_AddRef(IDynamicHWHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDynamicHWHandler_Release(IDynamicHWHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDynamicHWHandler methods ***/
static FORCEINLINE HRESULT IDynamicHWHandler_GetDynamicInfo(IDynamicHWHandler* This,LPCWSTR pszDeviceID,DWORD dwContentType,LPWSTR *ppszAction) {
    return This->lpVtbl->GetDynamicInfo(This,pszDeviceID,dwContentType,ppszAction);
}
#endif
#endif

#endif


#endif  /* __IDynamicHWHandler_INTERFACE_DEFINED__ */

#endif

/*****************************************************************************
 * IActionProgress interface
 */
#ifndef __IActionProgress_INTERFACE_DEFINED__
#define __IActionProgress_INTERFACE_DEFINED__

enum _SPBEGINF {
    SPBEGINF_NORMAL = 0x0,
    SPBEGINF_AUTOTIME = 0x2,
    SPBEGINF_NOPROGRESSBAR = 0x10,
    SPBEGINF_MARQUEEPROGRESS = 0x20,
    SPBEGINF_NOCANCELBUTTON = 0x40
};

typedef DWORD SPBEGINF;

typedef enum _SPACTION {
    SPACTION_NONE = 0,
    SPACTION_MOVING = 1,
    SPACTION_COPYING = 2,
    SPACTION_RECYCLING = 3,
    SPACTION_APPLYINGATTRIBS = 4,
    SPACTION_DOWNLOADING = 5,
    SPACTION_SEARCHING_INTERNET = 6,
    SPACTION_CALCULATING = 7,
    SPACTION_UPLOADING = 8,
    SPACTION_SEARCHING_FILES = 9,
    SPACTION_DELETING = 10,
    SPACTION_RENAMING = 11,
    SPACTION_FORMATTING = 12,
    SPACTION_COPY_MOVING = 13
} SPACTION;

typedef enum _SPTEXT {
    SPTEXT_ACTIONDESCRIPTION = 1,
    SPTEXT_ACTIONDETAIL = 2
} SPTEXT;

DEFINE_GUID(IID_IActionProgress, 0x49ff1173, 0xeadc, 0x446d, 0x92,0x85, 0x15,0x64,0x53,0xa6,0x43,0x1c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("49ff1173-eadc-446d-9285-156453a6431c")
IActionProgress : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Begin(
        SPACTION action,
        SPBEGINF flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE UpdateProgress(
        ULONGLONG ulCompleted,
        ULONGLONG ulTotal) = 0;

    virtual HRESULT STDMETHODCALLTYPE UpdateText(
        SPTEXT sptext,
        LPCWSTR pszText,
        WINBOOL fMayCompact) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryCancel(
        WINBOOL *pfCancelled) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResetCancel(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE End(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IActionProgress, 0x49ff1173, 0xeadc, 0x446d, 0x92,0x85, 0x15,0x64,0x53,0xa6,0x43,0x1c)
#endif
#else
typedef struct IActionProgressVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IActionProgress *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IActionProgress *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IActionProgress *This);

    /*** IActionProgress methods ***/
    HRESULT (STDMETHODCALLTYPE *Begin)(
        IActionProgress *This,
        SPACTION action,
        SPBEGINF flags);

    HRESULT (STDMETHODCALLTYPE *UpdateProgress)(
        IActionProgress *This,
        ULONGLONG ulCompleted,
        ULONGLONG ulTotal);

    HRESULT (STDMETHODCALLTYPE *UpdateText)(
        IActionProgress *This,
        SPTEXT sptext,
        LPCWSTR pszText,
        WINBOOL fMayCompact);

    HRESULT (STDMETHODCALLTYPE *QueryCancel)(
        IActionProgress *This,
        WINBOOL *pfCancelled);

    HRESULT (STDMETHODCALLTYPE *ResetCancel)(
        IActionProgress *This);

    HRESULT (STDMETHODCALLTYPE *End)(
        IActionProgress *This);

    END_INTERFACE
} IActionProgressVtbl;

interface IActionProgress {
    CONST_VTBL IActionProgressVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IActionProgress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IActionProgress_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IActionProgress_Release(This) (This)->lpVtbl->Release(This)
/*** IActionProgress methods ***/
#define IActionProgress_Begin(This,action,flags) (This)->lpVtbl->Begin(This,action,flags)
#define IActionProgress_UpdateProgress(This,ulCompleted,ulTotal) (This)->lpVtbl->UpdateProgress(This,ulCompleted,ulTotal)
#define IActionProgress_UpdateText(This,sptext,pszText,fMayCompact) (This)->lpVtbl->UpdateText(This,sptext,pszText,fMayCompact)
#define IActionProgress_QueryCancel(This,pfCancelled) (This)->lpVtbl->QueryCancel(This,pfCancelled)
#define IActionProgress_ResetCancel(This) (This)->lpVtbl->ResetCancel(This)
#define IActionProgress_End(This) (This)->lpVtbl->End(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IActionProgress_QueryInterface(IActionProgress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IActionProgress_AddRef(IActionProgress* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IActionProgress_Release(IActionProgress* This) {
    return This->lpVtbl->Release(This);
}
/*** IActionProgress methods ***/
static FORCEINLINE HRESULT IActionProgress_Begin(IActionProgress* This,SPACTION action,SPBEGINF flags) {
    return This->lpVtbl->Begin(This,action,flags);
}
static FORCEINLINE HRESULT IActionProgress_UpdateProgress(IActionProgress* This,ULONGLONG ulCompleted,ULONGLONG ulTotal) {
    return This->lpVtbl->UpdateProgress(This,ulCompleted,ulTotal);
}
static FORCEINLINE HRESULT IActionProgress_UpdateText(IActionProgress* This,SPTEXT sptext,LPCWSTR pszText,WINBOOL fMayCompact) {
    return This->lpVtbl->UpdateText(This,sptext,pszText,fMayCompact);
}
static FORCEINLINE HRESULT IActionProgress_QueryCancel(IActionProgress* This,WINBOOL *pfCancelled) {
    return This->lpVtbl->QueryCancel(This,pfCancelled);
}
static FORCEINLINE HRESULT IActionProgress_ResetCancel(IActionProgress* This) {
    return This->lpVtbl->ResetCancel(This);
}
static FORCEINLINE HRESULT IActionProgress_End(IActionProgress* This) {
    return This->lpVtbl->End(This);
}
#endif
#endif

#endif


#endif  /* __IActionProgress_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IShellExtInit interface
 */
#ifndef __IShellExtInit_INTERFACE_DEFINED__
#define __IShellExtInit_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellExtInit, 0x000214e8, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214e8-0000-0000-c000-000000000046")
IShellExtInit : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        PCIDLIST_ABSOLUTE pidlFolder,
        IDataObject *pdtobj,
        HKEY hkeyProgID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellExtInit, 0x000214e8, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IShellExtInitVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellExtInit *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellExtInit *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellExtInit *This);

    /*** IShellExtInit methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IShellExtInit *This,
        PCIDLIST_ABSOLUTE pidlFolder,
        IDataObject *pdtobj,
        HKEY hkeyProgID);

    END_INTERFACE
} IShellExtInitVtbl;

interface IShellExtInit {
    CONST_VTBL IShellExtInitVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellExtInit_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellExtInit_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellExtInit_Release(This) (This)->lpVtbl->Release(This)
/*** IShellExtInit methods ***/
#define IShellExtInit_Initialize(This,pidlFolder,pdtobj,hkeyProgID) (This)->lpVtbl->Initialize(This,pidlFolder,pdtobj,hkeyProgID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellExtInit_QueryInterface(IShellExtInit* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellExtInit_AddRef(IShellExtInit* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellExtInit_Release(IShellExtInit* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellExtInit methods ***/
static FORCEINLINE HRESULT IShellExtInit_Initialize(IShellExtInit* This,PCIDLIST_ABSOLUTE pidlFolder,IDataObject *pdtobj,HKEY hkeyProgID) {
    return This->lpVtbl->Initialize(This,pidlFolder,pdtobj,hkeyProgID);
}
#endif
#endif

#endif


#endif  /* __IShellExtInit_INTERFACE_DEFINED__ */

typedef IShellExtInit *LPSHELLEXTINIT;

/*****************************************************************************
 * IShellPropSheetExt interface
 */
#ifndef __IShellPropSheetExt_INTERFACE_DEFINED__
#define __IShellPropSheetExt_INTERFACE_DEFINED__

enum _EXPPS {
    EXPPS_FILETYPES = 0x1
};

typedef UINT EXPPS;

DEFINE_GUID(IID_IShellPropSheetExt, 0x000214e9, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214e9-0000-0000-c000-000000000046")
IShellPropSheetExt : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddPages(
        LPFNSVADDPROPSHEETPAGE pfnAddPage,
        LPARAM lParam) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReplacePage(
        EXPPS uPageID,
        LPFNSVADDPROPSHEETPAGE pfnReplaceWith,
        LPARAM lParam) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellPropSheetExt, 0x000214e9, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IShellPropSheetExtVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellPropSheetExt *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellPropSheetExt *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellPropSheetExt *This);

    /*** IShellPropSheetExt methods ***/
    HRESULT (STDMETHODCALLTYPE *AddPages)(
        IShellPropSheetExt *This,
        LPFNSVADDPROPSHEETPAGE pfnAddPage,
        LPARAM lParam);

    HRESULT (STDMETHODCALLTYPE *ReplacePage)(
        IShellPropSheetExt *This,
        EXPPS uPageID,
        LPFNSVADDPROPSHEETPAGE pfnReplaceWith,
        LPARAM lParam);

    END_INTERFACE
} IShellPropSheetExtVtbl;

interface IShellPropSheetExt {
    CONST_VTBL IShellPropSheetExtVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellPropSheetExt_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellPropSheetExt_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellPropSheetExt_Release(This) (This)->lpVtbl->Release(This)
/*** IShellPropSheetExt methods ***/
#define IShellPropSheetExt_AddPages(This,pfnAddPage,lParam) (This)->lpVtbl->AddPages(This,pfnAddPage,lParam)
#define IShellPropSheetExt_ReplacePage(This,uPageID,pfnReplaceWith,lParam) (This)->lpVtbl->ReplacePage(This,uPageID,pfnReplaceWith,lParam)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellPropSheetExt_QueryInterface(IShellPropSheetExt* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellPropSheetExt_AddRef(IShellPropSheetExt* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellPropSheetExt_Release(IShellPropSheetExt* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellPropSheetExt methods ***/
static FORCEINLINE HRESULT IShellPropSheetExt_AddPages(IShellPropSheetExt* This,LPFNSVADDPROPSHEETPAGE pfnAddPage,LPARAM lParam) {
    return This->lpVtbl->AddPages(This,pfnAddPage,lParam);
}
static FORCEINLINE HRESULT IShellPropSheetExt_ReplacePage(IShellPropSheetExt* This,EXPPS uPageID,LPFNSVADDPROPSHEETPAGE pfnReplaceWith,LPARAM lParam) {
    return This->lpVtbl->ReplacePage(This,uPageID,pfnReplaceWith,lParam);
}
#endif
#endif

#endif


#endif  /* __IShellPropSheetExt_INTERFACE_DEFINED__ */

typedef IShellPropSheetExt *LPSHELLPROPSHEETEXT;

/*****************************************************************************
 * IRemoteComputer interface
 */
#ifndef __IRemoteComputer_INTERFACE_DEFINED__
#define __IRemoteComputer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRemoteComputer, 0x000214fe, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("000214fe-0000-0000-c000-000000000046")
IRemoteComputer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        LPCWSTR pszMachine,
        WINBOOL bEnumerating) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRemoteComputer, 0x000214fe, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IRemoteComputerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRemoteComputer *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRemoteComputer *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRemoteComputer *This);

    /*** IRemoteComputer methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IRemoteComputer *This,
        LPCWSTR pszMachine,
        WINBOOL bEnumerating);

    END_INTERFACE
} IRemoteComputerVtbl;

interface IRemoteComputer {
    CONST_VTBL IRemoteComputerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRemoteComputer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRemoteComputer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRemoteComputer_Release(This) (This)->lpVtbl->Release(This)
/*** IRemoteComputer methods ***/
#define IRemoteComputer_Initialize(This,pszMachine,bEnumerating) (This)->lpVtbl->Initialize(This,pszMachine,bEnumerating)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRemoteComputer_QueryInterface(IRemoteComputer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRemoteComputer_AddRef(IRemoteComputer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRemoteComputer_Release(IRemoteComputer* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteComputer methods ***/
static FORCEINLINE HRESULT IRemoteComputer_Initialize(IRemoteComputer* This,LPCWSTR pszMachine,WINBOOL bEnumerating) {
    return This->lpVtbl->Initialize(This,pszMachine,bEnumerating);
}
#endif
#endif

#endif


#endif  /* __IRemoteComputer_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IQueryContinue interface
 */
#ifndef __IQueryContinue_INTERFACE_DEFINED__
#define __IQueryContinue_INTERFACE_DEFINED__

DEFINE_GUID(IID_IQueryContinue, 0x7307055c, 0xb24a, 0x486b, 0x9f,0x25, 0x16,0x3e,0x59,0x7a,0x28,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7307055c-b24a-486b-9f25-163e597a28a9")
IQueryContinue : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryContinue(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IQueryContinue, 0x7307055c, 0xb24a, 0x486b, 0x9f,0x25, 0x16,0x3e,0x59,0x7a,0x28,0xa9)
#endif
#else
typedef struct IQueryContinueVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IQueryContinue *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IQueryContinue *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IQueryContinue *This);

    /*** IQueryContinue methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryContinue)(
        IQueryContinue *This);

    END_INTERFACE
} IQueryContinueVtbl;

interface IQueryContinue {
    CONST_VTBL IQueryContinueVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IQueryContinue_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IQueryContinue_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IQueryContinue_Release(This) (This)->lpVtbl->Release(This)
/*** IQueryContinue methods ***/
#define IQueryContinue_QueryContinue(This) (This)->lpVtbl->QueryContinue(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IQueryContinue_QueryInterface(IQueryContinue* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IQueryContinue_AddRef(IQueryContinue* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IQueryContinue_Release(IQueryContinue* This) {
    return This->lpVtbl->Release(This);
}
/*** IQueryContinue methods ***/
static FORCEINLINE HRESULT IQueryContinue_QueryContinue(IQueryContinue* This) {
    return This->lpVtbl->QueryContinue(This);
}
#endif
#endif

#endif


#endif  /* __IQueryContinue_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IObjectWithCancelEvent interface
 */
#ifndef __IObjectWithCancelEvent_INTERFACE_DEFINED__
#define __IObjectWithCancelEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IObjectWithCancelEvent, 0xf279b885, 0x0ae9, 0x4b85, 0xac,0x06, 0xdd,0xec,0xf9,0x40,0x89,0x41);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f279b885-0ae9-4b85-ac06-ddecf9408941")
IObjectWithCancelEvent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCancelEvent(
        HANDLE *phEvent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IObjectWithCancelEvent, 0xf279b885, 0x0ae9, 0x4b85, 0xac,0x06, 0xdd,0xec,0xf9,0x40,0x89,0x41)
#endif
#else
typedef struct IObjectWithCancelEventVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IObjectWithCancelEvent *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IObjectWithCancelEvent *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IObjectWithCancelEvent *This);

    /*** IObjectWithCancelEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCancelEvent)(
        IObjectWithCancelEvent *This,
        HANDLE *phEvent);

    END_INTERFACE
} IObjectWithCancelEventVtbl;

interface IObjectWithCancelEvent {
    CONST_VTBL IObjectWithCancelEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IObjectWithCancelEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectWithCancelEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectWithCancelEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IObjectWithCancelEvent methods ***/
#define IObjectWithCancelEvent_GetCancelEvent(This,phEvent) (This)->lpVtbl->GetCancelEvent(This,phEvent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IObjectWithCancelEvent_QueryInterface(IObjectWithCancelEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IObjectWithCancelEvent_AddRef(IObjectWithCancelEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IObjectWithCancelEvent_Release(IObjectWithCancelEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectWithCancelEvent methods ***/
static FORCEINLINE HRESULT IObjectWithCancelEvent_GetCancelEvent(IObjectWithCancelEvent* This,HANDLE *phEvent) {
    return This->lpVtbl->GetCancelEvent(This,phEvent);
}
#endif
#endif

#endif


#endif  /* __IObjectWithCancelEvent_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IUserNotification interface
 */
#ifndef __IUserNotification_INTERFACE_DEFINED__
#define __IUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUserNotification, 0xba9711ba, 0x5893, 0x4787, 0xa7,0xe1, 0x41,0x27,0x71,0x51,0x55,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ba9711ba-5893-4787-a7e1-41277151550b")
IUserNotification : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetBalloonInfo(
        LPCWSTR pszTitle,
        LPCWSTR pszText,
        DWORD dwInfoFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBalloonRetry(
        DWORD dwShowTime,
        DWORD dwInterval,
        UINT cRetryCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIconInfo(
        HICON hIcon,
        LPCWSTR pszToolTip) = 0;

    virtual HRESULT STDMETHODCALLTYPE Show(
        IQueryContinue *pqc,
        DWORD dwContinuePollInterval) = 0;

    virtual HRESULT STDMETHODCALLTYPE PlaySound(
        LPCWSTR pszSoundName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUserNotification, 0xba9711ba, 0x5893, 0x4787, 0xa7,0xe1, 0x41,0x27,0x71,0x51,0x55,0x0b)
#endif
#else
typedef struct IUserNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUserNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUserNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUserNotification *This);

    /*** IUserNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *SetBalloonInfo)(
        IUserNotification *This,
        LPCWSTR pszTitle,
        LPCWSTR pszText,
        DWORD dwInfoFlags);

    HRESULT (STDMETHODCALLTYPE *SetBalloonRetry)(
        IUserNotification *This,
        DWORD dwShowTime,
        DWORD dwInterval,
        UINT cRetryCount);

    HRESULT (STDMETHODCALLTYPE *SetIconInfo)(
        IUserNotification *This,
        HICON hIcon,
        LPCWSTR pszToolTip);

    HRESULT (STDMETHODCALLTYPE *Show)(
        IUserNotification *This,
        IQueryContinue *pqc,
        DWORD dwContinuePollInterval);

    HRESULT (STDMETHODCALLTYPE *PlaySound)(
        IUserNotification *This,
        LPCWSTR pszSoundName);

    END_INTERFACE
} IUserNotificationVtbl;

interface IUserNotification {
    CONST_VTBL IUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IUserNotification methods ***/
#define IUserNotification_SetBalloonInfo(This,pszTitle,pszText,dwInfoFlags) (This)->lpVtbl->SetBalloonInfo(This,pszTitle,pszText,dwInfoFlags)
#define IUserNotification_SetBalloonRetry(This,dwShowTime,dwInterval,cRetryCount) (This)->lpVtbl->SetBalloonRetry(This,dwShowTime,dwInterval,cRetryCount)
#define IUserNotification_SetIconInfo(This,hIcon,pszToolTip) (This)->lpVtbl->SetIconInfo(This,hIcon,pszToolTip)
#define IUserNotification_Show(This,pqc,dwContinuePollInterval) (This)->lpVtbl->Show(This,pqc,dwContinuePollInterval)
#define IUserNotification_PlaySound(This,pszSoundName) (This)->lpVtbl->PlaySound(This,pszSoundName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUserNotification_QueryInterface(IUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUserNotification_AddRef(IUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUserNotification_Release(IUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IUserNotification methods ***/
static FORCEINLINE HRESULT IUserNotification_SetBalloonInfo(IUserNotification* This,LPCWSTR pszTitle,LPCWSTR pszText,DWORD dwInfoFlags) {
    return This->lpVtbl->SetBalloonInfo(This,pszTitle,pszText,dwInfoFlags);
}
static FORCEINLINE HRESULT IUserNotification_SetBalloonRetry(IUserNotification* This,DWORD dwShowTime,DWORD dwInterval,UINT cRetryCount) {
    return This->lpVtbl->SetBalloonRetry(This,dwShowTime,dwInterval,cRetryCount);
}
static FORCEINLINE HRESULT IUserNotification_SetIconInfo(IUserNotification* This,HICON hIcon,LPCWSTR pszToolTip) {
    return This->lpVtbl->SetIconInfo(This,hIcon,pszToolTip);
}
static FORCEINLINE HRESULT IUserNotification_Show(IUserNotification* This,IQueryContinue *pqc,DWORD dwContinuePollInterval) {
    return This->lpVtbl->Show(This,pqc,dwContinuePollInterval);
}
static FORCEINLINE HRESULT IUserNotification_PlaySound(IUserNotification* This,LPCWSTR pszSoundName) {
    return This->lpVtbl->PlaySound(This,pszSoundName);
}
#endif
#endif

#endif


#endif  /* __IUserNotification_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IUserNotificationCallback interface
 */
#ifndef __IUserNotificationCallback_INTERFACE_DEFINED__
#define __IUserNotificationCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUserNotificationCallback, 0x19108294, 0x0441, 0x4aff, 0x80,0x13, 0xfa,0x0a,0x73,0x0b,0x0b,0xea);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("19108294-0441-4aff-8013-fa0a730b0bea")
IUserNotificationCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnBalloonUserClick(
        POINT *pt) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnLeftClick(
        POINT *pt) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnContextMenu(
        POINT *pt) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUserNotificationCallback, 0x19108294, 0x0441, 0x4aff, 0x80,0x13, 0xfa,0x0a,0x73,0x0b,0x0b,0xea)
#endif
#else
typedef struct IUserNotificationCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUserNotificationCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUserNotificationCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUserNotificationCallback *This);

    /*** IUserNotificationCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnBalloonUserClick)(
        IUserNotificationCallback *This,
        POINT *pt);

    HRESULT (STDMETHODCALLTYPE *OnLeftClick)(
        IUserNotificationCallback *This,
        POINT *pt);

    HRESULT (STDMETHODCALLTYPE *OnContextMenu)(
        IUserNotificationCallback *This,
        POINT *pt);

    END_INTERFACE
} IUserNotificationCallbackVtbl;

interface IUserNotificationCallback {
    CONST_VTBL IUserNotificationCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUserNotificationCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUserNotificationCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUserNotificationCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IUserNotificationCallback methods ***/
#define IUserNotificationCallback_OnBalloonUserClick(This,pt) (This)->lpVtbl->OnBalloonUserClick(This,pt)
#define IUserNotificationCallback_OnLeftClick(This,pt) (This)->lpVtbl->OnLeftClick(This,pt)
#define IUserNotificationCallback_OnContextMenu(This,pt) (This)->lpVtbl->OnContextMenu(This,pt)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUserNotificationCallback_QueryInterface(IUserNotificationCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUserNotificationCallback_AddRef(IUserNotificationCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUserNotificationCallback_Release(IUserNotificationCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IUserNotificationCallback methods ***/
static FORCEINLINE HRESULT IUserNotificationCallback_OnBalloonUserClick(IUserNotificationCallback* This,POINT *pt) {
    return This->lpVtbl->OnBalloonUserClick(This,pt);
}
static FORCEINLINE HRESULT IUserNotificationCallback_OnLeftClick(IUserNotificationCallback* This,POINT *pt) {
    return This->lpVtbl->OnLeftClick(This,pt);
}
static FORCEINLINE HRESULT IUserNotificationCallback_OnContextMenu(IUserNotificationCallback* This,POINT *pt) {
    return This->lpVtbl->OnContextMenu(This,pt);
}
#endif
#endif

#endif


#endif  /* __IUserNotificationCallback_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IUserNotification2 interface
 */
#ifndef __IUserNotification2_INTERFACE_DEFINED__
#define __IUserNotification2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUserNotification2, 0x215913cc, 0x57eb, 0x4fab, 0xab,0x5a, 0xe5,0xfa,0x7b,0xea,0x2a,0x6c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("215913cc-57eb-4fab-ab5a-e5fa7bea2a6c")
IUserNotification2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetBalloonInfo(
        LPCWSTR pszTitle,
        LPCWSTR pszText,
        DWORD dwInfoFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBalloonRetry(
        DWORD dwShowTime,
        DWORD dwInterval,
        UINT cRetryCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIconInfo(
        HICON hIcon,
        LPCWSTR pszToolTip) = 0;

    virtual HRESULT STDMETHODCALLTYPE Show(
        IQueryContinue *pqc,
        DWORD dwContinuePollInterval,
        IUserNotificationCallback *pSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE PlaySound(
        LPCWSTR pszSoundName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUserNotification2, 0x215913cc, 0x57eb, 0x4fab, 0xab,0x5a, 0xe5,0xfa,0x7b,0xea,0x2a,0x6c)
#endif
#else
typedef struct IUserNotification2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUserNotification2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUserNotification2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUserNotification2 *This);

    /*** IUserNotification2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetBalloonInfo)(
        IUserNotification2 *This,
        LPCWSTR pszTitle,
        LPCWSTR pszText,
        DWORD dwInfoFlags);

    HRESULT (STDMETHODCALLTYPE *SetBalloonRetry)(
        IUserNotification2 *This,
        DWORD dwShowTime,
        DWORD dwInterval,
        UINT cRetryCount);

    HRESULT (STDMETHODCALLTYPE *SetIconInfo)(
        IUserNotification2 *This,
        HICON hIcon,
        LPCWSTR pszToolTip);

    HRESULT (STDMETHODCALLTYPE *Show)(
        IUserNotification2 *This,
        IQueryContinue *pqc,
        DWORD dwContinuePollInterval,
        IUserNotificationCallback *pSink);

    HRESULT (STDMETHODCALLTYPE *PlaySound)(
        IUserNotification2 *This,
        LPCWSTR pszSoundName);

    END_INTERFACE
} IUserNotification2Vtbl;

interface IUserNotification2 {
    CONST_VTBL IUserNotification2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUserNotification2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUserNotification2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUserNotification2_Release(This) (This)->lpVtbl->Release(This)
/*** IUserNotification2 methods ***/
#define IUserNotification2_SetBalloonInfo(This,pszTitle,pszText,dwInfoFlags) (This)->lpVtbl->SetBalloonInfo(This,pszTitle,pszText,dwInfoFlags)
#define IUserNotification2_SetBalloonRetry(This,dwShowTime,dwInterval,cRetryCount) (This)->lpVtbl->SetBalloonRetry(This,dwShowTime,dwInterval,cRetryCount)
#define IUserNotification2_SetIconInfo(This,hIcon,pszToolTip) (This)->lpVtbl->SetIconInfo(This,hIcon,pszToolTip)
#define IUserNotification2_Show(This,pqc,dwContinuePollInterval,pSink) (This)->lpVtbl->Show(This,pqc,dwContinuePollInterval,pSink)
#define IUserNotification2_PlaySound(This,pszSoundName) (This)->lpVtbl->PlaySound(This,pszSoundName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUserNotification2_QueryInterface(IUserNotification2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUserNotification2_AddRef(IUserNotification2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUserNotification2_Release(IUserNotification2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUserNotification2 methods ***/
static FORCEINLINE HRESULT IUserNotification2_SetBalloonInfo(IUserNotification2* This,LPCWSTR pszTitle,LPCWSTR pszText,DWORD dwInfoFlags) {
    return This->lpVtbl->SetBalloonInfo(This,pszTitle,pszText,dwInfoFlags);
}
static FORCEINLINE HRESULT IUserNotification2_SetBalloonRetry(IUserNotification2* This,DWORD dwShowTime,DWORD dwInterval,UINT cRetryCount) {
    return This->lpVtbl->SetBalloonRetry(This,dwShowTime,dwInterval,cRetryCount);
}
static FORCEINLINE HRESULT IUserNotification2_SetIconInfo(IUserNotification2* This,HICON hIcon,LPCWSTR pszToolTip) {
    return This->lpVtbl->SetIconInfo(This,hIcon,pszToolTip);
}
static FORCEINLINE HRESULT IUserNotification2_Show(IUserNotification2* This,IQueryContinue *pqc,DWORD dwContinuePollInterval,IUserNotificationCallback *pSink) {
    return This->lpVtbl->Show(This,pqc,dwContinuePollInterval,pSink);
}
static FORCEINLINE HRESULT IUserNotification2_PlaySound(IUserNotification2* This,LPCWSTR pszSoundName) {
    return This->lpVtbl->PlaySound(This,pszSoundName);
}
#endif
#endif

#endif


#endif  /* __IUserNotification2_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IItemNameLimits interface
 */
#ifndef __IItemNameLimits_INTERFACE_DEFINED__
#define __IItemNameLimits_INTERFACE_DEFINED__

DEFINE_GUID(IID_IItemNameLimits, 0x1df0d7f1, 0xb267, 0x4d28, 0x8b,0x10, 0x12,0xe2,0x32,0x02,0xa5,0xc4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1df0d7f1-b267-4d28-8b10-12e23202a5c4")
IItemNameLimits : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetValidCharacters(
        LPWSTR *ppwszValidChars,
        LPWSTR *ppwszInvalidChars) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxLength(
        LPCWSTR pszName,
        int *piMaxNameLen) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IItemNameLimits, 0x1df0d7f1, 0xb267, 0x4d28, 0x8b,0x10, 0x12,0xe2,0x32,0x02,0xa5,0xc4)
#endif
#else
typedef struct IItemNameLimitsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IItemNameLimits *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IItemNameLimits *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IItemNameLimits *This);

    /*** IItemNameLimits methods ***/
    HRESULT (STDMETHODCALLTYPE *GetValidCharacters)(
        IItemNameLimits *This,
        LPWSTR *ppwszValidChars,
        LPWSTR *ppwszInvalidChars);

    HRESULT (STDMETHODCALLTYPE *GetMaxLength)(
        IItemNameLimits *This,
        LPCWSTR pszName,
        int *piMaxNameLen);

    END_INTERFACE
} IItemNameLimitsVtbl;

interface IItemNameLimits {
    CONST_VTBL IItemNameLimitsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IItemNameLimits_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IItemNameLimits_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IItemNameLimits_Release(This) (This)->lpVtbl->Release(This)
/*** IItemNameLimits methods ***/
#define IItemNameLimits_GetValidCharacters(This,ppwszValidChars,ppwszInvalidChars) (This)->lpVtbl->GetValidCharacters(This,ppwszValidChars,ppwszInvalidChars)
#define IItemNameLimits_GetMaxLength(This,pszName,piMaxNameLen) (This)->lpVtbl->GetMaxLength(This,pszName,piMaxNameLen)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IItemNameLimits_QueryInterface(IItemNameLimits* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IItemNameLimits_AddRef(IItemNameLimits* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IItemNameLimits_Release(IItemNameLimits* This) {
    return This->lpVtbl->Release(This);
}
/*** IItemNameLimits methods ***/
static FORCEINLINE HRESULT IItemNameLimits_GetValidCharacters(IItemNameLimits* This,LPWSTR *ppwszValidChars,LPWSTR *ppwszInvalidChars) {
    return This->lpVtbl->GetValidCharacters(This,ppwszValidChars,ppwszInvalidChars);
}
static FORCEINLINE HRESULT IItemNameLimits_GetMaxLength(IItemNameLimits* This,LPCWSTR pszName,int *piMaxNameLen) {
    return This->lpVtbl->GetMaxLength(This,pszName,piMaxNameLen);
}
#endif
#endif

#endif


#endif  /* __IItemNameLimits_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_VISTA
#ifndef __ICondition_FWD_DEFINED__
#define __ICondition_FWD_DEFINED__
typedef interface ICondition ICondition;
#ifdef __cplusplus
interface ICondition;
#endif /* __cplusplus */
#endif


/*****************************************************************************
 * ISearchFolderItemFactory interface
 */
#ifndef __ISearchFolderItemFactory_INTERFACE_DEFINED__
#define __ISearchFolderItemFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISearchFolderItemFactory, 0xa0ffbc28, 0x5482, 0x4366, 0xbe,0x27, 0x3e,0x81,0xe7,0x8e,0x06,0xc2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a0ffbc28-5482-4366-be27-3e81e78e06c2")
ISearchFolderItemFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetDisplayName(
        LPCWSTR pszDisplayName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFolderTypeID(
        FOLDERTYPEID ftid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFolderLogicalViewMode(
        FOLDERLOGICALVIEWMODE flvm) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIconSize(
        int iIconSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVisibleColumns(
        UINT cVisibleColumns,
        PROPERTYKEY *rgKey) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSortColumns(
        UINT cSortColumns,
        SORTCOLUMN *rgSortColumns) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGroupColumn(
        REFPROPERTYKEY keyGroup) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStacks(
        UINT cStackKeys,
        PROPERTYKEY *rgStackKeys) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetScope(
        IShellItemArray *psiaScope) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCondition(
        ICondition *pCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetShellItem(
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIDList(
        PIDLIST_ABSOLUTE *ppidl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISearchFolderItemFactory, 0xa0ffbc28, 0x5482, 0x4366, 0xbe,0x27, 0x3e,0x81,0xe7,0x8e,0x06,0xc2)
#endif
#else
typedef struct ISearchFolderItemFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISearchFolderItemFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISearchFolderItemFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISearchFolderItemFactory *This);

    /*** ISearchFolderItemFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *SetDisplayName)(
        ISearchFolderItemFactory *This,
        LPCWSTR pszDisplayName);

    HRESULT (STDMETHODCALLTYPE *SetFolderTypeID)(
        ISearchFolderItemFactory *This,
        FOLDERTYPEID ftid);

    HRESULT (STDMETHODCALLTYPE *SetFolderLogicalViewMode)(
        ISearchFolderItemFactory *This,
        FOLDERLOGICALVIEWMODE flvm);

    HRESULT (STDMETHODCALLTYPE *SetIconSize)(
        ISearchFolderItemFactory *This,
        int iIconSize);

    HRESULT (STDMETHODCALLTYPE *SetVisibleColumns)(
        ISearchFolderItemFactory *This,
        UINT cVisibleColumns,
        PROPERTYKEY *rgKey);

    HRESULT (STDMETHODCALLTYPE *SetSortColumns)(
        ISearchFolderItemFactory *This,
        UINT cSortColumns,
        SORTCOLUMN *rgSortColumns);

    HRESULT (STDMETHODCALLTYPE *SetGroupColumn)(
        ISearchFolderItemFactory *This,
        REFPROPERTYKEY keyGroup);

    HRESULT (STDMETHODCALLTYPE *SetStacks)(
        ISearchFolderItemFactory *This,
        UINT cStackKeys,
        PROPERTYKEY *rgStackKeys);

    HRESULT (STDMETHODCALLTYPE *SetScope)(
        ISearchFolderItemFactory *This,
        IShellItemArray *psiaScope);

    HRESULT (STDMETHODCALLTYPE *SetCondition)(
        ISearchFolderItemFactory *This,
        ICondition *pCondition);

    HRESULT (STDMETHODCALLTYPE *GetShellItem)(
        ISearchFolderItemFactory *This,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetIDList)(
        ISearchFolderItemFactory *This,
        PIDLIST_ABSOLUTE *ppidl);

    END_INTERFACE
} ISearchFolderItemFactoryVtbl;

interface ISearchFolderItemFactory {
    CONST_VTBL ISearchFolderItemFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISearchFolderItemFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISearchFolderItemFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISearchFolderItemFactory_Release(This) (This)->lpVtbl->Release(This)
/*** ISearchFolderItemFactory methods ***/
#define ISearchFolderItemFactory_SetDisplayName(This,pszDisplayName) (This)->lpVtbl->SetDisplayName(This,pszDisplayName)
#define ISearchFolderItemFactory_SetFolderTypeID(This,ftid) (This)->lpVtbl->SetFolderTypeID(This,ftid)
#define ISearchFolderItemFactory_SetFolderLogicalViewMode(This,flvm) (This)->lpVtbl->SetFolderLogicalViewMode(This,flvm)
#define ISearchFolderItemFactory_SetIconSize(This,iIconSize) (This)->lpVtbl->SetIconSize(This,iIconSize)
#define ISearchFolderItemFactory_SetVisibleColumns(This,cVisibleColumns,rgKey) (This)->lpVtbl->SetVisibleColumns(This,cVisibleColumns,rgKey)
#define ISearchFolderItemFactory_SetSortColumns(This,cSortColumns,rgSortColumns) (This)->lpVtbl->SetSortColumns(This,cSortColumns,rgSortColumns)
#define ISearchFolderItemFactory_SetGroupColumn(This,keyGroup) (This)->lpVtbl->SetGroupColumn(This,keyGroup)
#define ISearchFolderItemFactory_SetStacks(This,cStackKeys,rgStackKeys) (This)->lpVtbl->SetStacks(This,cStackKeys,rgStackKeys)
#define ISearchFolderItemFactory_SetScope(This,psiaScope) (This)->lpVtbl->SetScope(This,psiaScope)
#define ISearchFolderItemFactory_SetCondition(This,pCondition) (This)->lpVtbl->SetCondition(This,pCondition)
#define ISearchFolderItemFactory_GetShellItem(This,riid,ppv) (This)->lpVtbl->GetShellItem(This,riid,ppv)
#define ISearchFolderItemFactory_GetIDList(This,ppidl) (This)->lpVtbl->GetIDList(This,ppidl)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISearchFolderItemFactory_QueryInterface(ISearchFolderItemFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISearchFolderItemFactory_AddRef(ISearchFolderItemFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISearchFolderItemFactory_Release(ISearchFolderItemFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** ISearchFolderItemFactory methods ***/
static FORCEINLINE HRESULT ISearchFolderItemFactory_SetDisplayName(ISearchFolderItemFactory* This,LPCWSTR pszDisplayName) {
    return This->lpVtbl->SetDisplayName(This,pszDisplayName);
}
static FORCEINLINE HRESULT ISearchFolderItemFactory_SetFolderTypeID(ISearchFolderItemFactory* This,FOLDERTYPEID ftid) {
    return This->lpVtbl->SetFolderTypeID(This,ftid);
}
static FORCEINLINE HRESULT ISearchFolderItemFactory_SetFolderLogicalViewMode(ISearchFolderItemFactory* This,FOLDERLOGICALVIEWMODE flvm) {
    return This->lpVtbl->SetFolderLogicalViewMode(This,flvm);
}
static FORCEINLINE HRESULT ISearchFolderItemFactory_SetIconSize(ISearchFolderItemFactory* This,int iIconSize) {
    return This->lpVtbl->SetIconSize(This,iIconSize);
}
static FORCEINLINE HRESULT ISearchFolderItemFactory_SetVisibleColumns(ISearchFolderItemFactory* This,UINT cVisibleColumns,PROPERTYKEY *rgKey) {
    return This->lpVtbl->SetVisibleColumns(This,cVisibleColumns,rgKey);
}
static FORCEINLINE HRESULT ISearchFolderItemFactory_SetSortColumns(ISearchFolderItemFactory* This,UINT cSortColumns,SORTCOLUMN *rgSortColumns) {
    return This->lpVtbl->SetSortColumns(This,cSortColumns,rgSortColumns);
}
static FORCEINLINE HRESULT ISearchFolderItemFactory_SetGroupColumn(ISearchFolderItemFactory* This,REFPROPERTYKEY keyGroup) {
    return This->lpVtbl->SetGroupColumn(This,keyGroup);
}
static FORCEINLINE HRESULT ISearchFolderItemFactory_SetStacks(ISearchFolderItemFactory* This,UINT cStackKeys,PROPERTYKEY *rgStackKeys) {
    return This->lpVtbl->SetStacks(This,cStackKeys,rgStackKeys);
}
static FORCEINLINE HRESULT ISearchFolderItemFactory_SetScope(ISearchFolderItemFactory* This,IShellItemArray *psiaScope) {
    return This->lpVtbl->SetScope(This,psiaScope);
}
static FORCEINLINE HRESULT ISearchFolderItemFactory_SetCondition(ISearchFolderItemFactory* This,ICondition *pCondition) {
    return This->lpVtbl->SetCondition(This,pCondition);
}
static FORCEINLINE HRESULT ISearchFolderItemFactory_GetShellItem(ISearchFolderItemFactory* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetShellItem(This,riid,ppv);
}
static FORCEINLINE HRESULT ISearchFolderItemFactory_GetIDList(ISearchFolderItemFactory* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetIDList(This,ppidl);
}
#endif
#endif

#endif


#endif  /* __ISearchFolderItemFactory_INTERFACE_DEFINED__ */

#endif

#define IEI_PRIORITY_MAX ITSAT_MAX_PRIORITY
#define IEI_PRIORITY_MIN ITSAT_MIN_PRIORITY
#define IEIT_PRIORITY_NORMAL ITSAT_DEFAULT_PRIORITY

#define IEIFLAG_ASYNC 0x0001
#define IEIFLAG_CACHE 0x0002
#define IEIFLAG_ASPECT 0x0004
#define IEIFLAG_OFFLINE 0x0008
#define IEIFLAG_GLEAM 0x0010
#define IEIFLAG_SCREEN 0x0020
#define IEIFLAG_ORIGSIZE 0x0040
#define IEIFLAG_NOSTAMP 0x0080
#define IEIFLAG_NOBORDER 0x0100
#define IEIFLAG_QUALITY 0x0200
#define IEIFLAG_REFRESH 0x0400

/*****************************************************************************
 * IExtractImage interface
 */
#ifndef __IExtractImage_INTERFACE_DEFINED__
#define __IExtractImage_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExtractImage, 0xbb2e617c, 0x0920, 0x11d1, 0x9a,0x0b, 0x00,0xc0,0x4f,0xc2,0xd6,0xc1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bb2e617c-0920-11d1-9a0b-00c04fc2d6c1")
IExtractImage : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetLocation(
        LPWSTR pszPathBuffer,
        DWORD cch,
        DWORD *pdwPriority,
        const SIZE *prgSize,
        DWORD dwRecClrDepth,
        DWORD *pdwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Extract(
        HBITMAP *phBmpThumbnail) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExtractImage, 0xbb2e617c, 0x0920, 0x11d1, 0x9a,0x0b, 0x00,0xc0,0x4f,0xc2,0xd6,0xc1)
#endif
#else
typedef struct IExtractImageVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IExtractImage *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IExtractImage *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IExtractImage *This);

    /*** IExtractImage methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLocation)(
        IExtractImage *This,
        LPWSTR pszPathBuffer,
        DWORD cch,
        DWORD *pdwPriority,
        const SIZE *prgSize,
        DWORD dwRecClrDepth,
        DWORD *pdwFlags);

    HRESULT (STDMETHODCALLTYPE *Extract)(
        IExtractImage *This,
        HBITMAP *phBmpThumbnail);

    END_INTERFACE
} IExtractImageVtbl;

interface IExtractImage {
    CONST_VTBL IExtractImageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExtractImage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExtractImage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExtractImage_Release(This) (This)->lpVtbl->Release(This)
/*** IExtractImage methods ***/
#define IExtractImage_GetLocation(This,pszPathBuffer,cch,pdwPriority,prgSize,dwRecClrDepth,pdwFlags) (This)->lpVtbl->GetLocation(This,pszPathBuffer,cch,pdwPriority,prgSize,dwRecClrDepth,pdwFlags)
#define IExtractImage_Extract(This,phBmpThumbnail) (This)->lpVtbl->Extract(This,phBmpThumbnail)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IExtractImage_QueryInterface(IExtractImage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IExtractImage_AddRef(IExtractImage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IExtractImage_Release(IExtractImage* This) {
    return This->lpVtbl->Release(This);
}
/*** IExtractImage methods ***/
static FORCEINLINE HRESULT IExtractImage_GetLocation(IExtractImage* This,LPWSTR pszPathBuffer,DWORD cch,DWORD *pdwPriority,const SIZE *prgSize,DWORD dwRecClrDepth,DWORD *pdwFlags) {
    return This->lpVtbl->GetLocation(This,pszPathBuffer,cch,pdwPriority,prgSize,dwRecClrDepth,pdwFlags);
}
static FORCEINLINE HRESULT IExtractImage_Extract(IExtractImage* This,HBITMAP *phBmpThumbnail) {
    return This->lpVtbl->Extract(This,phBmpThumbnail);
}
#endif
#endif

#endif


#endif  /* __IExtractImage_INTERFACE_DEFINED__ */

typedef IExtractImage *LPEXTRACTIMAGE;

/*****************************************************************************
 * IExtractImage2 interface
 */
#ifndef __IExtractImage2_INTERFACE_DEFINED__
#define __IExtractImage2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExtractImage2, 0x953bb1ee, 0x93b4, 0x11d1, 0x98,0xa3, 0x00,0xc0,0x4f,0xb6,0x87,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("953bb1ee-93b4-11d1-98a3-00c04fb687da")
IExtractImage2 : public IExtractImage
{
    virtual HRESULT STDMETHODCALLTYPE GetDateStamp(
        FILETIME *pDateStamp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExtractImage2, 0x953bb1ee, 0x93b4, 0x11d1, 0x98,0xa3, 0x00,0xc0,0x4f,0xb6,0x87,0xda)
#endif
#else
typedef struct IExtractImage2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IExtractImage2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IExtractImage2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IExtractImage2 *This);

    /*** IExtractImage methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLocation)(
        IExtractImage2 *This,
        LPWSTR pszPathBuffer,
        DWORD cch,
        DWORD *pdwPriority,
        const SIZE *prgSize,
        DWORD dwRecClrDepth,
        DWORD *pdwFlags);

    HRESULT (STDMETHODCALLTYPE *Extract)(
        IExtractImage2 *This,
        HBITMAP *phBmpThumbnail);

    /*** IExtractImage2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDateStamp)(
        IExtractImage2 *This,
        FILETIME *pDateStamp);

    END_INTERFACE
} IExtractImage2Vtbl;

interface IExtractImage2 {
    CONST_VTBL IExtractImage2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExtractImage2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExtractImage2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExtractImage2_Release(This) (This)->lpVtbl->Release(This)
/*** IExtractImage methods ***/
#define IExtractImage2_GetLocation(This,pszPathBuffer,cch,pdwPriority,prgSize,dwRecClrDepth,pdwFlags) (This)->lpVtbl->GetLocation(This,pszPathBuffer,cch,pdwPriority,prgSize,dwRecClrDepth,pdwFlags)
#define IExtractImage2_Extract(This,phBmpThumbnail) (This)->lpVtbl->Extract(This,phBmpThumbnail)
/*** IExtractImage2 methods ***/
#define IExtractImage2_GetDateStamp(This,pDateStamp) (This)->lpVtbl->GetDateStamp(This,pDateStamp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IExtractImage2_QueryInterface(IExtractImage2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IExtractImage2_AddRef(IExtractImage2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IExtractImage2_Release(IExtractImage2* This) {
    return This->lpVtbl->Release(This);
}
/*** IExtractImage methods ***/
static FORCEINLINE HRESULT IExtractImage2_GetLocation(IExtractImage2* This,LPWSTR pszPathBuffer,DWORD cch,DWORD *pdwPriority,const SIZE *prgSize,DWORD dwRecClrDepth,DWORD *pdwFlags) {
    return This->lpVtbl->GetLocation(This,pszPathBuffer,cch,pdwPriority,prgSize,dwRecClrDepth,pdwFlags);
}
static FORCEINLINE HRESULT IExtractImage2_Extract(IExtractImage2* This,HBITMAP *phBmpThumbnail) {
    return This->lpVtbl->Extract(This,phBmpThumbnail);
}
/*** IExtractImage2 methods ***/
static FORCEINLINE HRESULT IExtractImage2_GetDateStamp(IExtractImage2* This,FILETIME *pDateStamp) {
    return This->lpVtbl->GetDateStamp(This,pDateStamp);
}
#endif
#endif

#endif


#endif  /* __IExtractImage2_INTERFACE_DEFINED__ */

typedef IExtractImage2 *LPEXTRACTIMAGE2;

/*****************************************************************************
 * IThumbnailHandlerFactory interface
 */
#ifndef __IThumbnailHandlerFactory_INTERFACE_DEFINED__
#define __IThumbnailHandlerFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IThumbnailHandlerFactory, 0xe35b4b2e, 0x00da, 0x4bc1, 0x9f,0x13, 0x38,0xbc,0x11,0xf5,0xd4,0x17);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e35b4b2e-00da-4bc1-9f13-38bc11f5d417")
IThumbnailHandlerFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetThumbnailHandler(
        PCUITEMID_CHILD pidlChild,
        IBindCtx *pbc,
        REFIID riid,
        void **ppv) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IThumbnailHandlerFactory, 0xe35b4b2e, 0x00da, 0x4bc1, 0x9f,0x13, 0x38,0xbc,0x11,0xf5,0xd4,0x17)
#endif
#else
typedef struct IThumbnailHandlerFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IThumbnailHandlerFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IThumbnailHandlerFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IThumbnailHandlerFactory *This);

    /*** IThumbnailHandlerFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *GetThumbnailHandler)(
        IThumbnailHandlerFactory *This,
        PCUITEMID_CHILD pidlChild,
        IBindCtx *pbc,
        REFIID riid,
        void **ppv);

    END_INTERFACE
} IThumbnailHandlerFactoryVtbl;

interface IThumbnailHandlerFactory {
    CONST_VTBL IThumbnailHandlerFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IThumbnailHandlerFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IThumbnailHandlerFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IThumbnailHandlerFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IThumbnailHandlerFactory methods ***/
#define IThumbnailHandlerFactory_GetThumbnailHandler(This,pidlChild,pbc,riid,ppv) (This)->lpVtbl->GetThumbnailHandler(This,pidlChild,pbc,riid,ppv)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IThumbnailHandlerFactory_QueryInterface(IThumbnailHandlerFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IThumbnailHandlerFactory_AddRef(IThumbnailHandlerFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IThumbnailHandlerFactory_Release(IThumbnailHandlerFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IThumbnailHandlerFactory methods ***/
static FORCEINLINE HRESULT IThumbnailHandlerFactory_GetThumbnailHandler(IThumbnailHandlerFactory* This,PCUITEMID_CHILD pidlChild,IBindCtx *pbc,REFIID riid,void **ppv) {
    return This->lpVtbl->GetThumbnailHandler(This,pidlChild,pbc,riid,ppv);
}
#endif
#endif

#endif


#endif  /* __IThumbnailHandlerFactory_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IParentAndItem interface
 */
#ifndef __IParentAndItem_INTERFACE_DEFINED__
#define __IParentAndItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IParentAndItem, 0xb3a4b685, 0xb685, 0x4805, 0x99,0xd9, 0x5d,0xea,0xd2,0x87,0x32,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b3a4b685-b685-4805-99d9-5dead2873236")
IParentAndItem : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetParentAndItem(
        PCIDLIST_ABSOLUTE pidlParent,
        IShellFolder *psf,
        PCUITEMID_CHILD pidlChild) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetParentAndItem(
        PIDLIST_ABSOLUTE *ppidlParent,
        IShellFolder **ppsf,
        PITEMID_CHILD *ppidlChild) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IParentAndItem, 0xb3a4b685, 0xb685, 0x4805, 0x99,0xd9, 0x5d,0xea,0xd2,0x87,0x32,0x36)
#endif
#else
typedef struct IParentAndItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IParentAndItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IParentAndItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IParentAndItem *This);

    /*** IParentAndItem methods ***/
    HRESULT (STDMETHODCALLTYPE *SetParentAndItem)(
        IParentAndItem *This,
        PCIDLIST_ABSOLUTE pidlParent,
        IShellFolder *psf,
        PCUITEMID_CHILD pidlChild);

    HRESULT (STDMETHODCALLTYPE *GetParentAndItem)(
        IParentAndItem *This,
        PIDLIST_ABSOLUTE *ppidlParent,
        IShellFolder **ppsf,
        PITEMID_CHILD *ppidlChild);

    END_INTERFACE
} IParentAndItemVtbl;

interface IParentAndItem {
    CONST_VTBL IParentAndItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IParentAndItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IParentAndItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IParentAndItem_Release(This) (This)->lpVtbl->Release(This)
/*** IParentAndItem methods ***/
#define IParentAndItem_SetParentAndItem(This,pidlParent,psf,pidlChild) (This)->lpVtbl->SetParentAndItem(This,pidlParent,psf,pidlChild)
#define IParentAndItem_GetParentAndItem(This,ppidlParent,ppsf,ppidlChild) (This)->lpVtbl->GetParentAndItem(This,ppidlParent,ppsf,ppidlChild)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IParentAndItem_QueryInterface(IParentAndItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IParentAndItem_AddRef(IParentAndItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IParentAndItem_Release(IParentAndItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IParentAndItem methods ***/
static FORCEINLINE HRESULT IParentAndItem_SetParentAndItem(IParentAndItem* This,PCIDLIST_ABSOLUTE pidlParent,IShellFolder *psf,PCUITEMID_CHILD pidlChild) {
    return This->lpVtbl->SetParentAndItem(This,pidlParent,psf,pidlChild);
}
static FORCEINLINE HRESULT IParentAndItem_GetParentAndItem(IParentAndItem* This,PIDLIST_ABSOLUTE *ppidlParent,IShellFolder **ppsf,PITEMID_CHILD *ppidlChild) {
    return This->lpVtbl->GetParentAndItem(This,ppidlParent,ppsf,ppidlChild);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IParentAndItem_RemoteGetParentAndItem_Proxy(
    IParentAndItem* This,
    PIDLIST_ABSOLUTE *ppidlParent,
    IShellFolder **ppsf,
    PITEMID_CHILD *ppidlChild);
void __RPC_STUB IParentAndItem_RemoteGetParentAndItem_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IParentAndItem_GetParentAndItem_Proxy(
    IParentAndItem* This,
    PIDLIST_ABSOLUTE *ppidlParent,
    IShellFolder **ppsf,
    PITEMID_CHILD *ppidlChild);
HRESULT __RPC_STUB IParentAndItem_GetParentAndItem_Stub(
    IParentAndItem* This,
    PIDLIST_ABSOLUTE *ppidlParent,
    IShellFolder **ppsf,
    PITEMID_CHILD *ppidlChild);

#endif  /* __IParentAndItem_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDockingWindow interface
 */
#ifndef __IDockingWindow_INTERFACE_DEFINED__
#define __IDockingWindow_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDockingWindow, 0x012dd920, 0x7b26, 0x11d0, 0x8c,0xa9, 0x00,0xa0,0xc9,0x2d,0xbf,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("012dd920-7b26-11d0-8ca9-00a0c92dbfe8")
IDockingWindow : public IOleWindow
{
    virtual HRESULT STDMETHODCALLTYPE ShowDW(
        WINBOOL fShow) = 0;

    virtual HRESULT STDMETHODCALLTYPE CloseDW(
        DWORD dwReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(
        LPCRECT prcBorder,
        IUnknown *punkToolbarSite,
        WINBOOL fReserved) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDockingWindow, 0x012dd920, 0x7b26, 0x11d0, 0x8c,0xa9, 0x00,0xa0,0xc9,0x2d,0xbf,0xe8)
#endif
#else
typedef struct IDockingWindowVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDockingWindow *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDockingWindow *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDockingWindow *This);

    /*** IOleWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IDockingWindow *This,
        HWND *phwnd);

    HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)(
        IDockingWindow *This,
        WINBOOL fEnterMode);

    /*** IDockingWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowDW)(
        IDockingWindow *This,
        WINBOOL fShow);

    HRESULT (STDMETHODCALLTYPE *CloseDW)(
        IDockingWindow *This,
        DWORD dwReserved);

    HRESULT (STDMETHODCALLTYPE *ResizeBorderDW)(
        IDockingWindow *This,
        LPCRECT prcBorder,
        IUnknown *punkToolbarSite,
        WINBOOL fReserved);

    END_INTERFACE
} IDockingWindowVtbl;

interface IDockingWindow {
    CONST_VTBL IDockingWindowVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDockingWindow_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDockingWindow_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDockingWindow_Release(This) (This)->lpVtbl->Release(This)
/*** IOleWindow methods ***/
#define IDockingWindow_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IDockingWindow_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
/*** IDockingWindow methods ***/
#define IDockingWindow_ShowDW(This,fShow) (This)->lpVtbl->ShowDW(This,fShow)
#define IDockingWindow_CloseDW(This,dwReserved) (This)->lpVtbl->CloseDW(This,dwReserved)
#define IDockingWindow_ResizeBorderDW(This,prcBorder,punkToolbarSite,fReserved) (This)->lpVtbl->ResizeBorderDW(This,prcBorder,punkToolbarSite,fReserved)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDockingWindow_QueryInterface(IDockingWindow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDockingWindow_AddRef(IDockingWindow* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDockingWindow_Release(IDockingWindow* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static FORCEINLINE HRESULT IDockingWindow_GetWindow(IDockingWindow* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static FORCEINLINE HRESULT IDockingWindow_ContextSensitiveHelp(IDockingWindow* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IDockingWindow methods ***/
static FORCEINLINE HRESULT IDockingWindow_ShowDW(IDockingWindow* This,WINBOOL fShow) {
    return This->lpVtbl->ShowDW(This,fShow);
}
static FORCEINLINE HRESULT IDockingWindow_CloseDW(IDockingWindow* This,DWORD dwReserved) {
    return This->lpVtbl->CloseDW(This,dwReserved);
}
static FORCEINLINE HRESULT IDockingWindow_ResizeBorderDW(IDockingWindow* This,LPCRECT prcBorder,IUnknown *punkToolbarSite,WINBOOL fReserved) {
    return This->lpVtbl->ResizeBorderDW(This,prcBorder,punkToolbarSite,fReserved);
}
#endif
#endif

#endif


#endif  /* __IDockingWindow_INTERFACE_DEFINED__ */


#define DBIM_MINSIZE 0x0001
#define DBIM_MAXSIZE 0x0002
#define DBIM_INTEGRAL 0x0004
#define DBIM_ACTUAL 0x0008
#define DBIM_TITLE 0x0010
#define DBIM_MODEFLAGS 0x0020
#define DBIM_BKCOLOR 0x0040

#include <pshpack8.h>
typedef struct DESKBANDINFO {
    DWORD dwMask;
    POINTL ptMinSize;
    POINTL ptMaxSize;
    POINTL ptIntegral;
    POINTL ptActual;
    WCHAR wszTitle[256];
    DWORD dwModeFlags;
    COLORREF crBkgnd;
} DESKBANDINFO;
#include <poppack.h>

#define DBIMF_NORMAL 0x0000
#define DBIMF_FIXED 0x0001
#define DBIMF_FIXEDBMP 0x0004
#define DBIMF_VARIABLEHEIGHT 0x0008
#define DBIMF_UNDELETEABLE 0x0010
#define DBIMF_DEBOSSED 0x0020
#define DBIMF_BKCOLOR 0x0040
#define DBIMF_USECHEVRON 0x0080
#define DBIMF_BREAK 0x0100
#define DBIMF_ADDTOFRONT 0x0200
#define DBIMF_TOPALIGN 0x0400
#if NTDDI_VERSION >= NTDDI_VISTA
#define DBIMF_NOGRIPPER 0x0800
#define DBIMF_ALWAYSGRIPPER 0x1000
#define DBIMF_NOMARGINS 0x2000
#endif

#define DBIF_VIEWMODE_NORMAL 0x0000
#define DBIF_VIEWMODE_VERTICAL 0x0001
#define DBIF_VIEWMODE_FLOATING 0x0002
#define DBIF_VIEWMODE_TRANSPARENT 0x0004

enum tagDESKBANDCID {
    DBID_BANDINFOCHANGED = 0,
    DBID_SHOWONLY = 1,
    DBID_MAXIMIZEBAND = 2,
    DBID_PUSHCHEVRON = 3,
    DBID_DELAYINIT = 4,
    DBID_FINISHINIT = 5,
    DBID_SETWINDOWTHEME = 6,
    DBID_PERMITAUTOHIDE = 7
};

#define DBPC_SELECTFIRST    (DWORD)-1
#define DBPC_SELECTLAST     (DWORD)-2

#define CGID_DeskBand IID_IDeskBand

/*****************************************************************************
 * IDeskBand interface
 */
#ifndef __IDeskBand_INTERFACE_DEFINED__
#define __IDeskBand_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDeskBand, 0xeb0fe172, 0x1a3a, 0x11d0, 0x89,0xb3, 0x00,0xa0,0xc9,0x0a,0x90,0xac);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("eb0fe172-1a3a-11d0-89b3-00a0c90a90ac")
IDeskBand : public IDockingWindow
{
    virtual HRESULT STDMETHODCALLTYPE GetBandInfo(
        DWORD dwBandID,
        DWORD dwViewMode,
        DESKBANDINFO *pdbi) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDeskBand, 0xeb0fe172, 0x1a3a, 0x11d0, 0x89,0xb3, 0x00,0xa0,0xc9,0x0a,0x90,0xac)
#endif
#else
typedef struct IDeskBandVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDeskBand *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDeskBand *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDeskBand *This);

    /*** IOleWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IDeskBand *This,
        HWND *phwnd);

    HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)(
        IDeskBand *This,
        WINBOOL fEnterMode);

    /*** IDockingWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowDW)(
        IDeskBand *This,
        WINBOOL fShow);

    HRESULT (STDMETHODCALLTYPE *CloseDW)(
        IDeskBand *This,
        DWORD dwReserved);

    HRESULT (STDMETHODCALLTYPE *ResizeBorderDW)(
        IDeskBand *This,
        LPCRECT prcBorder,
        IUnknown *punkToolbarSite,
        WINBOOL fReserved);

    /*** IDeskBand methods ***/
    HRESULT (STDMETHODCALLTYPE *GetBandInfo)(
        IDeskBand *This,
        DWORD dwBandID,
        DWORD dwViewMode,
        DESKBANDINFO *pdbi);

    END_INTERFACE
} IDeskBandVtbl;

interface IDeskBand {
    CONST_VTBL IDeskBandVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDeskBand_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDeskBand_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDeskBand_Release(This) (This)->lpVtbl->Release(This)
/*** IOleWindow methods ***/
#define IDeskBand_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IDeskBand_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
/*** IDockingWindow methods ***/
#define IDeskBand_ShowDW(This,fShow) (This)->lpVtbl->ShowDW(This,fShow)
#define IDeskBand_CloseDW(This,dwReserved) (This)->lpVtbl->CloseDW(This,dwReserved)
#define IDeskBand_ResizeBorderDW(This,prcBorder,punkToolbarSite,fReserved) (This)->lpVtbl->ResizeBorderDW(This,prcBorder,punkToolbarSite,fReserved)
/*** IDeskBand methods ***/
#define IDeskBand_GetBandInfo(This,dwBandID,dwViewMode,pdbi) (This)->lpVtbl->GetBandInfo(This,dwBandID,dwViewMode,pdbi)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDeskBand_QueryInterface(IDeskBand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDeskBand_AddRef(IDeskBand* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDeskBand_Release(IDeskBand* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static FORCEINLINE HRESULT IDeskBand_GetWindow(IDeskBand* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static FORCEINLINE HRESULT IDeskBand_ContextSensitiveHelp(IDeskBand* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IDockingWindow methods ***/
static FORCEINLINE HRESULT IDeskBand_ShowDW(IDeskBand* This,WINBOOL fShow) {
    return This->lpVtbl->ShowDW(This,fShow);
}
static FORCEINLINE HRESULT IDeskBand_CloseDW(IDeskBand* This,DWORD dwReserved) {
    return This->lpVtbl->CloseDW(This,dwReserved);
}
static FORCEINLINE HRESULT IDeskBand_ResizeBorderDW(IDeskBand* This,LPCRECT prcBorder,IUnknown *punkToolbarSite,WINBOOL fReserved) {
    return This->lpVtbl->ResizeBorderDW(This,prcBorder,punkToolbarSite,fReserved);
}
/*** IDeskBand methods ***/
static FORCEINLINE HRESULT IDeskBand_GetBandInfo(IDeskBand* This,DWORD dwBandID,DWORD dwViewMode,DESKBANDINFO *pdbi) {
    return This->lpVtbl->GetBandInfo(This,dwBandID,dwViewMode,pdbi);
}
#endif
#endif

#endif


#endif  /* __IDeskBand_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_VISTA
/*****************************************************************************
 * IDeskBandInfo interface
 */
#ifndef __IDeskBandInfo_INTERFACE_DEFINED__
#define __IDeskBandInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDeskBandInfo, 0x77e425fc, 0xcbf9, 0x4307, 0xba,0x6a, 0xbb,0x57,0x27,0x74,0x56,0x61);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("77e425fc-cbf9-4307-ba6a-bb5727745661")
IDeskBandInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDefaultBandWidth(
        DWORD dwBandID,
        DWORD dwViewMode,
        int *pnWidth) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDeskBandInfo, 0x77e425fc, 0xcbf9, 0x4307, 0xba,0x6a, 0xbb,0x57,0x27,0x74,0x56,0x61)
#endif
#else
typedef struct IDeskBandInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDeskBandInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDeskBandInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDeskBandInfo *This);

    /*** IDeskBandInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDefaultBandWidth)(
        IDeskBandInfo *This,
        DWORD dwBandID,
        DWORD dwViewMode,
        int *pnWidth);

    END_INTERFACE
} IDeskBandInfoVtbl;

interface IDeskBandInfo {
    CONST_VTBL IDeskBandInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDeskBandInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDeskBandInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDeskBandInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IDeskBandInfo methods ***/
#define IDeskBandInfo_GetDefaultBandWidth(This,dwBandID,dwViewMode,pnWidth) (This)->lpVtbl->GetDefaultBandWidth(This,dwBandID,dwViewMode,pnWidth)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDeskBandInfo_QueryInterface(IDeskBandInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDeskBandInfo_AddRef(IDeskBandInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDeskBandInfo_Release(IDeskBandInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDeskBandInfo methods ***/
static FORCEINLINE HRESULT IDeskBandInfo_GetDefaultBandWidth(IDeskBandInfo* This,DWORD dwBandID,DWORD dwViewMode,int *pnWidth) {
    return This->lpVtbl->GetDefaultBandWidth(This,dwBandID,dwViewMode,pnWidth);
}
#endif
#endif

#endif


#endif  /* __IDeskBandInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDeskBand2 interface
 */
#ifndef __IDeskBand2_INTERFACE_DEFINED__
#define __IDeskBand2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDeskBand2, 0x79d16de4, 0xabee, 0x4021, 0x8d,0x9d, 0x91,0x69,0xb2,0x61,0xd6,0x57);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("79d16de4-abee-4021-8d9d-9169b261d657")
IDeskBand2 : public IDeskBand
{
    virtual HRESULT STDMETHODCALLTYPE CanRenderComposited(
        WINBOOL *pfCanRenderComposited) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCompositionState(
        WINBOOL fCompositionEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCompositionState(
        WINBOOL *pfCompositionEnabled) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDeskBand2, 0x79d16de4, 0xabee, 0x4021, 0x8d,0x9d, 0x91,0x69,0xb2,0x61,0xd6,0x57)
#endif
#else
typedef struct IDeskBand2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDeskBand2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDeskBand2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDeskBand2 *This);

    /*** IOleWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IDeskBand2 *This,
        HWND *phwnd);

    HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)(
        IDeskBand2 *This,
        WINBOOL fEnterMode);

    /*** IDockingWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowDW)(
        IDeskBand2 *This,
        WINBOOL fShow);

    HRESULT (STDMETHODCALLTYPE *CloseDW)(
        IDeskBand2 *This,
        DWORD dwReserved);

    HRESULT (STDMETHODCALLTYPE *ResizeBorderDW)(
        IDeskBand2 *This,
        LPCRECT prcBorder,
        IUnknown *punkToolbarSite,
        WINBOOL fReserved);

    /*** IDeskBand methods ***/
    HRESULT (STDMETHODCALLTYPE *GetBandInfo)(
        IDeskBand2 *This,
        DWORD dwBandID,
        DWORD dwViewMode,
        DESKBANDINFO *pdbi);

    /*** IDeskBand2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CanRenderComposited)(
        IDeskBand2 *This,
        WINBOOL *pfCanRenderComposited);

    HRESULT (STDMETHODCALLTYPE *SetCompositionState)(
        IDeskBand2 *This,
        WINBOOL fCompositionEnabled);

    HRESULT (STDMETHODCALLTYPE *GetCompositionState)(
        IDeskBand2 *This,
        WINBOOL *pfCompositionEnabled);

    END_INTERFACE
} IDeskBand2Vtbl;

interface IDeskBand2 {
    CONST_VTBL IDeskBand2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDeskBand2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDeskBand2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDeskBand2_Release(This) (This)->lpVtbl->Release(This)
/*** IOleWindow methods ***/
#define IDeskBand2_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IDeskBand2_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
/*** IDockingWindow methods ***/
#define IDeskBand2_ShowDW(This,fShow) (This)->lpVtbl->ShowDW(This,fShow)
#define IDeskBand2_CloseDW(This,dwReserved) (This)->lpVtbl->CloseDW(This,dwReserved)
#define IDeskBand2_ResizeBorderDW(This,prcBorder,punkToolbarSite,fReserved) (This)->lpVtbl->ResizeBorderDW(This,prcBorder,punkToolbarSite,fReserved)
/*** IDeskBand methods ***/
#define IDeskBand2_GetBandInfo(This,dwBandID,dwViewMode,pdbi) (This)->lpVtbl->GetBandInfo(This,dwBandID,dwViewMode,pdbi)
/*** IDeskBand2 methods ***/
#define IDeskBand2_CanRenderComposited(This,pfCanRenderComposited) (This)->lpVtbl->CanRenderComposited(This,pfCanRenderComposited)
#define IDeskBand2_SetCompositionState(This,fCompositionEnabled) (This)->lpVtbl->SetCompositionState(This,fCompositionEnabled)
#define IDeskBand2_GetCompositionState(This,pfCompositionEnabled) (This)->lpVtbl->GetCompositionState(This,pfCompositionEnabled)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDeskBand2_QueryInterface(IDeskBand2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDeskBand2_AddRef(IDeskBand2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDeskBand2_Release(IDeskBand2* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static FORCEINLINE HRESULT IDeskBand2_GetWindow(IDeskBand2* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static FORCEINLINE HRESULT IDeskBand2_ContextSensitiveHelp(IDeskBand2* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IDockingWindow methods ***/
static FORCEINLINE HRESULT IDeskBand2_ShowDW(IDeskBand2* This,WINBOOL fShow) {
    return This->lpVtbl->ShowDW(This,fShow);
}
static FORCEINLINE HRESULT IDeskBand2_CloseDW(IDeskBand2* This,DWORD dwReserved) {
    return This->lpVtbl->CloseDW(This,dwReserved);
}
static FORCEINLINE HRESULT IDeskBand2_ResizeBorderDW(IDeskBand2* This,LPCRECT prcBorder,IUnknown *punkToolbarSite,WINBOOL fReserved) {
    return This->lpVtbl->ResizeBorderDW(This,prcBorder,punkToolbarSite,fReserved);
}
/*** IDeskBand methods ***/
static FORCEINLINE HRESULT IDeskBand2_GetBandInfo(IDeskBand2* This,DWORD dwBandID,DWORD dwViewMode,DESKBANDINFO *pdbi) {
    return This->lpVtbl->GetBandInfo(This,dwBandID,dwViewMode,pdbi);
}
/*** IDeskBand2 methods ***/
static FORCEINLINE HRESULT IDeskBand2_CanRenderComposited(IDeskBand2* This,WINBOOL *pfCanRenderComposited) {
    return This->lpVtbl->CanRenderComposited(This,pfCanRenderComposited);
}
static FORCEINLINE HRESULT IDeskBand2_SetCompositionState(IDeskBand2* This,WINBOOL fCompositionEnabled) {
    return This->lpVtbl->SetCompositionState(This,fCompositionEnabled);
}
static FORCEINLINE HRESULT IDeskBand2_GetCompositionState(IDeskBand2* This,WINBOOL *pfCompositionEnabled) {
    return This->lpVtbl->GetCompositionState(This,pfCompositionEnabled);
}
#endif
#endif

#endif


#endif  /* __IDeskBand2_INTERFACE_DEFINED__ */

#endif

/*****************************************************************************
 * ITaskbarList interface
 */
#ifndef __ITaskbarList_INTERFACE_DEFINED__
#define __ITaskbarList_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITaskbarList, 0x56fdf342, 0xfd6d, 0x11d0, 0x95,0x8a, 0x00,0x60,0x97,0xc9,0xa0,0x90);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("56fdf342-fd6d-11d0-958a-006097c9a090")
ITaskbarList : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE HrInit(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddTab(
        HWND hwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteTab(
        HWND hwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE ActivateTab(
        HWND hwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetActiveAlt(
        HWND hwnd) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITaskbarList, 0x56fdf342, 0xfd6d, 0x11d0, 0x95,0x8a, 0x00,0x60,0x97,0xc9,0xa0,0x90)
#endif
#else
typedef struct ITaskbarListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITaskbarList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITaskbarList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITaskbarList *This);

    /*** ITaskbarList methods ***/
    HRESULT (STDMETHODCALLTYPE *HrInit)(
        ITaskbarList *This);

    HRESULT (STDMETHODCALLTYPE *AddTab)(
        ITaskbarList *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *DeleteTab)(
        ITaskbarList *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *ActivateTab)(
        ITaskbarList *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *SetActiveAlt)(
        ITaskbarList *This,
        HWND hwnd);

    END_INTERFACE
} ITaskbarListVtbl;

interface ITaskbarList {
    CONST_VTBL ITaskbarListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITaskbarList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITaskbarList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITaskbarList_Release(This) (This)->lpVtbl->Release(This)
/*** ITaskbarList methods ***/
#define ITaskbarList_HrInit(This) (This)->lpVtbl->HrInit(This)
#define ITaskbarList_AddTab(This,hwnd) (This)->lpVtbl->AddTab(This,hwnd)
#define ITaskbarList_DeleteTab(This,hwnd) (This)->lpVtbl->DeleteTab(This,hwnd)
#define ITaskbarList_ActivateTab(This,hwnd) (This)->lpVtbl->ActivateTab(This,hwnd)
#define ITaskbarList_SetActiveAlt(This,hwnd) (This)->lpVtbl->SetActiveAlt(This,hwnd)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITaskbarList_QueryInterface(ITaskbarList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITaskbarList_AddRef(ITaskbarList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITaskbarList_Release(ITaskbarList* This) {
    return This->lpVtbl->Release(This);
}
/*** ITaskbarList methods ***/
static FORCEINLINE HRESULT ITaskbarList_HrInit(ITaskbarList* This) {
    return This->lpVtbl->HrInit(This);
}
static FORCEINLINE HRESULT ITaskbarList_AddTab(ITaskbarList* This,HWND hwnd) {
    return This->lpVtbl->AddTab(This,hwnd);
}
static FORCEINLINE HRESULT ITaskbarList_DeleteTab(ITaskbarList* This,HWND hwnd) {
    return This->lpVtbl->DeleteTab(This,hwnd);
}
static FORCEINLINE HRESULT ITaskbarList_ActivateTab(ITaskbarList* This,HWND hwnd) {
    return This->lpVtbl->ActivateTab(This,hwnd);
}
static FORCEINLINE HRESULT ITaskbarList_SetActiveAlt(ITaskbarList* This,HWND hwnd) {
    return This->lpVtbl->SetActiveAlt(This,hwnd);
}
#endif
#endif

#endif


#endif  /* __ITaskbarList_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ITaskbarList2 interface
 */
#ifndef __ITaskbarList2_INTERFACE_DEFINED__
#define __ITaskbarList2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITaskbarList2, 0x602d4995, 0xb13a, 0x429b, 0xa6,0x6e, 0x19,0x35,0xe4,0x4f,0x43,0x17);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("602d4995-b13a-429b-a66e-1935e44f4317")
ITaskbarList2 : public ITaskbarList
{
    virtual HRESULT STDMETHODCALLTYPE MarkFullscreenWindow(
        HWND hwnd,
        WINBOOL fFullscreen) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITaskbarList2, 0x602d4995, 0xb13a, 0x429b, 0xa6,0x6e, 0x19,0x35,0xe4,0x4f,0x43,0x17)
#endif
#else
typedef struct ITaskbarList2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITaskbarList2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITaskbarList2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITaskbarList2 *This);

    /*** ITaskbarList methods ***/
    HRESULT (STDMETHODCALLTYPE *HrInit)(
        ITaskbarList2 *This);

    HRESULT (STDMETHODCALLTYPE *AddTab)(
        ITaskbarList2 *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *DeleteTab)(
        ITaskbarList2 *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *ActivateTab)(
        ITaskbarList2 *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *SetActiveAlt)(
        ITaskbarList2 *This,
        HWND hwnd);

    /*** ITaskbarList2 methods ***/
    HRESULT (STDMETHODCALLTYPE *MarkFullscreenWindow)(
        ITaskbarList2 *This,
        HWND hwnd,
        WINBOOL fFullscreen);

    END_INTERFACE
} ITaskbarList2Vtbl;

interface ITaskbarList2 {
    CONST_VTBL ITaskbarList2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITaskbarList2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITaskbarList2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITaskbarList2_Release(This) (This)->lpVtbl->Release(This)
/*** ITaskbarList methods ***/
#define ITaskbarList2_HrInit(This) (This)->lpVtbl->HrInit(This)
#define ITaskbarList2_AddTab(This,hwnd) (This)->lpVtbl->AddTab(This,hwnd)
#define ITaskbarList2_DeleteTab(This,hwnd) (This)->lpVtbl->DeleteTab(This,hwnd)
#define ITaskbarList2_ActivateTab(This,hwnd) (This)->lpVtbl->ActivateTab(This,hwnd)
#define ITaskbarList2_SetActiveAlt(This,hwnd) (This)->lpVtbl->SetActiveAlt(This,hwnd)
/*** ITaskbarList2 methods ***/
#define ITaskbarList2_MarkFullscreenWindow(This,hwnd,fFullscreen) (This)->lpVtbl->MarkFullscreenWindow(This,hwnd,fFullscreen)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITaskbarList2_QueryInterface(ITaskbarList2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITaskbarList2_AddRef(ITaskbarList2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITaskbarList2_Release(ITaskbarList2* This) {
    return This->lpVtbl->Release(This);
}
/*** ITaskbarList methods ***/
static FORCEINLINE HRESULT ITaskbarList2_HrInit(ITaskbarList2* This) {
    return This->lpVtbl->HrInit(This);
}
static FORCEINLINE HRESULT ITaskbarList2_AddTab(ITaskbarList2* This,HWND hwnd) {
    return This->lpVtbl->AddTab(This,hwnd);
}
static FORCEINLINE HRESULT ITaskbarList2_DeleteTab(ITaskbarList2* This,HWND hwnd) {
    return This->lpVtbl->DeleteTab(This,hwnd);
}
static FORCEINLINE HRESULT ITaskbarList2_ActivateTab(ITaskbarList2* This,HWND hwnd) {
    return This->lpVtbl->ActivateTab(This,hwnd);
}
static FORCEINLINE HRESULT ITaskbarList2_SetActiveAlt(ITaskbarList2* This,HWND hwnd) {
    return This->lpVtbl->SetActiveAlt(This,hwnd);
}
/*** ITaskbarList2 methods ***/
static FORCEINLINE HRESULT ITaskbarList2_MarkFullscreenWindow(ITaskbarList2* This,HWND hwnd,WINBOOL fFullscreen) {
    return This->lpVtbl->MarkFullscreenWindow(This,hwnd,fFullscreen);
}
#endif
#endif

#endif


#endif  /* __ITaskbarList2_INTERFACE_DEFINED__ */


#if 0
typedef IUnknown *HIMAGELIST;
#endif

typedef enum THUMBBUTTONFLAGS {
    THBF_ENABLED = 0x0,
    THBF_DISABLED = 0x1,
    THBF_DISMISSONCLICK = 0x2,
    THBF_NOBACKGROUND = 0x4,
    THBF_HIDDEN = 0x8,
    THBF_NONINTERACTIVE = 0x10
} THUMBBUTTONFLAGS;

DEFINE_ENUM_FLAG_OPERATORS(THUMBBUTTONFLAGS)


typedef enum THUMBBUTTONMASK {
    THB_BITMAP = 0x1,
    THB_ICON = 0x2,
    THB_TOOLTIP = 0x4,
    THB_FLAGS = 0x8
} THUMBBUTTONMASK;

DEFINE_ENUM_FLAG_OPERATORS(THUMBBUTTONMASK)

#include <pshpack8.h>
typedef struct THUMBBUTTON {
    THUMBBUTTONMASK dwMask;
    UINT iId;
    UINT iBitmap;
    HICON hIcon;
    WCHAR szTip[260];
    THUMBBUTTONFLAGS dwFlags;
} THUMBBUTTON;
typedef struct THUMBBUTTON *LPTHUMBBUTTON;
#include <poppack.h>

#define THBN_CLICKED 0x1800

/*****************************************************************************
 * ITaskbarList3 interface
 */
#ifndef __ITaskbarList3_INTERFACE_DEFINED__
#define __ITaskbarList3_INTERFACE_DEFINED__

typedef enum TBPFLAG {
    TBPF_NOPROGRESS = 0x0,
    TBPF_INDETERMINATE = 0x1,
    TBPF_NORMAL = 0x2,
    TBPF_ERROR = 0x4,
    TBPF_PAUSED = 0x8
} TBPFLAG;

DEFINE_ENUM_FLAG_OPERATORS(TBPFLAG)

DEFINE_GUID(IID_ITaskbarList3, 0xea1afb91, 0x9e28, 0x4b86, 0x90,0xe9, 0x9e,0x9f,0x8a,0x5e,0xef,0xaf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")
ITaskbarList3 : public ITaskbarList2
{
    virtual HRESULT STDMETHODCALLTYPE SetProgressValue(
        HWND hwnd,
        ULONGLONG ullCompleted,
        ULONGLONG ullTotal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProgressState(
        HWND hwnd,
        TBPFLAG tbpFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterTab(
        HWND hwndTab,
        HWND hwndMDI) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterTab(
        HWND hwndTab) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTabOrder(
        HWND hwndTab,
        HWND hwndInsertBefore) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTabActive(
        HWND hwndTab,
        HWND hwndMDI,
        DWORD dwReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE ThumbBarAddButtons(
        HWND hwnd,
        UINT cButtons,
        LPTHUMBBUTTON pButton) = 0;

    virtual HRESULT STDMETHODCALLTYPE ThumbBarUpdateButtons(
        HWND hwnd,
        UINT cButtons,
        LPTHUMBBUTTON pButton) = 0;

    virtual HRESULT STDMETHODCALLTYPE ThumbBarSetImageList(
        HWND hwnd,
        HIMAGELIST himl) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOverlayIcon(
        HWND hwnd,
        HICON hIcon,
        LPCWSTR pszDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetThumbnailTooltip(
        HWND hwnd,
        LPCWSTR pszTip) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetThumbnailClip(
        HWND hwnd,
        RECT *prcClip) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITaskbarList3, 0xea1afb91, 0x9e28, 0x4b86, 0x90,0xe9, 0x9e,0x9f,0x8a,0x5e,0xef,0xaf)
#endif
#else
typedef struct ITaskbarList3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITaskbarList3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITaskbarList3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITaskbarList3 *This);

    /*** ITaskbarList methods ***/
    HRESULT (STDMETHODCALLTYPE *HrInit)(
        ITaskbarList3 *This);

    HRESULT (STDMETHODCALLTYPE *AddTab)(
        ITaskbarList3 *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *DeleteTab)(
        ITaskbarList3 *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *ActivateTab)(
        ITaskbarList3 *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *SetActiveAlt)(
        ITaskbarList3 *This,
        HWND hwnd);

    /*** ITaskbarList2 methods ***/
    HRESULT (STDMETHODCALLTYPE *MarkFullscreenWindow)(
        ITaskbarList3 *This,
        HWND hwnd,
        WINBOOL fFullscreen);

    /*** ITaskbarList3 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetProgressValue)(
        ITaskbarList3 *This,
        HWND hwnd,
        ULONGLONG ullCompleted,
        ULONGLONG ullTotal);

    HRESULT (STDMETHODCALLTYPE *SetProgressState)(
        ITaskbarList3 *This,
        HWND hwnd,
        TBPFLAG tbpFlags);

    HRESULT (STDMETHODCALLTYPE *RegisterTab)(
        ITaskbarList3 *This,
        HWND hwndTab,
        HWND hwndMDI);

    HRESULT (STDMETHODCALLTYPE *UnregisterTab)(
        ITaskbarList3 *This,
        HWND hwndTab);

    HRESULT (STDMETHODCALLTYPE *SetTabOrder)(
        ITaskbarList3 *This,
        HWND hwndTab,
        HWND hwndInsertBefore);

    HRESULT (STDMETHODCALLTYPE *SetTabActive)(
        ITaskbarList3 *This,
        HWND hwndTab,
        HWND hwndMDI,
        DWORD dwReserved);

    HRESULT (STDMETHODCALLTYPE *ThumbBarAddButtons)(
        ITaskbarList3 *This,
        HWND hwnd,
        UINT cButtons,
        LPTHUMBBUTTON pButton);

    HRESULT (STDMETHODCALLTYPE *ThumbBarUpdateButtons)(
        ITaskbarList3 *This,
        HWND hwnd,
        UINT cButtons,
        LPTHUMBBUTTON pButton);

    HRESULT (STDMETHODCALLTYPE *ThumbBarSetImageList)(
        ITaskbarList3 *This,
        HWND hwnd,
        HIMAGELIST himl);

    HRESULT (STDMETHODCALLTYPE *SetOverlayIcon)(
        ITaskbarList3 *This,
        HWND hwnd,
        HICON hIcon,
        LPCWSTR pszDescription);

    HRESULT (STDMETHODCALLTYPE *SetThumbnailTooltip)(
        ITaskbarList3 *This,
        HWND hwnd,
        LPCWSTR pszTip);

    HRESULT (STDMETHODCALLTYPE *SetThumbnailClip)(
        ITaskbarList3 *This,
        HWND hwnd,
        RECT *prcClip);

    END_INTERFACE
} ITaskbarList3Vtbl;

interface ITaskbarList3 {
    CONST_VTBL ITaskbarList3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITaskbarList3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITaskbarList3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITaskbarList3_Release(This) (This)->lpVtbl->Release(This)
/*** ITaskbarList methods ***/
#define ITaskbarList3_HrInit(This) (This)->lpVtbl->HrInit(This)
#define ITaskbarList3_AddTab(This,hwnd) (This)->lpVtbl->AddTab(This,hwnd)
#define ITaskbarList3_DeleteTab(This,hwnd) (This)->lpVtbl->DeleteTab(This,hwnd)
#define ITaskbarList3_ActivateTab(This,hwnd) (This)->lpVtbl->ActivateTab(This,hwnd)
#define ITaskbarList3_SetActiveAlt(This,hwnd) (This)->lpVtbl->SetActiveAlt(This,hwnd)
/*** ITaskbarList2 methods ***/
#define ITaskbarList3_MarkFullscreenWindow(This,hwnd,fFullscreen) (This)->lpVtbl->MarkFullscreenWindow(This,hwnd,fFullscreen)
/*** ITaskbarList3 methods ***/
#define ITaskbarList3_SetProgressValue(This,hwnd,ullCompleted,ullTotal) (This)->lpVtbl->SetProgressValue(This,hwnd,ullCompleted,ullTotal)
#define ITaskbarList3_SetProgressState(This,hwnd,tbpFlags) (This)->lpVtbl->SetProgressState(This,hwnd,tbpFlags)
#define ITaskbarList3_RegisterTab(This,hwndTab,hwndMDI) (This)->lpVtbl->RegisterTab(This,hwndTab,hwndMDI)
#define ITaskbarList3_UnregisterTab(This,hwndTab) (This)->lpVtbl->UnregisterTab(This,hwndTab)
#define ITaskbarList3_SetTabOrder(This,hwndTab,hwndInsertBefore) (This)->lpVtbl->SetTabOrder(This,hwndTab,hwndInsertBefore)
#define ITaskbarList3_SetTabActive(This,hwndTab,hwndMDI,dwReserved) (This)->lpVtbl->SetTabActive(This,hwndTab,hwndMDI,dwReserved)
#define ITaskbarList3_ThumbBarAddButtons(This,hwnd,cButtons,pButton) (This)->lpVtbl->ThumbBarAddButtons(This,hwnd,cButtons,pButton)
#define ITaskbarList3_ThumbBarUpdateButtons(This,hwnd,cButtons,pButton) (This)->lpVtbl->ThumbBarUpdateButtons(This,hwnd,cButtons,pButton)
#define ITaskbarList3_ThumbBarSetImageList(This,hwnd,himl) (This)->lpVtbl->ThumbBarSetImageList(This,hwnd,himl)
#define ITaskbarList3_SetOverlayIcon(This,hwnd,hIcon,pszDescription) (This)->lpVtbl->SetOverlayIcon(This,hwnd,hIcon,pszDescription)
#define ITaskbarList3_SetThumbnailTooltip(This,hwnd,pszTip) (This)->lpVtbl->SetThumbnailTooltip(This,hwnd,pszTip)
#define ITaskbarList3_SetThumbnailClip(This,hwnd,prcClip) (This)->lpVtbl->SetThumbnailClip(This,hwnd,prcClip)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITaskbarList3_QueryInterface(ITaskbarList3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITaskbarList3_AddRef(ITaskbarList3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITaskbarList3_Release(ITaskbarList3* This) {
    return This->lpVtbl->Release(This);
}
/*** ITaskbarList methods ***/
static FORCEINLINE HRESULT ITaskbarList3_HrInit(ITaskbarList3* This) {
    return This->lpVtbl->HrInit(This);
}
static FORCEINLINE HRESULT ITaskbarList3_AddTab(ITaskbarList3* This,HWND hwnd) {
    return This->lpVtbl->AddTab(This,hwnd);
}
static FORCEINLINE HRESULT ITaskbarList3_DeleteTab(ITaskbarList3* This,HWND hwnd) {
    return This->lpVtbl->DeleteTab(This,hwnd);
}
static FORCEINLINE HRESULT ITaskbarList3_ActivateTab(ITaskbarList3* This,HWND hwnd) {
    return This->lpVtbl->ActivateTab(This,hwnd);
}
static FORCEINLINE HRESULT ITaskbarList3_SetActiveAlt(ITaskbarList3* This,HWND hwnd) {
    return This->lpVtbl->SetActiveAlt(This,hwnd);
}
/*** ITaskbarList2 methods ***/
static FORCEINLINE HRESULT ITaskbarList3_MarkFullscreenWindow(ITaskbarList3* This,HWND hwnd,WINBOOL fFullscreen) {
    return This->lpVtbl->MarkFullscreenWindow(This,hwnd,fFullscreen);
}
/*** ITaskbarList3 methods ***/
static FORCEINLINE HRESULT ITaskbarList3_SetProgressValue(ITaskbarList3* This,HWND hwnd,ULONGLONG ullCompleted,ULONGLONG ullTotal) {
    return This->lpVtbl->SetProgressValue(This,hwnd,ullCompleted,ullTotal);
}
static FORCEINLINE HRESULT ITaskbarList3_SetProgressState(ITaskbarList3* This,HWND hwnd,TBPFLAG tbpFlags) {
    return This->lpVtbl->SetProgressState(This,hwnd,tbpFlags);
}
static FORCEINLINE HRESULT ITaskbarList3_RegisterTab(ITaskbarList3* This,HWND hwndTab,HWND hwndMDI) {
    return This->lpVtbl->RegisterTab(This,hwndTab,hwndMDI);
}
static FORCEINLINE HRESULT ITaskbarList3_UnregisterTab(ITaskbarList3* This,HWND hwndTab) {
    return This->lpVtbl->UnregisterTab(This,hwndTab);
}
static FORCEINLINE HRESULT ITaskbarList3_SetTabOrder(ITaskbarList3* This,HWND hwndTab,HWND hwndInsertBefore) {
    return This->lpVtbl->SetTabOrder(This,hwndTab,hwndInsertBefore);
}
static FORCEINLINE HRESULT ITaskbarList3_SetTabActive(ITaskbarList3* This,HWND hwndTab,HWND hwndMDI,DWORD dwReserved) {
    return This->lpVtbl->SetTabActive(This,hwndTab,hwndMDI,dwReserved);
}
static FORCEINLINE HRESULT ITaskbarList3_ThumbBarAddButtons(ITaskbarList3* This,HWND hwnd,UINT cButtons,LPTHUMBBUTTON pButton) {
    return This->lpVtbl->ThumbBarAddButtons(This,hwnd,cButtons,pButton);
}
static FORCEINLINE HRESULT ITaskbarList3_ThumbBarUpdateButtons(ITaskbarList3* This,HWND hwnd,UINT cButtons,LPTHUMBBUTTON pButton) {
    return This->lpVtbl->ThumbBarUpdateButtons(This,hwnd,cButtons,pButton);
}
static FORCEINLINE HRESULT ITaskbarList3_ThumbBarSetImageList(ITaskbarList3* This,HWND hwnd,HIMAGELIST himl) {
    return This->lpVtbl->ThumbBarSetImageList(This,hwnd,himl);
}
static FORCEINLINE HRESULT ITaskbarList3_SetOverlayIcon(ITaskbarList3* This,HWND hwnd,HICON hIcon,LPCWSTR pszDescription) {
    return This->lpVtbl->SetOverlayIcon(This,hwnd,hIcon,pszDescription);
}
static FORCEINLINE HRESULT ITaskbarList3_SetThumbnailTooltip(ITaskbarList3* This,HWND hwnd,LPCWSTR pszTip) {
    return This->lpVtbl->SetThumbnailTooltip(This,hwnd,pszTip);
}
static FORCEINLINE HRESULT ITaskbarList3_SetThumbnailClip(ITaskbarList3* This,HWND hwnd,RECT *prcClip) {
    return This->lpVtbl->SetThumbnailClip(This,hwnd,prcClip);
}
#endif
#endif

#endif


#endif  /* __ITaskbarList3_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ITaskbarList4 interface
 */
#ifndef __ITaskbarList4_INTERFACE_DEFINED__
#define __ITaskbarList4_INTERFACE_DEFINED__

typedef enum STPFLAG {
    STPF_NONE = 0x0,
    STPF_USEAPPTHUMBNAILALWAYS = 0x1,
    STPF_USEAPPTHUMBNAILWHENACTIVE = 0x2,
    STPF_USEAPPPEEKALWAYS = 0x4,
    STPF_USEAPPPEEKWHENACTIVE = 0x8
} STPFLAG;

DEFINE_ENUM_FLAG_OPERATORS(STPFLAG)

DEFINE_GUID(IID_ITaskbarList4, 0xc43dc798, 0x95d1, 0x4bea, 0x90,0x30, 0xbb,0x99,0xe2,0x98,0x3a,0x1a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c43dc798-95d1-4bea-9030-bb99e2983a1a")
ITaskbarList4 : public ITaskbarList3
{
    virtual HRESULT STDMETHODCALLTYPE SetTabProperties(
        HWND hwndTab,
        STPFLAG stpFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITaskbarList4, 0xc43dc798, 0x95d1, 0x4bea, 0x90,0x30, 0xbb,0x99,0xe2,0x98,0x3a,0x1a)
#endif
#else
typedef struct ITaskbarList4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITaskbarList4 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITaskbarList4 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITaskbarList4 *This);

    /*** ITaskbarList methods ***/
    HRESULT (STDMETHODCALLTYPE *HrInit)(
        ITaskbarList4 *This);

    HRESULT (STDMETHODCALLTYPE *AddTab)(
        ITaskbarList4 *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *DeleteTab)(
        ITaskbarList4 *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *ActivateTab)(
        ITaskbarList4 *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *SetActiveAlt)(
        ITaskbarList4 *This,
        HWND hwnd);

    /*** ITaskbarList2 methods ***/
    HRESULT (STDMETHODCALLTYPE *MarkFullscreenWindow)(
        ITaskbarList4 *This,
        HWND hwnd,
        WINBOOL fFullscreen);

    /*** ITaskbarList3 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetProgressValue)(
        ITaskbarList4 *This,
        HWND hwnd,
        ULONGLONG ullCompleted,
        ULONGLONG ullTotal);

    HRESULT (STDMETHODCALLTYPE *SetProgressState)(
        ITaskbarList4 *This,
        HWND hwnd,
        TBPFLAG tbpFlags);

    HRESULT (STDMETHODCALLTYPE *RegisterTab)(
        ITaskbarList4 *This,
        HWND hwndTab,
        HWND hwndMDI);

    HRESULT (STDMETHODCALLTYPE *UnregisterTab)(
        ITaskbarList4 *This,
        HWND hwndTab);

    HRESULT (STDMETHODCALLTYPE *SetTabOrder)(
        ITaskbarList4 *This,
        HWND hwndTab,
        HWND hwndInsertBefore);

    HRESULT (STDMETHODCALLTYPE *SetTabActive)(
        ITaskbarList4 *This,
        HWND hwndTab,
        HWND hwndMDI,
        DWORD dwReserved);

    HRESULT (STDMETHODCALLTYPE *ThumbBarAddButtons)(
        ITaskbarList4 *This,
        HWND hwnd,
        UINT cButtons,
        LPTHUMBBUTTON pButton);

    HRESULT (STDMETHODCALLTYPE *ThumbBarUpdateButtons)(
        ITaskbarList4 *This,
        HWND hwnd,
        UINT cButtons,
        LPTHUMBBUTTON pButton);

    HRESULT (STDMETHODCALLTYPE *ThumbBarSetImageList)(
        ITaskbarList4 *This,
        HWND hwnd,
        HIMAGELIST himl);

    HRESULT (STDMETHODCALLTYPE *SetOverlayIcon)(
        ITaskbarList4 *This,
        HWND hwnd,
        HICON hIcon,
        LPCWSTR pszDescription);

    HRESULT (STDMETHODCALLTYPE *SetThumbnailTooltip)(
        ITaskbarList4 *This,
        HWND hwnd,
        LPCWSTR pszTip);

    HRESULT (STDMETHODCALLTYPE *SetThumbnailClip)(
        ITaskbarList4 *This,
        HWND hwnd,
        RECT *prcClip);

    /*** ITaskbarList4 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetTabProperties)(
        ITaskbarList4 *This,
        HWND hwndTab,
        STPFLAG stpFlags);

    END_INTERFACE
} ITaskbarList4Vtbl;

interface ITaskbarList4 {
    CONST_VTBL ITaskbarList4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITaskbarList4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITaskbarList4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITaskbarList4_Release(This) (This)->lpVtbl->Release(This)
/*** ITaskbarList methods ***/
#define ITaskbarList4_HrInit(This) (This)->lpVtbl->HrInit(This)
#define ITaskbarList4_AddTab(This,hwnd) (This)->lpVtbl->AddTab(This,hwnd)
#define ITaskbarList4_DeleteTab(This,hwnd) (This)->lpVtbl->DeleteTab(This,hwnd)
#define ITaskbarList4_ActivateTab(This,hwnd) (This)->lpVtbl->ActivateTab(This,hwnd)
#define ITaskbarList4_SetActiveAlt(This,hwnd) (This)->lpVtbl->SetActiveAlt(This,hwnd)
/*** ITaskbarList2 methods ***/
#define ITaskbarList4_MarkFullscreenWindow(This,hwnd,fFullscreen) (This)->lpVtbl->MarkFullscreenWindow(This,hwnd,fFullscreen)
/*** ITaskbarList3 methods ***/
#define ITaskbarList4_SetProgressValue(This,hwnd,ullCompleted,ullTotal) (This)->lpVtbl->SetProgressValue(This,hwnd,ullCompleted,ullTotal)
#define ITaskbarList4_SetProgressState(This,hwnd,tbpFlags) (This)->lpVtbl->SetProgressState(This,hwnd,tbpFlags)
#define ITaskbarList4_RegisterTab(This,hwndTab,hwndMDI) (This)->lpVtbl->RegisterTab(This,hwndTab,hwndMDI)
#define ITaskbarList4_UnregisterTab(This,hwndTab) (This)->lpVtbl->UnregisterTab(This,hwndTab)
#define ITaskbarList4_SetTabOrder(This,hwndTab,hwndInsertBefore) (This)->lpVtbl->SetTabOrder(This,hwndTab,hwndInsertBefore)
#define ITaskbarList4_SetTabActive(This,hwndTab,hwndMDI,dwReserved) (This)->lpVtbl->SetTabActive(This,hwndTab,hwndMDI,dwReserved)
#define ITaskbarList4_ThumbBarAddButtons(This,hwnd,cButtons,pButton) (This)->lpVtbl->ThumbBarAddButtons(This,hwnd,cButtons,pButton)
#define ITaskbarList4_ThumbBarUpdateButtons(This,hwnd,cButtons,pButton) (This)->lpVtbl->ThumbBarUpdateButtons(This,hwnd,cButtons,pButton)
#define ITaskbarList4_ThumbBarSetImageList(This,hwnd,himl) (This)->lpVtbl->ThumbBarSetImageList(This,hwnd,himl)
#define ITaskbarList4_SetOverlayIcon(This,hwnd,hIcon,pszDescription) (This)->lpVtbl->SetOverlayIcon(This,hwnd,hIcon,pszDescription)
#define ITaskbarList4_SetThumbnailTooltip(This,hwnd,pszTip) (This)->lpVtbl->SetThumbnailTooltip(This,hwnd,pszTip)
#define ITaskbarList4_SetThumbnailClip(This,hwnd,prcClip) (This)->lpVtbl->SetThumbnailClip(This,hwnd,prcClip)
/*** ITaskbarList4 methods ***/
#define ITaskbarList4_SetTabProperties(This,hwndTab,stpFlags) (This)->lpVtbl->SetTabProperties(This,hwndTab,stpFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITaskbarList4_QueryInterface(ITaskbarList4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITaskbarList4_AddRef(ITaskbarList4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITaskbarList4_Release(ITaskbarList4* This) {
    return This->lpVtbl->Release(This);
}
/*** ITaskbarList methods ***/
static FORCEINLINE HRESULT ITaskbarList4_HrInit(ITaskbarList4* This) {
    return This->lpVtbl->HrInit(This);
}
static FORCEINLINE HRESULT ITaskbarList4_AddTab(ITaskbarList4* This,HWND hwnd) {
    return This->lpVtbl->AddTab(This,hwnd);
}
static FORCEINLINE HRESULT ITaskbarList4_DeleteTab(ITaskbarList4* This,HWND hwnd) {
    return This->lpVtbl->DeleteTab(This,hwnd);
}
static FORCEINLINE HRESULT ITaskbarList4_ActivateTab(ITaskbarList4* This,HWND hwnd) {
    return This->lpVtbl->ActivateTab(This,hwnd);
}
static FORCEINLINE HRESULT ITaskbarList4_SetActiveAlt(ITaskbarList4* This,HWND hwnd) {
    return This->lpVtbl->SetActiveAlt(This,hwnd);
}
/*** ITaskbarList2 methods ***/
static FORCEINLINE HRESULT ITaskbarList4_MarkFullscreenWindow(ITaskbarList4* This,HWND hwnd,WINBOOL fFullscreen) {
    return This->lpVtbl->MarkFullscreenWindow(This,hwnd,fFullscreen);
}
/*** ITaskbarList3 methods ***/
static FORCEINLINE HRESULT ITaskbarList4_SetProgressValue(ITaskbarList4* This,HWND hwnd,ULONGLONG ullCompleted,ULONGLONG ullTotal) {
    return This->lpVtbl->SetProgressValue(This,hwnd,ullCompleted,ullTotal);
}
static FORCEINLINE HRESULT ITaskbarList4_SetProgressState(ITaskbarList4* This,HWND hwnd,TBPFLAG tbpFlags) {
    return This->lpVtbl->SetProgressState(This,hwnd,tbpFlags);
}
static FORCEINLINE HRESULT ITaskbarList4_RegisterTab(ITaskbarList4* This,HWND hwndTab,HWND hwndMDI) {
    return This->lpVtbl->RegisterTab(This,hwndTab,hwndMDI);
}
static FORCEINLINE HRESULT ITaskbarList4_UnregisterTab(ITaskbarList4* This,HWND hwndTab) {
    return This->lpVtbl->UnregisterTab(This,hwndTab);
}
static FORCEINLINE HRESULT ITaskbarList4_SetTabOrder(ITaskbarList4* This,HWND hwndTab,HWND hwndInsertBefore) {
    return This->lpVtbl->SetTabOrder(This,hwndTab,hwndInsertBefore);
}
static FORCEINLINE HRESULT ITaskbarList4_SetTabActive(ITaskbarList4* This,HWND hwndTab,HWND hwndMDI,DWORD dwReserved) {
    return This->lpVtbl->SetTabActive(This,hwndTab,hwndMDI,dwReserved);
}
static FORCEINLINE HRESULT ITaskbarList4_ThumbBarAddButtons(ITaskbarList4* This,HWND hwnd,UINT cButtons,LPTHUMBBUTTON pButton) {
    return This->lpVtbl->ThumbBarAddButtons(This,hwnd,cButtons,pButton);
}
static FORCEINLINE HRESULT ITaskbarList4_ThumbBarUpdateButtons(ITaskbarList4* This,HWND hwnd,UINT cButtons,LPTHUMBBUTTON pButton) {
    return This->lpVtbl->ThumbBarUpdateButtons(This,hwnd,cButtons,pButton);
}
static FORCEINLINE HRESULT ITaskbarList4_ThumbBarSetImageList(ITaskbarList4* This,HWND hwnd,HIMAGELIST himl) {
    return This->lpVtbl->ThumbBarSetImageList(This,hwnd,himl);
}
static FORCEINLINE HRESULT ITaskbarList4_SetOverlayIcon(ITaskbarList4* This,HWND hwnd,HICON hIcon,LPCWSTR pszDescription) {
    return This->lpVtbl->SetOverlayIcon(This,hwnd,hIcon,pszDescription);
}
static FORCEINLINE HRESULT ITaskbarList4_SetThumbnailTooltip(ITaskbarList4* This,HWND hwnd,LPCWSTR pszTip) {
    return This->lpVtbl->SetThumbnailTooltip(This,hwnd,pszTip);
}
static FORCEINLINE HRESULT ITaskbarList4_SetThumbnailClip(ITaskbarList4* This,HWND hwnd,RECT *prcClip) {
    return This->lpVtbl->SetThumbnailClip(This,hwnd,prcClip);
}
/*** ITaskbarList4 methods ***/
static FORCEINLINE HRESULT ITaskbarList4_SetTabProperties(ITaskbarList4* This,HWND hwndTab,STPFLAG stpFlags) {
    return This->lpVtbl->SetTabProperties(This,hwndTab,stpFlags);
}
#endif
#endif

#endif


#endif  /* __ITaskbarList4_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IStartMenuPinnedList interface
 */
#ifndef __IStartMenuPinnedList_INTERFACE_DEFINED__
#define __IStartMenuPinnedList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IStartMenuPinnedList, 0x4cd19ada, 0x25a5, 0x4a32, 0xb3,0xb7, 0x34,0x7b,0xee,0x5b,0xe3,0x6b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4cd19ada-25a5-4a32-b3b7-347bee5be36b")
IStartMenuPinnedList : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RemoveFromList(
        IShellItem *pitem) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IStartMenuPinnedList, 0x4cd19ada, 0x25a5, 0x4a32, 0xb3,0xb7, 0x34,0x7b,0xee,0x5b,0xe3,0x6b)
#endif
#else
typedef struct IStartMenuPinnedListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IStartMenuPinnedList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IStartMenuPinnedList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IStartMenuPinnedList *This);

    /*** IStartMenuPinnedList methods ***/
    HRESULT (STDMETHODCALLTYPE *RemoveFromList)(
        IStartMenuPinnedList *This,
        IShellItem *pitem);

    END_INTERFACE
} IStartMenuPinnedListVtbl;

interface IStartMenuPinnedList {
    CONST_VTBL IStartMenuPinnedListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IStartMenuPinnedList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IStartMenuPinnedList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IStartMenuPinnedList_Release(This) (This)->lpVtbl->Release(This)
/*** IStartMenuPinnedList methods ***/
#define IStartMenuPinnedList_RemoveFromList(This,pitem) (This)->lpVtbl->RemoveFromList(This,pitem)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IStartMenuPinnedList_QueryInterface(IStartMenuPinnedList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IStartMenuPinnedList_AddRef(IStartMenuPinnedList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IStartMenuPinnedList_Release(IStartMenuPinnedList* This) {
    return This->lpVtbl->Release(This);
}
/*** IStartMenuPinnedList methods ***/
static FORCEINLINE HRESULT IStartMenuPinnedList_RemoveFromList(IStartMenuPinnedList* This,IShellItem *pitem) {
    return This->lpVtbl->RemoveFromList(This,pitem);
}
#endif
#endif

#endif


#endif  /* __IStartMenuPinnedList_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ICDBurn interface
 */
#ifndef __ICDBurn_INTERFACE_DEFINED__
#define __ICDBurn_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICDBurn, 0x3d73a659, 0xe5d0, 0x4d42, 0xaf,0xc0, 0x51,0x21,0xba,0x42,0x5c,0x8d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3d73a659-e5d0-4d42-afc0-5121ba425c8d")
ICDBurn : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetRecorderDriveLetter(
        LPWSTR pszDrive,
        UINT cch) = 0;

    virtual HRESULT STDMETHODCALLTYPE Burn(
        HWND hwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE HasRecordableDrive(
        WINBOOL *pfHasRecorder) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICDBurn, 0x3d73a659, 0xe5d0, 0x4d42, 0xaf,0xc0, 0x51,0x21,0xba,0x42,0x5c,0x8d)
#endif
#else
typedef struct ICDBurnVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICDBurn *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICDBurn *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICDBurn *This);

    /*** ICDBurn methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRecorderDriveLetter)(
        ICDBurn *This,
        LPWSTR pszDrive,
        UINT cch);

    HRESULT (STDMETHODCALLTYPE *Burn)(
        ICDBurn *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *HasRecordableDrive)(
        ICDBurn *This,
        WINBOOL *pfHasRecorder);

    END_INTERFACE
} ICDBurnVtbl;

interface ICDBurn {
    CONST_VTBL ICDBurnVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICDBurn_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICDBurn_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICDBurn_Release(This) (This)->lpVtbl->Release(This)
/*** ICDBurn methods ***/
#define ICDBurn_GetRecorderDriveLetter(This,pszDrive,cch) (This)->lpVtbl->GetRecorderDriveLetter(This,pszDrive,cch)
#define ICDBurn_Burn(This,hwnd) (This)->lpVtbl->Burn(This,hwnd)
#define ICDBurn_HasRecordableDrive(This,pfHasRecorder) (This)->lpVtbl->HasRecordableDrive(This,pfHasRecorder)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICDBurn_QueryInterface(ICDBurn* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICDBurn_AddRef(ICDBurn* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICDBurn_Release(ICDBurn* This) {
    return This->lpVtbl->Release(This);
}
/*** ICDBurn methods ***/
static FORCEINLINE HRESULT ICDBurn_GetRecorderDriveLetter(ICDBurn* This,LPWSTR pszDrive,UINT cch) {
    return This->lpVtbl->GetRecorderDriveLetter(This,pszDrive,cch);
}
static FORCEINLINE HRESULT ICDBurn_Burn(ICDBurn* This,HWND hwnd) {
    return This->lpVtbl->Burn(This,hwnd);
}
static FORCEINLINE HRESULT ICDBurn_HasRecordableDrive(ICDBurn* This,WINBOOL *pfHasRecorder) {
    return This->lpVtbl->HasRecordableDrive(This,pfHasRecorder);
}
#endif
#endif

#endif


#endif  /* __ICDBurn_INTERFACE_DEFINED__ */


#define IDD_WIZEXTN_FIRST 0x5000
#define IDD_WIZEXTN_LAST 0x5100

/*****************************************************************************
 * IWizardSite interface
 */
#ifndef __IWizardSite_INTERFACE_DEFINED__
#define __IWizardSite_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWizardSite, 0x88960f5b, 0x422f, 0x4e7b, 0x80,0x13, 0x73,0x41,0x53,0x81,0xc3,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("88960f5b-422f-4e7b-8013-73415381c3c3")
IWizardSite : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPreviousPage(
        HPROPSHEETPAGE *phpage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNextPage(
        HPROPSHEETPAGE *phpage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCancelledPage(
        HPROPSHEETPAGE *phpage) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWizardSite, 0x88960f5b, 0x422f, 0x4e7b, 0x80,0x13, 0x73,0x41,0x53,0x81,0xc3,0xc3)
#endif
#else
typedef struct IWizardSiteVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWizardSite *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWizardSite *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWizardSite *This);

    /*** IWizardSite methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPreviousPage)(
        IWizardSite *This,
        HPROPSHEETPAGE *phpage);

    HRESULT (STDMETHODCALLTYPE *GetNextPage)(
        IWizardSite *This,
        HPROPSHEETPAGE *phpage);

    HRESULT (STDMETHODCALLTYPE *GetCancelledPage)(
        IWizardSite *This,
        HPROPSHEETPAGE *phpage);

    END_INTERFACE
} IWizardSiteVtbl;

interface IWizardSite {
    CONST_VTBL IWizardSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWizardSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWizardSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWizardSite_Release(This) (This)->lpVtbl->Release(This)
/*** IWizardSite methods ***/
#define IWizardSite_GetPreviousPage(This,phpage) (This)->lpVtbl->GetPreviousPage(This,phpage)
#define IWizardSite_GetNextPage(This,phpage) (This)->lpVtbl->GetNextPage(This,phpage)
#define IWizardSite_GetCancelledPage(This,phpage) (This)->lpVtbl->GetCancelledPage(This,phpage)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWizardSite_QueryInterface(IWizardSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWizardSite_AddRef(IWizardSite* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWizardSite_Release(IWizardSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IWizardSite methods ***/
static FORCEINLINE HRESULT IWizardSite_GetPreviousPage(IWizardSite* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetPreviousPage(This,phpage);
}
static FORCEINLINE HRESULT IWizardSite_GetNextPage(IWizardSite* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetNextPage(This,phpage);
}
static FORCEINLINE HRESULT IWizardSite_GetCancelledPage(IWizardSite* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetCancelledPage(This,phpage);
}
#endif
#endif

#endif


#endif  /* __IWizardSite_INTERFACE_DEFINED__ */


#define SID_WizardSite IID_IWizardSite

/*****************************************************************************
 * IWizardExtension interface
 */
#ifndef __IWizardExtension_INTERFACE_DEFINED__
#define __IWizardExtension_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWizardExtension, 0xc02ea696, 0x86cc, 0x491e, 0x9b,0x23, 0x74,0x39,0x4a,0x04,0x44,0xa8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c02ea696-86cc-491e-9b23-74394a0444a8")
IWizardExtension : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddPages(
        HPROPSHEETPAGE *aPages,
        UINT cPages,
        UINT *pnPagesAdded) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFirstPage(
        HPROPSHEETPAGE *phpage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLastPage(
        HPROPSHEETPAGE *phpage) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWizardExtension, 0xc02ea696, 0x86cc, 0x491e, 0x9b,0x23, 0x74,0x39,0x4a,0x04,0x44,0xa8)
#endif
#else
typedef struct IWizardExtensionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWizardExtension *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWizardExtension *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWizardExtension *This);

    /*** IWizardExtension methods ***/
    HRESULT (STDMETHODCALLTYPE *AddPages)(
        IWizardExtension *This,
        HPROPSHEETPAGE *aPages,
        UINT cPages,
        UINT *pnPagesAdded);

    HRESULT (STDMETHODCALLTYPE *GetFirstPage)(
        IWizardExtension *This,
        HPROPSHEETPAGE *phpage);

    HRESULT (STDMETHODCALLTYPE *GetLastPage)(
        IWizardExtension *This,
        HPROPSHEETPAGE *phpage);

    END_INTERFACE
} IWizardExtensionVtbl;

interface IWizardExtension {
    CONST_VTBL IWizardExtensionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWizardExtension_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWizardExtension_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWizardExtension_Release(This) (This)->lpVtbl->Release(This)
/*** IWizardExtension methods ***/
#define IWizardExtension_AddPages(This,aPages,cPages,pnPagesAdded) (This)->lpVtbl->AddPages(This,aPages,cPages,pnPagesAdded)
#define IWizardExtension_GetFirstPage(This,phpage) (This)->lpVtbl->GetFirstPage(This,phpage)
#define IWizardExtension_GetLastPage(This,phpage) (This)->lpVtbl->GetLastPage(This,phpage)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWizardExtension_QueryInterface(IWizardExtension* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWizardExtension_AddRef(IWizardExtension* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWizardExtension_Release(IWizardExtension* This) {
    return This->lpVtbl->Release(This);
}
/*** IWizardExtension methods ***/
static FORCEINLINE HRESULT IWizardExtension_AddPages(IWizardExtension* This,HPROPSHEETPAGE *aPages,UINT cPages,UINT *pnPagesAdded) {
    return This->lpVtbl->AddPages(This,aPages,cPages,pnPagesAdded);
}
static FORCEINLINE HRESULT IWizardExtension_GetFirstPage(IWizardExtension* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetFirstPage(This,phpage);
}
static FORCEINLINE HRESULT IWizardExtension_GetLastPage(IWizardExtension* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetLastPage(This,phpage);
}
#endif
#endif

#endif


#endif  /* __IWizardExtension_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IWebWizardExtension interface
 */
#ifndef __IWebWizardExtension_INTERFACE_DEFINED__
#define __IWebWizardExtension_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWebWizardExtension, 0x0e6b3f66, 0x98d1, 0x48c0, 0xa2,0x22, 0xfb,0xde,0x74,0xe2,0xfb,0xc5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0e6b3f66-98d1-48c0-a222-fbde74e2fbc5")
IWebWizardExtension : public IWizardExtension
{
    virtual HRESULT STDMETHODCALLTYPE SetInitialURL(
        LPCWSTR pszURL) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetErrorURL(
        LPCWSTR pszErrorURL) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWebWizardExtension, 0x0e6b3f66, 0x98d1, 0x48c0, 0xa2,0x22, 0xfb,0xde,0x74,0xe2,0xfb,0xc5)
#endif
#else
typedef struct IWebWizardExtensionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWebWizardExtension *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWebWizardExtension *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWebWizardExtension *This);

    /*** IWizardExtension methods ***/
    HRESULT (STDMETHODCALLTYPE *AddPages)(
        IWebWizardExtension *This,
        HPROPSHEETPAGE *aPages,
        UINT cPages,
        UINT *pnPagesAdded);

    HRESULT (STDMETHODCALLTYPE *GetFirstPage)(
        IWebWizardExtension *This,
        HPROPSHEETPAGE *phpage);

    HRESULT (STDMETHODCALLTYPE *GetLastPage)(
        IWebWizardExtension *This,
        HPROPSHEETPAGE *phpage);

    /*** IWebWizardExtension methods ***/
    HRESULT (STDMETHODCALLTYPE *SetInitialURL)(
        IWebWizardExtension *This,
        LPCWSTR pszURL);

    HRESULT (STDMETHODCALLTYPE *SetErrorURL)(
        IWebWizardExtension *This,
        LPCWSTR pszErrorURL);

    END_INTERFACE
} IWebWizardExtensionVtbl;

interface IWebWizardExtension {
    CONST_VTBL IWebWizardExtensionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWebWizardExtension_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWebWizardExtension_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWebWizardExtension_Release(This) (This)->lpVtbl->Release(This)
/*** IWizardExtension methods ***/
#define IWebWizardExtension_AddPages(This,aPages,cPages,pnPagesAdded) (This)->lpVtbl->AddPages(This,aPages,cPages,pnPagesAdded)
#define IWebWizardExtension_GetFirstPage(This,phpage) (This)->lpVtbl->GetFirstPage(This,phpage)
#define IWebWizardExtension_GetLastPage(This,phpage) (This)->lpVtbl->GetLastPage(This,phpage)
/*** IWebWizardExtension methods ***/
#define IWebWizardExtension_SetInitialURL(This,pszURL) (This)->lpVtbl->SetInitialURL(This,pszURL)
#define IWebWizardExtension_SetErrorURL(This,pszErrorURL) (This)->lpVtbl->SetErrorURL(This,pszErrorURL)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWebWizardExtension_QueryInterface(IWebWizardExtension* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWebWizardExtension_AddRef(IWebWizardExtension* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWebWizardExtension_Release(IWebWizardExtension* This) {
    return This->lpVtbl->Release(This);
}
/*** IWizardExtension methods ***/
static FORCEINLINE HRESULT IWebWizardExtension_AddPages(IWebWizardExtension* This,HPROPSHEETPAGE *aPages,UINT cPages,UINT *pnPagesAdded) {
    return This->lpVtbl->AddPages(This,aPages,cPages,pnPagesAdded);
}
static FORCEINLINE HRESULT IWebWizardExtension_GetFirstPage(IWebWizardExtension* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetFirstPage(This,phpage);
}
static FORCEINLINE HRESULT IWebWizardExtension_GetLastPage(IWebWizardExtension* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetLastPage(This,phpage);
}
/*** IWebWizardExtension methods ***/
static FORCEINLINE HRESULT IWebWizardExtension_SetInitialURL(IWebWizardExtension* This,LPCWSTR pszURL) {
    return This->lpVtbl->SetInitialURL(This,pszURL);
}
static FORCEINLINE HRESULT IWebWizardExtension_SetErrorURL(IWebWizardExtension* This,LPCWSTR pszErrorURL) {
    return This->lpVtbl->SetErrorURL(This,pszErrorURL);
}
#endif
#endif

#endif


#endif  /* __IWebWizardExtension_INTERFACE_DEFINED__ */


#define SID_WebWizardHost IID_IWebWizardExtension

#define SHPWHF_NORECOMPRESS 0x00000001
#define SHPWHF_NONETPLACECREATE 0x00000002
#define SHPWHF_NOFILESELECTOR 0x00000004
#define SHPWHF_USEMRU 0x00000008
#if NTDDI_VERSION >= NTDDI_VISTA
#define SHPWHF_ANYLOCATION 0x00000100
#endif
#define SHPWHF_VALIDATEVIAWEBFOLDERS 0x00010000

#ifndef __IXMLDOMDocument_FWD_DEFINED__
#define __IXMLDOMDocument_FWD_DEFINED__
typedef interface IXMLDOMDocument IXMLDOMDocument;
#ifdef __cplusplus
interface IXMLDOMDocument;
#endif /* __cplusplus */
#endif


/*****************************************************************************
 * IPublishingWizard interface
 */
#ifndef __IPublishingWizard_INTERFACE_DEFINED__
#define __IPublishingWizard_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPublishingWizard, 0xaa9198bb, 0xccec, 0x472d, 0xbe,0xed, 0x19,0xa4,0xf6,0x73,0x3f,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("aa9198bb-ccec-472d-beed-19a4f6733f7a")
IPublishingWizard : public IWizardExtension
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IDataObject *pdo,
        DWORD dwOptions,
        LPCWSTR pszServiceScope) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransferManifest(
        HRESULT *phrFromTransfer,
        IXMLDOMDocument **pdocManifest) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPublishingWizard, 0xaa9198bb, 0xccec, 0x472d, 0xbe,0xed, 0x19,0xa4,0xf6,0x73,0x3f,0x7a)
#endif
#else
typedef struct IPublishingWizardVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPublishingWizard *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPublishingWizard *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPublishingWizard *This);

    /*** IWizardExtension methods ***/
    HRESULT (STDMETHODCALLTYPE *AddPages)(
        IPublishingWizard *This,
        HPROPSHEETPAGE *aPages,
        UINT cPages,
        UINT *pnPagesAdded);

    HRESULT (STDMETHODCALLTYPE *GetFirstPage)(
        IPublishingWizard *This,
        HPROPSHEETPAGE *phpage);

    HRESULT (STDMETHODCALLTYPE *GetLastPage)(
        IPublishingWizard *This,
        HPROPSHEETPAGE *phpage);

    /*** IPublishingWizard methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IPublishingWizard *This,
        IDataObject *pdo,
        DWORD dwOptions,
        LPCWSTR pszServiceScope);

    HRESULT (STDMETHODCALLTYPE *GetTransferManifest)(
        IPublishingWizard *This,
        HRESULT *phrFromTransfer,
        IXMLDOMDocument **pdocManifest);

    END_INTERFACE
} IPublishingWizardVtbl;

interface IPublishingWizard {
    CONST_VTBL IPublishingWizardVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPublishingWizard_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPublishingWizard_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPublishingWizard_Release(This) (This)->lpVtbl->Release(This)
/*** IWizardExtension methods ***/
#define IPublishingWizard_AddPages(This,aPages,cPages,pnPagesAdded) (This)->lpVtbl->AddPages(This,aPages,cPages,pnPagesAdded)
#define IPublishingWizard_GetFirstPage(This,phpage) (This)->lpVtbl->GetFirstPage(This,phpage)
#define IPublishingWizard_GetLastPage(This,phpage) (This)->lpVtbl->GetLastPage(This,phpage)
/*** IPublishingWizard methods ***/
#define IPublishingWizard_Initialize(This,pdo,dwOptions,pszServiceScope) (This)->lpVtbl->Initialize(This,pdo,dwOptions,pszServiceScope)
#define IPublishingWizard_GetTransferManifest(This,phrFromTransfer,pdocManifest) (This)->lpVtbl->GetTransferManifest(This,phrFromTransfer,pdocManifest)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPublishingWizard_QueryInterface(IPublishingWizard* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPublishingWizard_AddRef(IPublishingWizard* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPublishingWizard_Release(IPublishingWizard* This) {
    return This->lpVtbl->Release(This);
}
/*** IWizardExtension methods ***/
static FORCEINLINE HRESULT IPublishingWizard_AddPages(IPublishingWizard* This,HPROPSHEETPAGE *aPages,UINT cPages,UINT *pnPagesAdded) {
    return This->lpVtbl->AddPages(This,aPages,cPages,pnPagesAdded);
}
static FORCEINLINE HRESULT IPublishingWizard_GetFirstPage(IPublishingWizard* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetFirstPage(This,phpage);
}
static FORCEINLINE HRESULT IPublishingWizard_GetLastPage(IPublishingWizard* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetLastPage(This,phpage);
}
/*** IPublishingWizard methods ***/
static FORCEINLINE HRESULT IPublishingWizard_Initialize(IPublishingWizard* This,IDataObject *pdo,DWORD dwOptions,LPCWSTR pszServiceScope) {
    return This->lpVtbl->Initialize(This,pdo,dwOptions,pszServiceScope);
}
static FORCEINLINE HRESULT IPublishingWizard_GetTransferManifest(IPublishingWizard* This,HRESULT *phrFromTransfer,IXMLDOMDocument **pdocManifest) {
    return This->lpVtbl->GetTransferManifest(This,phrFromTransfer,pdocManifest);
}
#endif
#endif

#endif


#endif  /* __IPublishingWizard_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IFolderViewHost interface
 */
#ifndef __IFolderViewHost_INTERFACE_DEFINED__
#define __IFolderViewHost_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFolderViewHost, 0x1ea58f02, 0xd55a, 0x411d, 0xb0,0x9e, 0x9e,0x65,0xac,0x21,0x60,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1ea58f02-d55a-411d-b09e-9e65ac21605b")
IFolderViewHost : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        HWND hwndParent,
        IDataObject *pdo,
        RECT *prc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFolderViewHost, 0x1ea58f02, 0xd55a, 0x411d, 0xb0,0x9e, 0x9e,0x65,0xac,0x21,0x60,0x5b)
#endif
#else
typedef struct IFolderViewHostVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFolderViewHost *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFolderViewHost *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFolderViewHost *This);

    /*** IFolderViewHost methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IFolderViewHost *This,
        HWND hwndParent,
        IDataObject *pdo,
        RECT *prc);

    END_INTERFACE
} IFolderViewHostVtbl;

interface IFolderViewHost {
    CONST_VTBL IFolderViewHostVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFolderViewHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFolderViewHost_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFolderViewHost_Release(This) (This)->lpVtbl->Release(This)
/*** IFolderViewHost methods ***/
#define IFolderViewHost_Initialize(This,hwndParent,pdo,prc) (This)->lpVtbl->Initialize(This,hwndParent,pdo,prc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFolderViewHost_QueryInterface(IFolderViewHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFolderViewHost_AddRef(IFolderViewHost* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFolderViewHost_Release(IFolderViewHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderViewHost methods ***/
static FORCEINLINE HRESULT IFolderViewHost_Initialize(IFolderViewHost* This,HWND hwndParent,IDataObject *pdo,RECT *prc) {
    return This->lpVtbl->Initialize(This,hwndParent,pdo,prc);
}
#endif
#endif

#endif


#endif  /* __IFolderViewHost_INTERFACE_DEFINED__ */


#if _WIN32_IE >= _WIN32_IE_IE70
/*****************************************************************************
 * IExplorerBrowserEvents interface
 */
#ifndef __IExplorerBrowserEvents_INTERFACE_DEFINED__
#define __IExplorerBrowserEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExplorerBrowserEvents, 0x361bbdc7, 0xe6ee, 0x4e13, 0xbe,0x58, 0x58,0xe2,0x24,0x0c,0x81,0x0f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("361bbdc7-e6ee-4e13-be58-58e2240c810f")
IExplorerBrowserEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnNavigationPending(
        PCIDLIST_ABSOLUTE pidlFolder) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnViewCreated(
        IShellView *psv) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnNavigationComplete(
        PCIDLIST_ABSOLUTE pidlFolder) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnNavigationFailed(
        PCIDLIST_ABSOLUTE pidlFolder) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExplorerBrowserEvents, 0x361bbdc7, 0xe6ee, 0x4e13, 0xbe,0x58, 0x58,0xe2,0x24,0x0c,0x81,0x0f)
#endif
#else
typedef struct IExplorerBrowserEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IExplorerBrowserEvents *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IExplorerBrowserEvents *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IExplorerBrowserEvents *This);

    /*** IExplorerBrowserEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *OnNavigationPending)(
        IExplorerBrowserEvents *This,
        PCIDLIST_ABSOLUTE pidlFolder);

    HRESULT (STDMETHODCALLTYPE *OnViewCreated)(
        IExplorerBrowserEvents *This,
        IShellView *psv);

    HRESULT (STDMETHODCALLTYPE *OnNavigationComplete)(
        IExplorerBrowserEvents *This,
        PCIDLIST_ABSOLUTE pidlFolder);

    HRESULT (STDMETHODCALLTYPE *OnNavigationFailed)(
        IExplorerBrowserEvents *This,
        PCIDLIST_ABSOLUTE pidlFolder);

    END_INTERFACE
} IExplorerBrowserEventsVtbl;

interface IExplorerBrowserEvents {
    CONST_VTBL IExplorerBrowserEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExplorerBrowserEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExplorerBrowserEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExplorerBrowserEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IExplorerBrowserEvents methods ***/
#define IExplorerBrowserEvents_OnNavigationPending(This,pidlFolder) (This)->lpVtbl->OnNavigationPending(This,pidlFolder)
#define IExplorerBrowserEvents_OnViewCreated(This,psv) (This)->lpVtbl->OnViewCreated(This,psv)
#define IExplorerBrowserEvents_OnNavigationComplete(This,pidlFolder) (This)->lpVtbl->OnNavigationComplete(This,pidlFolder)
#define IExplorerBrowserEvents_OnNavigationFailed(This,pidlFolder) (This)->lpVtbl->OnNavigationFailed(This,pidlFolder)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IExplorerBrowserEvents_QueryInterface(IExplorerBrowserEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IExplorerBrowserEvents_AddRef(IExplorerBrowserEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IExplorerBrowserEvents_Release(IExplorerBrowserEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IExplorerBrowserEvents methods ***/
static FORCEINLINE HRESULT IExplorerBrowserEvents_OnNavigationPending(IExplorerBrowserEvents* This,PCIDLIST_ABSOLUTE pidlFolder) {
    return This->lpVtbl->OnNavigationPending(This,pidlFolder);
}
static FORCEINLINE HRESULT IExplorerBrowserEvents_OnViewCreated(IExplorerBrowserEvents* This,IShellView *psv) {
    return This->lpVtbl->OnViewCreated(This,psv);
}
static FORCEINLINE HRESULT IExplorerBrowserEvents_OnNavigationComplete(IExplorerBrowserEvents* This,PCIDLIST_ABSOLUTE pidlFolder) {
    return This->lpVtbl->OnNavigationComplete(This,pidlFolder);
}
static FORCEINLINE HRESULT IExplorerBrowserEvents_OnNavigationFailed(IExplorerBrowserEvents* This,PCIDLIST_ABSOLUTE pidlFolder) {
    return This->lpVtbl->OnNavigationFailed(This,pidlFolder);
}
#endif
#endif

#endif


#endif  /* __IExplorerBrowserEvents_INTERFACE_DEFINED__ */


typedef enum EXPLORER_BROWSER_OPTIONS {
    EBO_NONE = 0x0,
    EBO_NAVIGATEONCE = 0x1,
    EBO_SHOWFRAMES = 0x2,
    EBO_ALWAYSNAVIGATE = 0x4,
    EBO_NOTRAVELLOG = 0x8,
    EBO_NOWRAPPERWINDOW = 0x10,
    EBO_HTMLSHAREPOINTVIEW = 0x20,
    EBO_NOBORDER = 0x40,
    EBO_NOPERSISTVIEWSTATE = 0x80
} EXPLORER_BROWSER_OPTIONS;

DEFINE_ENUM_FLAG_OPERATORS(EXPLORER_BROWSER_OPTIONS)

typedef enum EXPLORER_BROWSER_FILL_FLAGS {
    EBF_NONE = 0x0,
    EBF_SELECTFROMDATAOBJECT = 0x100,
    EBF_NODROPTARGET = 0x200
} EXPLORER_BROWSER_FILL_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(EXPLORER_BROWSER_FILL_FLAGS)

/*****************************************************************************
 * IExplorerBrowser interface
 */
#ifndef __IExplorerBrowser_INTERFACE_DEFINED__
#define __IExplorerBrowser_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExplorerBrowser, 0xdfd3b6b5, 0xc10c, 0x4be9, 0x85,0xf6, 0xa6,0x69,0x69,0xf4,0x02,0xf6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dfd3b6b5-c10c-4be9-85f6-a66969f402f6")
IExplorerBrowser : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        HWND hwndParent,
        const RECT *prc,
        const FOLDERSETTINGS *pfs) = 0;

    virtual HRESULT STDMETHODCALLTYPE Destroy(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRect(
        HDWP *phdwp,
        RECT rcBrowser) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPropertyBag(
        LPCWSTR pszPropertyBag) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEmptyText(
        LPCWSTR pszEmptyText) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFolderSettings(
        const FOLDERSETTINGS *pfs) = 0;

    virtual HRESULT STDMETHODCALLTYPE Advise(
        IExplorerBrowserEvents *psbe,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unadvise(
        DWORD dwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOptions(
        EXPLORER_BROWSER_OPTIONS dwFlag) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOptions(
        EXPLORER_BROWSER_OPTIONS *pdwFlag) = 0;

    virtual HRESULT STDMETHODCALLTYPE BrowseToIDList(
        PCUIDLIST_RELATIVE pidl,
        UINT uFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE BrowseToObject(
        IUnknown *punk,
        UINT uFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE FillFromObject(
        IUnknown *punk,
        EXPLORER_BROWSER_FILL_FLAGS dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAll(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentView(
        REFIID riid,
        void **ppv) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExplorerBrowser, 0xdfd3b6b5, 0xc10c, 0x4be9, 0x85,0xf6, 0xa6,0x69,0x69,0xf4,0x02,0xf6)
#endif
#else
typedef struct IExplorerBrowserVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IExplorerBrowser *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IExplorerBrowser *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IExplorerBrowser *This);

    /*** IExplorerBrowser methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IExplorerBrowser *This,
        HWND hwndParent,
        const RECT *prc,
        const FOLDERSETTINGS *pfs);

    HRESULT (STDMETHODCALLTYPE *Destroy)(
        IExplorerBrowser *This);

    HRESULT (STDMETHODCALLTYPE *SetRect)(
        IExplorerBrowser *This,
        HDWP *phdwp,
        RECT rcBrowser);

    HRESULT (STDMETHODCALLTYPE *SetPropertyBag)(
        IExplorerBrowser *This,
        LPCWSTR pszPropertyBag);

    HRESULT (STDMETHODCALLTYPE *SetEmptyText)(
        IExplorerBrowser *This,
        LPCWSTR pszEmptyText);

    HRESULT (STDMETHODCALLTYPE *SetFolderSettings)(
        IExplorerBrowser *This,
        const FOLDERSETTINGS *pfs);

    HRESULT (STDMETHODCALLTYPE *Advise)(
        IExplorerBrowser *This,
        IExplorerBrowserEvents *psbe,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        IExplorerBrowser *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *SetOptions)(
        IExplorerBrowser *This,
        EXPLORER_BROWSER_OPTIONS dwFlag);

    HRESULT (STDMETHODCALLTYPE *GetOptions)(
        IExplorerBrowser *This,
        EXPLORER_BROWSER_OPTIONS *pdwFlag);

    HRESULT (STDMETHODCALLTYPE *BrowseToIDList)(
        IExplorerBrowser *This,
        PCUIDLIST_RELATIVE pidl,
        UINT uFlags);

    HRESULT (STDMETHODCALLTYPE *BrowseToObject)(
        IExplorerBrowser *This,
        IUnknown *punk,
        UINT uFlags);

    HRESULT (STDMETHODCALLTYPE *FillFromObject)(
        IExplorerBrowser *This,
        IUnknown *punk,
        EXPLORER_BROWSER_FILL_FLAGS dwFlags);

    HRESULT (STDMETHODCALLTYPE *RemoveAll)(
        IExplorerBrowser *This);

    HRESULT (STDMETHODCALLTYPE *GetCurrentView)(
        IExplorerBrowser *This,
        REFIID riid,
        void **ppv);

    END_INTERFACE
} IExplorerBrowserVtbl;

interface IExplorerBrowser {
    CONST_VTBL IExplorerBrowserVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExplorerBrowser_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExplorerBrowser_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExplorerBrowser_Release(This) (This)->lpVtbl->Release(This)
/*** IExplorerBrowser methods ***/
#define IExplorerBrowser_Initialize(This,hwndParent,prc,pfs) (This)->lpVtbl->Initialize(This,hwndParent,prc,pfs)
#define IExplorerBrowser_Destroy(This) (This)->lpVtbl->Destroy(This)
#define IExplorerBrowser_SetRect(This,phdwp,rcBrowser) (This)->lpVtbl->SetRect(This,phdwp,rcBrowser)
#define IExplorerBrowser_SetPropertyBag(This,pszPropertyBag) (This)->lpVtbl->SetPropertyBag(This,pszPropertyBag)
#define IExplorerBrowser_SetEmptyText(This,pszEmptyText) (This)->lpVtbl->SetEmptyText(This,pszEmptyText)
#define IExplorerBrowser_SetFolderSettings(This,pfs) (This)->lpVtbl->SetFolderSettings(This,pfs)
#define IExplorerBrowser_Advise(This,psbe,pdwCookie) (This)->lpVtbl->Advise(This,psbe,pdwCookie)
#define IExplorerBrowser_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
#define IExplorerBrowser_SetOptions(This,dwFlag) (This)->lpVtbl->SetOptions(This,dwFlag)
#define IExplorerBrowser_GetOptions(This,pdwFlag) (This)->lpVtbl->GetOptions(This,pdwFlag)
#define IExplorerBrowser_BrowseToIDList(This,pidl,uFlags) (This)->lpVtbl->BrowseToIDList(This,pidl,uFlags)
#define IExplorerBrowser_BrowseToObject(This,punk,uFlags) (This)->lpVtbl->BrowseToObject(This,punk,uFlags)
#define IExplorerBrowser_FillFromObject(This,punk,dwFlags) (This)->lpVtbl->FillFromObject(This,punk,dwFlags)
#define IExplorerBrowser_RemoveAll(This) (This)->lpVtbl->RemoveAll(This)
#define IExplorerBrowser_GetCurrentView(This,riid,ppv) (This)->lpVtbl->GetCurrentView(This,riid,ppv)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IExplorerBrowser_QueryInterface(IExplorerBrowser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IExplorerBrowser_AddRef(IExplorerBrowser* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IExplorerBrowser_Release(IExplorerBrowser* This) {
    return This->lpVtbl->Release(This);
}
/*** IExplorerBrowser methods ***/
static FORCEINLINE HRESULT IExplorerBrowser_Initialize(IExplorerBrowser* This,HWND hwndParent,const RECT *prc,const FOLDERSETTINGS *pfs) {
    return This->lpVtbl->Initialize(This,hwndParent,prc,pfs);
}
static FORCEINLINE HRESULT IExplorerBrowser_Destroy(IExplorerBrowser* This) {
    return This->lpVtbl->Destroy(This);
}
static FORCEINLINE HRESULT IExplorerBrowser_SetRect(IExplorerBrowser* This,HDWP *phdwp,RECT rcBrowser) {
    return This->lpVtbl->SetRect(This,phdwp,rcBrowser);
}
static FORCEINLINE HRESULT IExplorerBrowser_SetPropertyBag(IExplorerBrowser* This,LPCWSTR pszPropertyBag) {
    return This->lpVtbl->SetPropertyBag(This,pszPropertyBag);
}
static FORCEINLINE HRESULT IExplorerBrowser_SetEmptyText(IExplorerBrowser* This,LPCWSTR pszEmptyText) {
    return This->lpVtbl->SetEmptyText(This,pszEmptyText);
}
static FORCEINLINE HRESULT IExplorerBrowser_SetFolderSettings(IExplorerBrowser* This,const FOLDERSETTINGS *pfs) {
    return This->lpVtbl->SetFolderSettings(This,pfs);
}
static FORCEINLINE HRESULT IExplorerBrowser_Advise(IExplorerBrowser* This,IExplorerBrowserEvents *psbe,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,psbe,pdwCookie);
}
static FORCEINLINE HRESULT IExplorerBrowser_Unadvise(IExplorerBrowser* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static FORCEINLINE HRESULT IExplorerBrowser_SetOptions(IExplorerBrowser* This,EXPLORER_BROWSER_OPTIONS dwFlag) {
    return This->lpVtbl->SetOptions(This,dwFlag);
}
static FORCEINLINE HRESULT IExplorerBrowser_GetOptions(IExplorerBrowser* This,EXPLORER_BROWSER_OPTIONS *pdwFlag) {
    return This->lpVtbl->GetOptions(This,pdwFlag);
}
static FORCEINLINE HRESULT IExplorerBrowser_BrowseToIDList(IExplorerBrowser* This,PCUIDLIST_RELATIVE pidl,UINT uFlags) {
    return This->lpVtbl->BrowseToIDList(This,pidl,uFlags);
}
static FORCEINLINE HRESULT IExplorerBrowser_BrowseToObject(IExplorerBrowser* This,IUnknown *punk,UINT uFlags) {
    return This->lpVtbl->BrowseToObject(This,punk,uFlags);
}
static FORCEINLINE HRESULT IExplorerBrowser_FillFromObject(IExplorerBrowser* This,IUnknown *punk,EXPLORER_BROWSER_FILL_FLAGS dwFlags) {
    return This->lpVtbl->FillFromObject(This,punk,dwFlags);
}
static FORCEINLINE HRESULT IExplorerBrowser_RemoveAll(IExplorerBrowser* This) {
    return This->lpVtbl->RemoveAll(This);
}
static FORCEINLINE HRESULT IExplorerBrowser_GetCurrentView(IExplorerBrowser* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetCurrentView(This,riid,ppv);
}
#endif
#endif

#endif


#endif  /* __IExplorerBrowser_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IAccessibleObject interface
 */
#ifndef __IAccessibleObject_INTERFACE_DEFINED__
#define __IAccessibleObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAccessibleObject, 0x95a391c5, 0x9ed4, 0x4c28, 0x84,0x01, 0xab,0x9e,0x06,0x71,0x9e,0x11);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("95a391c5-9ed4-4c28-8401-ab9e06719e11")
IAccessibleObject : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetAccessibleName(
        LPCWSTR pszName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAccessibleObject, 0x95a391c5, 0x9ed4, 0x4c28, 0x84,0x01, 0xab,0x9e,0x06,0x71,0x9e,0x11)
#endif
#else
typedef struct IAccessibleObjectVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAccessibleObject *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAccessibleObject *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAccessibleObject *This);

    /*** IAccessibleObject methods ***/
    HRESULT (STDMETHODCALLTYPE *SetAccessibleName)(
        IAccessibleObject *This,
        LPCWSTR pszName);

    END_INTERFACE
} IAccessibleObjectVtbl;

interface IAccessibleObject {
    CONST_VTBL IAccessibleObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAccessibleObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAccessibleObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAccessibleObject_Release(This) (This)->lpVtbl->Release(This)
/*** IAccessibleObject methods ***/
#define IAccessibleObject_SetAccessibleName(This,pszName) (This)->lpVtbl->SetAccessibleName(This,pszName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAccessibleObject_QueryInterface(IAccessibleObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAccessibleObject_AddRef(IAccessibleObject* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAccessibleObject_Release(IAccessibleObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IAccessibleObject methods ***/
static FORCEINLINE HRESULT IAccessibleObject_SetAccessibleName(IAccessibleObject* This,LPCWSTR pszName) {
    return This->lpVtbl->SetAccessibleName(This,pszName);
}
#endif
#endif

#endif


#endif  /* __IAccessibleObject_INTERFACE_DEFINED__ */

#endif

/*****************************************************************************
 * IResultsFolder interface
 */
#ifndef __IResultsFolder_INTERFACE_DEFINED__
#define __IResultsFolder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IResultsFolder, 0x96e5ae6d, 0x6ae1, 0x4b1c, 0x90,0x0c, 0xc6,0x48,0x0e,0xaa,0x88,0x28);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96e5ae6d-6ae1-4b1c-900c-c6480eaa8828")
IResultsFolder : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddItem(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddIDList(
        PCIDLIST_ABSOLUTE pidl,
        PITEMID_CHILD *ppidlAdded) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveItem(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveIDList(
        PCIDLIST_ABSOLUTE pidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAll(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IResultsFolder, 0x96e5ae6d, 0x6ae1, 0x4b1c, 0x90,0x0c, 0xc6,0x48,0x0e,0xaa,0x88,0x28)
#endif
#else
typedef struct IResultsFolderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IResultsFolder *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IResultsFolder *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IResultsFolder *This);

    /*** IResultsFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *AddItem)(
        IResultsFolder *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *AddIDList)(
        IResultsFolder *This,
        PCIDLIST_ABSOLUTE pidl,
        PITEMID_CHILD *ppidlAdded);

    HRESULT (STDMETHODCALLTYPE *RemoveItem)(
        IResultsFolder *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *RemoveIDList)(
        IResultsFolder *This,
        PCIDLIST_ABSOLUTE pidl);

    HRESULT (STDMETHODCALLTYPE *RemoveAll)(
        IResultsFolder *This);

    END_INTERFACE
} IResultsFolderVtbl;

interface IResultsFolder {
    CONST_VTBL IResultsFolderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IResultsFolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IResultsFolder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IResultsFolder_Release(This) (This)->lpVtbl->Release(This)
/*** IResultsFolder methods ***/
#define IResultsFolder_AddItem(This,psi) (This)->lpVtbl->AddItem(This,psi)
#define IResultsFolder_AddIDList(This,pidl,ppidlAdded) (This)->lpVtbl->AddIDList(This,pidl,ppidlAdded)
#define IResultsFolder_RemoveItem(This,psi) (This)->lpVtbl->RemoveItem(This,psi)
#define IResultsFolder_RemoveIDList(This,pidl) (This)->lpVtbl->RemoveIDList(This,pidl)
#define IResultsFolder_RemoveAll(This) (This)->lpVtbl->RemoveAll(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IResultsFolder_QueryInterface(IResultsFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IResultsFolder_AddRef(IResultsFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IResultsFolder_Release(IResultsFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IResultsFolder methods ***/
static FORCEINLINE HRESULT IResultsFolder_AddItem(IResultsFolder* This,IShellItem *psi) {
    return This->lpVtbl->AddItem(This,psi);
}
static FORCEINLINE HRESULT IResultsFolder_AddIDList(IResultsFolder* This,PCIDLIST_ABSOLUTE pidl,PITEMID_CHILD *ppidlAdded) {
    return This->lpVtbl->AddIDList(This,pidl,ppidlAdded);
}
static FORCEINLINE HRESULT IResultsFolder_RemoveItem(IResultsFolder* This,IShellItem *psi) {
    return This->lpVtbl->RemoveItem(This,psi);
}
static FORCEINLINE HRESULT IResultsFolder_RemoveIDList(IResultsFolder* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->RemoveIDList(This,pidl);
}
static FORCEINLINE HRESULT IResultsFolder_RemoveAll(IResultsFolder* This) {
    return This->lpVtbl->RemoveAll(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IResultsFolder_RemoteAddIDList_Proxy(
    IResultsFolder* This,
    PCIDLIST_ABSOLUTE pidl,
    PITEMID_CHILD *ppidlAdded);
void __RPC_STUB IResultsFolder_RemoteAddIDList_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IResultsFolder_AddIDList_Proxy(
    IResultsFolder* This,
    PCIDLIST_ABSOLUTE pidl,
    PITEMID_CHILD *ppidlAdded);
HRESULT __RPC_STUB IResultsFolder_AddIDList_Stub(
    IResultsFolder* This,
    PCIDLIST_ABSOLUTE pidl,
    PITEMID_CHILD *ppidlAdded);

#endif  /* __IResultsFolder_INTERFACE_DEFINED__ */

#if _WIN32_IE >= _WIN32_IE_IE70
/*****************************************************************************
 * IEnumObjects interface
 */
#ifndef __IEnumObjects_INTERFACE_DEFINED__
#define __IEnumObjects_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumObjects, 0x2c1c7e2e, 0x2d0e, 0x4059, 0x83,0x1e, 0x1e,0x6f,0x82,0x33,0x5c,0x2e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2c1c7e2e-2d0e-4059-831e-1e6f82335c2e")
IEnumObjects : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        REFIID riid,
        void **rgelt,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumObjects **ppenum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumObjects, 0x2c1c7e2e, 0x2d0e, 0x4059, 0x83,0x1e, 0x1e,0x6f,0x82,0x33,0x5c,0x2e)
#endif
#else
typedef struct IEnumObjectsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumObjects *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumObjects *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumObjects *This);

    /*** IEnumObjects methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumObjects *This,
        ULONG celt,
        REFIID riid,
        void **rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumObjects *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumObjects *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumObjects *This,
        IEnumObjects **ppenum);

    END_INTERFACE
} IEnumObjectsVtbl;

interface IEnumObjects {
    CONST_VTBL IEnumObjectsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumObjects_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumObjects_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumObjects_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumObjects methods ***/
#define IEnumObjects_Next(This,celt,riid,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,riid,rgelt,pceltFetched)
#define IEnumObjects_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumObjects_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumObjects_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumObjects_QueryInterface(IEnumObjects* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumObjects_AddRef(IEnumObjects* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumObjects_Release(IEnumObjects* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumObjects methods ***/
static FORCEINLINE HRESULT IEnumObjects_Next(IEnumObjects* This,ULONG celt,REFIID riid,void **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,riid,rgelt,pceltFetched);
}
static FORCEINLINE HRESULT IEnumObjects_Skip(IEnumObjects* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumObjects_Reset(IEnumObjects* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumObjects_Clone(IEnumObjects* This,IEnumObjects **ppenum) {
    return This->lpVtbl->Clone(This,ppenum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEnumObjects_RemoteNext_Proxy(
    IEnumObjects* This,
    ULONG celt,
    REFIID riid,
    void **rgelt,
    ULONG *pceltFetched);
void __RPC_STUB IEnumObjects_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumObjects_Next_Proxy(
    IEnumObjects* This,
    ULONG celt,
    REFIID riid,
    void **rgelt,
    ULONG *pceltFetched);
HRESULT __RPC_STUB IEnumObjects_Next_Stub(
    IEnumObjects* This,
    ULONG celt,
    REFIID riid,
    void **rgelt,
    ULONG *pceltFetched);

#endif  /* __IEnumObjects_INTERFACE_DEFINED__ */


enum _OPPROGDLGF {
    OPPROGDLG_DEFAULT = 0x0,
    OPPROGDLG_ENABLEPAUSE = 0x80,
    OPPROGDLG_ALLOWUNDO = 0x100,
    OPPROGDLG_DONTDISPLAYSOURCEPATH = 0x200,
    OPPROGDLG_DONTDISPLAYDESTPATH = 0x400,
    OPPROGDLG_NOMULTIDAYESTIMATES = 0x800,
    OPPROGDLG_DONTDISPLAYLOCATIONS = 0x1000
};

typedef DWORD OPPROGDLGF;

/*****************************************************************************
 * IOperationsProgressDialog interface
 */
#ifndef __IOperationsProgressDialog_INTERFACE_DEFINED__
#define __IOperationsProgressDialog_INTERFACE_DEFINED__

enum _PDMODE {
    PDM_DEFAULT = 0x0,
    PDM_RUN = 0x1,
    PDM_PREFLIGHT = 0x2,
    PDM_UNDOING = 0x4,
    PDM_ERRORSBLOCKING = 0x8,
    PDM_INDETERMINATE = 0x10
};

typedef DWORD PDMODE;

typedef enum PDOPSTATUS {
    PDOPS_RUNNING = 1,
    PDOPS_PAUSED = 2,
    PDOPS_CANCELLED = 3,
    PDOPS_STOPPED = 4,
    PDOPS_ERRORS = 5
} PDOPSTATUS;

DEFINE_GUID(IID_IOperationsProgressDialog, 0x0c9fb851, 0xe5c9, 0x43eb, 0xa3,0x70, 0xf0,0x67,0x7b,0x13,0x87,0x4c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0c9fb851-e5c9-43eb-a370-f0677b13874c")
IOperationsProgressDialog : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE StartProgressDialog(
        HWND hwndOwner,
        OPPROGDLGF flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopProgressDialog(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOperation(
        SPACTION action) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMode(
        PDMODE mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE UpdateProgress(
        ULONGLONG ullPointsCurrent,
        ULONGLONG ullPointsTotal,
        ULONGLONG ullSizeCurrent,
        ULONGLONG ullSizeTotal,
        ULONGLONG ullItemsCurrent,
        ULONGLONG ullItemsTotal) = 0;

    virtual HRESULT STDMETHODCALLTYPE UpdateLocations(
        IShellItem *psiSource,
        IShellItem *psiTarget,
        IShellItem *psiItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResetTimer(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE PauseTimer(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResumeTimer(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMilliseconds(
        ULONGLONG *pullElapsed,
        ULONGLONG *pullRemaining) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOperationStatus(
        PDOPSTATUS *popstatus) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOperationsProgressDialog, 0x0c9fb851, 0xe5c9, 0x43eb, 0xa3,0x70, 0xf0,0x67,0x7b,0x13,0x87,0x4c)
#endif
#else
typedef struct IOperationsProgressDialogVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IOperationsProgressDialog *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IOperationsProgressDialog *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IOperationsProgressDialog *This);

    /*** IOperationsProgressDialog methods ***/
    HRESULT (STDMETHODCALLTYPE *StartProgressDialog)(
        IOperationsProgressDialog *This,
        HWND hwndOwner,
        OPPROGDLGF flags);

    HRESULT (STDMETHODCALLTYPE *StopProgressDialog)(
        IOperationsProgressDialog *This);

    HRESULT (STDMETHODCALLTYPE *SetOperation)(
        IOperationsProgressDialog *This,
        SPACTION action);

    HRESULT (STDMETHODCALLTYPE *SetMode)(
        IOperationsProgressDialog *This,
        PDMODE mode);

    HRESULT (STDMETHODCALLTYPE *UpdateProgress)(
        IOperationsProgressDialog *This,
        ULONGLONG ullPointsCurrent,
        ULONGLONG ullPointsTotal,
        ULONGLONG ullSizeCurrent,
        ULONGLONG ullSizeTotal,
        ULONGLONG ullItemsCurrent,
        ULONGLONG ullItemsTotal);

    HRESULT (STDMETHODCALLTYPE *UpdateLocations)(
        IOperationsProgressDialog *This,
        IShellItem *psiSource,
        IShellItem *psiTarget,
        IShellItem *psiItem);

    HRESULT (STDMETHODCALLTYPE *ResetTimer)(
        IOperationsProgressDialog *This);

    HRESULT (STDMETHODCALLTYPE *PauseTimer)(
        IOperationsProgressDialog *This);

    HRESULT (STDMETHODCALLTYPE *ResumeTimer)(
        IOperationsProgressDialog *This);

    HRESULT (STDMETHODCALLTYPE *GetMilliseconds)(
        IOperationsProgressDialog *This,
        ULONGLONG *pullElapsed,
        ULONGLONG *pullRemaining);

    HRESULT (STDMETHODCALLTYPE *GetOperationStatus)(
        IOperationsProgressDialog *This,
        PDOPSTATUS *popstatus);

    END_INTERFACE
} IOperationsProgressDialogVtbl;

interface IOperationsProgressDialog {
    CONST_VTBL IOperationsProgressDialogVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOperationsProgressDialog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOperationsProgressDialog_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOperationsProgressDialog_Release(This) (This)->lpVtbl->Release(This)
/*** IOperationsProgressDialog methods ***/
#define IOperationsProgressDialog_StartProgressDialog(This,hwndOwner,flags) (This)->lpVtbl->StartProgressDialog(This,hwndOwner,flags)
#define IOperationsProgressDialog_StopProgressDialog(This) (This)->lpVtbl->StopProgressDialog(This)
#define IOperationsProgressDialog_SetOperation(This,action) (This)->lpVtbl->SetOperation(This,action)
#define IOperationsProgressDialog_SetMode(This,mode) (This)->lpVtbl->SetMode(This,mode)
#define IOperationsProgressDialog_UpdateProgress(This,ullPointsCurrent,ullPointsTotal,ullSizeCurrent,ullSizeTotal,ullItemsCurrent,ullItemsTotal) (This)->lpVtbl->UpdateProgress(This,ullPointsCurrent,ullPointsTotal,ullSizeCurrent,ullSizeTotal,ullItemsCurrent,ullItemsTotal)
#define IOperationsProgressDialog_UpdateLocations(This,psiSource,psiTarget,psiItem) (This)->lpVtbl->UpdateLocations(This,psiSource,psiTarget,psiItem)
#define IOperationsProgressDialog_ResetTimer(This) (This)->lpVtbl->ResetTimer(This)
#define IOperationsProgressDialog_PauseTimer(This) (This)->lpVtbl->PauseTimer(This)
#define IOperationsProgressDialog_ResumeTimer(This) (This)->lpVtbl->ResumeTimer(This)
#define IOperationsProgressDialog_GetMilliseconds(This,pullElapsed,pullRemaining) (This)->lpVtbl->GetMilliseconds(This,pullElapsed,pullRemaining)
#define IOperationsProgressDialog_GetOperationStatus(This,popstatus) (This)->lpVtbl->GetOperationStatus(This,popstatus)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOperationsProgressDialog_QueryInterface(IOperationsProgressDialog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOperationsProgressDialog_AddRef(IOperationsProgressDialog* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOperationsProgressDialog_Release(IOperationsProgressDialog* This) {
    return This->lpVtbl->Release(This);
}
/*** IOperationsProgressDialog methods ***/
static FORCEINLINE HRESULT IOperationsProgressDialog_StartProgressDialog(IOperationsProgressDialog* This,HWND hwndOwner,OPPROGDLGF flags) {
    return This->lpVtbl->StartProgressDialog(This,hwndOwner,flags);
}
static FORCEINLINE HRESULT IOperationsProgressDialog_StopProgressDialog(IOperationsProgressDialog* This) {
    return This->lpVtbl->StopProgressDialog(This);
}
static FORCEINLINE HRESULT IOperationsProgressDialog_SetOperation(IOperationsProgressDialog* This,SPACTION action) {
    return This->lpVtbl->SetOperation(This,action);
}
static FORCEINLINE HRESULT IOperationsProgressDialog_SetMode(IOperationsProgressDialog* This,PDMODE mode) {
    return This->lpVtbl->SetMode(This,mode);
}
static FORCEINLINE HRESULT IOperationsProgressDialog_UpdateProgress(IOperationsProgressDialog* This,ULONGLONG ullPointsCurrent,ULONGLONG ullPointsTotal,ULONGLONG ullSizeCurrent,ULONGLONG ullSizeTotal,ULONGLONG ullItemsCurrent,ULONGLONG ullItemsTotal) {
    return This->lpVtbl->UpdateProgress(This,ullPointsCurrent,ullPointsTotal,ullSizeCurrent,ullSizeTotal,ullItemsCurrent,ullItemsTotal);
}
static FORCEINLINE HRESULT IOperationsProgressDialog_UpdateLocations(IOperationsProgressDialog* This,IShellItem *psiSource,IShellItem *psiTarget,IShellItem *psiItem) {
    return This->lpVtbl->UpdateLocations(This,psiSource,psiTarget,psiItem);
}
static FORCEINLINE HRESULT IOperationsProgressDialog_ResetTimer(IOperationsProgressDialog* This) {
    return This->lpVtbl->ResetTimer(This);
}
static FORCEINLINE HRESULT IOperationsProgressDialog_PauseTimer(IOperationsProgressDialog* This) {
    return This->lpVtbl->PauseTimer(This);
}
static FORCEINLINE HRESULT IOperationsProgressDialog_ResumeTimer(IOperationsProgressDialog* This) {
    return This->lpVtbl->ResumeTimer(This);
}
static FORCEINLINE HRESULT IOperationsProgressDialog_GetMilliseconds(IOperationsProgressDialog* This,ULONGLONG *pullElapsed,ULONGLONG *pullRemaining) {
    return This->lpVtbl->GetMilliseconds(This,pullElapsed,pullRemaining);
}
static FORCEINLINE HRESULT IOperationsProgressDialog_GetOperationStatus(IOperationsProgressDialog* This,PDOPSTATUS *popstatus) {
    return This->lpVtbl->GetOperationStatus(This,popstatus);
}
#endif
#endif

#endif


#endif  /* __IOperationsProgressDialog_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IIOCancelInformation interface
 */
#ifndef __IIOCancelInformation_INTERFACE_DEFINED__
#define __IIOCancelInformation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IIOCancelInformation, 0xf5b0bf81, 0x8cb5, 0x4b1b, 0x94,0x49, 0x1a,0x15,0x9e,0x0c,0x73,0x3c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f5b0bf81-8cb5-4b1b-9449-1a159e0c733c")
IIOCancelInformation : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetCancelInformation(
        DWORD dwThreadID,
        UINT uMsgCancel) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCancelInformation(
        DWORD *pdwThreadID,
        UINT *puMsgCancel) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IIOCancelInformation, 0xf5b0bf81, 0x8cb5, 0x4b1b, 0x94,0x49, 0x1a,0x15,0x9e,0x0c,0x73,0x3c)
#endif
#else
typedef struct IIOCancelInformationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IIOCancelInformation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IIOCancelInformation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IIOCancelInformation *This);

    /*** IIOCancelInformation methods ***/
    HRESULT (STDMETHODCALLTYPE *SetCancelInformation)(
        IIOCancelInformation *This,
        DWORD dwThreadID,
        UINT uMsgCancel);

    HRESULT (STDMETHODCALLTYPE *GetCancelInformation)(
        IIOCancelInformation *This,
        DWORD *pdwThreadID,
        UINT *puMsgCancel);

    END_INTERFACE
} IIOCancelInformationVtbl;

interface IIOCancelInformation {
    CONST_VTBL IIOCancelInformationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IIOCancelInformation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IIOCancelInformation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IIOCancelInformation_Release(This) (This)->lpVtbl->Release(This)
/*** IIOCancelInformation methods ***/
#define IIOCancelInformation_SetCancelInformation(This,dwThreadID,uMsgCancel) (This)->lpVtbl->SetCancelInformation(This,dwThreadID,uMsgCancel)
#define IIOCancelInformation_GetCancelInformation(This,pdwThreadID,puMsgCancel) (This)->lpVtbl->GetCancelInformation(This,pdwThreadID,puMsgCancel)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IIOCancelInformation_QueryInterface(IIOCancelInformation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IIOCancelInformation_AddRef(IIOCancelInformation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IIOCancelInformation_Release(IIOCancelInformation* This) {
    return This->lpVtbl->Release(This);
}
/*** IIOCancelInformation methods ***/
static FORCEINLINE HRESULT IIOCancelInformation_SetCancelInformation(IIOCancelInformation* This,DWORD dwThreadID,UINT uMsgCancel) {
    return This->lpVtbl->SetCancelInformation(This,dwThreadID,uMsgCancel);
}
static FORCEINLINE HRESULT IIOCancelInformation_GetCancelInformation(IIOCancelInformation* This,DWORD *pdwThreadID,UINT *puMsgCancel) {
    return This->lpVtbl->GetCancelInformation(This,pdwThreadID,puMsgCancel);
}
#endif
#endif

#endif


#endif  /* __IIOCancelInformation_INTERFACE_DEFINED__ */


#define FOFX_NOSKIPJUNCTIONS 0x00010000
#define FOFX_PREFERHARDLINK 0x00020000
#define FOFX_SHOWELEVATIONPROMPT 0x00040000
#define FOFX_RECYCLEONDELETE 0x00080000
#define FOFX_EARLYFAILURE 0x00100000
#define FOFX_PRESERVEFILEEXTENSIONS 0x00200000
#define FOFX_KEEPNEWERFILE 0x00400000
#define FOFX_NOCOPYHOOKS 0x00800000
#define FOFX_NOMINIMIZEBOX 0x01000000
#define FOFX_MOVEACLSACROSSVOLUMES 0x02000000
#define FOFX_DONTDISPLAYSOURCEPATH 0x04000000
#define FOFX_DONTDISPLAYDESTPATH 0x08000000
#define FOFX_REQUIREELEVATION 0x10000000
#define FOFX_ADDUNDORECORD 0x20000000
#define FOFX_COPYASDOWNLOAD 0x40000000
#define FOFX_DONTDISPLAYLOCATIONS 0x80000000

/*****************************************************************************
 * IFileOperation interface
 */
#ifndef __IFileOperation_INTERFACE_DEFINED__
#define __IFileOperation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFileOperation, 0x947aab5f, 0x0a5c, 0x4c13, 0xb4,0xd6, 0x4b,0xf7,0x83,0x6f,0xc9,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("947aab5f-0a5c-4c13-b4d6-4bf7836fc9f8")
IFileOperation : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Advise(
        IFileOperationProgressSink *pfops,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unadvise(
        DWORD dwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOperationFlags(
        DWORD dwOperationFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProgressMessage(
        LPCWSTR pszMessage) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProgressDialog(
        IOperationsProgressDialog *popd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProperties(
        IPropertyChangeArray *pproparray) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOwnerWindow(
        HWND hwndOwner) = 0;

    virtual HRESULT STDMETHODCALLTYPE ApplyPropertiesToItem(
        IShellItem *psiItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE ApplyPropertiesToItems(
        IUnknown *punkItems) = 0;

    virtual HRESULT STDMETHODCALLTYPE RenameItem(
        IShellItem *psiItem,
        LPCWSTR pszNewName,
        IFileOperationProgressSink *pfopsItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE RenameItems(
        IUnknown *pUnkItems,
        LPCWSTR pszNewName) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveItem(
        IShellItem *psiItem,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName,
        IFileOperationProgressSink *pfopsItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveItems(
        IUnknown *punkItems,
        IShellItem *psiDestinationFolder) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyItem(
        IShellItem *psiItem,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszCopyName,
        IFileOperationProgressSink *pfopsItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyItems(
        IUnknown *punkItems,
        IShellItem *psiDestinationFolder) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteItem(
        IShellItem *psiItem,
        IFileOperationProgressSink *pfopsItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteItems(
        IUnknown *punkItems) = 0;

    virtual HRESULT STDMETHODCALLTYPE NewItem(
        IShellItem *psiDestinationFolder,
        DWORD dwFileAttributes,
        LPCWSTR pszName,
        LPCWSTR pszTemplateName,
        IFileOperationProgressSink *pfopsItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE PerformOperations(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAnyOperationsAborted(
        WINBOOL *pfAnyOperationsAborted) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileOperation, 0x947aab5f, 0x0a5c, 0x4c13, 0xb4,0xd6, 0x4b,0xf7,0x83,0x6f,0xc9,0xf8)
#endif
#else
typedef struct IFileOperationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFileOperation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFileOperation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFileOperation *This);

    /*** IFileOperation methods ***/
    HRESULT (STDMETHODCALLTYPE *Advise)(
        IFileOperation *This,
        IFileOperationProgressSink *pfops,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        IFileOperation *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *SetOperationFlags)(
        IFileOperation *This,
        DWORD dwOperationFlags);

    HRESULT (STDMETHODCALLTYPE *SetProgressMessage)(
        IFileOperation *This,
        LPCWSTR pszMessage);

    HRESULT (STDMETHODCALLTYPE *SetProgressDialog)(
        IFileOperation *This,
        IOperationsProgressDialog *popd);

    HRESULT (STDMETHODCALLTYPE *SetProperties)(
        IFileOperation *This,
        IPropertyChangeArray *pproparray);

    HRESULT (STDMETHODCALLTYPE *SetOwnerWindow)(
        IFileOperation *This,
        HWND hwndOwner);

    HRESULT (STDMETHODCALLTYPE *ApplyPropertiesToItem)(
        IFileOperation *This,
        IShellItem *psiItem);

    HRESULT (STDMETHODCALLTYPE *ApplyPropertiesToItems)(
        IFileOperation *This,
        IUnknown *punkItems);

    HRESULT (STDMETHODCALLTYPE *RenameItem)(
        IFileOperation *This,
        IShellItem *psiItem,
        LPCWSTR pszNewName,
        IFileOperationProgressSink *pfopsItem);

    HRESULT (STDMETHODCALLTYPE *RenameItems)(
        IFileOperation *This,
        IUnknown *pUnkItems,
        LPCWSTR pszNewName);

    HRESULT (STDMETHODCALLTYPE *MoveItem)(
        IFileOperation *This,
        IShellItem *psiItem,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszNewName,
        IFileOperationProgressSink *pfopsItem);

    HRESULT (STDMETHODCALLTYPE *MoveItems)(
        IFileOperation *This,
        IUnknown *punkItems,
        IShellItem *psiDestinationFolder);

    HRESULT (STDMETHODCALLTYPE *CopyItem)(
        IFileOperation *This,
        IShellItem *psiItem,
        IShellItem *psiDestinationFolder,
        LPCWSTR pszCopyName,
        IFileOperationProgressSink *pfopsItem);

    HRESULT (STDMETHODCALLTYPE *CopyItems)(
        IFileOperation *This,
        IUnknown *punkItems,
        IShellItem *psiDestinationFolder);

    HRESULT (STDMETHODCALLTYPE *DeleteItem)(
        IFileOperation *This,
        IShellItem *psiItem,
        IFileOperationProgressSink *pfopsItem);

    HRESULT (STDMETHODCALLTYPE *DeleteItems)(
        IFileOperation *This,
        IUnknown *punkItems);

    HRESULT (STDMETHODCALLTYPE *NewItem)(
        IFileOperation *This,
        IShellItem *psiDestinationFolder,
        DWORD dwFileAttributes,
        LPCWSTR pszName,
        LPCWSTR pszTemplateName,
        IFileOperationProgressSink *pfopsItem);

    HRESULT (STDMETHODCALLTYPE *PerformOperations)(
        IFileOperation *This);

    HRESULT (STDMETHODCALLTYPE *GetAnyOperationsAborted)(
        IFileOperation *This,
        WINBOOL *pfAnyOperationsAborted);

    END_INTERFACE
} IFileOperationVtbl;

interface IFileOperation {
    CONST_VTBL IFileOperationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileOperation_Release(This) (This)->lpVtbl->Release(This)
/*** IFileOperation methods ***/
#define IFileOperation_Advise(This,pfops,pdwCookie) (This)->lpVtbl->Advise(This,pfops,pdwCookie)
#define IFileOperation_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
#define IFileOperation_SetOperationFlags(This,dwOperationFlags) (This)->lpVtbl->SetOperationFlags(This,dwOperationFlags)
#define IFileOperation_SetProgressMessage(This,pszMessage) (This)->lpVtbl->SetProgressMessage(This,pszMessage)
#define IFileOperation_SetProgressDialog(This,popd) (This)->lpVtbl->SetProgressDialog(This,popd)
#define IFileOperation_SetProperties(This,pproparray) (This)->lpVtbl->SetProperties(This,pproparray)
#define IFileOperation_SetOwnerWindow(This,hwndOwner) (This)->lpVtbl->SetOwnerWindow(This,hwndOwner)
#define IFileOperation_ApplyPropertiesToItem(This,psiItem) (This)->lpVtbl->ApplyPropertiesToItem(This,psiItem)
#define IFileOperation_ApplyPropertiesToItems(This,punkItems) (This)->lpVtbl->ApplyPropertiesToItems(This,punkItems)
#define IFileOperation_RenameItem(This,psiItem,pszNewName,pfopsItem) (This)->lpVtbl->RenameItem(This,psiItem,pszNewName,pfopsItem)
#define IFileOperation_RenameItems(This,pUnkItems,pszNewName) (This)->lpVtbl->RenameItems(This,pUnkItems,pszNewName)
#define IFileOperation_MoveItem(This,psiItem,psiDestinationFolder,pszNewName,pfopsItem) (This)->lpVtbl->MoveItem(This,psiItem,psiDestinationFolder,pszNewName,pfopsItem)
#define IFileOperation_MoveItems(This,punkItems,psiDestinationFolder) (This)->lpVtbl->MoveItems(This,punkItems,psiDestinationFolder)
#define IFileOperation_CopyItem(This,psiItem,psiDestinationFolder,pszCopyName,pfopsItem) (This)->lpVtbl->CopyItem(This,psiItem,psiDestinationFolder,pszCopyName,pfopsItem)
#define IFileOperation_CopyItems(This,punkItems,psiDestinationFolder) (This)->lpVtbl->CopyItems(This,punkItems,psiDestinationFolder)
#define IFileOperation_DeleteItem(This,psiItem,pfopsItem) (This)->lpVtbl->DeleteItem(This,psiItem,pfopsItem)
#define IFileOperation_DeleteItems(This,punkItems) (This)->lpVtbl->DeleteItems(This,punkItems)
#define IFileOperation_NewItem(This,psiDestinationFolder,dwFileAttributes,pszName,pszTemplateName,pfopsItem) (This)->lpVtbl->NewItem(This,psiDestinationFolder,dwFileAttributes,pszName,pszTemplateName,pfopsItem)
#define IFileOperation_PerformOperations(This) (This)->lpVtbl->PerformOperations(This)
#define IFileOperation_GetAnyOperationsAborted(This,pfAnyOperationsAborted) (This)->lpVtbl->GetAnyOperationsAborted(This,pfAnyOperationsAborted)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFileOperation_QueryInterface(IFileOperation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFileOperation_AddRef(IFileOperation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFileOperation_Release(IFileOperation* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileOperation methods ***/
static FORCEINLINE HRESULT IFileOperation_Advise(IFileOperation* This,IFileOperationProgressSink *pfops,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pfops,pdwCookie);
}
static FORCEINLINE HRESULT IFileOperation_Unadvise(IFileOperation* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static FORCEINLINE HRESULT IFileOperation_SetOperationFlags(IFileOperation* This,DWORD dwOperationFlags) {
    return This->lpVtbl->SetOperationFlags(This,dwOperationFlags);
}
static FORCEINLINE HRESULT IFileOperation_SetProgressMessage(IFileOperation* This,LPCWSTR pszMessage) {
    return This->lpVtbl->SetProgressMessage(This,pszMessage);
}
static FORCEINLINE HRESULT IFileOperation_SetProgressDialog(IFileOperation* This,IOperationsProgressDialog *popd) {
    return This->lpVtbl->SetProgressDialog(This,popd);
}
static FORCEINLINE HRESULT IFileOperation_SetProperties(IFileOperation* This,IPropertyChangeArray *pproparray) {
    return This->lpVtbl->SetProperties(This,pproparray);
}
static FORCEINLINE HRESULT IFileOperation_SetOwnerWindow(IFileOperation* This,HWND hwndOwner) {
    return This->lpVtbl->SetOwnerWindow(This,hwndOwner);
}
static FORCEINLINE HRESULT IFileOperation_ApplyPropertiesToItem(IFileOperation* This,IShellItem *psiItem) {
    return This->lpVtbl->ApplyPropertiesToItem(This,psiItem);
}
static FORCEINLINE HRESULT IFileOperation_ApplyPropertiesToItems(IFileOperation* This,IUnknown *punkItems) {
    return This->lpVtbl->ApplyPropertiesToItems(This,punkItems);
}
static FORCEINLINE HRESULT IFileOperation_RenameItem(IFileOperation* This,IShellItem *psiItem,LPCWSTR pszNewName,IFileOperationProgressSink *pfopsItem) {
    return This->lpVtbl->RenameItem(This,psiItem,pszNewName,pfopsItem);
}
static FORCEINLINE HRESULT IFileOperation_RenameItems(IFileOperation* This,IUnknown *pUnkItems,LPCWSTR pszNewName) {
    return This->lpVtbl->RenameItems(This,pUnkItems,pszNewName);
}
static FORCEINLINE HRESULT IFileOperation_MoveItem(IFileOperation* This,IShellItem *psiItem,IShellItem *psiDestinationFolder,LPCWSTR pszNewName,IFileOperationProgressSink *pfopsItem) {
    return This->lpVtbl->MoveItem(This,psiItem,psiDestinationFolder,pszNewName,pfopsItem);
}
static FORCEINLINE HRESULT IFileOperation_MoveItems(IFileOperation* This,IUnknown *punkItems,IShellItem *psiDestinationFolder) {
    return This->lpVtbl->MoveItems(This,punkItems,psiDestinationFolder);
}
static FORCEINLINE HRESULT IFileOperation_CopyItem(IFileOperation* This,IShellItem *psiItem,IShellItem *psiDestinationFolder,LPCWSTR pszCopyName,IFileOperationProgressSink *pfopsItem) {
    return This->lpVtbl->CopyItem(This,psiItem,psiDestinationFolder,pszCopyName,pfopsItem);
}
static FORCEINLINE HRESULT IFileOperation_CopyItems(IFileOperation* This,IUnknown *punkItems,IShellItem *psiDestinationFolder) {
    return This->lpVtbl->CopyItems(This,punkItems,psiDestinationFolder);
}
static FORCEINLINE HRESULT IFileOperation_DeleteItem(IFileOperation* This,IShellItem *psiItem,IFileOperationProgressSink *pfopsItem) {
    return This->lpVtbl->DeleteItem(This,psiItem,pfopsItem);
}
static FORCEINLINE HRESULT IFileOperation_DeleteItems(IFileOperation* This,IUnknown *punkItems) {
    return This->lpVtbl->DeleteItems(This,punkItems);
}
static FORCEINLINE HRESULT IFileOperation_NewItem(IFileOperation* This,IShellItem *psiDestinationFolder,DWORD dwFileAttributes,LPCWSTR pszName,LPCWSTR pszTemplateName,IFileOperationProgressSink *pfopsItem) {
    return This->lpVtbl->NewItem(This,psiDestinationFolder,dwFileAttributes,pszName,pszTemplateName,pfopsItem);
}
static FORCEINLINE HRESULT IFileOperation_PerformOperations(IFileOperation* This) {
    return This->lpVtbl->PerformOperations(This);
}
static FORCEINLINE HRESULT IFileOperation_GetAnyOperationsAborted(IFileOperation* This,WINBOOL *pfAnyOperationsAborted) {
    return This->lpVtbl->GetAnyOperationsAborted(This,pfAnyOperationsAborted);
}
#endif
#endif

#endif


#endif  /* __IFileOperation_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IObjectProvider interface
 */
#ifndef __IObjectProvider_INTERFACE_DEFINED__
#define __IObjectProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IObjectProvider, 0xa6087428, 0x3be3, 0x4d73, 0xb3,0x08, 0x7c,0x04,0xa5,0x40,0xbf,0x1a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a6087428-3be3-4d73-b308-7c04a540bf1a")
IObjectProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryObject(
        REFGUID guidObject,
        REFIID riid,
        void **ppvOut) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IObjectProvider, 0xa6087428, 0x3be3, 0x4d73, 0xb3,0x08, 0x7c,0x04,0xa5,0x40,0xbf,0x1a)
#endif
#else
typedef struct IObjectProviderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IObjectProvider *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IObjectProvider *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IObjectProvider *This);

    /*** IObjectProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryObject)(
        IObjectProvider *This,
        REFGUID guidObject,
        REFIID riid,
        void **ppvOut);

    END_INTERFACE
} IObjectProviderVtbl;

interface IObjectProvider {
    CONST_VTBL IObjectProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IObjectProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IObjectProvider methods ***/
#define IObjectProvider_QueryObject(This,guidObject,riid,ppvOut) (This)->lpVtbl->QueryObject(This,guidObject,riid,ppvOut)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IObjectProvider_QueryInterface(IObjectProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IObjectProvider_AddRef(IObjectProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IObjectProvider_Release(IObjectProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectProvider methods ***/
static FORCEINLINE HRESULT IObjectProvider_QueryObject(IObjectProvider* This,REFGUID guidObject,REFIID riid,void **ppvOut) {
    return This->lpVtbl->QueryObject(This,guidObject,riid,ppvOut);
}
#endif
#endif

#endif


#endif  /* __IObjectProvider_INTERFACE_DEFINED__ */

#endif

/*****************************************************************************
 * INamespaceWalkCB interface
 */
#ifndef __INamespaceWalkCB_INTERFACE_DEFINED__
#define __INamespaceWalkCB_INTERFACE_DEFINED__

DEFINE_GUID(IID_INamespaceWalkCB, 0xd92995f8, 0xcf5e, 0x4a76, 0xbf,0x59, 0xea,0xd3,0x9e,0xa2,0xb9,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d92995f8-cf5e-4a76-bf59-ead39ea2b97e")
INamespaceWalkCB : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE FoundItem(
        IShellFolder *psf,
        PCUITEMID_CHILD pidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnterFolder(
        IShellFolder *psf,
        PCUITEMID_CHILD pidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE LeaveFolder(
        IShellFolder *psf,
        PCUITEMID_CHILD pidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeProgressDialog(
        LPWSTR *ppszTitle,
        LPWSTR *ppszCancel) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INamespaceWalkCB, 0xd92995f8, 0xcf5e, 0x4a76, 0xbf,0x59, 0xea,0xd3,0x9e,0xa2,0xb9,0x7e)
#endif
#else
typedef struct INamespaceWalkCBVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INamespaceWalkCB *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INamespaceWalkCB *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INamespaceWalkCB *This);

    /*** INamespaceWalkCB methods ***/
    HRESULT (STDMETHODCALLTYPE *FoundItem)(
        INamespaceWalkCB *This,
        IShellFolder *psf,
        PCUITEMID_CHILD pidl);

    HRESULT (STDMETHODCALLTYPE *EnterFolder)(
        INamespaceWalkCB *This,
        IShellFolder *psf,
        PCUITEMID_CHILD pidl);

    HRESULT (STDMETHODCALLTYPE *LeaveFolder)(
        INamespaceWalkCB *This,
        IShellFolder *psf,
        PCUITEMID_CHILD pidl);

    HRESULT (STDMETHODCALLTYPE *InitializeProgressDialog)(
        INamespaceWalkCB *This,
        LPWSTR *ppszTitle,
        LPWSTR *ppszCancel);

    END_INTERFACE
} INamespaceWalkCBVtbl;

interface INamespaceWalkCB {
    CONST_VTBL INamespaceWalkCBVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INamespaceWalkCB_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INamespaceWalkCB_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INamespaceWalkCB_Release(This) (This)->lpVtbl->Release(This)
/*** INamespaceWalkCB methods ***/
#define INamespaceWalkCB_FoundItem(This,psf,pidl) (This)->lpVtbl->FoundItem(This,psf,pidl)
#define INamespaceWalkCB_EnterFolder(This,psf,pidl) (This)->lpVtbl->EnterFolder(This,psf,pidl)
#define INamespaceWalkCB_LeaveFolder(This,psf,pidl) (This)->lpVtbl->LeaveFolder(This,psf,pidl)
#define INamespaceWalkCB_InitializeProgressDialog(This,ppszTitle,ppszCancel) (This)->lpVtbl->InitializeProgressDialog(This,ppszTitle,ppszCancel)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INamespaceWalkCB_QueryInterface(INamespaceWalkCB* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INamespaceWalkCB_AddRef(INamespaceWalkCB* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INamespaceWalkCB_Release(INamespaceWalkCB* This) {
    return This->lpVtbl->Release(This);
}
/*** INamespaceWalkCB methods ***/
static FORCEINLINE HRESULT INamespaceWalkCB_FoundItem(INamespaceWalkCB* This,IShellFolder *psf,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->FoundItem(This,psf,pidl);
}
static FORCEINLINE HRESULT INamespaceWalkCB_EnterFolder(INamespaceWalkCB* This,IShellFolder *psf,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->EnterFolder(This,psf,pidl);
}
static FORCEINLINE HRESULT INamespaceWalkCB_LeaveFolder(INamespaceWalkCB* This,IShellFolder *psf,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->LeaveFolder(This,psf,pidl);
}
static FORCEINLINE HRESULT INamespaceWalkCB_InitializeProgressDialog(INamespaceWalkCB* This,LPWSTR *ppszTitle,LPWSTR *ppszCancel) {
    return This->lpVtbl->InitializeProgressDialog(This,ppszTitle,ppszCancel);
}
#endif
#endif

#endif


#endif  /* __INamespaceWalkCB_INTERFACE_DEFINED__ */


#if _WIN32_IE >= _WIN32_IE_IE70
/*****************************************************************************
 * INamespaceWalkCB2 interface
 */
#ifndef __INamespaceWalkCB2_INTERFACE_DEFINED__
#define __INamespaceWalkCB2_INTERFACE_DEFINED__

DEFINE_GUID(IID_INamespaceWalkCB2, 0x7ac7492b, 0xc38e, 0x438a, 0x87,0xdb, 0x68,0x73,0x78,0x44,0xff,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7ac7492b-c38e-438a-87db-68737844ff70")
INamespaceWalkCB2 : public INamespaceWalkCB
{
    virtual HRESULT STDMETHODCALLTYPE WalkComplete(
        HRESULT hr) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INamespaceWalkCB2, 0x7ac7492b, 0xc38e, 0x438a, 0x87,0xdb, 0x68,0x73,0x78,0x44,0xff,0x70)
#endif
#else
typedef struct INamespaceWalkCB2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INamespaceWalkCB2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INamespaceWalkCB2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INamespaceWalkCB2 *This);

    /*** INamespaceWalkCB methods ***/
    HRESULT (STDMETHODCALLTYPE *FoundItem)(
        INamespaceWalkCB2 *This,
        IShellFolder *psf,
        PCUITEMID_CHILD pidl);

    HRESULT (STDMETHODCALLTYPE *EnterFolder)(
        INamespaceWalkCB2 *This,
        IShellFolder *psf,
        PCUITEMID_CHILD pidl);

    HRESULT (STDMETHODCALLTYPE *LeaveFolder)(
        INamespaceWalkCB2 *This,
        IShellFolder *psf,
        PCUITEMID_CHILD pidl);

    HRESULT (STDMETHODCALLTYPE *InitializeProgressDialog)(
        INamespaceWalkCB2 *This,
        LPWSTR *ppszTitle,
        LPWSTR *ppszCancel);

    /*** INamespaceWalkCB2 methods ***/
    HRESULT (STDMETHODCALLTYPE *WalkComplete)(
        INamespaceWalkCB2 *This,
        HRESULT hr);

    END_INTERFACE
} INamespaceWalkCB2Vtbl;

interface INamespaceWalkCB2 {
    CONST_VTBL INamespaceWalkCB2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INamespaceWalkCB2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INamespaceWalkCB2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INamespaceWalkCB2_Release(This) (This)->lpVtbl->Release(This)
/*** INamespaceWalkCB methods ***/
#define INamespaceWalkCB2_FoundItem(This,psf,pidl) (This)->lpVtbl->FoundItem(This,psf,pidl)
#define INamespaceWalkCB2_EnterFolder(This,psf,pidl) (This)->lpVtbl->EnterFolder(This,psf,pidl)
#define INamespaceWalkCB2_LeaveFolder(This,psf,pidl) (This)->lpVtbl->LeaveFolder(This,psf,pidl)
#define INamespaceWalkCB2_InitializeProgressDialog(This,ppszTitle,ppszCancel) (This)->lpVtbl->InitializeProgressDialog(This,ppszTitle,ppszCancel)
/*** INamespaceWalkCB2 methods ***/
#define INamespaceWalkCB2_WalkComplete(This,hr) (This)->lpVtbl->WalkComplete(This,hr)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INamespaceWalkCB2_QueryInterface(INamespaceWalkCB2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INamespaceWalkCB2_AddRef(INamespaceWalkCB2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INamespaceWalkCB2_Release(INamespaceWalkCB2* This) {
    return This->lpVtbl->Release(This);
}
/*** INamespaceWalkCB methods ***/
static FORCEINLINE HRESULT INamespaceWalkCB2_FoundItem(INamespaceWalkCB2* This,IShellFolder *psf,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->FoundItem(This,psf,pidl);
}
static FORCEINLINE HRESULT INamespaceWalkCB2_EnterFolder(INamespaceWalkCB2* This,IShellFolder *psf,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->EnterFolder(This,psf,pidl);
}
static FORCEINLINE HRESULT INamespaceWalkCB2_LeaveFolder(INamespaceWalkCB2* This,IShellFolder *psf,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->LeaveFolder(This,psf,pidl);
}
static FORCEINLINE HRESULT INamespaceWalkCB2_InitializeProgressDialog(INamespaceWalkCB2* This,LPWSTR *ppszTitle,LPWSTR *ppszCancel) {
    return This->lpVtbl->InitializeProgressDialog(This,ppszTitle,ppszCancel);
}
/*** INamespaceWalkCB2 methods ***/
static FORCEINLINE HRESULT INamespaceWalkCB2_WalkComplete(INamespaceWalkCB2* This,HRESULT hr) {
    return This->lpVtbl->WalkComplete(This,hr);
}
#endif
#endif

#endif


#endif  /* __INamespaceWalkCB2_INTERFACE_DEFINED__ */

#endif

/*****************************************************************************
 * INamespaceWalk interface
 */
#ifndef __INamespaceWalk_INTERFACE_DEFINED__
#define __INamespaceWalk_INTERFACE_DEFINED__

typedef enum NAMESPACEWALKFLAG {
    NSWF_DEFAULT = 0x0,
    NSWF_NONE_IMPLIES_ALL = 0x1,
    NSWF_ONE_IMPLIES_ALL = 0x2,
    NSWF_DONT_TRAVERSE_LINKS = 0x4,
    NSWF_DONT_ACCUMULATE_RESULT = 0x8,
    NSWF_TRAVERSE_STREAM_JUNCTIONS = 0x10,
    NSWF_FILESYSTEM_ONLY = 0x20,
    NSWF_SHOW_PROGRESS = 0x40,
    NSWF_FLAG_VIEWORDER = 0x80,
    NSWF_IGNORE_AUTOPLAY_HIDA = 0x100,
    NSWF_ASYNC = 0x200,
    NSWF_DONT_RESOLVE_LINKS = 0x400,
    NSWF_ACCUMULATE_FOLDERS = 0x800,
    NSWF_DONT_SORT = 0x1000,
    NSWF_USE_TRANSFER_MEDIUM = 0x2000,
    NSWF_DONT_TRAVERSE_STREAM_JUNCTIONS = 0x4000,
    NSWF_ANY_IMPLIES_ALL = 0x8000
} NAMESPACEWALKFLAG;

#define NSWF_ENUMERATE_BEST_EFFORT 0x00010000
#define NSWF_TRAVERSE_ONLY_STORAGE 0x00020000

DEFINE_ENUM_FLAG_OPERATORS(NAMESPACEWALKFLAG)

DEFINE_GUID(IID_INamespaceWalk, 0x57ced8a7, 0x3f4a, 0x432c, 0x93,0x50, 0x30,0xf2,0x44,0x83,0xf7,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("57ced8a7-3f4a-432c-9350-30f24483f74f")
INamespaceWalk : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Walk(
        IUnknown *punkToWalk,
        DWORD dwFlags,
        int cDepth,
        INamespaceWalkCB *pnswcb) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIDArrayResult(
        UINT *pcItems,
        PIDLIST_ABSOLUTE **prgpidl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INamespaceWalk, 0x57ced8a7, 0x3f4a, 0x432c, 0x93,0x50, 0x30,0xf2,0x44,0x83,0xf7,0x4f)
#endif
#else
typedef struct INamespaceWalkVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INamespaceWalk *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INamespaceWalk *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INamespaceWalk *This);

    /*** INamespaceWalk methods ***/
    HRESULT (STDMETHODCALLTYPE *Walk)(
        INamespaceWalk *This,
        IUnknown *punkToWalk,
        DWORD dwFlags,
        int cDepth,
        INamespaceWalkCB *pnswcb);

    HRESULT (STDMETHODCALLTYPE *GetIDArrayResult)(
        INamespaceWalk *This,
        UINT *pcItems,
        PIDLIST_ABSOLUTE **prgpidl);

    END_INTERFACE
} INamespaceWalkVtbl;

interface INamespaceWalk {
    CONST_VTBL INamespaceWalkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INamespaceWalk_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INamespaceWalk_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INamespaceWalk_Release(This) (This)->lpVtbl->Release(This)
/*** INamespaceWalk methods ***/
#define INamespaceWalk_Walk(This,punkToWalk,dwFlags,cDepth,pnswcb) (This)->lpVtbl->Walk(This,punkToWalk,dwFlags,cDepth,pnswcb)
#define INamespaceWalk_GetIDArrayResult(This,pcItems,prgpidl) (This)->lpVtbl->GetIDArrayResult(This,pcItems,prgpidl)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INamespaceWalk_QueryInterface(INamespaceWalk* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INamespaceWalk_AddRef(INamespaceWalk* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INamespaceWalk_Release(INamespaceWalk* This) {
    return This->lpVtbl->Release(This);
}
/*** INamespaceWalk methods ***/
static FORCEINLINE HRESULT INamespaceWalk_Walk(INamespaceWalk* This,IUnknown *punkToWalk,DWORD dwFlags,int cDepth,INamespaceWalkCB *pnswcb) {
    return This->lpVtbl->Walk(This,punkToWalk,dwFlags,cDepth,pnswcb);
}
static FORCEINLINE HRESULT INamespaceWalk_GetIDArrayResult(INamespaceWalk* This,UINT *pcItems,PIDLIST_ABSOLUTE **prgpidl) {
    return This->lpVtbl->GetIDArrayResult(This,pcItems,prgpidl);
}
#endif
#endif

#endif


#endif  /* __INamespaceWalk_INTERFACE_DEFINED__ */


  __forceinline void FreeIDListArray(PIDLIST_RELATIVE *ppidls, UINT cItems) {
    UINT i;
    for (i = 0; i < cItems; i++) {
      CoTaskMemFree(ppidls[i]);
    }
    CoTaskMemFree(ppidls);
  }
#if defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus)
  __forceinline void FreeIDListArrayFull(PIDLIST_ABSOLUTE *ppidls, UINT cItems) {
    UINT i;
    for (i = 0; i < cItems; i++)
      CoTaskMemFree(ppidls[i]);
    CoTaskMemFree(ppidls);
  }
  __forceinline void FreeIDListArrayChild(PITEMID_CHILD *ppidls, UINT cItems) {
    UINT i;
    for (i = 0; i < cItems; i++)
      CoTaskMemFree(ppidls[i]);
    CoTaskMemFree(ppidls);
  }
#else
#define FreeIDListArrayFull FreeIDListArray
#define FreeIDListArrayChild FreeIDListArray
#endif

#define ACDD_VISIBLE 0x1

/*****************************************************************************
 * IAutoCompleteDropDown interface
 */
#ifndef __IAutoCompleteDropDown_INTERFACE_DEFINED__
#define __IAutoCompleteDropDown_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAutoCompleteDropDown, 0x3cd141f4, 0x3c6a, 0x11d2, 0xbc,0xaa, 0x00,0xc0,0x4f,0xd9,0x29,0xdb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3cd141f4-3c6a-11d2-bcaa-00c04fd929db")
IAutoCompleteDropDown : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDropDownStatus(
        DWORD *pdwFlags,
        LPWSTR *ppwszString) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResetEnumerator(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAutoCompleteDropDown, 0x3cd141f4, 0x3c6a, 0x11d2, 0xbc,0xaa, 0x00,0xc0,0x4f,0xd9,0x29,0xdb)
#endif
#else
typedef struct IAutoCompleteDropDownVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAutoCompleteDropDown *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAutoCompleteDropDown *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAutoCompleteDropDown *This);

    /*** IAutoCompleteDropDown methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDropDownStatus)(
        IAutoCompleteDropDown *This,
        DWORD *pdwFlags,
        LPWSTR *ppwszString);

    HRESULT (STDMETHODCALLTYPE *ResetEnumerator)(
        IAutoCompleteDropDown *This);

    END_INTERFACE
} IAutoCompleteDropDownVtbl;

interface IAutoCompleteDropDown {
    CONST_VTBL IAutoCompleteDropDownVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAutoCompleteDropDown_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAutoCompleteDropDown_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAutoCompleteDropDown_Release(This) (This)->lpVtbl->Release(This)
/*** IAutoCompleteDropDown methods ***/
#define IAutoCompleteDropDown_GetDropDownStatus(This,pdwFlags,ppwszString) (This)->lpVtbl->GetDropDownStatus(This,pdwFlags,ppwszString)
#define IAutoCompleteDropDown_ResetEnumerator(This) (This)->lpVtbl->ResetEnumerator(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAutoCompleteDropDown_QueryInterface(IAutoCompleteDropDown* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAutoCompleteDropDown_AddRef(IAutoCompleteDropDown* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAutoCompleteDropDown_Release(IAutoCompleteDropDown* This) {
    return This->lpVtbl->Release(This);
}
/*** IAutoCompleteDropDown methods ***/
static FORCEINLINE HRESULT IAutoCompleteDropDown_GetDropDownStatus(IAutoCompleteDropDown* This,DWORD *pdwFlags,LPWSTR *ppwszString) {
    return This->lpVtbl->GetDropDownStatus(This,pdwFlags,ppwszString);
}
static FORCEINLINE HRESULT IAutoCompleteDropDown_ResetEnumerator(IAutoCompleteDropDown* This) {
    return This->lpVtbl->ResetEnumerator(This);
}
#endif
#endif

#endif


#endif  /* __IAutoCompleteDropDown_INTERFACE_DEFINED__ */


#include <pshpack8.h>
typedef struct tagBANDSITEINFO {
    DWORD dwMask;
    DWORD dwState;
    DWORD dwStyle;
} BANDSITEINFO;
#include <poppack.h>
enum tagBANDSITECID {
    BSID_BANDADDED = 0,
    BSID_BANDREMOVED = 1
};

#define BSIM_STATE 0x00000001
#define BSIM_STYLE 0x00000002

#define BSSF_VISIBLE 0x00000001
#define BSSF_NOTITLE 0x00000002
#define BSSF_UNDELETEABLE 0x00001000

#define BSIS_AUTOGRIPPER 0x00000000
#define BSIS_NOGRIPPER 0x00000001
#define BSIS_ALWAYSGRIPPER 0x00000002
#define BSIS_LEFTALIGN 0x00000004
#define BSIS_SINGLECLICK 0x00000008
#define BSIS_NOCONTEXTMENU 0x00000010
#define BSIS_NODROPTARGET 0x00000020
#define BSIS_NOCAPTION 0x00000040
#define BSIS_PREFERNOLINEBREAK 0x00000080
#define BSIS_LOCKED 0x00000100
#if _WIN32_IE >= _WIN32_IE_IE70
#define BSIS_PRESERVEORDERDURINGLAYOUT 0x00000200
#define BSIS_FIXEDORDER 0x00000400
#endif

#define SID_SBandSite IID_IBandSite
#define CGID_BandSite IID_IBandSite

/*****************************************************************************
 * IBandSite interface
 */
#ifndef __IBandSite_INTERFACE_DEFINED__
#define __IBandSite_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBandSite, 0x4cf504b0, 0xde96, 0x11d0, 0x8b,0x3f, 0x00,0xa0,0xc9,0x11,0xe8,0xe5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4cf504b0-de96-11d0-8b3f-00a0c911e8e5")
IBandSite : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddBand(
        IUnknown *punk) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumBands(
        UINT uBand,
        DWORD *pdwBandID) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryBand(
        DWORD dwBandID,
        IDeskBand **ppstb,
        DWORD *pdwState,
        LPWSTR pszName,
        int cchName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBandState(
        DWORD dwBandID,
        DWORD dwMask,
        DWORD dwState) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveBand(
        DWORD dwBandID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBandObject(
        DWORD dwBandID,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBandSiteInfo(
        const BANDSITEINFO *pbsinfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBandSiteInfo(
        BANDSITEINFO *pbsinfo) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBandSite, 0x4cf504b0, 0xde96, 0x11d0, 0x8b,0x3f, 0x00,0xa0,0xc9,0x11,0xe8,0xe5)
#endif
#else
typedef struct IBandSiteVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IBandSite *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IBandSite *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IBandSite *This);

    /*** IBandSite methods ***/
    HRESULT (STDMETHODCALLTYPE *AddBand)(
        IBandSite *This,
        IUnknown *punk);

    HRESULT (STDMETHODCALLTYPE *EnumBands)(
        IBandSite *This,
        UINT uBand,
        DWORD *pdwBandID);

    HRESULT (STDMETHODCALLTYPE *QueryBand)(
        IBandSite *This,
        DWORD dwBandID,
        IDeskBand **ppstb,
        DWORD *pdwState,
        LPWSTR pszName,
        int cchName);

    HRESULT (STDMETHODCALLTYPE *SetBandState)(
        IBandSite *This,
        DWORD dwBandID,
        DWORD dwMask,
        DWORD dwState);

    HRESULT (STDMETHODCALLTYPE *RemoveBand)(
        IBandSite *This,
        DWORD dwBandID);

    HRESULT (STDMETHODCALLTYPE *GetBandObject)(
        IBandSite *This,
        DWORD dwBandID,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *SetBandSiteInfo)(
        IBandSite *This,
        const BANDSITEINFO *pbsinfo);

    HRESULT (STDMETHODCALLTYPE *GetBandSiteInfo)(
        IBandSite *This,
        BANDSITEINFO *pbsinfo);

    END_INTERFACE
} IBandSiteVtbl;

interface IBandSite {
    CONST_VTBL IBandSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBandSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBandSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBandSite_Release(This) (This)->lpVtbl->Release(This)
/*** IBandSite methods ***/
#define IBandSite_AddBand(This,punk) (This)->lpVtbl->AddBand(This,punk)
#define IBandSite_EnumBands(This,uBand,pdwBandID) (This)->lpVtbl->EnumBands(This,uBand,pdwBandID)
#define IBandSite_QueryBand(This,dwBandID,ppstb,pdwState,pszName,cchName) (This)->lpVtbl->QueryBand(This,dwBandID,ppstb,pdwState,pszName,cchName)
#define IBandSite_SetBandState(This,dwBandID,dwMask,dwState) (This)->lpVtbl->SetBandState(This,dwBandID,dwMask,dwState)
#define IBandSite_RemoveBand(This,dwBandID) (This)->lpVtbl->RemoveBand(This,dwBandID)
#define IBandSite_GetBandObject(This,dwBandID,riid,ppv) (This)->lpVtbl->GetBandObject(This,dwBandID,riid,ppv)
#define IBandSite_SetBandSiteInfo(This,pbsinfo) (This)->lpVtbl->SetBandSiteInfo(This,pbsinfo)
#define IBandSite_GetBandSiteInfo(This,pbsinfo) (This)->lpVtbl->GetBandSiteInfo(This,pbsinfo)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBandSite_QueryInterface(IBandSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBandSite_AddRef(IBandSite* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBandSite_Release(IBandSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IBandSite methods ***/
static FORCEINLINE HRESULT IBandSite_AddBand(IBandSite* This,IUnknown *punk) {
    return This->lpVtbl->AddBand(This,punk);
}
static FORCEINLINE HRESULT IBandSite_EnumBands(IBandSite* This,UINT uBand,DWORD *pdwBandID) {
    return This->lpVtbl->EnumBands(This,uBand,pdwBandID);
}
static FORCEINLINE HRESULT IBandSite_QueryBand(IBandSite* This,DWORD dwBandID,IDeskBand **ppstb,DWORD *pdwState,LPWSTR pszName,int cchName) {
    return This->lpVtbl->QueryBand(This,dwBandID,ppstb,pdwState,pszName,cchName);
}
static FORCEINLINE HRESULT IBandSite_SetBandState(IBandSite* This,DWORD dwBandID,DWORD dwMask,DWORD dwState) {
    return This->lpVtbl->SetBandState(This,dwBandID,dwMask,dwState);
}
static FORCEINLINE HRESULT IBandSite_RemoveBand(IBandSite* This,DWORD dwBandID) {
    return This->lpVtbl->RemoveBand(This,dwBandID);
}
static FORCEINLINE HRESULT IBandSite_GetBandObject(IBandSite* This,DWORD dwBandID,REFIID riid,void **ppv) {
    return This->lpVtbl->GetBandObject(This,dwBandID,riid,ppv);
}
static FORCEINLINE HRESULT IBandSite_SetBandSiteInfo(IBandSite* This,const BANDSITEINFO *pbsinfo) {
    return This->lpVtbl->SetBandSiteInfo(This,pbsinfo);
}
static FORCEINLINE HRESULT IBandSite_GetBandSiteInfo(IBandSite* This,BANDSITEINFO *pbsinfo) {
    return This->lpVtbl->GetBandSiteInfo(This,pbsinfo);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IBandSite_RemoteQueryBand_Proxy(
    IBandSite* This,
    DWORD dwBandID,
    IDeskBand **ppstb,
    DWORD *pdwState,
    LPWSTR pszName,
    int cchName);
void __RPC_STUB IBandSite_RemoteQueryBand_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IBandSite_QueryBand_Proxy(
    IBandSite* This,
    DWORD dwBandID,
    IDeskBand **ppstb,
    DWORD *pdwState,
    LPWSTR pszName,
    int cchName);
HRESULT __RPC_STUB IBandSite_QueryBand_Stub(
    IBandSite* This,
    DWORD dwBandID,
    IDeskBand **ppstb,
    DWORD *pdwState,
    LPWSTR pszName,
    int cchName);

#endif  /* __IBandSite_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IModalWindow interface
 */
#ifndef __IModalWindow_INTERFACE_DEFINED__
#define __IModalWindow_INTERFACE_DEFINED__

DEFINE_GUID(IID_IModalWindow, 0xb4db1657, 0x70d7, 0x485e, 0x8e,0x3e, 0x6f,0xcb,0x5a,0x5c,0x18,0x02);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b4db1657-70d7-485e-8e3e-6fcb5a5c1802")
IModalWindow : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Show(
        HWND hwndOwner) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IModalWindow, 0xb4db1657, 0x70d7, 0x485e, 0x8e,0x3e, 0x6f,0xcb,0x5a,0x5c,0x18,0x02)
#endif
#else
typedef struct IModalWindowVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IModalWindow *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IModalWindow *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IModalWindow *This);

    /*** IModalWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *Show)(
        IModalWindow *This,
        HWND hwndOwner);

    END_INTERFACE
} IModalWindowVtbl;

interface IModalWindow {
    CONST_VTBL IModalWindowVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IModalWindow_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IModalWindow_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IModalWindow_Release(This) (This)->lpVtbl->Release(This)
/*** IModalWindow methods ***/
#define IModalWindow_Show(This,hwndOwner) (This)->lpVtbl->Show(This,hwndOwner)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IModalWindow_QueryInterface(IModalWindow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IModalWindow_AddRef(IModalWindow* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IModalWindow_Release(IModalWindow* This) {
    return This->lpVtbl->Release(This);
}
/*** IModalWindow methods ***/
static FORCEINLINE HRESULT IModalWindow_Show(IModalWindow* This,HWND hwndOwner) {
    return This->lpVtbl->Show(This,hwndOwner);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IModalWindow_RemoteShow_Proxy(
    IModalWindow* This,
    HWND hwndOwner);
void __RPC_STUB IModalWindow_RemoteShow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IModalWindow_Show_Proxy(
    IModalWindow* This,
    HWND hwndOwner);
HRESULT __RPC_STUB IModalWindow_Show_Stub(
    IModalWindow* This,
    HWND hwndOwner);

#endif  /* __IModalWindow_INTERFACE_DEFINED__ */


#define PROPSTR_EXTENSIONCOMPLETIONSTATE L"ExtensionCompletionState"

enum tagCDBURNINGEXTENSIONRET {
    CDBE_RET_DEFAULT = 0x0,
    CDBE_RET_DONTRUNOTHEREXTS = 0x1,
    CDBE_RET_STOPWIZARD = 0x2
};

#define SID_CDWizardHost IID_ICDBurnExt

enum _CDBE_ACTIONS {
    CDBE_TYPE_MUSIC = 0x1,
    CDBE_TYPE_DATA = 0x2,
    CDBE_TYPE_ALL = (int)0xffffffff
};

typedef DWORD CDBE_ACTIONS;

/*****************************************************************************
 * ICDBurnExt interface
 */
#ifndef __ICDBurnExt_INTERFACE_DEFINED__
#define __ICDBurnExt_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICDBurnExt, 0x2271dcca, 0x74fc, 0x4414, 0x8f,0xb7, 0xc5,0x6b,0x05,0xac,0xe2,0xd7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2271dcca-74fc-4414-8fb7-c56b05ace2d7")
ICDBurnExt : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSupportedActionTypes(
        CDBE_ACTIONS *pdwActions) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICDBurnExt, 0x2271dcca, 0x74fc, 0x4414, 0x8f,0xb7, 0xc5,0x6b,0x05,0xac,0xe2,0xd7)
#endif
#else
typedef struct ICDBurnExtVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICDBurnExt *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICDBurnExt *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICDBurnExt *This);

    /*** ICDBurnExt methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSupportedActionTypes)(
        ICDBurnExt *This,
        CDBE_ACTIONS *pdwActions);

    END_INTERFACE
} ICDBurnExtVtbl;

interface ICDBurnExt {
    CONST_VTBL ICDBurnExtVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICDBurnExt_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICDBurnExt_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICDBurnExt_Release(This) (This)->lpVtbl->Release(This)
/*** ICDBurnExt methods ***/
#define ICDBurnExt_GetSupportedActionTypes(This,pdwActions) (This)->lpVtbl->GetSupportedActionTypes(This,pdwActions)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICDBurnExt_QueryInterface(ICDBurnExt* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICDBurnExt_AddRef(ICDBurnExt* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICDBurnExt_Release(ICDBurnExt* This) {
    return This->lpVtbl->Release(This);
}
/*** ICDBurnExt methods ***/
static FORCEINLINE HRESULT ICDBurnExt_GetSupportedActionTypes(ICDBurnExt* This,CDBE_ACTIONS *pdwActions) {
    return This->lpVtbl->GetSupportedActionTypes(This,pdwActions);
}
#endif
#endif

#endif


#endif  /* __ICDBurnExt_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IContextMenuSite interface
 */
#ifndef __IContextMenuSite_INTERFACE_DEFINED__
#define __IContextMenuSite_INTERFACE_DEFINED__

DEFINE_GUID(IID_IContextMenuSite, 0x0811aebe, 0x0b87, 0x4c54, 0x9e,0x72, 0x54,0x8c,0xf6,0x49,0x01,0x6b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0811aebe-0b87-4c54-9e72-548cf649016b")
IContextMenuSite : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE DoContextMenuPopup(
        IUnknown *punkContextMenu,
        UINT fFlags,
        POINT pt) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IContextMenuSite, 0x0811aebe, 0x0b87, 0x4c54, 0x9e,0x72, 0x54,0x8c,0xf6,0x49,0x01,0x6b)
#endif
#else
typedef struct IContextMenuSiteVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IContextMenuSite *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IContextMenuSite *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IContextMenuSite *This);

    /*** IContextMenuSite methods ***/
    HRESULT (STDMETHODCALLTYPE *DoContextMenuPopup)(
        IContextMenuSite *This,
        IUnknown *punkContextMenu,
        UINT fFlags,
        POINT pt);

    END_INTERFACE
} IContextMenuSiteVtbl;

interface IContextMenuSite {
    CONST_VTBL IContextMenuSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IContextMenuSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IContextMenuSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IContextMenuSite_Release(This) (This)->lpVtbl->Release(This)
/*** IContextMenuSite methods ***/
#define IContextMenuSite_DoContextMenuPopup(This,punkContextMenu,fFlags,pt) (This)->lpVtbl->DoContextMenuPopup(This,punkContextMenu,fFlags,pt)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IContextMenuSite_QueryInterface(IContextMenuSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IContextMenuSite_AddRef(IContextMenuSite* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IContextMenuSite_Release(IContextMenuSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IContextMenuSite methods ***/
static FORCEINLINE HRESULT IContextMenuSite_DoContextMenuPopup(IContextMenuSite* This,IUnknown *punkContextMenu,UINT fFlags,POINT pt) {
    return This->lpVtbl->DoContextMenuPopup(This,punkContextMenu,fFlags,pt);
}
#endif
#endif

#endif


#endif  /* __IContextMenuSite_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IEnumReadyCallback interface
 */
#ifndef __IEnumReadyCallback_INTERFACE_DEFINED__
#define __IEnumReadyCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumReadyCallback, 0x61e00d45, 0x8fff, 0x4e60, 0x92,0x4e, 0x65,0x37,0xb6,0x16,0x12,0xdd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("61e00d45-8fff-4e60-924e-6537b61612dd")
IEnumReadyCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EnumReady(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumReadyCallback, 0x61e00d45, 0x8fff, 0x4e60, 0x92,0x4e, 0x65,0x37,0xb6,0x16,0x12,0xdd)
#endif
#else
typedef struct IEnumReadyCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumReadyCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumReadyCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumReadyCallback *This);

    /*** IEnumReadyCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumReady)(
        IEnumReadyCallback *This);

    END_INTERFACE
} IEnumReadyCallbackVtbl;

interface IEnumReadyCallback {
    CONST_VTBL IEnumReadyCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumReadyCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumReadyCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumReadyCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumReadyCallback methods ***/
#define IEnumReadyCallback_EnumReady(This) (This)->lpVtbl->EnumReady(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumReadyCallback_QueryInterface(IEnumReadyCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumReadyCallback_AddRef(IEnumReadyCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumReadyCallback_Release(IEnumReadyCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumReadyCallback methods ***/
static FORCEINLINE HRESULT IEnumReadyCallback_EnumReady(IEnumReadyCallback* This) {
    return This->lpVtbl->EnumReady(This);
}
#endif
#endif

#endif


#endif  /* __IEnumReadyCallback_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IEnumerableView interface
 */
#ifndef __IEnumerableView_INTERFACE_DEFINED__
#define __IEnumerableView_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumerableView, 0x8c8bf236, 0x1aec, 0x495f, 0x98,0x94, 0x91,0xd5,0x7c,0x3c,0x68,0x6f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8c8bf236-1aec-495f-9894-91d57c3c686f")
IEnumerableView : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetEnumReadyCallback(
        IEnumReadyCallback *percb) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateEnumIDListFromContents(
        PCIDLIST_ABSOLUTE pidlFolder,
        DWORD dwEnumFlags,
        IEnumIDList **ppEnumIDList) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumerableView, 0x8c8bf236, 0x1aec, 0x495f, 0x98,0x94, 0x91,0xd5,0x7c,0x3c,0x68,0x6f)
#endif
#else
typedef struct IEnumerableViewVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumerableView *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumerableView *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumerableView *This);

    /*** IEnumerableView methods ***/
    HRESULT (STDMETHODCALLTYPE *SetEnumReadyCallback)(
        IEnumerableView *This,
        IEnumReadyCallback *percb);

    HRESULT (STDMETHODCALLTYPE *CreateEnumIDListFromContents)(
        IEnumerableView *This,
        PCIDLIST_ABSOLUTE pidlFolder,
        DWORD dwEnumFlags,
        IEnumIDList **ppEnumIDList);

    END_INTERFACE
} IEnumerableViewVtbl;

interface IEnumerableView {
    CONST_VTBL IEnumerableViewVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumerableView_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumerableView_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumerableView_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumerableView methods ***/
#define IEnumerableView_SetEnumReadyCallback(This,percb) (This)->lpVtbl->SetEnumReadyCallback(This,percb)
#define IEnumerableView_CreateEnumIDListFromContents(This,pidlFolder,dwEnumFlags,ppEnumIDList) (This)->lpVtbl->CreateEnumIDListFromContents(This,pidlFolder,dwEnumFlags,ppEnumIDList)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumerableView_QueryInterface(IEnumerableView* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumerableView_AddRef(IEnumerableView* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumerableView_Release(IEnumerableView* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumerableView methods ***/
static FORCEINLINE HRESULT IEnumerableView_SetEnumReadyCallback(IEnumerableView* This,IEnumReadyCallback *percb) {
    return This->lpVtbl->SetEnumReadyCallback(This,percb);
}
static FORCEINLINE HRESULT IEnumerableView_CreateEnumIDListFromContents(IEnumerableView* This,PCIDLIST_ABSOLUTE pidlFolder,DWORD dwEnumFlags,IEnumIDList **ppEnumIDList) {
    return This->lpVtbl->CreateEnumIDListFromContents(This,pidlFolder,dwEnumFlags,ppEnumIDList);
}
#endif
#endif

#endif


#endif  /* __IEnumerableView_INTERFACE_DEFINED__ */


#define SID_EnumerableView IID_IEnumerableView

/*****************************************************************************
 * IInsertItem interface
 */
#ifndef __IInsertItem_INTERFACE_DEFINED__
#define __IInsertItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInsertItem, 0xd2b57227, 0x3d23, 0x4b95, 0x93,0xc0, 0x49,0x2b,0xd4,0x54,0xc3,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d2b57227-3d23-4b95-93c0-492bd454c356")
IInsertItem : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InsertItem(
        PCUIDLIST_RELATIVE pidl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInsertItem, 0xd2b57227, 0x3d23, 0x4b95, 0x93,0xc0, 0x49,0x2b,0xd4,0x54,0xc3,0x56)
#endif
#else
typedef struct IInsertItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInsertItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInsertItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInsertItem *This);

    /*** IInsertItem methods ***/
    HRESULT (STDMETHODCALLTYPE *InsertItem)(
        IInsertItem *This,
        PCUIDLIST_RELATIVE pidl);

    END_INTERFACE
} IInsertItemVtbl;

interface IInsertItem {
    CONST_VTBL IInsertItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInsertItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInsertItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInsertItem_Release(This) (This)->lpVtbl->Release(This)
/*** IInsertItem methods ***/
#define IInsertItem_InsertItem(This,pidl) (This)->lpVtbl->InsertItem(This,pidl)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInsertItem_QueryInterface(IInsertItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInsertItem_AddRef(IInsertItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInsertItem_Release(IInsertItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IInsertItem methods ***/
static FORCEINLINE HRESULT IInsertItem_InsertItem(IInsertItem* This,PCUIDLIST_RELATIVE pidl) {
    return This->lpVtbl->InsertItem(This,pidl);
}
#endif
#endif

#endif


#endif  /* __IInsertItem_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IMenuBand interface
 */
#ifndef __IMenuBand_INTERFACE_DEFINED__
#define __IMenuBand_INTERFACE_DEFINED__

enum tagMENUBANDHANDLERCID {
    MBHANDCID_PIDLSELECT = 0
};

DEFINE_GUID(IID_IMenuBand, 0x568804cd, 0xcbd7, 0x11d0, 0x98,0x16, 0x00,0xc0,0x4f,0xd9,0x19,0x72);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("568804cd-cbd7-11d0-9816-00c04fd91972")
IMenuBand : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE IsMenuMessage(
        MSG *pmsg) = 0;

    virtual HRESULT STDMETHODCALLTYPE TranslateMenuMessage(
        MSG *pmsg,
        LRESULT *plRet) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMenuBand, 0x568804cd, 0xcbd7, 0x11d0, 0x98,0x16, 0x00,0xc0,0x4f,0xd9,0x19,0x72)
#endif
#else
typedef struct IMenuBandVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMenuBand *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMenuBand *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMenuBand *This);

    /*** IMenuBand methods ***/
    HRESULT (STDMETHODCALLTYPE *IsMenuMessage)(
        IMenuBand *This,
        MSG *pmsg);

    HRESULT (STDMETHODCALLTYPE *TranslateMenuMessage)(
        IMenuBand *This,
        MSG *pmsg,
        LRESULT *plRet);

    END_INTERFACE
} IMenuBandVtbl;

interface IMenuBand {
    CONST_VTBL IMenuBandVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMenuBand_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMenuBand_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMenuBand_Release(This) (This)->lpVtbl->Release(This)
/*** IMenuBand methods ***/
#define IMenuBand_IsMenuMessage(This,pmsg) (This)->lpVtbl->IsMenuMessage(This,pmsg)
#define IMenuBand_TranslateMenuMessage(This,pmsg,plRet) (This)->lpVtbl->TranslateMenuMessage(This,pmsg,plRet)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMenuBand_QueryInterface(IMenuBand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMenuBand_AddRef(IMenuBand* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMenuBand_Release(IMenuBand* This) {
    return This->lpVtbl->Release(This);
}
/*** IMenuBand methods ***/
static FORCEINLINE HRESULT IMenuBand_IsMenuMessage(IMenuBand* This,MSG *pmsg) {
    return This->lpVtbl->IsMenuMessage(This,pmsg);
}
static FORCEINLINE HRESULT IMenuBand_TranslateMenuMessage(IMenuBand* This,MSG *pmsg,LRESULT *plRet) {
    return This->lpVtbl->TranslateMenuMessage(This,pmsg,plRet);
}
#endif
#endif

#endif


#endif  /* __IMenuBand_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IFolderBandPriv interface
 */
#ifndef __IFolderBandPriv_INTERFACE_DEFINED__
#define __IFolderBandPriv_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFolderBandPriv, 0x47c01f95, 0xe185, 0x412c, 0xb5,0xc5, 0x4f,0x27,0xdf,0x96,0x5a,0xea);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("47c01f95-e185-412c-b5c5-4f27df965aea")
IFolderBandPriv : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetCascade(
        WINBOOL fCascade) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAccelerators(
        WINBOOL fAccelerators) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetNoIcons(
        WINBOOL fNoIcons) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetNoText(
        WINBOOL fNoText) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFolderBandPriv, 0x47c01f95, 0xe185, 0x412c, 0xb5,0xc5, 0x4f,0x27,0xdf,0x96,0x5a,0xea)
#endif
#else
typedef struct IFolderBandPrivVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFolderBandPriv *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFolderBandPriv *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFolderBandPriv *This);

    /*** IFolderBandPriv methods ***/
    HRESULT (STDMETHODCALLTYPE *SetCascade)(
        IFolderBandPriv *This,
        WINBOOL fCascade);

    HRESULT (STDMETHODCALLTYPE *SetAccelerators)(
        IFolderBandPriv *This,
        WINBOOL fAccelerators);

    HRESULT (STDMETHODCALLTYPE *SetNoIcons)(
        IFolderBandPriv *This,
        WINBOOL fNoIcons);

    HRESULT (STDMETHODCALLTYPE *SetNoText)(
        IFolderBandPriv *This,
        WINBOOL fNoText);

    END_INTERFACE
} IFolderBandPrivVtbl;

interface IFolderBandPriv {
    CONST_VTBL IFolderBandPrivVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFolderBandPriv_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFolderBandPriv_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFolderBandPriv_Release(This) (This)->lpVtbl->Release(This)
/*** IFolderBandPriv methods ***/
#define IFolderBandPriv_SetCascade(This,fCascade) (This)->lpVtbl->SetCascade(This,fCascade)
#define IFolderBandPriv_SetAccelerators(This,fAccelerators) (This)->lpVtbl->SetAccelerators(This,fAccelerators)
#define IFolderBandPriv_SetNoIcons(This,fNoIcons) (This)->lpVtbl->SetNoIcons(This,fNoIcons)
#define IFolderBandPriv_SetNoText(This,fNoText) (This)->lpVtbl->SetNoText(This,fNoText)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFolderBandPriv_QueryInterface(IFolderBandPriv* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFolderBandPriv_AddRef(IFolderBandPriv* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFolderBandPriv_Release(IFolderBandPriv* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderBandPriv methods ***/
static FORCEINLINE HRESULT IFolderBandPriv_SetCascade(IFolderBandPriv* This,WINBOOL fCascade) {
    return This->lpVtbl->SetCascade(This,fCascade);
}
static FORCEINLINE HRESULT IFolderBandPriv_SetAccelerators(IFolderBandPriv* This,WINBOOL fAccelerators) {
    return This->lpVtbl->SetAccelerators(This,fAccelerators);
}
static FORCEINLINE HRESULT IFolderBandPriv_SetNoIcons(IFolderBandPriv* This,WINBOOL fNoIcons) {
    return This->lpVtbl->SetNoIcons(This,fNoIcons);
}
static FORCEINLINE HRESULT IFolderBandPriv_SetNoText(IFolderBandPriv* This,WINBOOL fNoText) {
    return This->lpVtbl->SetNoText(This,fNoText);
}
#endif
#endif

#endif


#endif  /* __IFolderBandPriv_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IRegTreeItem interface
 */
#ifndef __IRegTreeItem_INTERFACE_DEFINED__
#define __IRegTreeItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRegTreeItem, 0xa9521922, 0x0812, 0x4d44, 0x9e,0xc3, 0x7f,0xd3,0x8c,0x72,0x6f,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a9521922-0812-4d44-9ec3-7fd38c726f3d")
IRegTreeItem : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCheckState(
        WINBOOL *pbCheck) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCheckState(
        WINBOOL bCheck) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRegTreeItem, 0xa9521922, 0x0812, 0x4d44, 0x9e,0xc3, 0x7f,0xd3,0x8c,0x72,0x6f,0x3d)
#endif
#else
typedef struct IRegTreeItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRegTreeItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRegTreeItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRegTreeItem *This);

    /*** IRegTreeItem methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCheckState)(
        IRegTreeItem *This,
        WINBOOL *pbCheck);

    HRESULT (STDMETHODCALLTYPE *SetCheckState)(
        IRegTreeItem *This,
        WINBOOL bCheck);

    END_INTERFACE
} IRegTreeItemVtbl;

interface IRegTreeItem {
    CONST_VTBL IRegTreeItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRegTreeItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRegTreeItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRegTreeItem_Release(This) (This)->lpVtbl->Release(This)
/*** IRegTreeItem methods ***/
#define IRegTreeItem_GetCheckState(This,pbCheck) (This)->lpVtbl->GetCheckState(This,pbCheck)
#define IRegTreeItem_SetCheckState(This,bCheck) (This)->lpVtbl->SetCheckState(This,bCheck)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRegTreeItem_QueryInterface(IRegTreeItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRegTreeItem_AddRef(IRegTreeItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRegTreeItem_Release(IRegTreeItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRegTreeItem methods ***/
static FORCEINLINE HRESULT IRegTreeItem_GetCheckState(IRegTreeItem* This,WINBOOL *pbCheck) {
    return This->lpVtbl->GetCheckState(This,pbCheck);
}
static FORCEINLINE HRESULT IRegTreeItem_SetCheckState(IRegTreeItem* This,WINBOOL bCheck) {
    return This->lpVtbl->SetCheckState(This,bCheck);
}
#endif
#endif

#endif


#endif  /* __IRegTreeItem_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IImageRecompress interface
 */
#ifndef __IImageRecompress_INTERFACE_DEFINED__
#define __IImageRecompress_INTERFACE_DEFINED__

DEFINE_GUID(IID_IImageRecompress, 0x505f1513, 0x6b3e, 0x4892, 0xa2,0x72, 0x59,0xf8,0x88,0x9a,0x4d,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("505f1513-6b3e-4892-a272-59f8889a4d3e")
IImageRecompress : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RecompressImage(
        IShellItem *psi,
        int cx,
        int cy,
        int iQuality,
        IStorage *pstg,
        IStream **ppstrmOut) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IImageRecompress, 0x505f1513, 0x6b3e, 0x4892, 0xa2,0x72, 0x59,0xf8,0x88,0x9a,0x4d,0x3e)
#endif
#else
typedef struct IImageRecompressVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IImageRecompress *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IImageRecompress *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IImageRecompress *This);

    /*** IImageRecompress methods ***/
    HRESULT (STDMETHODCALLTYPE *RecompressImage)(
        IImageRecompress *This,
        IShellItem *psi,
        int cx,
        int cy,
        int iQuality,
        IStorage *pstg,
        IStream **ppstrmOut);

    END_INTERFACE
} IImageRecompressVtbl;

interface IImageRecompress {
    CONST_VTBL IImageRecompressVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IImageRecompress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IImageRecompress_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IImageRecompress_Release(This) (This)->lpVtbl->Release(This)
/*** IImageRecompress methods ***/
#define IImageRecompress_RecompressImage(This,psi,cx,cy,iQuality,pstg,ppstrmOut) (This)->lpVtbl->RecompressImage(This,psi,cx,cy,iQuality,pstg,ppstrmOut)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IImageRecompress_QueryInterface(IImageRecompress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IImageRecompress_AddRef(IImageRecompress* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IImageRecompress_Release(IImageRecompress* This) {
    return This->lpVtbl->Release(This);
}
/*** IImageRecompress methods ***/
static FORCEINLINE HRESULT IImageRecompress_RecompressImage(IImageRecompress* This,IShellItem *psi,int cx,int cy,int iQuality,IStorage *pstg,IStream **ppstrmOut) {
    return This->lpVtbl->RecompressImage(This,psi,cx,cy,iQuality,pstg,ppstrmOut);
}
#endif
#endif

#endif


#endif  /* __IImageRecompress_INTERFACE_DEFINED__ */


#if _WIN32_IE >= _WIN32_IE_IE60
/*****************************************************************************
 * IDeskBar interface
 */
#ifndef __IDeskBar_INTERFACE_DEFINED__
#define __IDeskBar_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDeskBar, 0xeb0fe173, 0x1a3a, 0x11d0, 0x89,0xb3, 0x00,0xa0,0xc9,0x0a,0x90,0xac);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("eb0fe173-1a3a-11d0-89b3-00a0c90a90ac")
IDeskBar : public IOleWindow
{
    virtual HRESULT STDMETHODCALLTYPE SetClient(
        IUnknown *punkClient) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetClient(
        IUnknown **ppunkClient) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnPosRectChangeDB(
        RECT *prc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDeskBar, 0xeb0fe173, 0x1a3a, 0x11d0, 0x89,0xb3, 0x00,0xa0,0xc9,0x0a,0x90,0xac)
#endif
#else
typedef struct IDeskBarVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDeskBar *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDeskBar *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDeskBar *This);

    /*** IOleWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IDeskBar *This,
        HWND *phwnd);

    HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)(
        IDeskBar *This,
        WINBOOL fEnterMode);

    /*** IDeskBar methods ***/
    HRESULT (STDMETHODCALLTYPE *SetClient)(
        IDeskBar *This,
        IUnknown *punkClient);

    HRESULT (STDMETHODCALLTYPE *GetClient)(
        IDeskBar *This,
        IUnknown **ppunkClient);

    HRESULT (STDMETHODCALLTYPE *OnPosRectChangeDB)(
        IDeskBar *This,
        RECT *prc);

    END_INTERFACE
} IDeskBarVtbl;

interface IDeskBar {
    CONST_VTBL IDeskBarVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDeskBar_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDeskBar_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDeskBar_Release(This) (This)->lpVtbl->Release(This)
/*** IOleWindow methods ***/
#define IDeskBar_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IDeskBar_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
/*** IDeskBar methods ***/
#define IDeskBar_SetClient(This,punkClient) (This)->lpVtbl->SetClient(This,punkClient)
#define IDeskBar_GetClient(This,ppunkClient) (This)->lpVtbl->GetClient(This,ppunkClient)
#define IDeskBar_OnPosRectChangeDB(This,prc) (This)->lpVtbl->OnPosRectChangeDB(This,prc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDeskBar_QueryInterface(IDeskBar* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDeskBar_AddRef(IDeskBar* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDeskBar_Release(IDeskBar* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static FORCEINLINE HRESULT IDeskBar_GetWindow(IDeskBar* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static FORCEINLINE HRESULT IDeskBar_ContextSensitiveHelp(IDeskBar* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IDeskBar methods ***/
static FORCEINLINE HRESULT IDeskBar_SetClient(IDeskBar* This,IUnknown *punkClient) {
    return This->lpVtbl->SetClient(This,punkClient);
}
static FORCEINLINE HRESULT IDeskBar_GetClient(IDeskBar* This,IUnknown **ppunkClient) {
    return This->lpVtbl->GetClient(This,ppunkClient);
}
static FORCEINLINE HRESULT IDeskBar_OnPosRectChangeDB(IDeskBar* This,RECT *prc) {
    return This->lpVtbl->OnPosRectChangeDB(This,prc);
}
#endif
#endif

#endif


#endif  /* __IDeskBar_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IMenuPopup interface
 */
#ifndef __IMenuPopup_INTERFACE_DEFINED__
#define __IMenuPopup_INTERFACE_DEFINED__

enum tagMENUPOPUPSELECT {
    MPOS_EXECUTE = 0,
    MPOS_FULLCANCEL = 1,
    MPOS_CANCELLEVEL = 2,
    MPOS_SELECTLEFT = 3,
    MPOS_SELECTRIGHT = 4,
    MPOS_CHILDTRACKING = 5
};

enum tagMENUPOPUPPOPUPFLAGS {
    MPPF_SETFOCUS = 0x1,
    MPPF_INITIALSELECT = 0x2,
    MPPF_NOANIMATE = 0x4,
    MPPF_KEYBOARD = 0x10,
    MPPF_REPOSITION = 0x20,
    MPPF_FORCEZORDER = 0x40,
    MPPF_FINALSELECT = 0x80,
    MPPF_TOP = 0x20000000,
    MPPF_LEFT = 0x40000000,
    MPPF_RIGHT = 0x60000000,
    MPPF_BOTTOM = (int)0x80000000,
    MPPF_POS_MASK = (int)0xe0000000,
    MPPF_ALIGN_LEFT = 0x2000000,
    MPPF_ALIGN_RIGHT = 0x4000000
};

typedef int MP_POPUPFLAGS;

DEFINE_GUID(IID_IMenuPopup, 0xd1e7afeb, 0x6a2e, 0x11d0, 0x8c,0x78, 0x00,0xc0,0x4f,0xd9,0x18,0xb4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d1e7afeb-6a2e-11d0-8c78-00c04fd918b4")
IMenuPopup : public IDeskBar
{
    virtual HRESULT STDMETHODCALLTYPE Popup(
        POINTL *ppt,
        RECTL *prcExclude,
        MP_POPUPFLAGS dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnSelect(
        DWORD dwSelectType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSubMenu(
        IMenuPopup *pmp,
        WINBOOL fSet) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMenuPopup, 0xd1e7afeb, 0x6a2e, 0x11d0, 0x8c,0x78, 0x00,0xc0,0x4f,0xd9,0x18,0xb4)
#endif
#else
typedef struct IMenuPopupVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMenuPopup *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMenuPopup *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMenuPopup *This);

    /*** IOleWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindow)(
        IMenuPopup *This,
        HWND *phwnd);

    HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)(
        IMenuPopup *This,
        WINBOOL fEnterMode);

    /*** IDeskBar methods ***/
    HRESULT (STDMETHODCALLTYPE *SetClient)(
        IMenuPopup *This,
        IUnknown *punkClient);

    HRESULT (STDMETHODCALLTYPE *GetClient)(
        IMenuPopup *This,
        IUnknown **ppunkClient);

    HRESULT (STDMETHODCALLTYPE *OnPosRectChangeDB)(
        IMenuPopup *This,
        RECT *prc);

    /*** IMenuPopup methods ***/
    HRESULT (STDMETHODCALLTYPE *Popup)(
        IMenuPopup *This,
        POINTL *ppt,
        RECTL *prcExclude,
        MP_POPUPFLAGS dwFlags);

    HRESULT (STDMETHODCALLTYPE *OnSelect)(
        IMenuPopup *This,
        DWORD dwSelectType);

    HRESULT (STDMETHODCALLTYPE *SetSubMenu)(
        IMenuPopup *This,
        IMenuPopup *pmp,
        WINBOOL fSet);

    END_INTERFACE
} IMenuPopupVtbl;

interface IMenuPopup {
    CONST_VTBL IMenuPopupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMenuPopup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMenuPopup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMenuPopup_Release(This) (This)->lpVtbl->Release(This)
/*** IOleWindow methods ***/
#define IMenuPopup_GetWindow(This,phwnd) (This)->lpVtbl->GetWindow(This,phwnd)
#define IMenuPopup_ContextSensitiveHelp(This,fEnterMode) (This)->lpVtbl->ContextSensitiveHelp(This,fEnterMode)
/*** IDeskBar methods ***/
#define IMenuPopup_SetClient(This,punkClient) (This)->lpVtbl->SetClient(This,punkClient)
#define IMenuPopup_GetClient(This,ppunkClient) (This)->lpVtbl->GetClient(This,ppunkClient)
#define IMenuPopup_OnPosRectChangeDB(This,prc) (This)->lpVtbl->OnPosRectChangeDB(This,prc)
/*** IMenuPopup methods ***/
#define IMenuPopup_Popup(This,ppt,prcExclude,dwFlags) (This)->lpVtbl->Popup(This,ppt,prcExclude,dwFlags)
#define IMenuPopup_OnSelect(This,dwSelectType) (This)->lpVtbl->OnSelect(This,dwSelectType)
#define IMenuPopup_SetSubMenu(This,pmp,fSet) (This)->lpVtbl->SetSubMenu(This,pmp,fSet)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMenuPopup_QueryInterface(IMenuPopup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMenuPopup_AddRef(IMenuPopup* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMenuPopup_Release(IMenuPopup* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static FORCEINLINE HRESULT IMenuPopup_GetWindow(IMenuPopup* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static FORCEINLINE HRESULT IMenuPopup_ContextSensitiveHelp(IMenuPopup* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IDeskBar methods ***/
static FORCEINLINE HRESULT IMenuPopup_SetClient(IMenuPopup* This,IUnknown *punkClient) {
    return This->lpVtbl->SetClient(This,punkClient);
}
static FORCEINLINE HRESULT IMenuPopup_GetClient(IMenuPopup* This,IUnknown **ppunkClient) {
    return This->lpVtbl->GetClient(This,ppunkClient);
}
static FORCEINLINE HRESULT IMenuPopup_OnPosRectChangeDB(IMenuPopup* This,RECT *prc) {
    return This->lpVtbl->OnPosRectChangeDB(This,prc);
}
/*** IMenuPopup methods ***/
static FORCEINLINE HRESULT IMenuPopup_Popup(IMenuPopup* This,POINTL *ppt,RECTL *prcExclude,MP_POPUPFLAGS dwFlags) {
    return This->lpVtbl->Popup(This,ppt,prcExclude,dwFlags);
}
static FORCEINLINE HRESULT IMenuPopup_OnSelect(IMenuPopup* This,DWORD dwSelectType) {
    return This->lpVtbl->OnSelect(This,dwSelectType);
}
static FORCEINLINE HRESULT IMenuPopup_SetSubMenu(IMenuPopup* This,IMenuPopup *pmp,WINBOOL fSet) {
    return This->lpVtbl->SetSubMenu(This,pmp,fSet);
}
#endif
#endif

#endif


#endif  /* __IMenuPopup_INTERFACE_DEFINED__ */

#endif

#if NTDDI_VERSION >= NTDDI_VISTA
typedef enum FILE_USAGE_TYPE {
    FUT_PLAYING = 0,
    FUT_EDITING = 1,
    FUT_GENERIC = 2
} FILE_USAGE_TYPE;

#define OF_CAP_CANSWITCHTO 0x0001
#define OF_CAP_CANCLOSE 0x0002

/*****************************************************************************
 * IFileIsInUse interface
 */
#ifndef __IFileIsInUse_INTERFACE_DEFINED__
#define __IFileIsInUse_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFileIsInUse, 0x64a1cbf0, 0x3a1a, 0x4461, 0x91,0x58, 0x37,0x69,0x69,0x69,0x39,0x50);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("64a1cbf0-3a1a-4461-9158-376969693950")
IFileIsInUse : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetAppName(
        LPWSTR *ppszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUsage(
        FILE_USAGE_TYPE *pfut) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCapabilities(
        DWORD *pdwCapFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSwitchToHWND(
        HWND *phwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE CloseFile(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileIsInUse, 0x64a1cbf0, 0x3a1a, 0x4461, 0x91,0x58, 0x37,0x69,0x69,0x69,0x39,0x50)
#endif
#else
typedef struct IFileIsInUseVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFileIsInUse *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFileIsInUse *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFileIsInUse *This);

    /*** IFileIsInUse methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAppName)(
        IFileIsInUse *This,
        LPWSTR *ppszName);

    HRESULT (STDMETHODCALLTYPE *GetUsage)(
        IFileIsInUse *This,
        FILE_USAGE_TYPE *pfut);

    HRESULT (STDMETHODCALLTYPE *GetCapabilities)(
        IFileIsInUse *This,
        DWORD *pdwCapFlags);

    HRESULT (STDMETHODCALLTYPE *GetSwitchToHWND)(
        IFileIsInUse *This,
        HWND *phwnd);

    HRESULT (STDMETHODCALLTYPE *CloseFile)(
        IFileIsInUse *This);

    END_INTERFACE
} IFileIsInUseVtbl;

interface IFileIsInUse {
    CONST_VTBL IFileIsInUseVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileIsInUse_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileIsInUse_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileIsInUse_Release(This) (This)->lpVtbl->Release(This)
/*** IFileIsInUse methods ***/
#define IFileIsInUse_GetAppName(This,ppszName) (This)->lpVtbl->GetAppName(This,ppszName)
#define IFileIsInUse_GetUsage(This,pfut) (This)->lpVtbl->GetUsage(This,pfut)
#define IFileIsInUse_GetCapabilities(This,pdwCapFlags) (This)->lpVtbl->GetCapabilities(This,pdwCapFlags)
#define IFileIsInUse_GetSwitchToHWND(This,phwnd) (This)->lpVtbl->GetSwitchToHWND(This,phwnd)
#define IFileIsInUse_CloseFile(This) (This)->lpVtbl->CloseFile(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFileIsInUse_QueryInterface(IFileIsInUse* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFileIsInUse_AddRef(IFileIsInUse* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFileIsInUse_Release(IFileIsInUse* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileIsInUse methods ***/
static FORCEINLINE HRESULT IFileIsInUse_GetAppName(IFileIsInUse* This,LPWSTR *ppszName) {
    return This->lpVtbl->GetAppName(This,ppszName);
}
static FORCEINLINE HRESULT IFileIsInUse_GetUsage(IFileIsInUse* This,FILE_USAGE_TYPE *pfut) {
    return This->lpVtbl->GetUsage(This,pfut);
}
static FORCEINLINE HRESULT IFileIsInUse_GetCapabilities(IFileIsInUse* This,DWORD *pdwCapFlags) {
    return This->lpVtbl->GetCapabilities(This,pdwCapFlags);
}
static FORCEINLINE HRESULT IFileIsInUse_GetSwitchToHWND(IFileIsInUse* This,HWND *phwnd) {
    return This->lpVtbl->GetSwitchToHWND(This,phwnd);
}
static FORCEINLINE HRESULT IFileIsInUse_CloseFile(IFileIsInUse* This) {
    return This->lpVtbl->CloseFile(This);
}
#endif
#endif

#endif


#endif  /* __IFileIsInUse_INTERFACE_DEFINED__ */


#ifndef __IFileDialog_FWD_DEFINED__
#define __IFileDialog_FWD_DEFINED__
typedef interface IFileDialog IFileDialog;
#ifdef __cplusplus
interface IFileDialog;
#endif /* __cplusplus */
#endif


typedef enum FDE_OVERWRITE_RESPONSE {
    FDEOR_DEFAULT = 0,
    FDEOR_ACCEPT = 1,
    FDEOR_REFUSE = 2
} FDE_OVERWRITE_RESPONSE;

typedef enum FDE_SHAREVIOLATION_RESPONSE {
    FDESVR_DEFAULT = 0,
    FDESVR_ACCEPT = 1,
    FDESVR_REFUSE = 2
} FDE_SHAREVIOLATION_RESPONSE;

typedef enum FDAP {
    FDAP_BOTTOM = 0,
    FDAP_TOP = 1
} FDAP;

/*****************************************************************************
 * IFileDialogEvents interface
 */
#ifndef __IFileDialogEvents_INTERFACE_DEFINED__
#define __IFileDialogEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFileDialogEvents, 0x973510db, 0x7d7f, 0x452b, 0x89,0x75, 0x74,0xa8,0x58,0x28,0xd3,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("973510db-7d7f-452b-8975-74a85828d354")
IFileDialogEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnFileOk(
        IFileDialog *pfd) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnFolderChanging(
        IFileDialog *pfd,
        IShellItem *psiFolder) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnFolderChange(
        IFileDialog *pfd) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnSelectionChange(
        IFileDialog *pfd) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnShareViolation(
        IFileDialog *pfd,
        IShellItem *psi,
        FDE_SHAREVIOLATION_RESPONSE *pResponse) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnTypeChange(
        IFileDialog *pfd) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnOverwrite(
        IFileDialog *pfd,
        IShellItem *psi,
        FDE_OVERWRITE_RESPONSE *pResponse) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileDialogEvents, 0x973510db, 0x7d7f, 0x452b, 0x89,0x75, 0x74,0xa8,0x58,0x28,0xd3,0x54)
#endif
#else
typedef struct IFileDialogEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFileDialogEvents *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFileDialogEvents *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFileDialogEvents *This);

    /*** IFileDialogEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *OnFileOk)(
        IFileDialogEvents *This,
        IFileDialog *pfd);

    HRESULT (STDMETHODCALLTYPE *OnFolderChanging)(
        IFileDialogEvents *This,
        IFileDialog *pfd,
        IShellItem *psiFolder);

    HRESULT (STDMETHODCALLTYPE *OnFolderChange)(
        IFileDialogEvents *This,
        IFileDialog *pfd);

    HRESULT (STDMETHODCALLTYPE *OnSelectionChange)(
        IFileDialogEvents *This,
        IFileDialog *pfd);

    HRESULT (STDMETHODCALLTYPE *OnShareViolation)(
        IFileDialogEvents *This,
        IFileDialog *pfd,
        IShellItem *psi,
        FDE_SHAREVIOLATION_RESPONSE *pResponse);

    HRESULT (STDMETHODCALLTYPE *OnTypeChange)(
        IFileDialogEvents *This,
        IFileDialog *pfd);

    HRESULT (STDMETHODCALLTYPE *OnOverwrite)(
        IFileDialogEvents *This,
        IFileDialog *pfd,
        IShellItem *psi,
        FDE_OVERWRITE_RESPONSE *pResponse);

    END_INTERFACE
} IFileDialogEventsVtbl;

interface IFileDialogEvents {
    CONST_VTBL IFileDialogEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileDialogEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileDialogEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileDialogEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IFileDialogEvents methods ***/
#define IFileDialogEvents_OnFileOk(This,pfd) (This)->lpVtbl->OnFileOk(This,pfd)
#define IFileDialogEvents_OnFolderChanging(This,pfd,psiFolder) (This)->lpVtbl->OnFolderChanging(This,pfd,psiFolder)
#define IFileDialogEvents_OnFolderChange(This,pfd) (This)->lpVtbl->OnFolderChange(This,pfd)
#define IFileDialogEvents_OnSelectionChange(This,pfd) (This)->lpVtbl->OnSelectionChange(This,pfd)
#define IFileDialogEvents_OnShareViolation(This,pfd,psi,pResponse) (This)->lpVtbl->OnShareViolation(This,pfd,psi,pResponse)
#define IFileDialogEvents_OnTypeChange(This,pfd) (This)->lpVtbl->OnTypeChange(This,pfd)
#define IFileDialogEvents_OnOverwrite(This,pfd,psi,pResponse) (This)->lpVtbl->OnOverwrite(This,pfd,psi,pResponse)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFileDialogEvents_QueryInterface(IFileDialogEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFileDialogEvents_AddRef(IFileDialogEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFileDialogEvents_Release(IFileDialogEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileDialogEvents methods ***/
static FORCEINLINE HRESULT IFileDialogEvents_OnFileOk(IFileDialogEvents* This,IFileDialog *pfd) {
    return This->lpVtbl->OnFileOk(This,pfd);
}
static FORCEINLINE HRESULT IFileDialogEvents_OnFolderChanging(IFileDialogEvents* This,IFileDialog *pfd,IShellItem *psiFolder) {
    return This->lpVtbl->OnFolderChanging(This,pfd,psiFolder);
}
static FORCEINLINE HRESULT IFileDialogEvents_OnFolderChange(IFileDialogEvents* This,IFileDialog *pfd) {
    return This->lpVtbl->OnFolderChange(This,pfd);
}
static FORCEINLINE HRESULT IFileDialogEvents_OnSelectionChange(IFileDialogEvents* This,IFileDialog *pfd) {
    return This->lpVtbl->OnSelectionChange(This,pfd);
}
static FORCEINLINE HRESULT IFileDialogEvents_OnShareViolation(IFileDialogEvents* This,IFileDialog *pfd,IShellItem *psi,FDE_SHAREVIOLATION_RESPONSE *pResponse) {
    return This->lpVtbl->OnShareViolation(This,pfd,psi,pResponse);
}
static FORCEINLINE HRESULT IFileDialogEvents_OnTypeChange(IFileDialogEvents* This,IFileDialog *pfd) {
    return This->lpVtbl->OnTypeChange(This,pfd);
}
static FORCEINLINE HRESULT IFileDialogEvents_OnOverwrite(IFileDialogEvents* This,IFileDialog *pfd,IShellItem *psi,FDE_OVERWRITE_RESPONSE *pResponse) {
    return This->lpVtbl->OnOverwrite(This,pfd,psi,pResponse);
}
#endif
#endif

#endif


#endif  /* __IFileDialogEvents_INTERFACE_DEFINED__ */


#ifndef __IShellItemFilter_FWD_DEFINED__
#define __IShellItemFilter_FWD_DEFINED__
typedef interface IShellItemFilter IShellItemFilter;
#ifdef __cplusplus
interface IShellItemFilter;
#endif /* __cplusplus */
#endif


/*****************************************************************************
 * IFileDialog interface
 */
#ifndef __IFileDialog_INTERFACE_DEFINED__
#define __IFileDialog_INTERFACE_DEFINED__

enum _FILEOPENDIALOGOPTIONS {
    FOS_OVERWRITEPROMPT = 0x2,
    FOS_STRICTFILETYPES = 0x4,
    FOS_NOCHANGEDIR = 0x8,
    FOS_PICKFOLDERS = 0x20,
    FOS_FORCEFILESYSTEM = 0x40,
    FOS_ALLNONSTORAGEITEMS = 0x80,
    FOS_NOVALIDATE = 0x100,
    FOS_ALLOWMULTISELECT = 0x200,
    FOS_PATHMUSTEXIST = 0x800,
    FOS_FILEMUSTEXIST = 0x1000,
    FOS_CREATEPROMPT = 0x2000,
    FOS_SHAREAWARE = 0x4000,
    FOS_NOREADONLYRETURN = 0x8000,
    FOS_NOTESTFILECREATE = 0x10000,
    FOS_HIDEMRUPLACES = 0x20000,
    FOS_HIDEPINNEDPLACES = 0x40000,
    FOS_NODEREFERENCELINKS = 0x100000,
    FOS_DONTADDTORECENT = 0x2000000,
    FOS_FORCESHOWHIDDEN = 0x10000000,
    FOS_DEFAULTNOMINIMODE = 0x20000000,
    FOS_FORCEPREVIEWPANEON = 0x40000000,
    FOS_SUPPORTSTREAMABLEITEMS = 0x80000000
};

typedef DWORD FILEOPENDIALOGOPTIONS;

DEFINE_GUID(IID_IFileDialog, 0x42f85136, 0xdb7e, 0x439c, 0x85,0xf1, 0xe4,0x07,0x5d,0x13,0x5f,0xc8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("42f85136-db7e-439c-85f1-e4075d135fc8")
IFileDialog : public IModalWindow
{
    virtual HRESULT STDMETHODCALLTYPE SetFileTypes(
        UINT cFileTypes,
        const COMDLG_FILTERSPEC *rgFilterSpec) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFileTypeIndex(
        UINT iFileType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileTypeIndex(
        UINT *piFileType) = 0;

    virtual HRESULT STDMETHODCALLTYPE Advise(
        IFileDialogEvents *pfde,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unadvise(
        DWORD dwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOptions(
        FILEOPENDIALOGOPTIONS fos) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOptions(
        FILEOPENDIALOGOPTIONS *pfos) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultFolder(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFolder(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolder(
        IShellItem **ppsi) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentSelection(
        IShellItem **ppsi) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFileName(
        LPCWSTR pszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileName(
        LPWSTR *pszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTitle(
        LPCWSTR pszTitle) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOkButtonLabel(
        LPCWSTR pszText) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFileNameLabel(
        LPCWSTR pszLabel) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResult(
        IShellItem **ppsi) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddPlace(
        IShellItem *psi,
        FDAP fdap) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultExtension(
        LPCWSTR pszDefaultExtension) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        HRESULT hr) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetClientGuid(
        REFGUID guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearClientData(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFilter(
        IShellItemFilter *pFilter) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileDialog, 0x42f85136, 0xdb7e, 0x439c, 0x85,0xf1, 0xe4,0x07,0x5d,0x13,0x5f,0xc8)
#endif
#else
typedef struct IFileDialogVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFileDialog *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFileDialog *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFileDialog *This);

    /*** IModalWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *Show)(
        IFileDialog *This,
        HWND hwndOwner);

    /*** IFileDialog methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFileTypes)(
        IFileDialog *This,
        UINT cFileTypes,
        const COMDLG_FILTERSPEC *rgFilterSpec);

    HRESULT (STDMETHODCALLTYPE *SetFileTypeIndex)(
        IFileDialog *This,
        UINT iFileType);

    HRESULT (STDMETHODCALLTYPE *GetFileTypeIndex)(
        IFileDialog *This,
        UINT *piFileType);

    HRESULT (STDMETHODCALLTYPE *Advise)(
        IFileDialog *This,
        IFileDialogEvents *pfde,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        IFileDialog *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *SetOptions)(
        IFileDialog *This,
        FILEOPENDIALOGOPTIONS fos);

    HRESULT (STDMETHODCALLTYPE *GetOptions)(
        IFileDialog *This,
        FILEOPENDIALOGOPTIONS *pfos);

    HRESULT (STDMETHODCALLTYPE *SetDefaultFolder)(
        IFileDialog *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *SetFolder)(
        IFileDialog *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *GetFolder)(
        IFileDialog *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *GetCurrentSelection)(
        IFileDialog *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *SetFileName)(
        IFileDialog *This,
        LPCWSTR pszName);

    HRESULT (STDMETHODCALLTYPE *GetFileName)(
        IFileDialog *This,
        LPWSTR *pszName);

    HRESULT (STDMETHODCALLTYPE *SetTitle)(
        IFileDialog *This,
        LPCWSTR pszTitle);

    HRESULT (STDMETHODCALLTYPE *SetOkButtonLabel)(
        IFileDialog *This,
        LPCWSTR pszText);

    HRESULT (STDMETHODCALLTYPE *SetFileNameLabel)(
        IFileDialog *This,
        LPCWSTR pszLabel);

    HRESULT (STDMETHODCALLTYPE *GetResult)(
        IFileDialog *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *AddPlace)(
        IFileDialog *This,
        IShellItem *psi,
        FDAP fdap);

    HRESULT (STDMETHODCALLTYPE *SetDefaultExtension)(
        IFileDialog *This,
        LPCWSTR pszDefaultExtension);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IFileDialog *This,
        HRESULT hr);

    HRESULT (STDMETHODCALLTYPE *SetClientGuid)(
        IFileDialog *This,
        REFGUID guid);

    HRESULT (STDMETHODCALLTYPE *ClearClientData)(
        IFileDialog *This);

    HRESULT (STDMETHODCALLTYPE *SetFilter)(
        IFileDialog *This,
        IShellItemFilter *pFilter);

    END_INTERFACE
} IFileDialogVtbl;

interface IFileDialog {
    CONST_VTBL IFileDialogVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileDialog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileDialog_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileDialog_Release(This) (This)->lpVtbl->Release(This)
/*** IModalWindow methods ***/
#define IFileDialog_Show(This,hwndOwner) (This)->lpVtbl->Show(This,hwndOwner)
/*** IFileDialog methods ***/
#define IFileDialog_SetFileTypes(This,cFileTypes,rgFilterSpec) (This)->lpVtbl->SetFileTypes(This,cFileTypes,rgFilterSpec)
#define IFileDialog_SetFileTypeIndex(This,iFileType) (This)->lpVtbl->SetFileTypeIndex(This,iFileType)
#define IFileDialog_GetFileTypeIndex(This,piFileType) (This)->lpVtbl->GetFileTypeIndex(This,piFileType)
#define IFileDialog_Advise(This,pfde,pdwCookie) (This)->lpVtbl->Advise(This,pfde,pdwCookie)
#define IFileDialog_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
#define IFileDialog_SetOptions(This,fos) (This)->lpVtbl->SetOptions(This,fos)
#define IFileDialog_GetOptions(This,pfos) (This)->lpVtbl->GetOptions(This,pfos)
#define IFileDialog_SetDefaultFolder(This,psi) (This)->lpVtbl->SetDefaultFolder(This,psi)
#define IFileDialog_SetFolder(This,psi) (This)->lpVtbl->SetFolder(This,psi)
#define IFileDialog_GetFolder(This,ppsi) (This)->lpVtbl->GetFolder(This,ppsi)
#define IFileDialog_GetCurrentSelection(This,ppsi) (This)->lpVtbl->GetCurrentSelection(This,ppsi)
#define IFileDialog_SetFileName(This,pszName) (This)->lpVtbl->SetFileName(This,pszName)
#define IFileDialog_GetFileName(This,pszName) (This)->lpVtbl->GetFileName(This,pszName)
#define IFileDialog_SetTitle(This,pszTitle) (This)->lpVtbl->SetTitle(This,pszTitle)
#define IFileDialog_SetOkButtonLabel(This,pszText) (This)->lpVtbl->SetOkButtonLabel(This,pszText)
#define IFileDialog_SetFileNameLabel(This,pszLabel) (This)->lpVtbl->SetFileNameLabel(This,pszLabel)
#define IFileDialog_GetResult(This,ppsi) (This)->lpVtbl->GetResult(This,ppsi)
#define IFileDialog_AddPlace(This,psi,fdap) (This)->lpVtbl->AddPlace(This,psi,fdap)
#define IFileDialog_SetDefaultExtension(This,pszDefaultExtension) (This)->lpVtbl->SetDefaultExtension(This,pszDefaultExtension)
#define IFileDialog_Close(This,hr) (This)->lpVtbl->Close(This,hr)
#define IFileDialog_SetClientGuid(This,guid) (This)->lpVtbl->SetClientGuid(This,guid)
#define IFileDialog_ClearClientData(This) (This)->lpVtbl->ClearClientData(This)
#define IFileDialog_SetFilter(This,pFilter) (This)->lpVtbl->SetFilter(This,pFilter)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFileDialog_QueryInterface(IFileDialog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFileDialog_AddRef(IFileDialog* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFileDialog_Release(IFileDialog* This) {
    return This->lpVtbl->Release(This);
}
/*** IModalWindow methods ***/
static FORCEINLINE HRESULT IFileDialog_Show(IFileDialog* This,HWND hwndOwner) {
    return This->lpVtbl->Show(This,hwndOwner);
}
/*** IFileDialog methods ***/
static FORCEINLINE HRESULT IFileDialog_SetFileTypes(IFileDialog* This,UINT cFileTypes,const COMDLG_FILTERSPEC *rgFilterSpec) {
    return This->lpVtbl->SetFileTypes(This,cFileTypes,rgFilterSpec);
}
static FORCEINLINE HRESULT IFileDialog_SetFileTypeIndex(IFileDialog* This,UINT iFileType) {
    return This->lpVtbl->SetFileTypeIndex(This,iFileType);
}
static FORCEINLINE HRESULT IFileDialog_GetFileTypeIndex(IFileDialog* This,UINT *piFileType) {
    return This->lpVtbl->GetFileTypeIndex(This,piFileType);
}
static FORCEINLINE HRESULT IFileDialog_Advise(IFileDialog* This,IFileDialogEvents *pfde,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pfde,pdwCookie);
}
static FORCEINLINE HRESULT IFileDialog_Unadvise(IFileDialog* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static FORCEINLINE HRESULT IFileDialog_SetOptions(IFileDialog* This,FILEOPENDIALOGOPTIONS fos) {
    return This->lpVtbl->SetOptions(This,fos);
}
static FORCEINLINE HRESULT IFileDialog_GetOptions(IFileDialog* This,FILEOPENDIALOGOPTIONS *pfos) {
    return This->lpVtbl->GetOptions(This,pfos);
}
static FORCEINLINE HRESULT IFileDialog_SetDefaultFolder(IFileDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetDefaultFolder(This,psi);
}
static FORCEINLINE HRESULT IFileDialog_SetFolder(IFileDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetFolder(This,psi);
}
static FORCEINLINE HRESULT IFileDialog_GetFolder(IFileDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetFolder(This,ppsi);
}
static FORCEINLINE HRESULT IFileDialog_GetCurrentSelection(IFileDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetCurrentSelection(This,ppsi);
}
static FORCEINLINE HRESULT IFileDialog_SetFileName(IFileDialog* This,LPCWSTR pszName) {
    return This->lpVtbl->SetFileName(This,pszName);
}
static FORCEINLINE HRESULT IFileDialog_GetFileName(IFileDialog* This,LPWSTR *pszName) {
    return This->lpVtbl->GetFileName(This,pszName);
}
static FORCEINLINE HRESULT IFileDialog_SetTitle(IFileDialog* This,LPCWSTR pszTitle) {
    return This->lpVtbl->SetTitle(This,pszTitle);
}
static FORCEINLINE HRESULT IFileDialog_SetOkButtonLabel(IFileDialog* This,LPCWSTR pszText) {
    return This->lpVtbl->SetOkButtonLabel(This,pszText);
}
static FORCEINLINE HRESULT IFileDialog_SetFileNameLabel(IFileDialog* This,LPCWSTR pszLabel) {
    return This->lpVtbl->SetFileNameLabel(This,pszLabel);
}
static FORCEINLINE HRESULT IFileDialog_GetResult(IFileDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetResult(This,ppsi);
}
static FORCEINLINE HRESULT IFileDialog_AddPlace(IFileDialog* This,IShellItem *psi,FDAP fdap) {
    return This->lpVtbl->AddPlace(This,psi,fdap);
}
static FORCEINLINE HRESULT IFileDialog_SetDefaultExtension(IFileDialog* This,LPCWSTR pszDefaultExtension) {
    return This->lpVtbl->SetDefaultExtension(This,pszDefaultExtension);
}
static FORCEINLINE HRESULT IFileDialog_Close(IFileDialog* This,HRESULT hr) {
    return This->lpVtbl->Close(This,hr);
}
static FORCEINLINE HRESULT IFileDialog_SetClientGuid(IFileDialog* This,REFGUID guid) {
    return This->lpVtbl->SetClientGuid(This,guid);
}
static FORCEINLINE HRESULT IFileDialog_ClearClientData(IFileDialog* This) {
    return This->lpVtbl->ClearClientData(This);
}
static FORCEINLINE HRESULT IFileDialog_SetFilter(IFileDialog* This,IShellItemFilter *pFilter) {
    return This->lpVtbl->SetFilter(This,pFilter);
}
#endif
#endif

#endif


#endif  /* __IFileDialog_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IFileSaveDialog interface
 */
#ifndef __IFileSaveDialog_INTERFACE_DEFINED__
#define __IFileSaveDialog_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFileSaveDialog, 0x84bccd23, 0x5fde, 0x4cdb, 0xae,0xa4, 0xaf,0x64,0xb8,0x3d,0x78,0xab);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("84bccd23-5fde-4cdb-aea4-af64b83d78ab")
IFileSaveDialog : public IFileDialog
{
    virtual HRESULT STDMETHODCALLTYPE SetSaveAsItem(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProperties(
        IPropertyStore *pStore) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCollectedProperties(
        IPropertyDescriptionList *pList,
        WINBOOL fAppendDefault) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProperties(
        IPropertyStore **ppStore) = 0;

    virtual HRESULT STDMETHODCALLTYPE ApplyProperties(
        IShellItem *psi,
        IPropertyStore *pStore,
        HWND hwnd,
        IFileOperationProgressSink *pSink) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileSaveDialog, 0x84bccd23, 0x5fde, 0x4cdb, 0xae,0xa4, 0xaf,0x64,0xb8,0x3d,0x78,0xab)
#endif
#else
typedef struct IFileSaveDialogVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFileSaveDialog *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFileSaveDialog *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFileSaveDialog *This);

    /*** IModalWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *Show)(
        IFileSaveDialog *This,
        HWND hwndOwner);

    /*** IFileDialog methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFileTypes)(
        IFileSaveDialog *This,
        UINT cFileTypes,
        const COMDLG_FILTERSPEC *rgFilterSpec);

    HRESULT (STDMETHODCALLTYPE *SetFileTypeIndex)(
        IFileSaveDialog *This,
        UINT iFileType);

    HRESULT (STDMETHODCALLTYPE *GetFileTypeIndex)(
        IFileSaveDialog *This,
        UINT *piFileType);

    HRESULT (STDMETHODCALLTYPE *Advise)(
        IFileSaveDialog *This,
        IFileDialogEvents *pfde,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        IFileSaveDialog *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *SetOptions)(
        IFileSaveDialog *This,
        FILEOPENDIALOGOPTIONS fos);

    HRESULT (STDMETHODCALLTYPE *GetOptions)(
        IFileSaveDialog *This,
        FILEOPENDIALOGOPTIONS *pfos);

    HRESULT (STDMETHODCALLTYPE *SetDefaultFolder)(
        IFileSaveDialog *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *SetFolder)(
        IFileSaveDialog *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *GetFolder)(
        IFileSaveDialog *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *GetCurrentSelection)(
        IFileSaveDialog *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *SetFileName)(
        IFileSaveDialog *This,
        LPCWSTR pszName);

    HRESULT (STDMETHODCALLTYPE *GetFileName)(
        IFileSaveDialog *This,
        LPWSTR *pszName);

    HRESULT (STDMETHODCALLTYPE *SetTitle)(
        IFileSaveDialog *This,
        LPCWSTR pszTitle);

    HRESULT (STDMETHODCALLTYPE *SetOkButtonLabel)(
        IFileSaveDialog *This,
        LPCWSTR pszText);

    HRESULT (STDMETHODCALLTYPE *SetFileNameLabel)(
        IFileSaveDialog *This,
        LPCWSTR pszLabel);

    HRESULT (STDMETHODCALLTYPE *GetResult)(
        IFileSaveDialog *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *AddPlace)(
        IFileSaveDialog *This,
        IShellItem *psi,
        FDAP fdap);

    HRESULT (STDMETHODCALLTYPE *SetDefaultExtension)(
        IFileSaveDialog *This,
        LPCWSTR pszDefaultExtension);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IFileSaveDialog *This,
        HRESULT hr);

    HRESULT (STDMETHODCALLTYPE *SetClientGuid)(
        IFileSaveDialog *This,
        REFGUID guid);

    HRESULT (STDMETHODCALLTYPE *ClearClientData)(
        IFileSaveDialog *This);

    HRESULT (STDMETHODCALLTYPE *SetFilter)(
        IFileSaveDialog *This,
        IShellItemFilter *pFilter);

    /*** IFileSaveDialog methods ***/
    HRESULT (STDMETHODCALLTYPE *SetSaveAsItem)(
        IFileSaveDialog *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *SetProperties)(
        IFileSaveDialog *This,
        IPropertyStore *pStore);

    HRESULT (STDMETHODCALLTYPE *SetCollectedProperties)(
        IFileSaveDialog *This,
        IPropertyDescriptionList *pList,
        WINBOOL fAppendDefault);

    HRESULT (STDMETHODCALLTYPE *GetProperties)(
        IFileSaveDialog *This,
        IPropertyStore **ppStore);

    HRESULT (STDMETHODCALLTYPE *ApplyProperties)(
        IFileSaveDialog *This,
        IShellItem *psi,
        IPropertyStore *pStore,
        HWND hwnd,
        IFileOperationProgressSink *pSink);

    END_INTERFACE
} IFileSaveDialogVtbl;

interface IFileSaveDialog {
    CONST_VTBL IFileSaveDialogVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileSaveDialog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileSaveDialog_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileSaveDialog_Release(This) (This)->lpVtbl->Release(This)
/*** IModalWindow methods ***/
#define IFileSaveDialog_Show(This,hwndOwner) (This)->lpVtbl->Show(This,hwndOwner)
/*** IFileDialog methods ***/
#define IFileSaveDialog_SetFileTypes(This,cFileTypes,rgFilterSpec) (This)->lpVtbl->SetFileTypes(This,cFileTypes,rgFilterSpec)
#define IFileSaveDialog_SetFileTypeIndex(This,iFileType) (This)->lpVtbl->SetFileTypeIndex(This,iFileType)
#define IFileSaveDialog_GetFileTypeIndex(This,piFileType) (This)->lpVtbl->GetFileTypeIndex(This,piFileType)
#define IFileSaveDialog_Advise(This,pfde,pdwCookie) (This)->lpVtbl->Advise(This,pfde,pdwCookie)
#define IFileSaveDialog_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
#define IFileSaveDialog_SetOptions(This,fos) (This)->lpVtbl->SetOptions(This,fos)
#define IFileSaveDialog_GetOptions(This,pfos) (This)->lpVtbl->GetOptions(This,pfos)
#define IFileSaveDialog_SetDefaultFolder(This,psi) (This)->lpVtbl->SetDefaultFolder(This,psi)
#define IFileSaveDialog_SetFolder(This,psi) (This)->lpVtbl->SetFolder(This,psi)
#define IFileSaveDialog_GetFolder(This,ppsi) (This)->lpVtbl->GetFolder(This,ppsi)
#define IFileSaveDialog_GetCurrentSelection(This,ppsi) (This)->lpVtbl->GetCurrentSelection(This,ppsi)
#define IFileSaveDialog_SetFileName(This,pszName) (This)->lpVtbl->SetFileName(This,pszName)
#define IFileSaveDialog_GetFileName(This,pszName) (This)->lpVtbl->GetFileName(This,pszName)
#define IFileSaveDialog_SetTitle(This,pszTitle) (This)->lpVtbl->SetTitle(This,pszTitle)
#define IFileSaveDialog_SetOkButtonLabel(This,pszText) (This)->lpVtbl->SetOkButtonLabel(This,pszText)
#define IFileSaveDialog_SetFileNameLabel(This,pszLabel) (This)->lpVtbl->SetFileNameLabel(This,pszLabel)
#define IFileSaveDialog_GetResult(This,ppsi) (This)->lpVtbl->GetResult(This,ppsi)
#define IFileSaveDialog_AddPlace(This,psi,fdap) (This)->lpVtbl->AddPlace(This,psi,fdap)
#define IFileSaveDialog_SetDefaultExtension(This,pszDefaultExtension) (This)->lpVtbl->SetDefaultExtension(This,pszDefaultExtension)
#define IFileSaveDialog_Close(This,hr) (This)->lpVtbl->Close(This,hr)
#define IFileSaveDialog_SetClientGuid(This,guid) (This)->lpVtbl->SetClientGuid(This,guid)
#define IFileSaveDialog_ClearClientData(This) (This)->lpVtbl->ClearClientData(This)
#define IFileSaveDialog_SetFilter(This,pFilter) (This)->lpVtbl->SetFilter(This,pFilter)
/*** IFileSaveDialog methods ***/
#define IFileSaveDialog_SetSaveAsItem(This,psi) (This)->lpVtbl->SetSaveAsItem(This,psi)
#define IFileSaveDialog_SetProperties(This,pStore) (This)->lpVtbl->SetProperties(This,pStore)
#define IFileSaveDialog_SetCollectedProperties(This,pList,fAppendDefault) (This)->lpVtbl->SetCollectedProperties(This,pList,fAppendDefault)
#define IFileSaveDialog_GetProperties(This,ppStore) (This)->lpVtbl->GetProperties(This,ppStore)
#define IFileSaveDialog_ApplyProperties(This,psi,pStore,hwnd,pSink) (This)->lpVtbl->ApplyProperties(This,psi,pStore,hwnd,pSink)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFileSaveDialog_QueryInterface(IFileSaveDialog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFileSaveDialog_AddRef(IFileSaveDialog* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFileSaveDialog_Release(IFileSaveDialog* This) {
    return This->lpVtbl->Release(This);
}
/*** IModalWindow methods ***/
static FORCEINLINE HRESULT IFileSaveDialog_Show(IFileSaveDialog* This,HWND hwndOwner) {
    return This->lpVtbl->Show(This,hwndOwner);
}
/*** IFileDialog methods ***/
static FORCEINLINE HRESULT IFileSaveDialog_SetFileTypes(IFileSaveDialog* This,UINT cFileTypes,const COMDLG_FILTERSPEC *rgFilterSpec) {
    return This->lpVtbl->SetFileTypes(This,cFileTypes,rgFilterSpec);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetFileTypeIndex(IFileSaveDialog* This,UINT iFileType) {
    return This->lpVtbl->SetFileTypeIndex(This,iFileType);
}
static FORCEINLINE HRESULT IFileSaveDialog_GetFileTypeIndex(IFileSaveDialog* This,UINT *piFileType) {
    return This->lpVtbl->GetFileTypeIndex(This,piFileType);
}
static FORCEINLINE HRESULT IFileSaveDialog_Advise(IFileSaveDialog* This,IFileDialogEvents *pfde,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pfde,pdwCookie);
}
static FORCEINLINE HRESULT IFileSaveDialog_Unadvise(IFileSaveDialog* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetOptions(IFileSaveDialog* This,FILEOPENDIALOGOPTIONS fos) {
    return This->lpVtbl->SetOptions(This,fos);
}
static FORCEINLINE HRESULT IFileSaveDialog_GetOptions(IFileSaveDialog* This,FILEOPENDIALOGOPTIONS *pfos) {
    return This->lpVtbl->GetOptions(This,pfos);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetDefaultFolder(IFileSaveDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetDefaultFolder(This,psi);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetFolder(IFileSaveDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetFolder(This,psi);
}
static FORCEINLINE HRESULT IFileSaveDialog_GetFolder(IFileSaveDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetFolder(This,ppsi);
}
static FORCEINLINE HRESULT IFileSaveDialog_GetCurrentSelection(IFileSaveDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetCurrentSelection(This,ppsi);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetFileName(IFileSaveDialog* This,LPCWSTR pszName) {
    return This->lpVtbl->SetFileName(This,pszName);
}
static FORCEINLINE HRESULT IFileSaveDialog_GetFileName(IFileSaveDialog* This,LPWSTR *pszName) {
    return This->lpVtbl->GetFileName(This,pszName);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetTitle(IFileSaveDialog* This,LPCWSTR pszTitle) {
    return This->lpVtbl->SetTitle(This,pszTitle);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetOkButtonLabel(IFileSaveDialog* This,LPCWSTR pszText) {
    return This->lpVtbl->SetOkButtonLabel(This,pszText);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetFileNameLabel(IFileSaveDialog* This,LPCWSTR pszLabel) {
    return This->lpVtbl->SetFileNameLabel(This,pszLabel);
}
static FORCEINLINE HRESULT IFileSaveDialog_GetResult(IFileSaveDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetResult(This,ppsi);
}
static FORCEINLINE HRESULT IFileSaveDialog_AddPlace(IFileSaveDialog* This,IShellItem *psi,FDAP fdap) {
    return This->lpVtbl->AddPlace(This,psi,fdap);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetDefaultExtension(IFileSaveDialog* This,LPCWSTR pszDefaultExtension) {
    return This->lpVtbl->SetDefaultExtension(This,pszDefaultExtension);
}
static FORCEINLINE HRESULT IFileSaveDialog_Close(IFileSaveDialog* This,HRESULT hr) {
    return This->lpVtbl->Close(This,hr);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetClientGuid(IFileSaveDialog* This,REFGUID guid) {
    return This->lpVtbl->SetClientGuid(This,guid);
}
static FORCEINLINE HRESULT IFileSaveDialog_ClearClientData(IFileSaveDialog* This) {
    return This->lpVtbl->ClearClientData(This);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetFilter(IFileSaveDialog* This,IShellItemFilter *pFilter) {
    return This->lpVtbl->SetFilter(This,pFilter);
}
/*** IFileSaveDialog methods ***/
static FORCEINLINE HRESULT IFileSaveDialog_SetSaveAsItem(IFileSaveDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetSaveAsItem(This,psi);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetProperties(IFileSaveDialog* This,IPropertyStore *pStore) {
    return This->lpVtbl->SetProperties(This,pStore);
}
static FORCEINLINE HRESULT IFileSaveDialog_SetCollectedProperties(IFileSaveDialog* This,IPropertyDescriptionList *pList,WINBOOL fAppendDefault) {
    return This->lpVtbl->SetCollectedProperties(This,pList,fAppendDefault);
}
static FORCEINLINE HRESULT IFileSaveDialog_GetProperties(IFileSaveDialog* This,IPropertyStore **ppStore) {
    return This->lpVtbl->GetProperties(This,ppStore);
}
static FORCEINLINE HRESULT IFileSaveDialog_ApplyProperties(IFileSaveDialog* This,IShellItem *psi,IPropertyStore *pStore,HWND hwnd,IFileOperationProgressSink *pSink) {
    return This->lpVtbl->ApplyProperties(This,psi,pStore,hwnd,pSink);
}
#endif
#endif

#endif


#endif  /* __IFileSaveDialog_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IFileOpenDialog interface
 */
#ifndef __IFileOpenDialog_INTERFACE_DEFINED__
#define __IFileOpenDialog_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFileOpenDialog, 0xd57c7288, 0xd4ad, 0x4768, 0xbe,0x02, 0x9d,0x96,0x95,0x32,0xd9,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d57c7288-d4ad-4768-be02-9d969532d960")
IFileOpenDialog : public IFileDialog
{
    virtual HRESULT STDMETHODCALLTYPE GetResults(
        IShellItemArray **ppenum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelectedItems(
        IShellItemArray **ppsai) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileOpenDialog, 0xd57c7288, 0xd4ad, 0x4768, 0xbe,0x02, 0x9d,0x96,0x95,0x32,0xd9,0x60)
#endif
#else
typedef struct IFileOpenDialogVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFileOpenDialog *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFileOpenDialog *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFileOpenDialog *This);

    /*** IModalWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *Show)(
        IFileOpenDialog *This,
        HWND hwndOwner);

    /*** IFileDialog methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFileTypes)(
        IFileOpenDialog *This,
        UINT cFileTypes,
        const COMDLG_FILTERSPEC *rgFilterSpec);

    HRESULT (STDMETHODCALLTYPE *SetFileTypeIndex)(
        IFileOpenDialog *This,
        UINT iFileType);

    HRESULT (STDMETHODCALLTYPE *GetFileTypeIndex)(
        IFileOpenDialog *This,
        UINT *piFileType);

    HRESULT (STDMETHODCALLTYPE *Advise)(
        IFileOpenDialog *This,
        IFileDialogEvents *pfde,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        IFileOpenDialog *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *SetOptions)(
        IFileOpenDialog *This,
        FILEOPENDIALOGOPTIONS fos);

    HRESULT (STDMETHODCALLTYPE *GetOptions)(
        IFileOpenDialog *This,
        FILEOPENDIALOGOPTIONS *pfos);

    HRESULT (STDMETHODCALLTYPE *SetDefaultFolder)(
        IFileOpenDialog *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *SetFolder)(
        IFileOpenDialog *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *GetFolder)(
        IFileOpenDialog *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *GetCurrentSelection)(
        IFileOpenDialog *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *SetFileName)(
        IFileOpenDialog *This,
        LPCWSTR pszName);

    HRESULT (STDMETHODCALLTYPE *GetFileName)(
        IFileOpenDialog *This,
        LPWSTR *pszName);

    HRESULT (STDMETHODCALLTYPE *SetTitle)(
        IFileOpenDialog *This,
        LPCWSTR pszTitle);

    HRESULT (STDMETHODCALLTYPE *SetOkButtonLabel)(
        IFileOpenDialog *This,
        LPCWSTR pszText);

    HRESULT (STDMETHODCALLTYPE *SetFileNameLabel)(
        IFileOpenDialog *This,
        LPCWSTR pszLabel);

    HRESULT (STDMETHODCALLTYPE *GetResult)(
        IFileOpenDialog *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *AddPlace)(
        IFileOpenDialog *This,
        IShellItem *psi,
        FDAP fdap);

    HRESULT (STDMETHODCALLTYPE *SetDefaultExtension)(
        IFileOpenDialog *This,
        LPCWSTR pszDefaultExtension);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IFileOpenDialog *This,
        HRESULT hr);

    HRESULT (STDMETHODCALLTYPE *SetClientGuid)(
        IFileOpenDialog *This,
        REFGUID guid);

    HRESULT (STDMETHODCALLTYPE *ClearClientData)(
        IFileOpenDialog *This);

    HRESULT (STDMETHODCALLTYPE *SetFilter)(
        IFileOpenDialog *This,
        IShellItemFilter *pFilter);

    /*** IFileOpenDialog methods ***/
    HRESULT (STDMETHODCALLTYPE *GetResults)(
        IFileOpenDialog *This,
        IShellItemArray **ppenum);

    HRESULT (STDMETHODCALLTYPE *GetSelectedItems)(
        IFileOpenDialog *This,
        IShellItemArray **ppsai);

    END_INTERFACE
} IFileOpenDialogVtbl;

interface IFileOpenDialog {
    CONST_VTBL IFileOpenDialogVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileOpenDialog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileOpenDialog_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileOpenDialog_Release(This) (This)->lpVtbl->Release(This)
/*** IModalWindow methods ***/
#define IFileOpenDialog_Show(This,hwndOwner) (This)->lpVtbl->Show(This,hwndOwner)
/*** IFileDialog methods ***/
#define IFileOpenDialog_SetFileTypes(This,cFileTypes,rgFilterSpec) (This)->lpVtbl->SetFileTypes(This,cFileTypes,rgFilterSpec)
#define IFileOpenDialog_SetFileTypeIndex(This,iFileType) (This)->lpVtbl->SetFileTypeIndex(This,iFileType)
#define IFileOpenDialog_GetFileTypeIndex(This,piFileType) (This)->lpVtbl->GetFileTypeIndex(This,piFileType)
#define IFileOpenDialog_Advise(This,pfde,pdwCookie) (This)->lpVtbl->Advise(This,pfde,pdwCookie)
#define IFileOpenDialog_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
#define IFileOpenDialog_SetOptions(This,fos) (This)->lpVtbl->SetOptions(This,fos)
#define IFileOpenDialog_GetOptions(This,pfos) (This)->lpVtbl->GetOptions(This,pfos)
#define IFileOpenDialog_SetDefaultFolder(This,psi) (This)->lpVtbl->SetDefaultFolder(This,psi)
#define IFileOpenDialog_SetFolder(This,psi) (This)->lpVtbl->SetFolder(This,psi)
#define IFileOpenDialog_GetFolder(This,ppsi) (This)->lpVtbl->GetFolder(This,ppsi)
#define IFileOpenDialog_GetCurrentSelection(This,ppsi) (This)->lpVtbl->GetCurrentSelection(This,ppsi)
#define IFileOpenDialog_SetFileName(This,pszName) (This)->lpVtbl->SetFileName(This,pszName)
#define IFileOpenDialog_GetFileName(This,pszName) (This)->lpVtbl->GetFileName(This,pszName)
#define IFileOpenDialog_SetTitle(This,pszTitle) (This)->lpVtbl->SetTitle(This,pszTitle)
#define IFileOpenDialog_SetOkButtonLabel(This,pszText) (This)->lpVtbl->SetOkButtonLabel(This,pszText)
#define IFileOpenDialog_SetFileNameLabel(This,pszLabel) (This)->lpVtbl->SetFileNameLabel(This,pszLabel)
#define IFileOpenDialog_GetResult(This,ppsi) (This)->lpVtbl->GetResult(This,ppsi)
#define IFileOpenDialog_AddPlace(This,psi,fdap) (This)->lpVtbl->AddPlace(This,psi,fdap)
#define IFileOpenDialog_SetDefaultExtension(This,pszDefaultExtension) (This)->lpVtbl->SetDefaultExtension(This,pszDefaultExtension)
#define IFileOpenDialog_Close(This,hr) (This)->lpVtbl->Close(This,hr)
#define IFileOpenDialog_SetClientGuid(This,guid) (This)->lpVtbl->SetClientGuid(This,guid)
#define IFileOpenDialog_ClearClientData(This) (This)->lpVtbl->ClearClientData(This)
#define IFileOpenDialog_SetFilter(This,pFilter) (This)->lpVtbl->SetFilter(This,pFilter)
/*** IFileOpenDialog methods ***/
#define IFileOpenDialog_GetResults(This,ppenum) (This)->lpVtbl->GetResults(This,ppenum)
#define IFileOpenDialog_GetSelectedItems(This,ppsai) (This)->lpVtbl->GetSelectedItems(This,ppsai)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFileOpenDialog_QueryInterface(IFileOpenDialog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFileOpenDialog_AddRef(IFileOpenDialog* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFileOpenDialog_Release(IFileOpenDialog* This) {
    return This->lpVtbl->Release(This);
}
/*** IModalWindow methods ***/
static FORCEINLINE HRESULT IFileOpenDialog_Show(IFileOpenDialog* This,HWND hwndOwner) {
    return This->lpVtbl->Show(This,hwndOwner);
}
/*** IFileDialog methods ***/
static FORCEINLINE HRESULT IFileOpenDialog_SetFileTypes(IFileOpenDialog* This,UINT cFileTypes,const COMDLG_FILTERSPEC *rgFilterSpec) {
    return This->lpVtbl->SetFileTypes(This,cFileTypes,rgFilterSpec);
}
static FORCEINLINE HRESULT IFileOpenDialog_SetFileTypeIndex(IFileOpenDialog* This,UINT iFileType) {
    return This->lpVtbl->SetFileTypeIndex(This,iFileType);
}
static FORCEINLINE HRESULT IFileOpenDialog_GetFileTypeIndex(IFileOpenDialog* This,UINT *piFileType) {
    return This->lpVtbl->GetFileTypeIndex(This,piFileType);
}
static FORCEINLINE HRESULT IFileOpenDialog_Advise(IFileOpenDialog* This,IFileDialogEvents *pfde,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pfde,pdwCookie);
}
static FORCEINLINE HRESULT IFileOpenDialog_Unadvise(IFileOpenDialog* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static FORCEINLINE HRESULT IFileOpenDialog_SetOptions(IFileOpenDialog* This,FILEOPENDIALOGOPTIONS fos) {
    return This->lpVtbl->SetOptions(This,fos);
}
static FORCEINLINE HRESULT IFileOpenDialog_GetOptions(IFileOpenDialog* This,FILEOPENDIALOGOPTIONS *pfos) {
    return This->lpVtbl->GetOptions(This,pfos);
}
static FORCEINLINE HRESULT IFileOpenDialog_SetDefaultFolder(IFileOpenDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetDefaultFolder(This,psi);
}
static FORCEINLINE HRESULT IFileOpenDialog_SetFolder(IFileOpenDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetFolder(This,psi);
}
static FORCEINLINE HRESULT IFileOpenDialog_GetFolder(IFileOpenDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetFolder(This,ppsi);
}
static FORCEINLINE HRESULT IFileOpenDialog_GetCurrentSelection(IFileOpenDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetCurrentSelection(This,ppsi);
}
static FORCEINLINE HRESULT IFileOpenDialog_SetFileName(IFileOpenDialog* This,LPCWSTR pszName) {
    return This->lpVtbl->SetFileName(This,pszName);
}
static FORCEINLINE HRESULT IFileOpenDialog_GetFileName(IFileOpenDialog* This,LPWSTR *pszName) {
    return This->lpVtbl->GetFileName(This,pszName);
}
static FORCEINLINE HRESULT IFileOpenDialog_SetTitle(IFileOpenDialog* This,LPCWSTR pszTitle) {
    return This->lpVtbl->SetTitle(This,pszTitle);
}
static FORCEINLINE HRESULT IFileOpenDialog_SetOkButtonLabel(IFileOpenDialog* This,LPCWSTR pszText) {
    return This->lpVtbl->SetOkButtonLabel(This,pszText);
}
static FORCEINLINE HRESULT IFileOpenDialog_SetFileNameLabel(IFileOpenDialog* This,LPCWSTR pszLabel) {
    return This->lpVtbl->SetFileNameLabel(This,pszLabel);
}
static FORCEINLINE HRESULT IFileOpenDialog_GetResult(IFileOpenDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetResult(This,ppsi);
}
static FORCEINLINE HRESULT IFileOpenDialog_AddPlace(IFileOpenDialog* This,IShellItem *psi,FDAP fdap) {
    return This->lpVtbl->AddPlace(This,psi,fdap);
}
static FORCEINLINE HRESULT IFileOpenDialog_SetDefaultExtension(IFileOpenDialog* This,LPCWSTR pszDefaultExtension) {
    return This->lpVtbl->SetDefaultExtension(This,pszDefaultExtension);
}
static FORCEINLINE HRESULT IFileOpenDialog_Close(IFileOpenDialog* This,HRESULT hr) {
    return This->lpVtbl->Close(This,hr);
}
static FORCEINLINE HRESULT IFileOpenDialog_SetClientGuid(IFileOpenDialog* This,REFGUID guid) {
    return This->lpVtbl->SetClientGuid(This,guid);
}
static FORCEINLINE HRESULT IFileOpenDialog_ClearClientData(IFileOpenDialog* This) {
    return This->lpVtbl->ClearClientData(This);
}
static FORCEINLINE HRESULT IFileOpenDialog_SetFilter(IFileOpenDialog* This,IShellItemFilter *pFilter) {
    return This->lpVtbl->SetFilter(This,pFilter);
}
/*** IFileOpenDialog methods ***/
static FORCEINLINE HRESULT IFileOpenDialog_GetResults(IFileOpenDialog* This,IShellItemArray **ppenum) {
    return This->lpVtbl->GetResults(This,ppenum);
}
static FORCEINLINE HRESULT IFileOpenDialog_GetSelectedItems(IFileOpenDialog* This,IShellItemArray **ppsai) {
    return This->lpVtbl->GetSelectedItems(This,ppsai);
}
#endif
#endif

#endif


#endif  /* __IFileOpenDialog_INTERFACE_DEFINED__ */


typedef enum CDCONTROLSTATEF {
    CDCS_INACTIVE = 0x0,
    CDCS_ENABLED = 0x1,
    CDCS_VISIBLE = 0x2,
    CDCS_ENABLEDVISIBLE = 0x3
} CDCONTROLSTATEF;

DEFINE_ENUM_FLAG_OPERATORS(CDCONTROLSTATEF)

/*****************************************************************************
 * IFileDialogCustomize interface
 */
#ifndef __IFileDialogCustomize_INTERFACE_DEFINED__
#define __IFileDialogCustomize_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFileDialogCustomize, 0xe6fdd21a, 0x163f, 0x4975, 0x9c,0x8c, 0xa6,0x9f,0x1b,0xa3,0x70,0x34);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e6fdd21a-163f-4975-9c8c-a69f1ba37034")
IFileDialogCustomize : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EnableOpenDropDown(
        DWORD dwIDCtl) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddMenu(
        DWORD dwIDCtl,
        LPCWSTR pszLabel) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddPushButton(
        DWORD dwIDCtl,
        LPCWSTR pszLabel) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddComboBox(
        DWORD dwIDCtl) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddRadioButtonList(
        DWORD dwIDCtl) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddCheckButton(
        DWORD dwIDCtl,
        LPCWSTR pszLabel,
        WINBOOL bChecked) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddEditBox(
        DWORD dwIDCtl,
        LPCWSTR pszText) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddSeparator(
        DWORD dwIDCtl) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddText(
        DWORD dwIDCtl,
        LPCWSTR pszText) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetControlLabel(
        DWORD dwIDCtl,
        LPCWSTR pszLabel) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetControlState(
        DWORD dwIDCtl,
        CDCONTROLSTATEF *pdwState) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetControlState(
        DWORD dwIDCtl,
        CDCONTROLSTATEF dwState) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEditBoxText(
        DWORD dwIDCtl,
        WCHAR **ppszText) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEditBoxText(
        DWORD dwIDCtl,
        LPCWSTR pszText) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCheckButtonState(
        DWORD dwIDCtl,
        WINBOOL *pbChecked) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCheckButtonState(
        DWORD dwIDCtl,
        WINBOOL bChecked) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddControlItem(
        DWORD dwIDCtl,
        DWORD dwIDItem,
        LPCWSTR pszLabel) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveControlItem(
        DWORD dwIDCtl,
        DWORD dwIDItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAllControlItems(
        DWORD dwIDCtl) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetControlItemState(
        DWORD dwIDCtl,
        DWORD dwIDItem,
        CDCONTROLSTATEF *pdwState) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetControlItemState(
        DWORD dwIDCtl,
        DWORD dwIDItem,
        CDCONTROLSTATEF dwState) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelectedControlItem(
        DWORD dwIDCtl,
        DWORD *pdwIDItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSelectedControlItem(
        DWORD dwIDCtl,
        DWORD dwIDItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartVisualGroup(
        DWORD dwIDCtl,
        LPCWSTR pszLabel) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndVisualGroup(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE MakeProminent(
        DWORD dwIDCtl) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetControlItemText(
        DWORD dwIDCtl,
        DWORD dwIDItem,
        LPCWSTR pszLabel) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileDialogCustomize, 0xe6fdd21a, 0x163f, 0x4975, 0x9c,0x8c, 0xa6,0x9f,0x1b,0xa3,0x70,0x34)
#endif
#else
typedef struct IFileDialogCustomizeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFileDialogCustomize *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFileDialogCustomize *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFileDialogCustomize *This);

    /*** IFileDialogCustomize methods ***/
    HRESULT (STDMETHODCALLTYPE *EnableOpenDropDown)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl);

    HRESULT (STDMETHODCALLTYPE *AddMenu)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        LPCWSTR pszLabel);

    HRESULT (STDMETHODCALLTYPE *AddPushButton)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        LPCWSTR pszLabel);

    HRESULT (STDMETHODCALLTYPE *AddComboBox)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl);

    HRESULT (STDMETHODCALLTYPE *AddRadioButtonList)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl);

    HRESULT (STDMETHODCALLTYPE *AddCheckButton)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        LPCWSTR pszLabel,
        WINBOOL bChecked);

    HRESULT (STDMETHODCALLTYPE *AddEditBox)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        LPCWSTR pszText);

    HRESULT (STDMETHODCALLTYPE *AddSeparator)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl);

    HRESULT (STDMETHODCALLTYPE *AddText)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        LPCWSTR pszText);

    HRESULT (STDMETHODCALLTYPE *SetControlLabel)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        LPCWSTR pszLabel);

    HRESULT (STDMETHODCALLTYPE *GetControlState)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        CDCONTROLSTATEF *pdwState);

    HRESULT (STDMETHODCALLTYPE *SetControlState)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        CDCONTROLSTATEF dwState);

    HRESULT (STDMETHODCALLTYPE *GetEditBoxText)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        WCHAR **ppszText);

    HRESULT (STDMETHODCALLTYPE *SetEditBoxText)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        LPCWSTR pszText);

    HRESULT (STDMETHODCALLTYPE *GetCheckButtonState)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        WINBOOL *pbChecked);

    HRESULT (STDMETHODCALLTYPE *SetCheckButtonState)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        WINBOOL bChecked);

    HRESULT (STDMETHODCALLTYPE *AddControlItem)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        DWORD dwIDItem,
        LPCWSTR pszLabel);

    HRESULT (STDMETHODCALLTYPE *RemoveControlItem)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        DWORD dwIDItem);

    HRESULT (STDMETHODCALLTYPE *RemoveAllControlItems)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl);

    HRESULT (STDMETHODCALLTYPE *GetControlItemState)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        DWORD dwIDItem,
        CDCONTROLSTATEF *pdwState);

    HRESULT (STDMETHODCALLTYPE *SetControlItemState)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        DWORD dwIDItem,
        CDCONTROLSTATEF dwState);

    HRESULT (STDMETHODCALLTYPE *GetSelectedControlItem)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        DWORD *pdwIDItem);

    HRESULT (STDMETHODCALLTYPE *SetSelectedControlItem)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        DWORD dwIDItem);

    HRESULT (STDMETHODCALLTYPE *StartVisualGroup)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        LPCWSTR pszLabel);

    HRESULT (STDMETHODCALLTYPE *EndVisualGroup)(
        IFileDialogCustomize *This);

    HRESULT (STDMETHODCALLTYPE *MakeProminent)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl);

    HRESULT (STDMETHODCALLTYPE *SetControlItemText)(
        IFileDialogCustomize *This,
        DWORD dwIDCtl,
        DWORD dwIDItem,
        LPCWSTR pszLabel);

    END_INTERFACE
} IFileDialogCustomizeVtbl;

interface IFileDialogCustomize {
    CONST_VTBL IFileDialogCustomizeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileDialogCustomize_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileDialogCustomize_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileDialogCustomize_Release(This) (This)->lpVtbl->Release(This)
/*** IFileDialogCustomize methods ***/
#define IFileDialogCustomize_EnableOpenDropDown(This,dwIDCtl) (This)->lpVtbl->EnableOpenDropDown(This,dwIDCtl)
#define IFileDialogCustomize_AddMenu(This,dwIDCtl,pszLabel) (This)->lpVtbl->AddMenu(This,dwIDCtl,pszLabel)
#define IFileDialogCustomize_AddPushButton(This,dwIDCtl,pszLabel) (This)->lpVtbl->AddPushButton(This,dwIDCtl,pszLabel)
#define IFileDialogCustomize_AddComboBox(This,dwIDCtl) (This)->lpVtbl->AddComboBox(This,dwIDCtl)
#define IFileDialogCustomize_AddRadioButtonList(This,dwIDCtl) (This)->lpVtbl->AddRadioButtonList(This,dwIDCtl)
#define IFileDialogCustomize_AddCheckButton(This,dwIDCtl,pszLabel,bChecked) (This)->lpVtbl->AddCheckButton(This,dwIDCtl,pszLabel,bChecked)
#define IFileDialogCustomize_AddEditBox(This,dwIDCtl,pszText) (This)->lpVtbl->AddEditBox(This,dwIDCtl,pszText)
#define IFileDialogCustomize_AddSeparator(This,dwIDCtl) (This)->lpVtbl->AddSeparator(This,dwIDCtl)
#define IFileDialogCustomize_AddText(This,dwIDCtl,pszText) (This)->lpVtbl->AddText(This,dwIDCtl,pszText)
#define IFileDialogCustomize_SetControlLabel(This,dwIDCtl,pszLabel) (This)->lpVtbl->SetControlLabel(This,dwIDCtl,pszLabel)
#define IFileDialogCustomize_GetControlState(This,dwIDCtl,pdwState) (This)->lpVtbl->GetControlState(This,dwIDCtl,pdwState)
#define IFileDialogCustomize_SetControlState(This,dwIDCtl,dwState) (This)->lpVtbl->SetControlState(This,dwIDCtl,dwState)
#define IFileDialogCustomize_GetEditBoxText(This,dwIDCtl,ppszText) (This)->lpVtbl->GetEditBoxText(This,dwIDCtl,ppszText)
#define IFileDialogCustomize_SetEditBoxText(This,dwIDCtl,pszText) (This)->lpVtbl->SetEditBoxText(This,dwIDCtl,pszText)
#define IFileDialogCustomize_GetCheckButtonState(This,dwIDCtl,pbChecked) (This)->lpVtbl->GetCheckButtonState(This,dwIDCtl,pbChecked)
#define IFileDialogCustomize_SetCheckButtonState(This,dwIDCtl,bChecked) (This)->lpVtbl->SetCheckButtonState(This,dwIDCtl,bChecked)
#define IFileDialogCustomize_AddControlItem(This,dwIDCtl,dwIDItem,pszLabel) (This)->lpVtbl->AddControlItem(This,dwIDCtl,dwIDItem,pszLabel)
#define IFileDialogCustomize_RemoveControlItem(This,dwIDCtl,dwIDItem) (This)->lpVtbl->RemoveControlItem(This,dwIDCtl,dwIDItem)
#define IFileDialogCustomize_RemoveAllControlItems(This,dwIDCtl) (This)->lpVtbl->RemoveAllControlItems(This,dwIDCtl)
#define IFileDialogCustomize_GetControlItemState(This,dwIDCtl,dwIDItem,pdwState) (This)->lpVtbl->GetControlItemState(This,dwIDCtl,dwIDItem,pdwState)
#define IFileDialogCustomize_SetControlItemState(This,dwIDCtl,dwIDItem,dwState) (This)->lpVtbl->SetControlItemState(This,dwIDCtl,dwIDItem,dwState)
#define IFileDialogCustomize_GetSelectedControlItem(This,dwIDCtl,pdwIDItem) (This)->lpVtbl->GetSelectedControlItem(This,dwIDCtl,pdwIDItem)
#define IFileDialogCustomize_SetSelectedControlItem(This,dwIDCtl,dwIDItem) (This)->lpVtbl->SetSelectedControlItem(This,dwIDCtl,dwIDItem)
#define IFileDialogCustomize_StartVisualGroup(This,dwIDCtl,pszLabel) (This)->lpVtbl->StartVisualGroup(This,dwIDCtl,pszLabel)
#define IFileDialogCustomize_EndVisualGroup(This) (This)->lpVtbl->EndVisualGroup(This)
#define IFileDialogCustomize_MakeProminent(This,dwIDCtl) (This)->lpVtbl->MakeProminent(This,dwIDCtl)
#define IFileDialogCustomize_SetControlItemText(This,dwIDCtl,dwIDItem,pszLabel) (This)->lpVtbl->SetControlItemText(This,dwIDCtl,dwIDItem,pszLabel)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFileDialogCustomize_QueryInterface(IFileDialogCustomize* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFileDialogCustomize_AddRef(IFileDialogCustomize* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFileDialogCustomize_Release(IFileDialogCustomize* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileDialogCustomize methods ***/
static FORCEINLINE HRESULT IFileDialogCustomize_EnableOpenDropDown(IFileDialogCustomize* This,DWORD dwIDCtl) {
    return This->lpVtbl->EnableOpenDropDown(This,dwIDCtl);
}
static FORCEINLINE HRESULT IFileDialogCustomize_AddMenu(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszLabel) {
    return This->lpVtbl->AddMenu(This,dwIDCtl,pszLabel);
}
static FORCEINLINE HRESULT IFileDialogCustomize_AddPushButton(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszLabel) {
    return This->lpVtbl->AddPushButton(This,dwIDCtl,pszLabel);
}
static FORCEINLINE HRESULT IFileDialogCustomize_AddComboBox(IFileDialogCustomize* This,DWORD dwIDCtl) {
    return This->lpVtbl->AddComboBox(This,dwIDCtl);
}
static FORCEINLINE HRESULT IFileDialogCustomize_AddRadioButtonList(IFileDialogCustomize* This,DWORD dwIDCtl) {
    return This->lpVtbl->AddRadioButtonList(This,dwIDCtl);
}
static FORCEINLINE HRESULT IFileDialogCustomize_AddCheckButton(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszLabel,WINBOOL bChecked) {
    return This->lpVtbl->AddCheckButton(This,dwIDCtl,pszLabel,bChecked);
}
static FORCEINLINE HRESULT IFileDialogCustomize_AddEditBox(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszText) {
    return This->lpVtbl->AddEditBox(This,dwIDCtl,pszText);
}
static FORCEINLINE HRESULT IFileDialogCustomize_AddSeparator(IFileDialogCustomize* This,DWORD dwIDCtl) {
    return This->lpVtbl->AddSeparator(This,dwIDCtl);
}
static FORCEINLINE HRESULT IFileDialogCustomize_AddText(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszText) {
    return This->lpVtbl->AddText(This,dwIDCtl,pszText);
}
static FORCEINLINE HRESULT IFileDialogCustomize_SetControlLabel(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszLabel) {
    return This->lpVtbl->SetControlLabel(This,dwIDCtl,pszLabel);
}
static FORCEINLINE HRESULT IFileDialogCustomize_GetControlState(IFileDialogCustomize* This,DWORD dwIDCtl,CDCONTROLSTATEF *pdwState) {
    return This->lpVtbl->GetControlState(This,dwIDCtl,pdwState);
}
static FORCEINLINE HRESULT IFileDialogCustomize_SetControlState(IFileDialogCustomize* This,DWORD dwIDCtl,CDCONTROLSTATEF dwState) {
    return This->lpVtbl->SetControlState(This,dwIDCtl,dwState);
}
static FORCEINLINE HRESULT IFileDialogCustomize_GetEditBoxText(IFileDialogCustomize* This,DWORD dwIDCtl,WCHAR **ppszText) {
    return This->lpVtbl->GetEditBoxText(This,dwIDCtl,ppszText);
}
static FORCEINLINE HRESULT IFileDialogCustomize_SetEditBoxText(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszText) {
    return This->lpVtbl->SetEditBoxText(This,dwIDCtl,pszText);
}
static FORCEINLINE HRESULT IFileDialogCustomize_GetCheckButtonState(IFileDialogCustomize* This,DWORD dwIDCtl,WINBOOL *pbChecked) {
    return This->lpVtbl->GetCheckButtonState(This,dwIDCtl,pbChecked);
}
static FORCEINLINE HRESULT IFileDialogCustomize_SetCheckButtonState(IFileDialogCustomize* This,DWORD dwIDCtl,WINBOOL bChecked) {
    return This->lpVtbl->SetCheckButtonState(This,dwIDCtl,bChecked);
}
static FORCEINLINE HRESULT IFileDialogCustomize_AddControlItem(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD dwIDItem,LPCWSTR pszLabel) {
    return This->lpVtbl->AddControlItem(This,dwIDCtl,dwIDItem,pszLabel);
}
static FORCEINLINE HRESULT IFileDialogCustomize_RemoveControlItem(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD dwIDItem) {
    return This->lpVtbl->RemoveControlItem(This,dwIDCtl,dwIDItem);
}
static FORCEINLINE HRESULT IFileDialogCustomize_RemoveAllControlItems(IFileDialogCustomize* This,DWORD dwIDCtl) {
    return This->lpVtbl->RemoveAllControlItems(This,dwIDCtl);
}
static FORCEINLINE HRESULT IFileDialogCustomize_GetControlItemState(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD dwIDItem,CDCONTROLSTATEF *pdwState) {
    return This->lpVtbl->GetControlItemState(This,dwIDCtl,dwIDItem,pdwState);
}
static FORCEINLINE HRESULT IFileDialogCustomize_SetControlItemState(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD dwIDItem,CDCONTROLSTATEF dwState) {
    return This->lpVtbl->SetControlItemState(This,dwIDCtl,dwIDItem,dwState);
}
static FORCEINLINE HRESULT IFileDialogCustomize_GetSelectedControlItem(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD *pdwIDItem) {
    return This->lpVtbl->GetSelectedControlItem(This,dwIDCtl,pdwIDItem);
}
static FORCEINLINE HRESULT IFileDialogCustomize_SetSelectedControlItem(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD dwIDItem) {
    return This->lpVtbl->SetSelectedControlItem(This,dwIDCtl,dwIDItem);
}
static FORCEINLINE HRESULT IFileDialogCustomize_StartVisualGroup(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszLabel) {
    return This->lpVtbl->StartVisualGroup(This,dwIDCtl,pszLabel);
}
static FORCEINLINE HRESULT IFileDialogCustomize_EndVisualGroup(IFileDialogCustomize* This) {
    return This->lpVtbl->EndVisualGroup(This);
}
static FORCEINLINE HRESULT IFileDialogCustomize_MakeProminent(IFileDialogCustomize* This,DWORD dwIDCtl) {
    return This->lpVtbl->MakeProminent(This,dwIDCtl);
}
static FORCEINLINE HRESULT IFileDialogCustomize_SetControlItemText(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD dwIDItem,LPCWSTR pszLabel) {
    return This->lpVtbl->SetControlItemText(This,dwIDCtl,dwIDItem,pszLabel);
}
#endif
#endif

#endif


#endif  /* __IFileDialogCustomize_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IFileDialogControlEvents interface
 */
#ifndef __IFileDialogControlEvents_INTERFACE_DEFINED__
#define __IFileDialogControlEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFileDialogControlEvents, 0x36116642, 0xd713, 0x4b97, 0x9b,0x83, 0x74,0x84,0xa9,0xd0,0x04,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("36116642-d713-4b97-9b83-7484a9d00433")
IFileDialogControlEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnItemSelected(
        IFileDialogCustomize *pfdc,
        DWORD dwIDCtl,
        DWORD dwIDItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnButtonClicked(
        IFileDialogCustomize *pfdc,
        DWORD dwIDCtl) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnCheckButtonToggled(
        IFileDialogCustomize *pfdc,
        DWORD dwIDCtl,
        WINBOOL bChecked) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnControlActivating(
        IFileDialogCustomize *pfdc,
        DWORD dwIDCtl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileDialogControlEvents, 0x36116642, 0xd713, 0x4b97, 0x9b,0x83, 0x74,0x84,0xa9,0xd0,0x04,0x33)
#endif
#else
typedef struct IFileDialogControlEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFileDialogControlEvents *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFileDialogControlEvents *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFileDialogControlEvents *This);

    /*** IFileDialogControlEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *OnItemSelected)(
        IFileDialogControlEvents *This,
        IFileDialogCustomize *pfdc,
        DWORD dwIDCtl,
        DWORD dwIDItem);

    HRESULT (STDMETHODCALLTYPE *OnButtonClicked)(
        IFileDialogControlEvents *This,
        IFileDialogCustomize *pfdc,
        DWORD dwIDCtl);

    HRESULT (STDMETHODCALLTYPE *OnCheckButtonToggled)(
        IFileDialogControlEvents *This,
        IFileDialogCustomize *pfdc,
        DWORD dwIDCtl,
        WINBOOL bChecked);

    HRESULT (STDMETHODCALLTYPE *OnControlActivating)(
        IFileDialogControlEvents *This,
        IFileDialogCustomize *pfdc,
        DWORD dwIDCtl);

    END_INTERFACE
} IFileDialogControlEventsVtbl;

interface IFileDialogControlEvents {
    CONST_VTBL IFileDialogControlEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileDialogControlEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileDialogControlEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileDialogControlEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IFileDialogControlEvents methods ***/
#define IFileDialogControlEvents_OnItemSelected(This,pfdc,dwIDCtl,dwIDItem) (This)->lpVtbl->OnItemSelected(This,pfdc,dwIDCtl,dwIDItem)
#define IFileDialogControlEvents_OnButtonClicked(This,pfdc,dwIDCtl) (This)->lpVtbl->OnButtonClicked(This,pfdc,dwIDCtl)
#define IFileDialogControlEvents_OnCheckButtonToggled(This,pfdc,dwIDCtl,bChecked) (This)->lpVtbl->OnCheckButtonToggled(This,pfdc,dwIDCtl,bChecked)
#define IFileDialogControlEvents_OnControlActivating(This,pfdc,dwIDCtl) (This)->lpVtbl->OnControlActivating(This,pfdc,dwIDCtl)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFileDialogControlEvents_QueryInterface(IFileDialogControlEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFileDialogControlEvents_AddRef(IFileDialogControlEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFileDialogControlEvents_Release(IFileDialogControlEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileDialogControlEvents methods ***/
static FORCEINLINE HRESULT IFileDialogControlEvents_OnItemSelected(IFileDialogControlEvents* This,IFileDialogCustomize *pfdc,DWORD dwIDCtl,DWORD dwIDItem) {
    return This->lpVtbl->OnItemSelected(This,pfdc,dwIDCtl,dwIDItem);
}
static FORCEINLINE HRESULT IFileDialogControlEvents_OnButtonClicked(IFileDialogControlEvents* This,IFileDialogCustomize *pfdc,DWORD dwIDCtl) {
    return This->lpVtbl->OnButtonClicked(This,pfdc,dwIDCtl);
}
static FORCEINLINE HRESULT IFileDialogControlEvents_OnCheckButtonToggled(IFileDialogControlEvents* This,IFileDialogCustomize *pfdc,DWORD dwIDCtl,WINBOOL bChecked) {
    return This->lpVtbl->OnCheckButtonToggled(This,pfdc,dwIDCtl,bChecked);
}
static FORCEINLINE HRESULT IFileDialogControlEvents_OnControlActivating(IFileDialogControlEvents* This,IFileDialogCustomize *pfdc,DWORD dwIDCtl) {
    return This->lpVtbl->OnControlActivating(This,pfdc,dwIDCtl);
}
#endif
#endif

#endif


#endif  /* __IFileDialogControlEvents_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IFileDialog2 interface
 */
#ifndef __IFileDialog2_INTERFACE_DEFINED__
#define __IFileDialog2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFileDialog2, 0x61744fc7, 0x85b5, 0x4791, 0xa9,0xb0, 0x27,0x22,0x76,0x30,0x9b,0x13);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("61744fc7-85b5-4791-a9b0-272276309b13")
IFileDialog2 : public IFileDialog
{
    virtual HRESULT STDMETHODCALLTYPE SetCancelButtonLabel(
        LPCWSTR pszLabel) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetNavigationRoot(
        IShellItem *psi) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileDialog2, 0x61744fc7, 0x85b5, 0x4791, 0xa9,0xb0, 0x27,0x22,0x76,0x30,0x9b,0x13)
#endif
#else
typedef struct IFileDialog2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFileDialog2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFileDialog2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFileDialog2 *This);

    /*** IModalWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *Show)(
        IFileDialog2 *This,
        HWND hwndOwner);

    /*** IFileDialog methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFileTypes)(
        IFileDialog2 *This,
        UINT cFileTypes,
        const COMDLG_FILTERSPEC *rgFilterSpec);

    HRESULT (STDMETHODCALLTYPE *SetFileTypeIndex)(
        IFileDialog2 *This,
        UINT iFileType);

    HRESULT (STDMETHODCALLTYPE *GetFileTypeIndex)(
        IFileDialog2 *This,
        UINT *piFileType);

    HRESULT (STDMETHODCALLTYPE *Advise)(
        IFileDialog2 *This,
        IFileDialogEvents *pfde,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        IFileDialog2 *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *SetOptions)(
        IFileDialog2 *This,
        FILEOPENDIALOGOPTIONS fos);

    HRESULT (STDMETHODCALLTYPE *GetOptions)(
        IFileDialog2 *This,
        FILEOPENDIALOGOPTIONS *pfos);

    HRESULT (STDMETHODCALLTYPE *SetDefaultFolder)(
        IFileDialog2 *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *SetFolder)(
        IFileDialog2 *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *GetFolder)(
        IFileDialog2 *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *GetCurrentSelection)(
        IFileDialog2 *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *SetFileName)(
        IFileDialog2 *This,
        LPCWSTR pszName);

    HRESULT (STDMETHODCALLTYPE *GetFileName)(
        IFileDialog2 *This,
        LPWSTR *pszName);

    HRESULT (STDMETHODCALLTYPE *SetTitle)(
        IFileDialog2 *This,
        LPCWSTR pszTitle);

    HRESULT (STDMETHODCALLTYPE *SetOkButtonLabel)(
        IFileDialog2 *This,
        LPCWSTR pszText);

    HRESULT (STDMETHODCALLTYPE *SetFileNameLabel)(
        IFileDialog2 *This,
        LPCWSTR pszLabel);

    HRESULT (STDMETHODCALLTYPE *GetResult)(
        IFileDialog2 *This,
        IShellItem **ppsi);

    HRESULT (STDMETHODCALLTYPE *AddPlace)(
        IFileDialog2 *This,
        IShellItem *psi,
        FDAP fdap);

    HRESULT (STDMETHODCALLTYPE *SetDefaultExtension)(
        IFileDialog2 *This,
        LPCWSTR pszDefaultExtension);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IFileDialog2 *This,
        HRESULT hr);

    HRESULT (STDMETHODCALLTYPE *SetClientGuid)(
        IFileDialog2 *This,
        REFGUID guid);

    HRESULT (STDMETHODCALLTYPE *ClearClientData)(
        IFileDialog2 *This);

    HRESULT (STDMETHODCALLTYPE *SetFilter)(
        IFileDialog2 *This,
        IShellItemFilter *pFilter);

    /*** IFileDialog2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetCancelButtonLabel)(
        IFileDialog2 *This,
        LPCWSTR pszLabel);

    HRESULT (STDMETHODCALLTYPE *SetNavigationRoot)(
        IFileDialog2 *This,
        IShellItem *psi);

    END_INTERFACE
} IFileDialog2Vtbl;

interface IFileDialog2 {
    CONST_VTBL IFileDialog2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileDialog2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileDialog2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileDialog2_Release(This) (This)->lpVtbl->Release(This)
/*** IModalWindow methods ***/
#define IFileDialog2_Show(This,hwndOwner) (This)->lpVtbl->Show(This,hwndOwner)
/*** IFileDialog methods ***/
#define IFileDialog2_SetFileTypes(This,cFileTypes,rgFilterSpec) (This)->lpVtbl->SetFileTypes(This,cFileTypes,rgFilterSpec)
#define IFileDialog2_SetFileTypeIndex(This,iFileType) (This)->lpVtbl->SetFileTypeIndex(This,iFileType)
#define IFileDialog2_GetFileTypeIndex(This,piFileType) (This)->lpVtbl->GetFileTypeIndex(This,piFileType)
#define IFileDialog2_Advise(This,pfde,pdwCookie) (This)->lpVtbl->Advise(This,pfde,pdwCookie)
#define IFileDialog2_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
#define IFileDialog2_SetOptions(This,fos) (This)->lpVtbl->SetOptions(This,fos)
#define IFileDialog2_GetOptions(This,pfos) (This)->lpVtbl->GetOptions(This,pfos)
#define IFileDialog2_SetDefaultFolder(This,psi) (This)->lpVtbl->SetDefaultFolder(This,psi)
#define IFileDialog2_SetFolder(This,psi) (This)->lpVtbl->SetFolder(This,psi)
#define IFileDialog2_GetFolder(This,ppsi) (This)->lpVtbl->GetFolder(This,ppsi)
#define IFileDialog2_GetCurrentSelection(This,ppsi) (This)->lpVtbl->GetCurrentSelection(This,ppsi)
#define IFileDialog2_SetFileName(This,pszName) (This)->lpVtbl->SetFileName(This,pszName)
#define IFileDialog2_GetFileName(This,pszName) (This)->lpVtbl->GetFileName(This,pszName)
#define IFileDialog2_SetTitle(This,pszTitle) (This)->lpVtbl->SetTitle(This,pszTitle)
#define IFileDialog2_SetOkButtonLabel(This,pszText) (This)->lpVtbl->SetOkButtonLabel(This,pszText)
#define IFileDialog2_SetFileNameLabel(This,pszLabel) (This)->lpVtbl->SetFileNameLabel(This,pszLabel)
#define IFileDialog2_GetResult(This,ppsi) (This)->lpVtbl->GetResult(This,ppsi)
#define IFileDialog2_AddPlace(This,psi,fdap) (This)->lpVtbl->AddPlace(This,psi,fdap)
#define IFileDialog2_SetDefaultExtension(This,pszDefaultExtension) (This)->lpVtbl->SetDefaultExtension(This,pszDefaultExtension)
#define IFileDialog2_Close(This,hr) (This)->lpVtbl->Close(This,hr)
#define IFileDialog2_SetClientGuid(This,guid) (This)->lpVtbl->SetClientGuid(This,guid)
#define IFileDialog2_ClearClientData(This) (This)->lpVtbl->ClearClientData(This)
#define IFileDialog2_SetFilter(This,pFilter) (This)->lpVtbl->SetFilter(This,pFilter)
/*** IFileDialog2 methods ***/
#define IFileDialog2_SetCancelButtonLabel(This,pszLabel) (This)->lpVtbl->SetCancelButtonLabel(This,pszLabel)
#define IFileDialog2_SetNavigationRoot(This,psi) (This)->lpVtbl->SetNavigationRoot(This,psi)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFileDialog2_QueryInterface(IFileDialog2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFileDialog2_AddRef(IFileDialog2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFileDialog2_Release(IFileDialog2* This) {
    return This->lpVtbl->Release(This);
}
/*** IModalWindow methods ***/
static FORCEINLINE HRESULT IFileDialog2_Show(IFileDialog2* This,HWND hwndOwner) {
    return This->lpVtbl->Show(This,hwndOwner);
}
/*** IFileDialog methods ***/
static FORCEINLINE HRESULT IFileDialog2_SetFileTypes(IFileDialog2* This,UINT cFileTypes,const COMDLG_FILTERSPEC *rgFilterSpec) {
    return This->lpVtbl->SetFileTypes(This,cFileTypes,rgFilterSpec);
}
static FORCEINLINE HRESULT IFileDialog2_SetFileTypeIndex(IFileDialog2* This,UINT iFileType) {
    return This->lpVtbl->SetFileTypeIndex(This,iFileType);
}
static FORCEINLINE HRESULT IFileDialog2_GetFileTypeIndex(IFileDialog2* This,UINT *piFileType) {
    return This->lpVtbl->GetFileTypeIndex(This,piFileType);
}
static FORCEINLINE HRESULT IFileDialog2_Advise(IFileDialog2* This,IFileDialogEvents *pfde,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pfde,pdwCookie);
}
static FORCEINLINE HRESULT IFileDialog2_Unadvise(IFileDialog2* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static FORCEINLINE HRESULT IFileDialog2_SetOptions(IFileDialog2* This,FILEOPENDIALOGOPTIONS fos) {
    return This->lpVtbl->SetOptions(This,fos);
}
static FORCEINLINE HRESULT IFileDialog2_GetOptions(IFileDialog2* This,FILEOPENDIALOGOPTIONS *pfos) {
    return This->lpVtbl->GetOptions(This,pfos);
}
static FORCEINLINE HRESULT IFileDialog2_SetDefaultFolder(IFileDialog2* This,IShellItem *psi) {
    return This->lpVtbl->SetDefaultFolder(This,psi);
}
static FORCEINLINE HRESULT IFileDialog2_SetFolder(IFileDialog2* This,IShellItem *psi) {
    return This->lpVtbl->SetFolder(This,psi);
}
static FORCEINLINE HRESULT IFileDialog2_GetFolder(IFileDialog2* This,IShellItem **ppsi) {
    return This->lpVtbl->GetFolder(This,ppsi);
}
static FORCEINLINE HRESULT IFileDialog2_GetCurrentSelection(IFileDialog2* This,IShellItem **ppsi) {
    return This->lpVtbl->GetCurrentSelection(This,ppsi);
}
static FORCEINLINE HRESULT IFileDialog2_SetFileName(IFileDialog2* This,LPCWSTR pszName) {
    return This->lpVtbl->SetFileName(This,pszName);
}
static FORCEINLINE HRESULT IFileDialog2_GetFileName(IFileDialog2* This,LPWSTR *pszName) {
    return This->lpVtbl->GetFileName(This,pszName);
}
static FORCEINLINE HRESULT IFileDialog2_SetTitle(IFileDialog2* This,LPCWSTR pszTitle) {
    return This->lpVtbl->SetTitle(This,pszTitle);
}
static FORCEINLINE HRESULT IFileDialog2_SetOkButtonLabel(IFileDialog2* This,LPCWSTR pszText) {
    return This->lpVtbl->SetOkButtonLabel(This,pszText);
}
static FORCEINLINE HRESULT IFileDialog2_SetFileNameLabel(IFileDialog2* This,LPCWSTR pszLabel) {
    return This->lpVtbl->SetFileNameLabel(This,pszLabel);
}
static FORCEINLINE HRESULT IFileDialog2_GetResult(IFileDialog2* This,IShellItem **ppsi) {
    return This->lpVtbl->GetResult(This,ppsi);
}
static FORCEINLINE HRESULT IFileDialog2_AddPlace(IFileDialog2* This,IShellItem *psi,FDAP fdap) {
    return This->lpVtbl->AddPlace(This,psi,fdap);
}
static FORCEINLINE HRESULT IFileDialog2_SetDefaultExtension(IFileDialog2* This,LPCWSTR pszDefaultExtension) {
    return This->lpVtbl->SetDefaultExtension(This,pszDefaultExtension);
}
static FORCEINLINE HRESULT IFileDialog2_Close(IFileDialog2* This,HRESULT hr) {
    return This->lpVtbl->Close(This,hr);
}
static FORCEINLINE HRESULT IFileDialog2_SetClientGuid(IFileDialog2* This,REFGUID guid) {
    return This->lpVtbl->SetClientGuid(This,guid);
}
static FORCEINLINE HRESULT IFileDialog2_ClearClientData(IFileDialog2* This) {
    return This->lpVtbl->ClearClientData(This);
}
static FORCEINLINE HRESULT IFileDialog2_SetFilter(IFileDialog2* This,IShellItemFilter *pFilter) {
    return This->lpVtbl->SetFilter(This,pFilter);
}
/*** IFileDialog2 methods ***/
static FORCEINLINE HRESULT IFileDialog2_SetCancelButtonLabel(IFileDialog2* This,LPCWSTR pszLabel) {
    return This->lpVtbl->SetCancelButtonLabel(This,pszLabel);
}
static FORCEINLINE HRESULT IFileDialog2_SetNavigationRoot(IFileDialog2* This,IShellItem *psi) {
    return This->lpVtbl->SetNavigationRoot(This,psi);
}
#endif
#endif

#endif


#endif  /* __IFileDialog2_INTERFACE_DEFINED__ */


typedef enum ASSOCIATIONLEVEL {
    AL_MACHINE = 0,
    AL_EFFECTIVE = 1,
    AL_USER = 2
} ASSOCIATIONLEVEL;

typedef enum ASSOCIATIONTYPE {
    AT_FILEEXTENSION = 0,
    AT_URLPROTOCOL = 1,
    AT_STARTMENUCLIENT = 2,
    AT_MIMETYPE = 3
} ASSOCIATIONTYPE;

/*****************************************************************************
 * IApplicationAssociationRegistration interface
 */
#ifndef __IApplicationAssociationRegistration_INTERFACE_DEFINED__
#define __IApplicationAssociationRegistration_INTERFACE_DEFINED__

DEFINE_GUID(IID_IApplicationAssociationRegistration, 0x4e530b0a, 0xe611, 0x4c77, 0xa3,0xac, 0x90,0x31,0xd0,0x22,0x28,0x1b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4e530b0a-e611-4c77-a3ac-9031d022281b")
IApplicationAssociationRegistration : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryCurrentDefault(
        LPCWSTR pszQuery,
        ASSOCIATIONTYPE atQueryType,
        ASSOCIATIONLEVEL alQueryLevel,
        LPWSTR *ppszAssociation) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryAppIsDefault(
        LPCWSTR pszQuery,
        ASSOCIATIONTYPE atQueryType,
        ASSOCIATIONLEVEL alQueryLevel,
        LPCWSTR pszAppRegistryName,
        WINBOOL *pfDefault) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryAppIsDefaultAll(
        ASSOCIATIONLEVEL alQueryLevel,
        LPCWSTR pszAppRegistryName,
        WINBOOL *pfDefault) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAppAsDefault(
        LPCWSTR pszAppRegistryName,
        LPCWSTR pszSet,
        ASSOCIATIONTYPE atSetType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAppAsDefaultAll(
        LPCWSTR pszAppRegistryName) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearUserAssociations(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IApplicationAssociationRegistration, 0x4e530b0a, 0xe611, 0x4c77, 0xa3,0xac, 0x90,0x31,0xd0,0x22,0x28,0x1b)
#endif
#else
typedef struct IApplicationAssociationRegistrationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IApplicationAssociationRegistration *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IApplicationAssociationRegistration *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IApplicationAssociationRegistration *This);

    /*** IApplicationAssociationRegistration methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryCurrentDefault)(
        IApplicationAssociationRegistration *This,
        LPCWSTR pszQuery,
        ASSOCIATIONTYPE atQueryType,
        ASSOCIATIONLEVEL alQueryLevel,
        LPWSTR *ppszAssociation);

    HRESULT (STDMETHODCALLTYPE *QueryAppIsDefault)(
        IApplicationAssociationRegistration *This,
        LPCWSTR pszQuery,
        ASSOCIATIONTYPE atQueryType,
        ASSOCIATIONLEVEL alQueryLevel,
        LPCWSTR pszAppRegistryName,
        WINBOOL *pfDefault);

    HRESULT (STDMETHODCALLTYPE *QueryAppIsDefaultAll)(
        IApplicationAssociationRegistration *This,
        ASSOCIATIONLEVEL alQueryLevel,
        LPCWSTR pszAppRegistryName,
        WINBOOL *pfDefault);

    HRESULT (STDMETHODCALLTYPE *SetAppAsDefault)(
        IApplicationAssociationRegistration *This,
        LPCWSTR pszAppRegistryName,
        LPCWSTR pszSet,
        ASSOCIATIONTYPE atSetType);

    HRESULT (STDMETHODCALLTYPE *SetAppAsDefaultAll)(
        IApplicationAssociationRegistration *This,
        LPCWSTR pszAppRegistryName);

    HRESULT (STDMETHODCALLTYPE *ClearUserAssociations)(
        IApplicationAssociationRegistration *This);

    END_INTERFACE
} IApplicationAssociationRegistrationVtbl;

interface IApplicationAssociationRegistration {
    CONST_VTBL IApplicationAssociationRegistrationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IApplicationAssociationRegistration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IApplicationAssociationRegistration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IApplicationAssociationRegistration_Release(This) (This)->lpVtbl->Release(This)
/*** IApplicationAssociationRegistration methods ***/
#define IApplicationAssociationRegistration_QueryCurrentDefault(This,pszQuery,atQueryType,alQueryLevel,ppszAssociation) (This)->lpVtbl->QueryCurrentDefault(This,pszQuery,atQueryType,alQueryLevel,ppszAssociation)
#define IApplicationAssociationRegistration_QueryAppIsDefault(This,pszQuery,atQueryType,alQueryLevel,pszAppRegistryName,pfDefault) (This)->lpVtbl->QueryAppIsDefault(This,pszQuery,atQueryType,alQueryLevel,pszAppRegistryName,pfDefault)
#define IApplicationAssociationRegistration_QueryAppIsDefaultAll(This,alQueryLevel,pszAppRegistryName,pfDefault) (This)->lpVtbl->QueryAppIsDefaultAll(This,alQueryLevel,pszAppRegistryName,pfDefault)
#define IApplicationAssociationRegistration_SetAppAsDefault(This,pszAppRegistryName,pszSet,atSetType) (This)->lpVtbl->SetAppAsDefault(This,pszAppRegistryName,pszSet,atSetType)
#define IApplicationAssociationRegistration_SetAppAsDefaultAll(This,pszAppRegistryName) (This)->lpVtbl->SetAppAsDefaultAll(This,pszAppRegistryName)
#define IApplicationAssociationRegistration_ClearUserAssociations(This) (This)->lpVtbl->ClearUserAssociations(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IApplicationAssociationRegistration_QueryInterface(IApplicationAssociationRegistration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IApplicationAssociationRegistration_AddRef(IApplicationAssociationRegistration* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IApplicationAssociationRegistration_Release(IApplicationAssociationRegistration* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationAssociationRegistration methods ***/
static FORCEINLINE HRESULT IApplicationAssociationRegistration_QueryCurrentDefault(IApplicationAssociationRegistration* This,LPCWSTR pszQuery,ASSOCIATIONTYPE atQueryType,ASSOCIATIONLEVEL alQueryLevel,LPWSTR *ppszAssociation) {
    return This->lpVtbl->QueryCurrentDefault(This,pszQuery,atQueryType,alQueryLevel,ppszAssociation);
}
static FORCEINLINE HRESULT IApplicationAssociationRegistration_QueryAppIsDefault(IApplicationAssociationRegistration* This,LPCWSTR pszQuery,ASSOCIATIONTYPE atQueryType,ASSOCIATIONLEVEL alQueryLevel,LPCWSTR pszAppRegistryName,WINBOOL *pfDefault) {
    return This->lpVtbl->QueryAppIsDefault(This,pszQuery,atQueryType,alQueryLevel,pszAppRegistryName,pfDefault);
}
static FORCEINLINE HRESULT IApplicationAssociationRegistration_QueryAppIsDefaultAll(IApplicationAssociationRegistration* This,ASSOCIATIONLEVEL alQueryLevel,LPCWSTR pszAppRegistryName,WINBOOL *pfDefault) {
    return This->lpVtbl->QueryAppIsDefaultAll(This,alQueryLevel,pszAppRegistryName,pfDefault);
}
static FORCEINLINE HRESULT IApplicationAssociationRegistration_SetAppAsDefault(IApplicationAssociationRegistration* This,LPCWSTR pszAppRegistryName,LPCWSTR pszSet,ASSOCIATIONTYPE atSetType) {
    return This->lpVtbl->SetAppAsDefault(This,pszAppRegistryName,pszSet,atSetType);
}
static FORCEINLINE HRESULT IApplicationAssociationRegistration_SetAppAsDefaultAll(IApplicationAssociationRegistration* This,LPCWSTR pszAppRegistryName) {
    return This->lpVtbl->SetAppAsDefaultAll(This,pszAppRegistryName);
}
static FORCEINLINE HRESULT IApplicationAssociationRegistration_ClearUserAssociations(IApplicationAssociationRegistration* This) {
    return This->lpVtbl->ClearUserAssociations(This);
}
#endif
#endif

#endif


#endif  /* __IApplicationAssociationRegistration_INTERFACE_DEFINED__ */


SHSTDAPI SHCreateAssociationRegistration(REFIID riid, void **ppv);

/*****************************************************************************
 * IApplicationAssociationRegistrationUI interface
 */
#ifndef __IApplicationAssociationRegistrationUI_INTERFACE_DEFINED__
#define __IApplicationAssociationRegistrationUI_INTERFACE_DEFINED__

DEFINE_GUID(IID_IApplicationAssociationRegistrationUI, 0x1f76a169, 0xf994, 0x40ac, 0x8f,0xc8, 0x09,0x59,0xe8,0x87,0x47,0x10);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1f76a169-f994-40ac-8fc8-0959e8874710")
IApplicationAssociationRegistrationUI : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE LaunchAdvancedAssociationUI(
        LPCWSTR pszAppRegistryName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IApplicationAssociationRegistrationUI, 0x1f76a169, 0xf994, 0x40ac, 0x8f,0xc8, 0x09,0x59,0xe8,0x87,0x47,0x10)
#endif
#else
typedef struct IApplicationAssociationRegistrationUIVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IApplicationAssociationRegistrationUI *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IApplicationAssociationRegistrationUI *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IApplicationAssociationRegistrationUI *This);

    /*** IApplicationAssociationRegistrationUI methods ***/
    HRESULT (STDMETHODCALLTYPE *LaunchAdvancedAssociationUI)(
        IApplicationAssociationRegistrationUI *This,
        LPCWSTR pszAppRegistryName);

    END_INTERFACE
} IApplicationAssociationRegistrationUIVtbl;

interface IApplicationAssociationRegistrationUI {
    CONST_VTBL IApplicationAssociationRegistrationUIVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IApplicationAssociationRegistrationUI_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IApplicationAssociationRegistrationUI_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IApplicationAssociationRegistrationUI_Release(This) (This)->lpVtbl->Release(This)
/*** IApplicationAssociationRegistrationUI methods ***/
#define IApplicationAssociationRegistrationUI_LaunchAdvancedAssociationUI(This,pszAppRegistryName) (This)->lpVtbl->LaunchAdvancedAssociationUI(This,pszAppRegistryName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IApplicationAssociationRegistrationUI_QueryInterface(IApplicationAssociationRegistrationUI* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IApplicationAssociationRegistrationUI_AddRef(IApplicationAssociationRegistrationUI* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IApplicationAssociationRegistrationUI_Release(IApplicationAssociationRegistrationUI* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationAssociationRegistrationUI methods ***/
static FORCEINLINE HRESULT IApplicationAssociationRegistrationUI_LaunchAdvancedAssociationUI(IApplicationAssociationRegistrationUI* This,LPCWSTR pszAppRegistryName) {
    return This->lpVtbl->LaunchAdvancedAssociationUI(This,pszAppRegistryName);
}
#endif
#endif

#endif


#endif  /* __IApplicationAssociationRegistrationUI_INTERFACE_DEFINED__ */

#endif

#include <pshpack1.h>
typedef struct DELEGATEITEMID {
    WORD cbSize;
    WORD wOuter;
    WORD cbInner;
    BYTE rgb[1];
} DELEGATEITEMID;
#include <poppack.h>

typedef const UNALIGNED DELEGATEITEMID *PCDELEGATEITEMID;
typedef UNALIGNED DELEGATEITEMID *PDELEGATEITEMID;

/*****************************************************************************
 * IDelegateFolder interface
 */
#ifndef __IDelegateFolder_INTERFACE_DEFINED__
#define __IDelegateFolder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDelegateFolder, 0xadd8ba80, 0x002b, 0x11d0, 0x8f,0x0f, 0x00,0xc0,0x4f,0xd7,0xd0,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("add8ba80-002b-11d0-8f0f-00c04fd7d062")
IDelegateFolder : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetItemAlloc(
        IMalloc *pmalloc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDelegateFolder, 0xadd8ba80, 0x002b, 0x11d0, 0x8f,0x0f, 0x00,0xc0,0x4f,0xd7,0xd0,0x62)
#endif
#else
typedef struct IDelegateFolderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDelegateFolder *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDelegateFolder *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDelegateFolder *This);

    /*** IDelegateFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *SetItemAlloc)(
        IDelegateFolder *This,
        IMalloc *pmalloc);

    END_INTERFACE
} IDelegateFolderVtbl;

interface IDelegateFolder {
    CONST_VTBL IDelegateFolderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDelegateFolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDelegateFolder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDelegateFolder_Release(This) (This)->lpVtbl->Release(This)
/*** IDelegateFolder methods ***/
#define IDelegateFolder_SetItemAlloc(This,pmalloc) (This)->lpVtbl->SetItemAlloc(This,pmalloc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDelegateFolder_QueryInterface(IDelegateFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDelegateFolder_AddRef(IDelegateFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDelegateFolder_Release(IDelegateFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IDelegateFolder methods ***/
static FORCEINLINE HRESULT IDelegateFolder_SetItemAlloc(IDelegateFolder* This,IMalloc *pmalloc) {
    return This->lpVtbl->SetItemAlloc(This,pmalloc);
}
#endif
#endif

#endif


#endif  /* __IDelegateFolder_INTERFACE_DEFINED__ */


#if _WIN32_IE >= _WIN32_IE_IE60
/*****************************************************************************
 * IBrowserFrameOptions interface
 */
#ifndef __IBrowserFrameOptions_INTERFACE_DEFINED__
#define __IBrowserFrameOptions_INTERFACE_DEFINED__

typedef IBrowserFrameOptions *LPBROWSERFRAMEOPTIONS;

enum _BROWSERFRAMEOPTIONS {
    BFO_NONE = 0x0,
    BFO_BROWSER_PERSIST_SETTINGS = 0x1,
    BFO_RENAME_FOLDER_OPTIONS_TOINTERNET = 0x2,
    BFO_BOTH_OPTIONS = 0x4,
    BIF_PREFER_INTERNET_SHORTCUT = 0x8,
    BFO_BROWSE_NO_IN_NEW_PROCESS = 0x10,
    BFO_ENABLE_HYPERLINK_TRACKING = 0x20,
    BFO_USE_IE_OFFLINE_SUPPORT = 0x40,
    BFO_SUBSTITUE_INTERNET_START_PAGE = 0x80,
    BFO_USE_IE_LOGOBANDING = 0x100,
    BFO_ADD_IE_TOCAPTIONBAR = 0x200,
    BFO_USE_DIALUP_REF = 0x400,
    BFO_USE_IE_TOOLBAR = 0x800,
    BFO_NO_PARENT_FOLDER_SUPPORT = 0x1000,
    BFO_NO_REOPEN_NEXT_RESTART = 0x2000,
    BFO_GO_HOME_PAGE = 0x4000,
    BFO_PREFER_IEPROCESS = 0x8000,
    BFO_SHOW_NAVIGATION_CANCELLED = 0x10000,
    BFO_USE_IE_STATUSBAR = 0x20000,
    BFO_QUERY_ALL = (int)0xffffffff
};

typedef DWORD BROWSERFRAMEOPTIONS;

DEFINE_GUID(IID_IBrowserFrameOptions, 0x10df43c8, 0x1dbe, 0x11d3, 0x8b,0x34, 0x00,0x60,0x97,0xdf,0x5b,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("10df43c8-1dbe-11d3-8b34-006097df5bd4")
IBrowserFrameOptions : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetFrameOptions(
        BROWSERFRAMEOPTIONS dwMask,
        BROWSERFRAMEOPTIONS *pdwOptions) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBrowserFrameOptions, 0x10df43c8, 0x1dbe, 0x11d3, 0x8b,0x34, 0x00,0x60,0x97,0xdf,0x5b,0xd4)
#endif
#else
typedef struct IBrowserFrameOptionsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IBrowserFrameOptions *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IBrowserFrameOptions *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IBrowserFrameOptions *This);

    /*** IBrowserFrameOptions methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFrameOptions)(
        IBrowserFrameOptions *This,
        BROWSERFRAMEOPTIONS dwMask,
        BROWSERFRAMEOPTIONS *pdwOptions);

    END_INTERFACE
} IBrowserFrameOptionsVtbl;

interface IBrowserFrameOptions {
    CONST_VTBL IBrowserFrameOptionsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBrowserFrameOptions_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBrowserFrameOptions_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBrowserFrameOptions_Release(This) (This)->lpVtbl->Release(This)
/*** IBrowserFrameOptions methods ***/
#define IBrowserFrameOptions_GetFrameOptions(This,dwMask,pdwOptions) (This)->lpVtbl->GetFrameOptions(This,dwMask,pdwOptions)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBrowserFrameOptions_QueryInterface(IBrowserFrameOptions* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBrowserFrameOptions_AddRef(IBrowserFrameOptions* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBrowserFrameOptions_Release(IBrowserFrameOptions* This) {
    return This->lpVtbl->Release(This);
}
/*** IBrowserFrameOptions methods ***/
static FORCEINLINE HRESULT IBrowserFrameOptions_GetFrameOptions(IBrowserFrameOptions* This,BROWSERFRAMEOPTIONS dwMask,BROWSERFRAMEOPTIONS *pdwOptions) {
    return This->lpVtbl->GetFrameOptions(This,dwMask,pdwOptions);
}
#endif
#endif

#endif


#endif  /* __IBrowserFrameOptions_INTERFACE_DEFINED__ */

#endif

#if _WIN32_IE >= _WIN32_IE_IE60SP2
typedef enum NWMF {
    NWMF_UNLOADING = 0x1,
    NWMF_USERINITED = 0x2,
    NWMF_FIRST = 0x4,
    NWMF_OVERRIDEKEY = 0x8,
    NWMF_SHOWHELP = 0x10,
    NWMF_HTMLDIALOG = 0x20,
    NWMF_FROMDIALOGCHILD = 0x40,
    NWMF_USERREQUESTED = 0x80,
    NWMF_USERALLOWED = 0x100,
    NWMF_FORCEWINDOW = 0x10000,
    NWMF_FORCETAB = 0x20000,
    NWMF_SUGGESTWINDOW = 0x40000,
    NWMF_SUGGESTTAB = 0x80000,
    NWMF_INACTIVETAB = 0x100000
} NWMF;

DEFINE_ENUM_FLAG_OPERATORS(NWMF)

#define SID_SNewWindowManager IID_INewWindowManager

/*****************************************************************************
 * INewWindowManager interface
 */
#ifndef __INewWindowManager_INTERFACE_DEFINED__
#define __INewWindowManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_INewWindowManager, 0xd2bc4c84, 0x3f72, 0x4a52, 0xa6,0x04, 0x7b,0xcb,0xf3,0x98,0x2c,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d2bc4c84-3f72-4a52-a604-7bcbf3982cbb")
INewWindowManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EvaluateNewWindow(
        LPCWSTR pszUrl,
        LPCWSTR pszName,
        LPCWSTR pszUrlContext,
        LPCWSTR pszFeatures,
        WINBOOL fReplace,
        DWORD dwFlags,
        DWORD dwUserActionTime) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INewWindowManager, 0xd2bc4c84, 0x3f72, 0x4a52, 0xa6,0x04, 0x7b,0xcb,0xf3,0x98,0x2c,0xbb)
#endif
#else
typedef struct INewWindowManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INewWindowManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INewWindowManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INewWindowManager *This);

    /*** INewWindowManager methods ***/
    HRESULT (STDMETHODCALLTYPE *EvaluateNewWindow)(
        INewWindowManager *This,
        LPCWSTR pszUrl,
        LPCWSTR pszName,
        LPCWSTR pszUrlContext,
        LPCWSTR pszFeatures,
        WINBOOL fReplace,
        DWORD dwFlags,
        DWORD dwUserActionTime);

    END_INTERFACE
} INewWindowManagerVtbl;

interface INewWindowManager {
    CONST_VTBL INewWindowManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INewWindowManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INewWindowManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INewWindowManager_Release(This) (This)->lpVtbl->Release(This)
/*** INewWindowManager methods ***/
#define INewWindowManager_EvaluateNewWindow(This,pszUrl,pszName,pszUrlContext,pszFeatures,fReplace,dwFlags,dwUserActionTime) (This)->lpVtbl->EvaluateNewWindow(This,pszUrl,pszName,pszUrlContext,pszFeatures,fReplace,dwFlags,dwUserActionTime)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INewWindowManager_QueryInterface(INewWindowManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INewWindowManager_AddRef(INewWindowManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INewWindowManager_Release(INewWindowManager* This) {
    return This->lpVtbl->Release(This);
}
/*** INewWindowManager methods ***/
static FORCEINLINE HRESULT INewWindowManager_EvaluateNewWindow(INewWindowManager* This,LPCWSTR pszUrl,LPCWSTR pszName,LPCWSTR pszUrlContext,LPCWSTR pszFeatures,WINBOOL fReplace,DWORD dwFlags,DWORD dwUserActionTime) {
    return This->lpVtbl->EvaluateNewWindow(This,pszUrl,pszName,pszUrlContext,pszFeatures,fReplace,dwFlags,dwUserActionTime);
}
#endif
#endif

#endif


#endif  /* __INewWindowManager_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IAttachmentExecute interface
 */
#ifndef __IAttachmentExecute_INTERFACE_DEFINED__
#define __IAttachmentExecute_INTERFACE_DEFINED__

typedef enum ATTACHMENT_PROMPT {
    ATTACHMENT_PROMPT_NONE = 0x0,
    ATTACHMENT_PROMPT_SAVE = 0x1,
    ATTACHMENT_PROMPT_EXEC = 0x2,
    ATTACHMENT_PROMPT_EXEC_OR_SAVE = 0x3
} ATTACHMENT_PROMPT;

typedef enum ATTACHMENT_ACTION {
    ATTACHMENT_ACTION_CANCEL = 0x0,
    ATTACHMENT_ACTION_SAVE = 0x1,
    ATTACHMENT_ACTION_EXEC = 0x2
} ATTACHMENT_ACTION;

DEFINE_GUID(IID_IAttachmentExecute, 0x73db1241, 0x1e85, 0x4581, 0x8e,0x4f, 0xa8,0x1e,0x1d,0x0f,0x8c,0x57);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("73db1241-1e85-4581-8e4f-a81e1d0f8c57")
IAttachmentExecute : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetClientTitle(
        LPCWSTR pszTitle) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetClientGuid(
        REFGUID guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLocalPath(
        LPCWSTR pszLocalPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFileName(
        LPCWSTR pszFileName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSource(
        LPCWSTR pszSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetReferrer(
        LPCWSTR pszReferrer) = 0;

    virtual HRESULT STDMETHODCALLTYPE CheckPolicy(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Prompt(
        HWND hwnd,
        ATTACHMENT_PROMPT prompt,
        ATTACHMENT_ACTION *paction) = 0;

    virtual HRESULT STDMETHODCALLTYPE Save(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Execute(
        HWND hwnd,
        LPCWSTR pszVerb,
        HANDLE *phProcess) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveWithUI(
        HWND hwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearClientState(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAttachmentExecute, 0x73db1241, 0x1e85, 0x4581, 0x8e,0x4f, 0xa8,0x1e,0x1d,0x0f,0x8c,0x57)
#endif
#else
typedef struct IAttachmentExecuteVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAttachmentExecute *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAttachmentExecute *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAttachmentExecute *This);

    /*** IAttachmentExecute methods ***/
    HRESULT (STDMETHODCALLTYPE *SetClientTitle)(
        IAttachmentExecute *This,
        LPCWSTR pszTitle);

    HRESULT (STDMETHODCALLTYPE *SetClientGuid)(
        IAttachmentExecute *This,
        REFGUID guid);

    HRESULT (STDMETHODCALLTYPE *SetLocalPath)(
        IAttachmentExecute *This,
        LPCWSTR pszLocalPath);

    HRESULT (STDMETHODCALLTYPE *SetFileName)(
        IAttachmentExecute *This,
        LPCWSTR pszFileName);

    HRESULT (STDMETHODCALLTYPE *SetSource)(
        IAttachmentExecute *This,
        LPCWSTR pszSource);

    HRESULT (STDMETHODCALLTYPE *SetReferrer)(
        IAttachmentExecute *This,
        LPCWSTR pszReferrer);

    HRESULT (STDMETHODCALLTYPE *CheckPolicy)(
        IAttachmentExecute *This);

    HRESULT (STDMETHODCALLTYPE *Prompt)(
        IAttachmentExecute *This,
        HWND hwnd,
        ATTACHMENT_PROMPT prompt,
        ATTACHMENT_ACTION *paction);

    HRESULT (STDMETHODCALLTYPE *Save)(
        IAttachmentExecute *This);

    HRESULT (STDMETHODCALLTYPE *Execute)(
        IAttachmentExecute *This,
        HWND hwnd,
        LPCWSTR pszVerb,
        HANDLE *phProcess);

    HRESULT (STDMETHODCALLTYPE *SaveWithUI)(
        IAttachmentExecute *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *ClearClientState)(
        IAttachmentExecute *This);

    END_INTERFACE
} IAttachmentExecuteVtbl;

interface IAttachmentExecute {
    CONST_VTBL IAttachmentExecuteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAttachmentExecute_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAttachmentExecute_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAttachmentExecute_Release(This) (This)->lpVtbl->Release(This)
/*** IAttachmentExecute methods ***/
#define IAttachmentExecute_SetClientTitle(This,pszTitle) (This)->lpVtbl->SetClientTitle(This,pszTitle)
#define IAttachmentExecute_SetClientGuid(This,guid) (This)->lpVtbl->SetClientGuid(This,guid)
#define IAttachmentExecute_SetLocalPath(This,pszLocalPath) (This)->lpVtbl->SetLocalPath(This,pszLocalPath)
#define IAttachmentExecute_SetFileName(This,pszFileName) (This)->lpVtbl->SetFileName(This,pszFileName)
#define IAttachmentExecute_SetSource(This,pszSource) (This)->lpVtbl->SetSource(This,pszSource)
#define IAttachmentExecute_SetReferrer(This,pszReferrer) (This)->lpVtbl->SetReferrer(This,pszReferrer)
#define IAttachmentExecute_CheckPolicy(This) (This)->lpVtbl->CheckPolicy(This)
#define IAttachmentExecute_Prompt(This,hwnd,prompt,paction) (This)->lpVtbl->Prompt(This,hwnd,prompt,paction)
#define IAttachmentExecute_Save(This) (This)->lpVtbl->Save(This)
#define IAttachmentExecute_Execute(This,hwnd,pszVerb,phProcess) (This)->lpVtbl->Execute(This,hwnd,pszVerb,phProcess)
#define IAttachmentExecute_SaveWithUI(This,hwnd) (This)->lpVtbl->SaveWithUI(This,hwnd)
#define IAttachmentExecute_ClearClientState(This) (This)->lpVtbl->ClearClientState(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAttachmentExecute_QueryInterface(IAttachmentExecute* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAttachmentExecute_AddRef(IAttachmentExecute* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAttachmentExecute_Release(IAttachmentExecute* This) {
    return This->lpVtbl->Release(This);
}
/*** IAttachmentExecute methods ***/
static FORCEINLINE HRESULT IAttachmentExecute_SetClientTitle(IAttachmentExecute* This,LPCWSTR pszTitle) {
    return This->lpVtbl->SetClientTitle(This,pszTitle);
}
static FORCEINLINE HRESULT IAttachmentExecute_SetClientGuid(IAttachmentExecute* This,REFGUID guid) {
    return This->lpVtbl->SetClientGuid(This,guid);
}
static FORCEINLINE HRESULT IAttachmentExecute_SetLocalPath(IAttachmentExecute* This,LPCWSTR pszLocalPath) {
    return This->lpVtbl->SetLocalPath(This,pszLocalPath);
}
static FORCEINLINE HRESULT IAttachmentExecute_SetFileName(IAttachmentExecute* This,LPCWSTR pszFileName) {
    return This->lpVtbl->SetFileName(This,pszFileName);
}
static FORCEINLINE HRESULT IAttachmentExecute_SetSource(IAttachmentExecute* This,LPCWSTR pszSource) {
    return This->lpVtbl->SetSource(This,pszSource);
}
static FORCEINLINE HRESULT IAttachmentExecute_SetReferrer(IAttachmentExecute* This,LPCWSTR pszReferrer) {
    return This->lpVtbl->SetReferrer(This,pszReferrer);
}
static FORCEINLINE HRESULT IAttachmentExecute_CheckPolicy(IAttachmentExecute* This) {
    return This->lpVtbl->CheckPolicy(This);
}
static FORCEINLINE HRESULT IAttachmentExecute_Prompt(IAttachmentExecute* This,HWND hwnd,ATTACHMENT_PROMPT prompt,ATTACHMENT_ACTION *paction) {
    return This->lpVtbl->Prompt(This,hwnd,prompt,paction);
}
static FORCEINLINE HRESULT IAttachmentExecute_Save(IAttachmentExecute* This) {
    return This->lpVtbl->Save(This);
}
static FORCEINLINE HRESULT IAttachmentExecute_Execute(IAttachmentExecute* This,HWND hwnd,LPCWSTR pszVerb,HANDLE *phProcess) {
    return This->lpVtbl->Execute(This,hwnd,pszVerb,phProcess);
}
static FORCEINLINE HRESULT IAttachmentExecute_SaveWithUI(IAttachmentExecute* This,HWND hwnd) {
    return This->lpVtbl->SaveWithUI(This,hwnd);
}
static FORCEINLINE HRESULT IAttachmentExecute_ClearClientState(IAttachmentExecute* This) {
    return This->lpVtbl->ClearClientState(This);
}
#endif
#endif

#endif


#endif  /* __IAttachmentExecute_INTERFACE_DEFINED__ */

#endif

#if _WIN32_IE >= _WIN32_IE_IE60

#include <pshpack8.h>
typedef struct tagSMDATA {
    DWORD dwMask;
    DWORD dwFlags;
    HMENU hmenu;
    HWND hwnd;
    UINT uId;
    UINT uIdParent;
    UINT uIdAncestor;
    IUnknown *punk;
    PIDLIST_ABSOLUTE pidlFolder;
    PUITEMID_CHILD pidlItem;
    IShellFolder *psf;
    void *pvUserData;
} SMDATA;
typedef struct tagSMDATA *LPSMDATA;

#define SMDM_SHELLFOLDER 0x00000001
#define SMDM_HMENU 0x00000002
#define SMDM_TOOLBAR 0x00000004

typedef struct tagSMINFO {
    DWORD dwMask;
    DWORD dwType;
    DWORD dwFlags;
    int iIcon;
} SMINFO;
typedef struct tagSMINFO *PSMINFO;

typedef struct SHCSCHANGENOTIFYSTRUCT {
    LONG lEvent;
    PCIDLIST_ABSOLUTE pidl1;
    PCIDLIST_ABSOLUTE pidl2;
} SMCSHCHANGENOTIFYSTRUCT;
typedef struct SHCSCHANGENOTIFYSTRUCT *PSMCSHCHANGENOTIFYSTRUCT;
#include <poppack.h>

enum tagSMINFOMASK {
    SMIM_TYPE = 0x1,
    SMIM_FLAGS = 0x2,
    SMIM_ICON = 0x4
};

enum tagSMINFOTYPE {
    SMIT_SEPARATOR = 0x1,
    SMIT_STRING = 0x2
};

enum tagSMINFOFLAGS {
    SMIF_ICON = 0x1,
    SMIF_ACCELERATOR = 0x2,
    SMIF_DROPTARGET = 0x4,
    SMIF_SUBMENU = 0x8,
    SMIF_CHECKED = 0x20,
    SMIF_DROPCASCADE = 0x40,
    SMIF_HIDDEN = 0x80,
    SMIF_DISABLED = 0x100,
    SMIF_TRACKPOPUP = 0x200,
    SMIF_DEMOTED = 0x400,
    SMIF_ALTSTATE = 0x800,
    SMIF_DRAGNDROP = 0x1000,
    SMIF_NEW = 0x2000
};

#define SMC_INITMENU 0x00000001
#define SMC_CREATE 0x00000002
#define SMC_EXITMENU 0x00000003
#define SMC_GETINFO 0x00000005
#define SMC_GETSFINFO 0x00000006
#define SMC_GETOBJECT 0x00000007
#define SMC_GETSFOBJECT 0x00000008
#define SMC_SFEXEC 0x00000009
#define SMC_SFSELECTITEM 0x0000000A
#define SMC_REFRESH 0x00000010
#define SMC_DEMOTE 0x00000011
#define SMC_PROMOTE 0x00000012
#define SMC_DEFAULTICON 0x00000016
#define SMC_NEWITEM 0x00000017
#define SMC_CHEVRONEXPAND 0x00000019
#define SMC_DISPLAYCHEVRONTIP 0x0000002A
#define SMC_SETSFOBJECT 0x0000002D
#define SMC_SHCHANGENOTIFY 0x0000002E
#define SMC_CHEVRONGETTIP 0x0000002F
#define SMC_SFDDRESTRICTED 0x00000030
#if _WIN32_IE >= _WIN32_IE_IE70
#define SMC_SFEXEC_MIDDLE 0x00000031
#define SMC_GETAUTOEXPANDSTATE 0x00000041
#define SMC_AUTOEXPANDCHANGE 0x00000042
#define SMC_GETCONTEXTMENUMODIFIER 0x00000043
#define SMC_GETBKCONTEXTMENU 0x00000044
#define SMC_OPEN 0x00000045

#define SMAE_EXPANDED 0x00000001
#define SMAE_CONTRACTED 0x00000002

#define SMAE_USER 0x00000004

#define SMAE_VALID 0x00000007
#endif

/*****************************************************************************
 * IShellMenuCallback interface
 */
#ifndef __IShellMenuCallback_INTERFACE_DEFINED__
#define __IShellMenuCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellMenuCallback, 0x4ca300a1, 0x9b8d, 0x11d1, 0x8b,0x22, 0x00,0xc0,0x4f,0xd9,0x18,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4ca300a1-9b8d-11d1-8b22-00c04fd918d0")
IShellMenuCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CallbackSM(
        LPSMDATA psmd,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellMenuCallback, 0x4ca300a1, 0x9b8d, 0x11d1, 0x8b,0x22, 0x00,0xc0,0x4f,0xd9,0x18,0xd0)
#endif
#else
typedef struct IShellMenuCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellMenuCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellMenuCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellMenuCallback *This);

    /*** IShellMenuCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *CallbackSM)(
        IShellMenuCallback *This,
        LPSMDATA psmd,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam);

    END_INTERFACE
} IShellMenuCallbackVtbl;

interface IShellMenuCallback {
    CONST_VTBL IShellMenuCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellMenuCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellMenuCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellMenuCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IShellMenuCallback methods ***/
#define IShellMenuCallback_CallbackSM(This,psmd,uMsg,wParam,lParam) (This)->lpVtbl->CallbackSM(This,psmd,uMsg,wParam,lParam)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellMenuCallback_QueryInterface(IShellMenuCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellMenuCallback_AddRef(IShellMenuCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellMenuCallback_Release(IShellMenuCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellMenuCallback methods ***/
static FORCEINLINE HRESULT IShellMenuCallback_CallbackSM(IShellMenuCallback* This,LPSMDATA psmd,UINT uMsg,WPARAM wParam,LPARAM lParam) {
    return This->lpVtbl->CallbackSM(This,psmd,uMsg,wParam,lParam);
}
#endif
#endif

#endif


#endif  /* __IShellMenuCallback_INTERFACE_DEFINED__ */


#define SMINIT_DEFAULT 0x00000000
#define SMINIT_RESTRICT_DRAGDROP 0x00000002
#define SMINIT_TOPLEVEL 0x00000004
#define SMINIT_CACHED 0x00000010
#if _WIN32_IE >= _WIN32_IE_IE70
#define SMINIT_AUTOEXPAND 0x00000100
#define SMINIT_AUTOTOOLTIP 0x00000200
#define SMINIT_DROPONCONTAINER 0x00000400
#endif

#define SMINIT_VERTICAL 0x10000000
#define SMINIT_HORIZONTAL 0x20000000

#define ANCESTORDEFAULT (UINT)-1

#define SMSET_TOP 0x10000000
#define SMSET_BOTTOM 0x20000000
#define SMSET_DONTOWN 0x00000001

#define SMINV_REFRESH 0x00000001
#define SMINV_ID 0x00000008

/*****************************************************************************
 * IShellMenu interface
 */
#ifndef __IShellMenu_INTERFACE_DEFINED__
#define __IShellMenu_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellMenu, 0xee1f7637, 0xe138, 0x11d1, 0x83,0x79, 0x00,0xc0,0x4f,0xd9,0x18,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ee1f7637-e138-11d1-8379-00c04fd918d0")
IShellMenu : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IShellMenuCallback *psmc,
        UINT uId,
        UINT uIdAncestor,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMenuInfo(
        IShellMenuCallback **ppsmc,
        UINT *puId,
        UINT *puIdAncestor,
        DWORD *pdwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetShellFolder(
        IShellFolder *psf,
        PCIDLIST_ABSOLUTE pidlFolder,
        HKEY hKey,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetShellFolder(
        DWORD *pdwFlags,
        PIDLIST_ABSOLUTE *ppidl,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMenu(
        HMENU hmenu,
        HWND hwnd,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMenu(
        HMENU *phmenu,
        HWND *phwnd,
        DWORD *pdwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvalidateItem(
        LPSMDATA psmd,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetState(
        LPSMDATA psmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMenuToolbar(
        IUnknown *punk,
        DWORD dwFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellMenu, 0xee1f7637, 0xe138, 0x11d1, 0x83,0x79, 0x00,0xc0,0x4f,0xd9,0x18,0xd0)
#endif
#else
typedef struct IShellMenuVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellMenu *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellMenu *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellMenu *This);

    /*** IShellMenu methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IShellMenu *This,
        IShellMenuCallback *psmc,
        UINT uId,
        UINT uIdAncestor,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetMenuInfo)(
        IShellMenu *This,
        IShellMenuCallback **ppsmc,
        UINT *puId,
        UINT *puIdAncestor,
        DWORD *pdwFlags);

    HRESULT (STDMETHODCALLTYPE *SetShellFolder)(
        IShellMenu *This,
        IShellFolder *psf,
        PCIDLIST_ABSOLUTE pidlFolder,
        HKEY hKey,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetShellFolder)(
        IShellMenu *This,
        DWORD *pdwFlags,
        PIDLIST_ABSOLUTE *ppidl,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *SetMenu)(
        IShellMenu *This,
        HMENU hmenu,
        HWND hwnd,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetMenu)(
        IShellMenu *This,
        HMENU *phmenu,
        HWND *phwnd,
        DWORD *pdwFlags);

    HRESULT (STDMETHODCALLTYPE *InvalidateItem)(
        IShellMenu *This,
        LPSMDATA psmd,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetState)(
        IShellMenu *This,
        LPSMDATA psmd);

    HRESULT (STDMETHODCALLTYPE *SetMenuToolbar)(
        IShellMenu *This,
        IUnknown *punk,
        DWORD dwFlags);

    END_INTERFACE
} IShellMenuVtbl;

interface IShellMenu {
    CONST_VTBL IShellMenuVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellMenu_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellMenu_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellMenu_Release(This) (This)->lpVtbl->Release(This)
/*** IShellMenu methods ***/
#define IShellMenu_Initialize(This,psmc,uId,uIdAncestor,dwFlags) (This)->lpVtbl->Initialize(This,psmc,uId,uIdAncestor,dwFlags)
#define IShellMenu_GetMenuInfo(This,ppsmc,puId,puIdAncestor,pdwFlags) (This)->lpVtbl->GetMenuInfo(This,ppsmc,puId,puIdAncestor,pdwFlags)
#define IShellMenu_SetShellFolder(This,psf,pidlFolder,hKey,dwFlags) (This)->lpVtbl->SetShellFolder(This,psf,pidlFolder,hKey,dwFlags)
#define IShellMenu_GetShellFolder(This,pdwFlags,ppidl,riid,ppv) (This)->lpVtbl->GetShellFolder(This,pdwFlags,ppidl,riid,ppv)
#define IShellMenu_SetMenu(This,hmenu,hwnd,dwFlags) (This)->lpVtbl->SetMenu(This,hmenu,hwnd,dwFlags)
#define IShellMenu_GetMenu(This,phmenu,phwnd,pdwFlags) (This)->lpVtbl->GetMenu(This,phmenu,phwnd,pdwFlags)
#define IShellMenu_InvalidateItem(This,psmd,dwFlags) (This)->lpVtbl->InvalidateItem(This,psmd,dwFlags)
#define IShellMenu_GetState(This,psmd) (This)->lpVtbl->GetState(This,psmd)
#define IShellMenu_SetMenuToolbar(This,punk,dwFlags) (This)->lpVtbl->SetMenuToolbar(This,punk,dwFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellMenu_QueryInterface(IShellMenu* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellMenu_AddRef(IShellMenu* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellMenu_Release(IShellMenu* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellMenu methods ***/
static FORCEINLINE HRESULT IShellMenu_Initialize(IShellMenu* This,IShellMenuCallback *psmc,UINT uId,UINT uIdAncestor,DWORD dwFlags) {
    return This->lpVtbl->Initialize(This,psmc,uId,uIdAncestor,dwFlags);
}
static FORCEINLINE HRESULT IShellMenu_GetMenuInfo(IShellMenu* This,IShellMenuCallback **ppsmc,UINT *puId,UINT *puIdAncestor,DWORD *pdwFlags) {
    return This->lpVtbl->GetMenuInfo(This,ppsmc,puId,puIdAncestor,pdwFlags);
}
static FORCEINLINE HRESULT IShellMenu_SetShellFolder(IShellMenu* This,IShellFolder *psf,PCIDLIST_ABSOLUTE pidlFolder,HKEY hKey,DWORD dwFlags) {
    return This->lpVtbl->SetShellFolder(This,psf,pidlFolder,hKey,dwFlags);
}
static FORCEINLINE HRESULT IShellMenu_GetShellFolder(IShellMenu* This,DWORD *pdwFlags,PIDLIST_ABSOLUTE *ppidl,REFIID riid,void **ppv) {
    return This->lpVtbl->GetShellFolder(This,pdwFlags,ppidl,riid,ppv);
}
static FORCEINLINE HRESULT IShellMenu_SetMenu(IShellMenu* This,HMENU hmenu,HWND hwnd,DWORD dwFlags) {
    return This->lpVtbl->SetMenu(This,hmenu,hwnd,dwFlags);
}
static FORCEINLINE HRESULT IShellMenu_GetMenu(IShellMenu* This,HMENU *phmenu,HWND *phwnd,DWORD *pdwFlags) {
    return This->lpVtbl->GetMenu(This,phmenu,phwnd,pdwFlags);
}
static FORCEINLINE HRESULT IShellMenu_InvalidateItem(IShellMenu* This,LPSMDATA psmd,DWORD dwFlags) {
    return This->lpVtbl->InvalidateItem(This,psmd,dwFlags);
}
static FORCEINLINE HRESULT IShellMenu_GetState(IShellMenu* This,LPSMDATA psmd) {
    return This->lpVtbl->GetState(This,psmd);
}
static FORCEINLINE HRESULT IShellMenu_SetMenuToolbar(IShellMenu* This,IUnknown *punk,DWORD dwFlags) {
    return This->lpVtbl->SetMenuToolbar(This,punk,dwFlags);
}
#endif
#endif

#endif


#endif  /* __IShellMenu_INTERFACE_DEFINED__ */

#endif

/*****************************************************************************
 * IShellRunDll interface
 */
#ifndef __IShellRunDll_INTERFACE_DEFINED__
#define __IShellRunDll_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellRunDll, 0xfce4bde0, 0x4b68, 0x4b80, 0x8e,0x9c, 0x74,0x26,0x31,0x5a,0x73,0x88);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fce4bde0-4b68-4b80-8e9c-7426315a7388")
IShellRunDll : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Run(
        LPCWSTR pszArgs) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellRunDll, 0xfce4bde0, 0x4b68, 0x4b80, 0x8e,0x9c, 0x74,0x26,0x31,0x5a,0x73,0x88)
#endif
#else
typedef struct IShellRunDllVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellRunDll *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellRunDll *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellRunDll *This);

    /*** IShellRunDll methods ***/
    HRESULT (STDMETHODCALLTYPE *Run)(
        IShellRunDll *This,
        LPCWSTR pszArgs);

    END_INTERFACE
} IShellRunDllVtbl;

interface IShellRunDll {
    CONST_VTBL IShellRunDllVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellRunDll_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellRunDll_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellRunDll_Release(This) (This)->lpVtbl->Release(This)
/*** IShellRunDll methods ***/
#define IShellRunDll_Run(This,pszArgs) (This)->lpVtbl->Run(This,pszArgs)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellRunDll_QueryInterface(IShellRunDll* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellRunDll_AddRef(IShellRunDll* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellRunDll_Release(IShellRunDll* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellRunDll methods ***/
static FORCEINLINE HRESULT IShellRunDll_Run(IShellRunDll* This,LPCWSTR pszArgs) {
    return This->lpVtbl->Run(This,pszArgs);
}
#endif
#endif

#endif


#endif  /* __IShellRunDll_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_VISTA
typedef enum KF_CATEGORY {
    KF_CATEGORY_VIRTUAL = 1,
    KF_CATEGORY_FIXED = 2,
    KF_CATEGORY_COMMON = 3,
    KF_CATEGORY_PERUSER = 4
} KF_CATEGORY;

enum _KF_DEFINITION_FLAGS {
    KFDF_LOCAL_REDIRECT_ONLY = 0x2,
    KFDF_ROAMABLE = 0x4,
    KFDF_PRECREATE = 0x8,
    KFDF_STREAM = 0x10,
    KFDF_PUBLISHEXPANDEDPATH = 0x20
};

typedef DWORD KF_DEFINITION_FLAGS;

enum _KF_REDIRECT_FLAGS {
    KF_REDIRECT_USER_EXCLUSIVE = 0x1,
    KF_REDIRECT_COPY_SOURCE_DACL = 0x2,
    KF_REDIRECT_OWNER_USER = 0x4,
    KF_REDIRECT_SET_OWNER_EXPLICIT = 0x8,
    KF_REDIRECT_CHECK_ONLY = 0x10,
    KF_REDIRECT_WITH_UI = 0x20,
    KF_REDIRECT_UNPIN = 0x40,
    KF_REDIRECT_PIN = 0x80,
    KF_REDIRECT_COPY_CONTENTS = 0x200,
    KF_REDIRECT_DEL_SOURCE_CONTENTS = 0x400,
    KF_REDIRECT_EXCLUDE_ALL_KNOWN_SUBFOLDERS = 0x800
};

typedef DWORD KF_REDIRECT_FLAGS;

enum _KF_REDIRECTION_CAPABILITIES {
    KF_REDIRECTION_CAPABILITIES_ALLOW_ALL = 0xff,
    KF_REDIRECTION_CAPABILITIES_REDIRECTABLE = 0x1,
    KF_REDIRECTION_CAPABILITIES_DENY_ALL = 0xfff00,
    KF_REDIRECTION_CAPABILITIES_DENY_POLICY_REDIRECTED = 0x100,
    KF_REDIRECTION_CAPABILITIES_DENY_POLICY = 0x200,
    KF_REDIRECTION_CAPABILITIES_DENY_PERMISSIONS = 0x400
};

typedef DWORD KF_REDIRECTION_CAPABILITIES;

typedef struct KNOWNFOLDER_DEFINITION {
    KF_CATEGORY category;
    LPWSTR pszName;
    LPWSTR pszDescription;
    KNOWNFOLDERID fidParent;
    LPWSTR pszRelativePath;
    LPWSTR pszParsingName;
    LPWSTR pszTooltip;
    LPWSTR pszLocalizedName;
    LPWSTR pszIcon;
    LPWSTR pszSecurity;
    DWORD dwAttributes;
    KF_DEFINITION_FLAGS kfdFlags;
    FOLDERTYPEID ftidType;
} KNOWNFOLDER_DEFINITION;

/*****************************************************************************
 * IKnownFolder interface
 */
#ifndef __IKnownFolder_INTERFACE_DEFINED__
#define __IKnownFolder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IKnownFolder, 0x3aa7af7e, 0x9b36, 0x420c, 0xa8,0xe3, 0xf7,0x7d,0x46,0x74,0xa4,0x88);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3aa7af7e-9b36-420c-a8e3-f77d4674a488")
IKnownFolder : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetId(
        KNOWNFOLDERID *pkfid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCategory(
        KF_CATEGORY *pCategory) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetShellItem(
        DWORD dwFlags,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPath(
        DWORD dwFlags,
        LPWSTR *ppszPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPath(
        DWORD dwFlags,
        LPCWSTR pszPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIDList(
        DWORD dwFlags,
        PIDLIST_ABSOLUTE *ppidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolderType(
        FOLDERTYPEID *pftid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRedirectionCapabilities(
        KF_REDIRECTION_CAPABILITIES *pCapabilities) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolderDefinition(
        KNOWNFOLDER_DEFINITION *pKFD) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IKnownFolder, 0x3aa7af7e, 0x9b36, 0x420c, 0xa8,0xe3, 0xf7,0x7d,0x46,0x74,0xa4,0x88)
#endif
#else
typedef struct IKnownFolderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IKnownFolder *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IKnownFolder *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IKnownFolder *This);

    /*** IKnownFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *GetId)(
        IKnownFolder *This,
        KNOWNFOLDERID *pkfid);

    HRESULT (STDMETHODCALLTYPE *GetCategory)(
        IKnownFolder *This,
        KF_CATEGORY *pCategory);

    HRESULT (STDMETHODCALLTYPE *GetShellItem)(
        IKnownFolder *This,
        DWORD dwFlags,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetPath)(
        IKnownFolder *This,
        DWORD dwFlags,
        LPWSTR *ppszPath);

    HRESULT (STDMETHODCALLTYPE *SetPath)(
        IKnownFolder *This,
        DWORD dwFlags,
        LPCWSTR pszPath);

    HRESULT (STDMETHODCALLTYPE *GetIDList)(
        IKnownFolder *This,
        DWORD dwFlags,
        PIDLIST_ABSOLUTE *ppidl);

    HRESULT (STDMETHODCALLTYPE *GetFolderType)(
        IKnownFolder *This,
        FOLDERTYPEID *pftid);

    HRESULT (STDMETHODCALLTYPE *GetRedirectionCapabilities)(
        IKnownFolder *This,
        KF_REDIRECTION_CAPABILITIES *pCapabilities);

    HRESULT (STDMETHODCALLTYPE *GetFolderDefinition)(
        IKnownFolder *This,
        KNOWNFOLDER_DEFINITION *pKFD);

    END_INTERFACE
} IKnownFolderVtbl;

interface IKnownFolder {
    CONST_VTBL IKnownFolderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IKnownFolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IKnownFolder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IKnownFolder_Release(This) (This)->lpVtbl->Release(This)
/*** IKnownFolder methods ***/
#define IKnownFolder_GetId(This,pkfid) (This)->lpVtbl->GetId(This,pkfid)
#define IKnownFolder_GetCategory(This,pCategory) (This)->lpVtbl->GetCategory(This,pCategory)
#define IKnownFolder_GetShellItem(This,dwFlags,riid,ppv) (This)->lpVtbl->GetShellItem(This,dwFlags,riid,ppv)
#define IKnownFolder_GetPath(This,dwFlags,ppszPath) (This)->lpVtbl->GetPath(This,dwFlags,ppszPath)
#define IKnownFolder_SetPath(This,dwFlags,pszPath) (This)->lpVtbl->SetPath(This,dwFlags,pszPath)
#define IKnownFolder_GetIDList(This,dwFlags,ppidl) (This)->lpVtbl->GetIDList(This,dwFlags,ppidl)
#define IKnownFolder_GetFolderType(This,pftid) (This)->lpVtbl->GetFolderType(This,pftid)
#define IKnownFolder_GetRedirectionCapabilities(This,pCapabilities) (This)->lpVtbl->GetRedirectionCapabilities(This,pCapabilities)
#define IKnownFolder_GetFolderDefinition(This,pKFD) (This)->lpVtbl->GetFolderDefinition(This,pKFD)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IKnownFolder_QueryInterface(IKnownFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IKnownFolder_AddRef(IKnownFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IKnownFolder_Release(IKnownFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IKnownFolder methods ***/
static FORCEINLINE HRESULT IKnownFolder_GetId(IKnownFolder* This,KNOWNFOLDERID *pkfid) {
    return This->lpVtbl->GetId(This,pkfid);
}
static FORCEINLINE HRESULT IKnownFolder_GetCategory(IKnownFolder* This,KF_CATEGORY *pCategory) {
    return This->lpVtbl->GetCategory(This,pCategory);
}
static FORCEINLINE HRESULT IKnownFolder_GetShellItem(IKnownFolder* This,DWORD dwFlags,REFIID riid,void **ppv) {
    return This->lpVtbl->GetShellItem(This,dwFlags,riid,ppv);
}
static FORCEINLINE HRESULT IKnownFolder_GetPath(IKnownFolder* This,DWORD dwFlags,LPWSTR *ppszPath) {
    return This->lpVtbl->GetPath(This,dwFlags,ppszPath);
}
static FORCEINLINE HRESULT IKnownFolder_SetPath(IKnownFolder* This,DWORD dwFlags,LPCWSTR pszPath) {
    return This->lpVtbl->SetPath(This,dwFlags,pszPath);
}
static FORCEINLINE HRESULT IKnownFolder_GetIDList(IKnownFolder* This,DWORD dwFlags,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetIDList(This,dwFlags,ppidl);
}
static FORCEINLINE HRESULT IKnownFolder_GetFolderType(IKnownFolder* This,FOLDERTYPEID *pftid) {
    return This->lpVtbl->GetFolderType(This,pftid);
}
static FORCEINLINE HRESULT IKnownFolder_GetRedirectionCapabilities(IKnownFolder* This,KF_REDIRECTION_CAPABILITIES *pCapabilities) {
    return This->lpVtbl->GetRedirectionCapabilities(This,pCapabilities);
}
static FORCEINLINE HRESULT IKnownFolder_GetFolderDefinition(IKnownFolder* This,KNOWNFOLDER_DEFINITION *pKFD) {
    return This->lpVtbl->GetFolderDefinition(This,pKFD);
}
#endif
#endif

#endif


#endif  /* __IKnownFolder_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IKnownFolderManager interface
 */
#ifndef __IKnownFolderManager_INTERFACE_DEFINED__
#define __IKnownFolderManager_INTERFACE_DEFINED__

typedef enum FFFP_MODE {
    FFFP_EXACTMATCH = 0,
    FFFP_NEARESTPARENTMATCH = 1
} FFFP_MODE;

DEFINE_GUID(IID_IKnownFolderManager, 0x8be2d872, 0x86aa, 0x4d47, 0xb7,0x76, 0x32,0xcc,0xa4,0x0c,0x70,0x18);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8be2d872-86aa-4d47-b776-32cca40c7018")
IKnownFolderManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE FolderIdFromCsidl(
        int nCsidl,
        KNOWNFOLDERID *pfid) = 0;

    virtual HRESULT STDMETHODCALLTYPE FolderIdToCsidl(
        REFKNOWNFOLDERID rfid,
        int *pnCsidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolderIds(
        KNOWNFOLDERID **ppKFId,
        UINT *pCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolder(
        REFKNOWNFOLDERID rfid,
        IKnownFolder **ppkf) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolderByName(
        LPCWSTR pszCanonicalName,
        IKnownFolder **ppkf) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterFolder(
        REFKNOWNFOLDERID rfid,
        const KNOWNFOLDER_DEFINITION *pKFD) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterFolder(
        REFKNOWNFOLDERID rfid) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindFolderFromPath(
        LPCWSTR pszPath,
        FFFP_MODE mode,
        IKnownFolder **ppkf) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindFolderFromIDList(
        PCIDLIST_ABSOLUTE pidl,
        IKnownFolder **ppkf) = 0;

    virtual HRESULT STDMETHODCALLTYPE Redirect(
        REFKNOWNFOLDERID rfid,
        HWND hwnd,
        KF_REDIRECT_FLAGS flags,
        LPCWSTR pszTargetPath,
        UINT cFolders,
        const KNOWNFOLDERID *pExclusion,
        LPWSTR *ppszError) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IKnownFolderManager, 0x8be2d872, 0x86aa, 0x4d47, 0xb7,0x76, 0x32,0xcc,0xa4,0x0c,0x70,0x18)
#endif
#else
typedef struct IKnownFolderManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IKnownFolderManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IKnownFolderManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IKnownFolderManager *This);

    /*** IKnownFolderManager methods ***/
    HRESULT (STDMETHODCALLTYPE *FolderIdFromCsidl)(
        IKnownFolderManager *This,
        int nCsidl,
        KNOWNFOLDERID *pfid);

    HRESULT (STDMETHODCALLTYPE *FolderIdToCsidl)(
        IKnownFolderManager *This,
        REFKNOWNFOLDERID rfid,
        int *pnCsidl);

    HRESULT (STDMETHODCALLTYPE *GetFolderIds)(
        IKnownFolderManager *This,
        KNOWNFOLDERID **ppKFId,
        UINT *pCount);

    HRESULT (STDMETHODCALLTYPE *GetFolder)(
        IKnownFolderManager *This,
        REFKNOWNFOLDERID rfid,
        IKnownFolder **ppkf);

    HRESULT (STDMETHODCALLTYPE *GetFolderByName)(
        IKnownFolderManager *This,
        LPCWSTR pszCanonicalName,
        IKnownFolder **ppkf);

    HRESULT (STDMETHODCALLTYPE *RegisterFolder)(
        IKnownFolderManager *This,
        REFKNOWNFOLDERID rfid,
        const KNOWNFOLDER_DEFINITION *pKFD);

    HRESULT (STDMETHODCALLTYPE *UnregisterFolder)(
        IKnownFolderManager *This,
        REFKNOWNFOLDERID rfid);

    HRESULT (STDMETHODCALLTYPE *FindFolderFromPath)(
        IKnownFolderManager *This,
        LPCWSTR pszPath,
        FFFP_MODE mode,
        IKnownFolder **ppkf);

    HRESULT (STDMETHODCALLTYPE *FindFolderFromIDList)(
        IKnownFolderManager *This,
        PCIDLIST_ABSOLUTE pidl,
        IKnownFolder **ppkf);

    HRESULT (STDMETHODCALLTYPE *Redirect)(
        IKnownFolderManager *This,
        REFKNOWNFOLDERID rfid,
        HWND hwnd,
        KF_REDIRECT_FLAGS flags,
        LPCWSTR pszTargetPath,
        UINT cFolders,
        const KNOWNFOLDERID *pExclusion,
        LPWSTR *ppszError);

    END_INTERFACE
} IKnownFolderManagerVtbl;

interface IKnownFolderManager {
    CONST_VTBL IKnownFolderManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IKnownFolderManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IKnownFolderManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IKnownFolderManager_Release(This) (This)->lpVtbl->Release(This)
/*** IKnownFolderManager methods ***/
#define IKnownFolderManager_FolderIdFromCsidl(This,nCsidl,pfid) (This)->lpVtbl->FolderIdFromCsidl(This,nCsidl,pfid)
#define IKnownFolderManager_FolderIdToCsidl(This,rfid,pnCsidl) (This)->lpVtbl->FolderIdToCsidl(This,rfid,pnCsidl)
#define IKnownFolderManager_GetFolderIds(This,ppKFId,pCount) (This)->lpVtbl->GetFolderIds(This,ppKFId,pCount)
#define IKnownFolderManager_GetFolder(This,rfid,ppkf) (This)->lpVtbl->GetFolder(This,rfid,ppkf)
#define IKnownFolderManager_GetFolderByName(This,pszCanonicalName,ppkf) (This)->lpVtbl->GetFolderByName(This,pszCanonicalName,ppkf)
#define IKnownFolderManager_RegisterFolder(This,rfid,pKFD) (This)->lpVtbl->RegisterFolder(This,rfid,pKFD)
#define IKnownFolderManager_UnregisterFolder(This,rfid) (This)->lpVtbl->UnregisterFolder(This,rfid)
#define IKnownFolderManager_FindFolderFromPath(This,pszPath,mode,ppkf) (This)->lpVtbl->FindFolderFromPath(This,pszPath,mode,ppkf)
#define IKnownFolderManager_FindFolderFromIDList(This,pidl,ppkf) (This)->lpVtbl->FindFolderFromIDList(This,pidl,ppkf)
#define IKnownFolderManager_Redirect(This,rfid,hwnd,flags,pszTargetPath,cFolders,pExclusion,ppszError) (This)->lpVtbl->Redirect(This,rfid,hwnd,flags,pszTargetPath,cFolders,pExclusion,ppszError)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IKnownFolderManager_QueryInterface(IKnownFolderManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IKnownFolderManager_AddRef(IKnownFolderManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IKnownFolderManager_Release(IKnownFolderManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IKnownFolderManager methods ***/
static FORCEINLINE HRESULT IKnownFolderManager_FolderIdFromCsidl(IKnownFolderManager* This,int nCsidl,KNOWNFOLDERID *pfid) {
    return This->lpVtbl->FolderIdFromCsidl(This,nCsidl,pfid);
}
static FORCEINLINE HRESULT IKnownFolderManager_FolderIdToCsidl(IKnownFolderManager* This,REFKNOWNFOLDERID rfid,int *pnCsidl) {
    return This->lpVtbl->FolderIdToCsidl(This,rfid,pnCsidl);
}
static FORCEINLINE HRESULT IKnownFolderManager_GetFolderIds(IKnownFolderManager* This,KNOWNFOLDERID **ppKFId,UINT *pCount) {
    return This->lpVtbl->GetFolderIds(This,ppKFId,pCount);
}
static FORCEINLINE HRESULT IKnownFolderManager_GetFolder(IKnownFolderManager* This,REFKNOWNFOLDERID rfid,IKnownFolder **ppkf) {
    return This->lpVtbl->GetFolder(This,rfid,ppkf);
}
static FORCEINLINE HRESULT IKnownFolderManager_GetFolderByName(IKnownFolderManager* This,LPCWSTR pszCanonicalName,IKnownFolder **ppkf) {
    return This->lpVtbl->GetFolderByName(This,pszCanonicalName,ppkf);
}
static FORCEINLINE HRESULT IKnownFolderManager_RegisterFolder(IKnownFolderManager* This,REFKNOWNFOLDERID rfid,const KNOWNFOLDER_DEFINITION *pKFD) {
    return This->lpVtbl->RegisterFolder(This,rfid,pKFD);
}
static FORCEINLINE HRESULT IKnownFolderManager_UnregisterFolder(IKnownFolderManager* This,REFKNOWNFOLDERID rfid) {
    return This->lpVtbl->UnregisterFolder(This,rfid);
}
static FORCEINLINE HRESULT IKnownFolderManager_FindFolderFromPath(IKnownFolderManager* This,LPCWSTR pszPath,FFFP_MODE mode,IKnownFolder **ppkf) {
    return This->lpVtbl->FindFolderFromPath(This,pszPath,mode,ppkf);
}
static FORCEINLINE HRESULT IKnownFolderManager_FindFolderFromIDList(IKnownFolderManager* This,PCIDLIST_ABSOLUTE pidl,IKnownFolder **ppkf) {
    return This->lpVtbl->FindFolderFromIDList(This,pidl,ppkf);
}
static FORCEINLINE HRESULT IKnownFolderManager_Redirect(IKnownFolderManager* This,REFKNOWNFOLDERID rfid,HWND hwnd,KF_REDIRECT_FLAGS flags,LPCWSTR pszTargetPath,UINT cFolders,const KNOWNFOLDERID *pExclusion,LPWSTR *ppszError) {
    return This->lpVtbl->Redirect(This,rfid,hwnd,flags,pszTargetPath,cFolders,pExclusion,ppszError);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IKnownFolderManager_RemoteRedirect_Proxy(
    IKnownFolderManager* This,
    REFKNOWNFOLDERID rfid,
    HWND hwnd,
    KF_REDIRECT_FLAGS flags,
    LPCWSTR pszTargetPath,
    UINT cFolders,
    const GUID *pExclusion,
    LPWSTR *ppszError);
void __RPC_STUB IKnownFolderManager_RemoteRedirect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IKnownFolderManager_Redirect_Proxy(
    IKnownFolderManager* This,
    REFKNOWNFOLDERID rfid,
    HWND hwnd,
    KF_REDIRECT_FLAGS flags,
    LPCWSTR pszTargetPath,
    UINT cFolders,
    const KNOWNFOLDERID *pExclusion,
    LPWSTR *ppszError);
HRESULT __RPC_STUB IKnownFolderManager_Redirect_Stub(
    IKnownFolderManager* This,
    REFKNOWNFOLDERID rfid,
    HWND hwnd,
    KF_REDIRECT_FLAGS flags,
    LPCWSTR pszTargetPath,
    UINT cFolders,
    const GUID *pExclusion,
    LPWSTR *ppszError);

#endif  /* __IKnownFolderManager_INTERFACE_DEFINED__ */


  __forceinline void FreeKnownFolderDefinitionFields(KNOWNFOLDER_DEFINITION *pKFD) {
    CoTaskMemFree(pKFD->pszName);
    CoTaskMemFree(pKFD->pszDescription);
    CoTaskMemFree(pKFD->pszRelativePath);
    CoTaskMemFree(pKFD->pszParsingName);
    CoTaskMemFree(pKFD->pszTooltip);
    CoTaskMemFree(pKFD->pszLocalizedName);
    CoTaskMemFree(pKFD->pszIcon);
    CoTaskMemFree(pKFD->pszSecurity);
  }

typedef enum SHARE_ROLE {
    SHARE_ROLE_INVALID = -1,
    SHARE_ROLE_READER = 0,
    SHARE_ROLE_CONTRIBUTOR = 1,
    SHARE_ROLE_CO_OWNER = 2,
    SHARE_ROLE_OWNER = 3,
    SHARE_ROLE_CUSTOM = 4,
    SHARE_ROLE_MIXED = 5
} SHARE_ROLE;

typedef enum DEF_SHARE_ID {
    DEFSHAREID_USERS = 1,
    DEFSHAREID_PUBLIC = 2
} DEF_SHARE_ID;

/*****************************************************************************
 * ISharingConfigurationManager interface
 */
#ifndef __ISharingConfigurationManager_INTERFACE_DEFINED__
#define __ISharingConfigurationManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISharingConfigurationManager, 0xb4cd448a, 0x9c86, 0x4466, 0x92,0x01, 0x2e,0x62,0x10,0x5b,0x87,0xae);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b4cd448a-9c86-4466-9201-2e62105b87ae")
ISharingConfigurationManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateShare(
        DEF_SHARE_ID dsid,
        SHARE_ROLE role) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteShare(
        DEF_SHARE_ID dsid) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShareExists(
        DEF_SHARE_ID dsid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSharePermissions(
        DEF_SHARE_ID dsid,
        SHARE_ROLE *pRole) = 0;

    virtual HRESULT STDMETHODCALLTYPE SharePrinters(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopSharingPrinters(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ArePrintersShared(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISharingConfigurationManager, 0xb4cd448a, 0x9c86, 0x4466, 0x92,0x01, 0x2e,0x62,0x10,0x5b,0x87,0xae)
#endif
#else
typedef struct ISharingConfigurationManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISharingConfigurationManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISharingConfigurationManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISharingConfigurationManager *This);

    /*** ISharingConfigurationManager methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateShare)(
        ISharingConfigurationManager *This,
        DEF_SHARE_ID dsid,
        SHARE_ROLE role);

    HRESULT (STDMETHODCALLTYPE *DeleteShare)(
        ISharingConfigurationManager *This,
        DEF_SHARE_ID dsid);

    HRESULT (STDMETHODCALLTYPE *ShareExists)(
        ISharingConfigurationManager *This,
        DEF_SHARE_ID dsid);

    HRESULT (STDMETHODCALLTYPE *GetSharePermissions)(
        ISharingConfigurationManager *This,
        DEF_SHARE_ID dsid,
        SHARE_ROLE *pRole);

    HRESULT (STDMETHODCALLTYPE *SharePrinters)(
        ISharingConfigurationManager *This);

    HRESULT (STDMETHODCALLTYPE *StopSharingPrinters)(
        ISharingConfigurationManager *This);

    HRESULT (STDMETHODCALLTYPE *ArePrintersShared)(
        ISharingConfigurationManager *This);

    END_INTERFACE
} ISharingConfigurationManagerVtbl;

interface ISharingConfigurationManager {
    CONST_VTBL ISharingConfigurationManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISharingConfigurationManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISharingConfigurationManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISharingConfigurationManager_Release(This) (This)->lpVtbl->Release(This)
/*** ISharingConfigurationManager methods ***/
#define ISharingConfigurationManager_CreateShare(This,dsid,role) (This)->lpVtbl->CreateShare(This,dsid,role)
#define ISharingConfigurationManager_DeleteShare(This,dsid) (This)->lpVtbl->DeleteShare(This,dsid)
#define ISharingConfigurationManager_ShareExists(This,dsid) (This)->lpVtbl->ShareExists(This,dsid)
#define ISharingConfigurationManager_GetSharePermissions(This,dsid,pRole) (This)->lpVtbl->GetSharePermissions(This,dsid,pRole)
#define ISharingConfigurationManager_SharePrinters(This) (This)->lpVtbl->SharePrinters(This)
#define ISharingConfigurationManager_StopSharingPrinters(This) (This)->lpVtbl->StopSharingPrinters(This)
#define ISharingConfigurationManager_ArePrintersShared(This) (This)->lpVtbl->ArePrintersShared(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISharingConfigurationManager_QueryInterface(ISharingConfigurationManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISharingConfigurationManager_AddRef(ISharingConfigurationManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISharingConfigurationManager_Release(ISharingConfigurationManager* This) {
    return This->lpVtbl->Release(This);
}
/*** ISharingConfigurationManager methods ***/
static FORCEINLINE HRESULT ISharingConfigurationManager_CreateShare(ISharingConfigurationManager* This,DEF_SHARE_ID dsid,SHARE_ROLE role) {
    return This->lpVtbl->CreateShare(This,dsid,role);
}
static FORCEINLINE HRESULT ISharingConfigurationManager_DeleteShare(ISharingConfigurationManager* This,DEF_SHARE_ID dsid) {
    return This->lpVtbl->DeleteShare(This,dsid);
}
static FORCEINLINE HRESULT ISharingConfigurationManager_ShareExists(ISharingConfigurationManager* This,DEF_SHARE_ID dsid) {
    return This->lpVtbl->ShareExists(This,dsid);
}
static FORCEINLINE HRESULT ISharingConfigurationManager_GetSharePermissions(ISharingConfigurationManager* This,DEF_SHARE_ID dsid,SHARE_ROLE *pRole) {
    return This->lpVtbl->GetSharePermissions(This,dsid,pRole);
}
static FORCEINLINE HRESULT ISharingConfigurationManager_SharePrinters(ISharingConfigurationManager* This) {
    return This->lpVtbl->SharePrinters(This);
}
static FORCEINLINE HRESULT ISharingConfigurationManager_StopSharingPrinters(ISharingConfigurationManager* This) {
    return This->lpVtbl->StopSharingPrinters(This);
}
static FORCEINLINE HRESULT ISharingConfigurationManager_ArePrintersShared(ISharingConfigurationManager* This) {
    return This->lpVtbl->ArePrintersShared(This);
}
#endif
#endif

#endif


#endif  /* __ISharingConfigurationManager_INTERFACE_DEFINED__ */

#endif

/*****************************************************************************
 * IPreviousVersionsInfo interface
 */
#ifndef __IPreviousVersionsInfo_INTERFACE_DEFINED__
#define __IPreviousVersionsInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPreviousVersionsInfo, 0x76e54780, 0xad74, 0x48e3, 0xa6,0x95, 0x3b,0xa9,0xa0,0xaf,0xf1,0x0d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("76e54780-ad74-48e3-a695-3ba9a0aff10d")
IPreviousVersionsInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AreSnapshotsAvailable(
        LPCWSTR pszPath,
        WINBOOL fOkToBeSlow,
        WINBOOL *pfAvailable) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPreviousVersionsInfo, 0x76e54780, 0xad74, 0x48e3, 0xa6,0x95, 0x3b,0xa9,0xa0,0xaf,0xf1,0x0d)
#endif
#else
typedef struct IPreviousVersionsInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPreviousVersionsInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPreviousVersionsInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPreviousVersionsInfo *This);

    /*** IPreviousVersionsInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *AreSnapshotsAvailable)(
        IPreviousVersionsInfo *This,
        LPCWSTR pszPath,
        WINBOOL fOkToBeSlow,
        WINBOOL *pfAvailable);

    END_INTERFACE
} IPreviousVersionsInfoVtbl;

interface IPreviousVersionsInfo {
    CONST_VTBL IPreviousVersionsInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPreviousVersionsInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPreviousVersionsInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPreviousVersionsInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IPreviousVersionsInfo methods ***/
#define IPreviousVersionsInfo_AreSnapshotsAvailable(This,pszPath,fOkToBeSlow,pfAvailable) (This)->lpVtbl->AreSnapshotsAvailable(This,pszPath,fOkToBeSlow,pfAvailable)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPreviousVersionsInfo_QueryInterface(IPreviousVersionsInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPreviousVersionsInfo_AddRef(IPreviousVersionsInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPreviousVersionsInfo_Release(IPreviousVersionsInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IPreviousVersionsInfo methods ***/
static FORCEINLINE HRESULT IPreviousVersionsInfo_AreSnapshotsAvailable(IPreviousVersionsInfo* This,LPCWSTR pszPath,WINBOOL fOkToBeSlow,WINBOOL *pfAvailable) {
    return This->lpVtbl->AreSnapshotsAvailable(This,pszPath,fOkToBeSlow,pfAvailable);
}
#endif
#endif

#endif


#endif  /* __IPreviousVersionsInfo_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_VISTA
/*****************************************************************************
 * IRelatedItem interface
 */
#ifndef __IRelatedItem_INTERFACE_DEFINED__
#define __IRelatedItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRelatedItem, 0xa73ce67a, 0x8ab1, 0x44f1, 0x8d,0x43, 0xd2,0xfc,0xbf,0x6b,0x1c,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a73ce67a-8ab1-44f1-8d43-d2fcbf6b1cd0")
IRelatedItem : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetItemIDList(
        PIDLIST_ABSOLUTE *ppidl) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItem(
        IShellItem **ppsi) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRelatedItem, 0xa73ce67a, 0x8ab1, 0x44f1, 0x8d,0x43, 0xd2,0xfc,0xbf,0x6b,0x1c,0xd0)
#endif
#else
typedef struct IRelatedItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRelatedItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRelatedItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRelatedItem *This);

    /*** IRelatedItem methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItemIDList)(
        IRelatedItem *This,
        PIDLIST_ABSOLUTE *ppidl);

    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IRelatedItem *This,
        IShellItem **ppsi);

    END_INTERFACE
} IRelatedItemVtbl;

interface IRelatedItem {
    CONST_VTBL IRelatedItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRelatedItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRelatedItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRelatedItem_Release(This) (This)->lpVtbl->Release(This)
/*** IRelatedItem methods ***/
#define IRelatedItem_GetItemIDList(This,ppidl) (This)->lpVtbl->GetItemIDList(This,ppidl)
#define IRelatedItem_GetItem(This,ppsi) (This)->lpVtbl->GetItem(This,ppsi)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRelatedItem_QueryInterface(IRelatedItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRelatedItem_AddRef(IRelatedItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRelatedItem_Release(IRelatedItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static FORCEINLINE HRESULT IRelatedItem_GetItemIDList(IRelatedItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static FORCEINLINE HRESULT IRelatedItem_GetItem(IRelatedItem* This,IShellItem **ppsi) {
    return This->lpVtbl->GetItem(This,ppsi);
}
#endif
#endif

#endif


#endif  /* __IRelatedItem_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IIdentityName interface
 */
#ifndef __IIdentityName_INTERFACE_DEFINED__
#define __IIdentityName_INTERFACE_DEFINED__

DEFINE_GUID(IID_IIdentityName, 0x7d903fca, 0xd6f9, 0x4810, 0x83,0x32, 0x94,0x6c,0x01,0x77,0xe2,0x47);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7d903fca-d6f9-4810-8332-946c0177e247")
IIdentityName : public IRelatedItem
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IIdentityName, 0x7d903fca, 0xd6f9, 0x4810, 0x83,0x32, 0x94,0x6c,0x01,0x77,0xe2,0x47)
#endif
#else
typedef struct IIdentityNameVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IIdentityName *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IIdentityName *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IIdentityName *This);

    /*** IRelatedItem methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItemIDList)(
        IIdentityName *This,
        PIDLIST_ABSOLUTE *ppidl);

    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IIdentityName *This,
        IShellItem **ppsi);

    END_INTERFACE
} IIdentityNameVtbl;

interface IIdentityName {
    CONST_VTBL IIdentityNameVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IIdentityName_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IIdentityName_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IIdentityName_Release(This) (This)->lpVtbl->Release(This)
/*** IRelatedItem methods ***/
#define IIdentityName_GetItemIDList(This,ppidl) (This)->lpVtbl->GetItemIDList(This,ppidl)
#define IIdentityName_GetItem(This,ppsi) (This)->lpVtbl->GetItem(This,ppsi)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IIdentityName_QueryInterface(IIdentityName* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IIdentityName_AddRef(IIdentityName* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IIdentityName_Release(IIdentityName* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static FORCEINLINE HRESULT IIdentityName_GetItemIDList(IIdentityName* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static FORCEINLINE HRESULT IIdentityName_GetItem(IIdentityName* This,IShellItem **ppsi) {
    return This->lpVtbl->GetItem(This,ppsi);
}
#endif
#endif

#endif


#endif  /* __IIdentityName_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDelegateItem interface
 */
#ifndef __IDelegateItem_INTERFACE_DEFINED__
#define __IDelegateItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDelegateItem, 0x3c5a1c94, 0xc951, 0x4cb7, 0xbb,0x6d, 0x3b,0x93,0xf3,0x0c,0xce,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3c5a1c94-c951-4cb7-bb6d-3b93f30cce93")
IDelegateItem : public IRelatedItem
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDelegateItem, 0x3c5a1c94, 0xc951, 0x4cb7, 0xbb,0x6d, 0x3b,0x93,0xf3,0x0c,0xce,0x93)
#endif
#else
typedef struct IDelegateItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDelegateItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDelegateItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDelegateItem *This);

    /*** IRelatedItem methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItemIDList)(
        IDelegateItem *This,
        PIDLIST_ABSOLUTE *ppidl);

    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IDelegateItem *This,
        IShellItem **ppsi);

    END_INTERFACE
} IDelegateItemVtbl;

interface IDelegateItem {
    CONST_VTBL IDelegateItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDelegateItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDelegateItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDelegateItem_Release(This) (This)->lpVtbl->Release(This)
/*** IRelatedItem methods ***/
#define IDelegateItem_GetItemIDList(This,ppidl) (This)->lpVtbl->GetItemIDList(This,ppidl)
#define IDelegateItem_GetItem(This,ppsi) (This)->lpVtbl->GetItem(This,ppsi)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDelegateItem_QueryInterface(IDelegateItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDelegateItem_AddRef(IDelegateItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDelegateItem_Release(IDelegateItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static FORCEINLINE HRESULT IDelegateItem_GetItemIDList(IDelegateItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static FORCEINLINE HRESULT IDelegateItem_GetItem(IDelegateItem* This,IShellItem **ppsi) {
    return This->lpVtbl->GetItem(This,ppsi);
}
#endif
#endif

#endif


#endif  /* __IDelegateItem_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ICurrentItem interface
 */
#ifndef __ICurrentItem_INTERFACE_DEFINED__
#define __ICurrentItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICurrentItem, 0x240a7174, 0xd653, 0x4a1d, 0xa6,0xd3, 0xd4,0x94,0x3c,0xfb,0xfe,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("240a7174-d653-4a1d-a6d3-d4943cfbfe3d")
ICurrentItem : public IRelatedItem
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICurrentItem, 0x240a7174, 0xd653, 0x4a1d, 0xa6,0xd3, 0xd4,0x94,0x3c,0xfb,0xfe,0x3d)
#endif
#else
typedef struct ICurrentItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICurrentItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICurrentItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICurrentItem *This);

    /*** IRelatedItem methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItemIDList)(
        ICurrentItem *This,
        PIDLIST_ABSOLUTE *ppidl);

    HRESULT (STDMETHODCALLTYPE *GetItem)(
        ICurrentItem *This,
        IShellItem **ppsi);

    END_INTERFACE
} ICurrentItemVtbl;

interface ICurrentItem {
    CONST_VTBL ICurrentItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICurrentItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICurrentItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICurrentItem_Release(This) (This)->lpVtbl->Release(This)
/*** IRelatedItem methods ***/
#define ICurrentItem_GetItemIDList(This,ppidl) (This)->lpVtbl->GetItemIDList(This,ppidl)
#define ICurrentItem_GetItem(This,ppsi) (This)->lpVtbl->GetItem(This,ppsi)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICurrentItem_QueryInterface(ICurrentItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICurrentItem_AddRef(ICurrentItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICurrentItem_Release(ICurrentItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static FORCEINLINE HRESULT ICurrentItem_GetItemIDList(ICurrentItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static FORCEINLINE HRESULT ICurrentItem_GetItem(ICurrentItem* This,IShellItem **ppsi) {
    return This->lpVtbl->GetItem(This,ppsi);
}
#endif
#endif

#endif


#endif  /* __ICurrentItem_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ITransferMediumItem interface
 */
#ifndef __ITransferMediumItem_INTERFACE_DEFINED__
#define __ITransferMediumItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITransferMediumItem, 0x77f295d5, 0x2d6f, 0x4e19, 0xb8,0xae, 0x32,0x2f,0x3e,0x72,0x1a,0xb5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("77f295d5-2d6f-4e19-b8ae-322f3e721ab5")
ITransferMediumItem : public IRelatedItem
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITransferMediumItem, 0x77f295d5, 0x2d6f, 0x4e19, 0xb8,0xae, 0x32,0x2f,0x3e,0x72,0x1a,0xb5)
#endif
#else
typedef struct ITransferMediumItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITransferMediumItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITransferMediumItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITransferMediumItem *This);

    /*** IRelatedItem methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItemIDList)(
        ITransferMediumItem *This,
        PIDLIST_ABSOLUTE *ppidl);

    HRESULT (STDMETHODCALLTYPE *GetItem)(
        ITransferMediumItem *This,
        IShellItem **ppsi);

    END_INTERFACE
} ITransferMediumItemVtbl;

interface ITransferMediumItem {
    CONST_VTBL ITransferMediumItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITransferMediumItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITransferMediumItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITransferMediumItem_Release(This) (This)->lpVtbl->Release(This)
/*** IRelatedItem methods ***/
#define ITransferMediumItem_GetItemIDList(This,ppidl) (This)->lpVtbl->GetItemIDList(This,ppidl)
#define ITransferMediumItem_GetItem(This,ppsi) (This)->lpVtbl->GetItem(This,ppsi)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITransferMediumItem_QueryInterface(ITransferMediumItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITransferMediumItem_AddRef(ITransferMediumItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITransferMediumItem_Release(ITransferMediumItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static FORCEINLINE HRESULT ITransferMediumItem_GetItemIDList(ITransferMediumItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static FORCEINLINE HRESULT ITransferMediumItem_GetItem(ITransferMediumItem* This,IShellItem **ppsi) {
    return This->lpVtbl->GetItem(This,ppsi);
}
#endif
#endif

#endif


#endif  /* __ITransferMediumItem_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IUseToBrowseItem interface
 */
#ifndef __IUseToBrowseItem_INTERFACE_DEFINED__
#define __IUseToBrowseItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUseToBrowseItem, 0x05edda5c, 0x98a3, 0x4717, 0x8a,0xdb, 0xc5,0xe7,0xda,0x99,0x1e,0xb1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("05edda5c-98a3-4717-8adb-c5e7da991eb1")
IUseToBrowseItem : public IRelatedItem
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUseToBrowseItem, 0x05edda5c, 0x98a3, 0x4717, 0x8a,0xdb, 0xc5,0xe7,0xda,0x99,0x1e,0xb1)
#endif
#else
typedef struct IUseToBrowseItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUseToBrowseItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUseToBrowseItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUseToBrowseItem *This);

    /*** IRelatedItem methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItemIDList)(
        IUseToBrowseItem *This,
        PIDLIST_ABSOLUTE *ppidl);

    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IUseToBrowseItem *This,
        IShellItem **ppsi);

    END_INTERFACE
} IUseToBrowseItemVtbl;

interface IUseToBrowseItem {
    CONST_VTBL IUseToBrowseItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUseToBrowseItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUseToBrowseItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUseToBrowseItem_Release(This) (This)->lpVtbl->Release(This)
/*** IRelatedItem methods ***/
#define IUseToBrowseItem_GetItemIDList(This,ppidl) (This)->lpVtbl->GetItemIDList(This,ppidl)
#define IUseToBrowseItem_GetItem(This,ppsi) (This)->lpVtbl->GetItem(This,ppsi)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUseToBrowseItem_QueryInterface(IUseToBrowseItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUseToBrowseItem_AddRef(IUseToBrowseItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUseToBrowseItem_Release(IUseToBrowseItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static FORCEINLINE HRESULT IUseToBrowseItem_GetItemIDList(IUseToBrowseItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static FORCEINLINE HRESULT IUseToBrowseItem_GetItem(IUseToBrowseItem* This,IShellItem **ppsi) {
    return This->lpVtbl->GetItem(This,ppsi);
}
#endif
#endif

#endif


#endif  /* __IUseToBrowseItem_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDisplayItem interface
 */
#ifndef __IDisplayItem_INTERFACE_DEFINED__
#define __IDisplayItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDisplayItem, 0xc6fd5997, 0x9f6b, 0x4888, 0x87,0x03, 0x94,0xe8,0x0e,0x8c,0xde,0x3f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c6fd5997-9f6b-4888-8703-94e80e8cde3f")
IDisplayItem : public IRelatedItem
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDisplayItem, 0xc6fd5997, 0x9f6b, 0x4888, 0x87,0x03, 0x94,0xe8,0x0e,0x8c,0xde,0x3f)
#endif
#else
typedef struct IDisplayItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDisplayItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDisplayItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDisplayItem *This);

    /*** IRelatedItem methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItemIDList)(
        IDisplayItem *This,
        PIDLIST_ABSOLUTE *ppidl);

    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IDisplayItem *This,
        IShellItem **ppsi);

    END_INTERFACE
} IDisplayItemVtbl;

interface IDisplayItem {
    CONST_VTBL IDisplayItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDisplayItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDisplayItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDisplayItem_Release(This) (This)->lpVtbl->Release(This)
/*** IRelatedItem methods ***/
#define IDisplayItem_GetItemIDList(This,ppidl) (This)->lpVtbl->GetItemIDList(This,ppidl)
#define IDisplayItem_GetItem(This,ppsi) (This)->lpVtbl->GetItem(This,ppsi)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDisplayItem_QueryInterface(IDisplayItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDisplayItem_AddRef(IDisplayItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDisplayItem_Release(IDisplayItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static FORCEINLINE HRESULT IDisplayItem_GetItemIDList(IDisplayItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static FORCEINLINE HRESULT IDisplayItem_GetItem(IDisplayItem* This,IShellItem **ppsi) {
    return This->lpVtbl->GetItem(This,ppsi);
}
#endif
#endif

#endif


#endif  /* __IDisplayItem_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IViewStateIdentityItem interface
 */
#ifndef __IViewStateIdentityItem_INTERFACE_DEFINED__
#define __IViewStateIdentityItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IViewStateIdentityItem, 0x9d264146, 0xa94f, 0x4195, 0x9f,0x9f, 0x3b,0xb1,0x2c,0xe0,0xc9,0x55);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9d264146-a94f-4195-9f9f-3bb12ce0c955")
IViewStateIdentityItem : public IRelatedItem
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IViewStateIdentityItem, 0x9d264146, 0xa94f, 0x4195, 0x9f,0x9f, 0x3b,0xb1,0x2c,0xe0,0xc9,0x55)
#endif
#else
typedef struct IViewStateIdentityItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IViewStateIdentityItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IViewStateIdentityItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IViewStateIdentityItem *This);

    /*** IRelatedItem methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItemIDList)(
        IViewStateIdentityItem *This,
        PIDLIST_ABSOLUTE *ppidl);

    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IViewStateIdentityItem *This,
        IShellItem **ppsi);

    END_INTERFACE
} IViewStateIdentityItemVtbl;

interface IViewStateIdentityItem {
    CONST_VTBL IViewStateIdentityItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IViewStateIdentityItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IViewStateIdentityItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IViewStateIdentityItem_Release(This) (This)->lpVtbl->Release(This)
/*** IRelatedItem methods ***/
#define IViewStateIdentityItem_GetItemIDList(This,ppidl) (This)->lpVtbl->GetItemIDList(This,ppidl)
#define IViewStateIdentityItem_GetItem(This,ppsi) (This)->lpVtbl->GetItem(This,ppsi)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IViewStateIdentityItem_QueryInterface(IViewStateIdentityItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IViewStateIdentityItem_AddRef(IViewStateIdentityItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IViewStateIdentityItem_Release(IViewStateIdentityItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static FORCEINLINE HRESULT IViewStateIdentityItem_GetItemIDList(IViewStateIdentityItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static FORCEINLINE HRESULT IViewStateIdentityItem_GetItem(IViewStateIdentityItem* This,IShellItem **ppsi) {
    return This->lpVtbl->GetItem(This,ppsi);
}
#endif
#endif

#endif


#endif  /* __IViewStateIdentityItem_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IPreviewItem interface
 */
#ifndef __IPreviewItem_INTERFACE_DEFINED__
#define __IPreviewItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPreviewItem, 0x36149969, 0x0a8f, 0x49c8, 0x8b,0x00, 0x4a,0xec,0xb2,0x02,0x22,0xfb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("36149969-0a8f-49c8-8b00-4aecb20222fb")
IPreviewItem : public IRelatedItem
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPreviewItem, 0x36149969, 0x0a8f, 0x49c8, 0x8b,0x00, 0x4a,0xec,0xb2,0x02,0x22,0xfb)
#endif
#else
typedef struct IPreviewItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPreviewItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPreviewItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPreviewItem *This);

    /*** IRelatedItem methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItemIDList)(
        IPreviewItem *This,
        PIDLIST_ABSOLUTE *ppidl);

    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IPreviewItem *This,
        IShellItem **ppsi);

    END_INTERFACE
} IPreviewItemVtbl;

interface IPreviewItem {
    CONST_VTBL IPreviewItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPreviewItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPreviewItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPreviewItem_Release(This) (This)->lpVtbl->Release(This)
/*** IRelatedItem methods ***/
#define IPreviewItem_GetItemIDList(This,ppidl) (This)->lpVtbl->GetItemIDList(This,ppidl)
#define IPreviewItem_GetItem(This,ppsi) (This)->lpVtbl->GetItem(This,ppsi)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPreviewItem_QueryInterface(IPreviewItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPreviewItem_AddRef(IPreviewItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPreviewItem_Release(IPreviewItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static FORCEINLINE HRESULT IPreviewItem_GetItemIDList(IPreviewItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static FORCEINLINE HRESULT IPreviewItem_GetItem(IPreviewItem* This,IShellItem **ppsi) {
    return This->lpVtbl->GetItem(This,ppsi);
}
#endif
#endif

#endif


#endif  /* __IPreviewItem_INTERFACE_DEFINED__ */

#endif

/*****************************************************************************
 * IDestinationStreamFactory interface
 */
#ifndef __IDestinationStreamFactory_INTERFACE_DEFINED__
#define __IDestinationStreamFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDestinationStreamFactory, 0x8a87781b, 0x39a7, 0x4a1f, 0xaa,0xb3, 0xa3,0x9b,0x9c,0x34,0xa7,0xd9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8a87781b-39a7-4a1f-aab3-a39b9c34a7d9")
IDestinationStreamFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDestinationStream(
        IStream **ppstm) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDestinationStreamFactory, 0x8a87781b, 0x39a7, 0x4a1f, 0xaa,0xb3, 0xa3,0x9b,0x9c,0x34,0xa7,0xd9)
#endif
#else
typedef struct IDestinationStreamFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDestinationStreamFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDestinationStreamFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDestinationStreamFactory *This);

    /*** IDestinationStreamFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDestinationStream)(
        IDestinationStreamFactory *This,
        IStream **ppstm);

    END_INTERFACE
} IDestinationStreamFactoryVtbl;

interface IDestinationStreamFactory {
    CONST_VTBL IDestinationStreamFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDestinationStreamFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDestinationStreamFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDestinationStreamFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IDestinationStreamFactory methods ***/
#define IDestinationStreamFactory_GetDestinationStream(This,ppstm) (This)->lpVtbl->GetDestinationStream(This,ppstm)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDestinationStreamFactory_QueryInterface(IDestinationStreamFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDestinationStreamFactory_AddRef(IDestinationStreamFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDestinationStreamFactory_Release(IDestinationStreamFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDestinationStreamFactory methods ***/
static FORCEINLINE HRESULT IDestinationStreamFactory_GetDestinationStream(IDestinationStreamFactory* This,IStream **ppstm) {
    return This->lpVtbl->GetDestinationStream(This,ppstm);
}
#endif
#endif

#endif


#endif  /* __IDestinationStreamFactory_INTERFACE_DEFINED__ */


enum _NMCII_FLAGS {
    NMCII_NONE = 0x0,
    NMCII_ITEMS = 0x1,
    NMCII_FOLDERS = 0x2
};

typedef int NMCII_FLAGS;

enum _NMCSAEI_FLAGS {
    NMCSAEI_SELECT = 0x0,
    NMCSAEI_EDIT = 0x1
};

typedef int NMCSAEI_FLAGS;

/*****************************************************************************
 * INewMenuClient interface
 */
#ifndef __INewMenuClient_INTERFACE_DEFINED__
#define __INewMenuClient_INTERFACE_DEFINED__

DEFINE_GUID(IID_INewMenuClient, 0xdcb07fdc, 0x3bb5, 0x451c, 0x90,0xbe, 0x96,0x66,0x44,0xfe,0xd7,0xb0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dcb07fdc-3bb5-451c-90be-966644fed7b0")
INewMenuClient : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE IncludeItems(
        NMCII_FLAGS *pflags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectAndEditItem(
        PCIDLIST_ABSOLUTE pidlItem,
        NMCSAEI_FLAGS flags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INewMenuClient, 0xdcb07fdc, 0x3bb5, 0x451c, 0x90,0xbe, 0x96,0x66,0x44,0xfe,0xd7,0xb0)
#endif
#else
typedef struct INewMenuClientVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INewMenuClient *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INewMenuClient *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INewMenuClient *This);

    /*** INewMenuClient methods ***/
    HRESULT (STDMETHODCALLTYPE *IncludeItems)(
        INewMenuClient *This,
        NMCII_FLAGS *pflags);

    HRESULT (STDMETHODCALLTYPE *SelectAndEditItem)(
        INewMenuClient *This,
        PCIDLIST_ABSOLUTE pidlItem,
        NMCSAEI_FLAGS flags);

    END_INTERFACE
} INewMenuClientVtbl;

interface INewMenuClient {
    CONST_VTBL INewMenuClientVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INewMenuClient_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INewMenuClient_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INewMenuClient_Release(This) (This)->lpVtbl->Release(This)
/*** INewMenuClient methods ***/
#define INewMenuClient_IncludeItems(This,pflags) (This)->lpVtbl->IncludeItems(This,pflags)
#define INewMenuClient_SelectAndEditItem(This,pidlItem,flags) (This)->lpVtbl->SelectAndEditItem(This,pidlItem,flags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INewMenuClient_QueryInterface(INewMenuClient* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INewMenuClient_AddRef(INewMenuClient* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INewMenuClient_Release(INewMenuClient* This) {
    return This->lpVtbl->Release(This);
}
/*** INewMenuClient methods ***/
static FORCEINLINE HRESULT INewMenuClient_IncludeItems(INewMenuClient* This,NMCII_FLAGS *pflags) {
    return This->lpVtbl->IncludeItems(This,pflags);
}
static FORCEINLINE HRESULT INewMenuClient_SelectAndEditItem(INewMenuClient* This,PCIDLIST_ABSOLUTE pidlItem,NMCSAEI_FLAGS flags) {
    return This->lpVtbl->SelectAndEditItem(This,pidlItem,flags);
}
#endif
#endif

#endif


#endif  /* __INewMenuClient_INTERFACE_DEFINED__ */


#define SID_SNewMenuClient   IID_INewMenuClient

DEFINE_GUID(SID_SCommandBarState, 0xB99EAA5C, 0x3850, 0x4400, 0xBC, 0x33, 0x2C, 0xE5, 0x34, 0x04, 0x8B, 0xF8);

#if _WIN32_IE >= _WIN32_IE_IE70
/*****************************************************************************
 * IInitializeWithBindCtx interface
 */
#ifndef __IInitializeWithBindCtx_INTERFACE_DEFINED__
#define __IInitializeWithBindCtx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInitializeWithBindCtx, 0x71c0d2bc, 0x726d, 0x45cc, 0xa6,0xc0, 0x2e,0x31,0xc1,0xdb,0x21,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("71c0d2bc-726d-45cc-a6c0-2e31c1db2159")
IInitializeWithBindCtx : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IBindCtx *pbc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInitializeWithBindCtx, 0x71c0d2bc, 0x726d, 0x45cc, 0xa6,0xc0, 0x2e,0x31,0xc1,0xdb,0x21,0x59)
#endif
#else
typedef struct IInitializeWithBindCtxVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInitializeWithBindCtx *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInitializeWithBindCtx *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInitializeWithBindCtx *This);

    /*** IInitializeWithBindCtx methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IInitializeWithBindCtx *This,
        IBindCtx *pbc);

    END_INTERFACE
} IInitializeWithBindCtxVtbl;

interface IInitializeWithBindCtx {
    CONST_VTBL IInitializeWithBindCtxVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInitializeWithBindCtx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInitializeWithBindCtx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInitializeWithBindCtx_Release(This) (This)->lpVtbl->Release(This)
/*** IInitializeWithBindCtx methods ***/
#define IInitializeWithBindCtx_Initialize(This,pbc) (This)->lpVtbl->Initialize(This,pbc)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInitializeWithBindCtx_QueryInterface(IInitializeWithBindCtx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInitializeWithBindCtx_AddRef(IInitializeWithBindCtx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInitializeWithBindCtx_Release(IInitializeWithBindCtx* This) {
    return This->lpVtbl->Release(This);
}
/*** IInitializeWithBindCtx methods ***/
static FORCEINLINE HRESULT IInitializeWithBindCtx_Initialize(IInitializeWithBindCtx* This,IBindCtx *pbc) {
    return This->lpVtbl->Initialize(This,pbc);
}
#endif
#endif

#endif


#endif  /* __IInitializeWithBindCtx_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IShellItemFilter interface
 */
#ifndef __IShellItemFilter_INTERFACE_DEFINED__
#define __IShellItemFilter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IShellItemFilter, 0x2659b475, 0xeeb8, 0x48b7, 0x8f,0x07, 0xb3,0x78,0x81,0x0f,0x48,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2659b475-eeb8-48b7-8f07-b378810f48cf")
IShellItemFilter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE IncludeItem(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnumFlagsForItem(
        IShellItem *psi,
        SHCONTF *pgrfFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellItemFilter, 0x2659b475, 0xeeb8, 0x48b7, 0x8f,0x07, 0xb3,0x78,0x81,0x0f,0x48,0xcf)
#endif
#else
typedef struct IShellItemFilterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellItemFilter *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellItemFilter *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellItemFilter *This);

    /*** IShellItemFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *IncludeItem)(
        IShellItemFilter *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *GetEnumFlagsForItem)(
        IShellItemFilter *This,
        IShellItem *psi,
        SHCONTF *pgrfFlags);

    END_INTERFACE
} IShellItemFilterVtbl;

interface IShellItemFilter {
    CONST_VTBL IShellItemFilterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellItemFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellItemFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellItemFilter_Release(This) (This)->lpVtbl->Release(This)
/*** IShellItemFilter methods ***/
#define IShellItemFilter_IncludeItem(This,psi) (This)->lpVtbl->IncludeItem(This,psi)
#define IShellItemFilter_GetEnumFlagsForItem(This,psi,pgrfFlags) (This)->lpVtbl->GetEnumFlagsForItem(This,psi,pgrfFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellItemFilter_QueryInterface(IShellItemFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellItemFilter_AddRef(IShellItemFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellItemFilter_Release(IShellItemFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellItemFilter methods ***/
static FORCEINLINE HRESULT IShellItemFilter_IncludeItem(IShellItemFilter* This,IShellItem *psi) {
    return This->lpVtbl->IncludeItem(This,psi);
}
static FORCEINLINE HRESULT IShellItemFilter_GetEnumFlagsForItem(IShellItemFilter* This,IShellItem *psi,SHCONTF *pgrfFlags) {
    return This->lpVtbl->GetEnumFlagsForItem(This,psi,pgrfFlags);
}
#endif
#endif

#endif


#endif  /* __IShellItemFilter_INTERFACE_DEFINED__ */

#endif

/*****************************************************************************
 * INameSpaceTreeControl interface
 */
#ifndef __INameSpaceTreeControl_INTERFACE_DEFINED__
#define __INameSpaceTreeControl_INTERFACE_DEFINED__

enum _NSTCSTYLE {
    NSTCS_HASEXPANDOS = 0x1,
    NSTCS_HASLINES = 0x2,
    NSTCS_SINGLECLICKEXPAND = 0x4,
    NSTCS_FULLROWSELECT = 0x8,
    NSTCS_SPRINGEXPAND = 0x10,
    NSTCS_HORIZONTALSCROLL = 0x20,
    NSTCS_ROOTHASEXPANDO = 0x40,
    NSTCS_SHOWSELECTIONALWAYS = 0x80,
    NSTCS_NOINFOTIP = 0x200,
    NSTCS_EVENHEIGHT = 0x400,
    NSTCS_NOREPLACEOPEN = 0x800,
    NSTCS_DISABLEDRAGDROP = 0x1000,
    NSTCS_NOORDERSTREAM = 0x2000,
    NSTCS_RICHTOOLTIP = 0x4000,
    NSTCS_BORDER = 0x8000,
    NSTCS_NOEDITLABELS = 0x10000,
    NSTCS_TABSTOP = 0x20000,
    NSTCS_FAVORITESMODE = 0x80000,
    NSTCS_AUTOHSCROLL = 0x100000,
    NSTCS_FADEINOUTEXPANDOS = 0x200000,
    NSTCS_EMPTYTEXT = 0x400000,
    NSTCS_CHECKBOXES = 0x800000,
    NSTCS_PARTIALCHECKBOXES = 0x1000000,
    NSTCS_EXCLUSIONCHECKBOXES = 0x2000000,
    NSTCS_DIMMEDCHECKBOXES = 0x4000000,
    NSTCS_NOINDENTCHECKS = 0x8000000,
    NSTCS_ALLOWJUNCTIONS = 0x10000000,
    NSTCS_SHOWTABSBUTTON = 0x20000000,
    NSTCS_SHOWDELETEBUTTON = 0x40000000,
    NSTCS_SHOWREFRESHBUTTON = (int)0x80000000
};

typedef DWORD NSTCSTYLE;

enum _NSTCROOTSTYLE {
    NSTCRS_VISIBLE = 0x0,
    NSTCRS_HIDDEN = 0x1,
    NSTCRS_EXPANDED = 0x2
};

typedef DWORD NSTCROOTSTYLE;

enum _NSTCITEMSTATE {
    NSTCIS_NONE = 0x0,
    NSTCIS_SELECTED = 0x1,
    NSTCIS_EXPANDED = 0x2,
    NSTCIS_BOLD = 0x4,
    NSTCIS_DISABLED = 0x8,
    NSTCIS_SELECTEDNOEXPAND = 0x10
};

typedef DWORD NSTCITEMSTATE;

typedef enum NSTCGNI {
    NSTCGNI_NEXT = 0,
    NSTCGNI_NEXTVISIBLE = 1,
    NSTCGNI_PREV = 2,
    NSTCGNI_PREVVISIBLE = 3,
    NSTCGNI_PARENT = 4,
    NSTCGNI_CHILD = 5,
    NSTCGNI_FIRSTVISIBLE = 6,
    NSTCGNI_LASTVISIBLE = 7
} NSTCGNI;

DEFINE_GUID(IID_INameSpaceTreeControl, 0x028212a3, 0xb627, 0x47e9, 0x88,0x56, 0xc1,0x42,0x65,0x55,0x4e,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("028212a3-b627-47e9-8856-c14265554e4f")
INameSpaceTreeControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        HWND hwndParent,
        RECT *prc,
        NSTCSTYLE nsctsFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE TreeAdvise(
        IUnknown *punk,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE TreeUnadvise(
        DWORD dwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE AppendRoot(
        IShellItem *psiRoot,
        SHCONTF grfEnumFlags,
        NSTCROOTSTYLE grfRootStyle,
        IShellItemFilter *pif) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertRoot(
        int iIndex,
        IShellItem *psiRoot,
        SHCONTF grfEnumFlags,
        NSTCROOTSTYLE grfRootStyle,
        IShellItemFilter *pif) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveRoot(
        IShellItem *psiRoot) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAllRoots(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRootItems(
        IShellItemArray **ppsiaRootItems) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetItemState(
        IShellItem *psi,
        NSTCITEMSTATE nstcisMask,
        NSTCITEMSTATE nstcisFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItemState(
        IShellItem *psi,
        NSTCITEMSTATE nstcisMask,
        NSTCITEMSTATE *pnstcisFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelectedItems(
        IShellItemArray **psiaItems) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItemCustomState(
        IShellItem *psi,
        int *piStateNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetItemCustomState(
        IShellItem *psi,
        int iStateNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnsureItemVisible(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTheme(
        LPCWSTR pszTheme) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNextItem(
        IShellItem *psi,
        NSTCGNI nstcgi,
        IShellItem **ppsiNext) = 0;

    virtual HRESULT STDMETHODCALLTYPE HitTest(
        POINT *ppt,
        IShellItem **ppsiOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItemRect(
        IShellItem *psi,
        RECT *prect) = 0;

    virtual HRESULT STDMETHODCALLTYPE CollapseAll(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INameSpaceTreeControl, 0x028212a3, 0xb627, 0x47e9, 0x88,0x56, 0xc1,0x42,0x65,0x55,0x4e,0x4f)
#endif
#else
typedef struct INameSpaceTreeControlVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INameSpaceTreeControl *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INameSpaceTreeControl *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INameSpaceTreeControl *This);

    /*** INameSpaceTreeControl methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        INameSpaceTreeControl *This,
        HWND hwndParent,
        RECT *prc,
        NSTCSTYLE nsctsFlags);

    HRESULT (STDMETHODCALLTYPE *TreeAdvise)(
        INameSpaceTreeControl *This,
        IUnknown *punk,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *TreeUnadvise)(
        INameSpaceTreeControl *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *AppendRoot)(
        INameSpaceTreeControl *This,
        IShellItem *psiRoot,
        SHCONTF grfEnumFlags,
        NSTCROOTSTYLE grfRootStyle,
        IShellItemFilter *pif);

    HRESULT (STDMETHODCALLTYPE *InsertRoot)(
        INameSpaceTreeControl *This,
        int iIndex,
        IShellItem *psiRoot,
        SHCONTF grfEnumFlags,
        NSTCROOTSTYLE grfRootStyle,
        IShellItemFilter *pif);

    HRESULT (STDMETHODCALLTYPE *RemoveRoot)(
        INameSpaceTreeControl *This,
        IShellItem *psiRoot);

    HRESULT (STDMETHODCALLTYPE *RemoveAllRoots)(
        INameSpaceTreeControl *This);

    HRESULT (STDMETHODCALLTYPE *GetRootItems)(
        INameSpaceTreeControl *This,
        IShellItemArray **ppsiaRootItems);

    HRESULT (STDMETHODCALLTYPE *SetItemState)(
        INameSpaceTreeControl *This,
        IShellItem *psi,
        NSTCITEMSTATE nstcisMask,
        NSTCITEMSTATE nstcisFlags);

    HRESULT (STDMETHODCALLTYPE *GetItemState)(
        INameSpaceTreeControl *This,
        IShellItem *psi,
        NSTCITEMSTATE nstcisMask,
        NSTCITEMSTATE *pnstcisFlags);

    HRESULT (STDMETHODCALLTYPE *GetSelectedItems)(
        INameSpaceTreeControl *This,
        IShellItemArray **psiaItems);

    HRESULT (STDMETHODCALLTYPE *GetItemCustomState)(
        INameSpaceTreeControl *This,
        IShellItem *psi,
        int *piStateNumber);

    HRESULT (STDMETHODCALLTYPE *SetItemCustomState)(
        INameSpaceTreeControl *This,
        IShellItem *psi,
        int iStateNumber);

    HRESULT (STDMETHODCALLTYPE *EnsureItemVisible)(
        INameSpaceTreeControl *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *SetTheme)(
        INameSpaceTreeControl *This,
        LPCWSTR pszTheme);

    HRESULT (STDMETHODCALLTYPE *GetNextItem)(
        INameSpaceTreeControl *This,
        IShellItem *psi,
        NSTCGNI nstcgi,
        IShellItem **ppsiNext);

    HRESULT (STDMETHODCALLTYPE *HitTest)(
        INameSpaceTreeControl *This,
        POINT *ppt,
        IShellItem **ppsiOut);

    HRESULT (STDMETHODCALLTYPE *GetItemRect)(
        INameSpaceTreeControl *This,
        IShellItem *psi,
        RECT *prect);

    HRESULT (STDMETHODCALLTYPE *CollapseAll)(
        INameSpaceTreeControl *This);

    END_INTERFACE
} INameSpaceTreeControlVtbl;

interface INameSpaceTreeControl {
    CONST_VTBL INameSpaceTreeControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INameSpaceTreeControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INameSpaceTreeControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INameSpaceTreeControl_Release(This) (This)->lpVtbl->Release(This)
/*** INameSpaceTreeControl methods ***/
#define INameSpaceTreeControl_Initialize(This,hwndParent,prc,nsctsFlags) (This)->lpVtbl->Initialize(This,hwndParent,prc,nsctsFlags)
#define INameSpaceTreeControl_TreeAdvise(This,punk,pdwCookie) (This)->lpVtbl->TreeAdvise(This,punk,pdwCookie)
#define INameSpaceTreeControl_TreeUnadvise(This,dwCookie) (This)->lpVtbl->TreeUnadvise(This,dwCookie)
#define INameSpaceTreeControl_AppendRoot(This,psiRoot,grfEnumFlags,grfRootStyle,pif) (This)->lpVtbl->AppendRoot(This,psiRoot,grfEnumFlags,grfRootStyle,pif)
#define INameSpaceTreeControl_InsertRoot(This,iIndex,psiRoot,grfEnumFlags,grfRootStyle,pif) (This)->lpVtbl->InsertRoot(This,iIndex,psiRoot,grfEnumFlags,grfRootStyle,pif)
#define INameSpaceTreeControl_RemoveRoot(This,psiRoot) (This)->lpVtbl->RemoveRoot(This,psiRoot)
#define INameSpaceTreeControl_RemoveAllRoots(This) (This)->lpVtbl->RemoveAllRoots(This)
#define INameSpaceTreeControl_GetRootItems(This,ppsiaRootItems) (This)->lpVtbl->GetRootItems(This,ppsiaRootItems)
#define INameSpaceTreeControl_SetItemState(This,psi,nstcisMask,nstcisFlags) (This)->lpVtbl->SetItemState(This,psi,nstcisMask,nstcisFlags)
#define INameSpaceTreeControl_GetItemState(This,psi,nstcisMask,pnstcisFlags) (This)->lpVtbl->GetItemState(This,psi,nstcisMask,pnstcisFlags)
#define INameSpaceTreeControl_GetSelectedItems(This,psiaItems) (This)->lpVtbl->GetSelectedItems(This,psiaItems)
#define INameSpaceTreeControl_GetItemCustomState(This,psi,piStateNumber) (This)->lpVtbl->GetItemCustomState(This,psi,piStateNumber)
#define INameSpaceTreeControl_SetItemCustomState(This,psi,iStateNumber) (This)->lpVtbl->SetItemCustomState(This,psi,iStateNumber)
#define INameSpaceTreeControl_EnsureItemVisible(This,psi) (This)->lpVtbl->EnsureItemVisible(This,psi)
#define INameSpaceTreeControl_SetTheme(This,pszTheme) (This)->lpVtbl->SetTheme(This,pszTheme)
#define INameSpaceTreeControl_GetNextItem(This,psi,nstcgi,ppsiNext) (This)->lpVtbl->GetNextItem(This,psi,nstcgi,ppsiNext)
#define INameSpaceTreeControl_HitTest(This,ppt,ppsiOut) (This)->lpVtbl->HitTest(This,ppt,ppsiOut)
#define INameSpaceTreeControl_GetItemRect(This,psi,prect) (This)->lpVtbl->GetItemRect(This,psi,prect)
#define INameSpaceTreeControl_CollapseAll(This) (This)->lpVtbl->CollapseAll(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControl_QueryInterface(INameSpaceTreeControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INameSpaceTreeControl_AddRef(INameSpaceTreeControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INameSpaceTreeControl_Release(INameSpaceTreeControl* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeControl methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControl_Initialize(INameSpaceTreeControl* This,HWND hwndParent,RECT *prc,NSTCSTYLE nsctsFlags) {
    return This->lpVtbl->Initialize(This,hwndParent,prc,nsctsFlags);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_TreeAdvise(INameSpaceTreeControl* This,IUnknown *punk,DWORD *pdwCookie) {
    return This->lpVtbl->TreeAdvise(This,punk,pdwCookie);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_TreeUnadvise(INameSpaceTreeControl* This,DWORD dwCookie) {
    return This->lpVtbl->TreeUnadvise(This,dwCookie);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_AppendRoot(INameSpaceTreeControl* This,IShellItem *psiRoot,SHCONTF grfEnumFlags,NSTCROOTSTYLE grfRootStyle,IShellItemFilter *pif) {
    return This->lpVtbl->AppendRoot(This,psiRoot,grfEnumFlags,grfRootStyle,pif);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_InsertRoot(INameSpaceTreeControl* This,int iIndex,IShellItem *psiRoot,SHCONTF grfEnumFlags,NSTCROOTSTYLE grfRootStyle,IShellItemFilter *pif) {
    return This->lpVtbl->InsertRoot(This,iIndex,psiRoot,grfEnumFlags,grfRootStyle,pif);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_RemoveRoot(INameSpaceTreeControl* This,IShellItem *psiRoot) {
    return This->lpVtbl->RemoveRoot(This,psiRoot);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_RemoveAllRoots(INameSpaceTreeControl* This) {
    return This->lpVtbl->RemoveAllRoots(This);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_GetRootItems(INameSpaceTreeControl* This,IShellItemArray **ppsiaRootItems) {
    return This->lpVtbl->GetRootItems(This,ppsiaRootItems);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_SetItemState(INameSpaceTreeControl* This,IShellItem *psi,NSTCITEMSTATE nstcisMask,NSTCITEMSTATE nstcisFlags) {
    return This->lpVtbl->SetItemState(This,psi,nstcisMask,nstcisFlags);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_GetItemState(INameSpaceTreeControl* This,IShellItem *psi,NSTCITEMSTATE nstcisMask,NSTCITEMSTATE *pnstcisFlags) {
    return This->lpVtbl->GetItemState(This,psi,nstcisMask,pnstcisFlags);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_GetSelectedItems(INameSpaceTreeControl* This,IShellItemArray **psiaItems) {
    return This->lpVtbl->GetSelectedItems(This,psiaItems);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_GetItemCustomState(INameSpaceTreeControl* This,IShellItem *psi,int *piStateNumber) {
    return This->lpVtbl->GetItemCustomState(This,psi,piStateNumber);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_SetItemCustomState(INameSpaceTreeControl* This,IShellItem *psi,int iStateNumber) {
    return This->lpVtbl->SetItemCustomState(This,psi,iStateNumber);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_EnsureItemVisible(INameSpaceTreeControl* This,IShellItem *psi) {
    return This->lpVtbl->EnsureItemVisible(This,psi);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_SetTheme(INameSpaceTreeControl* This,LPCWSTR pszTheme) {
    return This->lpVtbl->SetTheme(This,pszTheme);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_GetNextItem(INameSpaceTreeControl* This,IShellItem *psi,NSTCGNI nstcgi,IShellItem **ppsiNext) {
    return This->lpVtbl->GetNextItem(This,psi,nstcgi,ppsiNext);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_HitTest(INameSpaceTreeControl* This,POINT *ppt,IShellItem **ppsiOut) {
    return This->lpVtbl->HitTest(This,ppt,ppsiOut);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_GetItemRect(INameSpaceTreeControl* This,IShellItem *psi,RECT *prect) {
    return This->lpVtbl->GetItemRect(This,psi,prect);
}
static FORCEINLINE HRESULT INameSpaceTreeControl_CollapseAll(INameSpaceTreeControl* This) {
    return This->lpVtbl->CollapseAll(This);
}
#endif
#endif

#endif


#endif  /* __INameSpaceTreeControl_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INameSpaceTreeControl2 interface
 */
#ifndef __INameSpaceTreeControl2_INTERFACE_DEFINED__
#define __INameSpaceTreeControl2_INTERFACE_DEFINED__

typedef enum NSTCSTYLE2 {
    NSTCS2_DEFAULT = 0x0,
    NSTCS2_INTERRUPTNOTIFICATIONS = 0x1,
    NSTCS2_SHOWNULLSPACEMENU = 0x2,
    NSTCS2_DISPLAYPADDING = 0x4,
    NSTCS2_DISPLAYPINNEDONLY = 0x8,
    NTSCS2_NOSINGLETONAUTOEXPAND = 0x10,
    NTSCS2_NEVERINSERTNONENUMERATED = 0x20
} NSTCSTYLE2;

DEFINE_ENUM_FLAG_OPERATORS(NSTCSTYLE2)

DEFINE_GUID(IID_INameSpaceTreeControl2, 0x7cc7aed8, 0x290e, 0x49bc, 0x89,0x45, 0xc1,0x40,0x1c,0xc9,0x30,0x6c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7cc7aed8-290e-49bc-8945-c1401cc9306c")
INameSpaceTreeControl2 : public INameSpaceTreeControl
{
    virtual HRESULT STDMETHODCALLTYPE SetControlStyle(
        NSTCSTYLE nstcsMask,
        NSTCSTYLE nstcsStyle) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetControlStyle(
        NSTCSTYLE nstcsMask,
        NSTCSTYLE *pnstcsStyle) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetControlStyle2(
        NSTCSTYLE2 nstcsMask,
        NSTCSTYLE2 nstcsStyle) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetControlStyle2(
        NSTCSTYLE2 nstcsMask,
        NSTCSTYLE2 *pnstcsStyle) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INameSpaceTreeControl2, 0x7cc7aed8, 0x290e, 0x49bc, 0x89,0x45, 0xc1,0x40,0x1c,0xc9,0x30,0x6c)
#endif
#else
typedef struct INameSpaceTreeControl2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INameSpaceTreeControl2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INameSpaceTreeControl2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INameSpaceTreeControl2 *This);

    /*** INameSpaceTreeControl methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        INameSpaceTreeControl2 *This,
        HWND hwndParent,
        RECT *prc,
        NSTCSTYLE nsctsFlags);

    HRESULT (STDMETHODCALLTYPE *TreeAdvise)(
        INameSpaceTreeControl2 *This,
        IUnknown *punk,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *TreeUnadvise)(
        INameSpaceTreeControl2 *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *AppendRoot)(
        INameSpaceTreeControl2 *This,
        IShellItem *psiRoot,
        SHCONTF grfEnumFlags,
        NSTCROOTSTYLE grfRootStyle,
        IShellItemFilter *pif);

    HRESULT (STDMETHODCALLTYPE *InsertRoot)(
        INameSpaceTreeControl2 *This,
        int iIndex,
        IShellItem *psiRoot,
        SHCONTF grfEnumFlags,
        NSTCROOTSTYLE grfRootStyle,
        IShellItemFilter *pif);

    HRESULT (STDMETHODCALLTYPE *RemoveRoot)(
        INameSpaceTreeControl2 *This,
        IShellItem *psiRoot);

    HRESULT (STDMETHODCALLTYPE *RemoveAllRoots)(
        INameSpaceTreeControl2 *This);

    HRESULT (STDMETHODCALLTYPE *GetRootItems)(
        INameSpaceTreeControl2 *This,
        IShellItemArray **ppsiaRootItems);

    HRESULT (STDMETHODCALLTYPE *SetItemState)(
        INameSpaceTreeControl2 *This,
        IShellItem *psi,
        NSTCITEMSTATE nstcisMask,
        NSTCITEMSTATE nstcisFlags);

    HRESULT (STDMETHODCALLTYPE *GetItemState)(
        INameSpaceTreeControl2 *This,
        IShellItem *psi,
        NSTCITEMSTATE nstcisMask,
        NSTCITEMSTATE *pnstcisFlags);

    HRESULT (STDMETHODCALLTYPE *GetSelectedItems)(
        INameSpaceTreeControl2 *This,
        IShellItemArray **psiaItems);

    HRESULT (STDMETHODCALLTYPE *GetItemCustomState)(
        INameSpaceTreeControl2 *This,
        IShellItem *psi,
        int *piStateNumber);

    HRESULT (STDMETHODCALLTYPE *SetItemCustomState)(
        INameSpaceTreeControl2 *This,
        IShellItem *psi,
        int iStateNumber);

    HRESULT (STDMETHODCALLTYPE *EnsureItemVisible)(
        INameSpaceTreeControl2 *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *SetTheme)(
        INameSpaceTreeControl2 *This,
        LPCWSTR pszTheme);

    HRESULT (STDMETHODCALLTYPE *GetNextItem)(
        INameSpaceTreeControl2 *This,
        IShellItem *psi,
        NSTCGNI nstcgi,
        IShellItem **ppsiNext);

    HRESULT (STDMETHODCALLTYPE *HitTest)(
        INameSpaceTreeControl2 *This,
        POINT *ppt,
        IShellItem **ppsiOut);

    HRESULT (STDMETHODCALLTYPE *GetItemRect)(
        INameSpaceTreeControl2 *This,
        IShellItem *psi,
        RECT *prect);

    HRESULT (STDMETHODCALLTYPE *CollapseAll)(
        INameSpaceTreeControl2 *This);

    /*** INameSpaceTreeControl2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetControlStyle)(
        INameSpaceTreeControl2 *This,
        NSTCSTYLE nstcsMask,
        NSTCSTYLE nstcsStyle);

    HRESULT (STDMETHODCALLTYPE *GetControlStyle)(
        INameSpaceTreeControl2 *This,
        NSTCSTYLE nstcsMask,
        NSTCSTYLE *pnstcsStyle);

    HRESULT (STDMETHODCALLTYPE *SetControlStyle2)(
        INameSpaceTreeControl2 *This,
        NSTCSTYLE2 nstcsMask,
        NSTCSTYLE2 nstcsStyle);

    HRESULT (STDMETHODCALLTYPE *GetControlStyle2)(
        INameSpaceTreeControl2 *This,
        NSTCSTYLE2 nstcsMask,
        NSTCSTYLE2 *pnstcsStyle);

    END_INTERFACE
} INameSpaceTreeControl2Vtbl;

interface INameSpaceTreeControl2 {
    CONST_VTBL INameSpaceTreeControl2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INameSpaceTreeControl2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INameSpaceTreeControl2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INameSpaceTreeControl2_Release(This) (This)->lpVtbl->Release(This)
/*** INameSpaceTreeControl methods ***/
#define INameSpaceTreeControl2_Initialize(This,hwndParent,prc,nsctsFlags) (This)->lpVtbl->Initialize(This,hwndParent,prc,nsctsFlags)
#define INameSpaceTreeControl2_TreeAdvise(This,punk,pdwCookie) (This)->lpVtbl->TreeAdvise(This,punk,pdwCookie)
#define INameSpaceTreeControl2_TreeUnadvise(This,dwCookie) (This)->lpVtbl->TreeUnadvise(This,dwCookie)
#define INameSpaceTreeControl2_AppendRoot(This,psiRoot,grfEnumFlags,grfRootStyle,pif) (This)->lpVtbl->AppendRoot(This,psiRoot,grfEnumFlags,grfRootStyle,pif)
#define INameSpaceTreeControl2_InsertRoot(This,iIndex,psiRoot,grfEnumFlags,grfRootStyle,pif) (This)->lpVtbl->InsertRoot(This,iIndex,psiRoot,grfEnumFlags,grfRootStyle,pif)
#define INameSpaceTreeControl2_RemoveRoot(This,psiRoot) (This)->lpVtbl->RemoveRoot(This,psiRoot)
#define INameSpaceTreeControl2_RemoveAllRoots(This) (This)->lpVtbl->RemoveAllRoots(This)
#define INameSpaceTreeControl2_GetRootItems(This,ppsiaRootItems) (This)->lpVtbl->GetRootItems(This,ppsiaRootItems)
#define INameSpaceTreeControl2_SetItemState(This,psi,nstcisMask,nstcisFlags) (This)->lpVtbl->SetItemState(This,psi,nstcisMask,nstcisFlags)
#define INameSpaceTreeControl2_GetItemState(This,psi,nstcisMask,pnstcisFlags) (This)->lpVtbl->GetItemState(This,psi,nstcisMask,pnstcisFlags)
#define INameSpaceTreeControl2_GetSelectedItems(This,psiaItems) (This)->lpVtbl->GetSelectedItems(This,psiaItems)
#define INameSpaceTreeControl2_GetItemCustomState(This,psi,piStateNumber) (This)->lpVtbl->GetItemCustomState(This,psi,piStateNumber)
#define INameSpaceTreeControl2_SetItemCustomState(This,psi,iStateNumber) (This)->lpVtbl->SetItemCustomState(This,psi,iStateNumber)
#define INameSpaceTreeControl2_EnsureItemVisible(This,psi) (This)->lpVtbl->EnsureItemVisible(This,psi)
#define INameSpaceTreeControl2_SetTheme(This,pszTheme) (This)->lpVtbl->SetTheme(This,pszTheme)
#define INameSpaceTreeControl2_GetNextItem(This,psi,nstcgi,ppsiNext) (This)->lpVtbl->GetNextItem(This,psi,nstcgi,ppsiNext)
#define INameSpaceTreeControl2_HitTest(This,ppt,ppsiOut) (This)->lpVtbl->HitTest(This,ppt,ppsiOut)
#define INameSpaceTreeControl2_GetItemRect(This,psi,prect) (This)->lpVtbl->GetItemRect(This,psi,prect)
#define INameSpaceTreeControl2_CollapseAll(This) (This)->lpVtbl->CollapseAll(This)
/*** INameSpaceTreeControl2 methods ***/
#define INameSpaceTreeControl2_SetControlStyle(This,nstcsMask,nstcsStyle) (This)->lpVtbl->SetControlStyle(This,nstcsMask,nstcsStyle)
#define INameSpaceTreeControl2_GetControlStyle(This,nstcsMask,pnstcsStyle) (This)->lpVtbl->GetControlStyle(This,nstcsMask,pnstcsStyle)
#define INameSpaceTreeControl2_SetControlStyle2(This,nstcsMask,nstcsStyle) (This)->lpVtbl->SetControlStyle2(This,nstcsMask,nstcsStyle)
#define INameSpaceTreeControl2_GetControlStyle2(This,nstcsMask,pnstcsStyle) (This)->lpVtbl->GetControlStyle2(This,nstcsMask,pnstcsStyle)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControl2_QueryInterface(INameSpaceTreeControl2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INameSpaceTreeControl2_AddRef(INameSpaceTreeControl2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INameSpaceTreeControl2_Release(INameSpaceTreeControl2* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeControl methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControl2_Initialize(INameSpaceTreeControl2* This,HWND hwndParent,RECT *prc,NSTCSTYLE nsctsFlags) {
    return This->lpVtbl->Initialize(This,hwndParent,prc,nsctsFlags);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_TreeAdvise(INameSpaceTreeControl2* This,IUnknown *punk,DWORD *pdwCookie) {
    return This->lpVtbl->TreeAdvise(This,punk,pdwCookie);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_TreeUnadvise(INameSpaceTreeControl2* This,DWORD dwCookie) {
    return This->lpVtbl->TreeUnadvise(This,dwCookie);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_AppendRoot(INameSpaceTreeControl2* This,IShellItem *psiRoot,SHCONTF grfEnumFlags,NSTCROOTSTYLE grfRootStyle,IShellItemFilter *pif) {
    return This->lpVtbl->AppendRoot(This,psiRoot,grfEnumFlags,grfRootStyle,pif);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_InsertRoot(INameSpaceTreeControl2* This,int iIndex,IShellItem *psiRoot,SHCONTF grfEnumFlags,NSTCROOTSTYLE grfRootStyle,IShellItemFilter *pif) {
    return This->lpVtbl->InsertRoot(This,iIndex,psiRoot,grfEnumFlags,grfRootStyle,pif);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_RemoveRoot(INameSpaceTreeControl2* This,IShellItem *psiRoot) {
    return This->lpVtbl->RemoveRoot(This,psiRoot);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_RemoveAllRoots(INameSpaceTreeControl2* This) {
    return This->lpVtbl->RemoveAllRoots(This);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_GetRootItems(INameSpaceTreeControl2* This,IShellItemArray **ppsiaRootItems) {
    return This->lpVtbl->GetRootItems(This,ppsiaRootItems);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_SetItemState(INameSpaceTreeControl2* This,IShellItem *psi,NSTCITEMSTATE nstcisMask,NSTCITEMSTATE nstcisFlags) {
    return This->lpVtbl->SetItemState(This,psi,nstcisMask,nstcisFlags);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_GetItemState(INameSpaceTreeControl2* This,IShellItem *psi,NSTCITEMSTATE nstcisMask,NSTCITEMSTATE *pnstcisFlags) {
    return This->lpVtbl->GetItemState(This,psi,nstcisMask,pnstcisFlags);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_GetSelectedItems(INameSpaceTreeControl2* This,IShellItemArray **psiaItems) {
    return This->lpVtbl->GetSelectedItems(This,psiaItems);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_GetItemCustomState(INameSpaceTreeControl2* This,IShellItem *psi,int *piStateNumber) {
    return This->lpVtbl->GetItemCustomState(This,psi,piStateNumber);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_SetItemCustomState(INameSpaceTreeControl2* This,IShellItem *psi,int iStateNumber) {
    return This->lpVtbl->SetItemCustomState(This,psi,iStateNumber);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_EnsureItemVisible(INameSpaceTreeControl2* This,IShellItem *psi) {
    return This->lpVtbl->EnsureItemVisible(This,psi);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_SetTheme(INameSpaceTreeControl2* This,LPCWSTR pszTheme) {
    return This->lpVtbl->SetTheme(This,pszTheme);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_GetNextItem(INameSpaceTreeControl2* This,IShellItem *psi,NSTCGNI nstcgi,IShellItem **ppsiNext) {
    return This->lpVtbl->GetNextItem(This,psi,nstcgi,ppsiNext);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_HitTest(INameSpaceTreeControl2* This,POINT *ppt,IShellItem **ppsiOut) {
    return This->lpVtbl->HitTest(This,ppt,ppsiOut);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_GetItemRect(INameSpaceTreeControl2* This,IShellItem *psi,RECT *prect) {
    return This->lpVtbl->GetItemRect(This,psi,prect);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_CollapseAll(INameSpaceTreeControl2* This) {
    return This->lpVtbl->CollapseAll(This);
}
/*** INameSpaceTreeControl2 methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControl2_SetControlStyle(INameSpaceTreeControl2* This,NSTCSTYLE nstcsMask,NSTCSTYLE nstcsStyle) {
    return This->lpVtbl->SetControlStyle(This,nstcsMask,nstcsStyle);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_GetControlStyle(INameSpaceTreeControl2* This,NSTCSTYLE nstcsMask,NSTCSTYLE *pnstcsStyle) {
    return This->lpVtbl->GetControlStyle(This,nstcsMask,pnstcsStyle);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_SetControlStyle2(INameSpaceTreeControl2* This,NSTCSTYLE2 nstcsMask,NSTCSTYLE2 nstcsStyle) {
    return This->lpVtbl->SetControlStyle2(This,nstcsMask,nstcsStyle);
}
static FORCEINLINE HRESULT INameSpaceTreeControl2_GetControlStyle2(INameSpaceTreeControl2* This,NSTCSTYLE2 nstcsMask,NSTCSTYLE2 *pnstcsStyle) {
    return This->lpVtbl->GetControlStyle2(This,nstcsMask,pnstcsStyle);
}
#endif
#endif

#endif


#endif  /* __INameSpaceTreeControl2_INTERFACE_DEFINED__ */


#define NSTCS2_ALLMASK (NSTCS2_INTERRUPTNOTIFICATIONS | NSTCS2_SHOWNULLSPACEMENU | NSTCS2_DISPLAYPADDING)
#define SID_SNavigationPane IID_INameSpaceTreeControl

#define ISLBUTTON(x) (NSTCECT_LBUTTON == ((x) & NSTCECT_BUTTON))
#define ISMBUTTON(x) (NSTCECT_MBUTTON == ((x) & NSTCECT_BUTTON))
#define ISRBUTTON(x) (NSTCECT_RBUTTON == ((x) & NSTCECT_BUTTON))
#define ISDBLCLICK(x) (NSTCECT_DBLCLICK == ((x) & NSTCECT_DBLCLICK))

/*****************************************************************************
 * INameSpaceTreeControlEvents interface
 */
#ifndef __INameSpaceTreeControlEvents_INTERFACE_DEFINED__
#define __INameSpaceTreeControlEvents_INTERFACE_DEFINED__

enum _NSTCEHITTEST {
    NSTCEHT_NOWHERE = 0x1,
    NSTCEHT_ONITEMICON = 0x2,
    NSTCEHT_ONITEMLABEL = 0x4,
    NSTCEHT_ONITEMINDENT = 0x8,
    NSTCEHT_ONITEMBUTTON = 0x10,
    NSTCEHT_ONITEMRIGHT = 0x20,
    NSTCEHT_ONITEMSTATEICON = 0x40,
    NSTCEHT_ONITEM = 0x46,
    NSTCEHT_ONITEMTABBUTTON = 0x1000
};

typedef DWORD NSTCEHITTEST;

enum _NSTCECLICKTYPE {
    NSTCECT_LBUTTON = 0x1,
    NSTCECT_MBUTTON = 0x2,
    NSTCECT_RBUTTON = 0x3,
    NSTCECT_BUTTON = 0x3,
    NSTCECT_DBLCLICK = 0x4
};

typedef DWORD NSTCECLICKTYPE;

DEFINE_GUID(IID_INameSpaceTreeControlEvents, 0x93d77985, 0xb3d8, 0x4484, 0x83,0x18, 0x67,0x2c,0xdd,0xa0,0x02,0xce);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("93d77985-b3d8-4484-8318-672cdda002ce")
INameSpaceTreeControlEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnItemClick(
        IShellItem *psi,
        NSTCEHITTEST nstceHitTest,
        NSTCECLICKTYPE nstceClickType) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnPropertyItemCommit(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnItemStateChanging(
        IShellItem *psi,
        NSTCITEMSTATE nstcisMask,
        NSTCITEMSTATE nstcisState) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnItemStateChanged(
        IShellItem *psi,
        NSTCITEMSTATE nstcisMask,
        NSTCITEMSTATE nstcisState) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnSelectionChanged(
        IShellItemArray *psiaSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnKeyboardInput(
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnBeforeExpand(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnAfterExpand(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnBeginLabelEdit(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnEndLabelEdit(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnGetToolTip(
        IShellItem *psi,
        LPWSTR pszTip,
        int cchTip) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnBeforeItemDelete(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnItemAdded(
        IShellItem *psi,
        WINBOOL fIsRoot) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnItemDeleted(
        IShellItem *psi,
        WINBOOL fIsRoot) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnBeforeContextMenu(
        IShellItem *psi,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnAfterContextMenu(
        IShellItem *psi,
        IContextMenu *pcmIn,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnBeforeStateImageChange(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnGetDefaultIconIndex(
        IShellItem *psi,
        int *piDefaultIcon,
        int *piOpenIcon) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INameSpaceTreeControlEvents, 0x93d77985, 0xb3d8, 0x4484, 0x83,0x18, 0x67,0x2c,0xdd,0xa0,0x02,0xce)
#endif
#else
typedef struct INameSpaceTreeControlEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INameSpaceTreeControlEvents *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INameSpaceTreeControlEvents *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INameSpaceTreeControlEvents *This);

    /*** INameSpaceTreeControlEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *OnItemClick)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi,
        NSTCEHITTEST nstceHitTest,
        NSTCECLICKTYPE nstceClickType);

    HRESULT (STDMETHODCALLTYPE *OnPropertyItemCommit)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *OnItemStateChanging)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi,
        NSTCITEMSTATE nstcisMask,
        NSTCITEMSTATE nstcisState);

    HRESULT (STDMETHODCALLTYPE *OnItemStateChanged)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi,
        NSTCITEMSTATE nstcisMask,
        NSTCITEMSTATE nstcisState);

    HRESULT (STDMETHODCALLTYPE *OnSelectionChanged)(
        INameSpaceTreeControlEvents *This,
        IShellItemArray *psiaSelection);

    HRESULT (STDMETHODCALLTYPE *OnKeyboardInput)(
        INameSpaceTreeControlEvents *This,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam);

    HRESULT (STDMETHODCALLTYPE *OnBeforeExpand)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *OnAfterExpand)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *OnBeginLabelEdit)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *OnEndLabelEdit)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *OnGetToolTip)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi,
        LPWSTR pszTip,
        int cchTip);

    HRESULT (STDMETHODCALLTYPE *OnBeforeItemDelete)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *OnItemAdded)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi,
        WINBOOL fIsRoot);

    HRESULT (STDMETHODCALLTYPE *OnItemDeleted)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi,
        WINBOOL fIsRoot);

    HRESULT (STDMETHODCALLTYPE *OnBeforeContextMenu)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *OnAfterContextMenu)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi,
        IContextMenu *pcmIn,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *OnBeforeStateImageChange)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *OnGetDefaultIconIndex)(
        INameSpaceTreeControlEvents *This,
        IShellItem *psi,
        int *piDefaultIcon,
        int *piOpenIcon);

    END_INTERFACE
} INameSpaceTreeControlEventsVtbl;

interface INameSpaceTreeControlEvents {
    CONST_VTBL INameSpaceTreeControlEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INameSpaceTreeControlEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INameSpaceTreeControlEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INameSpaceTreeControlEvents_Release(This) (This)->lpVtbl->Release(This)
/*** INameSpaceTreeControlEvents methods ***/
#define INameSpaceTreeControlEvents_OnItemClick(This,psi,nstceHitTest,nstceClickType) (This)->lpVtbl->OnItemClick(This,psi,nstceHitTest,nstceClickType)
#define INameSpaceTreeControlEvents_OnPropertyItemCommit(This,psi) (This)->lpVtbl->OnPropertyItemCommit(This,psi)
#define INameSpaceTreeControlEvents_OnItemStateChanging(This,psi,nstcisMask,nstcisState) (This)->lpVtbl->OnItemStateChanging(This,psi,nstcisMask,nstcisState)
#define INameSpaceTreeControlEvents_OnItemStateChanged(This,psi,nstcisMask,nstcisState) (This)->lpVtbl->OnItemStateChanged(This,psi,nstcisMask,nstcisState)
#define INameSpaceTreeControlEvents_OnSelectionChanged(This,psiaSelection) (This)->lpVtbl->OnSelectionChanged(This,psiaSelection)
#define INameSpaceTreeControlEvents_OnKeyboardInput(This,uMsg,wParam,lParam) (This)->lpVtbl->OnKeyboardInput(This,uMsg,wParam,lParam)
#define INameSpaceTreeControlEvents_OnBeforeExpand(This,psi) (This)->lpVtbl->OnBeforeExpand(This,psi)
#define INameSpaceTreeControlEvents_OnAfterExpand(This,psi) (This)->lpVtbl->OnAfterExpand(This,psi)
#define INameSpaceTreeControlEvents_OnBeginLabelEdit(This,psi) (This)->lpVtbl->OnBeginLabelEdit(This,psi)
#define INameSpaceTreeControlEvents_OnEndLabelEdit(This,psi) (This)->lpVtbl->OnEndLabelEdit(This,psi)
#define INameSpaceTreeControlEvents_OnGetToolTip(This,psi,pszTip,cchTip) (This)->lpVtbl->OnGetToolTip(This,psi,pszTip,cchTip)
#define INameSpaceTreeControlEvents_OnBeforeItemDelete(This,psi) (This)->lpVtbl->OnBeforeItemDelete(This,psi)
#define INameSpaceTreeControlEvents_OnItemAdded(This,psi,fIsRoot) (This)->lpVtbl->OnItemAdded(This,psi,fIsRoot)
#define INameSpaceTreeControlEvents_OnItemDeleted(This,psi,fIsRoot) (This)->lpVtbl->OnItemDeleted(This,psi,fIsRoot)
#define INameSpaceTreeControlEvents_OnBeforeContextMenu(This,psi,riid,ppv) (This)->lpVtbl->OnBeforeContextMenu(This,psi,riid,ppv)
#define INameSpaceTreeControlEvents_OnAfterContextMenu(This,psi,pcmIn,riid,ppv) (This)->lpVtbl->OnAfterContextMenu(This,psi,pcmIn,riid,ppv)
#define INameSpaceTreeControlEvents_OnBeforeStateImageChange(This,psi) (This)->lpVtbl->OnBeforeStateImageChange(This,psi)
#define INameSpaceTreeControlEvents_OnGetDefaultIconIndex(This,psi,piDefaultIcon,piOpenIcon) (This)->lpVtbl->OnGetDefaultIconIndex(This,psi,piDefaultIcon,piOpenIcon)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_QueryInterface(INameSpaceTreeControlEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INameSpaceTreeControlEvents_AddRef(INameSpaceTreeControlEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INameSpaceTreeControlEvents_Release(INameSpaceTreeControlEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeControlEvents methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnItemClick(INameSpaceTreeControlEvents* This,IShellItem *psi,NSTCEHITTEST nstceHitTest,NSTCECLICKTYPE nstceClickType) {
    return This->lpVtbl->OnItemClick(This,psi,nstceHitTest,nstceClickType);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnPropertyItemCommit(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnPropertyItemCommit(This,psi);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnItemStateChanging(INameSpaceTreeControlEvents* This,IShellItem *psi,NSTCITEMSTATE nstcisMask,NSTCITEMSTATE nstcisState) {
    return This->lpVtbl->OnItemStateChanging(This,psi,nstcisMask,nstcisState);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnItemStateChanged(INameSpaceTreeControlEvents* This,IShellItem *psi,NSTCITEMSTATE nstcisMask,NSTCITEMSTATE nstcisState) {
    return This->lpVtbl->OnItemStateChanged(This,psi,nstcisMask,nstcisState);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnSelectionChanged(INameSpaceTreeControlEvents* This,IShellItemArray *psiaSelection) {
    return This->lpVtbl->OnSelectionChanged(This,psiaSelection);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnKeyboardInput(INameSpaceTreeControlEvents* This,UINT uMsg,WPARAM wParam,LPARAM lParam) {
    return This->lpVtbl->OnKeyboardInput(This,uMsg,wParam,lParam);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnBeforeExpand(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnBeforeExpand(This,psi);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnAfterExpand(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnAfterExpand(This,psi);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnBeginLabelEdit(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnBeginLabelEdit(This,psi);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnEndLabelEdit(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnEndLabelEdit(This,psi);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnGetToolTip(INameSpaceTreeControlEvents* This,IShellItem *psi,LPWSTR pszTip,int cchTip) {
    return This->lpVtbl->OnGetToolTip(This,psi,pszTip,cchTip);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnBeforeItemDelete(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnBeforeItemDelete(This,psi);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnItemAdded(INameSpaceTreeControlEvents* This,IShellItem *psi,WINBOOL fIsRoot) {
    return This->lpVtbl->OnItemAdded(This,psi,fIsRoot);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnItemDeleted(INameSpaceTreeControlEvents* This,IShellItem *psi,WINBOOL fIsRoot) {
    return This->lpVtbl->OnItemDeleted(This,psi,fIsRoot);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnBeforeContextMenu(INameSpaceTreeControlEvents* This,IShellItem *psi,REFIID riid,void **ppv) {
    return This->lpVtbl->OnBeforeContextMenu(This,psi,riid,ppv);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnAfterContextMenu(INameSpaceTreeControlEvents* This,IShellItem *psi,IContextMenu *pcmIn,REFIID riid,void **ppv) {
    return This->lpVtbl->OnAfterContextMenu(This,psi,pcmIn,riid,ppv);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnBeforeStateImageChange(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnBeforeStateImageChange(This,psi);
}
static FORCEINLINE HRESULT INameSpaceTreeControlEvents_OnGetDefaultIconIndex(INameSpaceTreeControlEvents* This,IShellItem *psi,int *piDefaultIcon,int *piOpenIcon) {
    return This->lpVtbl->OnGetDefaultIconIndex(This,psi,piDefaultIcon,piOpenIcon);
}
#endif
#endif

#endif


#endif  /* __INameSpaceTreeControlEvents_INTERFACE_DEFINED__ */


#define NSTCDHPOS_ONTOP  -1

/*****************************************************************************
 * INameSpaceTreeControlDropHandler interface
 */
#ifndef __INameSpaceTreeControlDropHandler_INTERFACE_DEFINED__
#define __INameSpaceTreeControlDropHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_INameSpaceTreeControlDropHandler, 0xf9c665d6, 0xc2f2, 0x4c19, 0xbf,0x33, 0x83,0x22,0xd7,0x35,0x2f,0x51);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f9c665d6-c2f2-4c19-bf33-8322d7352f51")
INameSpaceTreeControlDropHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnDragEnter(
        IShellItem *psiOver,
        IShellItemArray *psiaData,
        WINBOOL fOutsideSource,
        DWORD grfKeyState,
        DWORD *pdwEffect) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDragOver(
        IShellItem *psiOver,
        IShellItemArray *psiaData,
        DWORD grfKeyState,
        DWORD *pdwEffect) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDragPosition(
        IShellItem *psiOver,
        IShellItemArray *psiaData,
        int iNewPosition,
        int iOldPosition) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDrop(
        IShellItem *psiOver,
        IShellItemArray *psiaData,
        int iPosition,
        DWORD grfKeyState,
        DWORD *pdwEffect) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDropPosition(
        IShellItem *psiOver,
        IShellItemArray *psiaData,
        int iNewPosition,
        int iOldPosition) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDragLeave(
        IShellItem *psiOver) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INameSpaceTreeControlDropHandler, 0xf9c665d6, 0xc2f2, 0x4c19, 0xbf,0x33, 0x83,0x22,0xd7,0x35,0x2f,0x51)
#endif
#else
typedef struct INameSpaceTreeControlDropHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INameSpaceTreeControlDropHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INameSpaceTreeControlDropHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INameSpaceTreeControlDropHandler *This);

    /*** INameSpaceTreeControlDropHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *OnDragEnter)(
        INameSpaceTreeControlDropHandler *This,
        IShellItem *psiOver,
        IShellItemArray *psiaData,
        WINBOOL fOutsideSource,
        DWORD grfKeyState,
        DWORD *pdwEffect);

    HRESULT (STDMETHODCALLTYPE *OnDragOver)(
        INameSpaceTreeControlDropHandler *This,
        IShellItem *psiOver,
        IShellItemArray *psiaData,
        DWORD grfKeyState,
        DWORD *pdwEffect);

    HRESULT (STDMETHODCALLTYPE *OnDragPosition)(
        INameSpaceTreeControlDropHandler *This,
        IShellItem *psiOver,
        IShellItemArray *psiaData,
        int iNewPosition,
        int iOldPosition);

    HRESULT (STDMETHODCALLTYPE *OnDrop)(
        INameSpaceTreeControlDropHandler *This,
        IShellItem *psiOver,
        IShellItemArray *psiaData,
        int iPosition,
        DWORD grfKeyState,
        DWORD *pdwEffect);

    HRESULT (STDMETHODCALLTYPE *OnDropPosition)(
        INameSpaceTreeControlDropHandler *This,
        IShellItem *psiOver,
        IShellItemArray *psiaData,
        int iNewPosition,
        int iOldPosition);

    HRESULT (STDMETHODCALLTYPE *OnDragLeave)(
        INameSpaceTreeControlDropHandler *This,
        IShellItem *psiOver);

    END_INTERFACE
} INameSpaceTreeControlDropHandlerVtbl;

interface INameSpaceTreeControlDropHandler {
    CONST_VTBL INameSpaceTreeControlDropHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INameSpaceTreeControlDropHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INameSpaceTreeControlDropHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INameSpaceTreeControlDropHandler_Release(This) (This)->lpVtbl->Release(This)
/*** INameSpaceTreeControlDropHandler methods ***/
#define INameSpaceTreeControlDropHandler_OnDragEnter(This,psiOver,psiaData,fOutsideSource,grfKeyState,pdwEffect) (This)->lpVtbl->OnDragEnter(This,psiOver,psiaData,fOutsideSource,grfKeyState,pdwEffect)
#define INameSpaceTreeControlDropHandler_OnDragOver(This,psiOver,psiaData,grfKeyState,pdwEffect) (This)->lpVtbl->OnDragOver(This,psiOver,psiaData,grfKeyState,pdwEffect)
#define INameSpaceTreeControlDropHandler_OnDragPosition(This,psiOver,psiaData,iNewPosition,iOldPosition) (This)->lpVtbl->OnDragPosition(This,psiOver,psiaData,iNewPosition,iOldPosition)
#define INameSpaceTreeControlDropHandler_OnDrop(This,psiOver,psiaData,iPosition,grfKeyState,pdwEffect) (This)->lpVtbl->OnDrop(This,psiOver,psiaData,iPosition,grfKeyState,pdwEffect)
#define INameSpaceTreeControlDropHandler_OnDropPosition(This,psiOver,psiaData,iNewPosition,iOldPosition) (This)->lpVtbl->OnDropPosition(This,psiOver,psiaData,iNewPosition,iOldPosition)
#define INameSpaceTreeControlDropHandler_OnDragLeave(This,psiOver) (This)->lpVtbl->OnDragLeave(This,psiOver)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControlDropHandler_QueryInterface(INameSpaceTreeControlDropHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INameSpaceTreeControlDropHandler_AddRef(INameSpaceTreeControlDropHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INameSpaceTreeControlDropHandler_Release(INameSpaceTreeControlDropHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeControlDropHandler methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControlDropHandler_OnDragEnter(INameSpaceTreeControlDropHandler* This,IShellItem *psiOver,IShellItemArray *psiaData,WINBOOL fOutsideSource,DWORD grfKeyState,DWORD *pdwEffect) {
    return This->lpVtbl->OnDragEnter(This,psiOver,psiaData,fOutsideSource,grfKeyState,pdwEffect);
}
static FORCEINLINE HRESULT INameSpaceTreeControlDropHandler_OnDragOver(INameSpaceTreeControlDropHandler* This,IShellItem *psiOver,IShellItemArray *psiaData,DWORD grfKeyState,DWORD *pdwEffect) {
    return This->lpVtbl->OnDragOver(This,psiOver,psiaData,grfKeyState,pdwEffect);
}
static FORCEINLINE HRESULT INameSpaceTreeControlDropHandler_OnDragPosition(INameSpaceTreeControlDropHandler* This,IShellItem *psiOver,IShellItemArray *psiaData,int iNewPosition,int iOldPosition) {
    return This->lpVtbl->OnDragPosition(This,psiOver,psiaData,iNewPosition,iOldPosition);
}
static FORCEINLINE HRESULT INameSpaceTreeControlDropHandler_OnDrop(INameSpaceTreeControlDropHandler* This,IShellItem *psiOver,IShellItemArray *psiaData,int iPosition,DWORD grfKeyState,DWORD *pdwEffect) {
    return This->lpVtbl->OnDrop(This,psiOver,psiaData,iPosition,grfKeyState,pdwEffect);
}
static FORCEINLINE HRESULT INameSpaceTreeControlDropHandler_OnDropPosition(INameSpaceTreeControlDropHandler* This,IShellItem *psiOver,IShellItemArray *psiaData,int iNewPosition,int iOldPosition) {
    return This->lpVtbl->OnDropPosition(This,psiOver,psiaData,iNewPosition,iOldPosition);
}
static FORCEINLINE HRESULT INameSpaceTreeControlDropHandler_OnDragLeave(INameSpaceTreeControlDropHandler* This,IShellItem *psiOver) {
    return This->lpVtbl->OnDragLeave(This,psiOver);
}
#endif
#endif

#endif


#endif  /* __INameSpaceTreeControlDropHandler_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INameSpaceTreeAccessible interface
 */
#ifndef __INameSpaceTreeAccessible_INTERFACE_DEFINED__
#define __INameSpaceTreeAccessible_INTERFACE_DEFINED__

DEFINE_GUID(IID_INameSpaceTreeAccessible, 0x71f312de, 0x43ed, 0x4190, 0x84,0x77, 0xe9,0x53,0x6b,0x82,0x35,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("71f312de-43ed-4190-8477-e9536b82350b")
INameSpaceTreeAccessible : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnGetDefaultAccessibilityAction(
        IShellItem *psi,
        BSTR *pbstrDefaultAction) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDoDefaultAccessibilityAction(
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnGetAccessibilityRole(
        IShellItem *psi,
        VARIANT *pvarRole) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INameSpaceTreeAccessible, 0x71f312de, 0x43ed, 0x4190, 0x84,0x77, 0xe9,0x53,0x6b,0x82,0x35,0x0b)
#endif
#else
typedef struct INameSpaceTreeAccessibleVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INameSpaceTreeAccessible *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INameSpaceTreeAccessible *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INameSpaceTreeAccessible *This);

    /*** INameSpaceTreeAccessible methods ***/
    HRESULT (STDMETHODCALLTYPE *OnGetDefaultAccessibilityAction)(
        INameSpaceTreeAccessible *This,
        IShellItem *psi,
        BSTR *pbstrDefaultAction);

    HRESULT (STDMETHODCALLTYPE *OnDoDefaultAccessibilityAction)(
        INameSpaceTreeAccessible *This,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *OnGetAccessibilityRole)(
        INameSpaceTreeAccessible *This,
        IShellItem *psi,
        VARIANT *pvarRole);

    END_INTERFACE
} INameSpaceTreeAccessibleVtbl;

interface INameSpaceTreeAccessible {
    CONST_VTBL INameSpaceTreeAccessibleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INameSpaceTreeAccessible_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INameSpaceTreeAccessible_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INameSpaceTreeAccessible_Release(This) (This)->lpVtbl->Release(This)
/*** INameSpaceTreeAccessible methods ***/
#define INameSpaceTreeAccessible_OnGetDefaultAccessibilityAction(This,psi,pbstrDefaultAction) (This)->lpVtbl->OnGetDefaultAccessibilityAction(This,psi,pbstrDefaultAction)
#define INameSpaceTreeAccessible_OnDoDefaultAccessibilityAction(This,psi) (This)->lpVtbl->OnDoDefaultAccessibilityAction(This,psi)
#define INameSpaceTreeAccessible_OnGetAccessibilityRole(This,psi,pvarRole) (This)->lpVtbl->OnGetAccessibilityRole(This,psi,pvarRole)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INameSpaceTreeAccessible_QueryInterface(INameSpaceTreeAccessible* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INameSpaceTreeAccessible_AddRef(INameSpaceTreeAccessible* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INameSpaceTreeAccessible_Release(INameSpaceTreeAccessible* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeAccessible methods ***/
static FORCEINLINE HRESULT INameSpaceTreeAccessible_OnGetDefaultAccessibilityAction(INameSpaceTreeAccessible* This,IShellItem *psi,BSTR *pbstrDefaultAction) {
    return This->lpVtbl->OnGetDefaultAccessibilityAction(This,psi,pbstrDefaultAction);
}
static FORCEINLINE HRESULT INameSpaceTreeAccessible_OnDoDefaultAccessibilityAction(INameSpaceTreeAccessible* This,IShellItem *psi) {
    return This->lpVtbl->OnDoDefaultAccessibilityAction(This,psi);
}
static FORCEINLINE HRESULT INameSpaceTreeAccessible_OnGetAccessibilityRole(INameSpaceTreeAccessible* This,IShellItem *psi,VARIANT *pvarRole) {
    return This->lpVtbl->OnGetAccessibilityRole(This,psi,pvarRole);
}
#endif
#endif

#endif


#endif  /* __INameSpaceTreeAccessible_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INameSpaceTreeControlCustomDraw interface
 */
#ifndef __INameSpaceTreeControlCustomDraw_INTERFACE_DEFINED__
#define __INameSpaceTreeControlCustomDraw_INTERFACE_DEFINED__

typedef struct NSTCCUSTOMDRAW {
    IShellItem *psi;
    UINT uItemState;
    NSTCITEMSTATE nstcis;
    LPCWSTR pszText;
    int iImage;
    HIMAGELIST himl;
    int iLevel;
    int iIndent;
} NSTCCUSTOMDRAW;

DEFINE_GUID(IID_INameSpaceTreeControlCustomDraw, 0x2d3ba758, 0x33ee, 0x42d5, 0xbb,0x7b, 0x5f,0x34,0x31,0xd8,0x6c,0x78);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2d3ba758-33ee-42d5-bb7b-5f3431d86c78")
INameSpaceTreeControlCustomDraw : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE PrePaint(
        HDC hdc,
        RECT *prc,
        LRESULT *plres) = 0;

    virtual HRESULT STDMETHODCALLTYPE PostPaint(
        HDC hdc,
        RECT *prc) = 0;

    virtual HRESULT STDMETHODCALLTYPE ItemPrePaint(
        HDC hdc,
        RECT *prc,
        NSTCCUSTOMDRAW *pnstccdItem,
        COLORREF *pclrText,
        COLORREF *pclrTextBk,
        LRESULT *plres) = 0;

    virtual HRESULT STDMETHODCALLTYPE ItemPostPaint(
        HDC hdc,
        RECT *prc,
        NSTCCUSTOMDRAW *pnstccdItem) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INameSpaceTreeControlCustomDraw, 0x2d3ba758, 0x33ee, 0x42d5, 0xbb,0x7b, 0x5f,0x34,0x31,0xd8,0x6c,0x78)
#endif
#else
typedef struct INameSpaceTreeControlCustomDrawVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INameSpaceTreeControlCustomDraw *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INameSpaceTreeControlCustomDraw *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INameSpaceTreeControlCustomDraw *This);

    /*** INameSpaceTreeControlCustomDraw methods ***/
    HRESULT (STDMETHODCALLTYPE *PrePaint)(
        INameSpaceTreeControlCustomDraw *This,
        HDC hdc,
        RECT *prc,
        LRESULT *plres);

    HRESULT (STDMETHODCALLTYPE *PostPaint)(
        INameSpaceTreeControlCustomDraw *This,
        HDC hdc,
        RECT *prc);

    HRESULT (STDMETHODCALLTYPE *ItemPrePaint)(
        INameSpaceTreeControlCustomDraw *This,
        HDC hdc,
        RECT *prc,
        NSTCCUSTOMDRAW *pnstccdItem,
        COLORREF *pclrText,
        COLORREF *pclrTextBk,
        LRESULT *plres);

    HRESULT (STDMETHODCALLTYPE *ItemPostPaint)(
        INameSpaceTreeControlCustomDraw *This,
        HDC hdc,
        RECT *prc,
        NSTCCUSTOMDRAW *pnstccdItem);

    END_INTERFACE
} INameSpaceTreeControlCustomDrawVtbl;

interface INameSpaceTreeControlCustomDraw {
    CONST_VTBL INameSpaceTreeControlCustomDrawVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INameSpaceTreeControlCustomDraw_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INameSpaceTreeControlCustomDraw_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INameSpaceTreeControlCustomDraw_Release(This) (This)->lpVtbl->Release(This)
/*** INameSpaceTreeControlCustomDraw methods ***/
#define INameSpaceTreeControlCustomDraw_PrePaint(This,hdc,prc,plres) (This)->lpVtbl->PrePaint(This,hdc,prc,plres)
#define INameSpaceTreeControlCustomDraw_PostPaint(This,hdc,prc) (This)->lpVtbl->PostPaint(This,hdc,prc)
#define INameSpaceTreeControlCustomDraw_ItemPrePaint(This,hdc,prc,pnstccdItem,pclrText,pclrTextBk,plres) (This)->lpVtbl->ItemPrePaint(This,hdc,prc,pnstccdItem,pclrText,pclrTextBk,plres)
#define INameSpaceTreeControlCustomDraw_ItemPostPaint(This,hdc,prc,pnstccdItem) (This)->lpVtbl->ItemPostPaint(This,hdc,prc,pnstccdItem)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControlCustomDraw_QueryInterface(INameSpaceTreeControlCustomDraw* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INameSpaceTreeControlCustomDraw_AddRef(INameSpaceTreeControlCustomDraw* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INameSpaceTreeControlCustomDraw_Release(INameSpaceTreeControlCustomDraw* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeControlCustomDraw methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControlCustomDraw_PrePaint(INameSpaceTreeControlCustomDraw* This,HDC hdc,RECT *prc,LRESULT *plres) {
    return This->lpVtbl->PrePaint(This,hdc,prc,plres);
}
static FORCEINLINE HRESULT INameSpaceTreeControlCustomDraw_PostPaint(INameSpaceTreeControlCustomDraw* This,HDC hdc,RECT *prc) {
    return This->lpVtbl->PostPaint(This,hdc,prc);
}
static FORCEINLINE HRESULT INameSpaceTreeControlCustomDraw_ItemPrePaint(INameSpaceTreeControlCustomDraw* This,HDC hdc,RECT *prc,NSTCCUSTOMDRAW *pnstccdItem,COLORREF *pclrText,COLORREF *pclrTextBk,LRESULT *plres) {
    return This->lpVtbl->ItemPrePaint(This,hdc,prc,pnstccdItem,pclrText,pclrTextBk,plres);
}
static FORCEINLINE HRESULT INameSpaceTreeControlCustomDraw_ItemPostPaint(INameSpaceTreeControlCustomDraw* This,HDC hdc,RECT *prc,NSTCCUSTOMDRAW *pnstccdItem) {
    return This->lpVtbl->ItemPostPaint(This,hdc,prc,pnstccdItem);
}
#endif
#endif

#endif


#endif  /* __INameSpaceTreeControlCustomDraw_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_VISTA
/*****************************************************************************
 * INameSpaceTreeControlFolderCapabilities interface
 */
#ifndef __INameSpaceTreeControlFolderCapabilities_INTERFACE_DEFINED__
#define __INameSpaceTreeControlFolderCapabilities_INTERFACE_DEFINED__

typedef enum NSTCFOLDERCAPABILITIES {
    NSTCFC_NONE = 0x0,
    NSTCFC_PINNEDITEMFILTERING = 0x1,
    NSTCFC_DELAY_REGISTER_NOTIFY = 0x2
} NSTCFOLDERCAPABILITIES;

DEFINE_ENUM_FLAG_OPERATORS(NSTCFOLDERCAPABILITIES)

DEFINE_GUID(IID_INameSpaceTreeControlFolderCapabilities, 0xe9701183, 0xe6b3, 0x4ff2, 0x85,0x68, 0x81,0x36,0x15,0xfe,0xc7,0xbe);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e9701183-e6b3-4ff2-8568-813615fec7be")
INameSpaceTreeControlFolderCapabilities : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetFolderCapabilities(
        NSTCFOLDERCAPABILITIES nfcMask,
        NSTCFOLDERCAPABILITIES *pnfcValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INameSpaceTreeControlFolderCapabilities, 0xe9701183, 0xe6b3, 0x4ff2, 0x85,0x68, 0x81,0x36,0x15,0xfe,0xc7,0xbe)
#endif
#else
typedef struct INameSpaceTreeControlFolderCapabilitiesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INameSpaceTreeControlFolderCapabilities *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INameSpaceTreeControlFolderCapabilities *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INameSpaceTreeControlFolderCapabilities *This);

    /*** INameSpaceTreeControlFolderCapabilities methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFolderCapabilities)(
        INameSpaceTreeControlFolderCapabilities *This,
        NSTCFOLDERCAPABILITIES nfcMask,
        NSTCFOLDERCAPABILITIES *pnfcValue);

    END_INTERFACE
} INameSpaceTreeControlFolderCapabilitiesVtbl;

interface INameSpaceTreeControlFolderCapabilities {
    CONST_VTBL INameSpaceTreeControlFolderCapabilitiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INameSpaceTreeControlFolderCapabilities_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INameSpaceTreeControlFolderCapabilities_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INameSpaceTreeControlFolderCapabilities_Release(This) (This)->lpVtbl->Release(This)
/*** INameSpaceTreeControlFolderCapabilities methods ***/
#define INameSpaceTreeControlFolderCapabilities_GetFolderCapabilities(This,nfcMask,pnfcValue) (This)->lpVtbl->GetFolderCapabilities(This,nfcMask,pnfcValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControlFolderCapabilities_QueryInterface(INameSpaceTreeControlFolderCapabilities* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INameSpaceTreeControlFolderCapabilities_AddRef(INameSpaceTreeControlFolderCapabilities* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INameSpaceTreeControlFolderCapabilities_Release(INameSpaceTreeControlFolderCapabilities* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeControlFolderCapabilities methods ***/
static FORCEINLINE HRESULT INameSpaceTreeControlFolderCapabilities_GetFolderCapabilities(INameSpaceTreeControlFolderCapabilities* This,NSTCFOLDERCAPABILITIES nfcMask,NSTCFOLDERCAPABILITIES *pnfcValue) {
    return This->lpVtbl->GetFolderCapabilities(This,nfcMask,pnfcValue);
}
#endif
#endif

#endif


#endif  /* __INameSpaceTreeControlFolderCapabilities_INTERFACE_DEFINED__ */

#endif

#define E_PREVIEWHANDLER_DRM_FAIL _HRESULT_TYPEDEF_(0x86420001L)
#define E_PREVIEWHANDLER_NOAUTH   _HRESULT_TYPEDEF_(0x86420002L)
#define E_PREVIEWHANDLER_NOTFOUND _HRESULT_TYPEDEF_(0x86420003L)
#define E_PREVIEWHANDLER_CORRUPT  _HRESULT_TYPEDEF_(0x86420004L)

/*****************************************************************************
 * IPreviewHandler interface
 */
#ifndef __IPreviewHandler_INTERFACE_DEFINED__
#define __IPreviewHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPreviewHandler, 0x8895b1c6, 0xb41f, 0x4c1c, 0xa5,0x62, 0x0d,0x56,0x42,0x50,0x83,0x6f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8895b1c6-b41f-4c1c-a562-0d564250836f")
IPreviewHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetWindow(
        HWND hwnd,
        const RECT *prc) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRect(
        const RECT *prc) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoPreview(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unload(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFocus(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryFocus(
        HWND *phwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(
        MSG *pmsg) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPreviewHandler, 0x8895b1c6, 0xb41f, 0x4c1c, 0xa5,0x62, 0x0d,0x56,0x42,0x50,0x83,0x6f)
#endif
#else
typedef struct IPreviewHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPreviewHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPreviewHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPreviewHandler *This);

    /*** IPreviewHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *SetWindow)(
        IPreviewHandler *This,
        HWND hwnd,
        const RECT *prc);

    HRESULT (STDMETHODCALLTYPE *SetRect)(
        IPreviewHandler *This,
        const RECT *prc);

    HRESULT (STDMETHODCALLTYPE *DoPreview)(
        IPreviewHandler *This);

    HRESULT (STDMETHODCALLTYPE *Unload)(
        IPreviewHandler *This);

    HRESULT (STDMETHODCALLTYPE *SetFocus)(
        IPreviewHandler *This);

    HRESULT (STDMETHODCALLTYPE *QueryFocus)(
        IPreviewHandler *This,
        HWND *phwnd);

    HRESULT (STDMETHODCALLTYPE *TranslateAccelerator)(
        IPreviewHandler *This,
        MSG *pmsg);

    END_INTERFACE
} IPreviewHandlerVtbl;

interface IPreviewHandler {
    CONST_VTBL IPreviewHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPreviewHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPreviewHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPreviewHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IPreviewHandler methods ***/
#define IPreviewHandler_SetWindow(This,hwnd,prc) (This)->lpVtbl->SetWindow(This,hwnd,prc)
#define IPreviewHandler_SetRect(This,prc) (This)->lpVtbl->SetRect(This,prc)
#define IPreviewHandler_DoPreview(This) (This)->lpVtbl->DoPreview(This)
#define IPreviewHandler_Unload(This) (This)->lpVtbl->Unload(This)
#define IPreviewHandler_SetFocus(This) (This)->lpVtbl->SetFocus(This)
#define IPreviewHandler_QueryFocus(This,phwnd) (This)->lpVtbl->QueryFocus(This,phwnd)
#define IPreviewHandler_TranslateAccelerator(This,pmsg) (This)->lpVtbl->TranslateAccelerator(This,pmsg)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPreviewHandler_QueryInterface(IPreviewHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPreviewHandler_AddRef(IPreviewHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPreviewHandler_Release(IPreviewHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IPreviewHandler methods ***/
static FORCEINLINE HRESULT IPreviewHandler_SetWindow(IPreviewHandler* This,HWND hwnd,const RECT *prc) {
    return This->lpVtbl->SetWindow(This,hwnd,prc);
}
static FORCEINLINE HRESULT IPreviewHandler_SetRect(IPreviewHandler* This,const RECT *prc) {
    return This->lpVtbl->SetRect(This,prc);
}
static FORCEINLINE HRESULT IPreviewHandler_DoPreview(IPreviewHandler* This) {
    return This->lpVtbl->DoPreview(This);
}
static FORCEINLINE HRESULT IPreviewHandler_Unload(IPreviewHandler* This) {
    return This->lpVtbl->Unload(This);
}
static FORCEINLINE HRESULT IPreviewHandler_SetFocus(IPreviewHandler* This) {
    return This->lpVtbl->SetFocus(This);
}
static FORCEINLINE HRESULT IPreviewHandler_QueryFocus(IPreviewHandler* This,HWND *phwnd) {
    return This->lpVtbl->QueryFocus(This,phwnd);
}
static FORCEINLINE HRESULT IPreviewHandler_TranslateAccelerator(IPreviewHandler* This,MSG *pmsg) {
    return This->lpVtbl->TranslateAccelerator(This,pmsg);
}
#endif
#endif

#endif


#endif  /* __IPreviewHandler_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IPreviewHandlerFrame interface
 */
#ifndef __IPreviewHandlerFrame_INTERFACE_DEFINED__
#define __IPreviewHandlerFrame_INTERFACE_DEFINED__

typedef struct PREVIEWHANDLERFRAMEINFO {
    HACCEL haccel;
    UINT cAccelEntries;
} PREVIEWHANDLERFRAMEINFO;

DEFINE_GUID(IID_IPreviewHandlerFrame, 0xfec87aaf, 0x35f9, 0x447a, 0xad,0xb7, 0x20,0x23,0x44,0x91,0x40,0x1a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fec87aaf-35f9-447a-adb7-20234491401a")
IPreviewHandlerFrame : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetWindowContext(
        PREVIEWHANDLERFRAMEINFO *pinfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(
        MSG *pmsg) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPreviewHandlerFrame, 0xfec87aaf, 0x35f9, 0x447a, 0xad,0xb7, 0x20,0x23,0x44,0x91,0x40,0x1a)
#endif
#else
typedef struct IPreviewHandlerFrameVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPreviewHandlerFrame *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPreviewHandlerFrame *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPreviewHandlerFrame *This);

    /*** IPreviewHandlerFrame methods ***/
    HRESULT (STDMETHODCALLTYPE *GetWindowContext)(
        IPreviewHandlerFrame *This,
        PREVIEWHANDLERFRAMEINFO *pinfo);

    HRESULT (STDMETHODCALLTYPE *TranslateAccelerator)(
        IPreviewHandlerFrame *This,
        MSG *pmsg);

    END_INTERFACE
} IPreviewHandlerFrameVtbl;

interface IPreviewHandlerFrame {
    CONST_VTBL IPreviewHandlerFrameVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPreviewHandlerFrame_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPreviewHandlerFrame_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPreviewHandlerFrame_Release(This) (This)->lpVtbl->Release(This)
/*** IPreviewHandlerFrame methods ***/
#define IPreviewHandlerFrame_GetWindowContext(This,pinfo) (This)->lpVtbl->GetWindowContext(This,pinfo)
#define IPreviewHandlerFrame_TranslateAccelerator(This,pmsg) (This)->lpVtbl->TranslateAccelerator(This,pmsg)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPreviewHandlerFrame_QueryInterface(IPreviewHandlerFrame* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPreviewHandlerFrame_AddRef(IPreviewHandlerFrame* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPreviewHandlerFrame_Release(IPreviewHandlerFrame* This) {
    return This->lpVtbl->Release(This);
}
/*** IPreviewHandlerFrame methods ***/
static FORCEINLINE HRESULT IPreviewHandlerFrame_GetWindowContext(IPreviewHandlerFrame* This,PREVIEWHANDLERFRAMEINFO *pinfo) {
    return This->lpVtbl->GetWindowContext(This,pinfo);
}
static FORCEINLINE HRESULT IPreviewHandlerFrame_TranslateAccelerator(IPreviewHandlerFrame* This,MSG *pmsg) {
    return This->lpVtbl->TranslateAccelerator(This,pmsg);
}
#endif
#endif

#endif


#endif  /* __IPreviewHandlerFrame_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_VISTA
/*****************************************************************************
 * ITrayDeskBand interface
 */
#ifndef __ITrayDeskBand_INTERFACE_DEFINED__
#define __ITrayDeskBand_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITrayDeskBand, 0x6d67e846, 0x5b9c, 0x4db8, 0x9c,0xbc, 0xdd,0xe1,0x2f,0x42,0x54,0xf1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6d67e846-5b9c-4db8-9cbc-dde12f4254f1")
ITrayDeskBand : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ShowDeskBand(
        REFCLSID clsid) = 0;

    virtual HRESULT STDMETHODCALLTYPE HideDeskBand(
        REFCLSID clsid) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsDeskBandShown(
        REFCLSID clsid) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeskBandRegistrationChanged(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITrayDeskBand, 0x6d67e846, 0x5b9c, 0x4db8, 0x9c,0xbc, 0xdd,0xe1,0x2f,0x42,0x54,0xf1)
#endif
#else
typedef struct ITrayDeskBandVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITrayDeskBand *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITrayDeskBand *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITrayDeskBand *This);

    /*** ITrayDeskBand methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowDeskBand)(
        ITrayDeskBand *This,
        REFCLSID clsid);

    HRESULT (STDMETHODCALLTYPE *HideDeskBand)(
        ITrayDeskBand *This,
        REFCLSID clsid);

    HRESULT (STDMETHODCALLTYPE *IsDeskBandShown)(
        ITrayDeskBand *This,
        REFCLSID clsid);

    HRESULT (STDMETHODCALLTYPE *DeskBandRegistrationChanged)(
        ITrayDeskBand *This);

    END_INTERFACE
} ITrayDeskBandVtbl;

interface ITrayDeskBand {
    CONST_VTBL ITrayDeskBandVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITrayDeskBand_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITrayDeskBand_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITrayDeskBand_Release(This) (This)->lpVtbl->Release(This)
/*** ITrayDeskBand methods ***/
#define ITrayDeskBand_ShowDeskBand(This,clsid) (This)->lpVtbl->ShowDeskBand(This,clsid)
#define ITrayDeskBand_HideDeskBand(This,clsid) (This)->lpVtbl->HideDeskBand(This,clsid)
#define ITrayDeskBand_IsDeskBandShown(This,clsid) (This)->lpVtbl->IsDeskBandShown(This,clsid)
#define ITrayDeskBand_DeskBandRegistrationChanged(This) (This)->lpVtbl->DeskBandRegistrationChanged(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITrayDeskBand_QueryInterface(ITrayDeskBand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITrayDeskBand_AddRef(ITrayDeskBand* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITrayDeskBand_Release(ITrayDeskBand* This) {
    return This->lpVtbl->Release(This);
}
/*** ITrayDeskBand methods ***/
static FORCEINLINE HRESULT ITrayDeskBand_ShowDeskBand(ITrayDeskBand* This,REFCLSID clsid) {
    return This->lpVtbl->ShowDeskBand(This,clsid);
}
static FORCEINLINE HRESULT ITrayDeskBand_HideDeskBand(ITrayDeskBand* This,REFCLSID clsid) {
    return This->lpVtbl->HideDeskBand(This,clsid);
}
static FORCEINLINE HRESULT ITrayDeskBand_IsDeskBandShown(ITrayDeskBand* This,REFCLSID clsid) {
    return This->lpVtbl->IsDeskBandShown(This,clsid);
}
static FORCEINLINE HRESULT ITrayDeskBand_DeskBandRegistrationChanged(ITrayDeskBand* This) {
    return This->lpVtbl->DeskBandRegistrationChanged(This);
}
#endif
#endif

#endif


#endif  /* __ITrayDeskBand_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IBandHost interface
 */
#ifndef __IBandHost_INTERFACE_DEFINED__
#define __IBandHost_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBandHost, 0xb9075c7c, 0xd48e, 0x403f, 0xab,0x99, 0xd6,0xc7,0x7a,0x10,0x84,0xac);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b9075c7c-d48e-403f-ab99-d6c77a1084ac")
IBandHost : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateBand(
        REFCLSID rclsidBand,
        WINBOOL fAvailable,
        WINBOOL fVisible,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBandAvailability(
        REFCLSID rclsidBand,
        WINBOOL fAvailable) = 0;

    virtual HRESULT STDMETHODCALLTYPE DestroyBand(
        REFCLSID rclsidBand) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBandHost, 0xb9075c7c, 0xd48e, 0x403f, 0xab,0x99, 0xd6,0xc7,0x7a,0x10,0x84,0xac)
#endif
#else
typedef struct IBandHostVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IBandHost *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IBandHost *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IBandHost *This);

    /*** IBandHost methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateBand)(
        IBandHost *This,
        REFCLSID rclsidBand,
        WINBOOL fAvailable,
        WINBOOL fVisible,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *SetBandAvailability)(
        IBandHost *This,
        REFCLSID rclsidBand,
        WINBOOL fAvailable);

    HRESULT (STDMETHODCALLTYPE *DestroyBand)(
        IBandHost *This,
        REFCLSID rclsidBand);

    END_INTERFACE
} IBandHostVtbl;

interface IBandHost {
    CONST_VTBL IBandHostVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBandHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBandHost_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBandHost_Release(This) (This)->lpVtbl->Release(This)
/*** IBandHost methods ***/
#define IBandHost_CreateBand(This,rclsidBand,fAvailable,fVisible,riid,ppv) (This)->lpVtbl->CreateBand(This,rclsidBand,fAvailable,fVisible,riid,ppv)
#define IBandHost_SetBandAvailability(This,rclsidBand,fAvailable) (This)->lpVtbl->SetBandAvailability(This,rclsidBand,fAvailable)
#define IBandHost_DestroyBand(This,rclsidBand) (This)->lpVtbl->DestroyBand(This,rclsidBand)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBandHost_QueryInterface(IBandHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBandHost_AddRef(IBandHost* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBandHost_Release(IBandHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IBandHost methods ***/
static FORCEINLINE HRESULT IBandHost_CreateBand(IBandHost* This,REFCLSID rclsidBand,WINBOOL fAvailable,WINBOOL fVisible,REFIID riid,void **ppv) {
    return This->lpVtbl->CreateBand(This,rclsidBand,fAvailable,fVisible,riid,ppv);
}
static FORCEINLINE HRESULT IBandHost_SetBandAvailability(IBandHost* This,REFCLSID rclsidBand,WINBOOL fAvailable) {
    return This->lpVtbl->SetBandAvailability(This,rclsidBand,fAvailable);
}
static FORCEINLINE HRESULT IBandHost_DestroyBand(IBandHost* This,REFCLSID rclsidBand) {
    return This->lpVtbl->DestroyBand(This,rclsidBand);
}
#endif
#endif

#endif


#endif  /* __IBandHost_INTERFACE_DEFINED__ */


#define SID_SBandHost IID_IBandHost

typedef GUID EXPLORERPANE;

#if 0
typedef EXPLORERPANE *REFEXPLORERPANE;
#endif

#ifdef __cplusplus
#define REFEXPLORERPANE const EXPLORERPANE &
#else
#define REFEXPLORERPANE const EXPLORERPANE * __MIDL_CONST
#endif

/*****************************************************************************
 * IExplorerPaneVisibility interface
 */
#ifndef __IExplorerPaneVisibility_INTERFACE_DEFINED__
#define __IExplorerPaneVisibility_INTERFACE_DEFINED__

enum _EXPLORERPANESTATE {
    EPS_DONTCARE = 0x0,
    EPS_DEFAULT_ON = 0x1,
    EPS_DEFAULT_OFF = 0x2,
    EPS_STATEMASK = 0xffff,
    EPS_INITIALSTATE = 0x10000,
    EPS_FORCE = 0x20000
};

typedef DWORD EXPLORERPANESTATE;

DEFINE_GUID(IID_IExplorerPaneVisibility, 0xe07010ec, 0xbc17, 0x44c0, 0x97,0xb0, 0x46,0xc7,0xc9,0x5b,0x9e,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e07010ec-bc17-44c0-97b0-46c7c95b9edc")
IExplorerPaneVisibility : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPaneState(
        REFEXPLORERPANE ep,
        EXPLORERPANESTATE *peps) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExplorerPaneVisibility, 0xe07010ec, 0xbc17, 0x44c0, 0x97,0xb0, 0x46,0xc7,0xc9,0x5b,0x9e,0xdc)
#endif
#else
typedef struct IExplorerPaneVisibilityVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IExplorerPaneVisibility *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IExplorerPaneVisibility *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IExplorerPaneVisibility *This);

    /*** IExplorerPaneVisibility methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPaneState)(
        IExplorerPaneVisibility *This,
        REFEXPLORERPANE ep,
        EXPLORERPANESTATE *peps);

    END_INTERFACE
} IExplorerPaneVisibilityVtbl;

interface IExplorerPaneVisibility {
    CONST_VTBL IExplorerPaneVisibilityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExplorerPaneVisibility_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExplorerPaneVisibility_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExplorerPaneVisibility_Release(This) (This)->lpVtbl->Release(This)
/*** IExplorerPaneVisibility methods ***/
#define IExplorerPaneVisibility_GetPaneState(This,ep,peps) (This)->lpVtbl->GetPaneState(This,ep,peps)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IExplorerPaneVisibility_QueryInterface(IExplorerPaneVisibility* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IExplorerPaneVisibility_AddRef(IExplorerPaneVisibility* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IExplorerPaneVisibility_Release(IExplorerPaneVisibility* This) {
    return This->lpVtbl->Release(This);
}
/*** IExplorerPaneVisibility methods ***/
static FORCEINLINE HRESULT IExplorerPaneVisibility_GetPaneState(IExplorerPaneVisibility* This,REFEXPLORERPANE ep,EXPLORERPANESTATE *peps) {
    return This->lpVtbl->GetPaneState(This,ep,peps);
}
#endif
#endif

#endif


#endif  /* __IExplorerPaneVisibility_INTERFACE_DEFINED__ */


#define SID_ExplorerPaneVisibility IID_IExplorerPaneVisibility

/*****************************************************************************
 * IContextMenuCB interface
 */
#ifndef __IContextMenuCB_INTERFACE_DEFINED__
#define __IContextMenuCB_INTERFACE_DEFINED__

DEFINE_GUID(IID_IContextMenuCB, 0x3409e930, 0x5a39, 0x11d1, 0x83,0xfa, 0x00,0xa0,0xc9,0x0d,0xc8,0x49);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3409e930-5a39-11d1-83fa-00a0c90dc849")
IContextMenuCB : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CallBack(
        IShellFolder *psf,
        HWND hwndOwner,
        IDataObject *pdtobj,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IContextMenuCB, 0x3409e930, 0x5a39, 0x11d1, 0x83,0xfa, 0x00,0xa0,0xc9,0x0d,0xc8,0x49)
#endif
#else
typedef struct IContextMenuCBVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IContextMenuCB *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IContextMenuCB *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IContextMenuCB *This);

    /*** IContextMenuCB methods ***/
    HRESULT (STDMETHODCALLTYPE *CallBack)(
        IContextMenuCB *This,
        IShellFolder *psf,
        HWND hwndOwner,
        IDataObject *pdtobj,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam);

    END_INTERFACE
} IContextMenuCBVtbl;

interface IContextMenuCB {
    CONST_VTBL IContextMenuCBVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IContextMenuCB_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IContextMenuCB_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IContextMenuCB_Release(This) (This)->lpVtbl->Release(This)
/*** IContextMenuCB methods ***/
#define IContextMenuCB_CallBack(This,psf,hwndOwner,pdtobj,uMsg,wParam,lParam) (This)->lpVtbl->CallBack(This,psf,hwndOwner,pdtobj,uMsg,wParam,lParam)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IContextMenuCB_QueryInterface(IContextMenuCB* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IContextMenuCB_AddRef(IContextMenuCB* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IContextMenuCB_Release(IContextMenuCB* This) {
    return This->lpVtbl->Release(This);
}
/*** IContextMenuCB methods ***/
static FORCEINLINE HRESULT IContextMenuCB_CallBack(IContextMenuCB* This,IShellFolder *psf,HWND hwndOwner,IDataObject *pdtobj,UINT uMsg,WPARAM wParam,LPARAM lParam) {
    return This->lpVtbl->CallBack(This,psf,hwndOwner,pdtobj,uMsg,wParam,lParam);
}
#endif
#endif

#endif


#endif  /* __IContextMenuCB_INTERFACE_DEFINED__ */

#endif

/*****************************************************************************
 * IDefaultExtractIconInit interface
 */
#ifndef __IDefaultExtractIconInit_INTERFACE_DEFINED__
#define __IDefaultExtractIconInit_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDefaultExtractIconInit, 0x41ded17d, 0xd6b3, 0x4261, 0x99,0x7d, 0x88,0xc6,0x0e,0x4b,0x1d,0x58);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("41ded17d-d6b3-4261-997d-88c60e4b1d58")
IDefaultExtractIconInit : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetFlags(
        UINT uFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetKey(
        HKEY hkey) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetNormalIcon(
        LPCWSTR pszFile,
        int iIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOpenIcon(
        LPCWSTR pszFile,
        int iIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetShortcutIcon(
        LPCWSTR pszFile,
        int iIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultIcon(
        LPCWSTR pszFile,
        int iIcon) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDefaultExtractIconInit, 0x41ded17d, 0xd6b3, 0x4261, 0x99,0x7d, 0x88,0xc6,0x0e,0x4b,0x1d,0x58)
#endif
#else
typedef struct IDefaultExtractIconInitVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDefaultExtractIconInit *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDefaultExtractIconInit *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDefaultExtractIconInit *This);

    /*** IDefaultExtractIconInit methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFlags)(
        IDefaultExtractIconInit *This,
        UINT uFlags);

    HRESULT (STDMETHODCALLTYPE *SetKey)(
        IDefaultExtractIconInit *This,
        HKEY hkey);

    HRESULT (STDMETHODCALLTYPE *SetNormalIcon)(
        IDefaultExtractIconInit *This,
        LPCWSTR pszFile,
        int iIcon);

    HRESULT (STDMETHODCALLTYPE *SetOpenIcon)(
        IDefaultExtractIconInit *This,
        LPCWSTR pszFile,
        int iIcon);

    HRESULT (STDMETHODCALLTYPE *SetShortcutIcon)(
        IDefaultExtractIconInit *This,
        LPCWSTR pszFile,
        int iIcon);

    HRESULT (STDMETHODCALLTYPE *SetDefaultIcon)(
        IDefaultExtractIconInit *This,
        LPCWSTR pszFile,
        int iIcon);

    END_INTERFACE
} IDefaultExtractIconInitVtbl;

interface IDefaultExtractIconInit {
    CONST_VTBL IDefaultExtractIconInitVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDefaultExtractIconInit_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDefaultExtractIconInit_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDefaultExtractIconInit_Release(This) (This)->lpVtbl->Release(This)
/*** IDefaultExtractIconInit methods ***/
#define IDefaultExtractIconInit_SetFlags(This,uFlags) (This)->lpVtbl->SetFlags(This,uFlags)
#define IDefaultExtractIconInit_SetKey(This,hkey) (This)->lpVtbl->SetKey(This,hkey)
#define IDefaultExtractIconInit_SetNormalIcon(This,pszFile,iIcon) (This)->lpVtbl->SetNormalIcon(This,pszFile,iIcon)
#define IDefaultExtractIconInit_SetOpenIcon(This,pszFile,iIcon) (This)->lpVtbl->SetOpenIcon(This,pszFile,iIcon)
#define IDefaultExtractIconInit_SetShortcutIcon(This,pszFile,iIcon) (This)->lpVtbl->SetShortcutIcon(This,pszFile,iIcon)
#define IDefaultExtractIconInit_SetDefaultIcon(This,pszFile,iIcon) (This)->lpVtbl->SetDefaultIcon(This,pszFile,iIcon)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDefaultExtractIconInit_QueryInterface(IDefaultExtractIconInit* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDefaultExtractIconInit_AddRef(IDefaultExtractIconInit* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDefaultExtractIconInit_Release(IDefaultExtractIconInit* This) {
    return This->lpVtbl->Release(This);
}
/*** IDefaultExtractIconInit methods ***/
static FORCEINLINE HRESULT IDefaultExtractIconInit_SetFlags(IDefaultExtractIconInit* This,UINT uFlags) {
    return This->lpVtbl->SetFlags(This,uFlags);
}
static FORCEINLINE HRESULT IDefaultExtractIconInit_SetKey(IDefaultExtractIconInit* This,HKEY hkey) {
    return This->lpVtbl->SetKey(This,hkey);
}
static FORCEINLINE HRESULT IDefaultExtractIconInit_SetNormalIcon(IDefaultExtractIconInit* This,LPCWSTR pszFile,int iIcon) {
    return This->lpVtbl->SetNormalIcon(This,pszFile,iIcon);
}
static FORCEINLINE HRESULT IDefaultExtractIconInit_SetOpenIcon(IDefaultExtractIconInit* This,LPCWSTR pszFile,int iIcon) {
    return This->lpVtbl->SetOpenIcon(This,pszFile,iIcon);
}
static FORCEINLINE HRESULT IDefaultExtractIconInit_SetShortcutIcon(IDefaultExtractIconInit* This,LPCWSTR pszFile,int iIcon) {
    return This->lpVtbl->SetShortcutIcon(This,pszFile,iIcon);
}
static FORCEINLINE HRESULT IDefaultExtractIconInit_SetDefaultIcon(IDefaultExtractIconInit* This,LPCWSTR pszFile,int iIcon) {
    return This->lpVtbl->SetDefaultIcon(This,pszFile,iIcon);
}
#endif
#endif

#endif


#endif  /* __IDefaultExtractIconInit_INTERFACE_DEFINED__ */


STDAPI SHCreateDefaultExtractIcon(REFIID riid, void **ppv);

#ifndef __IEnumExplorerCommand_FWD_DEFINED__
#define __IEnumExplorerCommand_FWD_DEFINED__
typedef interface IEnumExplorerCommand IEnumExplorerCommand;
#ifdef __cplusplus
interface IEnumExplorerCommand;
#endif /* __cplusplus */
#endif


/*****************************************************************************
 * IExplorerCommand interface
 */
#ifndef __IExplorerCommand_INTERFACE_DEFINED__
#define __IExplorerCommand_INTERFACE_DEFINED__

enum _EXPCMDSTATE {
    ECS_ENABLED = 0x0,
    ECS_DISABLED = 0x1,
    ECS_HIDDEN = 0x2,
    ECS_CHECKBOX = 0x4,
    ECS_CHECKED = 0x8,
    ECS_RADIOCHECK = 0x10
};

typedef DWORD EXPCMDSTATE;

enum _EXPCMDFLAGS {
    ECF_DEFAULT = 0x0,
    ECF_HASSUBCOMMANDS = 0x1,
    ECF_HASSPLITBUTTON = 0x2,
    ECF_HIDELABEL = 0x4,
    ECF_ISSEPARATOR = 0x8,
    ECF_HASLUASHIELD = 0x10,
    ECF_SEPARATORBEFORE = 0x20,
    ECF_SEPARATORAFTER = 0x40,
    ECF_ISDROPDOWN = 0x80,
    ECF_TOGGLEABLE = 0x100,
    ECF_AUTOMENUICONS = 0x200
};

typedef DWORD EXPCMDFLAGS;

DEFINE_GUID(IID_IExplorerCommand, 0xa08ce4d0, 0xfa25, 0x44ab, 0xb5,0x7c, 0xc7,0xb1,0xc3,0x23,0xe0,0xb9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a08ce4d0-fa25-44ab-b57c-c7b1c323e0b9")
IExplorerCommand : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetTitle(
        IShellItemArray *psiItemArray,
        LPWSTR *ppszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIcon(
        IShellItemArray *psiItemArray,
        LPWSTR *ppszIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetToolTip(
        IShellItemArray *psiItemArray,
        LPWSTR *ppszInfotip) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCanonicalName(
        GUID *pguidCommandName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetState(
        IShellItemArray *psiItemArray,
        WINBOOL fOkToBeSlow,
        EXPCMDSTATE *pCmdState) = 0;

    virtual HRESULT STDMETHODCALLTYPE Invoke(
        IShellItemArray *psiItemArray,
        IBindCtx *pbc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFlags(
        EXPCMDFLAGS *pFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumSubCommands(
        IEnumExplorerCommand **ppEnum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExplorerCommand, 0xa08ce4d0, 0xfa25, 0x44ab, 0xb5,0x7c, 0xc7,0xb1,0xc3,0x23,0xe0,0xb9)
#endif
#else
typedef struct IExplorerCommandVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IExplorerCommand *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IExplorerCommand *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IExplorerCommand *This);

    /*** IExplorerCommand methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTitle)(
        IExplorerCommand *This,
        IShellItemArray *psiItemArray,
        LPWSTR *ppszName);

    HRESULT (STDMETHODCALLTYPE *GetIcon)(
        IExplorerCommand *This,
        IShellItemArray *psiItemArray,
        LPWSTR *ppszIcon);

    HRESULT (STDMETHODCALLTYPE *GetToolTip)(
        IExplorerCommand *This,
        IShellItemArray *psiItemArray,
        LPWSTR *ppszInfotip);

    HRESULT (STDMETHODCALLTYPE *GetCanonicalName)(
        IExplorerCommand *This,
        GUID *pguidCommandName);

    HRESULT (STDMETHODCALLTYPE *GetState)(
        IExplorerCommand *This,
        IShellItemArray *psiItemArray,
        WINBOOL fOkToBeSlow,
        EXPCMDSTATE *pCmdState);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IExplorerCommand *This,
        IShellItemArray *psiItemArray,
        IBindCtx *pbc);

    HRESULT (STDMETHODCALLTYPE *GetFlags)(
        IExplorerCommand *This,
        EXPCMDFLAGS *pFlags);

    HRESULT (STDMETHODCALLTYPE *EnumSubCommands)(
        IExplorerCommand *This,
        IEnumExplorerCommand **ppEnum);

    END_INTERFACE
} IExplorerCommandVtbl;

interface IExplorerCommand {
    CONST_VTBL IExplorerCommandVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExplorerCommand_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExplorerCommand_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExplorerCommand_Release(This) (This)->lpVtbl->Release(This)
/*** IExplorerCommand methods ***/
#define IExplorerCommand_GetTitle(This,psiItemArray,ppszName) (This)->lpVtbl->GetTitle(This,psiItemArray,ppszName)
#define IExplorerCommand_GetIcon(This,psiItemArray,ppszIcon) (This)->lpVtbl->GetIcon(This,psiItemArray,ppszIcon)
#define IExplorerCommand_GetToolTip(This,psiItemArray,ppszInfotip) (This)->lpVtbl->GetToolTip(This,psiItemArray,ppszInfotip)
#define IExplorerCommand_GetCanonicalName(This,pguidCommandName) (This)->lpVtbl->GetCanonicalName(This,pguidCommandName)
#define IExplorerCommand_GetState(This,psiItemArray,fOkToBeSlow,pCmdState) (This)->lpVtbl->GetState(This,psiItemArray,fOkToBeSlow,pCmdState)
#define IExplorerCommand_Invoke(This,psiItemArray,pbc) (This)->lpVtbl->Invoke(This,psiItemArray,pbc)
#define IExplorerCommand_GetFlags(This,pFlags) (This)->lpVtbl->GetFlags(This,pFlags)
#define IExplorerCommand_EnumSubCommands(This,ppEnum) (This)->lpVtbl->EnumSubCommands(This,ppEnum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IExplorerCommand_QueryInterface(IExplorerCommand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IExplorerCommand_AddRef(IExplorerCommand* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IExplorerCommand_Release(IExplorerCommand* This) {
    return This->lpVtbl->Release(This);
}
/*** IExplorerCommand methods ***/
static FORCEINLINE HRESULT IExplorerCommand_GetTitle(IExplorerCommand* This,IShellItemArray *psiItemArray,LPWSTR *ppszName) {
    return This->lpVtbl->GetTitle(This,psiItemArray,ppszName);
}
static FORCEINLINE HRESULT IExplorerCommand_GetIcon(IExplorerCommand* This,IShellItemArray *psiItemArray,LPWSTR *ppszIcon) {
    return This->lpVtbl->GetIcon(This,psiItemArray,ppszIcon);
}
static FORCEINLINE HRESULT IExplorerCommand_GetToolTip(IExplorerCommand* This,IShellItemArray *psiItemArray,LPWSTR *ppszInfotip) {
    return This->lpVtbl->GetToolTip(This,psiItemArray,ppszInfotip);
}
static FORCEINLINE HRESULT IExplorerCommand_GetCanonicalName(IExplorerCommand* This,GUID *pguidCommandName) {
    return This->lpVtbl->GetCanonicalName(This,pguidCommandName);
}
static FORCEINLINE HRESULT IExplorerCommand_GetState(IExplorerCommand* This,IShellItemArray *psiItemArray,WINBOOL fOkToBeSlow,EXPCMDSTATE *pCmdState) {
    return This->lpVtbl->GetState(This,psiItemArray,fOkToBeSlow,pCmdState);
}
static FORCEINLINE HRESULT IExplorerCommand_Invoke(IExplorerCommand* This,IShellItemArray *psiItemArray,IBindCtx *pbc) {
    return This->lpVtbl->Invoke(This,psiItemArray,pbc);
}
static FORCEINLINE HRESULT IExplorerCommand_GetFlags(IExplorerCommand* This,EXPCMDFLAGS *pFlags) {
    return This->lpVtbl->GetFlags(This,pFlags);
}
static FORCEINLINE HRESULT IExplorerCommand_EnumSubCommands(IExplorerCommand* This,IEnumExplorerCommand **ppEnum) {
    return This->lpVtbl->EnumSubCommands(This,ppEnum);
}
#endif
#endif

#endif


#endif  /* __IExplorerCommand_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IExplorerCommandState interface
 */
#ifndef __IExplorerCommandState_INTERFACE_DEFINED__
#define __IExplorerCommandState_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExplorerCommandState, 0xbddacb60, 0x7657, 0x47ae, 0x84,0x45, 0xd2,0x3e,0x1a,0xcf,0x82,0xae);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bddacb60-7657-47ae-8445-d23e1acf82ae")
IExplorerCommandState : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetState(
        IShellItemArray *psiItemArray,
        WINBOOL fOkToBeSlow,
        EXPCMDSTATE *pCmdState) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExplorerCommandState, 0xbddacb60, 0x7657, 0x47ae, 0x84,0x45, 0xd2,0x3e,0x1a,0xcf,0x82,0xae)
#endif
#else
typedef struct IExplorerCommandStateVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IExplorerCommandState *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IExplorerCommandState *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IExplorerCommandState *This);

    /*** IExplorerCommandState methods ***/
    HRESULT (STDMETHODCALLTYPE *GetState)(
        IExplorerCommandState *This,
        IShellItemArray *psiItemArray,
        WINBOOL fOkToBeSlow,
        EXPCMDSTATE *pCmdState);

    END_INTERFACE
} IExplorerCommandStateVtbl;

interface IExplorerCommandState {
    CONST_VTBL IExplorerCommandStateVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExplorerCommandState_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExplorerCommandState_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExplorerCommandState_Release(This) (This)->lpVtbl->Release(This)
/*** IExplorerCommandState methods ***/
#define IExplorerCommandState_GetState(This,psiItemArray,fOkToBeSlow,pCmdState) (This)->lpVtbl->GetState(This,psiItemArray,fOkToBeSlow,pCmdState)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IExplorerCommandState_QueryInterface(IExplorerCommandState* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IExplorerCommandState_AddRef(IExplorerCommandState* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IExplorerCommandState_Release(IExplorerCommandState* This) {
    return This->lpVtbl->Release(This);
}
/*** IExplorerCommandState methods ***/
static FORCEINLINE HRESULT IExplorerCommandState_GetState(IExplorerCommandState* This,IShellItemArray *psiItemArray,WINBOOL fOkToBeSlow,EXPCMDSTATE *pCmdState) {
    return This->lpVtbl->GetState(This,psiItemArray,fOkToBeSlow,pCmdState);
}
#endif
#endif

#endif


#endif  /* __IExplorerCommandState_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IInitializeCommand interface
 */
#ifndef __IInitializeCommand_INTERFACE_DEFINED__
#define __IInitializeCommand_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInitializeCommand, 0x85075acf, 0x231f, 0x40ea, 0x96,0x10, 0xd2,0x6b,0x7b,0x58,0xf6,0x38);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("85075acf-231f-40ea-9610-d26b7b58f638")
IInitializeCommand : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        LPCWSTR pszCommandName,
        IPropertyBag *ppb) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInitializeCommand, 0x85075acf, 0x231f, 0x40ea, 0x96,0x10, 0xd2,0x6b,0x7b,0x58,0xf6,0x38)
#endif
#else
typedef struct IInitializeCommandVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInitializeCommand *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInitializeCommand *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInitializeCommand *This);

    /*** IInitializeCommand methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IInitializeCommand *This,
        LPCWSTR pszCommandName,
        IPropertyBag *ppb);

    END_INTERFACE
} IInitializeCommandVtbl;

interface IInitializeCommand {
    CONST_VTBL IInitializeCommandVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInitializeCommand_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInitializeCommand_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInitializeCommand_Release(This) (This)->lpVtbl->Release(This)
/*** IInitializeCommand methods ***/
#define IInitializeCommand_Initialize(This,pszCommandName,ppb) (This)->lpVtbl->Initialize(This,pszCommandName,ppb)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInitializeCommand_QueryInterface(IInitializeCommand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInitializeCommand_AddRef(IInitializeCommand* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInitializeCommand_Release(IInitializeCommand* This) {
    return This->lpVtbl->Release(This);
}
/*** IInitializeCommand methods ***/
static FORCEINLINE HRESULT IInitializeCommand_Initialize(IInitializeCommand* This,LPCWSTR pszCommandName,IPropertyBag *ppb) {
    return This->lpVtbl->Initialize(This,pszCommandName,ppb);
}
#endif
#endif

#endif


#endif  /* __IInitializeCommand_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IEnumExplorerCommand interface
 */
#ifndef __IEnumExplorerCommand_INTERFACE_DEFINED__
#define __IEnumExplorerCommand_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumExplorerCommand, 0xa88826f8, 0x186f, 0x4987, 0xaa,0xde, 0xea,0x0c,0xef,0x8f,0xbf,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a88826f8-186f-4987-aade-ea0cef8fbfe8")
IEnumExplorerCommand : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        IExplorerCommand **pUICommand,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumExplorerCommand **ppenum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumExplorerCommand, 0xa88826f8, 0x186f, 0x4987, 0xaa,0xde, 0xea,0x0c,0xef,0x8f,0xbf,0xe8)
#endif
#else
typedef struct IEnumExplorerCommandVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumExplorerCommand *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumExplorerCommand *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumExplorerCommand *This);

    /*** IEnumExplorerCommand methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumExplorerCommand *This,
        ULONG celt,
        IExplorerCommand **pUICommand,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumExplorerCommand *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumExplorerCommand *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumExplorerCommand *This,
        IEnumExplorerCommand **ppenum);

    END_INTERFACE
} IEnumExplorerCommandVtbl;

interface IEnumExplorerCommand {
    CONST_VTBL IEnumExplorerCommandVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumExplorerCommand_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumExplorerCommand_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumExplorerCommand_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumExplorerCommand methods ***/
#define IEnumExplorerCommand_Next(This,celt,pUICommand,pceltFetched) (This)->lpVtbl->Next(This,celt,pUICommand,pceltFetched)
#define IEnumExplorerCommand_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumExplorerCommand_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumExplorerCommand_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumExplorerCommand_QueryInterface(IEnumExplorerCommand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumExplorerCommand_AddRef(IEnumExplorerCommand* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumExplorerCommand_Release(IEnumExplorerCommand* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumExplorerCommand methods ***/
static FORCEINLINE HRESULT IEnumExplorerCommand_Next(IEnumExplorerCommand* This,ULONG celt,IExplorerCommand **pUICommand,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,pUICommand,pceltFetched);
}
static FORCEINLINE HRESULT IEnumExplorerCommand_Skip(IEnumExplorerCommand* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumExplorerCommand_Reset(IEnumExplorerCommand* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumExplorerCommand_Clone(IEnumExplorerCommand* This,IEnumExplorerCommand **ppenum) {
    return This->lpVtbl->Clone(This,ppenum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEnumExplorerCommand_RemoteNext_Proxy(
    IEnumExplorerCommand* This,
    ULONG celt,
    IExplorerCommand **pUICommand,
    ULONG *pceltFetched);
void __RPC_STUB IEnumExplorerCommand_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumExplorerCommand_Next_Proxy(
    IEnumExplorerCommand* This,
    ULONG celt,
    IExplorerCommand **pUICommand,
    ULONG *pceltFetched);
HRESULT __RPC_STUB IEnumExplorerCommand_Next_Stub(
    IEnumExplorerCommand* This,
    ULONG celt,
    IExplorerCommand **pUICommand,
    ULONG *pceltFetched);

#endif  /* __IEnumExplorerCommand_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IExplorerCommandProvider interface
 */
#ifndef __IExplorerCommandProvider_INTERFACE_DEFINED__
#define __IExplorerCommandProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExplorerCommandProvider, 0x64961751, 0x0835, 0x43c0, 0x8f,0xfe, 0xd5,0x76,0x86,0x53,0x0e,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("64961751-0835-43c0-8ffe-d57686530e64")
IExplorerCommandProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCommands(
        IUnknown *punkSite,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCommand(
        REFGUID rguidCommandId,
        REFIID riid,
        void **ppv) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExplorerCommandProvider, 0x64961751, 0x0835, 0x43c0, 0x8f,0xfe, 0xd5,0x76,0x86,0x53,0x0e,0x64)
#endif
#else
typedef struct IExplorerCommandProviderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IExplorerCommandProvider *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IExplorerCommandProvider *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IExplorerCommandProvider *This);

    /*** IExplorerCommandProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCommands)(
        IExplorerCommandProvider *This,
        IUnknown *punkSite,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetCommand)(
        IExplorerCommandProvider *This,
        REFGUID rguidCommandId,
        REFIID riid,
        void **ppv);

    END_INTERFACE
} IExplorerCommandProviderVtbl;

interface IExplorerCommandProvider {
    CONST_VTBL IExplorerCommandProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExplorerCommandProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExplorerCommandProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExplorerCommandProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IExplorerCommandProvider methods ***/
#define IExplorerCommandProvider_GetCommands(This,punkSite,riid,ppv) (This)->lpVtbl->GetCommands(This,punkSite,riid,ppv)
#define IExplorerCommandProvider_GetCommand(This,rguidCommandId,riid,ppv) (This)->lpVtbl->GetCommand(This,rguidCommandId,riid,ppv)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IExplorerCommandProvider_QueryInterface(IExplorerCommandProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IExplorerCommandProvider_AddRef(IExplorerCommandProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IExplorerCommandProvider_Release(IExplorerCommandProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IExplorerCommandProvider methods ***/
static FORCEINLINE HRESULT IExplorerCommandProvider_GetCommands(IExplorerCommandProvider* This,IUnknown *punkSite,REFIID riid,void **ppv) {
    return This->lpVtbl->GetCommands(This,punkSite,riid,ppv);
}
static FORCEINLINE HRESULT IExplorerCommandProvider_GetCommand(IExplorerCommandProvider* This,REFGUID rguidCommandId,REFIID riid,void **ppv) {
    return This->lpVtbl->GetCommand(This,rguidCommandId,riid,ppv);
}
#endif
#endif

#endif


#endif  /* __IExplorerCommandProvider_INTERFACE_DEFINED__ */


typedef HANDLE HTHEME;

/*****************************************************************************
 * IInitializeNetworkFolder interface
 */
#ifndef __IInitializeNetworkFolder_INTERFACE_DEFINED__
#define __IInitializeNetworkFolder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInitializeNetworkFolder, 0x6e0f9881, 0x42a8, 0x4f2a, 0x97,0xf8, 0x8a,0xf4,0xe0,0x26,0xd9,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6e0f9881-42a8-4f2a-97f8-8af4e026d92d")
IInitializeNetworkFolder : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        PCIDLIST_ABSOLUTE pidl,
        PCIDLIST_ABSOLUTE pidlTarget,
        UINT uDisplayType,
        LPCWSTR pszResName,
        LPCWSTR pszProvider) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInitializeNetworkFolder, 0x6e0f9881, 0x42a8, 0x4f2a, 0x97,0xf8, 0x8a,0xf4,0xe0,0x26,0xd9,0x2d)
#endif
#else
typedef struct IInitializeNetworkFolderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInitializeNetworkFolder *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInitializeNetworkFolder *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInitializeNetworkFolder *This);

    /*** IInitializeNetworkFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IInitializeNetworkFolder *This,
        PCIDLIST_ABSOLUTE pidl,
        PCIDLIST_ABSOLUTE pidlTarget,
        UINT uDisplayType,
        LPCWSTR pszResName,
        LPCWSTR pszProvider);

    END_INTERFACE
} IInitializeNetworkFolderVtbl;

interface IInitializeNetworkFolder {
    CONST_VTBL IInitializeNetworkFolderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInitializeNetworkFolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInitializeNetworkFolder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInitializeNetworkFolder_Release(This) (This)->lpVtbl->Release(This)
/*** IInitializeNetworkFolder methods ***/
#define IInitializeNetworkFolder_Initialize(This,pidl,pidlTarget,uDisplayType,pszResName,pszProvider) (This)->lpVtbl->Initialize(This,pidl,pidlTarget,uDisplayType,pszResName,pszProvider)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInitializeNetworkFolder_QueryInterface(IInitializeNetworkFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInitializeNetworkFolder_AddRef(IInitializeNetworkFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInitializeNetworkFolder_Release(IInitializeNetworkFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IInitializeNetworkFolder methods ***/
static FORCEINLINE HRESULT IInitializeNetworkFolder_Initialize(IInitializeNetworkFolder* This,PCIDLIST_ABSOLUTE pidl,PCIDLIST_ABSOLUTE pidlTarget,UINT uDisplayType,LPCWSTR pszResName,LPCWSTR pszProvider) {
    return This->lpVtbl->Initialize(This,pidl,pidlTarget,uDisplayType,pszResName,pszProvider);
}
#endif
#endif

#endif


#endif  /* __IInitializeNetworkFolder_INTERFACE_DEFINED__ */


typedef enum CPVIEW {
    CPVIEW_CLASSIC = 0,
    CPVIEW_ALLITEMS = CPVIEW_CLASSIC,
    CPVIEW_CATEGORY = 1,
    CPVIEW_HOME = CPVIEW_CATEGORY
} CPVIEW;

/*****************************************************************************
 * IOpenControlPanel interface
 */
#ifndef __IOpenControlPanel_INTERFACE_DEFINED__
#define __IOpenControlPanel_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpenControlPanel, 0xd11ad862, 0x66de, 0x4df4, 0xbf,0x6c, 0x1f,0x56,0x21,0x99,0x6a,0xf1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d11ad862-66de-4df4-bf6c-1f5621996af1")
IOpenControlPanel : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Open(
        LPCWSTR pszName,
        LPCWSTR pszPage,
        IUnknown *punkSite) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPath(
        LPCWSTR pszName,
        LPWSTR pszPath,
        UINT cchPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentView(
        CPVIEW *pView) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpenControlPanel, 0xd11ad862, 0x66de, 0x4df4, 0xbf,0x6c, 0x1f,0x56,0x21,0x99,0x6a,0xf1)
#endif
#else
typedef struct IOpenControlPanelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IOpenControlPanel *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IOpenControlPanel *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IOpenControlPanel *This);

    /*** IOpenControlPanel methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IOpenControlPanel *This,
        LPCWSTR pszName,
        LPCWSTR pszPage,
        IUnknown *punkSite);

    HRESULT (STDMETHODCALLTYPE *GetPath)(
        IOpenControlPanel *This,
        LPCWSTR pszName,
        LPWSTR pszPath,
        UINT cchPath);

    HRESULT (STDMETHODCALLTYPE *GetCurrentView)(
        IOpenControlPanel *This,
        CPVIEW *pView);

    END_INTERFACE
} IOpenControlPanelVtbl;

interface IOpenControlPanel {
    CONST_VTBL IOpenControlPanelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpenControlPanel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpenControlPanel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpenControlPanel_Release(This) (This)->lpVtbl->Release(This)
/*** IOpenControlPanel methods ***/
#define IOpenControlPanel_Open(This,pszName,pszPage,punkSite) (This)->lpVtbl->Open(This,pszName,pszPage,punkSite)
#define IOpenControlPanel_GetPath(This,pszName,pszPath,cchPath) (This)->lpVtbl->GetPath(This,pszName,pszPath,cchPath)
#define IOpenControlPanel_GetCurrentView(This,pView) (This)->lpVtbl->GetCurrentView(This,pView)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpenControlPanel_QueryInterface(IOpenControlPanel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpenControlPanel_AddRef(IOpenControlPanel* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpenControlPanel_Release(IOpenControlPanel* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpenControlPanel methods ***/
static FORCEINLINE HRESULT IOpenControlPanel_Open(IOpenControlPanel* This,LPCWSTR pszName,LPCWSTR pszPage,IUnknown *punkSite) {
    return This->lpVtbl->Open(This,pszName,pszPage,punkSite);
}
static FORCEINLINE HRESULT IOpenControlPanel_GetPath(IOpenControlPanel* This,LPCWSTR pszName,LPWSTR pszPath,UINT cchPath) {
    return This->lpVtbl->GetPath(This,pszName,pszPath,cchPath);
}
static FORCEINLINE HRESULT IOpenControlPanel_GetCurrentView(IOpenControlPanel* This,CPVIEW *pView) {
    return This->lpVtbl->GetCurrentView(This,pView);
}
#endif
#endif

#endif


#endif  /* __IOpenControlPanel_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IComputerInfoChangeNotify interface
 */
#ifndef __IComputerInfoChangeNotify_INTERFACE_DEFINED__
#define __IComputerInfoChangeNotify_INTERFACE_DEFINED__

DEFINE_GUID(IID_IComputerInfoChangeNotify, 0x0df60d92, 0x6818, 0x46d6, 0xb3,0x58, 0xd6,0x61,0x70,0xdd,0xe4,0x66);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0df60d92-6818-46d6-b358-d66170dde466")
IComputerInfoChangeNotify : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ComputerInfoChanged(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IComputerInfoChangeNotify, 0x0df60d92, 0x6818, 0x46d6, 0xb3,0x58, 0xd6,0x61,0x70,0xdd,0xe4,0x66)
#endif
#else
typedef struct IComputerInfoChangeNotifyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IComputerInfoChangeNotify *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IComputerInfoChangeNotify *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IComputerInfoChangeNotify *This);

    /*** IComputerInfoChangeNotify methods ***/
    HRESULT (STDMETHODCALLTYPE *ComputerInfoChanged)(
        IComputerInfoChangeNotify *This);

    END_INTERFACE
} IComputerInfoChangeNotifyVtbl;

interface IComputerInfoChangeNotify {
    CONST_VTBL IComputerInfoChangeNotifyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IComputerInfoChangeNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComputerInfoChangeNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComputerInfoChangeNotify_Release(This) (This)->lpVtbl->Release(This)
/*** IComputerInfoChangeNotify methods ***/
#define IComputerInfoChangeNotify_ComputerInfoChanged(This) (This)->lpVtbl->ComputerInfoChanged(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IComputerInfoChangeNotify_QueryInterface(IComputerInfoChangeNotify* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IComputerInfoChangeNotify_AddRef(IComputerInfoChangeNotify* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IComputerInfoChangeNotify_Release(IComputerInfoChangeNotify* This) {
    return This->lpVtbl->Release(This);
}
/*** IComputerInfoChangeNotify methods ***/
static FORCEINLINE HRESULT IComputerInfoChangeNotify_ComputerInfoChanged(IComputerInfoChangeNotify* This) {
    return This->lpVtbl->ComputerInfoChanged(This);
}
#endif
#endif

#endif


#endif  /* __IComputerInfoChangeNotify_INTERFACE_DEFINED__ */


#define STR_FILE_SYS_BIND_DATA L"File System Bind Data"

/*****************************************************************************
 * IFileSystemBindData interface
 */
#ifndef __IFileSystemBindData_INTERFACE_DEFINED__
#define __IFileSystemBindData_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFileSystemBindData, 0x01e18d10, 0x4d8b, 0x11d2, 0x85,0x5d, 0x00,0x60,0x08,0x05,0x93,0x67);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("01e18d10-4d8b-11d2-855d-006008059367")
IFileSystemBindData : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetFindData(
        const WIN32_FIND_DATAW *pfd) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFindData(
        WIN32_FIND_DATAW *pfd) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileSystemBindData, 0x01e18d10, 0x4d8b, 0x11d2, 0x85,0x5d, 0x00,0x60,0x08,0x05,0x93,0x67)
#endif
#else
typedef struct IFileSystemBindDataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFileSystemBindData *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFileSystemBindData *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFileSystemBindData *This);

    /*** IFileSystemBindData methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFindData)(
        IFileSystemBindData *This,
        const WIN32_FIND_DATAW *pfd);

    HRESULT (STDMETHODCALLTYPE *GetFindData)(
        IFileSystemBindData *This,
        WIN32_FIND_DATAW *pfd);

    END_INTERFACE
} IFileSystemBindDataVtbl;

interface IFileSystemBindData {
    CONST_VTBL IFileSystemBindDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileSystemBindData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileSystemBindData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileSystemBindData_Release(This) (This)->lpVtbl->Release(This)
/*** IFileSystemBindData methods ***/
#define IFileSystemBindData_SetFindData(This,pfd) (This)->lpVtbl->SetFindData(This,pfd)
#define IFileSystemBindData_GetFindData(This,pfd) (This)->lpVtbl->GetFindData(This,pfd)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFileSystemBindData_QueryInterface(IFileSystemBindData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFileSystemBindData_AddRef(IFileSystemBindData* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFileSystemBindData_Release(IFileSystemBindData* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileSystemBindData methods ***/
static FORCEINLINE HRESULT IFileSystemBindData_SetFindData(IFileSystemBindData* This,const WIN32_FIND_DATAW *pfd) {
    return This->lpVtbl->SetFindData(This,pfd);
}
static FORCEINLINE HRESULT IFileSystemBindData_GetFindData(IFileSystemBindData* This,WIN32_FIND_DATAW *pfd) {
    return This->lpVtbl->GetFindData(This,pfd);
}
#endif
#endif

#endif


#endif  /* __IFileSystemBindData_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IFileSystemBindData2 interface
 */
#ifndef __IFileSystemBindData2_INTERFACE_DEFINED__
#define __IFileSystemBindData2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFileSystemBindData2, 0x3acf075f, 0x71db, 0x4afa, 0x81,0xf0, 0x3f,0xc4,0xfd,0xf2,0xa5,0xb8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3acf075f-71db-4afa-81f0-3fc4fdf2a5b8")
IFileSystemBindData2 : public IFileSystemBindData
{
    virtual HRESULT STDMETHODCALLTYPE SetFileID(
        LARGE_INTEGER liFileID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileID(
        LARGE_INTEGER *pliFileID) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetJunctionCLSID(
        REFCLSID clsid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetJunctionCLSID(
        CLSID *pclsid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFileSystemBindData2, 0x3acf075f, 0x71db, 0x4afa, 0x81,0xf0, 0x3f,0xc4,0xfd,0xf2,0xa5,0xb8)
#endif
#else
typedef struct IFileSystemBindData2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFileSystemBindData2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFileSystemBindData2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFileSystemBindData2 *This);

    /*** IFileSystemBindData methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFindData)(
        IFileSystemBindData2 *This,
        const WIN32_FIND_DATAW *pfd);

    HRESULT (STDMETHODCALLTYPE *GetFindData)(
        IFileSystemBindData2 *This,
        WIN32_FIND_DATAW *pfd);

    /*** IFileSystemBindData2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFileID)(
        IFileSystemBindData2 *This,
        LARGE_INTEGER liFileID);

    HRESULT (STDMETHODCALLTYPE *GetFileID)(
        IFileSystemBindData2 *This,
        LARGE_INTEGER *pliFileID);

    HRESULT (STDMETHODCALLTYPE *SetJunctionCLSID)(
        IFileSystemBindData2 *This,
        REFCLSID clsid);

    HRESULT (STDMETHODCALLTYPE *GetJunctionCLSID)(
        IFileSystemBindData2 *This,
        CLSID *pclsid);

    END_INTERFACE
} IFileSystemBindData2Vtbl;

interface IFileSystemBindData2 {
    CONST_VTBL IFileSystemBindData2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFileSystemBindData2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFileSystemBindData2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFileSystemBindData2_Release(This) (This)->lpVtbl->Release(This)
/*** IFileSystemBindData methods ***/
#define IFileSystemBindData2_SetFindData(This,pfd) (This)->lpVtbl->SetFindData(This,pfd)
#define IFileSystemBindData2_GetFindData(This,pfd) (This)->lpVtbl->GetFindData(This,pfd)
/*** IFileSystemBindData2 methods ***/
#define IFileSystemBindData2_SetFileID(This,liFileID) (This)->lpVtbl->SetFileID(This,liFileID)
#define IFileSystemBindData2_GetFileID(This,pliFileID) (This)->lpVtbl->GetFileID(This,pliFileID)
#define IFileSystemBindData2_SetJunctionCLSID(This,clsid) (This)->lpVtbl->SetJunctionCLSID(This,clsid)
#define IFileSystemBindData2_GetJunctionCLSID(This,pclsid) (This)->lpVtbl->GetJunctionCLSID(This,pclsid)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFileSystemBindData2_QueryInterface(IFileSystemBindData2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFileSystemBindData2_AddRef(IFileSystemBindData2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFileSystemBindData2_Release(IFileSystemBindData2* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileSystemBindData methods ***/
static FORCEINLINE HRESULT IFileSystemBindData2_SetFindData(IFileSystemBindData2* This,const WIN32_FIND_DATAW *pfd) {
    return This->lpVtbl->SetFindData(This,pfd);
}
static FORCEINLINE HRESULT IFileSystemBindData2_GetFindData(IFileSystemBindData2* This,WIN32_FIND_DATAW *pfd) {
    return This->lpVtbl->GetFindData(This,pfd);
}
/*** IFileSystemBindData2 methods ***/
static FORCEINLINE HRESULT IFileSystemBindData2_SetFileID(IFileSystemBindData2* This,LARGE_INTEGER liFileID) {
    return This->lpVtbl->SetFileID(This,liFileID);
}
static FORCEINLINE HRESULT IFileSystemBindData2_GetFileID(IFileSystemBindData2* This,LARGE_INTEGER *pliFileID) {
    return This->lpVtbl->GetFileID(This,pliFileID);
}
static FORCEINLINE HRESULT IFileSystemBindData2_SetJunctionCLSID(IFileSystemBindData2* This,REFCLSID clsid) {
    return This->lpVtbl->SetJunctionCLSID(This,clsid);
}
static FORCEINLINE HRESULT IFileSystemBindData2_GetJunctionCLSID(IFileSystemBindData2* This,CLSID *pclsid) {
    return This->lpVtbl->GetJunctionCLSID(This,pclsid);
}
#endif
#endif

#endif


#endif  /* __IFileSystemBindData2_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_WIN7
/*****************************************************************************
 * ICustomDestinationList interface
 */
#ifndef __ICustomDestinationList_INTERFACE_DEFINED__
#define __ICustomDestinationList_INTERFACE_DEFINED__

typedef enum KNOWNDESTCATEGORY {
    KDC_FREQUENT = 1,
    KDC_RECENT = 2
} KNOWNDESTCATEGORY;

DEFINE_GUID(IID_ICustomDestinationList, 0x6332debf, 0x87b5, 0x4670, 0x90,0xc0, 0x5e,0x57,0xb4,0x08,0xa4,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6332debf-87b5-4670-90c0-5e57b408a49e")
ICustomDestinationList : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetAppID(
        LPCWSTR pszAppID) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginList(
        UINT *pcMinSlots,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE AppendCategory(
        LPCWSTR pszCategory,
        IObjectArray *poa) = 0;

    virtual HRESULT STDMETHODCALLTYPE AppendKnownCategory(
        KNOWNDESTCATEGORY category) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddUserTasks(
        IObjectArray *poa) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitList(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRemovedDestinations(
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteList(
        LPCWSTR pszAppID) = 0;

    virtual HRESULT STDMETHODCALLTYPE AbortList(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICustomDestinationList, 0x6332debf, 0x87b5, 0x4670, 0x90,0xc0, 0x5e,0x57,0xb4,0x08,0xa4,0x9e)
#endif
#else
typedef struct ICustomDestinationListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICustomDestinationList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICustomDestinationList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICustomDestinationList *This);

    /*** ICustomDestinationList methods ***/
    HRESULT (STDMETHODCALLTYPE *SetAppID)(
        ICustomDestinationList *This,
        LPCWSTR pszAppID);

    HRESULT (STDMETHODCALLTYPE *BeginList)(
        ICustomDestinationList *This,
        UINT *pcMinSlots,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *AppendCategory)(
        ICustomDestinationList *This,
        LPCWSTR pszCategory,
        IObjectArray *poa);

    HRESULT (STDMETHODCALLTYPE *AppendKnownCategory)(
        ICustomDestinationList *This,
        KNOWNDESTCATEGORY category);

    HRESULT (STDMETHODCALLTYPE *AddUserTasks)(
        ICustomDestinationList *This,
        IObjectArray *poa);

    HRESULT (STDMETHODCALLTYPE *CommitList)(
        ICustomDestinationList *This);

    HRESULT (STDMETHODCALLTYPE *GetRemovedDestinations)(
        ICustomDestinationList *This,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *DeleteList)(
        ICustomDestinationList *This,
        LPCWSTR pszAppID);

    HRESULT (STDMETHODCALLTYPE *AbortList)(
        ICustomDestinationList *This);

    END_INTERFACE
} ICustomDestinationListVtbl;

interface ICustomDestinationList {
    CONST_VTBL ICustomDestinationListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICustomDestinationList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICustomDestinationList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICustomDestinationList_Release(This) (This)->lpVtbl->Release(This)
/*** ICustomDestinationList methods ***/
#define ICustomDestinationList_SetAppID(This,pszAppID) (This)->lpVtbl->SetAppID(This,pszAppID)
#define ICustomDestinationList_BeginList(This,pcMinSlots,riid,ppv) (This)->lpVtbl->BeginList(This,pcMinSlots,riid,ppv)
#define ICustomDestinationList_AppendCategory(This,pszCategory,poa) (This)->lpVtbl->AppendCategory(This,pszCategory,poa)
#define ICustomDestinationList_AppendKnownCategory(This,category) (This)->lpVtbl->AppendKnownCategory(This,category)
#define ICustomDestinationList_AddUserTasks(This,poa) (This)->lpVtbl->AddUserTasks(This,poa)
#define ICustomDestinationList_CommitList(This) (This)->lpVtbl->CommitList(This)
#define ICustomDestinationList_GetRemovedDestinations(This,riid,ppv) (This)->lpVtbl->GetRemovedDestinations(This,riid,ppv)
#define ICustomDestinationList_DeleteList(This,pszAppID) (This)->lpVtbl->DeleteList(This,pszAppID)
#define ICustomDestinationList_AbortList(This) (This)->lpVtbl->AbortList(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICustomDestinationList_QueryInterface(ICustomDestinationList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICustomDestinationList_AddRef(ICustomDestinationList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICustomDestinationList_Release(ICustomDestinationList* This) {
    return This->lpVtbl->Release(This);
}
/*** ICustomDestinationList methods ***/
static FORCEINLINE HRESULT ICustomDestinationList_SetAppID(ICustomDestinationList* This,LPCWSTR pszAppID) {
    return This->lpVtbl->SetAppID(This,pszAppID);
}
static FORCEINLINE HRESULT ICustomDestinationList_BeginList(ICustomDestinationList* This,UINT *pcMinSlots,REFIID riid,void **ppv) {
    return This->lpVtbl->BeginList(This,pcMinSlots,riid,ppv);
}
static FORCEINLINE HRESULT ICustomDestinationList_AppendCategory(ICustomDestinationList* This,LPCWSTR pszCategory,IObjectArray *poa) {
    return This->lpVtbl->AppendCategory(This,pszCategory,poa);
}
static FORCEINLINE HRESULT ICustomDestinationList_AppendKnownCategory(ICustomDestinationList* This,KNOWNDESTCATEGORY category) {
    return This->lpVtbl->AppendKnownCategory(This,category);
}
static FORCEINLINE HRESULT ICustomDestinationList_AddUserTasks(ICustomDestinationList* This,IObjectArray *poa) {
    return This->lpVtbl->AddUserTasks(This,poa);
}
static FORCEINLINE HRESULT ICustomDestinationList_CommitList(ICustomDestinationList* This) {
    return This->lpVtbl->CommitList(This);
}
static FORCEINLINE HRESULT ICustomDestinationList_GetRemovedDestinations(ICustomDestinationList* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetRemovedDestinations(This,riid,ppv);
}
static FORCEINLINE HRESULT ICustomDestinationList_DeleteList(ICustomDestinationList* This,LPCWSTR pszAppID) {
    return This->lpVtbl->DeleteList(This,pszAppID);
}
static FORCEINLINE HRESULT ICustomDestinationList_AbortList(ICustomDestinationList* This) {
    return This->lpVtbl->AbortList(This);
}
#endif
#endif

#endif


#endif  /* __ICustomDestinationList_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IApplicationDestinations interface
 */
#ifndef __IApplicationDestinations_INTERFACE_DEFINED__
#define __IApplicationDestinations_INTERFACE_DEFINED__

DEFINE_GUID(IID_IApplicationDestinations, 0x12337d35, 0x94c6, 0x48a0, 0xbc,0xe7, 0x6a,0x9c,0x69,0xd4,0xd6,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("12337d35-94c6-48a0-bce7-6a9c69d4d600")
IApplicationDestinations : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetAppID(
        LPCWSTR pszAppID) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveDestination(
        IUnknown *punk) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAllDestinations(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IApplicationDestinations, 0x12337d35, 0x94c6, 0x48a0, 0xbc,0xe7, 0x6a,0x9c,0x69,0xd4,0xd6,0x00)
#endif
#else
typedef struct IApplicationDestinationsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IApplicationDestinations *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IApplicationDestinations *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IApplicationDestinations *This);

    /*** IApplicationDestinations methods ***/
    HRESULT (STDMETHODCALLTYPE *SetAppID)(
        IApplicationDestinations *This,
        LPCWSTR pszAppID);

    HRESULT (STDMETHODCALLTYPE *RemoveDestination)(
        IApplicationDestinations *This,
        IUnknown *punk);

    HRESULT (STDMETHODCALLTYPE *RemoveAllDestinations)(
        IApplicationDestinations *This);

    END_INTERFACE
} IApplicationDestinationsVtbl;

interface IApplicationDestinations {
    CONST_VTBL IApplicationDestinationsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IApplicationDestinations_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IApplicationDestinations_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IApplicationDestinations_Release(This) (This)->lpVtbl->Release(This)
/*** IApplicationDestinations methods ***/
#define IApplicationDestinations_SetAppID(This,pszAppID) (This)->lpVtbl->SetAppID(This,pszAppID)
#define IApplicationDestinations_RemoveDestination(This,punk) (This)->lpVtbl->RemoveDestination(This,punk)
#define IApplicationDestinations_RemoveAllDestinations(This) (This)->lpVtbl->RemoveAllDestinations(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IApplicationDestinations_QueryInterface(IApplicationDestinations* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IApplicationDestinations_AddRef(IApplicationDestinations* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IApplicationDestinations_Release(IApplicationDestinations* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationDestinations methods ***/
static FORCEINLINE HRESULT IApplicationDestinations_SetAppID(IApplicationDestinations* This,LPCWSTR pszAppID) {
    return This->lpVtbl->SetAppID(This,pszAppID);
}
static FORCEINLINE HRESULT IApplicationDestinations_RemoveDestination(IApplicationDestinations* This,IUnknown *punk) {
    return This->lpVtbl->RemoveDestination(This,punk);
}
static FORCEINLINE HRESULT IApplicationDestinations_RemoveAllDestinations(IApplicationDestinations* This) {
    return This->lpVtbl->RemoveAllDestinations(This);
}
#endif
#endif

#endif


#endif  /* __IApplicationDestinations_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IApplicationDocumentLists interface
 */
#ifndef __IApplicationDocumentLists_INTERFACE_DEFINED__
#define __IApplicationDocumentLists_INTERFACE_DEFINED__

typedef enum APPDOCLISTTYPE {
    ADLT_RECENT = 0,
    ADLT_FREQUENT = 1
} APPDOCLISTTYPE;

DEFINE_GUID(IID_IApplicationDocumentLists, 0x3c594f9f, 0x9f30, 0x47a1, 0x97,0x9a, 0xc9,0xe8,0x3d,0x3d,0x0a,0x06);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3c594f9f-9f30-47a1-979a-c9e83d3d0a06")
IApplicationDocumentLists : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetAppID(
        LPCWSTR pszAppID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetList(
        APPDOCLISTTYPE listtype,
        UINT cItemsDesired,
        REFIID riid,
        void **ppv) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IApplicationDocumentLists, 0x3c594f9f, 0x9f30, 0x47a1, 0x97,0x9a, 0xc9,0xe8,0x3d,0x3d,0x0a,0x06)
#endif
#else
typedef struct IApplicationDocumentListsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IApplicationDocumentLists *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IApplicationDocumentLists *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IApplicationDocumentLists *This);

    /*** IApplicationDocumentLists methods ***/
    HRESULT (STDMETHODCALLTYPE *SetAppID)(
        IApplicationDocumentLists *This,
        LPCWSTR pszAppID);

    HRESULT (STDMETHODCALLTYPE *GetList)(
        IApplicationDocumentLists *This,
        APPDOCLISTTYPE listtype,
        UINT cItemsDesired,
        REFIID riid,
        void **ppv);

    END_INTERFACE
} IApplicationDocumentListsVtbl;

interface IApplicationDocumentLists {
    CONST_VTBL IApplicationDocumentListsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IApplicationDocumentLists_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IApplicationDocumentLists_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IApplicationDocumentLists_Release(This) (This)->lpVtbl->Release(This)
/*** IApplicationDocumentLists methods ***/
#define IApplicationDocumentLists_SetAppID(This,pszAppID) (This)->lpVtbl->SetAppID(This,pszAppID)
#define IApplicationDocumentLists_GetList(This,listtype,cItemsDesired,riid,ppv) (This)->lpVtbl->GetList(This,listtype,cItemsDesired,riid,ppv)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IApplicationDocumentLists_QueryInterface(IApplicationDocumentLists* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IApplicationDocumentLists_AddRef(IApplicationDocumentLists* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IApplicationDocumentLists_Release(IApplicationDocumentLists* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationDocumentLists methods ***/
static FORCEINLINE HRESULT IApplicationDocumentLists_SetAppID(IApplicationDocumentLists* This,LPCWSTR pszAppID) {
    return This->lpVtbl->SetAppID(This,pszAppID);
}
static FORCEINLINE HRESULT IApplicationDocumentLists_GetList(IApplicationDocumentLists* This,APPDOCLISTTYPE listtype,UINT cItemsDesired,REFIID riid,void **ppv) {
    return This->lpVtbl->GetList(This,listtype,cItemsDesired,riid,ppv);
}
#endif
#endif

#endif


#endif  /* __IApplicationDocumentLists_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IObjectWithAppUserModelID interface
 */
#ifndef __IObjectWithAppUserModelID_INTERFACE_DEFINED__
#define __IObjectWithAppUserModelID_INTERFACE_DEFINED__

DEFINE_GUID(IID_IObjectWithAppUserModelID, 0x36db0196, 0x9665, 0x46d1, 0x9b,0xa7, 0xd3,0x70,0x9e,0xec,0xf9,0xed);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("36db0196-9665-46d1-9ba7-d3709eecf9ed")
IObjectWithAppUserModelID : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetAppID(
        LPCWSTR pszAppID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAppID(
        LPWSTR *ppszAppID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IObjectWithAppUserModelID, 0x36db0196, 0x9665, 0x46d1, 0x9b,0xa7, 0xd3,0x70,0x9e,0xec,0xf9,0xed)
#endif
#else
typedef struct IObjectWithAppUserModelIDVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IObjectWithAppUserModelID *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IObjectWithAppUserModelID *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IObjectWithAppUserModelID *This);

    /*** IObjectWithAppUserModelID methods ***/
    HRESULT (STDMETHODCALLTYPE *SetAppID)(
        IObjectWithAppUserModelID *This,
        LPCWSTR pszAppID);

    HRESULT (STDMETHODCALLTYPE *GetAppID)(
        IObjectWithAppUserModelID *This,
        LPWSTR *ppszAppID);

    END_INTERFACE
} IObjectWithAppUserModelIDVtbl;

interface IObjectWithAppUserModelID {
    CONST_VTBL IObjectWithAppUserModelIDVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IObjectWithAppUserModelID_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectWithAppUserModelID_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectWithAppUserModelID_Release(This) (This)->lpVtbl->Release(This)
/*** IObjectWithAppUserModelID methods ***/
#define IObjectWithAppUserModelID_SetAppID(This,pszAppID) (This)->lpVtbl->SetAppID(This,pszAppID)
#define IObjectWithAppUserModelID_GetAppID(This,ppszAppID) (This)->lpVtbl->GetAppID(This,ppszAppID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IObjectWithAppUserModelID_QueryInterface(IObjectWithAppUserModelID* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IObjectWithAppUserModelID_AddRef(IObjectWithAppUserModelID* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IObjectWithAppUserModelID_Release(IObjectWithAppUserModelID* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectWithAppUserModelID methods ***/
static FORCEINLINE HRESULT IObjectWithAppUserModelID_SetAppID(IObjectWithAppUserModelID* This,LPCWSTR pszAppID) {
    return This->lpVtbl->SetAppID(This,pszAppID);
}
static FORCEINLINE HRESULT IObjectWithAppUserModelID_GetAppID(IObjectWithAppUserModelID* This,LPWSTR *ppszAppID) {
    return This->lpVtbl->GetAppID(This,ppszAppID);
}
#endif
#endif

#endif


#endif  /* __IObjectWithAppUserModelID_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IObjectWithProgID interface
 */
#ifndef __IObjectWithProgID_INTERFACE_DEFINED__
#define __IObjectWithProgID_INTERFACE_DEFINED__

DEFINE_GUID(IID_IObjectWithProgID, 0x71e806fb, 0x8dee, 0x46fc, 0xbf,0x8c, 0x77,0x48,0xa8,0xa1,0xae,0x13);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("71e806fb-8dee-46fc-bf8c-7748a8a1ae13")
IObjectWithProgID : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetProgID(
        LPCWSTR pszProgID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProgID(
        LPWSTR *ppszProgID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IObjectWithProgID, 0x71e806fb, 0x8dee, 0x46fc, 0xbf,0x8c, 0x77,0x48,0xa8,0xa1,0xae,0x13)
#endif
#else
typedef struct IObjectWithProgIDVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IObjectWithProgID *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IObjectWithProgID *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IObjectWithProgID *This);

    /*** IObjectWithProgID methods ***/
    HRESULT (STDMETHODCALLTYPE *SetProgID)(
        IObjectWithProgID *This,
        LPCWSTR pszProgID);

    HRESULT (STDMETHODCALLTYPE *GetProgID)(
        IObjectWithProgID *This,
        LPWSTR *ppszProgID);

    END_INTERFACE
} IObjectWithProgIDVtbl;

interface IObjectWithProgID {
    CONST_VTBL IObjectWithProgIDVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IObjectWithProgID_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectWithProgID_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectWithProgID_Release(This) (This)->lpVtbl->Release(This)
/*** IObjectWithProgID methods ***/
#define IObjectWithProgID_SetProgID(This,pszProgID) (This)->lpVtbl->SetProgID(This,pszProgID)
#define IObjectWithProgID_GetProgID(This,ppszProgID) (This)->lpVtbl->GetProgID(This,ppszProgID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IObjectWithProgID_QueryInterface(IObjectWithProgID* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IObjectWithProgID_AddRef(IObjectWithProgID* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IObjectWithProgID_Release(IObjectWithProgID* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectWithProgID methods ***/
static FORCEINLINE HRESULT IObjectWithProgID_SetProgID(IObjectWithProgID* This,LPCWSTR pszProgID) {
    return This->lpVtbl->SetProgID(This,pszProgID);
}
static FORCEINLINE HRESULT IObjectWithProgID_GetProgID(IObjectWithProgID* This,LPWSTR *ppszProgID) {
    return This->lpVtbl->GetProgID(This,ppszProgID);
}
#endif
#endif

#endif


#endif  /* __IObjectWithProgID_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IUpdateIDList interface
 */
#ifndef __IUpdateIDList_INTERFACE_DEFINED__
#define __IUpdateIDList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateIDList, 0x6589b6d2, 0x5f8d, 0x4b9e, 0xb7,0xe0, 0x23,0xcd,0xd9,0x71,0x7d,0x8c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6589b6d2-5f8d-4b9e-b7e0-23cdd9717d8c")
IUpdateIDList : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Update(
        IBindCtx *pbc,
        PCUITEMID_CHILD pidlIn,
        PITEMID_CHILD *ppidlOut) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateIDList, 0x6589b6d2, 0x5f8d, 0x4b9e, 0xb7,0xe0, 0x23,0xcd,0xd9,0x71,0x7d,0x8c)
#endif
#else
typedef struct IUpdateIDListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUpdateIDList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUpdateIDList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUpdateIDList *This);

    /*** IUpdateIDList methods ***/
    HRESULT (STDMETHODCALLTYPE *Update)(
        IUpdateIDList *This,
        IBindCtx *pbc,
        PCUITEMID_CHILD pidlIn,
        PITEMID_CHILD *ppidlOut);

    END_INTERFACE
} IUpdateIDListVtbl;

interface IUpdateIDList {
    CONST_VTBL IUpdateIDListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateIDList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateIDList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateIDList_Release(This) (This)->lpVtbl->Release(This)
/*** IUpdateIDList methods ***/
#define IUpdateIDList_Update(This,pbc,pidlIn,ppidlOut) (This)->lpVtbl->Update(This,pbc,pidlIn,ppidlOut)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateIDList_QueryInterface(IUpdateIDList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateIDList_AddRef(IUpdateIDList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateIDList_Release(IUpdateIDList* This) {
    return This->lpVtbl->Release(This);
}
/*** IUpdateIDList methods ***/
static FORCEINLINE HRESULT IUpdateIDList_Update(IUpdateIDList* This,IBindCtx *pbc,PCUITEMID_CHILD pidlIn,PITEMID_CHILD *ppidlOut) {
    return This->lpVtbl->Update(This,pbc,pidlIn,ppidlOut);
}
#endif
#endif

#endif


#endif  /* __IUpdateIDList_INTERFACE_DEFINED__ */


SHSTDAPI SetCurrentProcessExplicitAppUserModelID(PCWSTR AppID);
SHSTDAPI GetCurrentProcessExplicitAppUserModelID(PWSTR *AppID);
#endif

/*****************************************************************************
 * IDesktopGadget interface
 */
#ifndef __IDesktopGadget_INTERFACE_DEFINED__
#define __IDesktopGadget_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDesktopGadget, 0xc1646bc4, 0xf298, 0x4f91, 0xa2,0x04, 0xeb,0x2d,0xd1,0x70,0x9d,0x1a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c1646bc4-f298-4f91-a204-eb2dd1709d1a")
IDesktopGadget : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RunGadget(
        LPCWSTR gadgetPath) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDesktopGadget, 0xc1646bc4, 0xf298, 0x4f91, 0xa2,0x04, 0xeb,0x2d,0xd1,0x70,0x9d,0x1a)
#endif
#else
typedef struct IDesktopGadgetVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDesktopGadget *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDesktopGadget *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDesktopGadget *This);

    /*** IDesktopGadget methods ***/
    HRESULT (STDMETHODCALLTYPE *RunGadget)(
        IDesktopGadget *This,
        LPCWSTR gadgetPath);

    END_INTERFACE
} IDesktopGadgetVtbl;

interface IDesktopGadget {
    CONST_VTBL IDesktopGadgetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDesktopGadget_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDesktopGadget_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDesktopGadget_Release(This) (This)->lpVtbl->Release(This)
/*** IDesktopGadget methods ***/
#define IDesktopGadget_RunGadget(This,gadgetPath) (This)->lpVtbl->RunGadget(This,gadgetPath)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDesktopGadget_QueryInterface(IDesktopGadget* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDesktopGadget_AddRef(IDesktopGadget* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDesktopGadget_Release(IDesktopGadget* This) {
    return This->lpVtbl->Release(This);
}
/*** IDesktopGadget methods ***/
static FORCEINLINE HRESULT IDesktopGadget_RunGadget(IDesktopGadget* This,LPCWSTR gadgetPath) {
    return This->lpVtbl->RunGadget(This,gadgetPath);
}
#endif
#endif

#endif


#endif  /* __IDesktopGadget_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_WIN8
/*****************************************************************************
 * IDesktopWallpaper interface
 */
#ifndef __IDesktopWallpaper_INTERFACE_DEFINED__
#define __IDesktopWallpaper_INTERFACE_DEFINED__

typedef enum DESKTOP_SLIDESHOW_OPTIONS {
    DSO_SHUFFLEIMAGES = 0x1
} DESKTOP_SLIDESHOW_OPTIONS;

DEFINE_ENUM_FLAG_OPERATORS(DESKTOP_SLIDESHOW_OPTIONS);

typedef enum DESKTOP_SLIDESHOW_STATE {
    DSS_ENABLED = 0x1,
    DSS_SLIDESHOW = 0x2,
    DSS_DISABLED_BY_REMOTE_SESSION = 0x4
} DESKTOP_SLIDESHOW_STATE;

DEFINE_ENUM_FLAG_OPERATORS(DESKTOP_SLIDESHOW_STATE);

typedef enum DESKTOP_SLIDESHOW_DIRECTION {
    DSD_FORWARD = 0,
    DSD_BACKWARD = 1
} DESKTOP_SLIDESHOW_DIRECTION;

typedef enum DESKTOP_WALLPAPER_POSITION {
    DWPOS_CENTER = 0,
    DWPOS_TILE = 1,
    DWPOS_STRETCH = 2,
    DWPOS_FIT = 3,
    DWPOS_FILL = 4,
    DWPOS_SPAN = 5
} DESKTOP_WALLPAPER_POSITION;

DEFINE_GUID(IID_IDesktopWallpaper, 0xb92b56a9, 0x8b55, 0x4e14, 0x9a,0x89, 0x01,0x99,0xbb,0xb6,0xf9,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b92b56a9-8b55-4e14-9a89-0199bbb6f93b")
IDesktopWallpaper : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetWallpaper(
        LPCWSTR monitorID,
        LPCWSTR wallpaper) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWallpaper(
        LPCWSTR monitorID,
        LPWSTR *wallpaper) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMonitorDevicePathAt(
        UINT monitorIndex,
        LPWSTR *monitorID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMonitorDevicePathCount(
        UINT *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMonitorRECT(
        LPCWSTR monitorID,
        RECT *displayRect) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBackgroundColor(
        COLORREF color) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBackgroundColor(
        COLORREF *color) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPosition(
        DESKTOP_WALLPAPER_POSITION position) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPosition(
        DESKTOP_WALLPAPER_POSITION *position) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSlideshow(
        IShellItemArray *items) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSlideshow(
        IShellItemArray **items) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSlideshowOptions(
        DESKTOP_SLIDESHOW_OPTIONS options,
        UINT slideshowTick) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSlideshowOptions(
        DESKTOP_SLIDESHOW_OPTIONS *options,
        UINT *slideshowTick) = 0;

    virtual HRESULT STDMETHODCALLTYPE AdvanceSlideshow(
        LPCWSTR monitorID,
        DESKTOP_SLIDESHOW_DIRECTION direction) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatus(
        DESKTOP_SLIDESHOW_STATE *state) = 0;

    virtual HRESULT STDMETHODCALLTYPE Enable(
        WINBOOL enable) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDesktopWallpaper, 0xb92b56a9, 0x8b55, 0x4e14, 0x9a,0x89, 0x01,0x99,0xbb,0xb6,0xf9,0x3b)
#endif
#else
typedef struct IDesktopWallpaperVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDesktopWallpaper *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDesktopWallpaper *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDesktopWallpaper *This);

    /*** IDesktopWallpaper methods ***/
    HRESULT (STDMETHODCALLTYPE *SetWallpaper)(
        IDesktopWallpaper *This,
        LPCWSTR monitorID,
        LPCWSTR wallpaper);

    HRESULT (STDMETHODCALLTYPE *GetWallpaper)(
        IDesktopWallpaper *This,
        LPCWSTR monitorID,
        LPWSTR *wallpaper);

    HRESULT (STDMETHODCALLTYPE *GetMonitorDevicePathAt)(
        IDesktopWallpaper *This,
        UINT monitorIndex,
        LPWSTR *monitorID);

    HRESULT (STDMETHODCALLTYPE *GetMonitorDevicePathCount)(
        IDesktopWallpaper *This,
        UINT *count);

    HRESULT (STDMETHODCALLTYPE *GetMonitorRECT)(
        IDesktopWallpaper *This,
        LPCWSTR monitorID,
        RECT *displayRect);

    HRESULT (STDMETHODCALLTYPE *SetBackgroundColor)(
        IDesktopWallpaper *This,
        COLORREF color);

    HRESULT (STDMETHODCALLTYPE *GetBackgroundColor)(
        IDesktopWallpaper *This,
        COLORREF *color);

    HRESULT (STDMETHODCALLTYPE *SetPosition)(
        IDesktopWallpaper *This,
        DESKTOP_WALLPAPER_POSITION position);

    HRESULT (STDMETHODCALLTYPE *GetPosition)(
        IDesktopWallpaper *This,
        DESKTOP_WALLPAPER_POSITION *position);

    HRESULT (STDMETHODCALLTYPE *SetSlideshow)(
        IDesktopWallpaper *This,
        IShellItemArray *items);

    HRESULT (STDMETHODCALLTYPE *GetSlideshow)(
        IDesktopWallpaper *This,
        IShellItemArray **items);

    HRESULT (STDMETHODCALLTYPE *SetSlideshowOptions)(
        IDesktopWallpaper *This,
        DESKTOP_SLIDESHOW_OPTIONS options,
        UINT slideshowTick);

    HRESULT (STDMETHODCALLTYPE *GetSlideshowOptions)(
        IDesktopWallpaper *This,
        DESKTOP_SLIDESHOW_OPTIONS *options,
        UINT *slideshowTick);

    HRESULT (STDMETHODCALLTYPE *AdvanceSlideshow)(
        IDesktopWallpaper *This,
        LPCWSTR monitorID,
        DESKTOP_SLIDESHOW_DIRECTION direction);

    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IDesktopWallpaper *This,
        DESKTOP_SLIDESHOW_STATE *state);

    HRESULT (STDMETHODCALLTYPE *Enable)(
        IDesktopWallpaper *This,
        WINBOOL enable);

    END_INTERFACE
} IDesktopWallpaperVtbl;

interface IDesktopWallpaper {
    CONST_VTBL IDesktopWallpaperVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDesktopWallpaper_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDesktopWallpaper_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDesktopWallpaper_Release(This) (This)->lpVtbl->Release(This)
/*** IDesktopWallpaper methods ***/
#define IDesktopWallpaper_SetWallpaper(This,monitorID,wallpaper) (This)->lpVtbl->SetWallpaper(This,monitorID,wallpaper)
#define IDesktopWallpaper_GetWallpaper(This,monitorID,wallpaper) (This)->lpVtbl->GetWallpaper(This,monitorID,wallpaper)
#define IDesktopWallpaper_GetMonitorDevicePathAt(This,monitorIndex,monitorID) (This)->lpVtbl->GetMonitorDevicePathAt(This,monitorIndex,monitorID)
#define IDesktopWallpaper_GetMonitorDevicePathCount(This,count) (This)->lpVtbl->GetMonitorDevicePathCount(This,count)
#define IDesktopWallpaper_GetMonitorRECT(This,monitorID,displayRect) (This)->lpVtbl->GetMonitorRECT(This,monitorID,displayRect)
#define IDesktopWallpaper_SetBackgroundColor(This,color) (This)->lpVtbl->SetBackgroundColor(This,color)
#define IDesktopWallpaper_GetBackgroundColor(This,color) (This)->lpVtbl->GetBackgroundColor(This,color)
#define IDesktopWallpaper_SetPosition(This,position) (This)->lpVtbl->SetPosition(This,position)
#define IDesktopWallpaper_GetPosition(This,position) (This)->lpVtbl->GetPosition(This,position)
#define IDesktopWallpaper_SetSlideshow(This,items) (This)->lpVtbl->SetSlideshow(This,items)
#define IDesktopWallpaper_GetSlideshow(This,items) (This)->lpVtbl->GetSlideshow(This,items)
#define IDesktopWallpaper_SetSlideshowOptions(This,options,slideshowTick) (This)->lpVtbl->SetSlideshowOptions(This,options,slideshowTick)
#define IDesktopWallpaper_GetSlideshowOptions(This,options,slideshowTick) (This)->lpVtbl->GetSlideshowOptions(This,options,slideshowTick)
#define IDesktopWallpaper_AdvanceSlideshow(This,monitorID,direction) (This)->lpVtbl->AdvanceSlideshow(This,monitorID,direction)
#define IDesktopWallpaper_GetStatus(This,state) (This)->lpVtbl->GetStatus(This,state)
#define IDesktopWallpaper_Enable(This,enable) (This)->lpVtbl->Enable(This,enable)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDesktopWallpaper_QueryInterface(IDesktopWallpaper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDesktopWallpaper_AddRef(IDesktopWallpaper* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDesktopWallpaper_Release(IDesktopWallpaper* This) {
    return This->lpVtbl->Release(This);
}
/*** IDesktopWallpaper methods ***/
static FORCEINLINE HRESULT IDesktopWallpaper_SetWallpaper(IDesktopWallpaper* This,LPCWSTR monitorID,LPCWSTR wallpaper) {
    return This->lpVtbl->SetWallpaper(This,monitorID,wallpaper);
}
static FORCEINLINE HRESULT IDesktopWallpaper_GetWallpaper(IDesktopWallpaper* This,LPCWSTR monitorID,LPWSTR *wallpaper) {
    return This->lpVtbl->GetWallpaper(This,monitorID,wallpaper);
}
static FORCEINLINE HRESULT IDesktopWallpaper_GetMonitorDevicePathAt(IDesktopWallpaper* This,UINT monitorIndex,LPWSTR *monitorID) {
    return This->lpVtbl->GetMonitorDevicePathAt(This,monitorIndex,monitorID);
}
static FORCEINLINE HRESULT IDesktopWallpaper_GetMonitorDevicePathCount(IDesktopWallpaper* This,UINT *count) {
    return This->lpVtbl->GetMonitorDevicePathCount(This,count);
}
static FORCEINLINE HRESULT IDesktopWallpaper_GetMonitorRECT(IDesktopWallpaper* This,LPCWSTR monitorID,RECT *displayRect) {
    return This->lpVtbl->GetMonitorRECT(This,monitorID,displayRect);
}
static FORCEINLINE HRESULT IDesktopWallpaper_SetBackgroundColor(IDesktopWallpaper* This,COLORREF color) {
    return This->lpVtbl->SetBackgroundColor(This,color);
}
static FORCEINLINE HRESULT IDesktopWallpaper_GetBackgroundColor(IDesktopWallpaper* This,COLORREF *color) {
    return This->lpVtbl->GetBackgroundColor(This,color);
}
static FORCEINLINE HRESULT IDesktopWallpaper_SetPosition(IDesktopWallpaper* This,DESKTOP_WALLPAPER_POSITION position) {
    return This->lpVtbl->SetPosition(This,position);
}
static FORCEINLINE HRESULT IDesktopWallpaper_GetPosition(IDesktopWallpaper* This,DESKTOP_WALLPAPER_POSITION *position) {
    return This->lpVtbl->GetPosition(This,position);
}
static FORCEINLINE HRESULT IDesktopWallpaper_SetSlideshow(IDesktopWallpaper* This,IShellItemArray *items) {
    return This->lpVtbl->SetSlideshow(This,items);
}
static FORCEINLINE HRESULT IDesktopWallpaper_GetSlideshow(IDesktopWallpaper* This,IShellItemArray **items) {
    return This->lpVtbl->GetSlideshow(This,items);
}
static FORCEINLINE HRESULT IDesktopWallpaper_SetSlideshowOptions(IDesktopWallpaper* This,DESKTOP_SLIDESHOW_OPTIONS options,UINT slideshowTick) {
    return This->lpVtbl->SetSlideshowOptions(This,options,slideshowTick);
}
static FORCEINLINE HRESULT IDesktopWallpaper_GetSlideshowOptions(IDesktopWallpaper* This,DESKTOP_SLIDESHOW_OPTIONS *options,UINT *slideshowTick) {
    return This->lpVtbl->GetSlideshowOptions(This,options,slideshowTick);
}
static FORCEINLINE HRESULT IDesktopWallpaper_AdvanceSlideshow(IDesktopWallpaper* This,LPCWSTR monitorID,DESKTOP_SLIDESHOW_DIRECTION direction) {
    return This->lpVtbl->AdvanceSlideshow(This,monitorID,direction);
}
static FORCEINLINE HRESULT IDesktopWallpaper_GetStatus(IDesktopWallpaper* This,DESKTOP_SLIDESHOW_STATE *state) {
    return This->lpVtbl->GetStatus(This,state);
}
static FORCEINLINE HRESULT IDesktopWallpaper_Enable(IDesktopWallpaper* This,WINBOOL enable) {
    return This->lpVtbl->Enable(This,enable);
}
#endif
#endif

#endif


#endif  /* __IDesktopWallpaper_INTERFACE_DEFINED__ */

#endif

#define HOMEGROUP_SECURITY_GROUP_MULTI L"HUG"
#define HOMEGROUP_SECURITY_GROUP L"HomeUsers"

/*****************************************************************************
 * IHomeGroup interface
 */
#ifndef __IHomeGroup_INTERFACE_DEFINED__
#define __IHomeGroup_INTERFACE_DEFINED__

typedef enum HOMEGROUPSHARINGCHOICES {
    HGSC_NONE = 0x0,
    HGSC_MUSICLIBRARY = 0x1,
    HGSC_PICTURESLIBRARY = 0x2,
    HGSC_VIDEOSLIBRARY = 0x4,
    HGSC_DOCUMENTSLIBRARY = 0x8,
    HGSC_PRINTERS = 0x10
} HOMEGROUPSHARINGCHOICES;

DEFINE_ENUM_FLAG_OPERATORS(HOMEGROUPSHARINGCHOICES)

DEFINE_GUID(IID_IHomeGroup, 0x7a3bd1d9, 0x35a9, 0x4fb3, 0xa4,0x67, 0xf4,0x8c,0xac,0x35,0xe2,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7a3bd1d9-35a9-4fb3-a467-f48cac35e2d0")
IHomeGroup : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE IsMember(
        WINBOOL *member) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShowSharingWizard(
        HWND owner,
        HOMEGROUPSHARINGCHOICES *sharingchoices) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHomeGroup, 0x7a3bd1d9, 0x35a9, 0x4fb3, 0xa4,0x67, 0xf4,0x8c,0xac,0x35,0xe2,0xd0)
#endif
#else
typedef struct IHomeGroupVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHomeGroup *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHomeGroup *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHomeGroup *This);

    /*** IHomeGroup methods ***/
    HRESULT (STDMETHODCALLTYPE *IsMember)(
        IHomeGroup *This,
        WINBOOL *member);

    HRESULT (STDMETHODCALLTYPE *ShowSharingWizard)(
        IHomeGroup *This,
        HWND owner,
        HOMEGROUPSHARINGCHOICES *sharingchoices);

    END_INTERFACE
} IHomeGroupVtbl;

interface IHomeGroup {
    CONST_VTBL IHomeGroupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHomeGroup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHomeGroup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHomeGroup_Release(This) (This)->lpVtbl->Release(This)
/*** IHomeGroup methods ***/
#define IHomeGroup_IsMember(This,member) (This)->lpVtbl->IsMember(This,member)
#define IHomeGroup_ShowSharingWizard(This,owner,sharingchoices) (This)->lpVtbl->ShowSharingWizard(This,owner,sharingchoices)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHomeGroup_QueryInterface(IHomeGroup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHomeGroup_AddRef(IHomeGroup* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHomeGroup_Release(IHomeGroup* This) {
    return This->lpVtbl->Release(This);
}
/*** IHomeGroup methods ***/
static FORCEINLINE HRESULT IHomeGroup_IsMember(IHomeGroup* This,WINBOOL *member) {
    return This->lpVtbl->IsMember(This,member);
}
static FORCEINLINE HRESULT IHomeGroup_ShowSharingWizard(IHomeGroup* This,HWND owner,HOMEGROUPSHARINGCHOICES *sharingchoices) {
    return This->lpVtbl->ShowSharingWizard(This,owner,sharingchoices);
}
#endif
#endif

#endif


#endif  /* __IHomeGroup_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IInitializeWithPropertyStore interface
 */
#ifndef __IInitializeWithPropertyStore_INTERFACE_DEFINED__
#define __IInitializeWithPropertyStore_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInitializeWithPropertyStore, 0xc3e12eb5, 0x7d8d, 0x44f8, 0xb6,0xdd, 0x0e,0x77,0xb3,0x4d,0x6d,0xe4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c3e12eb5-7d8d-44f8-b6dd-0e77b34d6de4")
IInitializeWithPropertyStore : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IPropertyStore *pps) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInitializeWithPropertyStore, 0xc3e12eb5, 0x7d8d, 0x44f8, 0xb6,0xdd, 0x0e,0x77,0xb3,0x4d,0x6d,0xe4)
#endif
#else
typedef struct IInitializeWithPropertyStoreVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInitializeWithPropertyStore *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInitializeWithPropertyStore *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInitializeWithPropertyStore *This);

    /*** IInitializeWithPropertyStore methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IInitializeWithPropertyStore *This,
        IPropertyStore *pps);

    END_INTERFACE
} IInitializeWithPropertyStoreVtbl;

interface IInitializeWithPropertyStore {
    CONST_VTBL IInitializeWithPropertyStoreVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInitializeWithPropertyStore_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInitializeWithPropertyStore_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInitializeWithPropertyStore_Release(This) (This)->lpVtbl->Release(This)
/*** IInitializeWithPropertyStore methods ***/
#define IInitializeWithPropertyStore_Initialize(This,pps) (This)->lpVtbl->Initialize(This,pps)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInitializeWithPropertyStore_QueryInterface(IInitializeWithPropertyStore* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInitializeWithPropertyStore_AddRef(IInitializeWithPropertyStore* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInitializeWithPropertyStore_Release(IInitializeWithPropertyStore* This) {
    return This->lpVtbl->Release(This);
}
/*** IInitializeWithPropertyStore methods ***/
static FORCEINLINE HRESULT IInitializeWithPropertyStore_Initialize(IInitializeWithPropertyStore* This,IPropertyStore *pps) {
    return This->lpVtbl->Initialize(This,pps);
}
#endif
#endif

#endif


#endif  /* __IInitializeWithPropertyStore_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IOpenSearchSource interface
 */
#ifndef __IOpenSearchSource_INTERFACE_DEFINED__
#define __IOpenSearchSource_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpenSearchSource, 0xf0ee7333, 0xe6fc, 0x479b, 0x9f,0x25, 0xa8,0x60,0xc2,0x34,0xa3,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f0ee7333-e6fc-479b-9f25-a860c234a38e")
IOpenSearchSource : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetResults(
        HWND hwnd,
        LPCWSTR pszQuery,
        DWORD dwStartIndex,
        DWORD dwCount,
        REFIID riid,
        void **ppv) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpenSearchSource, 0xf0ee7333, 0xe6fc, 0x479b, 0x9f,0x25, 0xa8,0x60,0xc2,0x34,0xa3,0x8e)
#endif
#else
typedef struct IOpenSearchSourceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IOpenSearchSource *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IOpenSearchSource *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IOpenSearchSource *This);

    /*** IOpenSearchSource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetResults)(
        IOpenSearchSource *This,
        HWND hwnd,
        LPCWSTR pszQuery,
        DWORD dwStartIndex,
        DWORD dwCount,
        REFIID riid,
        void **ppv);

    END_INTERFACE
} IOpenSearchSourceVtbl;

interface IOpenSearchSource {
    CONST_VTBL IOpenSearchSourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpenSearchSource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpenSearchSource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpenSearchSource_Release(This) (This)->lpVtbl->Release(This)
/*** IOpenSearchSource methods ***/
#define IOpenSearchSource_GetResults(This,hwnd,pszQuery,dwStartIndex,dwCount,riid,ppv) (This)->lpVtbl->GetResults(This,hwnd,pszQuery,dwStartIndex,dwCount,riid,ppv)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpenSearchSource_QueryInterface(IOpenSearchSource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpenSearchSource_AddRef(IOpenSearchSource* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpenSearchSource_Release(IOpenSearchSource* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpenSearchSource methods ***/
static FORCEINLINE HRESULT IOpenSearchSource_GetResults(IOpenSearchSource* This,HWND hwnd,LPCWSTR pszQuery,DWORD dwStartIndex,DWORD dwCount,REFIID riid,void **ppv) {
    return This->lpVtbl->GetResults(This,hwnd,pszQuery,dwStartIndex,dwCount,riid,ppv);
}
#endif
#endif

#endif


#endif  /* __IOpenSearchSource_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IShellLibrary interface
 */
#ifndef __IShellLibrary_INTERFACE_DEFINED__
#define __IShellLibrary_INTERFACE_DEFINED__

typedef enum LIBRARYFOLDERFILTER {
    LFF_FORCEFILESYSTEM = 1,
    LFF_STORAGEITEMS = 2,
    LFF_ALLITEMS = 3
} LIBRARYFOLDERFILTER;

typedef enum LIBRARYOPTIONFLAGS {
    LOF_DEFAULT = 0x0,
    LOF_PINNEDTONAVPANE = 0x1,
    LOF_MASK_ALL = 0x1
} LIBRARYOPTIONFLAGS;

DEFINE_ENUM_FLAG_OPERATORS(LIBRARYOPTIONFLAGS)

typedef enum DEFAULTSAVEFOLDERTYPE {
    DSFT_DETECT = 1,
    DSFT_PRIVATE = 2,
    DSFT_PUBLIC = 3
} DEFAULTSAVEFOLDERTYPE;

typedef enum LIBRARYSAVEFLAGS {
    LSF_FAILIFTHERE = 0x0,
    LSF_OVERRIDEEXISTING = 0x1,
    LSF_MAKEUNIQUENAME = 0x2
} LIBRARYSAVEFLAGS;

DEFINE_ENUM_FLAG_OPERATORS(LIBRARYSAVEFLAGS)

DEFINE_GUID(IID_IShellLibrary, 0x11a66efa, 0x382e, 0x451a, 0x92,0x34, 0x1e,0x0e,0x12,0xef,0x30,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("11a66efa-382e-451a-9234-1e0e12ef3085")
IShellLibrary : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE LoadLibraryFromItem(
        IShellItem *psiLibrary,
        DWORD grfMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadLibraryFromKnownFolder(
        REFKNOWNFOLDERID kfidLibrary,
        DWORD grfMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddFolder(
        IShellItem *psiLocation) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveFolder(
        IShellItem *psiLocation) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolders(
        LIBRARYFOLDERFILTER lff,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResolveFolder(
        IShellItem *psiFolderToResolve,
        DWORD dwTimeout,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultSaveFolder(
        DEFAULTSAVEFOLDERTYPE dsft,
        REFIID riid,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultSaveFolder(
        DEFAULTSAVEFOLDERTYPE dsft,
        IShellItem *psi) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOptions(
        LIBRARYOPTIONFLAGS *plofOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOptions(
        LIBRARYOPTIONFLAGS lofMask,
        LIBRARYOPTIONFLAGS lofOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolderType(
        FOLDERTYPEID *pftid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFolderType(
        REFFOLDERTYPEID ftid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIcon(
        LPWSTR *ppszIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIcon(
        LPCWSTR pszIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE Commit(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Save(
        IShellItem *psiFolderToSaveIn,
        LPCWSTR pszLibraryName,
        LIBRARYSAVEFLAGS lsf,
        IShellItem **ppsiSavedTo) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveInKnownFolder(
        REFKNOWNFOLDERID kfidToSaveIn,
        LPCWSTR pszLibraryName,
        LIBRARYSAVEFLAGS lsf,
        IShellItem **ppsiSavedTo) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IShellLibrary, 0x11a66efa, 0x382e, 0x451a, 0x92,0x34, 0x1e,0x0e,0x12,0xef,0x30,0x85)
#endif
#else
typedef struct IShellLibraryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IShellLibrary *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IShellLibrary *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IShellLibrary *This);

    /*** IShellLibrary methods ***/
    HRESULT (STDMETHODCALLTYPE *LoadLibraryFromItem)(
        IShellLibrary *This,
        IShellItem *psiLibrary,
        DWORD grfMode);

    HRESULT (STDMETHODCALLTYPE *LoadLibraryFromKnownFolder)(
        IShellLibrary *This,
        REFKNOWNFOLDERID kfidLibrary,
        DWORD grfMode);

    HRESULT (STDMETHODCALLTYPE *AddFolder)(
        IShellLibrary *This,
        IShellItem *psiLocation);

    HRESULT (STDMETHODCALLTYPE *RemoveFolder)(
        IShellLibrary *This,
        IShellItem *psiLocation);

    HRESULT (STDMETHODCALLTYPE *GetFolders)(
        IShellLibrary *This,
        LIBRARYFOLDERFILTER lff,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *ResolveFolder)(
        IShellLibrary *This,
        IShellItem *psiFolderToResolve,
        DWORD dwTimeout,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *GetDefaultSaveFolder)(
        IShellLibrary *This,
        DEFAULTSAVEFOLDERTYPE dsft,
        REFIID riid,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *SetDefaultSaveFolder)(
        IShellLibrary *This,
        DEFAULTSAVEFOLDERTYPE dsft,
        IShellItem *psi);

    HRESULT (STDMETHODCALLTYPE *GetOptions)(
        IShellLibrary *This,
        LIBRARYOPTIONFLAGS *plofOptions);

    HRESULT (STDMETHODCALLTYPE *SetOptions)(
        IShellLibrary *This,
        LIBRARYOPTIONFLAGS lofMask,
        LIBRARYOPTIONFLAGS lofOptions);

    HRESULT (STDMETHODCALLTYPE *GetFolderType)(
        IShellLibrary *This,
        FOLDERTYPEID *pftid);

    HRESULT (STDMETHODCALLTYPE *SetFolderType)(
        IShellLibrary *This,
        REFFOLDERTYPEID ftid);

    HRESULT (STDMETHODCALLTYPE *GetIcon)(
        IShellLibrary *This,
        LPWSTR *ppszIcon);

    HRESULT (STDMETHODCALLTYPE *SetIcon)(
        IShellLibrary *This,
        LPCWSTR pszIcon);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IShellLibrary *This);

    HRESULT (STDMETHODCALLTYPE *Save)(
        IShellLibrary *This,
        IShellItem *psiFolderToSaveIn,
        LPCWSTR pszLibraryName,
        LIBRARYSAVEFLAGS lsf,
        IShellItem **ppsiSavedTo);

    HRESULT (STDMETHODCALLTYPE *SaveInKnownFolder)(
        IShellLibrary *This,
        REFKNOWNFOLDERID kfidToSaveIn,
        LPCWSTR pszLibraryName,
        LIBRARYSAVEFLAGS lsf,
        IShellItem **ppsiSavedTo);

    END_INTERFACE
} IShellLibraryVtbl;

interface IShellLibrary {
    CONST_VTBL IShellLibraryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IShellLibrary_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IShellLibrary_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IShellLibrary_Release(This) (This)->lpVtbl->Release(This)
/*** IShellLibrary methods ***/
#define IShellLibrary_LoadLibraryFromItem(This,psiLibrary,grfMode) (This)->lpVtbl->LoadLibraryFromItem(This,psiLibrary,grfMode)
#define IShellLibrary_LoadLibraryFromKnownFolder(This,kfidLibrary,grfMode) (This)->lpVtbl->LoadLibraryFromKnownFolder(This,kfidLibrary,grfMode)
#define IShellLibrary_AddFolder(This,psiLocation) (This)->lpVtbl->AddFolder(This,psiLocation)
#define IShellLibrary_RemoveFolder(This,psiLocation) (This)->lpVtbl->RemoveFolder(This,psiLocation)
#define IShellLibrary_GetFolders(This,lff,riid,ppv) (This)->lpVtbl->GetFolders(This,lff,riid,ppv)
#define IShellLibrary_ResolveFolder(This,psiFolderToResolve,dwTimeout,riid,ppv) (This)->lpVtbl->ResolveFolder(This,psiFolderToResolve,dwTimeout,riid,ppv)
#define IShellLibrary_GetDefaultSaveFolder(This,dsft,riid,ppv) (This)->lpVtbl->GetDefaultSaveFolder(This,dsft,riid,ppv)
#define IShellLibrary_SetDefaultSaveFolder(This,dsft,psi) (This)->lpVtbl->SetDefaultSaveFolder(This,dsft,psi)
#define IShellLibrary_GetOptions(This,plofOptions) (This)->lpVtbl->GetOptions(This,plofOptions)
#define IShellLibrary_SetOptions(This,lofMask,lofOptions) (This)->lpVtbl->SetOptions(This,lofMask,lofOptions)
#define IShellLibrary_GetFolderType(This,pftid) (This)->lpVtbl->GetFolderType(This,pftid)
#define IShellLibrary_SetFolderType(This,ftid) (This)->lpVtbl->SetFolderType(This,ftid)
#define IShellLibrary_GetIcon(This,ppszIcon) (This)->lpVtbl->GetIcon(This,ppszIcon)
#define IShellLibrary_SetIcon(This,pszIcon) (This)->lpVtbl->SetIcon(This,pszIcon)
#define IShellLibrary_Commit(This) (This)->lpVtbl->Commit(This)
#define IShellLibrary_Save(This,psiFolderToSaveIn,pszLibraryName,lsf,ppsiSavedTo) (This)->lpVtbl->Save(This,psiFolderToSaveIn,pszLibraryName,lsf,ppsiSavedTo)
#define IShellLibrary_SaveInKnownFolder(This,kfidToSaveIn,pszLibraryName,lsf,ppsiSavedTo) (This)->lpVtbl->SaveInKnownFolder(This,kfidToSaveIn,pszLibraryName,lsf,ppsiSavedTo)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IShellLibrary_QueryInterface(IShellLibrary* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IShellLibrary_AddRef(IShellLibrary* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IShellLibrary_Release(IShellLibrary* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellLibrary methods ***/
static FORCEINLINE HRESULT IShellLibrary_LoadLibraryFromItem(IShellLibrary* This,IShellItem *psiLibrary,DWORD grfMode) {
    return This->lpVtbl->LoadLibraryFromItem(This,psiLibrary,grfMode);
}
static FORCEINLINE HRESULT IShellLibrary_LoadLibraryFromKnownFolder(IShellLibrary* This,REFKNOWNFOLDERID kfidLibrary,DWORD grfMode) {
    return This->lpVtbl->LoadLibraryFromKnownFolder(This,kfidLibrary,grfMode);
}
static FORCEINLINE HRESULT IShellLibrary_AddFolder(IShellLibrary* This,IShellItem *psiLocation) {
    return This->lpVtbl->AddFolder(This,psiLocation);
}
static FORCEINLINE HRESULT IShellLibrary_RemoveFolder(IShellLibrary* This,IShellItem *psiLocation) {
    return This->lpVtbl->RemoveFolder(This,psiLocation);
}
static FORCEINLINE HRESULT IShellLibrary_GetFolders(IShellLibrary* This,LIBRARYFOLDERFILTER lff,REFIID riid,void **ppv) {
    return This->lpVtbl->GetFolders(This,lff,riid,ppv);
}
static FORCEINLINE HRESULT IShellLibrary_ResolveFolder(IShellLibrary* This,IShellItem *psiFolderToResolve,DWORD dwTimeout,REFIID riid,void **ppv) {
    return This->lpVtbl->ResolveFolder(This,psiFolderToResolve,dwTimeout,riid,ppv);
}
static FORCEINLINE HRESULT IShellLibrary_GetDefaultSaveFolder(IShellLibrary* This,DEFAULTSAVEFOLDERTYPE dsft,REFIID riid,void **ppv) {
    return This->lpVtbl->GetDefaultSaveFolder(This,dsft,riid,ppv);
}
static FORCEINLINE HRESULT IShellLibrary_SetDefaultSaveFolder(IShellLibrary* This,DEFAULTSAVEFOLDERTYPE dsft,IShellItem *psi) {
    return This->lpVtbl->SetDefaultSaveFolder(This,dsft,psi);
}
static FORCEINLINE HRESULT IShellLibrary_GetOptions(IShellLibrary* This,LIBRARYOPTIONFLAGS *plofOptions) {
    return This->lpVtbl->GetOptions(This,plofOptions);
}
static FORCEINLINE HRESULT IShellLibrary_SetOptions(IShellLibrary* This,LIBRARYOPTIONFLAGS lofMask,LIBRARYOPTIONFLAGS lofOptions) {
    return This->lpVtbl->SetOptions(This,lofMask,lofOptions);
}
static FORCEINLINE HRESULT IShellLibrary_GetFolderType(IShellLibrary* This,FOLDERTYPEID *pftid) {
    return This->lpVtbl->GetFolderType(This,pftid);
}
static FORCEINLINE HRESULT IShellLibrary_SetFolderType(IShellLibrary* This,REFFOLDERTYPEID ftid) {
    return This->lpVtbl->SetFolderType(This,ftid);
}
static FORCEINLINE HRESULT IShellLibrary_GetIcon(IShellLibrary* This,LPWSTR *ppszIcon) {
    return This->lpVtbl->GetIcon(This,ppszIcon);
}
static FORCEINLINE HRESULT IShellLibrary_SetIcon(IShellLibrary* This,LPCWSTR pszIcon) {
    return This->lpVtbl->SetIcon(This,pszIcon);
}
static FORCEINLINE HRESULT IShellLibrary_Commit(IShellLibrary* This) {
    return This->lpVtbl->Commit(This);
}
static FORCEINLINE HRESULT IShellLibrary_Save(IShellLibrary* This,IShellItem *psiFolderToSaveIn,LPCWSTR pszLibraryName,LIBRARYSAVEFLAGS lsf,IShellItem **ppsiSavedTo) {
    return This->lpVtbl->Save(This,psiFolderToSaveIn,pszLibraryName,lsf,ppsiSavedTo);
}
static FORCEINLINE HRESULT IShellLibrary_SaveInKnownFolder(IShellLibrary* This,REFKNOWNFOLDERID kfidToSaveIn,LPCWSTR pszLibraryName,LIBRARYSAVEFLAGS lsf,IShellItem **ppsiSavedTo) {
    return This->lpVtbl->SaveInKnownFolder(This,kfidToSaveIn,pszLibraryName,lsf,ppsiSavedTo);
}
#endif
#endif

#endif


#endif  /* __IShellLibrary_INTERFACE_DEFINED__ */


typedef enum PBM_EVENT {
    PE_DUCKSESSION = 1,
    PE_UNDUCKSESSION = 2
} PBM_EVENT;

/*****************************************************************************
 * IPlaybackManagerEvents interface
 */
#ifndef __IPlaybackManagerEvents_INTERFACE_DEFINED__
#define __IPlaybackManagerEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPlaybackManagerEvents, 0x385cfb7d, 0x4e0c, 0x4106, 0x91,0x2e, 0x8c,0xfb,0x4c,0x19,0x1f,0x45);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("385cfb7d-4e0c-4106-912e-8cfb4c191f45")
IPlaybackManagerEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnPlaybackManagerEvent(
        DWORD dwSessionId,
        PBM_EVENT mediaEvent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPlaybackManagerEvents, 0x385cfb7d, 0x4e0c, 0x4106, 0x91,0x2e, 0x8c,0xfb,0x4c,0x19,0x1f,0x45)
#endif
#else
typedef struct IPlaybackManagerEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPlaybackManagerEvents *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPlaybackManagerEvents *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPlaybackManagerEvents *This);

    /*** IPlaybackManagerEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *OnPlaybackManagerEvent)(
        IPlaybackManagerEvents *This,
        DWORD dwSessionId,
        PBM_EVENT mediaEvent);

    END_INTERFACE
} IPlaybackManagerEventsVtbl;

interface IPlaybackManagerEvents {
    CONST_VTBL IPlaybackManagerEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPlaybackManagerEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPlaybackManagerEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPlaybackManagerEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IPlaybackManagerEvents methods ***/
#define IPlaybackManagerEvents_OnPlaybackManagerEvent(This,dwSessionId,mediaEvent) (This)->lpVtbl->OnPlaybackManagerEvent(This,dwSessionId,mediaEvent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPlaybackManagerEvents_QueryInterface(IPlaybackManagerEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPlaybackManagerEvents_AddRef(IPlaybackManagerEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPlaybackManagerEvents_Release(IPlaybackManagerEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IPlaybackManagerEvents methods ***/
static FORCEINLINE HRESULT IPlaybackManagerEvents_OnPlaybackManagerEvent(IPlaybackManagerEvents* This,DWORD dwSessionId,PBM_EVENT mediaEvent) {
    return This->lpVtbl->OnPlaybackManagerEvent(This,dwSessionId,mediaEvent);
}
#endif
#endif

#endif


#endif  /* __IPlaybackManagerEvents_INTERFACE_DEFINED__ */


typedef enum PBM_SESSION_TYPE {
    ST_COMMUNICATION = 1,
    ST_MEDIA = 2
} PBM_SESSION_TYPE;

typedef enum PBM_PLAY_STATE {
    PS_PLAYING = 1,
    PS_PAUSED = 2,
    PS_STOPPED = 3
} PBM_PLAY_STATE;

typedef enum PBM_MUTE_STATE {
    MS_MUTED = 1,
    MS_UNMUTED = 2
} PBM_MUTE_STATE;

/*****************************************************************************
 * IPlaybackManager interface
 */
#ifndef __IPlaybackManager_INTERFACE_DEFINED__
#define __IPlaybackManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPlaybackManager, 0x0f3c1b01, 0x8199, 0x4173, 0xba,0x78, 0x98,0x58,0x82,0x26,0x6f,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0f3c1b01-8199-4173-ba78-985882266f7a")
IPlaybackManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Advise(
        PBM_SESSION_TYPE type,
        IPlaybackManagerEvents *pEvents,
        DWORD *pdwSessionId) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unadvise(
        DWORD dwSessionId) = 0;

    virtual HRESULT STDMETHODCALLTYPE ChangeSessionState(
        DWORD dwSessionId,
        PBM_PLAY_STATE state,
        PBM_MUTE_STATE mute) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPlaybackManager, 0x0f3c1b01, 0x8199, 0x4173, 0xba,0x78, 0x98,0x58,0x82,0x26,0x6f,0x7a)
#endif
#else
typedef struct IPlaybackManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPlaybackManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPlaybackManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPlaybackManager *This);

    /*** IPlaybackManager methods ***/
    HRESULT (STDMETHODCALLTYPE *Advise)(
        IPlaybackManager *This,
        PBM_SESSION_TYPE type,
        IPlaybackManagerEvents *pEvents,
        DWORD *pdwSessionId);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        IPlaybackManager *This,
        DWORD dwSessionId);

    HRESULT (STDMETHODCALLTYPE *ChangeSessionState)(
        IPlaybackManager *This,
        DWORD dwSessionId,
        PBM_PLAY_STATE state,
        PBM_MUTE_STATE mute);

    END_INTERFACE
} IPlaybackManagerVtbl;

interface IPlaybackManager {
    CONST_VTBL IPlaybackManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPlaybackManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPlaybackManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPlaybackManager_Release(This) (This)->lpVtbl->Release(This)
/*** IPlaybackManager methods ***/
#define IPlaybackManager_Advise(This,type,pEvents,pdwSessionId) (This)->lpVtbl->Advise(This,type,pEvents,pdwSessionId)
#define IPlaybackManager_Unadvise(This,dwSessionId) (This)->lpVtbl->Unadvise(This,dwSessionId)
#define IPlaybackManager_ChangeSessionState(This,dwSessionId,state,mute) (This)->lpVtbl->ChangeSessionState(This,dwSessionId,state,mute)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPlaybackManager_QueryInterface(IPlaybackManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPlaybackManager_AddRef(IPlaybackManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPlaybackManager_Release(IPlaybackManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IPlaybackManager methods ***/
static FORCEINLINE HRESULT IPlaybackManager_Advise(IPlaybackManager* This,PBM_SESSION_TYPE type,IPlaybackManagerEvents *pEvents,DWORD *pdwSessionId) {
    return This->lpVtbl->Advise(This,type,pEvents,pdwSessionId);
}
static FORCEINLINE HRESULT IPlaybackManager_Unadvise(IPlaybackManager* This,DWORD dwSessionId) {
    return This->lpVtbl->Unadvise(This,dwSessionId);
}
static FORCEINLINE HRESULT IPlaybackManager_ChangeSessionState(IPlaybackManager* This,DWORD dwSessionId,PBM_PLAY_STATE state,PBM_MUTE_STATE mute) {
    return This->lpVtbl->ChangeSessionState(This,dwSessionId,state,mute);
}
#endif
#endif

#endif


#endif  /* __IPlaybackManager_INTERFACE_DEFINED__ */


typedef enum DEFAULT_FOLDER_MENU_RESTRICTIONS {
    DFMR_DEFAULT = 0x0,
    DFMR_NO_STATIC_VERBS = 0x8,
    DFMR_STATIC_VERBS_ONLY = 0x10,
    DFMR_NO_RESOURCE_VERBS = 0x20,
    DFMR_OPTIN_HANDLERS_ONLY = 0x40,
    DFMR_RESOURCE_AND_FOLDER_VERBS_ONLY = 0x80,
    DFMR_USE_SPECIFIED_HANDLERS = 0x100,
    DFMR_USE_SPECIFIED_VERBS = 0x200,
    DFMR_NO_ASYNC_VERBS = 0x400
} DEFAULT_FOLDER_MENU_RESTRICTIONS;

DEFINE_ENUM_FLAG_OPERATORS(DEFAULT_FOLDER_MENU_RESTRICTIONS)

/*****************************************************************************
 * IDefaultFolderMenuInitialize interface
 */
#ifndef __IDefaultFolderMenuInitialize_INTERFACE_DEFINED__
#define __IDefaultFolderMenuInitialize_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDefaultFolderMenuInitialize, 0x7690aa79, 0xf8fc, 0x4615, 0xa3,0x27, 0x36,0xf7,0xd1,0x8f,0x5d,0x91);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7690aa79-f8fc-4615-a327-36f7d18f5d91")
IDefaultFolderMenuInitialize : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        HWND hwnd,
        IContextMenuCB *pcmcb,
        PCIDLIST_ABSOLUTE pidlFolder,
        IShellFolder *psf,
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        IUnknown *punkAssociation,
        UINT cKeys,
        const HKEY *aKeys) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMenuRestrictions(
        DEFAULT_FOLDER_MENU_RESTRICTIONS dfmrValues) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMenuRestrictions(
        DEFAULT_FOLDER_MENU_RESTRICTIONS dfmrMask,
        DEFAULT_FOLDER_MENU_RESTRICTIONS *pdfmrValues) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHandlerClsid(
        REFCLSID rclsid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDefaultFolderMenuInitialize, 0x7690aa79, 0xf8fc, 0x4615, 0xa3,0x27, 0x36,0xf7,0xd1,0x8f,0x5d,0x91)
#endif
#else
typedef struct IDefaultFolderMenuInitializeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDefaultFolderMenuInitialize *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDefaultFolderMenuInitialize *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDefaultFolderMenuInitialize *This);

    /*** IDefaultFolderMenuInitialize methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IDefaultFolderMenuInitialize *This,
        HWND hwnd,
        IContextMenuCB *pcmcb,
        PCIDLIST_ABSOLUTE pidlFolder,
        IShellFolder *psf,
        UINT cidl,
        PCUITEMID_CHILD_ARRAY apidl,
        IUnknown *punkAssociation,
        UINT cKeys,
        const HKEY *aKeys);

    HRESULT (STDMETHODCALLTYPE *SetMenuRestrictions)(
        IDefaultFolderMenuInitialize *This,
        DEFAULT_FOLDER_MENU_RESTRICTIONS dfmrValues);

    HRESULT (STDMETHODCALLTYPE *GetMenuRestrictions)(
        IDefaultFolderMenuInitialize *This,
        DEFAULT_FOLDER_MENU_RESTRICTIONS dfmrMask,
        DEFAULT_FOLDER_MENU_RESTRICTIONS *pdfmrValues);

    HRESULT (STDMETHODCALLTYPE *SetHandlerClsid)(
        IDefaultFolderMenuInitialize *This,
        REFCLSID rclsid);

    END_INTERFACE
} IDefaultFolderMenuInitializeVtbl;

interface IDefaultFolderMenuInitialize {
    CONST_VTBL IDefaultFolderMenuInitializeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDefaultFolderMenuInitialize_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDefaultFolderMenuInitialize_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDefaultFolderMenuInitialize_Release(This) (This)->lpVtbl->Release(This)
/*** IDefaultFolderMenuInitialize methods ***/
#define IDefaultFolderMenuInitialize_Initialize(This,hwnd,pcmcb,pidlFolder,psf,cidl,apidl,punkAssociation,cKeys,aKeys) (This)->lpVtbl->Initialize(This,hwnd,pcmcb,pidlFolder,psf,cidl,apidl,punkAssociation,cKeys,aKeys)
#define IDefaultFolderMenuInitialize_SetMenuRestrictions(This,dfmrValues) (This)->lpVtbl->SetMenuRestrictions(This,dfmrValues)
#define IDefaultFolderMenuInitialize_GetMenuRestrictions(This,dfmrMask,pdfmrValues) (This)->lpVtbl->GetMenuRestrictions(This,dfmrMask,pdfmrValues)
#define IDefaultFolderMenuInitialize_SetHandlerClsid(This,rclsid) (This)->lpVtbl->SetHandlerClsid(This,rclsid)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDefaultFolderMenuInitialize_QueryInterface(IDefaultFolderMenuInitialize* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDefaultFolderMenuInitialize_AddRef(IDefaultFolderMenuInitialize* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDefaultFolderMenuInitialize_Release(IDefaultFolderMenuInitialize* This) {
    return This->lpVtbl->Release(This);
}
/*** IDefaultFolderMenuInitialize methods ***/
static FORCEINLINE HRESULT IDefaultFolderMenuInitialize_Initialize(IDefaultFolderMenuInitialize* This,HWND hwnd,IContextMenuCB *pcmcb,PCIDLIST_ABSOLUTE pidlFolder,IShellFolder *psf,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,IUnknown *punkAssociation,UINT cKeys,const HKEY *aKeys) {
    return This->lpVtbl->Initialize(This,hwnd,pcmcb,pidlFolder,psf,cidl,apidl,punkAssociation,cKeys,aKeys);
}
static FORCEINLINE HRESULT IDefaultFolderMenuInitialize_SetMenuRestrictions(IDefaultFolderMenuInitialize* This,DEFAULT_FOLDER_MENU_RESTRICTIONS dfmrValues) {
    return This->lpVtbl->SetMenuRestrictions(This,dfmrValues);
}
static FORCEINLINE HRESULT IDefaultFolderMenuInitialize_GetMenuRestrictions(IDefaultFolderMenuInitialize* This,DEFAULT_FOLDER_MENU_RESTRICTIONS dfmrMask,DEFAULT_FOLDER_MENU_RESTRICTIONS *pdfmrValues) {
    return This->lpVtbl->GetMenuRestrictions(This,dfmrMask,pdfmrValues);
}
static FORCEINLINE HRESULT IDefaultFolderMenuInitialize_SetHandlerClsid(IDefaultFolderMenuInitialize* This,REFCLSID rclsid) {
    return This->lpVtbl->SetHandlerClsid(This,rclsid);
}
#endif
#endif

#endif


#endif  /* __IDefaultFolderMenuInitialize_INTERFACE_DEFINED__ */


#if NTDDI_VERSION >= NTDDI_WIN8
typedef enum ACTIVATEOPTIONS {
    AO_NONE = 0x0,
    AO_DESIGNMODE = 0x1,
    AO_NOERRORUI = 0x2,
    AO_NOSPLASHSCREEN = 0x4
} ACTIVATEOPTIONS;

DEFINE_ENUM_FLAG_OPERATORS(ACTIVATEOPTIONS)

/*****************************************************************************
 * IApplicationActivationManager interface
 */
#ifndef __IApplicationActivationManager_INTERFACE_DEFINED__
#define __IApplicationActivationManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IApplicationActivationManager, 0x2e941141, 0x7f97, 0x4756, 0xba,0x1d, 0x9d,0xec,0xde,0x89,0x4a,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2e941141-7f97-4756-ba1d-9decde894a3d")
IApplicationActivationManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ActivateApplication(
        LPCWSTR appUserModelId,
        LPCWSTR arguments,
        ACTIVATEOPTIONS options,
        DWORD *processId) = 0;

    virtual HRESULT STDMETHODCALLTYPE ActivateForFile(
        LPCWSTR appUserModelId,
        IShellItemArray *itemArray,
        LPCWSTR verb,
        DWORD *processId) = 0;

    virtual HRESULT STDMETHODCALLTYPE ActivateForProtocol(
        LPCWSTR appUserModelId,
        IShellItemArray *itemArray,
        DWORD *processId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IApplicationActivationManager, 0x2e941141, 0x7f97, 0x4756, 0xba,0x1d, 0x9d,0xec,0xde,0x89,0x4a,0x3d)
#endif
#else
typedef struct IApplicationActivationManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IApplicationActivationManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IApplicationActivationManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IApplicationActivationManager *This);

    /*** IApplicationActivationManager methods ***/
    HRESULT (STDMETHODCALLTYPE *ActivateApplication)(
        IApplicationActivationManager *This,
        LPCWSTR appUserModelId,
        LPCWSTR arguments,
        ACTIVATEOPTIONS options,
        DWORD *processId);

    HRESULT (STDMETHODCALLTYPE *ActivateForFile)(
        IApplicationActivationManager *This,
        LPCWSTR appUserModelId,
        IShellItemArray *itemArray,
        LPCWSTR verb,
        DWORD *processId);

    HRESULT (STDMETHODCALLTYPE *ActivateForProtocol)(
        IApplicationActivationManager *This,
        LPCWSTR appUserModelId,
        IShellItemArray *itemArray,
        DWORD *processId);

    END_INTERFACE
} IApplicationActivationManagerVtbl;

interface IApplicationActivationManager {
    CONST_VTBL IApplicationActivationManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IApplicationActivationManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IApplicationActivationManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IApplicationActivationManager_Release(This) (This)->lpVtbl->Release(This)
/*** IApplicationActivationManager methods ***/
#define IApplicationActivationManager_ActivateApplication(This,appUserModelId,arguments,options,processId) (This)->lpVtbl->ActivateApplication(This,appUserModelId,arguments,options,processId)
#define IApplicationActivationManager_ActivateForFile(This,appUserModelId,itemArray,verb,processId) (This)->lpVtbl->ActivateForFile(This,appUserModelId,itemArray,verb,processId)
#define IApplicationActivationManager_ActivateForProtocol(This,appUserModelId,itemArray,processId) (This)->lpVtbl->ActivateForProtocol(This,appUserModelId,itemArray,processId)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IApplicationActivationManager_QueryInterface(IApplicationActivationManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IApplicationActivationManager_AddRef(IApplicationActivationManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IApplicationActivationManager_Release(IApplicationActivationManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationActivationManager methods ***/
static FORCEINLINE HRESULT IApplicationActivationManager_ActivateApplication(IApplicationActivationManager* This,LPCWSTR appUserModelId,LPCWSTR arguments,ACTIVATEOPTIONS options,DWORD *processId) {
    return This->lpVtbl->ActivateApplication(This,appUserModelId,arguments,options,processId);
}
static FORCEINLINE HRESULT IApplicationActivationManager_ActivateForFile(IApplicationActivationManager* This,LPCWSTR appUserModelId,IShellItemArray *itemArray,LPCWSTR verb,DWORD *processId) {
    return This->lpVtbl->ActivateForFile(This,appUserModelId,itemArray,verb,processId);
}
static FORCEINLINE HRESULT IApplicationActivationManager_ActivateForProtocol(IApplicationActivationManager* This,LPCWSTR appUserModelId,IShellItemArray *itemArray,DWORD *processId) {
    return This->lpVtbl->ActivateForProtocol(This,appUserModelId,itemArray,processId);
}
#endif
#endif

#endif


#endif  /* __IApplicationActivationManager_INTERFACE_DEFINED__ */

#endif

#ifndef __ShellObjects_LIBRARY_DEFINED__
#define __ShellObjects_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_ShellObjects, 0x50a7e9b1, 0x70ef, 0x11d1, 0xb7,0x5a, 0x00,0xa0,0xc9,0x05,0x64,0xfe);

/*****************************************************************************
 * DesktopWallpaper coclass
 */

DEFINE_GUID(CLSID_DesktopWallpaper, 0xc2cf3110, 0x460e, 0x4fc1, 0xb9,0xd0, 0x8a,0x1c,0x0c,0x9c,0xc4,0xbd);

#ifdef __cplusplus
class DECLSPEC_UUID("c2cf3110-460e-4fc1-b9d0-8a1c0c9cc4bd") DesktopWallpaper;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DesktopWallpaper, 0xc2cf3110, 0x460e, 0x4fc1, 0xb9,0xd0, 0x8a,0x1c,0x0c,0x9c,0xc4,0xbd)
#endif
#endif

/*****************************************************************************
 * ShellDesktop coclass
 */

DEFINE_GUID(CLSID_ShellDesktop, 0x00021400, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);

#ifdef __cplusplus
class DECLSPEC_UUID("00021400-0000-0000-c000-000000000046") ShellDesktop;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ShellDesktop, 0x00021400, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#endif

/*****************************************************************************
 * ShellFSFolder coclass
 */

DEFINE_GUID(CLSID_ShellFSFolder, 0xf3364ba0, 0x65b9, 0x11ce, 0xa9,0xba, 0x00,0xaa,0x00,0x4a,0xe8,0x37);

#ifdef __cplusplus
class DECLSPEC_UUID("f3364ba0-65b9-11ce-a9ba-00aa004ae837") ShellFSFolder;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ShellFSFolder, 0xf3364ba0, 0x65b9, 0x11ce, 0xa9,0xba, 0x00,0xaa,0x00,0x4a,0xe8,0x37)
#endif
#endif

/*****************************************************************************
 * NetworkPlaces coclass
 */

DEFINE_GUID(CLSID_NetworkPlaces, 0x208d2c60, 0x3aea, 0x1069, 0xa2,0xd7, 0x08,0x00,0x2b,0x30,0x30,0x9d);

#ifdef __cplusplus
class DECLSPEC_UUID("208d2c60-3aea-1069-a2d7-08002b30309d") NetworkPlaces;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(NetworkPlaces, 0x208d2c60, 0x3aea, 0x1069, 0xa2,0xd7, 0x08,0x00,0x2b,0x30,0x30,0x9d)
#endif
#endif

/*****************************************************************************
 * ShellLink coclass
 */

DEFINE_GUID(CLSID_ShellLink, 0x00021401, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);

#ifdef __cplusplus
class DECLSPEC_UUID("00021401-0000-0000-c000-000000000046") ShellLink;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ShellLink, 0x00021401, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#endif

/*****************************************************************************
 * QueryCancelAutoPlay coclass
 */

DEFINE_GUID(CLSID_QueryCancelAutoPlay, 0x331f1768, 0x05a9, 0x4ddd, 0xb8,0x6e, 0xda,0xe3,0x4d,0xdc,0x99,0x8a);

#ifdef __cplusplus
class DECLSPEC_UUID("331f1768-05a9-4ddd-b86e-dae34ddc998a") QueryCancelAutoPlay;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(QueryCancelAutoPlay, 0x331f1768, 0x05a9, 0x4ddd, 0xb8,0x6e, 0xda,0xe3,0x4d,0xdc,0x99,0x8a)
#endif
#endif

/*****************************************************************************
 * DriveSizeCategorizer coclass
 */

DEFINE_GUID(CLSID_DriveSizeCategorizer, 0x94357b53, 0xca29, 0x4b78, 0x83,0xae, 0xe8,0xfe,0x74,0x09,0x13,0x4f);

#ifdef __cplusplus
class DECLSPEC_UUID("94357b53-ca29-4b78-83ae-e8fe7409134f") DriveSizeCategorizer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DriveSizeCategorizer, 0x94357b53, 0xca29, 0x4b78, 0x83,0xae, 0xe8,0xfe,0x74,0x09,0x13,0x4f)
#endif
#endif

/*****************************************************************************
 * DriveTypeCategorizer coclass
 */

DEFINE_GUID(CLSID_DriveTypeCategorizer, 0xb0a8f3cf, 0x4333, 0x4bab, 0x88,0x73, 0x1c,0xcb,0x1c,0xad,0xa4,0x8b);

#ifdef __cplusplus
class DECLSPEC_UUID("b0a8f3cf-4333-4bab-8873-1ccb1cada48b") DriveTypeCategorizer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DriveTypeCategorizer, 0xb0a8f3cf, 0x4333, 0x4bab, 0x88,0x73, 0x1c,0xcb,0x1c,0xad,0xa4,0x8b)
#endif
#endif

/*****************************************************************************
 * FreeSpaceCategorizer coclass
 */

DEFINE_GUID(CLSID_FreeSpaceCategorizer, 0xb5607793, 0x24ac, 0x44c7, 0x82,0xe2, 0x83,0x17,0x26,0xaa,0x6c,0xb7);

#ifdef __cplusplus
class DECLSPEC_UUID("b5607793-24ac-44c7-82e2-831726aa6cb7") FreeSpaceCategorizer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FreeSpaceCategorizer, 0xb5607793, 0x24ac, 0x44c7, 0x82,0xe2, 0x83,0x17,0x26,0xaa,0x6c,0xb7)
#endif
#endif

/*****************************************************************************
 * TimeCategorizer coclass
 */

DEFINE_GUID(CLSID_TimeCategorizer, 0x3bb4118f, 0xddfd, 0x4d30, 0xa3,0x48, 0x9f,0xb5,0xd6,0xbf,0x1a,0xfe);

#ifdef __cplusplus
class DECLSPEC_UUID("3bb4118f-ddfd-4d30-a348-9fb5d6bf1afe") TimeCategorizer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(TimeCategorizer, 0x3bb4118f, 0xddfd, 0x4d30, 0xa3,0x48, 0x9f,0xb5,0xd6,0xbf,0x1a,0xfe)
#endif
#endif

/*****************************************************************************
 * SizeCategorizer coclass
 */

DEFINE_GUID(CLSID_SizeCategorizer, 0x55d7b852, 0xf6d1, 0x42f2, 0xaa,0x75, 0x87,0x28,0xa1,0xb2,0xd2,0x64);

#ifdef __cplusplus
class DECLSPEC_UUID("55d7b852-f6d1-42f2-aa75-8728a1b2d264") SizeCategorizer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SizeCategorizer, 0x55d7b852, 0xf6d1, 0x42f2, 0xaa,0x75, 0x87,0x28,0xa1,0xb2,0xd2,0x64)
#endif
#endif

/*****************************************************************************
 * AlphabeticalCategorizer coclass
 */

DEFINE_GUID(CLSID_AlphabeticalCategorizer, 0x3c2654c6, 0x7372, 0x4f6b, 0xb3,0x10, 0x55,0xd6,0x12,0x8f,0x49,0xd2);

#ifdef __cplusplus
class DECLSPEC_UUID("3c2654c6-7372-4f6b-b310-55d6128f49d2") AlphabeticalCategorizer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AlphabeticalCategorizer, 0x3c2654c6, 0x7372, 0x4f6b, 0xb3,0x10, 0x55,0xd6,0x12,0x8f,0x49,0xd2)
#endif
#endif

/*****************************************************************************
 * MergedCategorizer coclass
 */

DEFINE_GUID(CLSID_MergedCategorizer, 0x8e827c11, 0x33e7, 0x4bc1, 0xb2,0x42, 0x8c,0xd9,0xa1,0xc2,0xb3,0x04);

#ifdef __cplusplus
class DECLSPEC_UUID("8e827c11-33e7-4bc1-b242-8cd9a1c2b304") MergedCategorizer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MergedCategorizer, 0x8e827c11, 0x33e7, 0x4bc1, 0xb2,0x42, 0x8c,0xd9,0xa1,0xc2,0xb3,0x04)
#endif
#endif

/*****************************************************************************
 * ImageProperties coclass
 */

DEFINE_GUID(CLSID_ImageProperties, 0x7ab770c7, 0x0e23, 0x4d7a, 0x8a,0xa2, 0x19,0xbf,0xad,0x47,0x98,0x29);

#ifdef __cplusplus
class DECLSPEC_UUID("7ab770c7-0e23-4d7a-8aa2-19bfad479829") ImageProperties;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ImageProperties, 0x7ab770c7, 0x0e23, 0x4d7a, 0x8a,0xa2, 0x19,0xbf,0xad,0x47,0x98,0x29)
#endif
#endif

/*****************************************************************************
 * PropertiesUI coclass
 */

DEFINE_GUID(CLSID_PropertiesUI, 0xd912f8cf, 0x0396, 0x4915, 0x88,0x4e, 0xfb,0x42,0x5d,0x32,0x94,0x3b);

#ifdef __cplusplus
class DECLSPEC_UUID("d912f8cf-0396-4915-884e-fb425d32943b") PropertiesUI;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PropertiesUI, 0xd912f8cf, 0x0396, 0x4915, 0x88,0x4e, 0xfb,0x42,0x5d,0x32,0x94,0x3b)
#endif
#endif

/*****************************************************************************
 * UserNotification coclass
 */

DEFINE_GUID(CLSID_UserNotification, 0x0010890e, 0x8789, 0x413c, 0xad,0xbc, 0x48,0xf5,0xb5,0x11,0xb3,0xaf);

#ifdef __cplusplus
class DECLSPEC_UUID("0010890e-8789-413c-adbc-48f5b511b3af") UserNotification;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(UserNotification, 0x0010890e, 0x8789, 0x413c, 0xad,0xbc, 0x48,0xf5,0xb5,0x11,0xb3,0xaf)
#endif
#endif

/*****************************************************************************
 * CDBurn coclass
 */

DEFINE_GUID(CLSID_CDBurn, 0xfbeb8a05, 0xbeee, 0x4442, 0x80,0x4e, 0x40,0x9d,0x6c,0x45,0x15,0xe9);

#ifdef __cplusplus
class DECLSPEC_UUID("fbeb8a05-beee-4442-804e-409d6c4515e9") CDBurn;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CDBurn, 0xfbeb8a05, 0xbeee, 0x4442, 0x80,0x4e, 0x40,0x9d,0x6c,0x45,0x15,0xe9)
#endif
#endif

/*****************************************************************************
 * TaskbarList coclass
 */

DEFINE_GUID(CLSID_TaskbarList, 0x56fdf344, 0xfd6d, 0x11d0, 0x95,0x8a, 0x00,0x60,0x97,0xc9,0xa0,0x90);

#ifdef __cplusplus
class DECLSPEC_UUID("56fdf344-fd6d-11d0-958a-006097c9a090") TaskbarList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(TaskbarList, 0x56fdf344, 0xfd6d, 0x11d0, 0x95,0x8a, 0x00,0x60,0x97,0xc9,0xa0,0x90)
#endif
#endif

/*****************************************************************************
 * StartMenuPin coclass
 */

DEFINE_GUID(CLSID_StartMenuPin, 0xa2a9545d, 0xa0c2, 0x42b4, 0x97,0x08, 0xa0,0xb2,0xba,0xdd,0x77,0xc8);

#ifdef __cplusplus
class DECLSPEC_UUID("a2a9545d-a0c2-42b4-9708-a0b2badd77c8") StartMenuPin;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(StartMenuPin, 0xa2a9545d, 0xa0c2, 0x42b4, 0x97,0x08, 0xa0,0xb2,0xba,0xdd,0x77,0xc8)
#endif
#endif

/*****************************************************************************
 * WebWizardHost coclass
 */

DEFINE_GUID(CLSID_WebWizardHost, 0xc827f149, 0x55c1, 0x4d28, 0x93,0x5e, 0x57,0xe4,0x7c,0xae,0xd9,0x73);

#ifdef __cplusplus
class DECLSPEC_UUID("c827f149-55c1-4d28-935e-57e47caed973") WebWizardHost;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WebWizardHost, 0xc827f149, 0x55c1, 0x4d28, 0x93,0x5e, 0x57,0xe4,0x7c,0xae,0xd9,0x73)
#endif
#endif

/*****************************************************************************
 * PublishDropTarget coclass
 */

DEFINE_GUID(CLSID_PublishDropTarget, 0xcc6eeffb, 0x43f6, 0x46c5, 0x96,0x19, 0x51,0xd5,0x71,0x96,0x7f,0x7d);

#ifdef __cplusplus
class DECLSPEC_UUID("cc6eeffb-43f6-46c5-9619-51d571967f7d") PublishDropTarget;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PublishDropTarget, 0xcc6eeffb, 0x43f6, 0x46c5, 0x96,0x19, 0x51,0xd5,0x71,0x96,0x7f,0x7d)
#endif
#endif

/*****************************************************************************
 * PublishingWizard coclass
 */

DEFINE_GUID(CLSID_PublishingWizard, 0x6b33163c, 0x76a5, 0x4b6c, 0xbf,0x21, 0x45,0xde,0x9c,0xd5,0x03,0xa1);

#ifdef __cplusplus
class DECLSPEC_UUID("6b33163c-76a5-4b6c-bf21-45de9cd503a1") PublishingWizard;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PublishingWizard, 0x6b33163c, 0x76a5, 0x4b6c, 0xbf,0x21, 0x45,0xde,0x9c,0xd5,0x03,0xa1)
#endif
#endif

#define SID_PublishingWizard CLSID_PublishingWizard
/*****************************************************************************
 * InternetPrintOrdering coclass
 */

DEFINE_GUID(CLSID_InternetPrintOrdering, 0xadd36aa8, 0x751a, 0x4579, 0xa2,0x66, 0xd6,0x6f,0x52,0x02,0xcc,0xbb);

#ifdef __cplusplus
class DECLSPEC_UUID("add36aa8-751a-4579-a266-d66f5202ccbb") InternetPrintOrdering;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(InternetPrintOrdering, 0xadd36aa8, 0x751a, 0x4579, 0xa2,0x66, 0xd6,0x6f,0x52,0x02,0xcc,0xbb)
#endif
#endif

/*****************************************************************************
 * FolderViewHost coclass
 */

DEFINE_GUID(CLSID_FolderViewHost, 0x20b1cb23, 0x6968, 0x4eb9, 0xb7,0xd4, 0xa6,0x6d,0x00,0xd0,0x7c,0xee);

#ifdef __cplusplus
class DECLSPEC_UUID("20b1cb23-6968-4eb9-b7d4-a66d00d07cee") FolderViewHost;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FolderViewHost, 0x20b1cb23, 0x6968, 0x4eb9, 0xb7,0xd4, 0xa6,0x6d,0x00,0xd0,0x7c,0xee)
#endif
#endif

/*****************************************************************************
 * ExplorerBrowser coclass
 */

DEFINE_GUID(CLSID_ExplorerBrowser, 0x71f96385, 0xddd6, 0x48d3, 0xa0,0xc1, 0xae,0x06,0xe8,0xb0,0x55,0xfb);

#ifdef __cplusplus
class DECLSPEC_UUID("71f96385-ddd6-48d3-a0c1-ae06e8b055fb") ExplorerBrowser;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ExplorerBrowser, 0x71f96385, 0xddd6, 0x48d3, 0xa0,0xc1, 0xae,0x06,0xe8,0xb0,0x55,0xfb)
#endif
#endif

/*****************************************************************************
 * ImageRecompress coclass
 */

DEFINE_GUID(CLSID_ImageRecompress, 0x6e33091c, 0xd2f8, 0x4740, 0xb5,0x5e, 0x2e,0x11,0xd1,0x47,0x7a,0x2c);

#ifdef __cplusplus
class DECLSPEC_UUID("6e33091c-d2f8-4740-b55e-2e11d1477a2c") ImageRecompress;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ImageRecompress, 0x6e33091c, 0xd2f8, 0x4740, 0xb5,0x5e, 0x2e,0x11,0xd1,0x47,0x7a,0x2c)
#endif
#endif

/*****************************************************************************
 * TrayBandSiteService coclass
 */

DEFINE_GUID(CLSID_TrayBandSiteService, 0xf60ad0a0, 0xe5e1, 0x45cb, 0xb5,0x1a, 0xe1,0x5b,0x9f,0x8b,0x29,0x34);

#ifdef __cplusplus
class DECLSPEC_UUID("f60ad0a0-e5e1-45cb-b51a-e15b9f8b2934") TrayBandSiteService;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(TrayBandSiteService, 0xf60ad0a0, 0xe5e1, 0x45cb, 0xb5,0x1a, 0xe1,0x5b,0x9f,0x8b,0x29,0x34)
#endif
#endif

/*****************************************************************************
 * TrayDeskBand coclass
 */

DEFINE_GUID(CLSID_TrayDeskBand, 0xe6442437, 0x6c68, 0x4f52, 0x94,0xdd, 0x2c,0xfe,0xd2,0x67,0xef,0xb9);

#ifdef __cplusplus
class DECLSPEC_UUID("e6442437-6c68-4f52-94dd-2cfed267efb9") TrayDeskBand;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(TrayDeskBand, 0xe6442437, 0x6c68, 0x4f52, 0x94,0xdd, 0x2c,0xfe,0xd2,0x67,0xef,0xb9)
#endif
#endif

/*****************************************************************************
 * AttachmentServices coclass
 */

DEFINE_GUID(CLSID_AttachmentServices, 0x4125dd96, 0xe03a, 0x4103, 0x8f,0x70, 0xe0,0x59,0x7d,0x80,0x3b,0x9c);

#ifdef __cplusplus
class DECLSPEC_UUID("4125dd96-e03a-4103-8f70-e0597d803b9c") AttachmentServices;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AttachmentServices, 0x4125dd96, 0xe03a, 0x4103, 0x8f,0x70, 0xe0,0x59,0x7d,0x80,0x3b,0x9c)
#endif
#endif

/*****************************************************************************
 * DocPropShellExtension coclass
 */

DEFINE_GUID(CLSID_DocPropShellExtension, 0x883373c3, 0xbf89, 0x11d1, 0xbe,0x35, 0x08,0x00,0x36,0xb1,0x1a,0x03);

#ifdef __cplusplus
class DECLSPEC_UUID("883373c3-bf89-11d1-be35-080036b11a03") DocPropShellExtension;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DocPropShellExtension, 0x883373c3, 0xbf89, 0x11d1, 0xbe,0x35, 0x08,0x00,0x36,0xb1,0x1a,0x03)
#endif
#endif

/*****************************************************************************
 * ShellItem coclass
 */

DEFINE_GUID(CLSID_ShellItem, 0x9ac9fbe1, 0xe0a2, 0x4ad6, 0xb4,0xee, 0xe2,0x12,0x01,0x3e,0xa9,0x17);

#ifdef __cplusplus
class DECLSPEC_UUID("9ac9fbe1-e0a2-4ad6-b4ee-e212013ea917") ShellItem;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ShellItem, 0x9ac9fbe1, 0xe0a2, 0x4ad6, 0xb4,0xee, 0xe2,0x12,0x01,0x3e,0xa9,0x17)
#endif
#endif

/*****************************************************************************
 * NamespaceWalker coclass
 */

DEFINE_GUID(CLSID_NamespaceWalker, 0x72eb61e0, 0x8672, 0x4303, 0x91,0x75, 0xf2,0xe4,0xc6,0x8b,0x2e,0x7c);

#ifdef __cplusplus
class DECLSPEC_UUID("72eb61e0-8672-4303-9175-f2e4c68b2e7c") NamespaceWalker;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(NamespaceWalker, 0x72eb61e0, 0x8672, 0x4303, 0x91,0x75, 0xf2,0xe4,0xc6,0x8b,0x2e,0x7c)
#endif
#endif

/*****************************************************************************
 * FileOperation coclass
 */

DEFINE_GUID(CLSID_FileOperation, 0x3ad05575, 0x8857, 0x4850, 0x92,0x77, 0x11,0xb8,0x5b,0xdb,0x8e,0x09);

#ifdef __cplusplus
class DECLSPEC_UUID("3ad05575-8857-4850-9277-11b85bdb8e09") FileOperation;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FileOperation, 0x3ad05575, 0x8857, 0x4850, 0x92,0x77, 0x11,0xb8,0x5b,0xdb,0x8e,0x09)
#endif
#endif

/*****************************************************************************
 * FileOpenDialog coclass
 */

DEFINE_GUID(CLSID_FileOpenDialog, 0xdc1c5a9c, 0xe88a, 0x4dde, 0xa5,0xa1, 0x60,0xf8,0x2a,0x20,0xae,0xf7);

#ifdef __cplusplus
class DECLSPEC_UUID("dc1c5a9c-e88a-4dde-a5a1-60f82a20aef7") FileOpenDialog;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FileOpenDialog, 0xdc1c5a9c, 0xe88a, 0x4dde, 0xa5,0xa1, 0x60,0xf8,0x2a,0x20,0xae,0xf7)
#endif
#endif

/*****************************************************************************
 * FileSaveDialog coclass
 */

DEFINE_GUID(CLSID_FileSaveDialog, 0xc0b4e2f3, 0xba21, 0x4773, 0x8d,0xba, 0x33,0x5e,0xc9,0x46,0xeb,0x8b);

#ifdef __cplusplus
class DECLSPEC_UUID("c0b4e2f3-ba21-4773-8dba-335ec946eb8b") FileSaveDialog;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FileSaveDialog, 0xc0b4e2f3, 0xba21, 0x4773, 0x8d,0xba, 0x33,0x5e,0xc9,0x46,0xeb,0x8b)
#endif
#endif

/*****************************************************************************
 * KnownFolderManager coclass
 */

DEFINE_GUID(CLSID_KnownFolderManager, 0x4df0c730, 0xdf9d, 0x4ae3, 0x91,0x53, 0xaa,0x6b,0x82,0xe9,0x79,0x5a);

#ifdef __cplusplus
class DECLSPEC_UUID("4df0c730-df9d-4ae3-9153-aa6b82e9795a") KnownFolderManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(KnownFolderManager, 0x4df0c730, 0xdf9d, 0x4ae3, 0x91,0x53, 0xaa,0x6b,0x82,0xe9,0x79,0x5a)
#endif
#endif

/*****************************************************************************
 * FSCopyHandler coclass
 */

DEFINE_GUID(CLSID_FSCopyHandler, 0xd197380a, 0x0a79, 0x4dc8, 0xa0,0x33, 0xed,0x88,0x2c,0x2f,0xa1,0x4b);

#ifdef __cplusplus
class DECLSPEC_UUID("d197380a-0a79-4dc8-a033-ed882c2fa14b") FSCopyHandler;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FSCopyHandler, 0xd197380a, 0x0a79, 0x4dc8, 0xa0,0x33, 0xed,0x88,0x2c,0x2f,0xa1,0x4b)
#endif
#endif

/*****************************************************************************
 * SharingConfigurationManager coclass
 */

DEFINE_GUID(CLSID_SharingConfigurationManager, 0x49f371e1, 0x8c5c, 0x4d9c, 0x9a,0x3b, 0x54,0xa6,0x82,0x7f,0x51,0x3c);

#ifdef __cplusplus
class DECLSPEC_UUID("49f371e1-8c5c-4d9c-9a3b-54a6827f513c") SharingConfigurationManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SharingConfigurationManager, 0x49f371e1, 0x8c5c, 0x4d9c, 0x9a,0x3b, 0x54,0xa6,0x82,0x7f,0x51,0x3c)
#endif
#endif

/*****************************************************************************
 * PreviousVersions coclass
 */

DEFINE_GUID(CLSID_PreviousVersions, 0x596ab062, 0xb4d2, 0x4215, 0x9f,0x74, 0xe9,0x10,0x9b,0x0a,0x81,0x53);

#ifdef __cplusplus
class DECLSPEC_UUID("596ab062-b4d2-4215-9f74-e9109b0a8153") PreviousVersions;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PreviousVersions, 0x596ab062, 0xb4d2, 0x4215, 0x9f,0x74, 0xe9,0x10,0x9b,0x0a,0x81,0x53)
#endif
#endif

/*****************************************************************************
 * NetworkConnections coclass
 */

DEFINE_GUID(CLSID_NetworkConnections, 0x7007acc7, 0x3202, 0x11d1, 0xaa,0xd2, 0x00,0x80,0x5f,0xc1,0x27,0x0e);

#ifdef __cplusplus
class DECLSPEC_UUID("7007acc7-3202-11d1-aad2-00805fc1270e") NetworkConnections;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(NetworkConnections, 0x7007acc7, 0x3202, 0x11d1, 0xaa,0xd2, 0x00,0x80,0x5f,0xc1,0x27,0x0e)
#endif
#endif

/*****************************************************************************
 * NamespaceTreeControl coclass
 */

DEFINE_GUID(CLSID_NamespaceTreeControl, 0xae054212, 0x3535, 0x4430, 0x83,0xed, 0xd5,0x01,0xaa,0x66,0x80,0xe6);

#ifdef __cplusplus
class DECLSPEC_UUID("ae054212-3535-4430-83ed-d501aa6680e6") NamespaceTreeControl;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(NamespaceTreeControl, 0xae054212, 0x3535, 0x4430, 0x83,0xed, 0xd5,0x01,0xaa,0x66,0x80,0xe6)
#endif
#endif

/*****************************************************************************
 * IENamespaceTreeControl coclass
 */

DEFINE_GUID(CLSID_IENamespaceTreeControl, 0xace52d03, 0xe5cd, 0x4b20, 0x82,0xff, 0xe7,0x1b,0x11,0xbe,0xae,0x1d);

#ifdef __cplusplus
class DECLSPEC_UUID("ace52d03-e5cd-4b20-82ff-e71b11beae1d") IENamespaceTreeControl;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IENamespaceTreeControl, 0xace52d03, 0xe5cd, 0x4b20, 0x82,0xff, 0xe7,0x1b,0x11,0xbe,0xae,0x1d)
#endif
#endif

/*****************************************************************************
 * ScheduledTasks coclass
 */

DEFINE_GUID(CLSID_ScheduledTasks, 0xd6277990, 0x4c6a, 0x11cf, 0x8d,0x87, 0x00,0xaa,0x00,0x60,0xf5,0xbf);

#ifdef __cplusplus
class DECLSPEC_UUID("d6277990-4c6a-11cf-8d87-00aa0060f5bf") ScheduledTasks;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ScheduledTasks, 0xd6277990, 0x4c6a, 0x11cf, 0x8d,0x87, 0x00,0xaa,0x00,0x60,0xf5,0xbf)
#endif
#endif

/*****************************************************************************
 * ApplicationAssociationRegistration coclass
 */

DEFINE_GUID(CLSID_ApplicationAssociationRegistration, 0x591209c7, 0x767b, 0x42b2, 0x9f,0xba, 0x44,0xee,0x46,0x15,0xf2,0xc7);

#ifdef __cplusplus
class DECLSPEC_UUID("591209c7-767b-42b2-9fba-44ee4615f2c7") ApplicationAssociationRegistration;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ApplicationAssociationRegistration, 0x591209c7, 0x767b, 0x42b2, 0x9f,0xba, 0x44,0xee,0x46,0x15,0xf2,0xc7)
#endif
#endif

/*****************************************************************************
 * ApplicationAssociationRegistrationUI coclass
 */

DEFINE_GUID(CLSID_ApplicationAssociationRegistrationUI, 0x1968106d, 0xf3b5, 0x44cf, 0x89,0x0e, 0x11,0x6f,0xcb,0x9e,0xce,0xf1);

#ifdef __cplusplus
class DECLSPEC_UUID("1968106d-f3b5-44cf-890e-116fcb9ecef1") ApplicationAssociationRegistrationUI;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ApplicationAssociationRegistrationUI, 0x1968106d, 0xf3b5, 0x44cf, 0x89,0x0e, 0x11,0x6f,0xcb,0x9e,0xce,0xf1)
#endif
#endif

/*****************************************************************************
 * SearchFolderItemFactory coclass
 */

DEFINE_GUID(CLSID_SearchFolderItemFactory, 0x14010e02, 0xbbbd, 0x41f0, 0x88,0xe3, 0xed,0xa3,0x71,0x21,0x65,0x84);

#ifdef __cplusplus
class DECLSPEC_UUID("14010e02-bbbd-41f0-88e3-eda371216584") SearchFolderItemFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SearchFolderItemFactory, 0x14010e02, 0xbbbd, 0x41f0, 0x88,0xe3, 0xed,0xa3,0x71,0x21,0x65,0x84)
#endif
#endif

/*****************************************************************************
 * OpenControlPanel coclass
 */

DEFINE_GUID(CLSID_OpenControlPanel, 0x06622d85, 0x6856, 0x4460, 0x8d,0xe1, 0xa8,0x19,0x21,0xb4,0x1c,0x4b);

#ifdef __cplusplus
class DECLSPEC_UUID("06622d85-6856-4460-8de1-a81921b41c4b") OpenControlPanel;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(OpenControlPanel, 0x06622d85, 0x6856, 0x4460, 0x8d,0xe1, 0xa8,0x19,0x21,0xb4,0x1c,0x4b)
#endif
#endif

/*****************************************************************************
 * MailRecipient coclass
 */

DEFINE_GUID(CLSID_MailRecipient, 0x9e56be60, 0xc50f, 0x11cf, 0x9a,0x2c, 0x00,0xa0,0xc9,0x0a,0x90,0xce);

#ifdef __cplusplus
class DECLSPEC_UUID("9e56be60-c50f-11cf-9a2c-00a0c90a90ce") MailRecipient;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MailRecipient, 0x9e56be60, 0xc50f, 0x11cf, 0x9a,0x2c, 0x00,0xa0,0xc9,0x0a,0x90,0xce)
#endif
#endif

/*****************************************************************************
 * NetworkExplorerFolder coclass
 */

DEFINE_GUID(CLSID_NetworkExplorerFolder, 0xf02c1a0d, 0xbe21, 0x4350, 0x88,0xb0, 0x73,0x67,0xfc,0x96,0xef,0x3c);

#ifdef __cplusplus
class DECLSPEC_UUID("f02c1a0d-be21-4350-88b0-7367fc96ef3c") NetworkExplorerFolder;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(NetworkExplorerFolder, 0xf02c1a0d, 0xbe21, 0x4350, 0x88,0xb0, 0x73,0x67,0xfc,0x96,0xef,0x3c)
#endif
#endif

/*****************************************************************************
 * DestinationList coclass
 */

DEFINE_GUID(CLSID_DestinationList, 0x77f10cf0, 0x3db5, 0x4966, 0xb5,0x20, 0xb7,0xc5,0x4f,0xd3,0x5e,0xd6);

#ifdef __cplusplus
class DECLSPEC_UUID("77f10cf0-3db5-4966-b520-b7c54fd35ed6") DestinationList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DestinationList, 0x77f10cf0, 0x3db5, 0x4966, 0xb5,0x20, 0xb7,0xc5,0x4f,0xd3,0x5e,0xd6)
#endif
#endif

/*****************************************************************************
 * ApplicationDestinations coclass
 */

DEFINE_GUID(CLSID_ApplicationDestinations, 0x86c14003, 0x4d6b, 0x4ef3, 0xa7,0xb4, 0x05,0x06,0x66,0x3b,0x2e,0x68);

#ifdef __cplusplus
class DECLSPEC_UUID("86c14003-4d6b-4ef3-a7b4-0506663b2e68") ApplicationDestinations;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ApplicationDestinations, 0x86c14003, 0x4d6b, 0x4ef3, 0xa7,0xb4, 0x05,0x06,0x66,0x3b,0x2e,0x68)
#endif
#endif

/*****************************************************************************
 * ApplicationDocumentLists coclass
 */

DEFINE_GUID(CLSID_ApplicationDocumentLists, 0x86bec222, 0x30f2, 0x47e0, 0x9f,0x25, 0x60,0xd1,0x1c,0xd7,0x5c,0x28);

#ifdef __cplusplus
class DECLSPEC_UUID("86bec222-30f2-47e0-9f25-60d11cd75c28") ApplicationDocumentLists;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ApplicationDocumentLists, 0x86bec222, 0x30f2, 0x47e0, 0x9f,0x25, 0x60,0xd1,0x1c,0xd7,0x5c,0x28)
#endif
#endif

/*****************************************************************************
 * HomeGroup coclass
 */

DEFINE_GUID(CLSID_HomeGroup, 0xde77ba04, 0x3c92, 0x4d11, 0xa1,0xa5, 0x42,0x35,0x2a,0x53,0xe0,0xe3);

#ifdef __cplusplus
class DECLSPEC_UUID("de77ba04-3c92-4d11-a1a5-42352a53e0e3") HomeGroup;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(HomeGroup, 0xde77ba04, 0x3c92, 0x4d11, 0xa1,0xa5, 0x42,0x35,0x2a,0x53,0xe0,0xe3)
#endif
#endif

/*****************************************************************************
 * ShellLibrary coclass
 */

DEFINE_GUID(CLSID_ShellLibrary, 0xd9b3211d, 0xe57f, 0x4426, 0xaa,0xef, 0x30,0xa8,0x06,0xad,0xd3,0x97);

#ifdef __cplusplus
class DECLSPEC_UUID("d9b3211d-e57f-4426-aaef-30a806add397") ShellLibrary;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ShellLibrary, 0xd9b3211d, 0xe57f, 0x4426, 0xaa,0xef, 0x30,0xa8,0x06,0xad,0xd3,0x97)
#endif
#endif

/*****************************************************************************
 * AppStartupLink coclass
 */

DEFINE_GUID(CLSID_AppStartupLink, 0x273eb5e7, 0x88b0, 0x4843, 0xbf,0xef, 0xe2,0xc8,0x1d,0x43,0xaa,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("273eb5e7-88b0-4843-bfef-e2c81d43aae5") AppStartupLink;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AppStartupLink, 0x273eb5e7, 0x88b0, 0x4843, 0xbf,0xef, 0xe2,0xc8,0x1d,0x43,0xaa,0xe5)
#endif
#endif

/*****************************************************************************
 * EnumerableObjectCollection coclass
 */

DEFINE_GUID(CLSID_EnumerableObjectCollection, 0x2d3468c1, 0x36a7, 0x43b6, 0xac,0x24, 0xd3,0xf0,0x2f,0xd9,0x60,0x7a);

#ifdef __cplusplus
class DECLSPEC_UUID("2d3468c1-36a7-43b6-ac24-d3f02fd9607a") EnumerableObjectCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(EnumerableObjectCollection, 0x2d3468c1, 0x36a7, 0x43b6, 0xac,0x24, 0xd3,0xf0,0x2f,0xd9,0x60,0x7a)
#endif
#endif

/*****************************************************************************
 * DesktopGadget coclass
 */

DEFINE_GUID(CLSID_DesktopGadget, 0x924ccc1b, 0x6562, 0x4c85, 0x86,0x57, 0xd1,0x77,0x92,0x52,0x22,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("924ccc1b-6562-4c85-8657-d177925222b6") DesktopGadget;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DesktopGadget, 0x924ccc1b, 0x6562, 0x4c85, 0x86,0x57, 0xd1,0x77,0x92,0x52,0x22,0xb6)
#endif
#endif

/*****************************************************************************
 * PlaybackManager coclass
 */

DEFINE_GUID(CLSID_PlaybackManager, 0x29dfa654, 0xa97f, 0x47f0, 0xbf,0x26, 0x9e,0x41,0xfb,0x94,0x88,0xd9);

#ifdef __cplusplus
class DECLSPEC_UUID("29dfa654-a97f-47f0-bf26-9e41fb9488d9") PlaybackManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PlaybackManager, 0x29dfa654, 0xa97f, 0x47f0, 0xbf,0x26, 0x9e,0x41,0xfb,0x94,0x88,0xd9)
#endif
#endif

/*****************************************************************************
 * AccessibilityDockingService coclass
 */

DEFINE_GUID(CLSID_AccessibilityDockingService, 0x29ce1d46, 0xb481, 0x4aa0, 0xa0,0x8a, 0xd3,0xeb,0xc8,0xac,0xa4,0x02);

#ifdef __cplusplus
class DECLSPEC_UUID("29ce1d46-b481-4aa0-a08a-d3ebc8aca402") AccessibilityDockingService;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AccessibilityDockingService, 0x29ce1d46, 0xb481, 0x4aa0, 0xa0,0x8a, 0xd3,0xeb,0xc8,0xac,0xa4,0x02)
#endif
#endif

/*****************************************************************************
 * FrameworkInputPane coclass
 */

DEFINE_GUID(CLSID_FrameworkInputPane, 0xd5120aa3, 0x46ba, 0x44c5, 0x82,0x2d, 0xca,0x80,0x92,0xc1,0xfc,0x72);

#ifdef __cplusplus
class DECLSPEC_UUID("d5120aa3-46ba-44c5-822d-ca8092c1fc72") FrameworkInputPane;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FrameworkInputPane, 0xd5120aa3, 0x46ba, 0x44c5, 0x82,0x2d, 0xca,0x80,0x92,0xc1,0xfc,0x72)
#endif
#endif

/*****************************************************************************
 * DefFolderMenu coclass
 */

DEFINE_GUID(CLSID_DefFolderMenu, 0xc63382be, 0x7933, 0x48d0, 0x9a,0xc8, 0x85,0xfb,0x46,0xbe,0x2f,0xdd);

#ifdef __cplusplus
class DECLSPEC_UUID("c63382be-7933-48d0-9ac8-85fb46be2fdd") DefFolderMenu;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DefFolderMenu, 0xc63382be, 0x7933, 0x48d0, 0x9a,0xc8, 0x85,0xfb,0x46,0xbe,0x2f,0xdd)
#endif
#endif

/*****************************************************************************
 * AppVisibility coclass
 */

DEFINE_GUID(CLSID_AppVisibility, 0x7e5fe3d9, 0x985f, 0x4908, 0x91,0xf9, 0xee,0x19,0xf9,0xfd,0x15,0x14);

#ifdef __cplusplus
class DECLSPEC_UUID("7e5fe3d9-985f-4908-91f9-ee19f9fd1514") AppVisibility;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AppVisibility, 0x7e5fe3d9, 0x985f, 0x4908, 0x91,0xf9, 0xee,0x19,0xf9,0xfd,0x15,0x14)
#endif
#endif

/*****************************************************************************
 * AppShellVerbHandler coclass
 */

DEFINE_GUID(CLSID_AppShellVerbHandler, 0x4ed3a719, 0xcea8, 0x4bd9, 0x91,0x0d, 0xe2,0x52,0xf9,0x97,0xaf,0xc2);

#ifdef __cplusplus
class DECLSPEC_UUID("4ed3a719-cea8-4bd9-910d-e252f997afc2") AppShellVerbHandler;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AppShellVerbHandler, 0x4ed3a719, 0xcea8, 0x4bd9, 0x91,0x0d, 0xe2,0x52,0xf9,0x97,0xaf,0xc2)
#endif
#endif

/*****************************************************************************
 * ExecuteUnknown coclass
 */

DEFINE_GUID(CLSID_ExecuteUnknown, 0xe44e9428, 0xbdbc, 0x4987, 0xa0,0x99, 0x40,0xdc,0x8f,0xd2,0x55,0xe7);

#ifdef __cplusplus
class DECLSPEC_UUID("e44e9428-bdbc-4987-a099-40dc8fd255e7") ExecuteUnknown;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ExecuteUnknown, 0xe44e9428, 0xbdbc, 0x4987, 0xa0,0x99, 0x40,0xdc,0x8f,0xd2,0x55,0xe7)
#endif
#endif

/*****************************************************************************
 * PackageDebugSettings coclass
 */

DEFINE_GUID(CLSID_PackageDebugSettings, 0xb1aec16f, 0x2383, 0x4852, 0xb0,0xe9, 0x8f,0x0b,0x1d,0xc6,0x6b,0x4d);

#ifdef __cplusplus
class DECLSPEC_UUID("b1aec16f-2383-4852-b0e9-8f0b1dc66b4d") PackageDebugSettings;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PackageDebugSettings, 0xb1aec16f, 0x2383, 0x4852, 0xb0,0xe9, 0x8f,0x0b,0x1d,0xc6,0x6b,0x4d)
#endif
#endif

/*****************************************************************************
 * ApplicationActivationManager coclass
 */

DEFINE_GUID(CLSID_ApplicationActivationManager, 0x45ba127d, 0x10a8, 0x46ea, 0x8a,0xb7, 0x56,0xea,0x90,0x78,0x94,0x3c);

#ifdef __cplusplus
class DECLSPEC_UUID("45ba127d-10a8-46ea-8ab7-56ea9078943c") ApplicationActivationManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ApplicationActivationManager, 0x45ba127d, 0x10a8, 0x46ea, 0x8a,0xb7, 0x56,0xea,0x90,0x78,0x94,0x3c)
#endif
#endif

/*****************************************************************************
 * ApplicationDesignModeSettings coclass
 */

DEFINE_GUID(CLSID_ApplicationDesignModeSettings, 0x958a6fb5, 0xdcb2, 0x4faf, 0xaa,0xfd, 0x7f,0xb0,0x54,0xad,0x1a,0x3b);

#ifdef __cplusplus
class DECLSPEC_UUID("958a6fb5-dcb2-4faf-aafd-7fb054ad1a3b") ApplicationDesignModeSettings;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ApplicationDesignModeSettings, 0x958a6fb5, 0xdcb2, 0x4faf, 0xaa,0xfd, 0x7f,0xb0,0x54,0xad,0x1a,0x3b)
#endif
#endif

/*****************************************************************************
 * ExecuteFolder coclass
 */

DEFINE_GUID(CLSID_ExecuteFolder, 0x11dbb47c, 0xa525, 0x400b, 0x9e,0x80, 0xa5,0x46,0x15,0xa0,0x90,0xc0);

#ifdef __cplusplus
class DECLSPEC_UUID("11dbb47c-a525-400b-9e80-a54615a090c0") ExecuteFolder;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ExecuteFolder, 0x11dbb47c, 0xa525, 0x400b, 0x9e,0x80, 0xa5,0x46,0x15,0xa0,0x90,0xc0)
#endif
#endif

#endif /* __ShellObjects_LIBRARY_DEFINED__ */

#if NTDDI_VERSION >= NTDDI_VISTA
  SHSTDAPI SHGetTemporaryPropertyForItem(IShellItem *psi, REFPROPERTYKEY propkey, PROPVARIANT *ppropvar);
  SHSTDAPI SHSetTemporaryPropertyForItem(IShellItem *psi, REFPROPERTYKEY propkey, REFPROPVARIANT propvar);
#endif

#if NTDDI_VERSION >= NTDDI_WIN7
#if _WIN32_IE >= _WIN32_IE_IE70
typedef enum LIBRARYMANAGEDIALOGOPTIONS {
    LMD_DEFAULT = 0x0,
    LMD_ALLOWUNINDEXABLENETWORKLOCATIONS = 0x1
} LIBRARYMANAGEDIALOGOPTIONS;

DEFINE_ENUM_FLAG_OPERATORS(LIBRARYMANAGEDIALOGOPTIONS)

  SHSTDAPI SHShowManageLibraryUI(IShellItem *psiLibrary, HWND hwndOwner, LPCWSTR pszTitle, LPCWSTR pszInstruction, LIBRARYMANAGEDIALOGOPTIONS lmdOptions);
  SHSTDAPI SHResolveLibrary(IShellItem *psiLibrary);
#if defined(__cplusplus) && !defined(CINTERFACE)
  __forceinline HRESULT SHCreateLibrary(REFIID riid, void **ppv) {
    return CoCreateInstance(CLSID_ShellLibrary, NULL, CLSCTX_INPROC_SERVER, riid, ppv);
  }

  __forceinline HRESULT SHLoadLibraryFromItem(IShellItem *psiLibrary, DWORD grfMode, REFIID riid, void **ppv) {
    IShellLibrary *plib;
    HRESULT hr;

    *ppv = NULL;
    hr = CoCreateInstance(CLSID_ShellLibrary, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&plib));
    if (SUCCEEDED(hr)) {
      hr = plib->LoadLibraryFromItem(psiLibrary, grfMode);
      if (SUCCEEDED(hr))
        hr = plib->QueryInterface(riid, ppv);
      plib->Release();
    }
    return hr;
  }

  __forceinline HRESULT SHLoadLibraryFromKnownFolder(REFKNOWNFOLDERID kfidLibrary, DWORD grfMode, REFIID riid, void **ppv) {
    IShellLibrary *plib;
    HRESULT hr;

    *ppv = NULL;
    hr = CoCreateInstance(CLSID_ShellLibrary, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&plib));
    if (SUCCEEDED(hr)) {
      hr = plib->LoadLibraryFromKnownFolder(kfidLibrary, grfMode);
      if (SUCCEEDED(hr))
        hr = plib->QueryInterface(riid, ppv);
      plib->Release();
    }
    return hr;
  }

  __forceinline HRESULT SHLoadLibraryFromParsingName(PCWSTR pszParsingName, DWORD grfMode, REFIID riid, void **ppv) {
    IShellItem *psiLibrary;
    HRESULT hr;

    *ppv = NULL;
    hr = SHCreateItemFromParsingName(pszParsingName, NULL, IID_PPV_ARGS(&psiLibrary));
    if (SUCCEEDED(hr)) {
      hr = SHLoadLibraryFromItem(psiLibrary, grfMode, riid, ppv);
      psiLibrary->Release();
    }
    return hr;
  }

   __forceinline HRESULT SHAddFolderPathToLibrary(IShellLibrary *plib, PCWSTR pszFolderPath) {
    IShellItem *psiFolder;
    HRESULT hr = SHCreateItemFromParsingName(pszFolderPath, NULL, IID_PPV_ARGS(&psiFolder));

    if (SUCCEEDED(hr)) {
      hr = plib->AddFolder(psiFolder);
      psiFolder->Release();
    }
    return hr;
  }

  __forceinline HRESULT SHRemoveFolderPathFromLibrary(IShellLibrary *plib, PCWSTR pszFolderPath) {
    PIDLIST_ABSOLUTE pidlFolder = SHSimpleIDListFromPath(pszFolderPath);
    HRESULT hr = pidlFolder ? S_OK : E_INVALIDARG;

    if (SUCCEEDED(hr)) {
      IShellItem *psiFolder;

      hr = SHCreateItemFromIDList(pidlFolder, IID_PPV_ARGS(&psiFolder));
      if (SUCCEEDED(hr)) {
        hr = plib->RemoveFolder(psiFolder);
        psiFolder->Release();
      }
      CoTaskMemFree(pidlFolder);
    }
    return hr;
  }

  __forceinline HRESULT SHResolveFolderPathInLibrary(IShellLibrary *plib, PCWSTR pszFolderPath, DWORD dwTimeout, PWSTR *ppszResolvedPath) {
    *ppszResolvedPath = NULL;
    PIDLIST_ABSOLUTE pidlFolder = SHSimpleIDListFromPath(pszFolderPath);
    HRESULT hr = pidlFolder ? S_OK : E_INVALIDARG;
    if (SUCCEEDED(hr)) {
      IShellItem *psiFolder;

      hr = SHCreateItemFromIDList(pidlFolder, IID_PPV_ARGS(&psiFolder));
      if (SUCCEEDED(hr)) {
        IShellItem *psiResolved;

        hr = plib->ResolveFolder(psiFolder, dwTimeout, IID_PPV_ARGS(&psiResolved));
        if (SUCCEEDED(hr)) {
          hr = psiResolved->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, ppszResolvedPath);
          psiResolved->Release();
        }
        psiFolder->Release();
      }
      CoTaskMemFree(pidlFolder);
    }
    return hr;
  }

  __forceinline HRESULT SHSaveLibraryInFolderPath(IShellLibrary *plib, PCWSTR pszFolderPath, PCWSTR pszLibraryName, LIBRARYSAVEFLAGS lsf, PWSTR *ppszSavedToPath) {
    IShellItem *psiFolder;
    HRESULT hr;

    if (ppszSavedToPath)
      *ppszSavedToPath = NULL;
    hr = SHCreateItemFromParsingName(pszFolderPath, NULL, IID_PPV_ARGS(&psiFolder));
    if (SUCCEEDED(hr)) {
      IShellItem *psiSavedTo;

      hr = plib->Save(psiFolder, pszLibraryName, lsf, &psiSavedTo);
      if (SUCCEEDED(hr)) {
        if (ppszSavedToPath)
          hr = psiSavedTo->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, ppszSavedToPath);
        psiSavedTo->Release();
      }
      psiFolder->Release();
    }
    return hr;
  }
#endif
#endif
#endif

#if NTDDI_VERSION >= NTDDI_VISTA
/*****************************************************************************
 * IAssocHandlerInvoker interface
 */
#ifndef __IAssocHandlerInvoker_INTERFACE_DEFINED__
#define __IAssocHandlerInvoker_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAssocHandlerInvoker, 0x92218cab, 0xecaa, 0x4335, 0x81,0x33, 0x80,0x7f,0xd2,0x34,0xc2,0xee);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("92218cab-ecaa-4335-8133-807fd234c2ee")
IAssocHandlerInvoker : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SupportsSelection(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Invoke(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAssocHandlerInvoker, 0x92218cab, 0xecaa, 0x4335, 0x81,0x33, 0x80,0x7f,0xd2,0x34,0xc2,0xee)
#endif
#else
typedef struct IAssocHandlerInvokerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAssocHandlerInvoker *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAssocHandlerInvoker *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAssocHandlerInvoker *This);

    /*** IAssocHandlerInvoker methods ***/
    HRESULT (STDMETHODCALLTYPE *SupportsSelection)(
        IAssocHandlerInvoker *This);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IAssocHandlerInvoker *This);

    END_INTERFACE
} IAssocHandlerInvokerVtbl;

interface IAssocHandlerInvoker {
    CONST_VTBL IAssocHandlerInvokerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAssocHandlerInvoker_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAssocHandlerInvoker_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAssocHandlerInvoker_Release(This) (This)->lpVtbl->Release(This)
/*** IAssocHandlerInvoker methods ***/
#define IAssocHandlerInvoker_SupportsSelection(This) (This)->lpVtbl->SupportsSelection(This)
#define IAssocHandlerInvoker_Invoke(This) (This)->lpVtbl->Invoke(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAssocHandlerInvoker_QueryInterface(IAssocHandlerInvoker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAssocHandlerInvoker_AddRef(IAssocHandlerInvoker* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAssocHandlerInvoker_Release(IAssocHandlerInvoker* This) {
    return This->lpVtbl->Release(This);
}
/*** IAssocHandlerInvoker methods ***/
static FORCEINLINE HRESULT IAssocHandlerInvoker_SupportsSelection(IAssocHandlerInvoker* This) {
    return This->lpVtbl->SupportsSelection(This);
}
static FORCEINLINE HRESULT IAssocHandlerInvoker_Invoke(IAssocHandlerInvoker* This) {
    return This->lpVtbl->Invoke(This);
}
#endif
#endif

#endif


#endif  /* __IAssocHandlerInvoker_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IAssocHandler interface
 */
#ifndef __IAssocHandler_INTERFACE_DEFINED__
#define __IAssocHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAssocHandler, 0xf04061ac, 0x1659, 0x4a3f, 0xa9,0x54, 0x77,0x5a,0xa5,0x7f,0xc0,0x83);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f04061ac-1659-4a3f-a954-775aa57fc083")
IAssocHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetName(
        LPWSTR *ppsz) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUIName(
        LPWSTR *ppsz) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIconLocation(
        LPWSTR *ppszPath,
        int *pIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsRecommended(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE MakeDefault(
        LPCWSTR pszDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE Invoke(
        IDataObject *pdo) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateInvoker(
        IDataObject *pdo,
        IAssocHandlerInvoker **ppInvoker) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAssocHandler, 0xf04061ac, 0x1659, 0x4a3f, 0xa9,0x54, 0x77,0x5a,0xa5,0x7f,0xc0,0x83)
#endif
#else
typedef struct IAssocHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAssocHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAssocHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAssocHandler *This);

    /*** IAssocHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        IAssocHandler *This,
        LPWSTR *ppsz);

    HRESULT (STDMETHODCALLTYPE *GetUIName)(
        IAssocHandler *This,
        LPWSTR *ppsz);

    HRESULT (STDMETHODCALLTYPE *GetIconLocation)(
        IAssocHandler *This,
        LPWSTR *ppszPath,
        int *pIndex);

    HRESULT (STDMETHODCALLTYPE *IsRecommended)(
        IAssocHandler *This);

    HRESULT (STDMETHODCALLTYPE *MakeDefault)(
        IAssocHandler *This,
        LPCWSTR pszDescription);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IAssocHandler *This,
        IDataObject *pdo);

    HRESULT (STDMETHODCALLTYPE *CreateInvoker)(
        IAssocHandler *This,
        IDataObject *pdo,
        IAssocHandlerInvoker **ppInvoker);

    END_INTERFACE
} IAssocHandlerVtbl;

interface IAssocHandler {
    CONST_VTBL IAssocHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAssocHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAssocHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAssocHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IAssocHandler methods ***/
#define IAssocHandler_GetName(This,ppsz) (This)->lpVtbl->GetName(This,ppsz)
#define IAssocHandler_GetUIName(This,ppsz) (This)->lpVtbl->GetUIName(This,ppsz)
#define IAssocHandler_GetIconLocation(This,ppszPath,pIndex) (This)->lpVtbl->GetIconLocation(This,ppszPath,pIndex)
#define IAssocHandler_IsRecommended(This) (This)->lpVtbl->IsRecommended(This)
#define IAssocHandler_MakeDefault(This,pszDescription) (This)->lpVtbl->MakeDefault(This,pszDescription)
#define IAssocHandler_Invoke(This,pdo) (This)->lpVtbl->Invoke(This,pdo)
#define IAssocHandler_CreateInvoker(This,pdo,ppInvoker) (This)->lpVtbl->CreateInvoker(This,pdo,ppInvoker)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAssocHandler_QueryInterface(IAssocHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAssocHandler_AddRef(IAssocHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAssocHandler_Release(IAssocHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IAssocHandler methods ***/
static FORCEINLINE HRESULT IAssocHandler_GetName(IAssocHandler* This,LPWSTR *ppsz) {
    return This->lpVtbl->GetName(This,ppsz);
}
static FORCEINLINE HRESULT IAssocHandler_GetUIName(IAssocHandler* This,LPWSTR *ppsz) {
    return This->lpVtbl->GetUIName(This,ppsz);
}
static FORCEINLINE HRESULT IAssocHandler_GetIconLocation(IAssocHandler* This,LPWSTR *ppszPath,int *pIndex) {
    return This->lpVtbl->GetIconLocation(This,ppszPath,pIndex);
}
static FORCEINLINE HRESULT IAssocHandler_IsRecommended(IAssocHandler* This) {
    return This->lpVtbl->IsRecommended(This);
}
static FORCEINLINE HRESULT IAssocHandler_MakeDefault(IAssocHandler* This,LPCWSTR pszDescription) {
    return This->lpVtbl->MakeDefault(This,pszDescription);
}
static FORCEINLINE HRESULT IAssocHandler_Invoke(IAssocHandler* This,IDataObject *pdo) {
    return This->lpVtbl->Invoke(This,pdo);
}
static FORCEINLINE HRESULT IAssocHandler_CreateInvoker(IAssocHandler* This,IDataObject *pdo,IAssocHandlerInvoker **ppInvoker) {
    return This->lpVtbl->CreateInvoker(This,pdo,ppInvoker);
}
#endif
#endif

#endif


#endif  /* __IAssocHandler_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IEnumAssocHandlers interface
 */
#ifndef __IEnumAssocHandlers_INTERFACE_DEFINED__
#define __IEnumAssocHandlers_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumAssocHandlers, 0x973810ae, 0x9599, 0x4b88, 0x9e,0x4d, 0x6e,0xe9,0x8c,0x95,0x52,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("973810ae-9599-4b88-9e4d-6ee98c9552da")
IEnumAssocHandlers : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        IAssocHandler **rgelt,
        ULONG *pceltFetched) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumAssocHandlers, 0x973810ae, 0x9599, 0x4b88, 0x9e,0x4d, 0x6e,0xe9,0x8c,0x95,0x52,0xda)
#endif
#else
typedef struct IEnumAssocHandlersVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumAssocHandlers *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumAssocHandlers *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumAssocHandlers *This);

    /*** IEnumAssocHandlers methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumAssocHandlers *This,
        ULONG celt,
        IAssocHandler **rgelt,
        ULONG *pceltFetched);

    END_INTERFACE
} IEnumAssocHandlersVtbl;

interface IEnumAssocHandlers {
    CONST_VTBL IEnumAssocHandlersVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumAssocHandlers_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumAssocHandlers_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumAssocHandlers_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumAssocHandlers methods ***/
#define IEnumAssocHandlers_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumAssocHandlers_QueryInterface(IEnumAssocHandlers* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumAssocHandlers_AddRef(IEnumAssocHandlers* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumAssocHandlers_Release(IEnumAssocHandlers* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumAssocHandlers methods ***/
static FORCEINLINE HRESULT IEnumAssocHandlers_Next(IEnumAssocHandlers* This,ULONG celt,IAssocHandler **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
#endif
#endif

#endif


#endif  /* __IEnumAssocHandlers_INTERFACE_DEFINED__ */


typedef enum ASSOC_FILTER {
    ASSOC_FILTER_NONE = 0x0,
    ASSOC_FILTER_RECOMMENDED = 0x1
} ASSOC_FILTER;

DEFINE_ENUM_FLAG_OPERATORS(ASSOC_FILTER)

  SHSTDAPI SHAssocEnumHandlers(PCWSTR pszExtra, ASSOC_FILTER afFilter, IEnumAssocHandlers **ppEnumHandler);
#endif

#if NTDDI_VERSION >= NTDDI_WIN7
SHSTDAPI SHAssocEnumHandlersForProtocolByApplication(PCWSTR protocol, REFIID riid, void **enumHandlers);
#endif

#if NTDDI_VERSION >= NTDDI_WIN8
/*****************************************************************************
 * IDataObjectProvider interface
 */
#ifndef __IDataObjectProvider_INTERFACE_DEFINED__
#define __IDataObjectProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDataObjectProvider, 0x3d25f6d6, 0x4b2a, 0x433c, 0x91,0x84, 0x7c,0x33,0xad,0x35,0xd0,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3d25f6d6-4b2a-433c-9184-7c33ad35d001")
IDataObjectProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDataObject(
        IDataObject **dataObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDataObject(
        IDataObject *dataObject) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDataObjectProvider, 0x3d25f6d6, 0x4b2a, 0x433c, 0x91,0x84, 0x7c,0x33,0xad,0x35,0xd0,0x01)
#endif
#else
typedef struct IDataObjectProviderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDataObjectProvider *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDataObjectProvider *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDataObjectProvider *This);

    /*** IDataObjectProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDataObject)(
        IDataObjectProvider *This,
        IDataObject **dataObject);

    HRESULT (STDMETHODCALLTYPE *SetDataObject)(
        IDataObjectProvider *This,
        IDataObject *dataObject);

    END_INTERFACE
} IDataObjectProviderVtbl;

interface IDataObjectProvider {
    CONST_VTBL IDataObjectProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDataObjectProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDataObjectProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDataObjectProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IDataObjectProvider methods ***/
#define IDataObjectProvider_GetDataObject(This,dataObject) (This)->lpVtbl->GetDataObject(This,dataObject)
#define IDataObjectProvider_SetDataObject(This,dataObject) (This)->lpVtbl->SetDataObject(This,dataObject)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDataObjectProvider_QueryInterface(IDataObjectProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDataObjectProvider_AddRef(IDataObjectProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDataObjectProvider_Release(IDataObjectProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IDataObjectProvider methods ***/
static FORCEINLINE HRESULT IDataObjectProvider_GetDataObject(IDataObjectProvider* This,IDataObject **dataObject) {
    return This->lpVtbl->GetDataObject(This,dataObject);
}
static FORCEINLINE HRESULT IDataObjectProvider_SetDataObject(IDataObjectProvider* This,IDataObject *dataObject) {
    return This->lpVtbl->SetDataObject(This,dataObject);
}
#endif
#endif

#endif


#endif  /* __IDataObjectProvider_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDataTransferManagerInterop interface
 */
#ifndef __IDataTransferManagerInterop_INTERFACE_DEFINED__
#define __IDataTransferManagerInterop_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDataTransferManagerInterop, 0x3a3dcd6c, 0x3eab, 0x43dc, 0xbc,0xde, 0x45,0x67,0x1c,0xe8,0x00,0xc8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3a3dcd6c-3eab-43dc-bcde-45671ce800c8")
IDataTransferManagerInterop : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetForWindow(
        HWND appWindow,
        REFIID riid,
        void **dataTransferManager) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShowShareUIForWindow(
        HWND appWindow) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDataTransferManagerInterop, 0x3a3dcd6c, 0x3eab, 0x43dc, 0xbc,0xde, 0x45,0x67,0x1c,0xe8,0x00,0xc8)
#endif
#else
typedef struct IDataTransferManagerInteropVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDataTransferManagerInterop *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDataTransferManagerInterop *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDataTransferManagerInterop *This);

    /*** IDataTransferManagerInterop methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForWindow)(
        IDataTransferManagerInterop *This,
        HWND appWindow,
        REFIID riid,
        void **dataTransferManager);

    HRESULT (STDMETHODCALLTYPE *ShowShareUIForWindow)(
        IDataTransferManagerInterop *This,
        HWND appWindow);

    END_INTERFACE
} IDataTransferManagerInteropVtbl;

interface IDataTransferManagerInterop {
    CONST_VTBL IDataTransferManagerInteropVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDataTransferManagerInterop_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDataTransferManagerInterop_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDataTransferManagerInterop_Release(This) (This)->lpVtbl->Release(This)
/*** IDataTransferManagerInterop methods ***/
#define IDataTransferManagerInterop_GetForWindow(This,appWindow,riid,dataTransferManager) (This)->lpVtbl->GetForWindow(This,appWindow,riid,dataTransferManager)
#define IDataTransferManagerInterop_ShowShareUIForWindow(This,appWindow) (This)->lpVtbl->ShowShareUIForWindow(This,appWindow)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDataTransferManagerInterop_QueryInterface(IDataTransferManagerInterop* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDataTransferManagerInterop_AddRef(IDataTransferManagerInterop* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDataTransferManagerInterop_Release(IDataTransferManagerInterop* This) {
    return This->lpVtbl->Release(This);
}
/*** IDataTransferManagerInterop methods ***/
static FORCEINLINE HRESULT IDataTransferManagerInterop_GetForWindow(IDataTransferManagerInterop* This,HWND appWindow,REFIID riid,void **dataTransferManager) {
    return This->lpVtbl->GetForWindow(This,appWindow,riid,dataTransferManager);
}
static FORCEINLINE HRESULT IDataTransferManagerInterop_ShowShareUIForWindow(IDataTransferManagerInterop* This,HWND appWindow) {
    return This->lpVtbl->ShowShareUIForWindow(This,appWindow);
}
#endif
#endif

#endif


#endif  /* __IDataTransferManagerInterop_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IFrameworkInputPaneHandler interface
 */
#ifndef __IFrameworkInputPaneHandler_INTERFACE_DEFINED__
#define __IFrameworkInputPaneHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFrameworkInputPaneHandler, 0x226c537b, 0x1e76, 0x4d9e, 0xa7,0x60, 0x33,0xdb,0x29,0x92,0x2f,0x18);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("226c537b-1e76-4d9e-a760-33db29922f18")
IFrameworkInputPaneHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Showing(
        RECT *prcInputPaneScreenLocation,
        WINBOOL fEnsureFocusedElementInView) = 0;

    virtual HRESULT STDMETHODCALLTYPE Hiding(
        WINBOOL fEnsureFocusedElementInView) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFrameworkInputPaneHandler, 0x226c537b, 0x1e76, 0x4d9e, 0xa7,0x60, 0x33,0xdb,0x29,0x92,0x2f,0x18)
#endif
#else
typedef struct IFrameworkInputPaneHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFrameworkInputPaneHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFrameworkInputPaneHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFrameworkInputPaneHandler *This);

    /*** IFrameworkInputPaneHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Showing)(
        IFrameworkInputPaneHandler *This,
        RECT *prcInputPaneScreenLocation,
        WINBOOL fEnsureFocusedElementInView);

    HRESULT (STDMETHODCALLTYPE *Hiding)(
        IFrameworkInputPaneHandler *This,
        WINBOOL fEnsureFocusedElementInView);

    END_INTERFACE
} IFrameworkInputPaneHandlerVtbl;

interface IFrameworkInputPaneHandler {
    CONST_VTBL IFrameworkInputPaneHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFrameworkInputPaneHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFrameworkInputPaneHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFrameworkInputPaneHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IFrameworkInputPaneHandler methods ***/
#define IFrameworkInputPaneHandler_Showing(This,prcInputPaneScreenLocation,fEnsureFocusedElementInView) (This)->lpVtbl->Showing(This,prcInputPaneScreenLocation,fEnsureFocusedElementInView)
#define IFrameworkInputPaneHandler_Hiding(This,fEnsureFocusedElementInView) (This)->lpVtbl->Hiding(This,fEnsureFocusedElementInView)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFrameworkInputPaneHandler_QueryInterface(IFrameworkInputPaneHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFrameworkInputPaneHandler_AddRef(IFrameworkInputPaneHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFrameworkInputPaneHandler_Release(IFrameworkInputPaneHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IFrameworkInputPaneHandler methods ***/
static FORCEINLINE HRESULT IFrameworkInputPaneHandler_Showing(IFrameworkInputPaneHandler* This,RECT *prcInputPaneScreenLocation,WINBOOL fEnsureFocusedElementInView) {
    return This->lpVtbl->Showing(This,prcInputPaneScreenLocation,fEnsureFocusedElementInView);
}
static FORCEINLINE HRESULT IFrameworkInputPaneHandler_Hiding(IFrameworkInputPaneHandler* This,WINBOOL fEnsureFocusedElementInView) {
    return This->lpVtbl->Hiding(This,fEnsureFocusedElementInView);
}
#endif
#endif

#endif


#endif  /* __IFrameworkInputPaneHandler_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IFrameworkInputPane interface
 */
#ifndef __IFrameworkInputPane_INTERFACE_DEFINED__
#define __IFrameworkInputPane_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFrameworkInputPane, 0x5752238b, 0x24f0, 0x495a, 0x82,0xf1, 0x2f,0xd5,0x93,0x05,0x67,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5752238b-24f0-495a-82f1-2fd593056796")
IFrameworkInputPane : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Advise(
        IUnknown *pWindow,
        IFrameworkInputPaneHandler *pHandler,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE AdviseWithHWND(
        HWND hwnd,
        IFrameworkInputPaneHandler *pHandler,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unadvise(
        DWORD dwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Location(
        RECT *prcInputPaneScreenLocation) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFrameworkInputPane, 0x5752238b, 0x24f0, 0x495a, 0x82,0xf1, 0x2f,0xd5,0x93,0x05,0x67,0x96)
#endif
#else
typedef struct IFrameworkInputPaneVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFrameworkInputPane *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFrameworkInputPane *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFrameworkInputPane *This);

    /*** IFrameworkInputPane methods ***/
    HRESULT (STDMETHODCALLTYPE *Advise)(
        IFrameworkInputPane *This,
        IUnknown *pWindow,
        IFrameworkInputPaneHandler *pHandler,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *AdviseWithHWND)(
        IFrameworkInputPane *This,
        HWND hwnd,
        IFrameworkInputPaneHandler *pHandler,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        IFrameworkInputPane *This,
        DWORD dwCookie);

    HRESULT (STDMETHODCALLTYPE *Location)(
        IFrameworkInputPane *This,
        RECT *prcInputPaneScreenLocation);

    END_INTERFACE
} IFrameworkInputPaneVtbl;

interface IFrameworkInputPane {
    CONST_VTBL IFrameworkInputPaneVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFrameworkInputPane_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFrameworkInputPane_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFrameworkInputPane_Release(This) (This)->lpVtbl->Release(This)
/*** IFrameworkInputPane methods ***/
#define IFrameworkInputPane_Advise(This,pWindow,pHandler,pdwCookie) (This)->lpVtbl->Advise(This,pWindow,pHandler,pdwCookie)
#define IFrameworkInputPane_AdviseWithHWND(This,hwnd,pHandler,pdwCookie) (This)->lpVtbl->AdviseWithHWND(This,hwnd,pHandler,pdwCookie)
#define IFrameworkInputPane_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
#define IFrameworkInputPane_Location(This,prcInputPaneScreenLocation) (This)->lpVtbl->Location(This,prcInputPaneScreenLocation)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IFrameworkInputPane_QueryInterface(IFrameworkInputPane* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IFrameworkInputPane_AddRef(IFrameworkInputPane* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IFrameworkInputPane_Release(IFrameworkInputPane* This) {
    return This->lpVtbl->Release(This);
}
/*** IFrameworkInputPane methods ***/
static FORCEINLINE HRESULT IFrameworkInputPane_Advise(IFrameworkInputPane* This,IUnknown *pWindow,IFrameworkInputPaneHandler *pHandler,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pWindow,pHandler,pdwCookie);
}
static FORCEINLINE HRESULT IFrameworkInputPane_AdviseWithHWND(IFrameworkInputPane* This,HWND hwnd,IFrameworkInputPaneHandler *pHandler,DWORD *pdwCookie) {
    return This->lpVtbl->AdviseWithHWND(This,hwnd,pHandler,pdwCookie);
}
static FORCEINLINE HRESULT IFrameworkInputPane_Unadvise(IFrameworkInputPane* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static FORCEINLINE HRESULT IFrameworkInputPane_Location(IFrameworkInputPane* This,RECT *prcInputPaneScreenLocation) {
    return This->lpVtbl->Location(This,prcInputPaneScreenLocation);
}
#endif
#endif

#endif


#endif  /* __IFrameworkInputPane_INTERFACE_DEFINED__ */

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

#ifndef PROP_CONTRACT_DELEGATE
#define PROP_CONTRACT_DELEGATE L"ContractDelegate"
#endif

  __forceinline void SetContractDelegateWindow(HWND hwndSource, HWND hwndDelegate) {
    if (hwndDelegate != NULL)
      SetPropW (hwndSource, PROP_CONTRACT_DELEGATE, (HANDLE)hwndDelegate);
    else
      RemovePropW(hwndSource, PROP_CONTRACT_DELEGATE);
  }

#ifndef PROP_CONTRACT_DELEGATE
#define PROP_CONTRACT_DELEGATE L"ContractDelegate"
#endif

  __forceinline HWND GetContractDelegateWindow(HWND hwndSource) { return (HWND)GetPropW(hwndSource, PROP_CONTRACT_DELEGATE); }
#endif
#endif

#if NTDDI_VERSION >= NTDDI_WIN8
/*****************************************************************************
 * ISearchableApplication interface
 */
#ifndef __ISearchableApplication_INTERFACE_DEFINED__
#define __ISearchableApplication_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISearchableApplication, 0x08922f8d, 0x243a, 0x49e3, 0xa4,0x95, 0xbd,0x4f,0x9c,0xf8,0xab,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("08922f8d-243a-49e3-a495-bd4f9cf8ab9e")
ISearchableApplication : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSearchWindow(
        HWND *hwnd) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISearchableApplication, 0x08922f8d, 0x243a, 0x49e3, 0xa4,0x95, 0xbd,0x4f,0x9c,0xf8,0xab,0x9e)
#endif
#else
typedef struct ISearchableApplicationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISearchableApplication *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISearchableApplication *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISearchableApplication *This);

    /*** ISearchableApplication methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSearchWindow)(
        ISearchableApplication *This,
        HWND *hwnd);

    END_INTERFACE
} ISearchableApplicationVtbl;

interface ISearchableApplication {
    CONST_VTBL ISearchableApplicationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISearchableApplication_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISearchableApplication_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISearchableApplication_Release(This) (This)->lpVtbl->Release(This)
/*** ISearchableApplication methods ***/
#define ISearchableApplication_GetSearchWindow(This,hwnd) (This)->lpVtbl->GetSearchWindow(This,hwnd)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISearchableApplication_QueryInterface(ISearchableApplication* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISearchableApplication_AddRef(ISearchableApplication* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISearchableApplication_Release(ISearchableApplication* This) {
    return This->lpVtbl->Release(This);
}
/*** ISearchableApplication methods ***/
static FORCEINLINE HRESULT ISearchableApplication_GetSearchWindow(ISearchableApplication* This,HWND *hwnd) {
    return This->lpVtbl->GetSearchWindow(This,hwnd);
}
#endif
#endif

#endif


#endif  /* __ISearchableApplication_INTERFACE_DEFINED__ */


typedef enum UNDOCK_REASON {
    UR_RESOLUTION_CHANGE = 0,
    UR_MONITOR_DISCONNECT = 1
} UNDOCK_REASON;

/*****************************************************************************
 * IAccessibilityDockingServiceCallback interface
 */
#ifndef __IAccessibilityDockingServiceCallback_INTERFACE_DEFINED__
#define __IAccessibilityDockingServiceCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAccessibilityDockingServiceCallback, 0x157733fd, 0xa592, 0x42e5, 0xb5,0x94, 0x24,0x84,0x68,0xc5,0xa8,0x1b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("157733fd-a592-42e5-b594-248468c5a81b")
IAccessibilityDockingServiceCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Undocked(
        UNDOCK_REASON undockReason) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAccessibilityDockingServiceCallback, 0x157733fd, 0xa592, 0x42e5, 0xb5,0x94, 0x24,0x84,0x68,0xc5,0xa8,0x1b)
#endif
#else
typedef struct IAccessibilityDockingServiceCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAccessibilityDockingServiceCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAccessibilityDockingServiceCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAccessibilityDockingServiceCallback *This);

    /*** IAccessibilityDockingServiceCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *Undocked)(
        IAccessibilityDockingServiceCallback *This,
        UNDOCK_REASON undockReason);

    END_INTERFACE
} IAccessibilityDockingServiceCallbackVtbl;

interface IAccessibilityDockingServiceCallback {
    CONST_VTBL IAccessibilityDockingServiceCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAccessibilityDockingServiceCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAccessibilityDockingServiceCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAccessibilityDockingServiceCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IAccessibilityDockingServiceCallback methods ***/
#define IAccessibilityDockingServiceCallback_Undocked(This,undockReason) (This)->lpVtbl->Undocked(This,undockReason)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAccessibilityDockingServiceCallback_QueryInterface(IAccessibilityDockingServiceCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAccessibilityDockingServiceCallback_AddRef(IAccessibilityDockingServiceCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAccessibilityDockingServiceCallback_Release(IAccessibilityDockingServiceCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IAccessibilityDockingServiceCallback methods ***/
static FORCEINLINE HRESULT IAccessibilityDockingServiceCallback_Undocked(IAccessibilityDockingServiceCallback* This,UNDOCK_REASON undockReason) {
    return This->lpVtbl->Undocked(This,undockReason);
}
#endif
#endif

#endif


#endif  /* __IAccessibilityDockingServiceCallback_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IAccessibilityDockingService interface
 */
#ifndef __IAccessibilityDockingService_INTERFACE_DEFINED__
#define __IAccessibilityDockingService_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAccessibilityDockingService, 0x8849dc22, 0xcedf, 0x4c95, 0x99,0x8d, 0x05,0x14,0x19,0xdd,0x3f,0x76);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8849dc22-cedf-4c95-998d-051419dd3f76")
IAccessibilityDockingService : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetAvailableSize(
        HMONITOR hMonitor,
        UINT *pcxFixed,
        UINT *pcyMax) = 0;

    virtual HRESULT STDMETHODCALLTYPE DockWindow(
        HWND hwnd,
        HMONITOR hMonitor,
        UINT cyRequested,
        IAccessibilityDockingServiceCallback *pCallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE UndockWindow(
        HWND hwnd) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAccessibilityDockingService, 0x8849dc22, 0xcedf, 0x4c95, 0x99,0x8d, 0x05,0x14,0x19,0xdd,0x3f,0x76)
#endif
#else
typedef struct IAccessibilityDockingServiceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAccessibilityDockingService *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAccessibilityDockingService *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAccessibilityDockingService *This);

    /*** IAccessibilityDockingService methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAvailableSize)(
        IAccessibilityDockingService *This,
        HMONITOR hMonitor,
        UINT *pcxFixed,
        UINT *pcyMax);

    HRESULT (STDMETHODCALLTYPE *DockWindow)(
        IAccessibilityDockingService *This,
        HWND hwnd,
        HMONITOR hMonitor,
        UINT cyRequested,
        IAccessibilityDockingServiceCallback *pCallback);

    HRESULT (STDMETHODCALLTYPE *UndockWindow)(
        IAccessibilityDockingService *This,
        HWND hwnd);

    END_INTERFACE
} IAccessibilityDockingServiceVtbl;

interface IAccessibilityDockingService {
    CONST_VTBL IAccessibilityDockingServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAccessibilityDockingService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAccessibilityDockingService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAccessibilityDockingService_Release(This) (This)->lpVtbl->Release(This)
/*** IAccessibilityDockingService methods ***/
#define IAccessibilityDockingService_GetAvailableSize(This,hMonitor,pcxFixed,pcyMax) (This)->lpVtbl->GetAvailableSize(This,hMonitor,pcxFixed,pcyMax)
#define IAccessibilityDockingService_DockWindow(This,hwnd,hMonitor,cyRequested,pCallback) (This)->lpVtbl->DockWindow(This,hwnd,hMonitor,cyRequested,pCallback)
#define IAccessibilityDockingService_UndockWindow(This,hwnd) (This)->lpVtbl->UndockWindow(This,hwnd)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAccessibilityDockingService_QueryInterface(IAccessibilityDockingService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAccessibilityDockingService_AddRef(IAccessibilityDockingService* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAccessibilityDockingService_Release(IAccessibilityDockingService* This) {
    return This->lpVtbl->Release(This);
}
/*** IAccessibilityDockingService methods ***/
static FORCEINLINE HRESULT IAccessibilityDockingService_GetAvailableSize(IAccessibilityDockingService* This,HMONITOR hMonitor,UINT *pcxFixed,UINT *pcyMax) {
    return This->lpVtbl->GetAvailableSize(This,hMonitor,pcxFixed,pcyMax);
}
static FORCEINLINE HRESULT IAccessibilityDockingService_DockWindow(IAccessibilityDockingService* This,HWND hwnd,HMONITOR hMonitor,UINT cyRequested,IAccessibilityDockingServiceCallback *pCallback) {
    return This->lpVtbl->DockWindow(This,hwnd,hMonitor,cyRequested,pCallback);
}
static FORCEINLINE HRESULT IAccessibilityDockingService_UndockWindow(IAccessibilityDockingService* This,HWND hwnd) {
    return This->lpVtbl->UndockWindow(This,hwnd);
}
#endif
#endif

#endif


#endif  /* __IAccessibilityDockingService_INTERFACE_DEFINED__ */


typedef enum MONITOR_APP_VISIBILITY {
    MAV_UNKNOWN = 0,
    MAV_NO_APP_VISIBLE = 1,
    MAV_APP_VISIBLE = 2
} MONITOR_APP_VISIBILITY;

/*****************************************************************************
 * IAppVisibilityEvents interface
 */
#ifndef __IAppVisibilityEvents_INTERFACE_DEFINED__
#define __IAppVisibilityEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAppVisibilityEvents, 0x6584ce6b, 0x7d82, 0x49c2, 0x89,0xc9, 0xc6,0xbc,0x02,0xba,0x8c,0x38);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6584ce6b-7d82-49c2-89c9-c6bc02ba8c38")
IAppVisibilityEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AppVisibilityOnMonitorChanged(
        HMONITOR hMonitor,
        MONITOR_APP_VISIBILITY previousMode,
        MONITOR_APP_VISIBILITY currentMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE LauncherVisibilityChange(
        WINBOOL currentVisibleState) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAppVisibilityEvents, 0x6584ce6b, 0x7d82, 0x49c2, 0x89,0xc9, 0xc6,0xbc,0x02,0xba,0x8c,0x38)
#endif
#else
typedef struct IAppVisibilityEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAppVisibilityEvents *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAppVisibilityEvents *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAppVisibilityEvents *This);

    /*** IAppVisibilityEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *AppVisibilityOnMonitorChanged)(
        IAppVisibilityEvents *This,
        HMONITOR hMonitor,
        MONITOR_APP_VISIBILITY previousMode,
        MONITOR_APP_VISIBILITY currentMode);

    HRESULT (STDMETHODCALLTYPE *LauncherVisibilityChange)(
        IAppVisibilityEvents *This,
        WINBOOL currentVisibleState);

    END_INTERFACE
} IAppVisibilityEventsVtbl;

interface IAppVisibilityEvents {
    CONST_VTBL IAppVisibilityEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAppVisibilityEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAppVisibilityEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAppVisibilityEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IAppVisibilityEvents methods ***/
#define IAppVisibilityEvents_AppVisibilityOnMonitorChanged(This,hMonitor,previousMode,currentMode) (This)->lpVtbl->AppVisibilityOnMonitorChanged(This,hMonitor,previousMode,currentMode)
#define IAppVisibilityEvents_LauncherVisibilityChange(This,currentVisibleState) (This)->lpVtbl->LauncherVisibilityChange(This,currentVisibleState)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAppVisibilityEvents_QueryInterface(IAppVisibilityEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAppVisibilityEvents_AddRef(IAppVisibilityEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAppVisibilityEvents_Release(IAppVisibilityEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IAppVisibilityEvents methods ***/
static FORCEINLINE HRESULT IAppVisibilityEvents_AppVisibilityOnMonitorChanged(IAppVisibilityEvents* This,HMONITOR hMonitor,MONITOR_APP_VISIBILITY previousMode,MONITOR_APP_VISIBILITY currentMode) {
    return This->lpVtbl->AppVisibilityOnMonitorChanged(This,hMonitor,previousMode,currentMode);
}
static FORCEINLINE HRESULT IAppVisibilityEvents_LauncherVisibilityChange(IAppVisibilityEvents* This,WINBOOL currentVisibleState) {
    return This->lpVtbl->LauncherVisibilityChange(This,currentVisibleState);
}
#endif
#endif

#endif


#endif  /* __IAppVisibilityEvents_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IAppVisibility interface
 */
#ifndef __IAppVisibility_INTERFACE_DEFINED__
#define __IAppVisibility_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAppVisibility, 0x2246ea2d, 0xcaea, 0x4444, 0xa3,0xc4, 0x6d,0xe8,0x27,0xe4,0x43,0x13);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2246ea2d-caea-4444-a3c4-6de827e44313")
IAppVisibility : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetAppVisibilityOnMonitor(
        HMONITOR hMonitor,
        MONITOR_APP_VISIBILITY *pMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsLauncherVisible(
        WINBOOL *pfVisible) = 0;

    virtual HRESULT STDMETHODCALLTYPE Advise(
        IAppVisibilityEvents *pCallback,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unadvise(
        DWORD dwCookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAppVisibility, 0x2246ea2d, 0xcaea, 0x4444, 0xa3,0xc4, 0x6d,0xe8,0x27,0xe4,0x43,0x13)
#endif
#else
typedef struct IAppVisibilityVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAppVisibility *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAppVisibility *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAppVisibility *This);

    /*** IAppVisibility methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAppVisibilityOnMonitor)(
        IAppVisibility *This,
        HMONITOR hMonitor,
        MONITOR_APP_VISIBILITY *pMode);

    HRESULT (STDMETHODCALLTYPE *IsLauncherVisible)(
        IAppVisibility *This,
        WINBOOL *pfVisible);

    HRESULT (STDMETHODCALLTYPE *Advise)(
        IAppVisibility *This,
        IAppVisibilityEvents *pCallback,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        IAppVisibility *This,
        DWORD dwCookie);

    END_INTERFACE
} IAppVisibilityVtbl;

interface IAppVisibility {
    CONST_VTBL IAppVisibilityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAppVisibility_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAppVisibility_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAppVisibility_Release(This) (This)->lpVtbl->Release(This)
/*** IAppVisibility methods ***/
#define IAppVisibility_GetAppVisibilityOnMonitor(This,hMonitor,pMode) (This)->lpVtbl->GetAppVisibilityOnMonitor(This,hMonitor,pMode)
#define IAppVisibility_IsLauncherVisible(This,pfVisible) (This)->lpVtbl->IsLauncherVisible(This,pfVisible)
#define IAppVisibility_Advise(This,pCallback,pdwCookie) (This)->lpVtbl->Advise(This,pCallback,pdwCookie)
#define IAppVisibility_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAppVisibility_QueryInterface(IAppVisibility* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAppVisibility_AddRef(IAppVisibility* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAppVisibility_Release(IAppVisibility* This) {
    return This->lpVtbl->Release(This);
}
/*** IAppVisibility methods ***/
static FORCEINLINE HRESULT IAppVisibility_GetAppVisibilityOnMonitor(IAppVisibility* This,HMONITOR hMonitor,MONITOR_APP_VISIBILITY *pMode) {
    return This->lpVtbl->GetAppVisibilityOnMonitor(This,hMonitor,pMode);
}
static FORCEINLINE HRESULT IAppVisibility_IsLauncherVisible(IAppVisibility* This,WINBOOL *pfVisible) {
    return This->lpVtbl->IsLauncherVisible(This,pfVisible);
}
static FORCEINLINE HRESULT IAppVisibility_Advise(IAppVisibility* This,IAppVisibilityEvents *pCallback,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pCallback,pdwCookie);
}
static FORCEINLINE HRESULT IAppVisibility_Unadvise(IAppVisibility* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
#endif
#endif

#endif


#endif  /* __IAppVisibility_INTERFACE_DEFINED__ */


#if 0
typedef WCHAR *PZZWSTR;
#endif

typedef enum PACKAGE_EXECUTION_STATE {
    PES_UNKNOWN = 0,
    PES_RUNNING = 1,
    PES_SUSPENDING = 2,
    PES_SUSPENDED = 3,
    PES_TERMINATED = 4
} PACKAGE_EXECUTION_STATE;

/*****************************************************************************
 * IPackageExecutionStateChangeNotification interface
 */
#ifndef __IPackageExecutionStateChangeNotification_INTERFACE_DEFINED__
#define __IPackageExecutionStateChangeNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPackageExecutionStateChangeNotification, 0x1bb12a62, 0x2ad8, 0x432b, 0x8c,0xcf, 0x0c,0x2c,0x52,0xaf,0xcd,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1bb12a62-2ad8-432b-8ccf-0c2c52afcd5b")
IPackageExecutionStateChangeNotification : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnStateChanged(
        LPCWSTR pszPackageFullName,
        PACKAGE_EXECUTION_STATE pesNewState) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPackageExecutionStateChangeNotification, 0x1bb12a62, 0x2ad8, 0x432b, 0x8c,0xcf, 0x0c,0x2c,0x52,0xaf,0xcd,0x5b)
#endif
#else
typedef struct IPackageExecutionStateChangeNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPackageExecutionStateChangeNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPackageExecutionStateChangeNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPackageExecutionStateChangeNotification *This);

    /*** IPackageExecutionStateChangeNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *OnStateChanged)(
        IPackageExecutionStateChangeNotification *This,
        LPCWSTR pszPackageFullName,
        PACKAGE_EXECUTION_STATE pesNewState);

    END_INTERFACE
} IPackageExecutionStateChangeNotificationVtbl;

interface IPackageExecutionStateChangeNotification {
    CONST_VTBL IPackageExecutionStateChangeNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPackageExecutionStateChangeNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPackageExecutionStateChangeNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPackageExecutionStateChangeNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IPackageExecutionStateChangeNotification methods ***/
#define IPackageExecutionStateChangeNotification_OnStateChanged(This,pszPackageFullName,pesNewState) (This)->lpVtbl->OnStateChanged(This,pszPackageFullName,pesNewState)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPackageExecutionStateChangeNotification_QueryInterface(IPackageExecutionStateChangeNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPackageExecutionStateChangeNotification_AddRef(IPackageExecutionStateChangeNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPackageExecutionStateChangeNotification_Release(IPackageExecutionStateChangeNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IPackageExecutionStateChangeNotification methods ***/
static FORCEINLINE HRESULT IPackageExecutionStateChangeNotification_OnStateChanged(IPackageExecutionStateChangeNotification* This,LPCWSTR pszPackageFullName,PACKAGE_EXECUTION_STATE pesNewState) {
    return This->lpVtbl->OnStateChanged(This,pszPackageFullName,pesNewState);
}
#endif
#endif

#endif


#endif  /* __IPackageExecutionStateChangeNotification_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IPackageDebugSettings interface
 */
#ifndef __IPackageDebugSettings_INTERFACE_DEFINED__
#define __IPackageDebugSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPackageDebugSettings, 0xf27c3930, 0x8029, 0x4ad1, 0x94,0xe3, 0x3d,0xba,0x41,0x78,0x10,0xc1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f27c3930-8029-4ad1-94e3-3dba417810c1")
IPackageDebugSettings : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EnableDebugging(
        LPCWSTR packageFullName,
        LPCWSTR debuggerCommandLine,
        PZZWSTR environment) = 0;

    virtual HRESULT STDMETHODCALLTYPE DisableDebugging(
        LPCWSTR packageFullName) = 0;

    virtual HRESULT STDMETHODCALLTYPE Suspend(
        LPCWSTR packageFullName) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resume(
        LPCWSTR packageFullName) = 0;

    virtual HRESULT STDMETHODCALLTYPE TerminateAllProcesses(
        LPCWSTR packageFullName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTargetSessionId(
        ULONG sessionId) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumerateBackgroundTasks(
        LPCWSTR packageFullName,
        ULONG *taskCount,
        LPCGUID *taskIds,
        LPCWSTR **taskNames) = 0;

    virtual HRESULT STDMETHODCALLTYPE ActivateBackgroundTask(
        LPCGUID taskId) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartServicing(
        LPCWSTR packageFullName) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopServicing(
        LPCWSTR packageFullName) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartSessionRedirection(
        LPCWSTR packageFullName,
        ULONG sessionId) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopSessionRedirection(
        LPCWSTR packageFullName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPackageExecutionState(
        LPCWSTR packageFullName,
        PACKAGE_EXECUTION_STATE *packageExecutionState) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterForPackageStateChanges(
        LPCWSTR packageFullName,
        IPackageExecutionStateChangeNotification *pPackageExecutionStateChangeNotification,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterForPackageStateChanges(
        DWORD dwCookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPackageDebugSettings, 0xf27c3930, 0x8029, 0x4ad1, 0x94,0xe3, 0x3d,0xba,0x41,0x78,0x10,0xc1)
#endif
#else
typedef struct IPackageDebugSettingsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPackageDebugSettings *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPackageDebugSettings *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPackageDebugSettings *This);

    /*** IPackageDebugSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *EnableDebugging)(
        IPackageDebugSettings *This,
        LPCWSTR packageFullName,
        LPCWSTR debuggerCommandLine,
        PZZWSTR environment);

    HRESULT (STDMETHODCALLTYPE *DisableDebugging)(
        IPackageDebugSettings *This,
        LPCWSTR packageFullName);

    HRESULT (STDMETHODCALLTYPE *Suspend)(
        IPackageDebugSettings *This,
        LPCWSTR packageFullName);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IPackageDebugSettings *This,
        LPCWSTR packageFullName);

    HRESULT (STDMETHODCALLTYPE *TerminateAllProcesses)(
        IPackageDebugSettings *This,
        LPCWSTR packageFullName);

    HRESULT (STDMETHODCALLTYPE *SetTargetSessionId)(
        IPackageDebugSettings *This,
        ULONG sessionId);

    HRESULT (STDMETHODCALLTYPE *EnumerateBackgroundTasks)(
        IPackageDebugSettings *This,
        LPCWSTR packageFullName,
        ULONG *taskCount,
        LPCGUID *taskIds,
        LPCWSTR **taskNames);

    HRESULT (STDMETHODCALLTYPE *ActivateBackgroundTask)(
        IPackageDebugSettings *This,
        LPCGUID taskId);

    HRESULT (STDMETHODCALLTYPE *StartServicing)(
        IPackageDebugSettings *This,
        LPCWSTR packageFullName);

    HRESULT (STDMETHODCALLTYPE *StopServicing)(
        IPackageDebugSettings *This,
        LPCWSTR packageFullName);

    HRESULT (STDMETHODCALLTYPE *StartSessionRedirection)(
        IPackageDebugSettings *This,
        LPCWSTR packageFullName,
        ULONG sessionId);

    HRESULT (STDMETHODCALLTYPE *StopSessionRedirection)(
        IPackageDebugSettings *This,
        LPCWSTR packageFullName);

    HRESULT (STDMETHODCALLTYPE *GetPackageExecutionState)(
        IPackageDebugSettings *This,
        LPCWSTR packageFullName,
        PACKAGE_EXECUTION_STATE *packageExecutionState);

    HRESULT (STDMETHODCALLTYPE *RegisterForPackageStateChanges)(
        IPackageDebugSettings *This,
        LPCWSTR packageFullName,
        IPackageExecutionStateChangeNotification *pPackageExecutionStateChangeNotification,
        DWORD *pdwCookie);

    HRESULT (STDMETHODCALLTYPE *UnregisterForPackageStateChanges)(
        IPackageDebugSettings *This,
        DWORD dwCookie);

    END_INTERFACE
} IPackageDebugSettingsVtbl;

interface IPackageDebugSettings {
    CONST_VTBL IPackageDebugSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPackageDebugSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPackageDebugSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPackageDebugSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IPackageDebugSettings methods ***/
#define IPackageDebugSettings_EnableDebugging(This,packageFullName,debuggerCommandLine,environment) (This)->lpVtbl->EnableDebugging(This,packageFullName,debuggerCommandLine,environment)
#define IPackageDebugSettings_DisableDebugging(This,packageFullName) (This)->lpVtbl->DisableDebugging(This,packageFullName)
#define IPackageDebugSettings_Suspend(This,packageFullName) (This)->lpVtbl->Suspend(This,packageFullName)
#define IPackageDebugSettings_Resume(This,packageFullName) (This)->lpVtbl->Resume(This,packageFullName)
#define IPackageDebugSettings_TerminateAllProcesses(This,packageFullName) (This)->lpVtbl->TerminateAllProcesses(This,packageFullName)
#define IPackageDebugSettings_SetTargetSessionId(This,sessionId) (This)->lpVtbl->SetTargetSessionId(This,sessionId)
#define IPackageDebugSettings_EnumerateBackgroundTasks(This,packageFullName,taskCount,taskIds,taskNames) (This)->lpVtbl->EnumerateBackgroundTasks(This,packageFullName,taskCount,taskIds,taskNames)
#define IPackageDebugSettings_ActivateBackgroundTask(This,taskId) (This)->lpVtbl->ActivateBackgroundTask(This,taskId)
#define IPackageDebugSettings_StartServicing(This,packageFullName) (This)->lpVtbl->StartServicing(This,packageFullName)
#define IPackageDebugSettings_StopServicing(This,packageFullName) (This)->lpVtbl->StopServicing(This,packageFullName)
#define IPackageDebugSettings_StartSessionRedirection(This,packageFullName,sessionId) (This)->lpVtbl->StartSessionRedirection(This,packageFullName,sessionId)
#define IPackageDebugSettings_StopSessionRedirection(This,packageFullName) (This)->lpVtbl->StopSessionRedirection(This,packageFullName)
#define IPackageDebugSettings_GetPackageExecutionState(This,packageFullName,packageExecutionState) (This)->lpVtbl->GetPackageExecutionState(This,packageFullName,packageExecutionState)
#define IPackageDebugSettings_RegisterForPackageStateChanges(This,packageFullName,pPackageExecutionStateChangeNotification,pdwCookie) (This)->lpVtbl->RegisterForPackageStateChanges(This,packageFullName,pPackageExecutionStateChangeNotification,pdwCookie)
#define IPackageDebugSettings_UnregisterForPackageStateChanges(This,dwCookie) (This)->lpVtbl->UnregisterForPackageStateChanges(This,dwCookie)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPackageDebugSettings_QueryInterface(IPackageDebugSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPackageDebugSettings_AddRef(IPackageDebugSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPackageDebugSettings_Release(IPackageDebugSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IPackageDebugSettings methods ***/
static FORCEINLINE HRESULT IPackageDebugSettings_EnableDebugging(IPackageDebugSettings* This,LPCWSTR packageFullName,LPCWSTR debuggerCommandLine,PZZWSTR environment) {
    return This->lpVtbl->EnableDebugging(This,packageFullName,debuggerCommandLine,environment);
}
static FORCEINLINE HRESULT IPackageDebugSettings_DisableDebugging(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->DisableDebugging(This,packageFullName);
}
static FORCEINLINE HRESULT IPackageDebugSettings_Suspend(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->Suspend(This,packageFullName);
}
static FORCEINLINE HRESULT IPackageDebugSettings_Resume(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->Resume(This,packageFullName);
}
static FORCEINLINE HRESULT IPackageDebugSettings_TerminateAllProcesses(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->TerminateAllProcesses(This,packageFullName);
}
static FORCEINLINE HRESULT IPackageDebugSettings_SetTargetSessionId(IPackageDebugSettings* This,ULONG sessionId) {
    return This->lpVtbl->SetTargetSessionId(This,sessionId);
}
static FORCEINLINE HRESULT IPackageDebugSettings_EnumerateBackgroundTasks(IPackageDebugSettings* This,LPCWSTR packageFullName,ULONG *taskCount,LPCGUID *taskIds,LPCWSTR **taskNames) {
    return This->lpVtbl->EnumerateBackgroundTasks(This,packageFullName,taskCount,taskIds,taskNames);
}
static FORCEINLINE HRESULT IPackageDebugSettings_ActivateBackgroundTask(IPackageDebugSettings* This,LPCGUID taskId) {
    return This->lpVtbl->ActivateBackgroundTask(This,taskId);
}
static FORCEINLINE HRESULT IPackageDebugSettings_StartServicing(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->StartServicing(This,packageFullName);
}
static FORCEINLINE HRESULT IPackageDebugSettings_StopServicing(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->StopServicing(This,packageFullName);
}
static FORCEINLINE HRESULT IPackageDebugSettings_StartSessionRedirection(IPackageDebugSettings* This,LPCWSTR packageFullName,ULONG sessionId) {
    return This->lpVtbl->StartSessionRedirection(This,packageFullName,sessionId);
}
static FORCEINLINE HRESULT IPackageDebugSettings_StopSessionRedirection(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->StopSessionRedirection(This,packageFullName);
}
static FORCEINLINE HRESULT IPackageDebugSettings_GetPackageExecutionState(IPackageDebugSettings* This,LPCWSTR packageFullName,PACKAGE_EXECUTION_STATE *packageExecutionState) {
    return This->lpVtbl->GetPackageExecutionState(This,packageFullName,packageExecutionState);
}
static FORCEINLINE HRESULT IPackageDebugSettings_RegisterForPackageStateChanges(IPackageDebugSettings* This,LPCWSTR packageFullName,IPackageExecutionStateChangeNotification *pPackageExecutionStateChangeNotification,DWORD *pdwCookie) {
    return This->lpVtbl->RegisterForPackageStateChanges(This,packageFullName,pPackageExecutionStateChangeNotification,pdwCookie);
}
static FORCEINLINE HRESULT IPackageDebugSettings_UnregisterForPackageStateChanges(IPackageDebugSettings* This,DWORD dwCookie) {
    return This->lpVtbl->UnregisterForPackageStateChanges(This,dwCookie);
}
#endif
#endif

#endif


#endif  /* __IPackageDebugSettings_INTERFACE_DEFINED__ */


typedef enum AHE_TYPE {
    AHE_DESKTOP = 0,
    AHE_IMMERSIVE = 1
} AHE_TYPE;

/*****************************************************************************
 * IExecuteCommandApplicationHostEnvironment interface
 */
#ifndef __IExecuteCommandApplicationHostEnvironment_INTERFACE_DEFINED__
#define __IExecuteCommandApplicationHostEnvironment_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExecuteCommandApplicationHostEnvironment, 0x18b21aa9, 0xe184, 0x4ff0, 0x9f,0x5e, 0xf8,0x82,0xd0,0x37,0x71,0xb3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("18b21aa9-e184-4ff0-9f5e-f882d03771b3")
IExecuteCommandApplicationHostEnvironment : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetValue(
        AHE_TYPE *pahe) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExecuteCommandApplicationHostEnvironment, 0x18b21aa9, 0xe184, 0x4ff0, 0x9f,0x5e, 0xf8,0x82,0xd0,0x37,0x71,0xb3)
#endif
#else
typedef struct IExecuteCommandApplicationHostEnvironmentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IExecuteCommandApplicationHostEnvironment *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IExecuteCommandApplicationHostEnvironment *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IExecuteCommandApplicationHostEnvironment *This);

    /*** IExecuteCommandApplicationHostEnvironment methods ***/
    HRESULT (STDMETHODCALLTYPE *GetValue)(
        IExecuteCommandApplicationHostEnvironment *This,
        AHE_TYPE *pahe);

    END_INTERFACE
} IExecuteCommandApplicationHostEnvironmentVtbl;

interface IExecuteCommandApplicationHostEnvironment {
    CONST_VTBL IExecuteCommandApplicationHostEnvironmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExecuteCommandApplicationHostEnvironment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExecuteCommandApplicationHostEnvironment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExecuteCommandApplicationHostEnvironment_Release(This) (This)->lpVtbl->Release(This)
/*** IExecuteCommandApplicationHostEnvironment methods ***/
#define IExecuteCommandApplicationHostEnvironment_GetValue(This,pahe) (This)->lpVtbl->GetValue(This,pahe)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IExecuteCommandApplicationHostEnvironment_QueryInterface(IExecuteCommandApplicationHostEnvironment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IExecuteCommandApplicationHostEnvironment_AddRef(IExecuteCommandApplicationHostEnvironment* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IExecuteCommandApplicationHostEnvironment_Release(IExecuteCommandApplicationHostEnvironment* This) {
    return This->lpVtbl->Release(This);
}
/*** IExecuteCommandApplicationHostEnvironment methods ***/
static FORCEINLINE HRESULT IExecuteCommandApplicationHostEnvironment_GetValue(IExecuteCommandApplicationHostEnvironment* This,AHE_TYPE *pahe) {
    return This->lpVtbl->GetValue(This,pahe);
}
#endif
#endif

#endif


#endif  /* __IExecuteCommandApplicationHostEnvironment_INTERFACE_DEFINED__ */


typedef enum EC_HOST_UI_MODE {
    ECHUIM_DESKTOP = 0,
    ECHUIM_IMMERSIVE = 1,
    ECHUIM_SYSTEM_LAUNCHER = 2
} EC_HOST_UI_MODE;

/*****************************************************************************
 * IExecuteCommandHost interface
 */
#ifndef __IExecuteCommandHost_INTERFACE_DEFINED__
#define __IExecuteCommandHost_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExecuteCommandHost, 0x4b6832a2, 0x5f04, 0x4c9d, 0xb8,0x9d, 0x72,0x7a,0x15,0xd1,0x03,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4b6832a2-5f04-4c9d-b89d-727a15d103e7")
IExecuteCommandHost : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetUIMode(
        EC_HOST_UI_MODE *pUIMode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExecuteCommandHost, 0x4b6832a2, 0x5f04, 0x4c9d, 0xb8,0x9d, 0x72,0x7a,0x15,0xd1,0x03,0xe7)
#endif
#else
typedef struct IExecuteCommandHostVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IExecuteCommandHost *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IExecuteCommandHost *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IExecuteCommandHost *This);

    /*** IExecuteCommandHost methods ***/
    HRESULT (STDMETHODCALLTYPE *GetUIMode)(
        IExecuteCommandHost *This,
        EC_HOST_UI_MODE *pUIMode);

    END_INTERFACE
} IExecuteCommandHostVtbl;

interface IExecuteCommandHost {
    CONST_VTBL IExecuteCommandHostVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExecuteCommandHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExecuteCommandHost_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExecuteCommandHost_Release(This) (This)->lpVtbl->Release(This)
/*** IExecuteCommandHost methods ***/
#define IExecuteCommandHost_GetUIMode(This,pUIMode) (This)->lpVtbl->GetUIMode(This,pUIMode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IExecuteCommandHost_QueryInterface(IExecuteCommandHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IExecuteCommandHost_AddRef(IExecuteCommandHost* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IExecuteCommandHost_Release(IExecuteCommandHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IExecuteCommandHost methods ***/
static FORCEINLINE HRESULT IExecuteCommandHost_GetUIMode(IExecuteCommandHost* This,EC_HOST_UI_MODE *pUIMode) {
    return This->lpVtbl->GetUIMode(This,pUIMode);
}
#endif
#endif

#endif


#endif  /* __IExecuteCommandHost_INTERFACE_DEFINED__ */


#define SID_ExecuteCommandHost IID_IExecuteCommandHost

typedef enum APPLICATION_VIEW_STATE {
    AVS_FULLSCREEN_LANDSCAPE = 0,
    AVS_FILLED = 1,
    AVS_SNAPPED = 2,
    AVS_FULLSCREEN_PORTRAIT = 3
} APPLICATION_VIEW_STATE;

typedef enum EDGE_GESTURE_KIND {
    EGK_TOUCH = 0,
    EGK_KEYBOARD = 1,
    EGK_MOUSE = 2
} EDGE_GESTURE_KIND;

/*****************************************************************************
 * IApplicationDesignModeSettings interface
 */
#ifndef __IApplicationDesignModeSettings_INTERFACE_DEFINED__
#define __IApplicationDesignModeSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID_IApplicationDesignModeSettings, 0x2a3dee9a, 0xe31d, 0x46d6, 0x85,0x08, 0xbc,0xc5,0x97,0xdb,0x35,0x57);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2a3dee9a-e31d-46d6-8508-bcc597db3557")
IApplicationDesignModeSettings : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetNativeDisplaySize(
        SIZE sizeNativeDisplay) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetScaleFactor(
        DEVICE_SCALE_FACTOR scaleFactor) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetApplicationViewState(
        APPLICATION_VIEW_STATE viewState) = 0;

    virtual HRESULT STDMETHODCALLTYPE ComputeApplicationSize(
        SIZE *psizeApplication) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsApplicationViewStateSupported(
        APPLICATION_VIEW_STATE viewState,
        SIZE sizeNativeDisplay,
        DEVICE_SCALE_FACTOR scaleFactor,
        WINBOOL *pfSupported) = 0;

    virtual HRESULT STDMETHODCALLTYPE TriggerEdgeGesture(
        EDGE_GESTURE_KIND edgeGestureKind) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IApplicationDesignModeSettings, 0x2a3dee9a, 0xe31d, 0x46d6, 0x85,0x08, 0xbc,0xc5,0x97,0xdb,0x35,0x57)
#endif
#else
typedef struct IApplicationDesignModeSettingsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IApplicationDesignModeSettings *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IApplicationDesignModeSettings *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IApplicationDesignModeSettings *This);

    /*** IApplicationDesignModeSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *SetNativeDisplaySize)(
        IApplicationDesignModeSettings *This,
        SIZE sizeNativeDisplay);

    HRESULT (STDMETHODCALLTYPE *SetScaleFactor)(
        IApplicationDesignModeSettings *This,
        DEVICE_SCALE_FACTOR scaleFactor);

    HRESULT (STDMETHODCALLTYPE *SetApplicationViewState)(
        IApplicationDesignModeSettings *This,
        APPLICATION_VIEW_STATE viewState);

    HRESULT (STDMETHODCALLTYPE *ComputeApplicationSize)(
        IApplicationDesignModeSettings *This,
        SIZE *psizeApplication);

    HRESULT (STDMETHODCALLTYPE *IsApplicationViewStateSupported)(
        IApplicationDesignModeSettings *This,
        APPLICATION_VIEW_STATE viewState,
        SIZE sizeNativeDisplay,
        DEVICE_SCALE_FACTOR scaleFactor,
        WINBOOL *pfSupported);

    HRESULT (STDMETHODCALLTYPE *TriggerEdgeGesture)(
        IApplicationDesignModeSettings *This,
        EDGE_GESTURE_KIND edgeGestureKind);

    END_INTERFACE
} IApplicationDesignModeSettingsVtbl;

interface IApplicationDesignModeSettings {
    CONST_VTBL IApplicationDesignModeSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IApplicationDesignModeSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IApplicationDesignModeSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IApplicationDesignModeSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IApplicationDesignModeSettings methods ***/
#define IApplicationDesignModeSettings_SetNativeDisplaySize(This,sizeNativeDisplay) (This)->lpVtbl->SetNativeDisplaySize(This,sizeNativeDisplay)
#define IApplicationDesignModeSettings_SetScaleFactor(This,scaleFactor) (This)->lpVtbl->SetScaleFactor(This,scaleFactor)
#define IApplicationDesignModeSettings_SetApplicationViewState(This,viewState) (This)->lpVtbl->SetApplicationViewState(This,viewState)
#define IApplicationDesignModeSettings_ComputeApplicationSize(This,psizeApplication) (This)->lpVtbl->ComputeApplicationSize(This,psizeApplication)
#define IApplicationDesignModeSettings_IsApplicationViewStateSupported(This,viewState,sizeNativeDisplay,scaleFactor,pfSupported) (This)->lpVtbl->IsApplicationViewStateSupported(This,viewState,sizeNativeDisplay,scaleFactor,pfSupported)
#define IApplicationDesignModeSettings_TriggerEdgeGesture(This,edgeGestureKind) (This)->lpVtbl->TriggerEdgeGesture(This,edgeGestureKind)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IApplicationDesignModeSettings_QueryInterface(IApplicationDesignModeSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IApplicationDesignModeSettings_AddRef(IApplicationDesignModeSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IApplicationDesignModeSettings_Release(IApplicationDesignModeSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationDesignModeSettings methods ***/
static FORCEINLINE HRESULT IApplicationDesignModeSettings_SetNativeDisplaySize(IApplicationDesignModeSettings* This,SIZE sizeNativeDisplay) {
    return This->lpVtbl->SetNativeDisplaySize(This,sizeNativeDisplay);
}
static FORCEINLINE HRESULT IApplicationDesignModeSettings_SetScaleFactor(IApplicationDesignModeSettings* This,DEVICE_SCALE_FACTOR scaleFactor) {
    return This->lpVtbl->SetScaleFactor(This,scaleFactor);
}
static FORCEINLINE HRESULT IApplicationDesignModeSettings_SetApplicationViewState(IApplicationDesignModeSettings* This,APPLICATION_VIEW_STATE viewState) {
    return This->lpVtbl->SetApplicationViewState(This,viewState);
}
static FORCEINLINE HRESULT IApplicationDesignModeSettings_ComputeApplicationSize(IApplicationDesignModeSettings* This,SIZE *psizeApplication) {
    return This->lpVtbl->ComputeApplicationSize(This,psizeApplication);
}
static FORCEINLINE HRESULT IApplicationDesignModeSettings_IsApplicationViewStateSupported(IApplicationDesignModeSettings* This,APPLICATION_VIEW_STATE viewState,SIZE sizeNativeDisplay,DEVICE_SCALE_FACTOR scaleFactor,WINBOOL *pfSupported) {
    return This->lpVtbl->IsApplicationViewStateSupported(This,viewState,sizeNativeDisplay,scaleFactor,pfSupported);
}
static FORCEINLINE HRESULT IApplicationDesignModeSettings_TriggerEdgeGesture(IApplicationDesignModeSettings* This,EDGE_GESTURE_KIND edgeGestureKind) {
    return This->lpVtbl->TriggerEdgeGesture(This,edgeGestureKind);
}
#endif
#endif

#endif


#endif  /* __IApplicationDesignModeSettings_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IInitializeWithWindow interface
 */
#ifndef __IInitializeWithWindow_INTERFACE_DEFINED__
#define __IInitializeWithWindow_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInitializeWithWindow, 0x3e68d4bd, 0x7135, 0x4d10, 0x80,0x18, 0x9f,0xb6,0xd9,0xf3,0x3f,0xa1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3e68d4bd-7135-4d10-8018-9fb6d9f33fa1")
IInitializeWithWindow : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        HWND hwnd) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInitializeWithWindow, 0x3e68d4bd, 0x7135, 0x4d10, 0x80,0x18, 0x9f,0xb6,0xd9,0xf3,0x3f,0xa1)
#endif
#else
typedef struct IInitializeWithWindowVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInitializeWithWindow *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInitializeWithWindow *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInitializeWithWindow *This);

    /*** IInitializeWithWindow methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IInitializeWithWindow *This,
        HWND hwnd);

    END_INTERFACE
} IInitializeWithWindowVtbl;

interface IInitializeWithWindow {
    CONST_VTBL IInitializeWithWindowVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInitializeWithWindow_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInitializeWithWindow_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInitializeWithWindow_Release(This) (This)->lpVtbl->Release(This)
/*** IInitializeWithWindow methods ***/
#define IInitializeWithWindow_Initialize(This,hwnd) (This)->lpVtbl->Initialize(This,hwnd)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInitializeWithWindow_QueryInterface(IInitializeWithWindow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInitializeWithWindow_AddRef(IInitializeWithWindow* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInitializeWithWindow_Release(IInitializeWithWindow* This) {
    return This->lpVtbl->Release(This);
}
/*** IInitializeWithWindow methods ***/
static FORCEINLINE HRESULT IInitializeWithWindow_Initialize(IInitializeWithWindow* This,HWND hwnd) {
    return This->lpVtbl->Initialize(This,hwnd);
}
#endif
#endif

#endif


#endif  /* __IInitializeWithWindow_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IHandlerInfo interface
 */
#ifndef __IHandlerInfo_INTERFACE_DEFINED__
#define __IHandlerInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHandlerInfo, 0x997706ef, 0xf880, 0x453b, 0x81,0x18, 0x39,0xe1,0xa2,0xd2,0x65,0x5a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("997706ef-f880-453b-8118-39e1a2d2655a")
IHandlerInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetApplicationDisplayName(
        LPWSTR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetApplicationPublisher(
        LPWSTR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetApplicationIconReference(
        LPWSTR *value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHandlerInfo, 0x997706ef, 0xf880, 0x453b, 0x81,0x18, 0x39,0xe1,0xa2,0xd2,0x65,0x5a)
#endif
#else
typedef struct IHandlerInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHandlerInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHandlerInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHandlerInfo *This);

    /*** IHandlerInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetApplicationDisplayName)(
        IHandlerInfo *This,
        LPWSTR *value);

    HRESULT (STDMETHODCALLTYPE *GetApplicationPublisher)(
        IHandlerInfo *This,
        LPWSTR *value);

    HRESULT (STDMETHODCALLTYPE *GetApplicationIconReference)(
        IHandlerInfo *This,
        LPWSTR *value);

    END_INTERFACE
} IHandlerInfoVtbl;

interface IHandlerInfo {
    CONST_VTBL IHandlerInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHandlerInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHandlerInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHandlerInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IHandlerInfo methods ***/
#define IHandlerInfo_GetApplicationDisplayName(This,value) (This)->lpVtbl->GetApplicationDisplayName(This,value)
#define IHandlerInfo_GetApplicationPublisher(This,value) (This)->lpVtbl->GetApplicationPublisher(This,value)
#define IHandlerInfo_GetApplicationIconReference(This,value) (This)->lpVtbl->GetApplicationIconReference(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHandlerInfo_QueryInterface(IHandlerInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHandlerInfo_AddRef(IHandlerInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHandlerInfo_Release(IHandlerInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IHandlerInfo methods ***/
static FORCEINLINE HRESULT IHandlerInfo_GetApplicationDisplayName(IHandlerInfo* This,LPWSTR *value) {
    return This->lpVtbl->GetApplicationDisplayName(This,value);
}
static FORCEINLINE HRESULT IHandlerInfo_GetApplicationPublisher(IHandlerInfo* This,LPWSTR *value) {
    return This->lpVtbl->GetApplicationPublisher(This,value);
}
static FORCEINLINE HRESULT IHandlerInfo_GetApplicationIconReference(IHandlerInfo* This,LPWSTR *value) {
    return This->lpVtbl->GetApplicationIconReference(This,value);
}
#endif
#endif

#endif


#endif  /* __IHandlerInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IHandlerActivationHost interface
 */
#ifndef __IHandlerActivationHost_INTERFACE_DEFINED__
#define __IHandlerActivationHost_INTERFACE_DEFINED__

DEFINE_GUID(IID_IHandlerActivationHost, 0x35094a87, 0x8bb1, 0x4237, 0x96,0xc6, 0xc4,0x17,0xee,0xbd,0xb0,0x78);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("35094a87-8bb1-4237-96c6-c417eebdb078")
IHandlerActivationHost : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE BeforeCoCreateInstance(
        REFCLSID clsidHandler,
        IShellItemArray *itemsBeingActivated,
        IHandlerInfo *handlerInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeforeCreateProcess(
        LPCWSTR applicationPath,
        LPCWSTR commandLine,
        IHandlerInfo *handlerInfo) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IHandlerActivationHost, 0x35094a87, 0x8bb1, 0x4237, 0x96,0xc6, 0xc4,0x17,0xee,0xbd,0xb0,0x78)
#endif
#else
typedef struct IHandlerActivationHostVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IHandlerActivationHost *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IHandlerActivationHost *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IHandlerActivationHost *This);

    /*** IHandlerActivationHost methods ***/
    HRESULT (STDMETHODCALLTYPE *BeforeCoCreateInstance)(
        IHandlerActivationHost *This,
        REFCLSID clsidHandler,
        IShellItemArray *itemsBeingActivated,
        IHandlerInfo *handlerInfo);

    HRESULT (STDMETHODCALLTYPE *BeforeCreateProcess)(
        IHandlerActivationHost *This,
        LPCWSTR applicationPath,
        LPCWSTR commandLine,
        IHandlerInfo *handlerInfo);

    END_INTERFACE
} IHandlerActivationHostVtbl;

interface IHandlerActivationHost {
    CONST_VTBL IHandlerActivationHostVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IHandlerActivationHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHandlerActivationHost_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHandlerActivationHost_Release(This) (This)->lpVtbl->Release(This)
/*** IHandlerActivationHost methods ***/
#define IHandlerActivationHost_BeforeCoCreateInstance(This,clsidHandler,itemsBeingActivated,handlerInfo) (This)->lpVtbl->BeforeCoCreateInstance(This,clsidHandler,itemsBeingActivated,handlerInfo)
#define IHandlerActivationHost_BeforeCreateProcess(This,applicationPath,commandLine,handlerInfo) (This)->lpVtbl->BeforeCreateProcess(This,applicationPath,commandLine,handlerInfo)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IHandlerActivationHost_QueryInterface(IHandlerActivationHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IHandlerActivationHost_AddRef(IHandlerActivationHost* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IHandlerActivationHost_Release(IHandlerActivationHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IHandlerActivationHost methods ***/
static FORCEINLINE HRESULT IHandlerActivationHost_BeforeCoCreateInstance(IHandlerActivationHost* This,REFCLSID clsidHandler,IShellItemArray *itemsBeingActivated,IHandlerInfo *handlerInfo) {
    return This->lpVtbl->BeforeCoCreateInstance(This,clsidHandler,itemsBeingActivated,handlerInfo);
}
static FORCEINLINE HRESULT IHandlerActivationHost_BeforeCreateProcess(IHandlerActivationHost* This,LPCWSTR applicationPath,LPCWSTR commandLine,IHandlerInfo *handlerInfo) {
    return This->lpVtbl->BeforeCreateProcess(This,applicationPath,commandLine,handlerInfo);
}
#endif
#endif

#endif


#endif  /* __IHandlerActivationHost_INTERFACE_DEFINED__ */


#define SID_SHandlerActivationHost IID_IHandlerActivationHost

DEFINE_GUID(SID_ShellExecuteNamedPropertyStore, 0xeb84ada2, 0x00ff, 0x4992, 0x83, 0x24, 0xed, 0x5c, 0xe0, 0x61, 0xcb, 0x29);
#endif

#endif
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER PCIDLIST_ABSOLUTE_UserSize     (ULONG *, ULONG, PCIDLIST_ABSOLUTE *);
unsigned char * __RPC_USER PCIDLIST_ABSOLUTE_UserMarshal  (ULONG *, unsigned char *, PCIDLIST_ABSOLUTE *);
unsigned char * __RPC_USER PCIDLIST_ABSOLUTE_UserUnmarshal(ULONG *, unsigned char *, PCIDLIST_ABSOLUTE *);
void            __RPC_USER PCIDLIST_ABSOLUTE_UserFree     (ULONG *, PCIDLIST_ABSOLUTE *);
ULONG           __RPC_USER PIDLIST_ABSOLUTE_UserSize     (ULONG *, ULONG, PIDLIST_ABSOLUTE *);
unsigned char * __RPC_USER PIDLIST_ABSOLUTE_UserMarshal  (ULONG *, unsigned char *, PIDLIST_ABSOLUTE *);
unsigned char * __RPC_USER PIDLIST_ABSOLUTE_UserUnmarshal(ULONG *, unsigned char *, PIDLIST_ABSOLUTE *);
void            __RPC_USER PIDLIST_ABSOLUTE_UserFree     (ULONG *, PIDLIST_ABSOLUTE *);
ULONG           __RPC_USER PITEMID_CHILD_UserSize     (ULONG *, ULONG, PITEMID_CHILD *);
unsigned char * __RPC_USER PITEMID_CHILD_UserMarshal  (ULONG *, unsigned char *, PITEMID_CHILD *);
unsigned char * __RPC_USER PITEMID_CHILD_UserUnmarshal(ULONG *, unsigned char *, PITEMID_CHILD *);
void            __RPC_USER PITEMID_CHILD_UserFree     (ULONG *, PITEMID_CHILD *);
ULONG           __RPC_USER HWND_UserSize     (ULONG *, ULONG, HWND *);
unsigned char * __RPC_USER HWND_UserMarshal  (ULONG *, unsigned char *, HWND *);
unsigned char * __RPC_USER HWND_UserUnmarshal(ULONG *, unsigned char *, HWND *);
void            __RPC_USER HWND_UserFree     (ULONG *, HWND *);
ULONG           __RPC_USER PIDLIST_RELATIVE_UserSize     (ULONG *, ULONG, PIDLIST_RELATIVE *);
unsigned char * __RPC_USER PIDLIST_RELATIVE_UserMarshal  (ULONG *, unsigned char *, PIDLIST_RELATIVE *);
unsigned char * __RPC_USER PIDLIST_RELATIVE_UserUnmarshal(ULONG *, unsigned char *, PIDLIST_RELATIVE *);
void            __RPC_USER PIDLIST_RELATIVE_UserFree     (ULONG *, PIDLIST_RELATIVE *);
ULONG           __RPC_USER PCUIDLIST_RELATIVE_UserSize     (ULONG *, ULONG, PCUIDLIST_RELATIVE *);
unsigned char * __RPC_USER PCUIDLIST_RELATIVE_UserMarshal  (ULONG *, unsigned char *, PCUIDLIST_RELATIVE *);
unsigned char * __RPC_USER PCUIDLIST_RELATIVE_UserUnmarshal(ULONG *, unsigned char *, PCUIDLIST_RELATIVE *);
void            __RPC_USER PCUIDLIST_RELATIVE_UserFree     (ULONG *, PCUIDLIST_RELATIVE *);
ULONG           __RPC_USER PCUITEMID_CHILD_UserSize     (ULONG *, ULONG, PCUITEMID_CHILD *);
unsigned char * __RPC_USER PCUITEMID_CHILD_UserMarshal  (ULONG *, unsigned char *, PCUITEMID_CHILD *);
unsigned char * __RPC_USER PCUITEMID_CHILD_UserUnmarshal(ULONG *, unsigned char *, PCUITEMID_CHILD *);
void            __RPC_USER PCUITEMID_CHILD_UserFree     (ULONG *, PCUITEMID_CHILD *);
ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);
ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
ULONG           __RPC_USER LPSAFEARRAY_UserSize     (ULONG *, ULONG, LPSAFEARRAY *);
unsigned char * __RPC_USER LPSAFEARRAY_UserMarshal  (ULONG *, unsigned char *, LPSAFEARRAY *);
unsigned char * __RPC_USER LPSAFEARRAY_UserUnmarshal(ULONG *, unsigned char *, LPSAFEARRAY *);
void            __RPC_USER LPSAFEARRAY_UserFree     (ULONG *, LPSAFEARRAY *);
ULONG           __RPC_USER HBITMAP_UserSize     (ULONG *, ULONG, HBITMAP *);
unsigned char * __RPC_USER HBITMAP_UserMarshal  (ULONG *, unsigned char *, HBITMAP *);
unsigned char * __RPC_USER HBITMAP_UserUnmarshal(ULONG *, unsigned char *, HBITMAP *);
void            __RPC_USER HBITMAP_UserFree     (ULONG *, HBITMAP *);
ULONG           __RPC_USER HMENU_UserSize     (ULONG *, ULONG, HMENU *);
unsigned char * __RPC_USER HMENU_UserMarshal  (ULONG *, unsigned char *, HMENU *);
unsigned char * __RPC_USER HMENU_UserUnmarshal(ULONG *, unsigned char *, HMENU *);
void            __RPC_USER HMENU_UserFree     (ULONG *, HMENU *);
ULONG           __RPC_USER HGLOBAL_UserSize     (ULONG *, ULONG, HGLOBAL *);
unsigned char * __RPC_USER HGLOBAL_UserMarshal  (ULONG *, unsigned char *, HGLOBAL *);
unsigned char * __RPC_USER HGLOBAL_UserUnmarshal(ULONG *, unsigned char *, HGLOBAL *);
void            __RPC_USER HGLOBAL_UserFree     (ULONG *, HGLOBAL *);
ULONG           __RPC_USER HICON_UserSize     (ULONG *, ULONG, HICON *);
unsigned char * __RPC_USER HICON_UserMarshal  (ULONG *, unsigned char *, HICON *);
unsigned char * __RPC_USER HICON_UserUnmarshal(ULONG *, unsigned char *, HICON *);
void            __RPC_USER HICON_UserFree     (ULONG *, HICON *);
ULONG           __RPC_USER HACCEL_UserSize     (ULONG *, ULONG, HACCEL *);
unsigned char * __RPC_USER HACCEL_UserMarshal  (ULONG *, unsigned char *, HACCEL *);
unsigned char * __RPC_USER HACCEL_UserUnmarshal(ULONG *, unsigned char *, HACCEL *);
void            __RPC_USER HACCEL_UserFree     (ULONG *, HACCEL *);
ULONG           __RPC_USER HMONITOR_UserSize     (ULONG *, ULONG, HMONITOR *);
unsigned char * __RPC_USER HMONITOR_UserMarshal  (ULONG *, unsigned char *, HMONITOR *);
unsigned char * __RPC_USER HMONITOR_UserUnmarshal(ULONG *, unsigned char *, HMONITOR *);
void            __RPC_USER HMONITOR_UserFree     (ULONG *, HMONITOR *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __shobjidl_h__ */
