/*** Autogenerated by WIDL 10.4 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 __IVirtualDesktopManager_FWD_DEFINED__
#define __IVirtualDesktopManager_FWD_DEFINED__
typedef interface IVirtualDesktopManager IVirtualDesktopManager;
#ifdef __cplusplus
interface IVirtualDesktopManager;
#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 __VirtualDesktopManager_FWD_DEFINED__
#define __VirtualDesktopManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class VirtualDesktopManager VirtualDesktopManager;
#else
typedef struct VirtualDesktopManager VirtualDesktopManager;
#endif /* defined __cplusplus */
#endif /* defined __VirtualDesktopManager_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 inline HRESULT IContextMenu_QueryInterface(IContextMenu* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IContextMenu_AddRef(IContextMenu* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IContextMenu_Release(IContextMenu* This) {
    return This->lpVtbl->Release(This);
}
/*** IContextMenu methods ***/
static inline 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 inline HRESULT IContextMenu_InvokeCommand(IContextMenu* This,CMINVOKECOMMANDINFO *pici) {
    return This->lpVtbl->InvokeCommand(This,pici);
}
static inline 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 inline HRESULT IContextMenu2_QueryInterface(IContextMenu2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IContextMenu2_AddRef(IContextMenu2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IContextMenu2_Release(IContextMenu2* This) {
    return This->lpVtbl->Release(This);
}
/*** IContextMenu methods ***/
static inline 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 inline HRESULT IContextMenu2_InvokeCommand(IContextMenu2* This,CMINVOKECOMMANDINFO *pici) {
    return This->lpVtbl->InvokeCommand(This,pici);
}
static inline 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 inline 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 inline HRESULT IContextMenu3_QueryInterface(IContextMenu3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IContextMenu3_AddRef(IContextMenu3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IContextMenu3_Release(IContextMenu3* This) {
    return This->lpVtbl->Release(This);
}
/*** IContextMenu methods ***/
static inline 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 inline HRESULT IContextMenu3_InvokeCommand(IContextMenu3* This,CMINVOKECOMMANDINFO *pici) {
    return This->lpVtbl->InvokeCommand(This,pici);
}
static inline 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 inline HRESULT IContextMenu3_HandleMenuMsg(IContextMenu3* This,UINT uMsg,WPARAM wParam,LPARAM lParam) {
    return This->lpVtbl->HandleMenuMsg(This,uMsg,wParam,lParam);
}
/*** IContextMenu3 methods ***/
static inline 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 inline HRESULT IExecuteCommand_QueryInterface(IExecuteCommand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IExecuteCommand_AddRef(IExecuteCommand* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IExecuteCommand_Release(IExecuteCommand* This) {
    return This->lpVtbl->Release(This);
}
/*** IExecuteCommand methods ***/
static inline HRESULT IExecuteCommand_SetKeyState(IExecuteCommand* This,DWORD grfKeyState) {
    return This->lpVtbl->SetKeyState(This,grfKeyState);
}
static inline HRESULT IExecuteCommand_SetParameters(IExecuteCommand* This,LPCWSTR pszParameters) {
    return This->lpVtbl->SetParameters(This,pszParameters);
}
static inline HRESULT IExecuteCommand_SetPosition(IExecuteCommand* This,POINT pt) {
    return This->lpVtbl->SetPosition(This,pt);
}
static inline HRESULT IExecuteCommand_SetShowWindow(IExecuteCommand* This,int nShow) {
    return This->lpVtbl->SetShowWindow(This,nShow);
}
static inline HRESULT IExecuteCommand_SetNoShowUI(IExecuteCommand* This,WINBOOL fNoShowUI) {
    return This->lpVtbl->SetNoShowUI(This,fNoShowUI);
}
static inline HRESULT IExecuteCommand_SetDirectory(IExecuteCommand* This,LPCWSTR pszDirectory) {
    return This->lpVtbl->SetDirectory(This,pszDirectory);
}
static inline 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 inline HRESULT IPersistFolder_QueryInterface(IPersistFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPersistFolder_AddRef(IPersistFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPersistFolder_Release(IPersistFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersist methods ***/
static inline HRESULT IPersistFolder_GetClassID(IPersistFolder* This,CLSID *pClassID) {
    return This->lpVtbl->GetClassID(This,pClassID);
}
/*** IPersistFolder methods ***/
static inline 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 inline HRESULT IRunnableTask_QueryInterface(IRunnableTask* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IRunnableTask_AddRef(IRunnableTask* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IRunnableTask_Release(IRunnableTask* This) {
    return This->lpVtbl->Release(This);
}
/*** IRunnableTask methods ***/
static inline HRESULT IRunnableTask_Run(IRunnableTask* This) {
    return This->lpVtbl->Run(This);
}
static inline HRESULT IRunnableTask_Kill(IRunnableTask* This,WINBOOL bWait) {
    return This->lpVtbl->Kill(This,bWait);
}
static inline HRESULT IRunnableTask_Suspend(IRunnableTask* This) {
    return This->lpVtbl->Suspend(This);
}
static inline HRESULT IRunnableTask_Resume(IRunnableTask* This) {
    return This->lpVtbl->Resume(This);
}
static inline 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 inline HRESULT IShellTaskScheduler_QueryInterface(IShellTaskScheduler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellTaskScheduler_AddRef(IShellTaskScheduler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellTaskScheduler_Release(IShellTaskScheduler* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellTaskScheduler methods ***/
static inline HRESULT IShellTaskScheduler_AddTask(IShellTaskScheduler* This,IRunnableTask *prt,REFTASKOWNERID rtoid,DWORD_PTR lParam,DWORD dwPriority) {
    return This->lpVtbl->AddTask(This,prt,rtoid,lParam,dwPriority);
}
static inline HRESULT IShellTaskScheduler_RemoveTasks(IShellTaskScheduler* This,REFTASKOWNERID rtoid,DWORD_PTR lParam,WINBOOL bWaitIfRunning) {
    return This->lpVtbl->RemoveTasks(This,rtoid,lParam,bWaitIfRunning);
}
static inline UINT IShellTaskScheduler_CountTasks(IShellTaskScheduler* This,REFTASKOWNERID rtoid) {
    return This->lpVtbl->CountTasks(This,rtoid);
}
static inline 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 inline HRESULT IQueryCodePage_QueryInterface(IQueryCodePage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IQueryCodePage_AddRef(IQueryCodePage* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IQueryCodePage_Release(IQueryCodePage* This) {
    return This->lpVtbl->Release(This);
}
/*** IQueryCodePage methods ***/
static inline HRESULT IQueryCodePage_GetCodePage(IQueryCodePage* This,UINT *puiCodePage) {
    return This->lpVtbl->GetCodePage(This,puiCodePage);
}
static inline 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 inline HRESULT IPersistFolder2_QueryInterface(IPersistFolder2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPersistFolder2_AddRef(IPersistFolder2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPersistFolder2_Release(IPersistFolder2* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersist methods ***/
static inline HRESULT IPersistFolder2_GetClassID(IPersistFolder2* This,CLSID *pClassID) {
    return This->lpVtbl->GetClassID(This,pClassID);
}
/*** IPersistFolder methods ***/
static inline HRESULT IPersistFolder2_Initialize(IPersistFolder2* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->Initialize(This,pidl);
}
/*** IPersistFolder2 methods ***/
static inline 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 inline HRESULT IPersistFolder3_QueryInterface(IPersistFolder3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPersistFolder3_AddRef(IPersistFolder3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPersistFolder3_Release(IPersistFolder3* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersist methods ***/
static inline HRESULT IPersistFolder3_GetClassID(IPersistFolder3* This,CLSID *pClassID) {
    return This->lpVtbl->GetClassID(This,pClassID);
}
/*** IPersistFolder methods ***/
static inline HRESULT IPersistFolder3_Initialize(IPersistFolder3* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->Initialize(This,pidl);
}
/*** IPersistFolder2 methods ***/
static inline HRESULT IPersistFolder3_GetCurFolder(IPersistFolder3* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetCurFolder(This,ppidl);
}
/*** IPersistFolder3 methods ***/
static inline 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 inline 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 inline HRESULT IPersistIDList_QueryInterface(IPersistIDList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPersistIDList_AddRef(IPersistIDList* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPersistIDList_Release(IPersistIDList* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersist methods ***/
static inline HRESULT IPersistIDList_GetClassID(IPersistIDList* This,CLSID *pClassID) {
    return This->lpVtbl->GetClassID(This,pClassID);
}
/*** IPersistIDList methods ***/
static inline HRESULT IPersistIDList_SetIDList(IPersistIDList* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->SetIDList(This,pidl);
}
static inline 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 inline HRESULT IEnumIDList_QueryInterface(IEnumIDList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IEnumIDList_AddRef(IEnumIDList* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IEnumIDList_Release(IEnumIDList* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumIDList methods ***/
static inline HRESULT IEnumIDList_Next(IEnumIDList* This,ULONG celt,PITEMID_CHILD *rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static inline HRESULT IEnumIDList_Skip(IEnumIDList* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static inline HRESULT IEnumIDList_Reset(IEnumIDList* This) {
    return This->lpVtbl->Reset(This);
}
static inline 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 inline HRESULT IEnumFullIDList_QueryInterface(IEnumFullIDList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IEnumFullIDList_AddRef(IEnumFullIDList* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IEnumFullIDList_Release(IEnumFullIDList* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumFullIDList methods ***/
static inline HRESULT IEnumFullIDList_Next(IEnumFullIDList* This,ULONG celt,PIDLIST_ABSOLUTE *rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static inline HRESULT IEnumFullIDList_Skip(IEnumFullIDList* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static inline HRESULT IEnumFullIDList_Reset(IEnumFullIDList* This) {
    return This->lpVtbl->Reset(This);
}
static inline 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 inline HRESULT IObjectWithFolderEnumMode_QueryInterface(IObjectWithFolderEnumMode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IObjectWithFolderEnumMode_AddRef(IObjectWithFolderEnumMode* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IObjectWithFolderEnumMode_Release(IObjectWithFolderEnumMode* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectWithFolderEnumMode methods ***/
static inline HRESULT IObjectWithFolderEnumMode_SetMode(IObjectWithFolderEnumMode* This,FOLDER_ENUM_MODE feMode) {
    return This->lpVtbl->SetMode(This,feMode);
}
static inline 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 inline HRESULT IParseAndCreateItem_QueryInterface(IParseAndCreateItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IParseAndCreateItem_AddRef(IParseAndCreateItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IParseAndCreateItem_Release(IParseAndCreateItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IParseAndCreateItem methods ***/
static inline HRESULT IParseAndCreateItem_SetItem(IParseAndCreateItem* This,IShellItem *psi) {
    return This->lpVtbl->SetItem(This,psi);
}
static inline 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 inline HRESULT IShellFolder_QueryInterface(IShellFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellFolder_AddRef(IShellFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellFolder_Release(IShellFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellFolder methods ***/
static inline 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 inline HRESULT IShellFolder_EnumObjects(IShellFolder* This,HWND hwnd,SHCONTF grfFlags,IEnumIDList **ppenumIDList) {
    return This->lpVtbl->EnumObjects(This,hwnd,grfFlags,ppenumIDList);
}
static inline HRESULT IShellFolder_BindToObject(IShellFolder* This,PCUIDLIST_RELATIVE pidl,IBindCtx *pbc,REFIID riid,void **ppv) {
    return This->lpVtbl->BindToObject(This,pidl,pbc,riid,ppv);
}
static inline HRESULT IShellFolder_BindToStorage(IShellFolder* This,PCUIDLIST_RELATIVE pidl,IBindCtx *pbc,REFIID riid,void **ppv) {
    return This->lpVtbl->BindToStorage(This,pidl,pbc,riid,ppv);
}
static inline HRESULT IShellFolder_CompareIDs(IShellFolder* This,LPARAM lParam,PCUIDLIST_RELATIVE pidl1,PCUIDLIST_RELATIVE pidl2) {
    return This->lpVtbl->CompareIDs(This,lParam,pidl1,pidl2);
}
static inline HRESULT IShellFolder_CreateViewObject(IShellFolder* This,HWND hwndOwner,REFIID riid,void **ppv) {
    return This->lpVtbl->CreateViewObject(This,hwndOwner,riid,ppv);
}
static inline HRESULT IShellFolder_GetAttributesOf(IShellFolder* This,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,SFGAOF *rgfInOut) {
    return This->lpVtbl->GetAttributesOf(This,cidl,apidl,rgfInOut);
}
static inline 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 inline HRESULT IShellFolder_GetDisplayNameOf(IShellFolder* This,PCUITEMID_CHILD pidl,SHGDNF uFlags,STRRET *pName) {
    return This->lpVtbl->GetDisplayNameOf(This,pidl,uFlags,pName);
}
static inline 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 inline HRESULT IEnumExtraSearch_QueryInterface(IEnumExtraSearch* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IEnumExtraSearch_AddRef(IEnumExtraSearch* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IEnumExtraSearch_Release(IEnumExtraSearch* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumExtraSearch methods ***/
static inline HRESULT IEnumExtraSearch_Next(IEnumExtraSearch* This,ULONG celt,EXTRASEARCH *rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static inline HRESULT IEnumExtraSearch_Skip(IEnumExtraSearch* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static inline HRESULT IEnumExtraSearch_Reset(IEnumExtraSearch* This) {
    return This->lpVtbl->Reset(This);
}
static inline 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 inline HRESULT IShellFolder2_QueryInterface(IShellFolder2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellFolder2_AddRef(IShellFolder2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellFolder2_Release(IShellFolder2* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellFolder methods ***/
static inline 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 inline HRESULT IShellFolder2_EnumObjects(IShellFolder2* This,HWND hwnd,SHCONTF grfFlags,IEnumIDList **ppenumIDList) {
    return This->lpVtbl->EnumObjects(This,hwnd,grfFlags,ppenumIDList);
}
static inline HRESULT IShellFolder2_BindToObject(IShellFolder2* This,PCUIDLIST_RELATIVE pidl,IBindCtx *pbc,REFIID riid,void **ppv) {
    return This->lpVtbl->BindToObject(This,pidl,pbc,riid,ppv);
}
static inline HRESULT IShellFolder2_BindToStorage(IShellFolder2* This,PCUIDLIST_RELATIVE pidl,IBindCtx *pbc,REFIID riid,void **ppv) {
    return This->lpVtbl->BindToStorage(This,pidl,pbc,riid,ppv);
}
static inline HRESULT IShellFolder2_CompareIDs(IShellFolder2* This,LPARAM lParam,PCUIDLIST_RELATIVE pidl1,PCUIDLIST_RELATIVE pidl2) {
    return This->lpVtbl->CompareIDs(This,lParam,pidl1,pidl2);
}
static inline HRESULT IShellFolder2_CreateViewObject(IShellFolder2* This,HWND hwndOwner,REFIID riid,void **ppv) {
    return This->lpVtbl->CreateViewObject(This,hwndOwner,riid,ppv);
}
static inline HRESULT IShellFolder2_GetAttributesOf(IShellFolder2* This,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,SFGAOF *rgfInOut) {
    return This->lpVtbl->GetAttributesOf(This,cidl,apidl,rgfInOut);
}
static inline 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 inline HRESULT IShellFolder2_GetDisplayNameOf(IShellFolder2* This,PCUITEMID_CHILD pidl,SHGDNF uFlags,STRRET *pName) {
    return This->lpVtbl->GetDisplayNameOf(This,pidl,uFlags,pName);
}
static inline 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 inline HRESULT IShellFolder2_GetDefaultSearchGUID(IShellFolder2* This,GUID *pguid) {
    return This->lpVtbl->GetDefaultSearchGUID(This,pguid);
}
static inline HRESULT IShellFolder2_EnumSearches(IShellFolder2* This,IEnumExtraSearch **ppenum) {
    return This->lpVtbl->EnumSearches(This,ppenum);
}
static inline HRESULT IShellFolder2_GetDefaultColumn(IShellFolder2* This,DWORD dwRes,ULONG *pSort,ULONG *pDisplay) {
    return This->lpVtbl->GetDefaultColumn(This,dwRes,pSort,pDisplay);
}
static inline HRESULT IShellFolder2_GetDefaultColumnState(IShellFolder2* This,UINT iColumn,SHCOLSTATEF *pcsFlags) {
    return This->lpVtbl->GetDefaultColumnState(This,iColumn,pcsFlags);
}
static inline HRESULT IShellFolder2_GetDetailsEx(IShellFolder2* This,PCUITEMID_CHILD pidl,const SHCOLUMNID *pscid,VARIANT *pv) {
    return This->lpVtbl->GetDetailsEx(This,pidl,pscid,pv);
}
static inline HRESULT IShellFolder2_GetDetailsOf(IShellFolder2* This,PCUITEMID_CHILD pidl,UINT iColumn,SHELLDETAILS *psd) {
    return This->lpVtbl->GetDetailsOf(This,pidl,iColumn,psd);
}
static inline 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 inline HRESULT IFolderViewOptions_QueryInterface(IFolderViewOptions* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFolderViewOptions_AddRef(IFolderViewOptions* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFolderViewOptions_Release(IFolderViewOptions* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderViewOptions methods ***/
static inline HRESULT IFolderViewOptions_SetFolderViewOptions(IFolderViewOptions* This,FOLDERVIEWOPTIONS fvoMask,FOLDERVIEWOPTIONS fvoFlags) {
    return This->lpVtbl->SetFolderViewOptions(This,fvoMask,fvoFlags);
}
static inline 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 inline HRESULT IShellView_QueryInterface(IShellView* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellView_AddRef(IShellView* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellView_Release(IShellView* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static inline HRESULT IShellView_GetWindow(IShellView* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static inline HRESULT IShellView_ContextSensitiveHelp(IShellView* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IShellView methods ***/
static inline HRESULT IShellView_TranslateAccelerator(IShellView* This,MSG *pmsg) {
    return This->lpVtbl->TranslateAccelerator(This,pmsg);
}
static inline HRESULT IShellView_EnableModeless(IShellView* This,WINBOOL fEnable) {
    return This->lpVtbl->EnableModeless(This,fEnable);
}
static inline HRESULT IShellView_UIActivate(IShellView* This,UINT uState) {
    return This->lpVtbl->UIActivate(This,uState);
}
static inline HRESULT IShellView_Refresh(IShellView* This) {
    return This->lpVtbl->Refresh(This);
}
static inline 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 inline HRESULT IShellView_DestroyViewWindow(IShellView* This) {
    return This->lpVtbl->DestroyViewWindow(This);
}
static inline HRESULT IShellView_GetCurrentInfo(IShellView* This,LPFOLDERSETTINGS pfs) {
    return This->lpVtbl->GetCurrentInfo(This,pfs);
}
static inline HRESULT IShellView_AddPropertySheetPages(IShellView* This,DWORD dwReserved,LPFNSVADDPROPSHEETPAGE pfn,LPARAM lparam) {
    return This->lpVtbl->AddPropertySheetPages(This,dwReserved,pfn,lparam);
}
static inline HRESULT IShellView_SaveViewState(IShellView* This) {
    return This->lpVtbl->SaveViewState(This);
}
static inline HRESULT IShellView_SelectItem(IShellView* This,PCUITEMID_CHILD pidlItem,SVSIF uFlags) {
    return This->lpVtbl->SelectItem(This,pidlItem,uFlags);
}
static inline 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 inline HRESULT IShellView2_QueryInterface(IShellView2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellView2_AddRef(IShellView2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellView2_Release(IShellView2* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static inline HRESULT IShellView2_GetWindow(IShellView2* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static inline HRESULT IShellView2_ContextSensitiveHelp(IShellView2* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IShellView methods ***/
static inline HRESULT IShellView2_TranslateAccelerator(IShellView2* This,MSG *pmsg) {
    return This->lpVtbl->TranslateAccelerator(This,pmsg);
}
static inline HRESULT IShellView2_EnableModeless(IShellView2* This,WINBOOL fEnable) {
    return This->lpVtbl->EnableModeless(This,fEnable);
}
static inline HRESULT IShellView2_UIActivate(IShellView2* This,UINT uState) {
    return This->lpVtbl->UIActivate(This,uState);
}
static inline HRESULT IShellView2_Refresh(IShellView2* This) {
    return This->lpVtbl->Refresh(This);
}
static inline 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 inline HRESULT IShellView2_DestroyViewWindow(IShellView2* This) {
    return This->lpVtbl->DestroyViewWindow(This);
}
static inline HRESULT IShellView2_GetCurrentInfo(IShellView2* This,LPFOLDERSETTINGS pfs) {
    return This->lpVtbl->GetCurrentInfo(This,pfs);
}
static inline HRESULT IShellView2_AddPropertySheetPages(IShellView2* This,DWORD dwReserved,LPFNSVADDPROPSHEETPAGE pfn,LPARAM lparam) {
    return This->lpVtbl->AddPropertySheetPages(This,dwReserved,pfn,lparam);
}
static inline HRESULT IShellView2_SaveViewState(IShellView2* This) {
    return This->lpVtbl->SaveViewState(This);
}
static inline HRESULT IShellView2_SelectItem(IShellView2* This,PCUITEMID_CHILD pidlItem,SVSIF uFlags) {
    return This->lpVtbl->SelectItem(This,pidlItem,uFlags);
}
static inline HRESULT IShellView2_GetItemObject(IShellView2* This,UINT uItem,REFIID riid,void **ppv) {
    return This->lpVtbl->GetItemObject(This,uItem,riid,ppv);
}
/*** IShellView2 methods ***/
static inline HRESULT IShellView2_GetView(IShellView2* This,SHELLVIEWID *pvid,ULONG uView) {
    return This->lpVtbl->GetView(This,pvid,uView);
}
static inline HRESULT IShellView2_CreateViewWindow2(IShellView2* This,LPSV2CVW2_PARAMS lpParams) {
    return This->lpVtbl->CreateViewWindow2(This,lpParams);
}
static inline HRESULT IShellView2_HandleRename(IShellView2* This,PCUITEMID_CHILD pidlNew) {
    return This->lpVtbl->HandleRename(This,pidlNew);
}
static inline 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 inline HRESULT IShellView3_QueryInterface(IShellView3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellView3_AddRef(IShellView3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellView3_Release(IShellView3* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static inline HRESULT IShellView3_GetWindow(IShellView3* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static inline HRESULT IShellView3_ContextSensitiveHelp(IShellView3* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IShellView methods ***/
static inline HRESULT IShellView3_TranslateAccelerator(IShellView3* This,MSG *pmsg) {
    return This->lpVtbl->TranslateAccelerator(This,pmsg);
}
static inline HRESULT IShellView3_EnableModeless(IShellView3* This,WINBOOL fEnable) {
    return This->lpVtbl->EnableModeless(This,fEnable);
}
static inline HRESULT IShellView3_UIActivate(IShellView3* This,UINT uState) {
    return This->lpVtbl->UIActivate(This,uState);
}
static inline HRESULT IShellView3_Refresh(IShellView3* This) {
    return This->lpVtbl->Refresh(This);
}
static inline 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 inline HRESULT IShellView3_DestroyViewWindow(IShellView3* This) {
    return This->lpVtbl->DestroyViewWindow(This);
}
static inline HRESULT IShellView3_GetCurrentInfo(IShellView3* This,LPFOLDERSETTINGS pfs) {
    return This->lpVtbl->GetCurrentInfo(This,pfs);
}
static inline HRESULT IShellView3_AddPropertySheetPages(IShellView3* This,DWORD dwReserved,LPFNSVADDPROPSHEETPAGE pfn,LPARAM lparam) {
    return This->lpVtbl->AddPropertySheetPages(This,dwReserved,pfn,lparam);
}
static inline HRESULT IShellView3_SaveViewState(IShellView3* This) {
    return This->lpVtbl->SaveViewState(This);
}
static inline HRESULT IShellView3_SelectItem(IShellView3* This,PCUITEMID_CHILD pidlItem,SVSIF uFlags) {
    return This->lpVtbl->SelectItem(This,pidlItem,uFlags);
}
static inline HRESULT IShellView3_GetItemObject(IShellView3* This,UINT uItem,REFIID riid,void **ppv) {
    return This->lpVtbl->GetItemObject(This,uItem,riid,ppv);
}
/*** IShellView2 methods ***/
static inline HRESULT IShellView3_GetView(IShellView3* This,SHELLVIEWID *pvid,ULONG uView) {
    return This->lpVtbl->GetView(This,pvid,uView);
}
static inline HRESULT IShellView3_CreateViewWindow2(IShellView3* This,LPSV2CVW2_PARAMS lpParams) {
    return This->lpVtbl->CreateViewWindow2(This,lpParams);
}
static inline HRESULT IShellView3_HandleRename(IShellView3* This,PCUITEMID_CHILD pidlNew) {
    return This->lpVtbl->HandleRename(This,pidlNew);
}
static inline HRESULT IShellView3_SelectAndPositionItem(IShellView3* This,PCUITEMID_CHILD pidlItem,UINT uFlags,POINT *ppt) {
    return This->lpVtbl->SelectAndPositionItem(This,pidlItem,uFlags,ppt);
}
/*** IShellView3 methods ***/
static inline 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 inline HRESULT IFolderView_QueryInterface(IFolderView* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFolderView_AddRef(IFolderView* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFolderView_Release(IFolderView* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderView methods ***/
static inline HRESULT IFolderView_GetCurrentViewMode(IFolderView* This,UINT *pViewMode) {
    return This->lpVtbl->GetCurrentViewMode(This,pViewMode);
}
static inline HRESULT IFolderView_SetCurrentViewMode(IFolderView* This,UINT ViewMode) {
    return This->lpVtbl->SetCurrentViewMode(This,ViewMode);
}
static inline HRESULT IFolderView_GetFolder(IFolderView* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetFolder(This,riid,ppv);
}
static inline HRESULT IFolderView_Item(IFolderView* This,int iItemIndex,PITEMID_CHILD *ppidl) {
    return This->lpVtbl->Item(This,iItemIndex,ppidl);
}
static inline HRESULT IFolderView_ItemCount(IFolderView* This,UINT uFlags,int *pcItems) {
    return This->lpVtbl->ItemCount(This,uFlags,pcItems);
}
static inline HRESULT IFolderView_Items(IFolderView* This,UINT uFlags,REFIID riid,void **ppv) {
    return This->lpVtbl->Items(This,uFlags,riid,ppv);
}
static inline HRESULT IFolderView_GetSelectionMarkedItem(IFolderView* This,int *piItem) {
    return This->lpVtbl->GetSelectionMarkedItem(This,piItem);
}
static inline HRESULT IFolderView_GetFocusedItem(IFolderView* This,int *piItem) {
    return This->lpVtbl->GetFocusedItem(This,piItem);
}
static inline HRESULT IFolderView_GetItemPosition(IFolderView* This,PCUITEMID_CHILD pidl,POINT *ppt) {
    return This->lpVtbl->GetItemPosition(This,pidl,ppt);
}
static inline HRESULT IFolderView_GetSpacing(IFolderView* This,POINT *ppt) {
    return This->lpVtbl->GetSpacing(This,ppt);
}
static inline HRESULT IFolderView_GetDefaultSpacing(IFolderView* This,POINT *ppt) {
    return This->lpVtbl->GetDefaultSpacing(This,ppt);
}
static inline HRESULT IFolderView_GetAutoArrange(IFolderView* This) {
    return This->lpVtbl->GetAutoArrange(This);
}
static inline HRESULT IFolderView_SelectItem(IFolderView* This,int iItem,DWORD dwFlags) {
    return This->lpVtbl->SelectItem(This,iItem,dwFlags);
}
static inline 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 inline HRESULT ISearchBoxInfo_QueryInterface(ISearchBoxInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISearchBoxInfo_AddRef(ISearchBoxInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISearchBoxInfo_Release(ISearchBoxInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** ISearchBoxInfo methods ***/
static inline HRESULT ISearchBoxInfo_GetCondition(ISearchBoxInfo* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetCondition(This,riid,ppv);
}
static inline 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 inline HRESULT IFolderView2_QueryInterface(IFolderView2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFolderView2_AddRef(IFolderView2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFolderView2_Release(IFolderView2* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderView methods ***/
static inline HRESULT IFolderView2_GetCurrentViewMode(IFolderView2* This,UINT *pViewMode) {
    return This->lpVtbl->GetCurrentViewMode(This,pViewMode);
}
static inline HRESULT IFolderView2_SetCurrentViewMode(IFolderView2* This,UINT ViewMode) {
    return This->lpVtbl->SetCurrentViewMode(This,ViewMode);
}
static inline HRESULT IFolderView2_GetFolder(IFolderView2* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetFolder(This,riid,ppv);
}
static inline HRESULT IFolderView2_Item(IFolderView2* This,int iItemIndex,PITEMID_CHILD *ppidl) {
    return This->lpVtbl->Item(This,iItemIndex,ppidl);
}
static inline HRESULT IFolderView2_ItemCount(IFolderView2* This,UINT uFlags,int *pcItems) {
    return This->lpVtbl->ItemCount(This,uFlags,pcItems);
}
static inline HRESULT IFolderView2_Items(IFolderView2* This,UINT uFlags,REFIID riid,void **ppv) {
    return This->lpVtbl->Items(This,uFlags,riid,ppv);
}
static inline HRESULT IFolderView2_GetSelectionMarkedItem(IFolderView2* This,int *piItem) {
    return This->lpVtbl->GetSelectionMarkedItem(This,piItem);
}
static inline HRESULT IFolderView2_GetFocusedItem(IFolderView2* This,int *piItem) {
    return This->lpVtbl->GetFocusedItem(This,piItem);
}
static inline HRESULT IFolderView2_GetItemPosition(IFolderView2* This,PCUITEMID_CHILD pidl,POINT *ppt) {
    return This->lpVtbl->GetItemPosition(This,pidl,ppt);
}
static inline HRESULT IFolderView2_GetSpacing(IFolderView2* This,POINT *ppt) {
    return This->lpVtbl->GetSpacing(This,ppt);
}
static inline HRESULT IFolderView2_GetDefaultSpacing(IFolderView2* This,POINT *ppt) {
    return This->lpVtbl->GetDefaultSpacing(This,ppt);
}
static inline HRESULT IFolderView2_GetAutoArrange(IFolderView2* This) {
    return This->lpVtbl->GetAutoArrange(This);
}
static inline HRESULT IFolderView2_SelectItem(IFolderView2* This,int iItem,DWORD dwFlags) {
    return This->lpVtbl->SelectItem(This,iItem,dwFlags);
}
static inline 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 inline HRESULT IFolderView2_SetGroupBy(IFolderView2* This,REFPROPERTYKEY key,WINBOOL fAscending) {
    return This->lpVtbl->SetGroupBy(This,key,fAscending);
}
static inline HRESULT IFolderView2_GetGroupBy(IFolderView2* This,PROPERTYKEY *pkey,WINBOOL *pfAscending) {
    return This->lpVtbl->GetGroupBy(This,pkey,pfAscending);
}
static inline HRESULT IFolderView2_SetViewProperty(IFolderView2* This,PCUITEMID_CHILD pidl,REFPROPERTYKEY propkey,REFPROPVARIANT propvar) {
    return This->lpVtbl->SetViewProperty(This,pidl,propkey,propvar);
}
static inline HRESULT IFolderView2_GetViewProperty(IFolderView2* This,PCUITEMID_CHILD pidl,REFPROPERTYKEY propkey,PROPVARIANT *ppropvar) {
    return This->lpVtbl->GetViewProperty(This,pidl,propkey,ppropvar);
}
static inline HRESULT IFolderView2_SetTileViewProperties(IFolderView2* This,PCUITEMID_CHILD pidl,LPCWSTR pszPropList) {
    return This->lpVtbl->SetTileViewProperties(This,pidl,pszPropList);
}
static inline HRESULT IFolderView2_SetExtendedTileViewProperties(IFolderView2* This,PCUITEMID_CHILD pidl,LPCWSTR pszPropList) {
    return This->lpVtbl->SetExtendedTileViewProperties(This,pidl,pszPropList);
}
static inline HRESULT IFolderView2_SetText(IFolderView2* This,FVTEXTTYPE iType,LPCWSTR pwszText) {
    return This->lpVtbl->SetText(This,iType,pwszText);
}
static inline HRESULT IFolderView2_SetCurrentFolderFlags(IFolderView2* This,DWORD dwMask,DWORD dwFlags) {
    return This->lpVtbl->SetCurrentFolderFlags(This,dwMask,dwFlags);
}
static inline HRESULT IFolderView2_GetCurrentFolderFlags(IFolderView2* This,DWORD *pdwFlags) {
    return This->lpVtbl->GetCurrentFolderFlags(This,pdwFlags);
}
static inline HRESULT IFolderView2_GetSortColumnCount(IFolderView2* This,int *pcColumns) {
    return This->lpVtbl->GetSortColumnCount(This,pcColumns);
}
static inline HRESULT IFolderView2_SetSortColumns(IFolderView2* This,const SORTCOLUMN *rgSortColumns,int cColumns) {
    return This->lpVtbl->SetSortColumns(This,rgSortColumns,cColumns);
}
static inline HRESULT IFolderView2_GetSortColumns(IFolderView2* This,SORTCOLUMN *rgSortColumns,int cColumns) {
    return This->lpVtbl->GetSortColumns(This,rgSortColumns,cColumns);
}
static inline HRESULT IFolderView2_GetItem(IFolderView2* This,int iItem,REFIID riid,void **ppv) {
    return This->lpVtbl->GetItem(This,iItem,riid,ppv);
}
static inline HRESULT IFolderView2_GetVisibleItem(IFolderView2* This,int iStart,WINBOOL fPrevious,int *piItem) {
    return This->lpVtbl->GetVisibleItem(This,iStart,fPrevious,piItem);
}
static inline HRESULT IFolderView2_GetSelectedItem(IFolderView2* This,int iStart,int *piItem) {
    return This->lpVtbl->GetSelectedItem(This,iStart,piItem);
}
static inline HRESULT IFolderView2_GetSelection(IFolderView2* This,WINBOOL fNoneImpliesFolder,IShellItemArray **ppsia) {
    return This->lpVtbl->GetSelection(This,fNoneImpliesFolder,ppsia);
}
static inline HRESULT IFolderView2_GetSelectionState(IFolderView2* This,PCUITEMID_CHILD pidl,DWORD *pdwFlags) {
    return This->lpVtbl->GetSelectionState(This,pidl,pdwFlags);
}
static inline HRESULT IFolderView2_InvokeVerbOnSelection(IFolderView2* This,LPCSTR pszVerb) {
    return This->lpVtbl->InvokeVerbOnSelection(This,pszVerb);
}
static inline HRESULT IFolderView2_SetViewModeAndIconSize(IFolderView2* This,FOLDERVIEWMODE uViewMode,int iImageSize) {
    return This->lpVtbl->SetViewModeAndIconSize(This,uViewMode,iImageSize);
}
static inline HRESULT IFolderView2_GetViewModeAndIconSize(IFolderView2* This,FOLDERVIEWMODE *puViewMode,int *piImageSize) {
    return This->lpVtbl->GetViewModeAndIconSize(This,puViewMode,piImageSize);
}
static inline HRESULT IFolderView2_SetGroupSubsetCount(IFolderView2* This,UINT cVisibleRows) {
    return This->lpVtbl->SetGroupSubsetCount(This,cVisibleRows);
}
static inline HRESULT IFolderView2_GetGroupSubsetCount(IFolderView2* This,UINT *pcVisibleRows) {
    return This->lpVtbl->GetGroupSubsetCount(This,pcVisibleRows);
}
static inline HRESULT IFolderView2_SetRedraw(IFolderView2* This,WINBOOL fRedrawOn) {
    return This->lpVtbl->SetRedraw(This,fRedrawOn);
}
static inline HRESULT IFolderView2_IsMoveInSameFolder(IFolderView2* This) {
    return This->lpVtbl->IsMoveInSameFolder(This);
}
static inline 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 inline HRESULT IFolderViewSettings_QueryInterface(IFolderViewSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFolderViewSettings_AddRef(IFolderViewSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFolderViewSettings_Release(IFolderViewSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderViewSettings methods ***/
static inline HRESULT IFolderViewSettings_GetColumnPropertyList(IFolderViewSettings* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetColumnPropertyList(This,riid,ppv);
}
static inline HRESULT IFolderViewSettings_GetGroupByProperty(IFolderViewSettings* This,PROPERTYKEY *pkey,WINBOOL *pfGroupAscending) {
    return This->lpVtbl->GetGroupByProperty(This,pkey,pfGroupAscending);
}
static inline HRESULT IFolderViewSettings_GetViewMode(IFolderViewSettings* This,FOLDERLOGICALVIEWMODE *plvm) {
    return This->lpVtbl->GetViewMode(This,plvm);
}
static inline HRESULT IFolderViewSettings_GetIconSize(IFolderViewSettings* This,UINT *puIconSize) {
    return This->lpVtbl->GetIconSize(This,puIconSize);
}
static inline HRESULT IFolderViewSettings_GetFolderFlags(IFolderViewSettings* This,FOLDERFLAGS *pfolderMask,FOLDERFLAGS *pfolderFlags) {
    return This->lpVtbl->GetFolderFlags(This,pfolderMask,pfolderFlags);
}
static inline HRESULT IFolderViewSettings_GetSortColumns(IFolderViewSettings* This,SORTCOLUMN *rgSortColumns,UINT cColumnsIn,UINT *pcColumnsOut) {
    return This->lpVtbl->GetSortColumns(This,rgSortColumns,cColumnsIn,pcColumnsOut);
}
static inline 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 inline HRESULT IPreviewHandlerVisuals_QueryInterface(IPreviewHandlerVisuals* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPreviewHandlerVisuals_AddRef(IPreviewHandlerVisuals* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPreviewHandlerVisuals_Release(IPreviewHandlerVisuals* This) {
    return This->lpVtbl->Release(This);
}
/*** IPreviewHandlerVisuals methods ***/
static inline HRESULT IPreviewHandlerVisuals_SetBackgroundColor(IPreviewHandlerVisuals* This,COLORREF color) {
    return This->lpVtbl->SetBackgroundColor(This,color);
}
static inline HRESULT IPreviewHandlerVisuals_SetFont(IPreviewHandlerVisuals* This,const LOGFONTW *plf) {
    return This->lpVtbl->SetFont(This,plf);
}
static inline 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 inline HRESULT IVisualProperties_QueryInterface(IVisualProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVisualProperties_AddRef(IVisualProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVisualProperties_Release(IVisualProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IVisualProperties methods ***/
static inline HRESULT IVisualProperties_SetWatermark(IVisualProperties* This,HBITMAP hbmp,VPWATERMARKFLAGS vpwf) {
    return This->lpVtbl->SetWatermark(This,hbmp,vpwf);
}
static inline HRESULT IVisualProperties_SetColor(IVisualProperties* This,VPCOLORFLAGS vpcf,COLORREF cr) {
    return This->lpVtbl->SetColor(This,vpcf,cr);
}
static inline HRESULT IVisualProperties_GetColor(IVisualProperties* This,VPCOLORFLAGS vpcf,COLORREF *pcr) {
    return This->lpVtbl->GetColor(This,vpcf,pcr);
}
static inline HRESULT IVisualProperties_SetItemHeight(IVisualProperties* This,int cyItemInPixels) {
    return This->lpVtbl->SetItemHeight(This,cyItemInPixels);
}
static inline HRESULT IVisualProperties_GetItemHeight(IVisualProperties* This,int *cyItemInPixels) {
    return This->lpVtbl->GetItemHeight(This,cyItemInPixels);
}
static inline HRESULT IVisualProperties_SetFont(IVisualProperties* This,const LOGFONTW *plf,WINBOOL bRedraw) {
    return This->lpVtbl->SetFont(This,plf,bRedraw);
}
static inline HRESULT IVisualProperties_GetFont(IVisualProperties* This,LOGFONTW *plf) {
    return This->lpVtbl->GetFont(This,plf);
}
static inline 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 inline HRESULT ICommDlgBrowser_QueryInterface(ICommDlgBrowser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICommDlgBrowser_AddRef(ICommDlgBrowser* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICommDlgBrowser_Release(ICommDlgBrowser* This) {
    return This->lpVtbl->Release(This);
}
/*** ICommDlgBrowser methods ***/
static inline HRESULT ICommDlgBrowser_OnDefaultCommand(ICommDlgBrowser* This,IShellView *ppshv) {
    return This->lpVtbl->OnDefaultCommand(This,ppshv);
}
static inline HRESULT ICommDlgBrowser_OnStateChange(ICommDlgBrowser* This,IShellView *ppshv,ULONG uChange) {
    return This->lpVtbl->OnStateChange(This,ppshv,uChange);
}
static inline 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 inline HRESULT ICommDlgBrowser2_QueryInterface(ICommDlgBrowser2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICommDlgBrowser2_AddRef(ICommDlgBrowser2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICommDlgBrowser2_Release(ICommDlgBrowser2* This) {
    return This->lpVtbl->Release(This);
}
/*** ICommDlgBrowser methods ***/
static inline HRESULT ICommDlgBrowser2_OnDefaultCommand(ICommDlgBrowser2* This,IShellView *ppshv) {
    return This->lpVtbl->OnDefaultCommand(This,ppshv);
}
static inline HRESULT ICommDlgBrowser2_OnStateChange(ICommDlgBrowser2* This,IShellView *ppshv,ULONG uChange) {
    return This->lpVtbl->OnStateChange(This,ppshv,uChange);
}
static inline HRESULT ICommDlgBrowser2_IncludeObject(ICommDlgBrowser2* This,IShellView *ppshv,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->IncludeObject(This,ppshv,pidl);
}
/*** ICommDlgBrowser2 methods ***/
static inline HRESULT ICommDlgBrowser2_Notify(ICommDlgBrowser2* This,IShellView *ppshv,DWORD dwNotifyType) {
    return This->lpVtbl->Notify(This,ppshv,dwNotifyType);
}
static inline HRESULT ICommDlgBrowser2_GetDefaultMenuText(ICommDlgBrowser2* This,IShellView *ppshv,LPWSTR pszText,int cchMax) {
    return This->lpVtbl->GetDefaultMenuText(This,ppshv,pszText,cchMax);
}
static inline 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 inline HRESULT ICommDlgBrowser3_QueryInterface(ICommDlgBrowser3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICommDlgBrowser3_AddRef(ICommDlgBrowser3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICommDlgBrowser3_Release(ICommDlgBrowser3* This) {
    return This->lpVtbl->Release(This);
}
/*** ICommDlgBrowser methods ***/
static inline HRESULT ICommDlgBrowser3_OnDefaultCommand(ICommDlgBrowser3* This,IShellView *ppshv) {
    return This->lpVtbl->OnDefaultCommand(This,ppshv);
}
static inline HRESULT ICommDlgBrowser3_OnStateChange(ICommDlgBrowser3* This,IShellView *ppshv,ULONG uChange) {
    return This->lpVtbl->OnStateChange(This,ppshv,uChange);
}
static inline HRESULT ICommDlgBrowser3_IncludeObject(ICommDlgBrowser3* This,IShellView *ppshv,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->IncludeObject(This,ppshv,pidl);
}
/*** ICommDlgBrowser2 methods ***/
static inline HRESULT ICommDlgBrowser3_Notify(ICommDlgBrowser3* This,IShellView *ppshv,DWORD dwNotifyType) {
    return This->lpVtbl->Notify(This,ppshv,dwNotifyType);
}
static inline HRESULT ICommDlgBrowser3_GetDefaultMenuText(ICommDlgBrowser3* This,IShellView *ppshv,LPWSTR pszText,int cchMax) {
    return This->lpVtbl->GetDefaultMenuText(This,ppshv,pszText,cchMax);
}
static inline HRESULT ICommDlgBrowser3_GetViewFlags(ICommDlgBrowser3* This,DWORD *pdwFlags) {
    return This->lpVtbl->GetViewFlags(This,pdwFlags);
}
/*** ICommDlgBrowser3 methods ***/
static inline HRESULT ICommDlgBrowser3_OnColumnClicked(ICommDlgBrowser3* This,IShellView *ppshv,int iColumn) {
    return This->lpVtbl->OnColumnClicked(This,ppshv,iColumn);
}
static inline HRESULT ICommDlgBrowser3_GetCurrentFilter(ICommDlgBrowser3* This,LPWSTR pszFileSpec,int cchFileSpec) {
    return This->lpVtbl->GetCurrentFilter(This,pszFileSpec,cchFileSpec);
}
static inline 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 inline HRESULT IColumnManager_QueryInterface(IColumnManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IColumnManager_AddRef(IColumnManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IColumnManager_Release(IColumnManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IColumnManager methods ***/
static inline HRESULT IColumnManager_SetColumnInfo(IColumnManager* This,REFPROPERTYKEY propkey,const CM_COLUMNINFO *pcmci) {
    return This->lpVtbl->SetColumnInfo(This,propkey,pcmci);
}
static inline HRESULT IColumnManager_GetColumnInfo(IColumnManager* This,REFPROPERTYKEY propkey,CM_COLUMNINFO *pcmci) {
    return This->lpVtbl->GetColumnInfo(This,propkey,pcmci);
}
static inline HRESULT IColumnManager_GetColumnCount(IColumnManager* This,CM_ENUM_FLAGS dwFlags,UINT *puCount) {
    return This->lpVtbl->GetColumnCount(This,dwFlags,puCount);
}
static inline HRESULT IColumnManager_GetColumns(IColumnManager* This,CM_ENUM_FLAGS dwFlags,PROPERTYKEY *rgkeyOrder,UINT cColumns) {
    return This->lpVtbl->GetColumns(This,dwFlags,rgkeyOrder,cColumns);
}
static inline 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 inline HRESULT IFolderFilterSite_QueryInterface(IFolderFilterSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFolderFilterSite_AddRef(IFolderFilterSite* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFolderFilterSite_Release(IFolderFilterSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderFilterSite methods ***/
static inline 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 inline HRESULT IFolderFilter_QueryInterface(IFolderFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFolderFilter_AddRef(IFolderFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFolderFilter_Release(IFolderFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderFilter methods ***/
static inline HRESULT IFolderFilter_ShouldShow(IFolderFilter* This,IShellFolder *psf,PCIDLIST_ABSOLUTE pidlFolder,PCUITEMID_CHILD pidlItem) {
    return This->lpVtbl->ShouldShow(This,psf,pidlFolder,pidlItem);
}
static inline 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 inline HRESULT IInputObjectSite_QueryInterface(IInputObjectSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IInputObjectSite_AddRef(IInputObjectSite* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IInputObjectSite_Release(IInputObjectSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IInputObjectSite methods ***/
static inline 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 inline HRESULT IInputObject_QueryInterface(IInputObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IInputObject_AddRef(IInputObject* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IInputObject_Release(IInputObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IInputObject methods ***/
static inline HRESULT IInputObject_UIActivateIO(IInputObject* This,WINBOOL fActivate,MSG *pMsg) {
    return This->lpVtbl->UIActivateIO(This,fActivate,pMsg);
}
static inline HRESULT IInputObject_HasFocusIO(IInputObject* This) {
    return This->lpVtbl->HasFocusIO(This);
}
static inline 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 inline HRESULT IInputObject2_QueryInterface(IInputObject2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IInputObject2_AddRef(IInputObject2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IInputObject2_Release(IInputObject2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInputObject methods ***/
static inline HRESULT IInputObject2_UIActivateIO(IInputObject2* This,WINBOOL fActivate,MSG *pMsg) {
    return This->lpVtbl->UIActivateIO(This,fActivate,pMsg);
}
static inline HRESULT IInputObject2_HasFocusIO(IInputObject2* This) {
    return This->lpVtbl->HasFocusIO(This);
}
static inline HRESULT IInputObject2_TranslateAcceleratorIO(IInputObject2* This,MSG *pMsg) {
    return This->lpVtbl->TranslateAcceleratorIO(This,pMsg);
}
/*** IInputObject2 methods ***/
static inline 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 inline HRESULT IShellIcon_QueryInterface(IShellIcon* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellIcon_AddRef(IShellIcon* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellIcon_Release(IShellIcon* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellIcon methods ***/
static inline 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 inline HRESULT IShellBrowser_QueryInterface(IShellBrowser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellBrowser_AddRef(IShellBrowser* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellBrowser_Release(IShellBrowser* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static inline HRESULT IShellBrowser_GetWindow(IShellBrowser* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static inline HRESULT IShellBrowser_ContextSensitiveHelp(IShellBrowser* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IShellBrowser methods ***/
static inline HRESULT IShellBrowser_InsertMenusSB(IShellBrowser* This,HMENU hmenuShared,LPOLEMENUGROUPWIDTHS lpMenuWidths) {
    return This->lpVtbl->InsertMenusSB(This,hmenuShared,lpMenuWidths);
}
static inline HRESULT IShellBrowser_SetMenuSB(IShellBrowser* This,HMENU hmenuShared,HOLEMENU holemenuRes,HWND hwndActiveObject) {
    return This->lpVtbl->SetMenuSB(This,hmenuShared,holemenuRes,hwndActiveObject);
}
static inline HRESULT IShellBrowser_RemoveMenusSB(IShellBrowser* This,HMENU hmenuShared) {
    return This->lpVtbl->RemoveMenusSB(This,hmenuShared);
}
static inline HRESULT IShellBrowser_SetStatusTextSB(IShellBrowser* This,LPCWSTR pszStatusText) {
    return This->lpVtbl->SetStatusTextSB(This,pszStatusText);
}
static inline HRESULT IShellBrowser_EnableModelessSB(IShellBrowser* This,WINBOOL fEnable) {
    return This->lpVtbl->EnableModelessSB(This,fEnable);
}
static inline HRESULT IShellBrowser_TranslateAcceleratorSB(IShellBrowser* This,MSG *pmsg,WORD wID) {
    return This->lpVtbl->TranslateAcceleratorSB(This,pmsg,wID);
}
static inline HRESULT IShellBrowser_BrowseObject(IShellBrowser* This,PCUIDLIST_RELATIVE pidl,UINT wFlags) {
    return This->lpVtbl->BrowseObject(This,pidl,wFlags);
}
static inline HRESULT IShellBrowser_GetViewStateStream(IShellBrowser* This,DWORD grfMode,IStream **ppStrm) {
    return This->lpVtbl->GetViewStateStream(This,grfMode,ppStrm);
}
static inline HRESULT IShellBrowser_GetControlWindow(IShellBrowser* This,UINT id,HWND *phwnd) {
    return This->lpVtbl->GetControlWindow(This,id,phwnd);
}
static inline 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 inline HRESULT IShellBrowser_QueryActiveShellView(IShellBrowser* This,IShellView **ppshv) {
    return This->lpVtbl->QueryActiveShellView(This,ppshv);
}
static inline HRESULT IShellBrowser_OnViewWindowActive(IShellBrowser* This,IShellView *pshv) {
    return This->lpVtbl->OnViewWindowActive(This,pshv);
}
static inline 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 inline HRESULT IProfferService_QueryInterface(IProfferService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IProfferService_AddRef(IProfferService* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IProfferService_Release(IProfferService* This) {
    return This->lpVtbl->Release(This);
}
/*** IProfferService methods ***/
static inline HRESULT IProfferService_ProfferService(IProfferService* This,REFGUID guidService,IServiceProvider *psp,DWORD *pdwCookie) {
    return This->lpVtbl->ProfferService(This,guidService,psp,pdwCookie);
}
static inline 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 inline HRESULT IShellItem_QueryInterface(IShellItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellItem_AddRef(IShellItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellItem_Release(IShellItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellItem methods ***/
static inline HRESULT IShellItem_BindToHandler(IShellItem* This,IBindCtx *pbc,REFGUID bhid,REFIID riid,void **ppv) {
    return This->lpVtbl->BindToHandler(This,pbc,bhid,riid,ppv);
}
static inline HRESULT IShellItem_GetParent(IShellItem* This,IShellItem **ppsi) {
    return This->lpVtbl->GetParent(This,ppsi);
}
static inline HRESULT IShellItem_GetDisplayName(IShellItem* This,SIGDN sigdnName,LPWSTR *ppszName) {
    return This->lpVtbl->GetDisplayName(This,sigdnName,ppszName);
}
static inline HRESULT IShellItem_GetAttributes(IShellItem* This,SFGAOF sfgaoMask,SFGAOF *psfgaoAttribs) {
    return This->lpVtbl->GetAttributes(This,sfgaoMask,psfgaoAttribs);
}
static inline 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 inline HRESULT IShellItem2_QueryInterface(IShellItem2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellItem2_AddRef(IShellItem2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellItem2_Release(IShellItem2* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellItem methods ***/
static inline HRESULT IShellItem2_BindToHandler(IShellItem2* This,IBindCtx *pbc,REFGUID bhid,REFIID riid,void **ppv) {
    return This->lpVtbl->BindToHandler(This,pbc,bhid,riid,ppv);
}
static inline HRESULT IShellItem2_GetParent(IShellItem2* This,IShellItem **ppsi) {
    return This->lpVtbl->GetParent(This,ppsi);
}
static inline HRESULT IShellItem2_GetDisplayName(IShellItem2* This,SIGDN sigdnName,LPWSTR *ppszName) {
    return This->lpVtbl->GetDisplayName(This,sigdnName,ppszName);
}
static inline HRESULT IShellItem2_GetAttributes(IShellItem2* This,SFGAOF sfgaoMask,SFGAOF *psfgaoAttribs) {
    return This->lpVtbl->GetAttributes(This,sfgaoMask,psfgaoAttribs);
}
static inline HRESULT IShellItem2_Compare(IShellItem2* This,IShellItem *psi,SICHINTF hint,int *piOrder) {
    return This->lpVtbl->Compare(This,psi,hint,piOrder);
}
/*** IShellItem2 methods ***/
static inline HRESULT IShellItem2_GetPropertyStore(IShellItem2* This,GETPROPERTYSTOREFLAGS flags,REFIID riid,void **ppv) {
    return This->lpVtbl->GetPropertyStore(This,flags,riid,ppv);
}
static inline HRESULT IShellItem2_GetPropertyStoreWithCreateObject(IShellItem2* This,GETPROPERTYSTOREFLAGS flags,IUnknown *punkCreateObject,REFIID riid,void **ppv) {
    return This->lpVtbl->GetPropertyStoreWithCreateObject(This,flags,punkCreateObject,riid,ppv);
}
static inline 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 inline HRESULT IShellItem2_GetPropertyDescriptionList(IShellItem2* This,REFPROPERTYKEY keyType,REFIID riid,void **ppv) {
    return This->lpVtbl->GetPropertyDescriptionList(This,keyType,riid,ppv);
}
static inline HRESULT IShellItem2_Update(IShellItem2* This,IBindCtx *pbc) {
    return This->lpVtbl->Update(This,pbc);
}
static inline HRESULT IShellItem2_GetProperty(IShellItem2* This,REFPROPERTYKEY key,PROPVARIANT *ppropvar) {
    return This->lpVtbl->GetProperty(This,key,ppropvar);
}
static inline HRESULT IShellItem2_GetCLSID(IShellItem2* This,REFPROPERTYKEY key,CLSID *pclsid) {
    return This->lpVtbl->GetCLSID(This,key,pclsid);
}
static inline HRESULT IShellItem2_GetFileTime(IShellItem2* This,REFPROPERTYKEY key,FILETIME *pft) {
    return This->lpVtbl->GetFileTime(This,key,pft);
}
static inline HRESULT IShellItem2_GetInt32(IShellItem2* This,REFPROPERTYKEY key,int *pi) {
    return This->lpVtbl->GetInt32(This,key,pi);
}
static inline HRESULT IShellItem2_GetString(IShellItem2* This,REFPROPERTYKEY key,LPWSTR *ppsz) {
    return This->lpVtbl->GetString(This,key,ppsz);
}
static inline HRESULT IShellItem2_GetUInt32(IShellItem2* This,REFPROPERTYKEY key,ULONG *pui) {
    return This->lpVtbl->GetUInt32(This,key,pui);
}
static inline HRESULT IShellItem2_GetUInt64(IShellItem2* This,REFPROPERTYKEY key,ULONGLONG *pull) {
    return This->lpVtbl->GetUInt64(This,key,pull);
}
static inline 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 inline HRESULT IShellItemImageFactory_QueryInterface(IShellItemImageFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellItemImageFactory_AddRef(IShellItemImageFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellItemImageFactory_Release(IShellItemImageFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellItemImageFactory methods ***/
static inline 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 inline HRESULT IUserAccountChangeCallback_QueryInterface(IUserAccountChangeCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUserAccountChangeCallback_AddRef(IUserAccountChangeCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUserAccountChangeCallback_Release(IUserAccountChangeCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IUserAccountChangeCallback methods ***/
static inline 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 inline HRESULT IEnumShellItems_QueryInterface(IEnumShellItems* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IEnumShellItems_AddRef(IEnumShellItems* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IEnumShellItems_Release(IEnumShellItems* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumShellItems methods ***/
static inline HRESULT IEnumShellItems_Next(IEnumShellItems* This,ULONG celt,IShellItem **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static inline HRESULT IEnumShellItems_Skip(IEnumShellItems* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static inline HRESULT IEnumShellItems_Reset(IEnumShellItems* This) {
    return This->lpVtbl->Reset(This);
}
static inline 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 inline HRESULT ITransferAdviseSink_QueryInterface(ITransferAdviseSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITransferAdviseSink_AddRef(ITransferAdviseSink* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITransferAdviseSink_Release(ITransferAdviseSink* This) {
    return This->lpVtbl->Release(This);
}
/*** ITransferAdviseSink methods ***/
static inline 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 inline HRESULT ITransferAdviseSink_UpdateTransferState(ITransferAdviseSink* This,TRANSFER_ADVISE_STATE ts) {
    return This->lpVtbl->UpdateTransferState(This,ts);
}
static inline HRESULT ITransferAdviseSink_ConfirmOverwrite(ITransferAdviseSink* This,IShellItem *psiSource,IShellItem *psiDestParent,LPCWSTR pszName) {
    return This->lpVtbl->ConfirmOverwrite(This,psiSource,psiDestParent,pszName);
}
static inline HRESULT ITransferAdviseSink_ConfirmEncryptionLoss(ITransferAdviseSink* This,IShellItem *psiSource) {
    return This->lpVtbl->ConfirmEncryptionLoss(This,psiSource);
}
static inline 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 inline HRESULT ITransferAdviseSink_SubStreamFailure(ITransferAdviseSink* This,IShellItem *psi,LPCWSTR pszStreamName,HRESULT hrError) {
    return This->lpVtbl->SubStreamFailure(This,psi,pszStreamName,hrError);
}
static inline 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 inline HRESULT ITransferSource_QueryInterface(ITransferSource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITransferSource_AddRef(ITransferSource* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITransferSource_Release(ITransferSource* This) {
    return This->lpVtbl->Release(This);
}
/*** ITransferSource methods ***/
static inline HRESULT ITransferSource_Advise(ITransferSource* This,ITransferAdviseSink *psink,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,psink,pdwCookie);
}
static inline HRESULT ITransferSource_Unadvise(ITransferSource* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static inline HRESULT ITransferSource_SetProperties(ITransferSource* This,IPropertyChangeArray *pproparray) {
    return This->lpVtbl->SetProperties(This,pproparray);
}
static inline 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 inline 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 inline 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 inline HRESULT ITransferSource_RemoveItem(ITransferSource* This,IShellItem *psiSource,TRANSFER_SOURCE_FLAGS flags) {
    return This->lpVtbl->RemoveItem(This,psiSource,flags);
}
static inline 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 inline 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 inline HRESULT ITransferSource_ApplyPropertiesToItem(ITransferSource* This,IShellItem *psiSource,IShellItem **ppsiNew) {
    return This->lpVtbl->ApplyPropertiesToItem(This,psiSource,ppsiNew);
}
static inline HRESULT ITransferSource_GetDefaultDestinationName(ITransferSource* This,IShellItem *psiSource,IShellItem *psiParentDest,LPWSTR *ppszDestinationName) {
    return This->lpVtbl->GetDefaultDestinationName(This,psiSource,psiParentDest,ppszDestinationName);
}
static inline HRESULT ITransferSource_EnterFolder(ITransferSource* This,IShellItem *psiChildFolderDest) {
    return This->lpVtbl->EnterFolder(This,psiChildFolderDest);
}
static inline 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 inline HRESULT IEnumResources_QueryInterface(IEnumResources* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IEnumResources_AddRef(IEnumResources* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IEnumResources_Release(IEnumResources* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumResources methods ***/
static inline HRESULT IEnumResources_Next(IEnumResources* This,ULONG celt,SHELL_ITEM_RESOURCE *psir,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,psir,pceltFetched);
}
static inline HRESULT IEnumResources_Skip(IEnumResources* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static inline HRESULT IEnumResources_Reset(IEnumResources* This) {
    return This->lpVtbl->Reset(This);
}
static inline 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 inline HRESULT IShellItemResources_QueryInterface(IShellItemResources* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellItemResources_AddRef(IShellItemResources* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellItemResources_Release(IShellItemResources* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellItemResources methods ***/
static inline HRESULT IShellItemResources_GetAttributes(IShellItemResources* This,DWORD *pdwAttributes) {
    return This->lpVtbl->GetAttributes(This,pdwAttributes);
}
static inline HRESULT IShellItemResources_GetSize(IShellItemResources* This,ULONGLONG *pullSize) {
    return This->lpVtbl->GetSize(This,pullSize);
}
static inline HRESULT IShellItemResources_GetTimes(IShellItemResources* This,FILETIME *pftCreation,FILETIME *pftWrite,FILETIME *pftAccess) {
    return This->lpVtbl->GetTimes(This,pftCreation,pftWrite,pftAccess);
}
static inline HRESULT IShellItemResources_SetTimes(IShellItemResources* This,const FILETIME *pftCreation,const FILETIME *pftWrite,const FILETIME *pftAccess) {
    return This->lpVtbl->SetTimes(This,pftCreation,pftWrite,pftAccess);
}
static inline HRESULT IShellItemResources_GetResourceDescription(IShellItemResources* This,const SHELL_ITEM_RESOURCE *pcsir,LPWSTR *ppszDescription) {
    return This->lpVtbl->GetResourceDescription(This,pcsir,ppszDescription);
}
static inline HRESULT IShellItemResources_EnumResources(IShellItemResources* This,IEnumResources **ppenumr) {
    return This->lpVtbl->EnumResources(This,ppenumr);
}
static inline HRESULT IShellItemResources_SupportsResource(IShellItemResources* This,const SHELL_ITEM_RESOURCE *pcsir) {
    return This->lpVtbl->SupportsResource(This,pcsir);
}
static inline HRESULT IShellItemResources_OpenResource(IShellItemResources* This,const SHELL_ITEM_RESOURCE *pcsir,REFIID riid,void **ppv) {
    return This->lpVtbl->OpenResource(This,pcsir,riid,ppv);
}
static inline HRESULT IShellItemResources_CreateResource(IShellItemResources* This,const SHELL_ITEM_RESOURCE *pcsir,REFIID riid,void **ppv) {
    return This->lpVtbl->CreateResource(This,pcsir,riid,ppv);
}
static inline 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 inline HRESULT ITransferDestination_QueryInterface(ITransferDestination* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITransferDestination_AddRef(ITransferDestination* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITransferDestination_Release(ITransferDestination* This) {
    return This->lpVtbl->Release(This);
}
/*** ITransferDestination methods ***/
static inline HRESULT ITransferDestination_Advise(ITransferDestination* This,ITransferAdviseSink *psink,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,psink,pdwCookie);
}
static inline HRESULT ITransferDestination_Unadvise(ITransferDestination* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static inline 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 inline HRESULT IStreamAsync_QueryInterface(IStreamAsync* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IStreamAsync_AddRef(IStreamAsync* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IStreamAsync_Release(IStreamAsync* This) {
    return This->lpVtbl->Release(This);
}
/*** ISequentialStream methods ***/
static inline HRESULT IStreamAsync_Read(IStreamAsync* This,void *pv,ULONG cb,ULONG *pcbRead) {
    return This->lpVtbl->Read(This,pv,cb,pcbRead);
}
static inline HRESULT IStreamAsync_Write(IStreamAsync* This,const void *pv,ULONG cb,ULONG *pcbWritten) {
    return This->lpVtbl->Write(This,pv,cb,pcbWritten);
}
/*** IStream methods ***/
static inline HRESULT IStreamAsync_Seek(IStreamAsync* This,LARGE_INTEGER dlibMove,DWORD dwOrigin,ULARGE_INTEGER *plibNewPosition) {
    return This->lpVtbl->Seek(This,dlibMove,dwOrigin,plibNewPosition);
}
static inline HRESULT IStreamAsync_SetSize(IStreamAsync* This,ULARGE_INTEGER libNewSize) {
    return This->lpVtbl->SetSize(This,libNewSize);
}
static inline 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 inline HRESULT IStreamAsync_Commit(IStreamAsync* This,DWORD grfCommitFlags) {
    return This->lpVtbl->Commit(This,grfCommitFlags);
}
static inline HRESULT IStreamAsync_Revert(IStreamAsync* This) {
    return This->lpVtbl->Revert(This);
}
static inline HRESULT IStreamAsync_LockRegion(IStreamAsync* This,ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType) {
    return This->lpVtbl->LockRegion(This,libOffset,cb,dwLockType);
}
static inline HRESULT IStreamAsync_UnlockRegion(IStreamAsync* This,ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType) {
    return This->lpVtbl->UnlockRegion(This,libOffset,cb,dwLockType);
}
static inline HRESULT IStreamAsync_Stat(IStreamAsync* This,STATSTG *pstatstg,DWORD grfStatFlag) {
    return This->lpVtbl->Stat(This,pstatstg,grfStatFlag);
}
static inline HRESULT IStreamAsync_Clone(IStreamAsync* This,IStream **ppstm) {
    return This->lpVtbl->Clone(This,ppstm);
}
/*** IStreamAsync methods ***/
static inline HRESULT IStreamAsync_ReadAsync(IStreamAsync* This,void *pv,DWORD cb,LPDWORD pcbRead,LPOVERLAPPED lpOverlapped) {
    return This->lpVtbl->ReadAsync(This,pv,cb,pcbRead,lpOverlapped);
}
static inline HRESULT IStreamAsync_WriteAsync(IStreamAsync* This,const void *lpBuffer,DWORD cb,LPDWORD pcbWritten,LPOVERLAPPED lpOverlapped) {
    return This->lpVtbl->WriteAsync(This,lpBuffer,cb,pcbWritten,lpOverlapped);
}
static inline HRESULT IStreamAsync_OverlappedResult(IStreamAsync* This,LPOVERLAPPED lpOverlapped,LPDWORD lpNumberOfBytesTransferred,WINBOOL bWait) {
    return This->lpVtbl->OverlappedResult(This,lpOverlapped,lpNumberOfBytesTransferred,bWait);
}
static inline 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 inline HRESULT IStreamUnbufferedInfo_QueryInterface(IStreamUnbufferedInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IStreamUnbufferedInfo_AddRef(IStreamUnbufferedInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IStreamUnbufferedInfo_Release(IStreamUnbufferedInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IStreamUnbufferedInfo methods ***/
static inline 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 inline HRESULT IFileOperationProgressSink_QueryInterface(IFileOperationProgressSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileOperationProgressSink_AddRef(IFileOperationProgressSink* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileOperationProgressSink_Release(IFileOperationProgressSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileOperationProgressSink methods ***/
static inline HRESULT IFileOperationProgressSink_StartOperations(IFileOperationProgressSink* This) {
    return This->lpVtbl->StartOperations(This);
}
static inline HRESULT IFileOperationProgressSink_FinishOperations(IFileOperationProgressSink* This,HRESULT hrResult) {
    return This->lpVtbl->FinishOperations(This,hrResult);
}
static inline HRESULT IFileOperationProgressSink_PreRenameItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem,LPCWSTR pszNewName) {
    return This->lpVtbl->PreRenameItem(This,dwFlags,psiItem,pszNewName);
}
static inline 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 inline HRESULT IFileOperationProgressSink_PreMoveItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem,IShellItem *psiDestinationFolder,LPCWSTR pszNewName) {
    return This->lpVtbl->PreMoveItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName);
}
static inline 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 inline HRESULT IFileOperationProgressSink_PreCopyItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem,IShellItem *psiDestinationFolder,LPCWSTR pszNewName) {
    return This->lpVtbl->PreCopyItem(This,dwFlags,psiItem,psiDestinationFolder,pszNewName);
}
static inline 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 inline HRESULT IFileOperationProgressSink_PreDeleteItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem) {
    return This->lpVtbl->PreDeleteItem(This,dwFlags,psiItem);
}
static inline HRESULT IFileOperationProgressSink_PostDeleteItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiItem,HRESULT hrDelete,IShellItem *psiNewlyCreated) {
    return This->lpVtbl->PostDeleteItem(This,dwFlags,psiItem,hrDelete,psiNewlyCreated);
}
static inline HRESULT IFileOperationProgressSink_PreNewItem(IFileOperationProgressSink* This,DWORD dwFlags,IShellItem *psiDestinationFolder,LPCWSTR pszNewName) {
    return This->lpVtbl->PreNewItem(This,dwFlags,psiDestinationFolder,pszNewName);
}
static inline 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 inline HRESULT IFileOperationProgressSink_UpdateProgress(IFileOperationProgressSink* This,UINT iWorkTotal,UINT iWorkSoFar) {
    return This->lpVtbl->UpdateProgress(This,iWorkTotal,iWorkSoFar);
}
static inline HRESULT IFileOperationProgressSink_ResetTimer(IFileOperationProgressSink* This) {
    return This->lpVtbl->ResetTimer(This);
}
static inline HRESULT IFileOperationProgressSink_PauseTimer(IFileOperationProgressSink* This) {
    return This->lpVtbl->PauseTimer(This);
}
static inline 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 inline HRESULT IShellItemArray_QueryInterface(IShellItemArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellItemArray_AddRef(IShellItemArray* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellItemArray_Release(IShellItemArray* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellItemArray methods ***/
static inline HRESULT IShellItemArray_BindToHandler(IShellItemArray* This,IBindCtx *pbc,REFGUID bhid,REFIID riid,void **ppvOut) {
    return This->lpVtbl->BindToHandler(This,pbc,bhid,riid,ppvOut);
}
static inline HRESULT IShellItemArray_GetPropertyStore(IShellItemArray* This,GETPROPERTYSTOREFLAGS flags,REFIID riid,void **ppv) {
    return This->lpVtbl->GetPropertyStore(This,flags,riid,ppv);
}
static inline HRESULT IShellItemArray_GetPropertyDescriptionList(IShellItemArray* This,REFPROPERTYKEY keyType,REFIID riid,void **ppv) {
    return This->lpVtbl->GetPropertyDescriptionList(This,keyType,riid,ppv);
}
static inline HRESULT IShellItemArray_GetAttributes(IShellItemArray* This,SIATTRIBFLAGS AttribFlags,SFGAOF sfgaoMask,SFGAOF *psfgaoAttribs) {
    return This->lpVtbl->GetAttributes(This,AttribFlags,sfgaoMask,psfgaoAttribs);
}
static inline HRESULT IShellItemArray_GetCount(IShellItemArray* This,DWORD *pdwNumItems) {
    return This->lpVtbl->GetCount(This,pdwNumItems);
}
static inline HRESULT IShellItemArray_GetItemAt(IShellItemArray* This,DWORD dwIndex,IShellItem **ppsi) {
    return This->lpVtbl->GetItemAt(This,dwIndex,ppsi);
}
static inline 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 inline HRESULT IInitializeWithItem_QueryInterface(IInitializeWithItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IInitializeWithItem_AddRef(IInitializeWithItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IInitializeWithItem_Release(IInitializeWithItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IInitializeWithItem methods ***/
static inline 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 inline HRESULT IObjectWithSelection_QueryInterface(IObjectWithSelection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IObjectWithSelection_AddRef(IObjectWithSelection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IObjectWithSelection_Release(IObjectWithSelection* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectWithSelection methods ***/
static inline HRESULT IObjectWithSelection_SetSelection(IObjectWithSelection* This,IShellItemArray *psia) {
    return This->lpVtbl->SetSelection(This,psia);
}
static inline 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 inline HRESULT IObjectWithBackReferences_QueryInterface(IObjectWithBackReferences* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IObjectWithBackReferences_AddRef(IObjectWithBackReferences* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IObjectWithBackReferences_Release(IObjectWithBackReferences* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectWithBackReferences methods ***/
static inline 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 inline HRESULT IPropertyUI_QueryInterface(IPropertyUI* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPropertyUI_AddRef(IPropertyUI* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPropertyUI_Release(IPropertyUI* This) {
    return This->lpVtbl->Release(This);
}
/*** IPropertyUI methods ***/
static inline HRESULT IPropertyUI_ParsePropertyName(IPropertyUI* This,LPCWSTR pszName,FMTID *pfmtid,PROPID *ppid,ULONG *pchEaten) {
    return This->lpVtbl->ParsePropertyName(This,pszName,pfmtid,ppid,pchEaten);
}
static inline HRESULT IPropertyUI_GetCannonicalName(IPropertyUI* This,REFFMTID fmtid,PROPID pid,LPWSTR pwszText,DWORD cchText) {
    return This->lpVtbl->GetCannonicalName(This,fmtid,pid,pwszText,cchText);
}
static inline 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 inline HRESULT IPropertyUI_GetPropertyDescription(IPropertyUI* This,REFFMTID fmtid,PROPID pid,LPWSTR pwszText,DWORD cchText) {
    return This->lpVtbl->GetPropertyDescription(This,fmtid,pid,pwszText,cchText);
}
static inline HRESULT IPropertyUI_GetDefaultWidth(IPropertyUI* This,REFFMTID fmtid,PROPID pid,ULONG *pcxChars) {
    return This->lpVtbl->GetDefaultWidth(This,fmtid,pid,pcxChars);
}
static inline HRESULT IPropertyUI_GetFlags(IPropertyUI* This,REFFMTID fmtid,PROPID pid,PROPERTYUI_FLAGS *pflags) {
    return This->lpVtbl->GetFlags(This,fmtid,pid,pflags);
}
static inline 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 inline 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 inline HRESULT ICategoryProvider_QueryInterface(ICategoryProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICategoryProvider_AddRef(ICategoryProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICategoryProvider_Release(ICategoryProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ICategoryProvider methods ***/
static inline HRESULT ICategoryProvider_CanCategorizeOnSCID(ICategoryProvider* This,const SHCOLUMNID *pscid) {
    return This->lpVtbl->CanCategorizeOnSCID(This,pscid);
}
static inline HRESULT ICategoryProvider_GetDefaultCategory(ICategoryProvider* This,GUID *pguid,SHCOLUMNID *pscid) {
    return This->lpVtbl->GetDefaultCategory(This,pguid,pscid);
}
static inline HRESULT ICategoryProvider_GetCategoryForSCID(ICategoryProvider* This,const SHCOLUMNID *pscid,GUID *pguid) {
    return This->lpVtbl->GetCategoryForSCID(This,pscid,pguid);
}
static inline HRESULT ICategoryProvider_EnumCategories(ICategoryProvider* This,IEnumGUID **penum) {
    return This->lpVtbl->EnumCategories(This,penum);
}
static inline HRESULT ICategoryProvider_GetCategoryName(ICategoryProvider* This,const GUID *pguid,LPWSTR pszName,UINT cch) {
    return This->lpVtbl->GetCategoryName(This,pguid,pszName,cch);
}
static inline 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 inline HRESULT ICategorizer_QueryInterface(ICategorizer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICategorizer_AddRef(ICategorizer* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICategorizer_Release(ICategorizer* This) {
    return This->lpVtbl->Release(This);
}
/*** ICategorizer methods ***/
static inline HRESULT ICategorizer_GetDescription(ICategorizer* This,LPWSTR pszDesc,UINT cch) {
    return This->lpVtbl->GetDescription(This,pszDesc,cch);
}
static inline HRESULT ICategorizer_GetCategory(ICategorizer* This,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,DWORD *rgCategoryIds) {
    return This->lpVtbl->GetCategory(This,cidl,apidl,rgCategoryIds);
}
static inline HRESULT ICategorizer_GetCategoryInfo(ICategorizer* This,DWORD dwCategoryId,CATEGORY_INFO *pci) {
    return This->lpVtbl->GetCategoryInfo(This,dwCategoryId,pci);
}
static inline 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 inline HRESULT IDropTargetHelper_QueryInterface(IDropTargetHelper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDropTargetHelper_AddRef(IDropTargetHelper* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDropTargetHelper_Release(IDropTargetHelper* This) {
    return This->lpVtbl->Release(This);
}
/*** IDropTargetHelper methods ***/
static inline HRESULT IDropTargetHelper_DragEnter(IDropTargetHelper* This,HWND hwndTarget,IDataObject *pDataObject,POINT *ppt,DWORD dwEffect) {
    return This->lpVtbl->DragEnter(This,hwndTarget,pDataObject,ppt,dwEffect);
}
static inline HRESULT IDropTargetHelper_DragLeave(IDropTargetHelper* This) {
    return This->lpVtbl->DragLeave(This);
}
static inline HRESULT IDropTargetHelper_DragOver(IDropTargetHelper* This,POINT *ppt,DWORD dwEffect) {
    return This->lpVtbl->DragOver(This,ppt,dwEffect);
}
static inline HRESULT IDropTargetHelper_Drop(IDropTargetHelper* This,IDataObject *pDataObject,POINT *ppt,DWORD dwEffect) {
    return This->lpVtbl->Drop(This,pDataObject,ppt,dwEffect);
}
static inline 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 inline HRESULT IDragSourceHelper_QueryInterface(IDragSourceHelper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDragSourceHelper_AddRef(IDragSourceHelper* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDragSourceHelper_Release(IDragSourceHelper* This) {
    return This->lpVtbl->Release(This);
}
/*** IDragSourceHelper methods ***/
static inline HRESULT IDragSourceHelper_InitializeFromBitmap(IDragSourceHelper* This,LPSHDRAGIMAGE pshdi,IDataObject *pDataObject) {
    return This->lpVtbl->InitializeFromBitmap(This,pshdi,pDataObject);
}
static inline 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 inline HRESULT IDragSourceHelper2_QueryInterface(IDragSourceHelper2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDragSourceHelper2_AddRef(IDragSourceHelper2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDragSourceHelper2_Release(IDragSourceHelper2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDragSourceHelper methods ***/
static inline HRESULT IDragSourceHelper2_InitializeFromBitmap(IDragSourceHelper2* This,LPSHDRAGIMAGE pshdi,IDataObject *pDataObject) {
    return This->lpVtbl->InitializeFromBitmap(This,pshdi,pDataObject);
}
static inline HRESULT IDragSourceHelper2_InitializeFromWindow(IDragSourceHelper2* This,HWND hwnd,POINT *ppt,IDataObject *pDataObject) {
    return This->lpVtbl->InitializeFromWindow(This,hwnd,ppt,pDataObject);
}
/*** IDragSourceHelper2 methods ***/
static inline 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 inline HRESULT IShellLinkA_QueryInterface(IShellLinkA* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellLinkA_AddRef(IShellLinkA* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellLinkA_Release(IShellLinkA* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellLinkA methods ***/
static inline 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 inline HRESULT IShellLinkA_GetIDList(IShellLinkA* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetIDList(This,ppidl);
}
static inline HRESULT IShellLinkA_SetIDList(IShellLinkA* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->SetIDList(This,pidl);
}
static inline HRESULT IShellLinkA_GetDescription(IShellLinkA* This,LPSTR pszName,int cch) {
    return This->lpVtbl->GetDescription(This,pszName,cch);
}
static inline HRESULT IShellLinkA_SetDescription(IShellLinkA* This,LPCSTR pszName) {
    return This->lpVtbl->SetDescription(This,pszName);
}
static inline HRESULT IShellLinkA_GetWorkingDirectory(IShellLinkA* This,LPSTR pszDir,int cch) {
    return This->lpVtbl->GetWorkingDirectory(This,pszDir,cch);
}
static inline HRESULT IShellLinkA_SetWorkingDirectory(IShellLinkA* This,LPCSTR pszDir) {
    return This->lpVtbl->SetWorkingDirectory(This,pszDir);
}
static inline HRESULT IShellLinkA_GetArguments(IShellLinkA* This,LPSTR pszArgs,int cch) {
    return This->lpVtbl->GetArguments(This,pszArgs,cch);
}
static inline HRESULT IShellLinkA_SetArguments(IShellLinkA* This,LPCSTR pszArgs) {
    return This->lpVtbl->SetArguments(This,pszArgs);
}
static inline HRESULT IShellLinkA_GetHotkey(IShellLinkA* This,WORD *pwHotkey) {
    return This->lpVtbl->GetHotkey(This,pwHotkey);
}
static inline HRESULT IShellLinkA_SetHotkey(IShellLinkA* This,WORD wHotkey) {
    return This->lpVtbl->SetHotkey(This,wHotkey);
}
static inline HRESULT IShellLinkA_GetShowCmd(IShellLinkA* This,int *piShowCmd) {
    return This->lpVtbl->GetShowCmd(This,piShowCmd);
}
static inline HRESULT IShellLinkA_SetShowCmd(IShellLinkA* This,int iShowCmd) {
    return This->lpVtbl->SetShowCmd(This,iShowCmd);
}
static inline HRESULT IShellLinkA_GetIconLocation(IShellLinkA* This,LPSTR pszIconPath,int cch,int *piIcon) {
    return This->lpVtbl->GetIconLocation(This,pszIconPath,cch,piIcon);
}
static inline HRESULT IShellLinkA_SetIconLocation(IShellLinkA* This,LPCSTR pszIconPath,int iIcon) {
    return This->lpVtbl->SetIconLocation(This,pszIconPath,iIcon);
}
static inline HRESULT IShellLinkA_SetRelativePath(IShellLinkA* This,LPCSTR pszPathRel,DWORD dwReserved) {
    return This->lpVtbl->SetRelativePath(This,pszPathRel,dwReserved);
}
static inline HRESULT IShellLinkA_Resolve(IShellLinkA* This,HWND hwnd,DWORD fFlags) {
    return This->lpVtbl->Resolve(This,hwnd,fFlags);
}
static inline 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 inline HRESULT IShellLinkW_QueryInterface(IShellLinkW* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellLinkW_AddRef(IShellLinkW* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellLinkW_Release(IShellLinkW* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellLinkW methods ***/
static inline 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 inline HRESULT IShellLinkW_GetIDList(IShellLinkW* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetIDList(This,ppidl);
}
static inline HRESULT IShellLinkW_SetIDList(IShellLinkW* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->SetIDList(This,pidl);
}
static inline HRESULT IShellLinkW_GetDescription(IShellLinkW* This,LPWSTR pszName,int cch) {
    return This->lpVtbl->GetDescription(This,pszName,cch);
}
static inline HRESULT IShellLinkW_SetDescription(IShellLinkW* This,LPCWSTR pszName) {
    return This->lpVtbl->SetDescription(This,pszName);
}
static inline HRESULT IShellLinkW_GetWorkingDirectory(IShellLinkW* This,LPWSTR pszDir,int cch) {
    return This->lpVtbl->GetWorkingDirectory(This,pszDir,cch);
}
static inline HRESULT IShellLinkW_SetWorkingDirectory(IShellLinkW* This,LPCWSTR pszDir) {
    return This->lpVtbl->SetWorkingDirectory(This,pszDir);
}
static inline HRESULT IShellLinkW_GetArguments(IShellLinkW* This,LPWSTR pszArgs,int cch) {
    return This->lpVtbl->GetArguments(This,pszArgs,cch);
}
static inline HRESULT IShellLinkW_SetArguments(IShellLinkW* This,LPCWSTR pszArgs) {
    return This->lpVtbl->SetArguments(This,pszArgs);
}
static inline HRESULT IShellLinkW_GetHotkey(IShellLinkW* This,WORD *pwHotkey) {
    return This->lpVtbl->GetHotkey(This,pwHotkey);
}
static inline HRESULT IShellLinkW_SetHotkey(IShellLinkW* This,WORD wHotkey) {
    return This->lpVtbl->SetHotkey(This,wHotkey);
}
static inline HRESULT IShellLinkW_GetShowCmd(IShellLinkW* This,int *piShowCmd) {
    return This->lpVtbl->GetShowCmd(This,piShowCmd);
}
static inline HRESULT IShellLinkW_SetShowCmd(IShellLinkW* This,int iShowCmd) {
    return This->lpVtbl->SetShowCmd(This,iShowCmd);
}
static inline HRESULT IShellLinkW_GetIconLocation(IShellLinkW* This,LPWSTR pszIconPath,int cch,int *piIcon) {
    return This->lpVtbl->GetIconLocation(This,pszIconPath,cch,piIcon);
}
static inline HRESULT IShellLinkW_SetIconLocation(IShellLinkW* This,LPCWSTR pszIconPath,int iIcon) {
    return This->lpVtbl->SetIconLocation(This,pszIconPath,iIcon);
}
static inline HRESULT IShellLinkW_SetRelativePath(IShellLinkW* This,LPCWSTR pszPathRel,DWORD dwReserved) {
    return This->lpVtbl->SetRelativePath(This,pszPathRel,dwReserved);
}
static inline HRESULT IShellLinkW_Resolve(IShellLinkW* This,HWND hwnd,DWORD fFlags) {
    return This->lpVtbl->Resolve(This,hwnd,fFlags);
}
static inline 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 inline HRESULT IShellLinkDataList_QueryInterface(IShellLinkDataList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellLinkDataList_AddRef(IShellLinkDataList* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellLinkDataList_Release(IShellLinkDataList* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellLinkDataList methods ***/
static inline HRESULT IShellLinkDataList_AddDataBlock(IShellLinkDataList* This,void *pDataBlock) {
    return This->lpVtbl->AddDataBlock(This,pDataBlock);
}
static inline HRESULT IShellLinkDataList_CopyDataBlock(IShellLinkDataList* This,DWORD dwSig,void **ppDataBlock) {
    return This->lpVtbl->CopyDataBlock(This,dwSig,ppDataBlock);
}
static inline HRESULT IShellLinkDataList_RemoveDataBlock(IShellLinkDataList* This,DWORD dwSig) {
    return This->lpVtbl->RemoveDataBlock(This,dwSig);
}
static inline HRESULT IShellLinkDataList_GetFlags(IShellLinkDataList* This,DWORD *pdwFlags) {
    return This->lpVtbl->GetFlags(This,pdwFlags);
}
static inline 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 inline HRESULT IResolveShellLink_QueryInterface(IResolveShellLink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IResolveShellLink_AddRef(IResolveShellLink* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IResolveShellLink_Release(IResolveShellLink* This) {
    return This->lpVtbl->Release(This);
}
/*** IResolveShellLink methods ***/
static inline 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 inline HRESULT IActionProgressDialog_QueryInterface(IActionProgressDialog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActionProgressDialog_AddRef(IActionProgressDialog* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActionProgressDialog_Release(IActionProgressDialog* This) {
    return This->lpVtbl->Release(This);
}
/*** IActionProgressDialog methods ***/
static inline HRESULT IActionProgressDialog_Initialize(IActionProgressDialog* This,SPINITF flags,LPCWSTR pszTitle,LPCWSTR pszCancel) {
    return This->lpVtbl->Initialize(This,flags,pszTitle,pszCancel);
}
static inline 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 inline HRESULT IHWEventHandler_QueryInterface(IHWEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IHWEventHandler_AddRef(IHWEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IHWEventHandler_Release(IHWEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IHWEventHandler methods ***/
static inline HRESULT IHWEventHandler_Initialize(IHWEventHandler* This,LPCWSTR pszParams) {
    return This->lpVtbl->Initialize(This,pszParams);
}
static inline HRESULT IHWEventHandler_HandleEvent(IHWEventHandler* This,LPCWSTR pszDeviceID,LPCWSTR pszAltDeviceID,LPCWSTR pszEventType) {
    return This->lpVtbl->HandleEvent(This,pszDeviceID,pszAltDeviceID,pszEventType);
}
static inline 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 inline HRESULT IHWEventHandler2_QueryInterface(IHWEventHandler2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IHWEventHandler2_AddRef(IHWEventHandler2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IHWEventHandler2_Release(IHWEventHandler2* This) {
    return This->lpVtbl->Release(This);
}
/*** IHWEventHandler methods ***/
static inline HRESULT IHWEventHandler2_Initialize(IHWEventHandler2* This,LPCWSTR pszParams) {
    return This->lpVtbl->Initialize(This,pszParams);
}
static inline HRESULT IHWEventHandler2_HandleEvent(IHWEventHandler2* This,LPCWSTR pszDeviceID,LPCWSTR pszAltDeviceID,LPCWSTR pszEventType) {
    return This->lpVtbl->HandleEvent(This,pszDeviceID,pszAltDeviceID,pszEventType);
}
static inline 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 inline 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 inline HRESULT IQueryCancelAutoPlay_QueryInterface(IQueryCancelAutoPlay* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IQueryCancelAutoPlay_AddRef(IQueryCancelAutoPlay* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IQueryCancelAutoPlay_Release(IQueryCancelAutoPlay* This) {
    return This->lpVtbl->Release(This);
}
/*** IQueryCancelAutoPlay methods ***/
static inline 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 inline HRESULT IDynamicHWHandler_QueryInterface(IDynamicHWHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDynamicHWHandler_AddRef(IDynamicHWHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDynamicHWHandler_Release(IDynamicHWHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDynamicHWHandler methods ***/
static inline 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 inline HRESULT IActionProgress_QueryInterface(IActionProgress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IActionProgress_AddRef(IActionProgress* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IActionProgress_Release(IActionProgress* This) {
    return This->lpVtbl->Release(This);
}
/*** IActionProgress methods ***/
static inline HRESULT IActionProgress_Begin(IActionProgress* This,SPACTION action,SPBEGINF flags) {
    return This->lpVtbl->Begin(This,action,flags);
}
static inline HRESULT IActionProgress_UpdateProgress(IActionProgress* This,ULONGLONG ulCompleted,ULONGLONG ulTotal) {
    return This->lpVtbl->UpdateProgress(This,ulCompleted,ulTotal);
}
static inline HRESULT IActionProgress_UpdateText(IActionProgress* This,SPTEXT sptext,LPCWSTR pszText,WINBOOL fMayCompact) {
    return This->lpVtbl->UpdateText(This,sptext,pszText,fMayCompact);
}
static inline HRESULT IActionProgress_QueryCancel(IActionProgress* This,WINBOOL *pfCancelled) {
    return This->lpVtbl->QueryCancel(This,pfCancelled);
}
static inline HRESULT IActionProgress_ResetCancel(IActionProgress* This) {
    return This->lpVtbl->ResetCancel(This);
}
static inline 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 inline HRESULT IShellExtInit_QueryInterface(IShellExtInit* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellExtInit_AddRef(IShellExtInit* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellExtInit_Release(IShellExtInit* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellExtInit methods ***/
static inline 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 inline HRESULT IShellPropSheetExt_QueryInterface(IShellPropSheetExt* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellPropSheetExt_AddRef(IShellPropSheetExt* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellPropSheetExt_Release(IShellPropSheetExt* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellPropSheetExt methods ***/
static inline HRESULT IShellPropSheetExt_AddPages(IShellPropSheetExt* This,LPFNSVADDPROPSHEETPAGE pfnAddPage,LPARAM lParam) {
    return This->lpVtbl->AddPages(This,pfnAddPage,lParam);
}
static inline 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 inline HRESULT IRemoteComputer_QueryInterface(IRemoteComputer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IRemoteComputer_AddRef(IRemoteComputer* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IRemoteComputer_Release(IRemoteComputer* This) {
    return This->lpVtbl->Release(This);
}
/*** IRemoteComputer methods ***/
static inline 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 inline HRESULT IQueryContinue_QueryInterface(IQueryContinue* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IQueryContinue_AddRef(IQueryContinue* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IQueryContinue_Release(IQueryContinue* This) {
    return This->lpVtbl->Release(This);
}
/*** IQueryContinue methods ***/
static inline 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 inline HRESULT IObjectWithCancelEvent_QueryInterface(IObjectWithCancelEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IObjectWithCancelEvent_AddRef(IObjectWithCancelEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IObjectWithCancelEvent_Release(IObjectWithCancelEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectWithCancelEvent methods ***/
static inline 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 inline HRESULT IUserNotification_QueryInterface(IUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUserNotification_AddRef(IUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUserNotification_Release(IUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IUserNotification methods ***/
static inline HRESULT IUserNotification_SetBalloonInfo(IUserNotification* This,LPCWSTR pszTitle,LPCWSTR pszText,DWORD dwInfoFlags) {
    return This->lpVtbl->SetBalloonInfo(This,pszTitle,pszText,dwInfoFlags);
}
static inline HRESULT IUserNotification_SetBalloonRetry(IUserNotification* This,DWORD dwShowTime,DWORD dwInterval,UINT cRetryCount) {
    return This->lpVtbl->SetBalloonRetry(This,dwShowTime,dwInterval,cRetryCount);
}
static inline HRESULT IUserNotification_SetIconInfo(IUserNotification* This,HICON hIcon,LPCWSTR pszToolTip) {
    return This->lpVtbl->SetIconInfo(This,hIcon,pszToolTip);
}
static inline HRESULT IUserNotification_Show(IUserNotification* This,IQueryContinue *pqc,DWORD dwContinuePollInterval) {
    return This->lpVtbl->Show(This,pqc,dwContinuePollInterval);
}
static inline 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 inline HRESULT IUserNotificationCallback_QueryInterface(IUserNotificationCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUserNotificationCallback_AddRef(IUserNotificationCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUserNotificationCallback_Release(IUserNotificationCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IUserNotificationCallback methods ***/
static inline HRESULT IUserNotificationCallback_OnBalloonUserClick(IUserNotificationCallback* This,POINT *pt) {
    return This->lpVtbl->OnBalloonUserClick(This,pt);
}
static inline HRESULT IUserNotificationCallback_OnLeftClick(IUserNotificationCallback* This,POINT *pt) {
    return This->lpVtbl->OnLeftClick(This,pt);
}
static inline 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 inline HRESULT IUserNotification2_QueryInterface(IUserNotification2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUserNotification2_AddRef(IUserNotification2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUserNotification2_Release(IUserNotification2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUserNotification2 methods ***/
static inline HRESULT IUserNotification2_SetBalloonInfo(IUserNotification2* This,LPCWSTR pszTitle,LPCWSTR pszText,DWORD dwInfoFlags) {
    return This->lpVtbl->SetBalloonInfo(This,pszTitle,pszText,dwInfoFlags);
}
static inline HRESULT IUserNotification2_SetBalloonRetry(IUserNotification2* This,DWORD dwShowTime,DWORD dwInterval,UINT cRetryCount) {
    return This->lpVtbl->SetBalloonRetry(This,dwShowTime,dwInterval,cRetryCount);
}
static inline HRESULT IUserNotification2_SetIconInfo(IUserNotification2* This,HICON hIcon,LPCWSTR pszToolTip) {
    return This->lpVtbl->SetIconInfo(This,hIcon,pszToolTip);
}
static inline HRESULT IUserNotification2_Show(IUserNotification2* This,IQueryContinue *pqc,DWORD dwContinuePollInterval,IUserNotificationCallback *pSink) {
    return This->lpVtbl->Show(This,pqc,dwContinuePollInterval,pSink);
}
static inline 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 inline HRESULT IItemNameLimits_QueryInterface(IItemNameLimits* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IItemNameLimits_AddRef(IItemNameLimits* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IItemNameLimits_Release(IItemNameLimits* This) {
    return This->lpVtbl->Release(This);
}
/*** IItemNameLimits methods ***/
static inline HRESULT IItemNameLimits_GetValidCharacters(IItemNameLimits* This,LPWSTR *ppwszValidChars,LPWSTR *ppwszInvalidChars) {
    return This->lpVtbl->GetValidCharacters(This,ppwszValidChars,ppwszInvalidChars);
}
static inline 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 inline HRESULT ISearchFolderItemFactory_QueryInterface(ISearchFolderItemFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISearchFolderItemFactory_AddRef(ISearchFolderItemFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISearchFolderItemFactory_Release(ISearchFolderItemFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** ISearchFolderItemFactory methods ***/
static inline HRESULT ISearchFolderItemFactory_SetDisplayName(ISearchFolderItemFactory* This,LPCWSTR pszDisplayName) {
    return This->lpVtbl->SetDisplayName(This,pszDisplayName);
}
static inline HRESULT ISearchFolderItemFactory_SetFolderTypeID(ISearchFolderItemFactory* This,FOLDERTYPEID ftid) {
    return This->lpVtbl->SetFolderTypeID(This,ftid);
}
static inline HRESULT ISearchFolderItemFactory_SetFolderLogicalViewMode(ISearchFolderItemFactory* This,FOLDERLOGICALVIEWMODE flvm) {
    return This->lpVtbl->SetFolderLogicalViewMode(This,flvm);
}
static inline HRESULT ISearchFolderItemFactory_SetIconSize(ISearchFolderItemFactory* This,int iIconSize) {
    return This->lpVtbl->SetIconSize(This,iIconSize);
}
static inline HRESULT ISearchFolderItemFactory_SetVisibleColumns(ISearchFolderItemFactory* This,UINT cVisibleColumns,PROPERTYKEY *rgKey) {
    return This->lpVtbl->SetVisibleColumns(This,cVisibleColumns,rgKey);
}
static inline HRESULT ISearchFolderItemFactory_SetSortColumns(ISearchFolderItemFactory* This,UINT cSortColumns,SORTCOLUMN *rgSortColumns) {
    return This->lpVtbl->SetSortColumns(This,cSortColumns,rgSortColumns);
}
static inline HRESULT ISearchFolderItemFactory_SetGroupColumn(ISearchFolderItemFactory* This,REFPROPERTYKEY keyGroup) {
    return This->lpVtbl->SetGroupColumn(This,keyGroup);
}
static inline HRESULT ISearchFolderItemFactory_SetStacks(ISearchFolderItemFactory* This,UINT cStackKeys,PROPERTYKEY *rgStackKeys) {
    return This->lpVtbl->SetStacks(This,cStackKeys,rgStackKeys);
}
static inline HRESULT ISearchFolderItemFactory_SetScope(ISearchFolderItemFactory* This,IShellItemArray *psiaScope) {
    return This->lpVtbl->SetScope(This,psiaScope);
}
static inline HRESULT ISearchFolderItemFactory_SetCondition(ISearchFolderItemFactory* This,ICondition *pCondition) {
    return This->lpVtbl->SetCondition(This,pCondition);
}
static inline HRESULT ISearchFolderItemFactory_GetShellItem(ISearchFolderItemFactory* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetShellItem(This,riid,ppv);
}
static inline 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 inline HRESULT IExtractImage_QueryInterface(IExtractImage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IExtractImage_AddRef(IExtractImage* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IExtractImage_Release(IExtractImage* This) {
    return This->lpVtbl->Release(This);
}
/*** IExtractImage methods ***/
static inline 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 inline 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 inline HRESULT IExtractImage2_QueryInterface(IExtractImage2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IExtractImage2_AddRef(IExtractImage2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IExtractImage2_Release(IExtractImage2* This) {
    return This->lpVtbl->Release(This);
}
/*** IExtractImage methods ***/
static inline 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 inline HRESULT IExtractImage2_Extract(IExtractImage2* This,HBITMAP *phBmpThumbnail) {
    return This->lpVtbl->Extract(This,phBmpThumbnail);
}
/*** IExtractImage2 methods ***/
static inline 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 inline HRESULT IThumbnailHandlerFactory_QueryInterface(IThumbnailHandlerFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IThumbnailHandlerFactory_AddRef(IThumbnailHandlerFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IThumbnailHandlerFactory_Release(IThumbnailHandlerFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IThumbnailHandlerFactory methods ***/
static inline 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 inline HRESULT IParentAndItem_QueryInterface(IParentAndItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IParentAndItem_AddRef(IParentAndItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IParentAndItem_Release(IParentAndItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IParentAndItem methods ***/
static inline HRESULT IParentAndItem_SetParentAndItem(IParentAndItem* This,PCIDLIST_ABSOLUTE pidlParent,IShellFolder *psf,PCUITEMID_CHILD pidlChild) {
    return This->lpVtbl->SetParentAndItem(This,pidlParent,psf,pidlChild);
}
static inline 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 inline HRESULT IDockingWindow_QueryInterface(IDockingWindow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDockingWindow_AddRef(IDockingWindow* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDockingWindow_Release(IDockingWindow* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static inline HRESULT IDockingWindow_GetWindow(IDockingWindow* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static inline HRESULT IDockingWindow_ContextSensitiveHelp(IDockingWindow* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IDockingWindow methods ***/
static inline HRESULT IDockingWindow_ShowDW(IDockingWindow* This,WINBOOL fShow) {
    return This->lpVtbl->ShowDW(This,fShow);
}
static inline HRESULT IDockingWindow_CloseDW(IDockingWindow* This,DWORD dwReserved) {
    return This->lpVtbl->CloseDW(This,dwReserved);
}
static inline 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 inline HRESULT IDeskBand_QueryInterface(IDeskBand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDeskBand_AddRef(IDeskBand* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDeskBand_Release(IDeskBand* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static inline HRESULT IDeskBand_GetWindow(IDeskBand* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static inline HRESULT IDeskBand_ContextSensitiveHelp(IDeskBand* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IDockingWindow methods ***/
static inline HRESULT IDeskBand_ShowDW(IDeskBand* This,WINBOOL fShow) {
    return This->lpVtbl->ShowDW(This,fShow);
}
static inline HRESULT IDeskBand_CloseDW(IDeskBand* This,DWORD dwReserved) {
    return This->lpVtbl->CloseDW(This,dwReserved);
}
static inline HRESULT IDeskBand_ResizeBorderDW(IDeskBand* This,LPCRECT prcBorder,IUnknown *punkToolbarSite,WINBOOL fReserved) {
    return This->lpVtbl->ResizeBorderDW(This,prcBorder,punkToolbarSite,fReserved);
}
/*** IDeskBand methods ***/
static inline 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 inline HRESULT IDeskBandInfo_QueryInterface(IDeskBandInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDeskBandInfo_AddRef(IDeskBandInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDeskBandInfo_Release(IDeskBandInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDeskBandInfo methods ***/
static inline 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 inline HRESULT IDeskBand2_QueryInterface(IDeskBand2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDeskBand2_AddRef(IDeskBand2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDeskBand2_Release(IDeskBand2* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static inline HRESULT IDeskBand2_GetWindow(IDeskBand2* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static inline HRESULT IDeskBand2_ContextSensitiveHelp(IDeskBand2* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IDockingWindow methods ***/
static inline HRESULT IDeskBand2_ShowDW(IDeskBand2* This,WINBOOL fShow) {
    return This->lpVtbl->ShowDW(This,fShow);
}
static inline HRESULT IDeskBand2_CloseDW(IDeskBand2* This,DWORD dwReserved) {
    return This->lpVtbl->CloseDW(This,dwReserved);
}
static inline HRESULT IDeskBand2_ResizeBorderDW(IDeskBand2* This,LPCRECT prcBorder,IUnknown *punkToolbarSite,WINBOOL fReserved) {
    return This->lpVtbl->ResizeBorderDW(This,prcBorder,punkToolbarSite,fReserved);
}
/*** IDeskBand methods ***/
static inline HRESULT IDeskBand2_GetBandInfo(IDeskBand2* This,DWORD dwBandID,DWORD dwViewMode,DESKBANDINFO *pdbi) {
    return This->lpVtbl->GetBandInfo(This,dwBandID,dwViewMode,pdbi);
}
/*** IDeskBand2 methods ***/
static inline HRESULT IDeskBand2_CanRenderComposited(IDeskBand2* This,WINBOOL *pfCanRenderComposited) {
    return This->lpVtbl->CanRenderComposited(This,pfCanRenderComposited);
}
static inline HRESULT IDeskBand2_SetCompositionState(IDeskBand2* This,WINBOOL fCompositionEnabled) {
    return This->lpVtbl->SetCompositionState(This,fCompositionEnabled);
}
static inline 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 inline HRESULT ITaskbarList_QueryInterface(ITaskbarList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITaskbarList_AddRef(ITaskbarList* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITaskbarList_Release(ITaskbarList* This) {
    return This->lpVtbl->Release(This);
}
/*** ITaskbarList methods ***/
static inline HRESULT ITaskbarList_HrInit(ITaskbarList* This) {
    return This->lpVtbl->HrInit(This);
}
static inline HRESULT ITaskbarList_AddTab(ITaskbarList* This,HWND hwnd) {
    return This->lpVtbl->AddTab(This,hwnd);
}
static inline HRESULT ITaskbarList_DeleteTab(ITaskbarList* This,HWND hwnd) {
    return This->lpVtbl->DeleteTab(This,hwnd);
}
static inline HRESULT ITaskbarList_ActivateTab(ITaskbarList* This,HWND hwnd) {
    return This->lpVtbl->ActivateTab(This,hwnd);
}
static inline 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 inline HRESULT ITaskbarList2_QueryInterface(ITaskbarList2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITaskbarList2_AddRef(ITaskbarList2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITaskbarList2_Release(ITaskbarList2* This) {
    return This->lpVtbl->Release(This);
}
/*** ITaskbarList methods ***/
static inline HRESULT ITaskbarList2_HrInit(ITaskbarList2* This) {
    return This->lpVtbl->HrInit(This);
}
static inline HRESULT ITaskbarList2_AddTab(ITaskbarList2* This,HWND hwnd) {
    return This->lpVtbl->AddTab(This,hwnd);
}
static inline HRESULT ITaskbarList2_DeleteTab(ITaskbarList2* This,HWND hwnd) {
    return This->lpVtbl->DeleteTab(This,hwnd);
}
static inline HRESULT ITaskbarList2_ActivateTab(ITaskbarList2* This,HWND hwnd) {
    return This->lpVtbl->ActivateTab(This,hwnd);
}
static inline HRESULT ITaskbarList2_SetActiveAlt(ITaskbarList2* This,HWND hwnd) {
    return This->lpVtbl->SetActiveAlt(This,hwnd);
}
/*** ITaskbarList2 methods ***/
static inline 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 inline HRESULT ITaskbarList3_QueryInterface(ITaskbarList3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITaskbarList3_AddRef(ITaskbarList3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITaskbarList3_Release(ITaskbarList3* This) {
    return This->lpVtbl->Release(This);
}
/*** ITaskbarList methods ***/
static inline HRESULT ITaskbarList3_HrInit(ITaskbarList3* This) {
    return This->lpVtbl->HrInit(This);
}
static inline HRESULT ITaskbarList3_AddTab(ITaskbarList3* This,HWND hwnd) {
    return This->lpVtbl->AddTab(This,hwnd);
}
static inline HRESULT ITaskbarList3_DeleteTab(ITaskbarList3* This,HWND hwnd) {
    return This->lpVtbl->DeleteTab(This,hwnd);
}
static inline HRESULT ITaskbarList3_ActivateTab(ITaskbarList3* This,HWND hwnd) {
    return This->lpVtbl->ActivateTab(This,hwnd);
}
static inline HRESULT ITaskbarList3_SetActiveAlt(ITaskbarList3* This,HWND hwnd) {
    return This->lpVtbl->SetActiveAlt(This,hwnd);
}
/*** ITaskbarList2 methods ***/
static inline HRESULT ITaskbarList3_MarkFullscreenWindow(ITaskbarList3* This,HWND hwnd,WINBOOL fFullscreen) {
    return This->lpVtbl->MarkFullscreenWindow(This,hwnd,fFullscreen);
}
/*** ITaskbarList3 methods ***/
static inline HRESULT ITaskbarList3_SetProgressValue(ITaskbarList3* This,HWND hwnd,ULONGLONG ullCompleted,ULONGLONG ullTotal) {
    return This->lpVtbl->SetProgressValue(This,hwnd,ullCompleted,ullTotal);
}
static inline HRESULT ITaskbarList3_SetProgressState(ITaskbarList3* This,HWND hwnd,TBPFLAG tbpFlags) {
    return This->lpVtbl->SetProgressState(This,hwnd,tbpFlags);
}
static inline HRESULT ITaskbarList3_RegisterTab(ITaskbarList3* This,HWND hwndTab,HWND hwndMDI) {
    return This->lpVtbl->RegisterTab(This,hwndTab,hwndMDI);
}
static inline HRESULT ITaskbarList3_UnregisterTab(ITaskbarList3* This,HWND hwndTab) {
    return This->lpVtbl->UnregisterTab(This,hwndTab);
}
static inline HRESULT ITaskbarList3_SetTabOrder(ITaskbarList3* This,HWND hwndTab,HWND hwndInsertBefore) {
    return This->lpVtbl->SetTabOrder(This,hwndTab,hwndInsertBefore);
}
static inline HRESULT ITaskbarList3_SetTabActive(ITaskbarList3* This,HWND hwndTab,HWND hwndMDI,DWORD dwReserved) {
    return This->lpVtbl->SetTabActive(This,hwndTab,hwndMDI,dwReserved);
}
static inline HRESULT ITaskbarList3_ThumbBarAddButtons(ITaskbarList3* This,HWND hwnd,UINT cButtons,LPTHUMBBUTTON pButton) {
    return This->lpVtbl->ThumbBarAddButtons(This,hwnd,cButtons,pButton);
}
static inline HRESULT ITaskbarList3_ThumbBarUpdateButtons(ITaskbarList3* This,HWND hwnd,UINT cButtons,LPTHUMBBUTTON pButton) {
    return This->lpVtbl->ThumbBarUpdateButtons(This,hwnd,cButtons,pButton);
}
static inline HRESULT ITaskbarList3_ThumbBarSetImageList(ITaskbarList3* This,HWND hwnd,HIMAGELIST himl) {
    return This->lpVtbl->ThumbBarSetImageList(This,hwnd,himl);
}
static inline HRESULT ITaskbarList3_SetOverlayIcon(ITaskbarList3* This,HWND hwnd,HICON hIcon,LPCWSTR pszDescription) {
    return This->lpVtbl->SetOverlayIcon(This,hwnd,hIcon,pszDescription);
}
static inline HRESULT ITaskbarList3_SetThumbnailTooltip(ITaskbarList3* This,HWND hwnd,LPCWSTR pszTip) {
    return This->lpVtbl->SetThumbnailTooltip(This,hwnd,pszTip);
}
static inline 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 inline HRESULT ITaskbarList4_QueryInterface(ITaskbarList4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITaskbarList4_AddRef(ITaskbarList4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITaskbarList4_Release(ITaskbarList4* This) {
    return This->lpVtbl->Release(This);
}
/*** ITaskbarList methods ***/
static inline HRESULT ITaskbarList4_HrInit(ITaskbarList4* This) {
    return This->lpVtbl->HrInit(This);
}
static inline HRESULT ITaskbarList4_AddTab(ITaskbarList4* This,HWND hwnd) {
    return This->lpVtbl->AddTab(This,hwnd);
}
static inline HRESULT ITaskbarList4_DeleteTab(ITaskbarList4* This,HWND hwnd) {
    return This->lpVtbl->DeleteTab(This,hwnd);
}
static inline HRESULT ITaskbarList4_ActivateTab(ITaskbarList4* This,HWND hwnd) {
    return This->lpVtbl->ActivateTab(This,hwnd);
}
static inline HRESULT ITaskbarList4_SetActiveAlt(ITaskbarList4* This,HWND hwnd) {
    return This->lpVtbl->SetActiveAlt(This,hwnd);
}
/*** ITaskbarList2 methods ***/
static inline HRESULT ITaskbarList4_MarkFullscreenWindow(ITaskbarList4* This,HWND hwnd,WINBOOL fFullscreen) {
    return This->lpVtbl->MarkFullscreenWindow(This,hwnd,fFullscreen);
}
/*** ITaskbarList3 methods ***/
static inline HRESULT ITaskbarList4_SetProgressValue(ITaskbarList4* This,HWND hwnd,ULONGLONG ullCompleted,ULONGLONG ullTotal) {
    return This->lpVtbl->SetProgressValue(This,hwnd,ullCompleted,ullTotal);
}
static inline HRESULT ITaskbarList4_SetProgressState(ITaskbarList4* This,HWND hwnd,TBPFLAG tbpFlags) {
    return This->lpVtbl->SetProgressState(This,hwnd,tbpFlags);
}
static inline HRESULT ITaskbarList4_RegisterTab(ITaskbarList4* This,HWND hwndTab,HWND hwndMDI) {
    return This->lpVtbl->RegisterTab(This,hwndTab,hwndMDI);
}
static inline HRESULT ITaskbarList4_UnregisterTab(ITaskbarList4* This,HWND hwndTab) {
    return This->lpVtbl->UnregisterTab(This,hwndTab);
}
static inline HRESULT ITaskbarList4_SetTabOrder(ITaskbarList4* This,HWND hwndTab,HWND hwndInsertBefore) {
    return This->lpVtbl->SetTabOrder(This,hwndTab,hwndInsertBefore);
}
static inline HRESULT ITaskbarList4_SetTabActive(ITaskbarList4* This,HWND hwndTab,HWND hwndMDI,DWORD dwReserved) {
    return This->lpVtbl->SetTabActive(This,hwndTab,hwndMDI,dwReserved);
}
static inline HRESULT ITaskbarList4_ThumbBarAddButtons(ITaskbarList4* This,HWND hwnd,UINT cButtons,LPTHUMBBUTTON pButton) {
    return This->lpVtbl->ThumbBarAddButtons(This,hwnd,cButtons,pButton);
}
static inline HRESULT ITaskbarList4_ThumbBarUpdateButtons(ITaskbarList4* This,HWND hwnd,UINT cButtons,LPTHUMBBUTTON pButton) {
    return This->lpVtbl->ThumbBarUpdateButtons(This,hwnd,cButtons,pButton);
}
static inline HRESULT ITaskbarList4_ThumbBarSetImageList(ITaskbarList4* This,HWND hwnd,HIMAGELIST himl) {
    return This->lpVtbl->ThumbBarSetImageList(This,hwnd,himl);
}
static inline HRESULT ITaskbarList4_SetOverlayIcon(ITaskbarList4* This,HWND hwnd,HICON hIcon,LPCWSTR pszDescription) {
    return This->lpVtbl->SetOverlayIcon(This,hwnd,hIcon,pszDescription);
}
static inline HRESULT ITaskbarList4_SetThumbnailTooltip(ITaskbarList4* This,HWND hwnd,LPCWSTR pszTip) {
    return This->lpVtbl->SetThumbnailTooltip(This,hwnd,pszTip);
}
static inline HRESULT ITaskbarList4_SetThumbnailClip(ITaskbarList4* This,HWND hwnd,RECT *prcClip) {
    return This->lpVtbl->SetThumbnailClip(This,hwnd,prcClip);
}
/*** ITaskbarList4 methods ***/
static inline 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 inline HRESULT IStartMenuPinnedList_QueryInterface(IStartMenuPinnedList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IStartMenuPinnedList_AddRef(IStartMenuPinnedList* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IStartMenuPinnedList_Release(IStartMenuPinnedList* This) {
    return This->lpVtbl->Release(This);
}
/*** IStartMenuPinnedList methods ***/
static inline 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 inline HRESULT ICDBurn_QueryInterface(ICDBurn* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICDBurn_AddRef(ICDBurn* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICDBurn_Release(ICDBurn* This) {
    return This->lpVtbl->Release(This);
}
/*** ICDBurn methods ***/
static inline HRESULT ICDBurn_GetRecorderDriveLetter(ICDBurn* This,LPWSTR pszDrive,UINT cch) {
    return This->lpVtbl->GetRecorderDriveLetter(This,pszDrive,cch);
}
static inline HRESULT ICDBurn_Burn(ICDBurn* This,HWND hwnd) {
    return This->lpVtbl->Burn(This,hwnd);
}
static inline 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 inline HRESULT IWizardSite_QueryInterface(IWizardSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWizardSite_AddRef(IWizardSite* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWizardSite_Release(IWizardSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IWizardSite methods ***/
static inline HRESULT IWizardSite_GetPreviousPage(IWizardSite* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetPreviousPage(This,phpage);
}
static inline HRESULT IWizardSite_GetNextPage(IWizardSite* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetNextPage(This,phpage);
}
static inline 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 inline HRESULT IWizardExtension_QueryInterface(IWizardExtension* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWizardExtension_AddRef(IWizardExtension* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWizardExtension_Release(IWizardExtension* This) {
    return This->lpVtbl->Release(This);
}
/*** IWizardExtension methods ***/
static inline HRESULT IWizardExtension_AddPages(IWizardExtension* This,HPROPSHEETPAGE *aPages,UINT cPages,UINT *pnPagesAdded) {
    return This->lpVtbl->AddPages(This,aPages,cPages,pnPagesAdded);
}
static inline HRESULT IWizardExtension_GetFirstPage(IWizardExtension* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetFirstPage(This,phpage);
}
static inline 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 inline HRESULT IWebWizardExtension_QueryInterface(IWebWizardExtension* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWebWizardExtension_AddRef(IWebWizardExtension* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWebWizardExtension_Release(IWebWizardExtension* This) {
    return This->lpVtbl->Release(This);
}
/*** IWizardExtension methods ***/
static inline HRESULT IWebWizardExtension_AddPages(IWebWizardExtension* This,HPROPSHEETPAGE *aPages,UINT cPages,UINT *pnPagesAdded) {
    return This->lpVtbl->AddPages(This,aPages,cPages,pnPagesAdded);
}
static inline HRESULT IWebWizardExtension_GetFirstPage(IWebWizardExtension* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetFirstPage(This,phpage);
}
static inline HRESULT IWebWizardExtension_GetLastPage(IWebWizardExtension* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetLastPage(This,phpage);
}
/*** IWebWizardExtension methods ***/
static inline HRESULT IWebWizardExtension_SetInitialURL(IWebWizardExtension* This,LPCWSTR pszURL) {
    return This->lpVtbl->SetInitialURL(This,pszURL);
}
static inline 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 inline HRESULT IPublishingWizard_QueryInterface(IPublishingWizard* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPublishingWizard_AddRef(IPublishingWizard* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPublishingWizard_Release(IPublishingWizard* This) {
    return This->lpVtbl->Release(This);
}
/*** IWizardExtension methods ***/
static inline HRESULT IPublishingWizard_AddPages(IPublishingWizard* This,HPROPSHEETPAGE *aPages,UINT cPages,UINT *pnPagesAdded) {
    return This->lpVtbl->AddPages(This,aPages,cPages,pnPagesAdded);
}
static inline HRESULT IPublishingWizard_GetFirstPage(IPublishingWizard* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetFirstPage(This,phpage);
}
static inline HRESULT IPublishingWizard_GetLastPage(IPublishingWizard* This,HPROPSHEETPAGE *phpage) {
    return This->lpVtbl->GetLastPage(This,phpage);
}
/*** IPublishingWizard methods ***/
static inline HRESULT IPublishingWizard_Initialize(IPublishingWizard* This,IDataObject *pdo,DWORD dwOptions,LPCWSTR pszServiceScope) {
    return This->lpVtbl->Initialize(This,pdo,dwOptions,pszServiceScope);
}
static inline 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 inline HRESULT IFolderViewHost_QueryInterface(IFolderViewHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFolderViewHost_AddRef(IFolderViewHost* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFolderViewHost_Release(IFolderViewHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderViewHost methods ***/
static inline 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 inline HRESULT IExplorerBrowserEvents_QueryInterface(IExplorerBrowserEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IExplorerBrowserEvents_AddRef(IExplorerBrowserEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IExplorerBrowserEvents_Release(IExplorerBrowserEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IExplorerBrowserEvents methods ***/
static inline HRESULT IExplorerBrowserEvents_OnNavigationPending(IExplorerBrowserEvents* This,PCIDLIST_ABSOLUTE pidlFolder) {
    return This->lpVtbl->OnNavigationPending(This,pidlFolder);
}
static inline HRESULT IExplorerBrowserEvents_OnViewCreated(IExplorerBrowserEvents* This,IShellView *psv) {
    return This->lpVtbl->OnViewCreated(This,psv);
}
static inline HRESULT IExplorerBrowserEvents_OnNavigationComplete(IExplorerBrowserEvents* This,PCIDLIST_ABSOLUTE pidlFolder) {
    return This->lpVtbl->OnNavigationComplete(This,pidlFolder);
}
static inline 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 inline HRESULT IExplorerBrowser_QueryInterface(IExplorerBrowser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IExplorerBrowser_AddRef(IExplorerBrowser* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IExplorerBrowser_Release(IExplorerBrowser* This) {
    return This->lpVtbl->Release(This);
}
/*** IExplorerBrowser methods ***/
static inline HRESULT IExplorerBrowser_Initialize(IExplorerBrowser* This,HWND hwndParent,const RECT *prc,const FOLDERSETTINGS *pfs) {
    return This->lpVtbl->Initialize(This,hwndParent,prc,pfs);
}
static inline HRESULT IExplorerBrowser_Destroy(IExplorerBrowser* This) {
    return This->lpVtbl->Destroy(This);
}
static inline HRESULT IExplorerBrowser_SetRect(IExplorerBrowser* This,HDWP *phdwp,RECT rcBrowser) {
    return This->lpVtbl->SetRect(This,phdwp,rcBrowser);
}
static inline HRESULT IExplorerBrowser_SetPropertyBag(IExplorerBrowser* This,LPCWSTR pszPropertyBag) {
    return This->lpVtbl->SetPropertyBag(This,pszPropertyBag);
}
static inline HRESULT IExplorerBrowser_SetEmptyText(IExplorerBrowser* This,LPCWSTR pszEmptyText) {
    return This->lpVtbl->SetEmptyText(This,pszEmptyText);
}
static inline HRESULT IExplorerBrowser_SetFolderSettings(IExplorerBrowser* This,const FOLDERSETTINGS *pfs) {
    return This->lpVtbl->SetFolderSettings(This,pfs);
}
static inline HRESULT IExplorerBrowser_Advise(IExplorerBrowser* This,IExplorerBrowserEvents *psbe,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,psbe,pdwCookie);
}
static inline HRESULT IExplorerBrowser_Unadvise(IExplorerBrowser* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static inline HRESULT IExplorerBrowser_SetOptions(IExplorerBrowser* This,EXPLORER_BROWSER_OPTIONS dwFlag) {
    return This->lpVtbl->SetOptions(This,dwFlag);
}
static inline HRESULT IExplorerBrowser_GetOptions(IExplorerBrowser* This,EXPLORER_BROWSER_OPTIONS *pdwFlag) {
    return This->lpVtbl->GetOptions(This,pdwFlag);
}
static inline HRESULT IExplorerBrowser_BrowseToIDList(IExplorerBrowser* This,PCUIDLIST_RELATIVE pidl,UINT uFlags) {
    return This->lpVtbl->BrowseToIDList(This,pidl,uFlags);
}
static inline HRESULT IExplorerBrowser_BrowseToObject(IExplorerBrowser* This,IUnknown *punk,UINT uFlags) {
    return This->lpVtbl->BrowseToObject(This,punk,uFlags);
}
static inline HRESULT IExplorerBrowser_FillFromObject(IExplorerBrowser* This,IUnknown *punk,EXPLORER_BROWSER_FILL_FLAGS dwFlags) {
    return This->lpVtbl->FillFromObject(This,punk,dwFlags);
}
static inline HRESULT IExplorerBrowser_RemoveAll(IExplorerBrowser* This) {
    return This->lpVtbl->RemoveAll(This);
}
static inline 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 inline HRESULT IAccessibleObject_QueryInterface(IAccessibleObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAccessibleObject_AddRef(IAccessibleObject* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAccessibleObject_Release(IAccessibleObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IAccessibleObject methods ***/
static inline 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 inline HRESULT IResultsFolder_QueryInterface(IResultsFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IResultsFolder_AddRef(IResultsFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IResultsFolder_Release(IResultsFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IResultsFolder methods ***/
static inline HRESULT IResultsFolder_AddItem(IResultsFolder* This,IShellItem *psi) {
    return This->lpVtbl->AddItem(This,psi);
}
static inline HRESULT IResultsFolder_AddIDList(IResultsFolder* This,PCIDLIST_ABSOLUTE pidl,PITEMID_CHILD *ppidlAdded) {
    return This->lpVtbl->AddIDList(This,pidl,ppidlAdded);
}
static inline HRESULT IResultsFolder_RemoveItem(IResultsFolder* This,IShellItem *psi) {
    return This->lpVtbl->RemoveItem(This,psi);
}
static inline HRESULT IResultsFolder_RemoveIDList(IResultsFolder* This,PCIDLIST_ABSOLUTE pidl) {
    return This->lpVtbl->RemoveIDList(This,pidl);
}
static inline 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 inline HRESULT IEnumObjects_QueryInterface(IEnumObjects* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IEnumObjects_AddRef(IEnumObjects* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IEnumObjects_Release(IEnumObjects* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumObjects methods ***/
static inline HRESULT IEnumObjects_Next(IEnumObjects* This,ULONG celt,REFIID riid,void **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,riid,rgelt,pceltFetched);
}
static inline HRESULT IEnumObjects_Skip(IEnumObjects* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static inline HRESULT IEnumObjects_Reset(IEnumObjects* This) {
    return This->lpVtbl->Reset(This);
}
static inline 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 inline HRESULT IOperationsProgressDialog_QueryInterface(IOperationsProgressDialog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IOperationsProgressDialog_AddRef(IOperationsProgressDialog* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IOperationsProgressDialog_Release(IOperationsProgressDialog* This) {
    return This->lpVtbl->Release(This);
}
/*** IOperationsProgressDialog methods ***/
static inline HRESULT IOperationsProgressDialog_StartProgressDialog(IOperationsProgressDialog* This,HWND hwndOwner,OPPROGDLGF flags) {
    return This->lpVtbl->StartProgressDialog(This,hwndOwner,flags);
}
static inline HRESULT IOperationsProgressDialog_StopProgressDialog(IOperationsProgressDialog* This) {
    return This->lpVtbl->StopProgressDialog(This);
}
static inline HRESULT IOperationsProgressDialog_SetOperation(IOperationsProgressDialog* This,SPACTION action) {
    return This->lpVtbl->SetOperation(This,action);
}
static inline HRESULT IOperationsProgressDialog_SetMode(IOperationsProgressDialog* This,PDMODE mode) {
    return This->lpVtbl->SetMode(This,mode);
}
static inline 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 inline HRESULT IOperationsProgressDialog_UpdateLocations(IOperationsProgressDialog* This,IShellItem *psiSource,IShellItem *psiTarget,IShellItem *psiItem) {
    return This->lpVtbl->UpdateLocations(This,psiSource,psiTarget,psiItem);
}
static inline HRESULT IOperationsProgressDialog_ResetTimer(IOperationsProgressDialog* This) {
    return This->lpVtbl->ResetTimer(This);
}
static inline HRESULT IOperationsProgressDialog_PauseTimer(IOperationsProgressDialog* This) {
    return This->lpVtbl->PauseTimer(This);
}
static inline HRESULT IOperationsProgressDialog_ResumeTimer(IOperationsProgressDialog* This) {
    return This->lpVtbl->ResumeTimer(This);
}
static inline HRESULT IOperationsProgressDialog_GetMilliseconds(IOperationsProgressDialog* This,ULONGLONG *pullElapsed,ULONGLONG *pullRemaining) {
    return This->lpVtbl->GetMilliseconds(This,pullElapsed,pullRemaining);
}
static inline 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 inline HRESULT IIOCancelInformation_QueryInterface(IIOCancelInformation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IIOCancelInformation_AddRef(IIOCancelInformation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IIOCancelInformation_Release(IIOCancelInformation* This) {
    return This->lpVtbl->Release(This);
}
/*** IIOCancelInformation methods ***/
static inline HRESULT IIOCancelInformation_SetCancelInformation(IIOCancelInformation* This,DWORD dwThreadID,UINT uMsgCancel) {
    return This->lpVtbl->SetCancelInformation(This,dwThreadID,uMsgCancel);
}
static inline 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 inline HRESULT IFileOperation_QueryInterface(IFileOperation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileOperation_AddRef(IFileOperation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileOperation_Release(IFileOperation* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileOperation methods ***/
static inline HRESULT IFileOperation_Advise(IFileOperation* This,IFileOperationProgressSink *pfops,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pfops,pdwCookie);
}
static inline HRESULT IFileOperation_Unadvise(IFileOperation* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static inline HRESULT IFileOperation_SetOperationFlags(IFileOperation* This,DWORD dwOperationFlags) {
    return This->lpVtbl->SetOperationFlags(This,dwOperationFlags);
}
static inline HRESULT IFileOperation_SetProgressMessage(IFileOperation* This,LPCWSTR pszMessage) {
    return This->lpVtbl->SetProgressMessage(This,pszMessage);
}
static inline HRESULT IFileOperation_SetProgressDialog(IFileOperation* This,IOperationsProgressDialog *popd) {
    return This->lpVtbl->SetProgressDialog(This,popd);
}
static inline HRESULT IFileOperation_SetProperties(IFileOperation* This,IPropertyChangeArray *pproparray) {
    return This->lpVtbl->SetProperties(This,pproparray);
}
static inline HRESULT IFileOperation_SetOwnerWindow(IFileOperation* This,HWND hwndOwner) {
    return This->lpVtbl->SetOwnerWindow(This,hwndOwner);
}
static inline HRESULT IFileOperation_ApplyPropertiesToItem(IFileOperation* This,IShellItem *psiItem) {
    return This->lpVtbl->ApplyPropertiesToItem(This,psiItem);
}
static inline HRESULT IFileOperation_ApplyPropertiesToItems(IFileOperation* This,IUnknown *punkItems) {
    return This->lpVtbl->ApplyPropertiesToItems(This,punkItems);
}
static inline HRESULT IFileOperation_RenameItem(IFileOperation* This,IShellItem *psiItem,LPCWSTR pszNewName,IFileOperationProgressSink *pfopsItem) {
    return This->lpVtbl->RenameItem(This,psiItem,pszNewName,pfopsItem);
}
static inline HRESULT IFileOperation_RenameItems(IFileOperation* This,IUnknown *pUnkItems,LPCWSTR pszNewName) {
    return This->lpVtbl->RenameItems(This,pUnkItems,pszNewName);
}
static inline HRESULT IFileOperation_MoveItem(IFileOperation* This,IShellItem *psiItem,IShellItem *psiDestinationFolder,LPCWSTR pszNewName,IFileOperationProgressSink *pfopsItem) {
    return This->lpVtbl->MoveItem(This,psiItem,psiDestinationFolder,pszNewName,pfopsItem);
}
static inline HRESULT IFileOperation_MoveItems(IFileOperation* This,IUnknown *punkItems,IShellItem *psiDestinationFolder) {
    return This->lpVtbl->MoveItems(This,punkItems,psiDestinationFolder);
}
static inline HRESULT IFileOperation_CopyItem(IFileOperation* This,IShellItem *psiItem,IShellItem *psiDestinationFolder,LPCWSTR pszCopyName,IFileOperationProgressSink *pfopsItem) {
    return This->lpVtbl->CopyItem(This,psiItem,psiDestinationFolder,pszCopyName,pfopsItem);
}
static inline HRESULT IFileOperation_CopyItems(IFileOperation* This,IUnknown *punkItems,IShellItem *psiDestinationFolder) {
    return This->lpVtbl->CopyItems(This,punkItems,psiDestinationFolder);
}
static inline HRESULT IFileOperation_DeleteItem(IFileOperation* This,IShellItem *psiItem,IFileOperationProgressSink *pfopsItem) {
    return This->lpVtbl->DeleteItem(This,psiItem,pfopsItem);
}
static inline HRESULT IFileOperation_DeleteItems(IFileOperation* This,IUnknown *punkItems) {
    return This->lpVtbl->DeleteItems(This,punkItems);
}
static inline 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 inline HRESULT IFileOperation_PerformOperations(IFileOperation* This) {
    return This->lpVtbl->PerformOperations(This);
}
static inline 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 inline HRESULT IObjectProvider_QueryInterface(IObjectProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IObjectProvider_AddRef(IObjectProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IObjectProvider_Release(IObjectProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectProvider methods ***/
static inline 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 inline HRESULT INamespaceWalkCB_QueryInterface(INamespaceWalkCB* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INamespaceWalkCB_AddRef(INamespaceWalkCB* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INamespaceWalkCB_Release(INamespaceWalkCB* This) {
    return This->lpVtbl->Release(This);
}
/*** INamespaceWalkCB methods ***/
static inline HRESULT INamespaceWalkCB_FoundItem(INamespaceWalkCB* This,IShellFolder *psf,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->FoundItem(This,psf,pidl);
}
static inline HRESULT INamespaceWalkCB_EnterFolder(INamespaceWalkCB* This,IShellFolder *psf,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->EnterFolder(This,psf,pidl);
}
static inline HRESULT INamespaceWalkCB_LeaveFolder(INamespaceWalkCB* This,IShellFolder *psf,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->LeaveFolder(This,psf,pidl);
}
static inline 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 inline HRESULT INamespaceWalkCB2_QueryInterface(INamespaceWalkCB2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INamespaceWalkCB2_AddRef(INamespaceWalkCB2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INamespaceWalkCB2_Release(INamespaceWalkCB2* This) {
    return This->lpVtbl->Release(This);
}
/*** INamespaceWalkCB methods ***/
static inline HRESULT INamespaceWalkCB2_FoundItem(INamespaceWalkCB2* This,IShellFolder *psf,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->FoundItem(This,psf,pidl);
}
static inline HRESULT INamespaceWalkCB2_EnterFolder(INamespaceWalkCB2* This,IShellFolder *psf,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->EnterFolder(This,psf,pidl);
}
static inline HRESULT INamespaceWalkCB2_LeaveFolder(INamespaceWalkCB2* This,IShellFolder *psf,PCUITEMID_CHILD pidl) {
    return This->lpVtbl->LeaveFolder(This,psf,pidl);
}
static inline HRESULT INamespaceWalkCB2_InitializeProgressDialog(INamespaceWalkCB2* This,LPWSTR *ppszTitle,LPWSTR *ppszCancel) {
    return This->lpVtbl->InitializeProgressDialog(This,ppszTitle,ppszCancel);
}
/*** INamespaceWalkCB2 methods ***/
static inline 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 inline HRESULT INamespaceWalk_QueryInterface(INamespaceWalk* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INamespaceWalk_AddRef(INamespaceWalk* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INamespaceWalk_Release(INamespaceWalk* This) {
    return This->lpVtbl->Release(This);
}
/*** INamespaceWalk methods ***/
static inline HRESULT INamespaceWalk_Walk(INamespaceWalk* This,IUnknown *punkToWalk,DWORD dwFlags,int cDepth,INamespaceWalkCB *pnswcb) {
    return This->lpVtbl->Walk(This,punkToWalk,dwFlags,cDepth,pnswcb);
}
static inline 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 inline HRESULT IAutoCompleteDropDown_QueryInterface(IAutoCompleteDropDown* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAutoCompleteDropDown_AddRef(IAutoCompleteDropDown* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAutoCompleteDropDown_Release(IAutoCompleteDropDown* This) {
    return This->lpVtbl->Release(This);
}
/*** IAutoCompleteDropDown methods ***/
static inline HRESULT IAutoCompleteDropDown_GetDropDownStatus(IAutoCompleteDropDown* This,DWORD *pdwFlags,LPWSTR *ppwszString) {
    return This->lpVtbl->GetDropDownStatus(This,pdwFlags,ppwszString);
}
static inline 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 inline HRESULT IBandSite_QueryInterface(IBandSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IBandSite_AddRef(IBandSite* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IBandSite_Release(IBandSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IBandSite methods ***/
static inline HRESULT IBandSite_AddBand(IBandSite* This,IUnknown *punk) {
    return This->lpVtbl->AddBand(This,punk);
}
static inline HRESULT IBandSite_EnumBands(IBandSite* This,UINT uBand,DWORD *pdwBandID) {
    return This->lpVtbl->EnumBands(This,uBand,pdwBandID);
}
static inline 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 inline HRESULT IBandSite_SetBandState(IBandSite* This,DWORD dwBandID,DWORD dwMask,DWORD dwState) {
    return This->lpVtbl->SetBandState(This,dwBandID,dwMask,dwState);
}
static inline HRESULT IBandSite_RemoveBand(IBandSite* This,DWORD dwBandID) {
    return This->lpVtbl->RemoveBand(This,dwBandID);
}
static inline HRESULT IBandSite_GetBandObject(IBandSite* This,DWORD dwBandID,REFIID riid,void **ppv) {
    return This->lpVtbl->GetBandObject(This,dwBandID,riid,ppv);
}
static inline HRESULT IBandSite_SetBandSiteInfo(IBandSite* This,const BANDSITEINFO *pbsinfo) {
    return This->lpVtbl->SetBandSiteInfo(This,pbsinfo);
}
static inline 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 inline HRESULT IModalWindow_QueryInterface(IModalWindow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IModalWindow_AddRef(IModalWindow* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IModalWindow_Release(IModalWindow* This) {
    return This->lpVtbl->Release(This);
}
/*** IModalWindow methods ***/
static inline 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 inline HRESULT ICDBurnExt_QueryInterface(ICDBurnExt* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICDBurnExt_AddRef(ICDBurnExt* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICDBurnExt_Release(ICDBurnExt* This) {
    return This->lpVtbl->Release(This);
}
/*** ICDBurnExt methods ***/
static inline 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 inline HRESULT IContextMenuSite_QueryInterface(IContextMenuSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IContextMenuSite_AddRef(IContextMenuSite* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IContextMenuSite_Release(IContextMenuSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IContextMenuSite methods ***/
static inline 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 inline HRESULT IEnumReadyCallback_QueryInterface(IEnumReadyCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IEnumReadyCallback_AddRef(IEnumReadyCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IEnumReadyCallback_Release(IEnumReadyCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumReadyCallback methods ***/
static inline 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 inline HRESULT IEnumerableView_QueryInterface(IEnumerableView* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IEnumerableView_AddRef(IEnumerableView* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IEnumerableView_Release(IEnumerableView* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumerableView methods ***/
static inline HRESULT IEnumerableView_SetEnumReadyCallback(IEnumerableView* This,IEnumReadyCallback *percb) {
    return This->lpVtbl->SetEnumReadyCallback(This,percb);
}
static inline 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 inline HRESULT IInsertItem_QueryInterface(IInsertItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IInsertItem_AddRef(IInsertItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IInsertItem_Release(IInsertItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IInsertItem methods ***/
static inline 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 inline HRESULT IMenuBand_QueryInterface(IMenuBand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IMenuBand_AddRef(IMenuBand* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IMenuBand_Release(IMenuBand* This) {
    return This->lpVtbl->Release(This);
}
/*** IMenuBand methods ***/
static inline HRESULT IMenuBand_IsMenuMessage(IMenuBand* This,MSG *pmsg) {
    return This->lpVtbl->IsMenuMessage(This,pmsg);
}
static inline 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 inline HRESULT IFolderBandPriv_QueryInterface(IFolderBandPriv* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFolderBandPriv_AddRef(IFolderBandPriv* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFolderBandPriv_Release(IFolderBandPriv* This) {
    return This->lpVtbl->Release(This);
}
/*** IFolderBandPriv methods ***/
static inline HRESULT IFolderBandPriv_SetCascade(IFolderBandPriv* This,WINBOOL fCascade) {
    return This->lpVtbl->SetCascade(This,fCascade);
}
static inline HRESULT IFolderBandPriv_SetAccelerators(IFolderBandPriv* This,WINBOOL fAccelerators) {
    return This->lpVtbl->SetAccelerators(This,fAccelerators);
}
static inline HRESULT IFolderBandPriv_SetNoIcons(IFolderBandPriv* This,WINBOOL fNoIcons) {
    return This->lpVtbl->SetNoIcons(This,fNoIcons);
}
static inline 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 inline HRESULT IRegTreeItem_QueryInterface(IRegTreeItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IRegTreeItem_AddRef(IRegTreeItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IRegTreeItem_Release(IRegTreeItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRegTreeItem methods ***/
static inline HRESULT IRegTreeItem_GetCheckState(IRegTreeItem* This,WINBOOL *pbCheck) {
    return This->lpVtbl->GetCheckState(This,pbCheck);
}
static inline 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 inline HRESULT IImageRecompress_QueryInterface(IImageRecompress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IImageRecompress_AddRef(IImageRecompress* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IImageRecompress_Release(IImageRecompress* This) {
    return This->lpVtbl->Release(This);
}
/*** IImageRecompress methods ***/
static inline 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 inline HRESULT IDeskBar_QueryInterface(IDeskBar* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDeskBar_AddRef(IDeskBar* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDeskBar_Release(IDeskBar* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static inline HRESULT IDeskBar_GetWindow(IDeskBar* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static inline HRESULT IDeskBar_ContextSensitiveHelp(IDeskBar* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IDeskBar methods ***/
static inline HRESULT IDeskBar_SetClient(IDeskBar* This,IUnknown *punkClient) {
    return This->lpVtbl->SetClient(This,punkClient);
}
static inline HRESULT IDeskBar_GetClient(IDeskBar* This,IUnknown **ppunkClient) {
    return This->lpVtbl->GetClient(This,ppunkClient);
}
static inline 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 inline HRESULT IMenuPopup_QueryInterface(IMenuPopup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IMenuPopup_AddRef(IMenuPopup* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IMenuPopup_Release(IMenuPopup* This) {
    return This->lpVtbl->Release(This);
}
/*** IOleWindow methods ***/
static inline HRESULT IMenuPopup_GetWindow(IMenuPopup* This,HWND *phwnd) {
    return This->lpVtbl->GetWindow(This,phwnd);
}
static inline HRESULT IMenuPopup_ContextSensitiveHelp(IMenuPopup* This,WINBOOL fEnterMode) {
    return This->lpVtbl->ContextSensitiveHelp(This,fEnterMode);
}
/*** IDeskBar methods ***/
static inline HRESULT IMenuPopup_SetClient(IMenuPopup* This,IUnknown *punkClient) {
    return This->lpVtbl->SetClient(This,punkClient);
}
static inline HRESULT IMenuPopup_GetClient(IMenuPopup* This,IUnknown **ppunkClient) {
    return This->lpVtbl->GetClient(This,ppunkClient);
}
static inline HRESULT IMenuPopup_OnPosRectChangeDB(IMenuPopup* This,RECT *prc) {
    return This->lpVtbl->OnPosRectChangeDB(This,prc);
}
/*** IMenuPopup methods ***/
static inline HRESULT IMenuPopup_Popup(IMenuPopup* This,POINTL *ppt,RECTL *prcExclude,MP_POPUPFLAGS dwFlags) {
    return This->lpVtbl->Popup(This,ppt,prcExclude,dwFlags);
}
static inline HRESULT IMenuPopup_OnSelect(IMenuPopup* This,DWORD dwSelectType) {
    return This->lpVtbl->OnSelect(This,dwSelectType);
}
static inline 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 inline HRESULT IFileIsInUse_QueryInterface(IFileIsInUse* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileIsInUse_AddRef(IFileIsInUse* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileIsInUse_Release(IFileIsInUse* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileIsInUse methods ***/
static inline HRESULT IFileIsInUse_GetAppName(IFileIsInUse* This,LPWSTR *ppszName) {
    return This->lpVtbl->GetAppName(This,ppszName);
}
static inline HRESULT IFileIsInUse_GetUsage(IFileIsInUse* This,FILE_USAGE_TYPE *pfut) {
    return This->lpVtbl->GetUsage(This,pfut);
}
static inline HRESULT IFileIsInUse_GetCapabilities(IFileIsInUse* This,DWORD *pdwCapFlags) {
    return This->lpVtbl->GetCapabilities(This,pdwCapFlags);
}
static inline HRESULT IFileIsInUse_GetSwitchToHWND(IFileIsInUse* This,HWND *phwnd) {
    return This->lpVtbl->GetSwitchToHWND(This,phwnd);
}
static inline 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 inline HRESULT IFileDialogEvents_QueryInterface(IFileDialogEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileDialogEvents_AddRef(IFileDialogEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileDialogEvents_Release(IFileDialogEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileDialogEvents methods ***/
static inline HRESULT IFileDialogEvents_OnFileOk(IFileDialogEvents* This,IFileDialog *pfd) {
    return This->lpVtbl->OnFileOk(This,pfd);
}
static inline HRESULT IFileDialogEvents_OnFolderChanging(IFileDialogEvents* This,IFileDialog *pfd,IShellItem *psiFolder) {
    return This->lpVtbl->OnFolderChanging(This,pfd,psiFolder);
}
static inline HRESULT IFileDialogEvents_OnFolderChange(IFileDialogEvents* This,IFileDialog *pfd) {
    return This->lpVtbl->OnFolderChange(This,pfd);
}
static inline HRESULT IFileDialogEvents_OnSelectionChange(IFileDialogEvents* This,IFileDialog *pfd) {
    return This->lpVtbl->OnSelectionChange(This,pfd);
}
static inline HRESULT IFileDialogEvents_OnShareViolation(IFileDialogEvents* This,IFileDialog *pfd,IShellItem *psi,FDE_SHAREVIOLATION_RESPONSE *pResponse) {
    return This->lpVtbl->OnShareViolation(This,pfd,psi,pResponse);
}
static inline HRESULT IFileDialogEvents_OnTypeChange(IFileDialogEvents* This,IFileDialog *pfd) {
    return This->lpVtbl->OnTypeChange(This,pfd);
}
static inline 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 inline HRESULT IFileDialog_QueryInterface(IFileDialog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileDialog_AddRef(IFileDialog* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileDialog_Release(IFileDialog* This) {
    return This->lpVtbl->Release(This);
}
/*** IModalWindow methods ***/
static inline HRESULT IFileDialog_Show(IFileDialog* This,HWND hwndOwner) {
    return This->lpVtbl->Show(This,hwndOwner);
}
/*** IFileDialog methods ***/
static inline HRESULT IFileDialog_SetFileTypes(IFileDialog* This,UINT cFileTypes,const COMDLG_FILTERSPEC *rgFilterSpec) {
    return This->lpVtbl->SetFileTypes(This,cFileTypes,rgFilterSpec);
}
static inline HRESULT IFileDialog_SetFileTypeIndex(IFileDialog* This,UINT iFileType) {
    return This->lpVtbl->SetFileTypeIndex(This,iFileType);
}
static inline HRESULT IFileDialog_GetFileTypeIndex(IFileDialog* This,UINT *piFileType) {
    return This->lpVtbl->GetFileTypeIndex(This,piFileType);
}
static inline HRESULT IFileDialog_Advise(IFileDialog* This,IFileDialogEvents *pfde,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pfde,pdwCookie);
}
static inline HRESULT IFileDialog_Unadvise(IFileDialog* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static inline HRESULT IFileDialog_SetOptions(IFileDialog* This,FILEOPENDIALOGOPTIONS fos) {
    return This->lpVtbl->SetOptions(This,fos);
}
static inline HRESULT IFileDialog_GetOptions(IFileDialog* This,FILEOPENDIALOGOPTIONS *pfos) {
    return This->lpVtbl->GetOptions(This,pfos);
}
static inline HRESULT IFileDialog_SetDefaultFolder(IFileDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetDefaultFolder(This,psi);
}
static inline HRESULT IFileDialog_SetFolder(IFileDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetFolder(This,psi);
}
static inline HRESULT IFileDialog_GetFolder(IFileDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetFolder(This,ppsi);
}
static inline HRESULT IFileDialog_GetCurrentSelection(IFileDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetCurrentSelection(This,ppsi);
}
static inline HRESULT IFileDialog_SetFileName(IFileDialog* This,LPCWSTR pszName) {
    return This->lpVtbl->SetFileName(This,pszName);
}
static inline HRESULT IFileDialog_GetFileName(IFileDialog* This,LPWSTR *pszName) {
    return This->lpVtbl->GetFileName(This,pszName);
}
static inline HRESULT IFileDialog_SetTitle(IFileDialog* This,LPCWSTR pszTitle) {
    return This->lpVtbl->SetTitle(This,pszTitle);
}
static inline HRESULT IFileDialog_SetOkButtonLabel(IFileDialog* This,LPCWSTR pszText) {
    return This->lpVtbl->SetOkButtonLabel(This,pszText);
}
static inline HRESULT IFileDialog_SetFileNameLabel(IFileDialog* This,LPCWSTR pszLabel) {
    return This->lpVtbl->SetFileNameLabel(This,pszLabel);
}
static inline HRESULT IFileDialog_GetResult(IFileDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetResult(This,ppsi);
}
static inline HRESULT IFileDialog_AddPlace(IFileDialog* This,IShellItem *psi,FDAP fdap) {
    return This->lpVtbl->AddPlace(This,psi,fdap);
}
static inline HRESULT IFileDialog_SetDefaultExtension(IFileDialog* This,LPCWSTR pszDefaultExtension) {
    return This->lpVtbl->SetDefaultExtension(This,pszDefaultExtension);
}
static inline HRESULT IFileDialog_Close(IFileDialog* This,HRESULT hr) {
    return This->lpVtbl->Close(This,hr);
}
static inline HRESULT IFileDialog_SetClientGuid(IFileDialog* This,REFGUID guid) {
    return This->lpVtbl->SetClientGuid(This,guid);
}
static inline HRESULT IFileDialog_ClearClientData(IFileDialog* This) {
    return This->lpVtbl->ClearClientData(This);
}
static inline 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 inline HRESULT IFileSaveDialog_QueryInterface(IFileSaveDialog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileSaveDialog_AddRef(IFileSaveDialog* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileSaveDialog_Release(IFileSaveDialog* This) {
    return This->lpVtbl->Release(This);
}
/*** IModalWindow methods ***/
static inline HRESULT IFileSaveDialog_Show(IFileSaveDialog* This,HWND hwndOwner) {
    return This->lpVtbl->Show(This,hwndOwner);
}
/*** IFileDialog methods ***/
static inline HRESULT IFileSaveDialog_SetFileTypes(IFileSaveDialog* This,UINT cFileTypes,const COMDLG_FILTERSPEC *rgFilterSpec) {
    return This->lpVtbl->SetFileTypes(This,cFileTypes,rgFilterSpec);
}
static inline HRESULT IFileSaveDialog_SetFileTypeIndex(IFileSaveDialog* This,UINT iFileType) {
    return This->lpVtbl->SetFileTypeIndex(This,iFileType);
}
static inline HRESULT IFileSaveDialog_GetFileTypeIndex(IFileSaveDialog* This,UINT *piFileType) {
    return This->lpVtbl->GetFileTypeIndex(This,piFileType);
}
static inline HRESULT IFileSaveDialog_Advise(IFileSaveDialog* This,IFileDialogEvents *pfde,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pfde,pdwCookie);
}
static inline HRESULT IFileSaveDialog_Unadvise(IFileSaveDialog* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static inline HRESULT IFileSaveDialog_SetOptions(IFileSaveDialog* This,FILEOPENDIALOGOPTIONS fos) {
    return This->lpVtbl->SetOptions(This,fos);
}
static inline HRESULT IFileSaveDialog_GetOptions(IFileSaveDialog* This,FILEOPENDIALOGOPTIONS *pfos) {
    return This->lpVtbl->GetOptions(This,pfos);
}
static inline HRESULT IFileSaveDialog_SetDefaultFolder(IFileSaveDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetDefaultFolder(This,psi);
}
static inline HRESULT IFileSaveDialog_SetFolder(IFileSaveDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetFolder(This,psi);
}
static inline HRESULT IFileSaveDialog_GetFolder(IFileSaveDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetFolder(This,ppsi);
}
static inline HRESULT IFileSaveDialog_GetCurrentSelection(IFileSaveDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetCurrentSelection(This,ppsi);
}
static inline HRESULT IFileSaveDialog_SetFileName(IFileSaveDialog* This,LPCWSTR pszName) {
    return This->lpVtbl->SetFileName(This,pszName);
}
static inline HRESULT IFileSaveDialog_GetFileName(IFileSaveDialog* This,LPWSTR *pszName) {
    return This->lpVtbl->GetFileName(This,pszName);
}
static inline HRESULT IFileSaveDialog_SetTitle(IFileSaveDialog* This,LPCWSTR pszTitle) {
    return This->lpVtbl->SetTitle(This,pszTitle);
}
static inline HRESULT IFileSaveDialog_SetOkButtonLabel(IFileSaveDialog* This,LPCWSTR pszText) {
    return This->lpVtbl->SetOkButtonLabel(This,pszText);
}
static inline HRESULT IFileSaveDialog_SetFileNameLabel(IFileSaveDialog* This,LPCWSTR pszLabel) {
    return This->lpVtbl->SetFileNameLabel(This,pszLabel);
}
static inline HRESULT IFileSaveDialog_GetResult(IFileSaveDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetResult(This,ppsi);
}
static inline HRESULT IFileSaveDialog_AddPlace(IFileSaveDialog* This,IShellItem *psi,FDAP fdap) {
    return This->lpVtbl->AddPlace(This,psi,fdap);
}
static inline HRESULT IFileSaveDialog_SetDefaultExtension(IFileSaveDialog* This,LPCWSTR pszDefaultExtension) {
    return This->lpVtbl->SetDefaultExtension(This,pszDefaultExtension);
}
static inline HRESULT IFileSaveDialog_Close(IFileSaveDialog* This,HRESULT hr) {
    return This->lpVtbl->Close(This,hr);
}
static inline HRESULT IFileSaveDialog_SetClientGuid(IFileSaveDialog* This,REFGUID guid) {
    return This->lpVtbl->SetClientGuid(This,guid);
}
static inline HRESULT IFileSaveDialog_ClearClientData(IFileSaveDialog* This) {
    return This->lpVtbl->ClearClientData(This);
}
static inline HRESULT IFileSaveDialog_SetFilter(IFileSaveDialog* This,IShellItemFilter *pFilter) {
    return This->lpVtbl->SetFilter(This,pFilter);
}
/*** IFileSaveDialog methods ***/
static inline HRESULT IFileSaveDialog_SetSaveAsItem(IFileSaveDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetSaveAsItem(This,psi);
}
static inline HRESULT IFileSaveDialog_SetProperties(IFileSaveDialog* This,IPropertyStore *pStore) {
    return This->lpVtbl->SetProperties(This,pStore);
}
static inline HRESULT IFileSaveDialog_SetCollectedProperties(IFileSaveDialog* This,IPropertyDescriptionList *pList,WINBOOL fAppendDefault) {
    return This->lpVtbl->SetCollectedProperties(This,pList,fAppendDefault);
}
static inline HRESULT IFileSaveDialog_GetProperties(IFileSaveDialog* This,IPropertyStore **ppStore) {
    return This->lpVtbl->GetProperties(This,ppStore);
}
static inline 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 inline HRESULT IFileOpenDialog_QueryInterface(IFileOpenDialog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileOpenDialog_AddRef(IFileOpenDialog* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileOpenDialog_Release(IFileOpenDialog* This) {
    return This->lpVtbl->Release(This);
}
/*** IModalWindow methods ***/
static inline HRESULT IFileOpenDialog_Show(IFileOpenDialog* This,HWND hwndOwner) {
    return This->lpVtbl->Show(This,hwndOwner);
}
/*** IFileDialog methods ***/
static inline HRESULT IFileOpenDialog_SetFileTypes(IFileOpenDialog* This,UINT cFileTypes,const COMDLG_FILTERSPEC *rgFilterSpec) {
    return This->lpVtbl->SetFileTypes(This,cFileTypes,rgFilterSpec);
}
static inline HRESULT IFileOpenDialog_SetFileTypeIndex(IFileOpenDialog* This,UINT iFileType) {
    return This->lpVtbl->SetFileTypeIndex(This,iFileType);
}
static inline HRESULT IFileOpenDialog_GetFileTypeIndex(IFileOpenDialog* This,UINT *piFileType) {
    return This->lpVtbl->GetFileTypeIndex(This,piFileType);
}
static inline HRESULT IFileOpenDialog_Advise(IFileOpenDialog* This,IFileDialogEvents *pfde,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pfde,pdwCookie);
}
static inline HRESULT IFileOpenDialog_Unadvise(IFileOpenDialog* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static inline HRESULT IFileOpenDialog_SetOptions(IFileOpenDialog* This,FILEOPENDIALOGOPTIONS fos) {
    return This->lpVtbl->SetOptions(This,fos);
}
static inline HRESULT IFileOpenDialog_GetOptions(IFileOpenDialog* This,FILEOPENDIALOGOPTIONS *pfos) {
    return This->lpVtbl->GetOptions(This,pfos);
}
static inline HRESULT IFileOpenDialog_SetDefaultFolder(IFileOpenDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetDefaultFolder(This,psi);
}
static inline HRESULT IFileOpenDialog_SetFolder(IFileOpenDialog* This,IShellItem *psi) {
    return This->lpVtbl->SetFolder(This,psi);
}
static inline HRESULT IFileOpenDialog_GetFolder(IFileOpenDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetFolder(This,ppsi);
}
static inline HRESULT IFileOpenDialog_GetCurrentSelection(IFileOpenDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetCurrentSelection(This,ppsi);
}
static inline HRESULT IFileOpenDialog_SetFileName(IFileOpenDialog* This,LPCWSTR pszName) {
    return This->lpVtbl->SetFileName(This,pszName);
}
static inline HRESULT IFileOpenDialog_GetFileName(IFileOpenDialog* This,LPWSTR *pszName) {
    return This->lpVtbl->GetFileName(This,pszName);
}
static inline HRESULT IFileOpenDialog_SetTitle(IFileOpenDialog* This,LPCWSTR pszTitle) {
    return This->lpVtbl->SetTitle(This,pszTitle);
}
static inline HRESULT IFileOpenDialog_SetOkButtonLabel(IFileOpenDialog* This,LPCWSTR pszText) {
    return This->lpVtbl->SetOkButtonLabel(This,pszText);
}
static inline HRESULT IFileOpenDialog_SetFileNameLabel(IFileOpenDialog* This,LPCWSTR pszLabel) {
    return This->lpVtbl->SetFileNameLabel(This,pszLabel);
}
static inline HRESULT IFileOpenDialog_GetResult(IFileOpenDialog* This,IShellItem **ppsi) {
    return This->lpVtbl->GetResult(This,ppsi);
}
static inline HRESULT IFileOpenDialog_AddPlace(IFileOpenDialog* This,IShellItem *psi,FDAP fdap) {
    return This->lpVtbl->AddPlace(This,psi,fdap);
}
static inline HRESULT IFileOpenDialog_SetDefaultExtension(IFileOpenDialog* This,LPCWSTR pszDefaultExtension) {
    return This->lpVtbl->SetDefaultExtension(This,pszDefaultExtension);
}
static inline HRESULT IFileOpenDialog_Close(IFileOpenDialog* This,HRESULT hr) {
    return This->lpVtbl->Close(This,hr);
}
static inline HRESULT IFileOpenDialog_SetClientGuid(IFileOpenDialog* This,REFGUID guid) {
    return This->lpVtbl->SetClientGuid(This,guid);
}
static inline HRESULT IFileOpenDialog_ClearClientData(IFileOpenDialog* This) {
    return This->lpVtbl->ClearClientData(This);
}
static inline HRESULT IFileOpenDialog_SetFilter(IFileOpenDialog* This,IShellItemFilter *pFilter) {
    return This->lpVtbl->SetFilter(This,pFilter);
}
/*** IFileOpenDialog methods ***/
static inline HRESULT IFileOpenDialog_GetResults(IFileOpenDialog* This,IShellItemArray **ppenum) {
    return This->lpVtbl->GetResults(This,ppenum);
}
static inline 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 inline HRESULT IFileDialogCustomize_QueryInterface(IFileDialogCustomize* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileDialogCustomize_AddRef(IFileDialogCustomize* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileDialogCustomize_Release(IFileDialogCustomize* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileDialogCustomize methods ***/
static inline HRESULT IFileDialogCustomize_EnableOpenDropDown(IFileDialogCustomize* This,DWORD dwIDCtl) {
    return This->lpVtbl->EnableOpenDropDown(This,dwIDCtl);
}
static inline HRESULT IFileDialogCustomize_AddMenu(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszLabel) {
    return This->lpVtbl->AddMenu(This,dwIDCtl,pszLabel);
}
static inline HRESULT IFileDialogCustomize_AddPushButton(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszLabel) {
    return This->lpVtbl->AddPushButton(This,dwIDCtl,pszLabel);
}
static inline HRESULT IFileDialogCustomize_AddComboBox(IFileDialogCustomize* This,DWORD dwIDCtl) {
    return This->lpVtbl->AddComboBox(This,dwIDCtl);
}
static inline HRESULT IFileDialogCustomize_AddRadioButtonList(IFileDialogCustomize* This,DWORD dwIDCtl) {
    return This->lpVtbl->AddRadioButtonList(This,dwIDCtl);
}
static inline HRESULT IFileDialogCustomize_AddCheckButton(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszLabel,WINBOOL bChecked) {
    return This->lpVtbl->AddCheckButton(This,dwIDCtl,pszLabel,bChecked);
}
static inline HRESULT IFileDialogCustomize_AddEditBox(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszText) {
    return This->lpVtbl->AddEditBox(This,dwIDCtl,pszText);
}
static inline HRESULT IFileDialogCustomize_AddSeparator(IFileDialogCustomize* This,DWORD dwIDCtl) {
    return This->lpVtbl->AddSeparator(This,dwIDCtl);
}
static inline HRESULT IFileDialogCustomize_AddText(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszText) {
    return This->lpVtbl->AddText(This,dwIDCtl,pszText);
}
static inline HRESULT IFileDialogCustomize_SetControlLabel(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszLabel) {
    return This->lpVtbl->SetControlLabel(This,dwIDCtl,pszLabel);
}
static inline HRESULT IFileDialogCustomize_GetControlState(IFileDialogCustomize* This,DWORD dwIDCtl,CDCONTROLSTATEF *pdwState) {
    return This->lpVtbl->GetControlState(This,dwIDCtl,pdwState);
}
static inline HRESULT IFileDialogCustomize_SetControlState(IFileDialogCustomize* This,DWORD dwIDCtl,CDCONTROLSTATEF dwState) {
    return This->lpVtbl->SetControlState(This,dwIDCtl,dwState);
}
static inline HRESULT IFileDialogCustomize_GetEditBoxText(IFileDialogCustomize* This,DWORD dwIDCtl,WCHAR **ppszText) {
    return This->lpVtbl->GetEditBoxText(This,dwIDCtl,ppszText);
}
static inline HRESULT IFileDialogCustomize_SetEditBoxText(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszText) {
    return This->lpVtbl->SetEditBoxText(This,dwIDCtl,pszText);
}
static inline HRESULT IFileDialogCustomize_GetCheckButtonState(IFileDialogCustomize* This,DWORD dwIDCtl,WINBOOL *pbChecked) {
    return This->lpVtbl->GetCheckButtonState(This,dwIDCtl,pbChecked);
}
static inline HRESULT IFileDialogCustomize_SetCheckButtonState(IFileDialogCustomize* This,DWORD dwIDCtl,WINBOOL bChecked) {
    return This->lpVtbl->SetCheckButtonState(This,dwIDCtl,bChecked);
}
static inline HRESULT IFileDialogCustomize_AddControlItem(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD dwIDItem,LPCWSTR pszLabel) {
    return This->lpVtbl->AddControlItem(This,dwIDCtl,dwIDItem,pszLabel);
}
static inline HRESULT IFileDialogCustomize_RemoveControlItem(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD dwIDItem) {
    return This->lpVtbl->RemoveControlItem(This,dwIDCtl,dwIDItem);
}
static inline HRESULT IFileDialogCustomize_RemoveAllControlItems(IFileDialogCustomize* This,DWORD dwIDCtl) {
    return This->lpVtbl->RemoveAllControlItems(This,dwIDCtl);
}
static inline HRESULT IFileDialogCustomize_GetControlItemState(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD dwIDItem,CDCONTROLSTATEF *pdwState) {
    return This->lpVtbl->GetControlItemState(This,dwIDCtl,dwIDItem,pdwState);
}
static inline HRESULT IFileDialogCustomize_SetControlItemState(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD dwIDItem,CDCONTROLSTATEF dwState) {
    return This->lpVtbl->SetControlItemState(This,dwIDCtl,dwIDItem,dwState);
}
static inline HRESULT IFileDialogCustomize_GetSelectedControlItem(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD *pdwIDItem) {
    return This->lpVtbl->GetSelectedControlItem(This,dwIDCtl,pdwIDItem);
}
static inline HRESULT IFileDialogCustomize_SetSelectedControlItem(IFileDialogCustomize* This,DWORD dwIDCtl,DWORD dwIDItem) {
    return This->lpVtbl->SetSelectedControlItem(This,dwIDCtl,dwIDItem);
}
static inline HRESULT IFileDialogCustomize_StartVisualGroup(IFileDialogCustomize* This,DWORD dwIDCtl,LPCWSTR pszLabel) {
    return This->lpVtbl->StartVisualGroup(This,dwIDCtl,pszLabel);
}
static inline HRESULT IFileDialogCustomize_EndVisualGroup(IFileDialogCustomize* This) {
    return This->lpVtbl->EndVisualGroup(This);
}
static inline HRESULT IFileDialogCustomize_MakeProminent(IFileDialogCustomize* This,DWORD dwIDCtl) {
    return This->lpVtbl->MakeProminent(This,dwIDCtl);
}
static inline 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 inline HRESULT IFileDialogControlEvents_QueryInterface(IFileDialogControlEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileDialogControlEvents_AddRef(IFileDialogControlEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileDialogControlEvents_Release(IFileDialogControlEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileDialogControlEvents methods ***/
static inline HRESULT IFileDialogControlEvents_OnItemSelected(IFileDialogControlEvents* This,IFileDialogCustomize *pfdc,DWORD dwIDCtl,DWORD dwIDItem) {
    return This->lpVtbl->OnItemSelected(This,pfdc,dwIDCtl,dwIDItem);
}
static inline HRESULT IFileDialogControlEvents_OnButtonClicked(IFileDialogControlEvents* This,IFileDialogCustomize *pfdc,DWORD dwIDCtl) {
    return This->lpVtbl->OnButtonClicked(This,pfdc,dwIDCtl);
}
static inline HRESULT IFileDialogControlEvents_OnCheckButtonToggled(IFileDialogControlEvents* This,IFileDialogCustomize *pfdc,DWORD dwIDCtl,WINBOOL bChecked) {
    return This->lpVtbl->OnCheckButtonToggled(This,pfdc,dwIDCtl,bChecked);
}
static inline 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 inline HRESULT IFileDialog2_QueryInterface(IFileDialog2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileDialog2_AddRef(IFileDialog2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileDialog2_Release(IFileDialog2* This) {
    return This->lpVtbl->Release(This);
}
/*** IModalWindow methods ***/
static inline HRESULT IFileDialog2_Show(IFileDialog2* This,HWND hwndOwner) {
    return This->lpVtbl->Show(This,hwndOwner);
}
/*** IFileDialog methods ***/
static inline HRESULT IFileDialog2_SetFileTypes(IFileDialog2* This,UINT cFileTypes,const COMDLG_FILTERSPEC *rgFilterSpec) {
    return This->lpVtbl->SetFileTypes(This,cFileTypes,rgFilterSpec);
}
static inline HRESULT IFileDialog2_SetFileTypeIndex(IFileDialog2* This,UINT iFileType) {
    return This->lpVtbl->SetFileTypeIndex(This,iFileType);
}
static inline HRESULT IFileDialog2_GetFileTypeIndex(IFileDialog2* This,UINT *piFileType) {
    return This->lpVtbl->GetFileTypeIndex(This,piFileType);
}
static inline HRESULT IFileDialog2_Advise(IFileDialog2* This,IFileDialogEvents *pfde,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pfde,pdwCookie);
}
static inline HRESULT IFileDialog2_Unadvise(IFileDialog2* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static inline HRESULT IFileDialog2_SetOptions(IFileDialog2* This,FILEOPENDIALOGOPTIONS fos) {
    return This->lpVtbl->SetOptions(This,fos);
}
static inline HRESULT IFileDialog2_GetOptions(IFileDialog2* This,FILEOPENDIALOGOPTIONS *pfos) {
    return This->lpVtbl->GetOptions(This,pfos);
}
static inline HRESULT IFileDialog2_SetDefaultFolder(IFileDialog2* This,IShellItem *psi) {
    return This->lpVtbl->SetDefaultFolder(This,psi);
}
static inline HRESULT IFileDialog2_SetFolder(IFileDialog2* This,IShellItem *psi) {
    return This->lpVtbl->SetFolder(This,psi);
}
static inline HRESULT IFileDialog2_GetFolder(IFileDialog2* This,IShellItem **ppsi) {
    return This->lpVtbl->GetFolder(This,ppsi);
}
static inline HRESULT IFileDialog2_GetCurrentSelection(IFileDialog2* This,IShellItem **ppsi) {
    return This->lpVtbl->GetCurrentSelection(This,ppsi);
}
static inline HRESULT IFileDialog2_SetFileName(IFileDialog2* This,LPCWSTR pszName) {
    return This->lpVtbl->SetFileName(This,pszName);
}
static inline HRESULT IFileDialog2_GetFileName(IFileDialog2* This,LPWSTR *pszName) {
    return This->lpVtbl->GetFileName(This,pszName);
}
static inline HRESULT IFileDialog2_SetTitle(IFileDialog2* This,LPCWSTR pszTitle) {
    return This->lpVtbl->SetTitle(This,pszTitle);
}
static inline HRESULT IFileDialog2_SetOkButtonLabel(IFileDialog2* This,LPCWSTR pszText) {
    return This->lpVtbl->SetOkButtonLabel(This,pszText);
}
static inline HRESULT IFileDialog2_SetFileNameLabel(IFileDialog2* This,LPCWSTR pszLabel) {
    return This->lpVtbl->SetFileNameLabel(This,pszLabel);
}
static inline HRESULT IFileDialog2_GetResult(IFileDialog2* This,IShellItem **ppsi) {
    return This->lpVtbl->GetResult(This,ppsi);
}
static inline HRESULT IFileDialog2_AddPlace(IFileDialog2* This,IShellItem *psi,FDAP fdap) {
    return This->lpVtbl->AddPlace(This,psi,fdap);
}
static inline HRESULT IFileDialog2_SetDefaultExtension(IFileDialog2* This,LPCWSTR pszDefaultExtension) {
    return This->lpVtbl->SetDefaultExtension(This,pszDefaultExtension);
}
static inline HRESULT IFileDialog2_Close(IFileDialog2* This,HRESULT hr) {
    return This->lpVtbl->Close(This,hr);
}
static inline HRESULT IFileDialog2_SetClientGuid(IFileDialog2* This,REFGUID guid) {
    return This->lpVtbl->SetClientGuid(This,guid);
}
static inline HRESULT IFileDialog2_ClearClientData(IFileDialog2* This) {
    return This->lpVtbl->ClearClientData(This);
}
static inline HRESULT IFileDialog2_SetFilter(IFileDialog2* This,IShellItemFilter *pFilter) {
    return This->lpVtbl->SetFilter(This,pFilter);
}
/*** IFileDialog2 methods ***/
static inline HRESULT IFileDialog2_SetCancelButtonLabel(IFileDialog2* This,LPCWSTR pszLabel) {
    return This->lpVtbl->SetCancelButtonLabel(This,pszLabel);
}
static inline 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 inline HRESULT IApplicationAssociationRegistration_QueryInterface(IApplicationAssociationRegistration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IApplicationAssociationRegistration_AddRef(IApplicationAssociationRegistration* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IApplicationAssociationRegistration_Release(IApplicationAssociationRegistration* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationAssociationRegistration methods ***/
static inline HRESULT IApplicationAssociationRegistration_QueryCurrentDefault(IApplicationAssociationRegistration* This,LPCWSTR pszQuery,ASSOCIATIONTYPE atQueryType,ASSOCIATIONLEVEL alQueryLevel,LPWSTR *ppszAssociation) {
    return This->lpVtbl->QueryCurrentDefault(This,pszQuery,atQueryType,alQueryLevel,ppszAssociation);
}
static inline 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 inline HRESULT IApplicationAssociationRegistration_QueryAppIsDefaultAll(IApplicationAssociationRegistration* This,ASSOCIATIONLEVEL alQueryLevel,LPCWSTR pszAppRegistryName,WINBOOL *pfDefault) {
    return This->lpVtbl->QueryAppIsDefaultAll(This,alQueryLevel,pszAppRegistryName,pfDefault);
}
static inline HRESULT IApplicationAssociationRegistration_SetAppAsDefault(IApplicationAssociationRegistration* This,LPCWSTR pszAppRegistryName,LPCWSTR pszSet,ASSOCIATIONTYPE atSetType) {
    return This->lpVtbl->SetAppAsDefault(This,pszAppRegistryName,pszSet,atSetType);
}
static inline HRESULT IApplicationAssociationRegistration_SetAppAsDefaultAll(IApplicationAssociationRegistration* This,LPCWSTR pszAppRegistryName) {
    return This->lpVtbl->SetAppAsDefaultAll(This,pszAppRegistryName);
}
static inline 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 inline HRESULT IApplicationAssociationRegistrationUI_QueryInterface(IApplicationAssociationRegistrationUI* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IApplicationAssociationRegistrationUI_AddRef(IApplicationAssociationRegistrationUI* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IApplicationAssociationRegistrationUI_Release(IApplicationAssociationRegistrationUI* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationAssociationRegistrationUI methods ***/
static inline 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 inline HRESULT IDelegateFolder_QueryInterface(IDelegateFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDelegateFolder_AddRef(IDelegateFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDelegateFolder_Release(IDelegateFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IDelegateFolder methods ***/
static inline 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 inline HRESULT IBrowserFrameOptions_QueryInterface(IBrowserFrameOptions* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IBrowserFrameOptions_AddRef(IBrowserFrameOptions* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IBrowserFrameOptions_Release(IBrowserFrameOptions* This) {
    return This->lpVtbl->Release(This);
}
/*** IBrowserFrameOptions methods ***/
static inline 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 inline HRESULT INewWindowManager_QueryInterface(INewWindowManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INewWindowManager_AddRef(INewWindowManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INewWindowManager_Release(INewWindowManager* This) {
    return This->lpVtbl->Release(This);
}
/*** INewWindowManager methods ***/
static inline 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 inline HRESULT IAttachmentExecute_QueryInterface(IAttachmentExecute* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAttachmentExecute_AddRef(IAttachmentExecute* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAttachmentExecute_Release(IAttachmentExecute* This) {
    return This->lpVtbl->Release(This);
}
/*** IAttachmentExecute methods ***/
static inline HRESULT IAttachmentExecute_SetClientTitle(IAttachmentExecute* This,LPCWSTR pszTitle) {
    return This->lpVtbl->SetClientTitle(This,pszTitle);
}
static inline HRESULT IAttachmentExecute_SetClientGuid(IAttachmentExecute* This,REFGUID guid) {
    return This->lpVtbl->SetClientGuid(This,guid);
}
static inline HRESULT IAttachmentExecute_SetLocalPath(IAttachmentExecute* This,LPCWSTR pszLocalPath) {
    return This->lpVtbl->SetLocalPath(This,pszLocalPath);
}
static inline HRESULT IAttachmentExecute_SetFileName(IAttachmentExecute* This,LPCWSTR pszFileName) {
    return This->lpVtbl->SetFileName(This,pszFileName);
}
static inline HRESULT IAttachmentExecute_SetSource(IAttachmentExecute* This,LPCWSTR pszSource) {
    return This->lpVtbl->SetSource(This,pszSource);
}
static inline HRESULT IAttachmentExecute_SetReferrer(IAttachmentExecute* This,LPCWSTR pszReferrer) {
    return This->lpVtbl->SetReferrer(This,pszReferrer);
}
static inline HRESULT IAttachmentExecute_CheckPolicy(IAttachmentExecute* This) {
    return This->lpVtbl->CheckPolicy(This);
}
static inline HRESULT IAttachmentExecute_Prompt(IAttachmentExecute* This,HWND hwnd,ATTACHMENT_PROMPT prompt,ATTACHMENT_ACTION *paction) {
    return This->lpVtbl->Prompt(This,hwnd,prompt,paction);
}
static inline HRESULT IAttachmentExecute_Save(IAttachmentExecute* This) {
    return This->lpVtbl->Save(This);
}
static inline HRESULT IAttachmentExecute_Execute(IAttachmentExecute* This,HWND hwnd,LPCWSTR pszVerb,HANDLE *phProcess) {
    return This->lpVtbl->Execute(This,hwnd,pszVerb,phProcess);
}
static inline HRESULT IAttachmentExecute_SaveWithUI(IAttachmentExecute* This,HWND hwnd) {
    return This->lpVtbl->SaveWithUI(This,hwnd);
}
static inline 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 inline HRESULT IShellMenuCallback_QueryInterface(IShellMenuCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellMenuCallback_AddRef(IShellMenuCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellMenuCallback_Release(IShellMenuCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellMenuCallback methods ***/
static inline 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 inline HRESULT IShellMenu_QueryInterface(IShellMenu* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellMenu_AddRef(IShellMenu* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellMenu_Release(IShellMenu* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellMenu methods ***/
static inline HRESULT IShellMenu_Initialize(IShellMenu* This,IShellMenuCallback *psmc,UINT uId,UINT uIdAncestor,DWORD dwFlags) {
    return This->lpVtbl->Initialize(This,psmc,uId,uIdAncestor,dwFlags);
}
static inline HRESULT IShellMenu_GetMenuInfo(IShellMenu* This,IShellMenuCallback **ppsmc,UINT *puId,UINT *puIdAncestor,DWORD *pdwFlags) {
    return This->lpVtbl->GetMenuInfo(This,ppsmc,puId,puIdAncestor,pdwFlags);
}
static inline HRESULT IShellMenu_SetShellFolder(IShellMenu* This,IShellFolder *psf,PCIDLIST_ABSOLUTE pidlFolder,HKEY hKey,DWORD dwFlags) {
    return This->lpVtbl->SetShellFolder(This,psf,pidlFolder,hKey,dwFlags);
}
static inline HRESULT IShellMenu_GetShellFolder(IShellMenu* This,DWORD *pdwFlags,PIDLIST_ABSOLUTE *ppidl,REFIID riid,void **ppv) {
    return This->lpVtbl->GetShellFolder(This,pdwFlags,ppidl,riid,ppv);
}
static inline HRESULT IShellMenu_SetMenu(IShellMenu* This,HMENU hmenu,HWND hwnd,DWORD dwFlags) {
    return This->lpVtbl->SetMenu(This,hmenu,hwnd,dwFlags);
}
static inline HRESULT IShellMenu_GetMenu(IShellMenu* This,HMENU *phmenu,HWND *phwnd,DWORD *pdwFlags) {
    return This->lpVtbl->GetMenu(This,phmenu,phwnd,pdwFlags);
}
static inline HRESULT IShellMenu_InvalidateItem(IShellMenu* This,LPSMDATA psmd,DWORD dwFlags) {
    return This->lpVtbl->InvalidateItem(This,psmd,dwFlags);
}
static inline HRESULT IShellMenu_GetState(IShellMenu* This,LPSMDATA psmd) {
    return This->lpVtbl->GetState(This,psmd);
}
static inline 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 inline HRESULT IShellRunDll_QueryInterface(IShellRunDll* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellRunDll_AddRef(IShellRunDll* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellRunDll_Release(IShellRunDll* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellRunDll methods ***/
static inline 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 inline HRESULT IKnownFolder_QueryInterface(IKnownFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IKnownFolder_AddRef(IKnownFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IKnownFolder_Release(IKnownFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IKnownFolder methods ***/
static inline HRESULT IKnownFolder_GetId(IKnownFolder* This,KNOWNFOLDERID *pkfid) {
    return This->lpVtbl->GetId(This,pkfid);
}
static inline HRESULT IKnownFolder_GetCategory(IKnownFolder* This,KF_CATEGORY *pCategory) {
    return This->lpVtbl->GetCategory(This,pCategory);
}
static inline HRESULT IKnownFolder_GetShellItem(IKnownFolder* This,DWORD dwFlags,REFIID riid,void **ppv) {
    return This->lpVtbl->GetShellItem(This,dwFlags,riid,ppv);
}
static inline HRESULT IKnownFolder_GetPath(IKnownFolder* This,DWORD dwFlags,LPWSTR *ppszPath) {
    return This->lpVtbl->GetPath(This,dwFlags,ppszPath);
}
static inline HRESULT IKnownFolder_SetPath(IKnownFolder* This,DWORD dwFlags,LPCWSTR pszPath) {
    return This->lpVtbl->SetPath(This,dwFlags,pszPath);
}
static inline HRESULT IKnownFolder_GetIDList(IKnownFolder* This,DWORD dwFlags,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetIDList(This,dwFlags,ppidl);
}
static inline HRESULT IKnownFolder_GetFolderType(IKnownFolder* This,FOLDERTYPEID *pftid) {
    return This->lpVtbl->GetFolderType(This,pftid);
}
static inline HRESULT IKnownFolder_GetRedirectionCapabilities(IKnownFolder* This,KF_REDIRECTION_CAPABILITIES *pCapabilities) {
    return This->lpVtbl->GetRedirectionCapabilities(This,pCapabilities);
}
static inline 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 inline HRESULT IKnownFolderManager_QueryInterface(IKnownFolderManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IKnownFolderManager_AddRef(IKnownFolderManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IKnownFolderManager_Release(IKnownFolderManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IKnownFolderManager methods ***/
static inline HRESULT IKnownFolderManager_FolderIdFromCsidl(IKnownFolderManager* This,int nCsidl,KNOWNFOLDERID *pfid) {
    return This->lpVtbl->FolderIdFromCsidl(This,nCsidl,pfid);
}
static inline HRESULT IKnownFolderManager_FolderIdToCsidl(IKnownFolderManager* This,REFKNOWNFOLDERID rfid,int *pnCsidl) {
    return This->lpVtbl->FolderIdToCsidl(This,rfid,pnCsidl);
}
static inline HRESULT IKnownFolderManager_GetFolderIds(IKnownFolderManager* This,KNOWNFOLDERID **ppKFId,UINT *pCount) {
    return This->lpVtbl->GetFolderIds(This,ppKFId,pCount);
}
static inline HRESULT IKnownFolderManager_GetFolder(IKnownFolderManager* This,REFKNOWNFOLDERID rfid,IKnownFolder **ppkf) {
    return This->lpVtbl->GetFolder(This,rfid,ppkf);
}
static inline HRESULT IKnownFolderManager_GetFolderByName(IKnownFolderManager* This,LPCWSTR pszCanonicalName,IKnownFolder **ppkf) {
    return This->lpVtbl->GetFolderByName(This,pszCanonicalName,ppkf);
}
static inline HRESULT IKnownFolderManager_RegisterFolder(IKnownFolderManager* This,REFKNOWNFOLDERID rfid,const KNOWNFOLDER_DEFINITION *pKFD) {
    return This->lpVtbl->RegisterFolder(This,rfid,pKFD);
}
static inline HRESULT IKnownFolderManager_UnregisterFolder(IKnownFolderManager* This,REFKNOWNFOLDERID rfid) {
    return This->lpVtbl->UnregisterFolder(This,rfid);
}
static inline HRESULT IKnownFolderManager_FindFolderFromPath(IKnownFolderManager* This,LPCWSTR pszPath,FFFP_MODE mode,IKnownFolder **ppkf) {
    return This->lpVtbl->FindFolderFromPath(This,pszPath,mode,ppkf);
}
static inline HRESULT IKnownFolderManager_FindFolderFromIDList(IKnownFolderManager* This,PCIDLIST_ABSOLUTE pidl,IKnownFolder **ppkf) {
    return This->lpVtbl->FindFolderFromIDList(This,pidl,ppkf);
}
static inline 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 inline HRESULT ISharingConfigurationManager_QueryInterface(ISharingConfigurationManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISharingConfigurationManager_AddRef(ISharingConfigurationManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISharingConfigurationManager_Release(ISharingConfigurationManager* This) {
    return This->lpVtbl->Release(This);
}
/*** ISharingConfigurationManager methods ***/
static inline HRESULT ISharingConfigurationManager_CreateShare(ISharingConfigurationManager* This,DEF_SHARE_ID dsid,SHARE_ROLE role) {
    return This->lpVtbl->CreateShare(This,dsid,role);
}
static inline HRESULT ISharingConfigurationManager_DeleteShare(ISharingConfigurationManager* This,DEF_SHARE_ID dsid) {
    return This->lpVtbl->DeleteShare(This,dsid);
}
static inline HRESULT ISharingConfigurationManager_ShareExists(ISharingConfigurationManager* This,DEF_SHARE_ID dsid) {
    return This->lpVtbl->ShareExists(This,dsid);
}
static inline HRESULT ISharingConfigurationManager_GetSharePermissions(ISharingConfigurationManager* This,DEF_SHARE_ID dsid,SHARE_ROLE *pRole) {
    return This->lpVtbl->GetSharePermissions(This,dsid,pRole);
}
static inline HRESULT ISharingConfigurationManager_SharePrinters(ISharingConfigurationManager* This) {
    return This->lpVtbl->SharePrinters(This);
}
static inline HRESULT ISharingConfigurationManager_StopSharingPrinters(ISharingConfigurationManager* This) {
    return This->lpVtbl->StopSharingPrinters(This);
}
static inline 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 inline HRESULT IPreviousVersionsInfo_QueryInterface(IPreviousVersionsInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPreviousVersionsInfo_AddRef(IPreviousVersionsInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPreviousVersionsInfo_Release(IPreviousVersionsInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IPreviousVersionsInfo methods ***/
static inline 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 inline HRESULT IRelatedItem_QueryInterface(IRelatedItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IRelatedItem_AddRef(IRelatedItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IRelatedItem_Release(IRelatedItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static inline HRESULT IRelatedItem_GetItemIDList(IRelatedItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static inline 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 inline HRESULT IIdentityName_QueryInterface(IIdentityName* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IIdentityName_AddRef(IIdentityName* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IIdentityName_Release(IIdentityName* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static inline HRESULT IIdentityName_GetItemIDList(IIdentityName* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static inline 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 inline HRESULT IDelegateItem_QueryInterface(IDelegateItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDelegateItem_AddRef(IDelegateItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDelegateItem_Release(IDelegateItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static inline HRESULT IDelegateItem_GetItemIDList(IDelegateItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static inline 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 inline HRESULT ICurrentItem_QueryInterface(ICurrentItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICurrentItem_AddRef(ICurrentItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICurrentItem_Release(ICurrentItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static inline HRESULT ICurrentItem_GetItemIDList(ICurrentItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static inline 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 inline HRESULT ITransferMediumItem_QueryInterface(ITransferMediumItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITransferMediumItem_AddRef(ITransferMediumItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITransferMediumItem_Release(ITransferMediumItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static inline HRESULT ITransferMediumItem_GetItemIDList(ITransferMediumItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static inline 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 inline HRESULT IUseToBrowseItem_QueryInterface(IUseToBrowseItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUseToBrowseItem_AddRef(IUseToBrowseItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUseToBrowseItem_Release(IUseToBrowseItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static inline HRESULT IUseToBrowseItem_GetItemIDList(IUseToBrowseItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static inline 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 inline HRESULT IDisplayItem_QueryInterface(IDisplayItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDisplayItem_AddRef(IDisplayItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDisplayItem_Release(IDisplayItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static inline HRESULT IDisplayItem_GetItemIDList(IDisplayItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static inline 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 inline HRESULT IViewStateIdentityItem_QueryInterface(IViewStateIdentityItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IViewStateIdentityItem_AddRef(IViewStateIdentityItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IViewStateIdentityItem_Release(IViewStateIdentityItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static inline HRESULT IViewStateIdentityItem_GetItemIDList(IViewStateIdentityItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static inline 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 inline HRESULT IPreviewItem_QueryInterface(IPreviewItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPreviewItem_AddRef(IPreviewItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPreviewItem_Release(IPreviewItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IRelatedItem methods ***/
static inline HRESULT IPreviewItem_GetItemIDList(IPreviewItem* This,PIDLIST_ABSOLUTE *ppidl) {
    return This->lpVtbl->GetItemIDList(This,ppidl);
}
static inline 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 inline HRESULT IDestinationStreamFactory_QueryInterface(IDestinationStreamFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDestinationStreamFactory_AddRef(IDestinationStreamFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDestinationStreamFactory_Release(IDestinationStreamFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDestinationStreamFactory methods ***/
static inline 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 inline HRESULT INewMenuClient_QueryInterface(INewMenuClient* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INewMenuClient_AddRef(INewMenuClient* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INewMenuClient_Release(INewMenuClient* This) {
    return This->lpVtbl->Release(This);
}
/*** INewMenuClient methods ***/
static inline HRESULT INewMenuClient_IncludeItems(INewMenuClient* This,NMCII_FLAGS *pflags) {
    return This->lpVtbl->IncludeItems(This,pflags);
}
static inline 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 inline HRESULT IInitializeWithBindCtx_QueryInterface(IInitializeWithBindCtx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IInitializeWithBindCtx_AddRef(IInitializeWithBindCtx* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IInitializeWithBindCtx_Release(IInitializeWithBindCtx* This) {
    return This->lpVtbl->Release(This);
}
/*** IInitializeWithBindCtx methods ***/
static inline 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 inline HRESULT IShellItemFilter_QueryInterface(IShellItemFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellItemFilter_AddRef(IShellItemFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellItemFilter_Release(IShellItemFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellItemFilter methods ***/
static inline HRESULT IShellItemFilter_IncludeItem(IShellItemFilter* This,IShellItem *psi) {
    return This->lpVtbl->IncludeItem(This,psi);
}
static inline 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 inline HRESULT INameSpaceTreeControl_QueryInterface(INameSpaceTreeControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INameSpaceTreeControl_AddRef(INameSpaceTreeControl* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INameSpaceTreeControl_Release(INameSpaceTreeControl* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeControl methods ***/
static inline HRESULT INameSpaceTreeControl_Initialize(INameSpaceTreeControl* This,HWND hwndParent,RECT *prc,NSTCSTYLE nsctsFlags) {
    return This->lpVtbl->Initialize(This,hwndParent,prc,nsctsFlags);
}
static inline HRESULT INameSpaceTreeControl_TreeAdvise(INameSpaceTreeControl* This,IUnknown *punk,DWORD *pdwCookie) {
    return This->lpVtbl->TreeAdvise(This,punk,pdwCookie);
}
static inline HRESULT INameSpaceTreeControl_TreeUnadvise(INameSpaceTreeControl* This,DWORD dwCookie) {
    return This->lpVtbl->TreeUnadvise(This,dwCookie);
}
static inline HRESULT INameSpaceTreeControl_AppendRoot(INameSpaceTreeControl* This,IShellItem *psiRoot,SHCONTF grfEnumFlags,NSTCROOTSTYLE grfRootStyle,IShellItemFilter *pif) {
    return This->lpVtbl->AppendRoot(This,psiRoot,grfEnumFlags,grfRootStyle,pif);
}
static inline 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 inline HRESULT INameSpaceTreeControl_RemoveRoot(INameSpaceTreeControl* This,IShellItem *psiRoot) {
    return This->lpVtbl->RemoveRoot(This,psiRoot);
}
static inline HRESULT INameSpaceTreeControl_RemoveAllRoots(INameSpaceTreeControl* This) {
    return This->lpVtbl->RemoveAllRoots(This);
}
static inline HRESULT INameSpaceTreeControl_GetRootItems(INameSpaceTreeControl* This,IShellItemArray **ppsiaRootItems) {
    return This->lpVtbl->GetRootItems(This,ppsiaRootItems);
}
static inline HRESULT INameSpaceTreeControl_SetItemState(INameSpaceTreeControl* This,IShellItem *psi,NSTCITEMSTATE nstcisMask,NSTCITEMSTATE nstcisFlags) {
    return This->lpVtbl->SetItemState(This,psi,nstcisMask,nstcisFlags);
}
static inline HRESULT INameSpaceTreeControl_GetItemState(INameSpaceTreeControl* This,IShellItem *psi,NSTCITEMSTATE nstcisMask,NSTCITEMSTATE *pnstcisFlags) {
    return This->lpVtbl->GetItemState(This,psi,nstcisMask,pnstcisFlags);
}
static inline HRESULT INameSpaceTreeControl_GetSelectedItems(INameSpaceTreeControl* This,IShellItemArray **psiaItems) {
    return This->lpVtbl->GetSelectedItems(This,psiaItems);
}
static inline HRESULT INameSpaceTreeControl_GetItemCustomState(INameSpaceTreeControl* This,IShellItem *psi,int *piStateNumber) {
    return This->lpVtbl->GetItemCustomState(This,psi,piStateNumber);
}
static inline HRESULT INameSpaceTreeControl_SetItemCustomState(INameSpaceTreeControl* This,IShellItem *psi,int iStateNumber) {
    return This->lpVtbl->SetItemCustomState(This,psi,iStateNumber);
}
static inline HRESULT INameSpaceTreeControl_EnsureItemVisible(INameSpaceTreeControl* This,IShellItem *psi) {
    return This->lpVtbl->EnsureItemVisible(This,psi);
}
static inline HRESULT INameSpaceTreeControl_SetTheme(INameSpaceTreeControl* This,LPCWSTR pszTheme) {
    return This->lpVtbl->SetTheme(This,pszTheme);
}
static inline HRESULT INameSpaceTreeControl_GetNextItem(INameSpaceTreeControl* This,IShellItem *psi,NSTCGNI nstcgi,IShellItem **ppsiNext) {
    return This->lpVtbl->GetNextItem(This,psi,nstcgi,ppsiNext);
}
static inline HRESULT INameSpaceTreeControl_HitTest(INameSpaceTreeControl* This,POINT *ppt,IShellItem **ppsiOut) {
    return This->lpVtbl->HitTest(This,ppt,ppsiOut);
}
static inline HRESULT INameSpaceTreeControl_GetItemRect(INameSpaceTreeControl* This,IShellItem *psi,RECT *prect) {
    return This->lpVtbl->GetItemRect(This,psi,prect);
}
static inline 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 inline HRESULT INameSpaceTreeControl2_QueryInterface(INameSpaceTreeControl2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INameSpaceTreeControl2_AddRef(INameSpaceTreeControl2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INameSpaceTreeControl2_Release(INameSpaceTreeControl2* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeControl methods ***/
static inline HRESULT INameSpaceTreeControl2_Initialize(INameSpaceTreeControl2* This,HWND hwndParent,RECT *prc,NSTCSTYLE nsctsFlags) {
    return This->lpVtbl->Initialize(This,hwndParent,prc,nsctsFlags);
}
static inline HRESULT INameSpaceTreeControl2_TreeAdvise(INameSpaceTreeControl2* This,IUnknown *punk,DWORD *pdwCookie) {
    return This->lpVtbl->TreeAdvise(This,punk,pdwCookie);
}
static inline HRESULT INameSpaceTreeControl2_TreeUnadvise(INameSpaceTreeControl2* This,DWORD dwCookie) {
    return This->lpVtbl->TreeUnadvise(This,dwCookie);
}
static inline HRESULT INameSpaceTreeControl2_AppendRoot(INameSpaceTreeControl2* This,IShellItem *psiRoot,SHCONTF grfEnumFlags,NSTCROOTSTYLE grfRootStyle,IShellItemFilter *pif) {
    return This->lpVtbl->AppendRoot(This,psiRoot,grfEnumFlags,grfRootStyle,pif);
}
static inline 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 inline HRESULT INameSpaceTreeControl2_RemoveRoot(INameSpaceTreeControl2* This,IShellItem *psiRoot) {
    return This->lpVtbl->RemoveRoot(This,psiRoot);
}
static inline HRESULT INameSpaceTreeControl2_RemoveAllRoots(INameSpaceTreeControl2* This) {
    return This->lpVtbl->RemoveAllRoots(This);
}
static inline HRESULT INameSpaceTreeControl2_GetRootItems(INameSpaceTreeControl2* This,IShellItemArray **ppsiaRootItems) {
    return This->lpVtbl->GetRootItems(This,ppsiaRootItems);
}
static inline HRESULT INameSpaceTreeControl2_SetItemState(INameSpaceTreeControl2* This,IShellItem *psi,NSTCITEMSTATE nstcisMask,NSTCITEMSTATE nstcisFlags) {
    return This->lpVtbl->SetItemState(This,psi,nstcisMask,nstcisFlags);
}
static inline HRESULT INameSpaceTreeControl2_GetItemState(INameSpaceTreeControl2* This,IShellItem *psi,NSTCITEMSTATE nstcisMask,NSTCITEMSTATE *pnstcisFlags) {
    return This->lpVtbl->GetItemState(This,psi,nstcisMask,pnstcisFlags);
}
static inline HRESULT INameSpaceTreeControl2_GetSelectedItems(INameSpaceTreeControl2* This,IShellItemArray **psiaItems) {
    return This->lpVtbl->GetSelectedItems(This,psiaItems);
}
static inline HRESULT INameSpaceTreeControl2_GetItemCustomState(INameSpaceTreeControl2* This,IShellItem *psi,int *piStateNumber) {
    return This->lpVtbl->GetItemCustomState(This,psi,piStateNumber);
}
static inline HRESULT INameSpaceTreeControl2_SetItemCustomState(INameSpaceTreeControl2* This,IShellItem *psi,int iStateNumber) {
    return This->lpVtbl->SetItemCustomState(This,psi,iStateNumber);
}
static inline HRESULT INameSpaceTreeControl2_EnsureItemVisible(INameSpaceTreeControl2* This,IShellItem *psi) {
    return This->lpVtbl->EnsureItemVisible(This,psi);
}
static inline HRESULT INameSpaceTreeControl2_SetTheme(INameSpaceTreeControl2* This,LPCWSTR pszTheme) {
    return This->lpVtbl->SetTheme(This,pszTheme);
}
static inline HRESULT INameSpaceTreeControl2_GetNextItem(INameSpaceTreeControl2* This,IShellItem *psi,NSTCGNI nstcgi,IShellItem **ppsiNext) {
    return This->lpVtbl->GetNextItem(This,psi,nstcgi,ppsiNext);
}
static inline HRESULT INameSpaceTreeControl2_HitTest(INameSpaceTreeControl2* This,POINT *ppt,IShellItem **ppsiOut) {
    return This->lpVtbl->HitTest(This,ppt,ppsiOut);
}
static inline HRESULT INameSpaceTreeControl2_GetItemRect(INameSpaceTreeControl2* This,IShellItem *psi,RECT *prect) {
    return This->lpVtbl->GetItemRect(This,psi,prect);
}
static inline HRESULT INameSpaceTreeControl2_CollapseAll(INameSpaceTreeControl2* This) {
    return This->lpVtbl->CollapseAll(This);
}
/*** INameSpaceTreeControl2 methods ***/
static inline HRESULT INameSpaceTreeControl2_SetControlStyle(INameSpaceTreeControl2* This,NSTCSTYLE nstcsMask,NSTCSTYLE nstcsStyle) {
    return This->lpVtbl->SetControlStyle(This,nstcsMask,nstcsStyle);
}
static inline HRESULT INameSpaceTreeControl2_GetControlStyle(INameSpaceTreeControl2* This,NSTCSTYLE nstcsMask,NSTCSTYLE *pnstcsStyle) {
    return This->lpVtbl->GetControlStyle(This,nstcsMask,pnstcsStyle);
}
static inline HRESULT INameSpaceTreeControl2_SetControlStyle2(INameSpaceTreeControl2* This,NSTCSTYLE2 nstcsMask,NSTCSTYLE2 nstcsStyle) {
    return This->lpVtbl->SetControlStyle2(This,nstcsMask,nstcsStyle);
}
static inline 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 inline HRESULT INameSpaceTreeControlEvents_QueryInterface(INameSpaceTreeControlEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INameSpaceTreeControlEvents_AddRef(INameSpaceTreeControlEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INameSpaceTreeControlEvents_Release(INameSpaceTreeControlEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeControlEvents methods ***/
static inline HRESULT INameSpaceTreeControlEvents_OnItemClick(INameSpaceTreeControlEvents* This,IShellItem *psi,NSTCEHITTEST nstceHitTest,NSTCECLICKTYPE nstceClickType) {
    return This->lpVtbl->OnItemClick(This,psi,nstceHitTest,nstceClickType);
}
static inline HRESULT INameSpaceTreeControlEvents_OnPropertyItemCommit(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnPropertyItemCommit(This,psi);
}
static inline HRESULT INameSpaceTreeControlEvents_OnItemStateChanging(INameSpaceTreeControlEvents* This,IShellItem *psi,NSTCITEMSTATE nstcisMask,NSTCITEMSTATE nstcisState) {
    return This->lpVtbl->OnItemStateChanging(This,psi,nstcisMask,nstcisState);
}
static inline HRESULT INameSpaceTreeControlEvents_OnItemStateChanged(INameSpaceTreeControlEvents* This,IShellItem *psi,NSTCITEMSTATE nstcisMask,NSTCITEMSTATE nstcisState) {
    return This->lpVtbl->OnItemStateChanged(This,psi,nstcisMask,nstcisState);
}
static inline HRESULT INameSpaceTreeControlEvents_OnSelectionChanged(INameSpaceTreeControlEvents* This,IShellItemArray *psiaSelection) {
    return This->lpVtbl->OnSelectionChanged(This,psiaSelection);
}
static inline HRESULT INameSpaceTreeControlEvents_OnKeyboardInput(INameSpaceTreeControlEvents* This,UINT uMsg,WPARAM wParam,LPARAM lParam) {
    return This->lpVtbl->OnKeyboardInput(This,uMsg,wParam,lParam);
}
static inline HRESULT INameSpaceTreeControlEvents_OnBeforeExpand(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnBeforeExpand(This,psi);
}
static inline HRESULT INameSpaceTreeControlEvents_OnAfterExpand(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnAfterExpand(This,psi);
}
static inline HRESULT INameSpaceTreeControlEvents_OnBeginLabelEdit(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnBeginLabelEdit(This,psi);
}
static inline HRESULT INameSpaceTreeControlEvents_OnEndLabelEdit(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnEndLabelEdit(This,psi);
}
static inline HRESULT INameSpaceTreeControlEvents_OnGetToolTip(INameSpaceTreeControlEvents* This,IShellItem *psi,LPWSTR pszTip,int cchTip) {
    return This->lpVtbl->OnGetToolTip(This,psi,pszTip,cchTip);
}
static inline HRESULT INameSpaceTreeControlEvents_OnBeforeItemDelete(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnBeforeItemDelete(This,psi);
}
static inline HRESULT INameSpaceTreeControlEvents_OnItemAdded(INameSpaceTreeControlEvents* This,IShellItem *psi,WINBOOL fIsRoot) {
    return This->lpVtbl->OnItemAdded(This,psi,fIsRoot);
}
static inline HRESULT INameSpaceTreeControlEvents_OnItemDeleted(INameSpaceTreeControlEvents* This,IShellItem *psi,WINBOOL fIsRoot) {
    return This->lpVtbl->OnItemDeleted(This,psi,fIsRoot);
}
static inline HRESULT INameSpaceTreeControlEvents_OnBeforeContextMenu(INameSpaceTreeControlEvents* This,IShellItem *psi,REFIID riid,void **ppv) {
    return This->lpVtbl->OnBeforeContextMenu(This,psi,riid,ppv);
}
static inline HRESULT INameSpaceTreeControlEvents_OnAfterContextMenu(INameSpaceTreeControlEvents* This,IShellItem *psi,IContextMenu *pcmIn,REFIID riid,void **ppv) {
    return This->lpVtbl->OnAfterContextMenu(This,psi,pcmIn,riid,ppv);
}
static inline HRESULT INameSpaceTreeControlEvents_OnBeforeStateImageChange(INameSpaceTreeControlEvents* This,IShellItem *psi) {
    return This->lpVtbl->OnBeforeStateImageChange(This,psi);
}
static inline 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 inline HRESULT INameSpaceTreeControlDropHandler_QueryInterface(INameSpaceTreeControlDropHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INameSpaceTreeControlDropHandler_AddRef(INameSpaceTreeControlDropHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INameSpaceTreeControlDropHandler_Release(INameSpaceTreeControlDropHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeControlDropHandler methods ***/
static inline 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 inline HRESULT INameSpaceTreeControlDropHandler_OnDragOver(INameSpaceTreeControlDropHandler* This,IShellItem *psiOver,IShellItemArray *psiaData,DWORD grfKeyState,DWORD *pdwEffect) {
    return This->lpVtbl->OnDragOver(This,psiOver,psiaData,grfKeyState,pdwEffect);
}
static inline HRESULT INameSpaceTreeControlDropHandler_OnDragPosition(INameSpaceTreeControlDropHandler* This,IShellItem *psiOver,IShellItemArray *psiaData,int iNewPosition,int iOldPosition) {
    return This->lpVtbl->OnDragPosition(This,psiOver,psiaData,iNewPosition,iOldPosition);
}
static inline 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 inline HRESULT INameSpaceTreeControlDropHandler_OnDropPosition(INameSpaceTreeControlDropHandler* This,IShellItem *psiOver,IShellItemArray *psiaData,int iNewPosition,int iOldPosition) {
    return This->lpVtbl->OnDropPosition(This,psiOver,psiaData,iNewPosition,iOldPosition);
}
static inline 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 inline HRESULT INameSpaceTreeAccessible_QueryInterface(INameSpaceTreeAccessible* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INameSpaceTreeAccessible_AddRef(INameSpaceTreeAccessible* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INameSpaceTreeAccessible_Release(INameSpaceTreeAccessible* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeAccessible methods ***/
static inline HRESULT INameSpaceTreeAccessible_OnGetDefaultAccessibilityAction(INameSpaceTreeAccessible* This,IShellItem *psi,BSTR *pbstrDefaultAction) {
    return This->lpVtbl->OnGetDefaultAccessibilityAction(This,psi,pbstrDefaultAction);
}
static inline HRESULT INameSpaceTreeAccessible_OnDoDefaultAccessibilityAction(INameSpaceTreeAccessible* This,IShellItem *psi) {
    return This->lpVtbl->OnDoDefaultAccessibilityAction(This,psi);
}
static inline 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 inline HRESULT INameSpaceTreeControlCustomDraw_QueryInterface(INameSpaceTreeControlCustomDraw* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INameSpaceTreeControlCustomDraw_AddRef(INameSpaceTreeControlCustomDraw* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INameSpaceTreeControlCustomDraw_Release(INameSpaceTreeControlCustomDraw* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeControlCustomDraw methods ***/
static inline HRESULT INameSpaceTreeControlCustomDraw_PrePaint(INameSpaceTreeControlCustomDraw* This,HDC hdc,RECT *prc,LRESULT *plres) {
    return This->lpVtbl->PrePaint(This,hdc,prc,plres);
}
static inline HRESULT INameSpaceTreeControlCustomDraw_PostPaint(INameSpaceTreeControlCustomDraw* This,HDC hdc,RECT *prc) {
    return This->lpVtbl->PostPaint(This,hdc,prc);
}
static inline 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 inline 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 inline HRESULT INameSpaceTreeControlFolderCapabilities_QueryInterface(INameSpaceTreeControlFolderCapabilities* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INameSpaceTreeControlFolderCapabilities_AddRef(INameSpaceTreeControlFolderCapabilities* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INameSpaceTreeControlFolderCapabilities_Release(INameSpaceTreeControlFolderCapabilities* This) {
    return This->lpVtbl->Release(This);
}
/*** INameSpaceTreeControlFolderCapabilities methods ***/
static inline 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 inline HRESULT IPreviewHandler_QueryInterface(IPreviewHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPreviewHandler_AddRef(IPreviewHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPreviewHandler_Release(IPreviewHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IPreviewHandler methods ***/
static inline HRESULT IPreviewHandler_SetWindow(IPreviewHandler* This,HWND hwnd,const RECT *prc) {
    return This->lpVtbl->SetWindow(This,hwnd,prc);
}
static inline HRESULT IPreviewHandler_SetRect(IPreviewHandler* This,const RECT *prc) {
    return This->lpVtbl->SetRect(This,prc);
}
static inline HRESULT IPreviewHandler_DoPreview(IPreviewHandler* This) {
    return This->lpVtbl->DoPreview(This);
}
static inline HRESULT IPreviewHandler_Unload(IPreviewHandler* This) {
    return This->lpVtbl->Unload(This);
}
static inline HRESULT IPreviewHandler_SetFocus(IPreviewHandler* This) {
    return This->lpVtbl->SetFocus(This);
}
static inline HRESULT IPreviewHandler_QueryFocus(IPreviewHandler* This,HWND *phwnd) {
    return This->lpVtbl->QueryFocus(This,phwnd);
}
static inline 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 inline HRESULT IPreviewHandlerFrame_QueryInterface(IPreviewHandlerFrame* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPreviewHandlerFrame_AddRef(IPreviewHandlerFrame* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPreviewHandlerFrame_Release(IPreviewHandlerFrame* This) {
    return This->lpVtbl->Release(This);
}
/*** IPreviewHandlerFrame methods ***/
static inline HRESULT IPreviewHandlerFrame_GetWindowContext(IPreviewHandlerFrame* This,PREVIEWHANDLERFRAMEINFO *pinfo) {
    return This->lpVtbl->GetWindowContext(This,pinfo);
}
static inline 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 inline HRESULT ITrayDeskBand_QueryInterface(ITrayDeskBand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ITrayDeskBand_AddRef(ITrayDeskBand* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ITrayDeskBand_Release(ITrayDeskBand* This) {
    return This->lpVtbl->Release(This);
}
/*** ITrayDeskBand methods ***/
static inline HRESULT ITrayDeskBand_ShowDeskBand(ITrayDeskBand* This,REFCLSID clsid) {
    return This->lpVtbl->ShowDeskBand(This,clsid);
}
static inline HRESULT ITrayDeskBand_HideDeskBand(ITrayDeskBand* This,REFCLSID clsid) {
    return This->lpVtbl->HideDeskBand(This,clsid);
}
static inline HRESULT ITrayDeskBand_IsDeskBandShown(ITrayDeskBand* This,REFCLSID clsid) {
    return This->lpVtbl->IsDeskBandShown(This,clsid);
}
static inline 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 inline HRESULT IBandHost_QueryInterface(IBandHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IBandHost_AddRef(IBandHost* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IBandHost_Release(IBandHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IBandHost methods ***/
static inline 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 inline HRESULT IBandHost_SetBandAvailability(IBandHost* This,REFCLSID rclsidBand,WINBOOL fAvailable) {
    return This->lpVtbl->SetBandAvailability(This,rclsidBand,fAvailable);
}
static inline 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 inline HRESULT IExplorerPaneVisibility_QueryInterface(IExplorerPaneVisibility* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IExplorerPaneVisibility_AddRef(IExplorerPaneVisibility* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IExplorerPaneVisibility_Release(IExplorerPaneVisibility* This) {
    return This->lpVtbl->Release(This);
}
/*** IExplorerPaneVisibility methods ***/
static inline 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 inline HRESULT IContextMenuCB_QueryInterface(IContextMenuCB* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IContextMenuCB_AddRef(IContextMenuCB* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IContextMenuCB_Release(IContextMenuCB* This) {
    return This->lpVtbl->Release(This);
}
/*** IContextMenuCB methods ***/
static inline 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 inline HRESULT IDefaultExtractIconInit_QueryInterface(IDefaultExtractIconInit* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDefaultExtractIconInit_AddRef(IDefaultExtractIconInit* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDefaultExtractIconInit_Release(IDefaultExtractIconInit* This) {
    return This->lpVtbl->Release(This);
}
/*** IDefaultExtractIconInit methods ***/
static inline HRESULT IDefaultExtractIconInit_SetFlags(IDefaultExtractIconInit* This,UINT uFlags) {
    return This->lpVtbl->SetFlags(This,uFlags);
}
static inline HRESULT IDefaultExtractIconInit_SetKey(IDefaultExtractIconInit* This,HKEY hkey) {
    return This->lpVtbl->SetKey(This,hkey);
}
static inline HRESULT IDefaultExtractIconInit_SetNormalIcon(IDefaultExtractIconInit* This,LPCWSTR pszFile,int iIcon) {
    return This->lpVtbl->SetNormalIcon(This,pszFile,iIcon);
}
static inline HRESULT IDefaultExtractIconInit_SetOpenIcon(IDefaultExtractIconInit* This,LPCWSTR pszFile,int iIcon) {
    return This->lpVtbl->SetOpenIcon(This,pszFile,iIcon);
}
static inline HRESULT IDefaultExtractIconInit_SetShortcutIcon(IDefaultExtractIconInit* This,LPCWSTR pszFile,int iIcon) {
    return This->lpVtbl->SetShortcutIcon(This,pszFile,iIcon);
}
static inline 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 inline HRESULT IExplorerCommand_QueryInterface(IExplorerCommand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IExplorerCommand_AddRef(IExplorerCommand* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IExplorerCommand_Release(IExplorerCommand* This) {
    return This->lpVtbl->Release(This);
}
/*** IExplorerCommand methods ***/
static inline HRESULT IExplorerCommand_GetTitle(IExplorerCommand* This,IShellItemArray *psiItemArray,LPWSTR *ppszName) {
    return This->lpVtbl->GetTitle(This,psiItemArray,ppszName);
}
static inline HRESULT IExplorerCommand_GetIcon(IExplorerCommand* This,IShellItemArray *psiItemArray,LPWSTR *ppszIcon) {
    return This->lpVtbl->GetIcon(This,psiItemArray,ppszIcon);
}
static inline HRESULT IExplorerCommand_GetToolTip(IExplorerCommand* This,IShellItemArray *psiItemArray,LPWSTR *ppszInfotip) {
    return This->lpVtbl->GetToolTip(This,psiItemArray,ppszInfotip);
}
static inline HRESULT IExplorerCommand_GetCanonicalName(IExplorerCommand* This,GUID *pguidCommandName) {
    return This->lpVtbl->GetCanonicalName(This,pguidCommandName);
}
static inline HRESULT IExplorerCommand_GetState(IExplorerCommand* This,IShellItemArray *psiItemArray,WINBOOL fOkToBeSlow,EXPCMDSTATE *pCmdState) {
    return This->lpVtbl->GetState(This,psiItemArray,fOkToBeSlow,pCmdState);
}
static inline HRESULT IExplorerCommand_Invoke(IExplorerCommand* This,IShellItemArray *psiItemArray,IBindCtx *pbc) {
    return This->lpVtbl->Invoke(This,psiItemArray,pbc);
}
static inline HRESULT IExplorerCommand_GetFlags(IExplorerCommand* This,EXPCMDFLAGS *pFlags) {
    return This->lpVtbl->GetFlags(This,pFlags);
}
static inline 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 inline HRESULT IExplorerCommandState_QueryInterface(IExplorerCommandState* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IExplorerCommandState_AddRef(IExplorerCommandState* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IExplorerCommandState_Release(IExplorerCommandState* This) {
    return This->lpVtbl->Release(This);
}
/*** IExplorerCommandState methods ***/
static inline 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 inline HRESULT IInitializeCommand_QueryInterface(IInitializeCommand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IInitializeCommand_AddRef(IInitializeCommand* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IInitializeCommand_Release(IInitializeCommand* This) {
    return This->lpVtbl->Release(This);
}
/*** IInitializeCommand methods ***/
static inline 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 inline HRESULT IEnumExplorerCommand_QueryInterface(IEnumExplorerCommand* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IEnumExplorerCommand_AddRef(IEnumExplorerCommand* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IEnumExplorerCommand_Release(IEnumExplorerCommand* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumExplorerCommand methods ***/
static inline HRESULT IEnumExplorerCommand_Next(IEnumExplorerCommand* This,ULONG celt,IExplorerCommand **pUICommand,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,pUICommand,pceltFetched);
}
static inline HRESULT IEnumExplorerCommand_Skip(IEnumExplorerCommand* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static inline HRESULT IEnumExplorerCommand_Reset(IEnumExplorerCommand* This) {
    return This->lpVtbl->Reset(This);
}
static inline 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 inline HRESULT IExplorerCommandProvider_QueryInterface(IExplorerCommandProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IExplorerCommandProvider_AddRef(IExplorerCommandProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IExplorerCommandProvider_Release(IExplorerCommandProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IExplorerCommandProvider methods ***/
static inline HRESULT IExplorerCommandProvider_GetCommands(IExplorerCommandProvider* This,IUnknown *punkSite,REFIID riid,void **ppv) {
    return This->lpVtbl->GetCommands(This,punkSite,riid,ppv);
}
static inline 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 inline HRESULT IInitializeNetworkFolder_QueryInterface(IInitializeNetworkFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IInitializeNetworkFolder_AddRef(IInitializeNetworkFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IInitializeNetworkFolder_Release(IInitializeNetworkFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IInitializeNetworkFolder methods ***/
static inline 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 inline HRESULT IOpenControlPanel_QueryInterface(IOpenControlPanel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IOpenControlPanel_AddRef(IOpenControlPanel* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IOpenControlPanel_Release(IOpenControlPanel* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpenControlPanel methods ***/
static inline HRESULT IOpenControlPanel_Open(IOpenControlPanel* This,LPCWSTR pszName,LPCWSTR pszPage,IUnknown *punkSite) {
    return This->lpVtbl->Open(This,pszName,pszPage,punkSite);
}
static inline HRESULT IOpenControlPanel_GetPath(IOpenControlPanel* This,LPCWSTR pszName,LPWSTR pszPath,UINT cchPath) {
    return This->lpVtbl->GetPath(This,pszName,pszPath,cchPath);
}
static inline 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 inline HRESULT IComputerInfoChangeNotify_QueryInterface(IComputerInfoChangeNotify* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IComputerInfoChangeNotify_AddRef(IComputerInfoChangeNotify* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IComputerInfoChangeNotify_Release(IComputerInfoChangeNotify* This) {
    return This->lpVtbl->Release(This);
}
/*** IComputerInfoChangeNotify methods ***/
static inline 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 inline HRESULT IFileSystemBindData_QueryInterface(IFileSystemBindData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileSystemBindData_AddRef(IFileSystemBindData* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileSystemBindData_Release(IFileSystemBindData* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileSystemBindData methods ***/
static inline HRESULT IFileSystemBindData_SetFindData(IFileSystemBindData* This,const WIN32_FIND_DATAW *pfd) {
    return This->lpVtbl->SetFindData(This,pfd);
}
static inline 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 inline HRESULT IFileSystemBindData2_QueryInterface(IFileSystemBindData2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFileSystemBindData2_AddRef(IFileSystemBindData2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFileSystemBindData2_Release(IFileSystemBindData2* This) {
    return This->lpVtbl->Release(This);
}
/*** IFileSystemBindData methods ***/
static inline HRESULT IFileSystemBindData2_SetFindData(IFileSystemBindData2* This,const WIN32_FIND_DATAW *pfd) {
    return This->lpVtbl->SetFindData(This,pfd);
}
static inline HRESULT IFileSystemBindData2_GetFindData(IFileSystemBindData2* This,WIN32_FIND_DATAW *pfd) {
    return This->lpVtbl->GetFindData(This,pfd);
}
/*** IFileSystemBindData2 methods ***/
static inline HRESULT IFileSystemBindData2_SetFileID(IFileSystemBindData2* This,LARGE_INTEGER liFileID) {
    return This->lpVtbl->SetFileID(This,liFileID);
}
static inline HRESULT IFileSystemBindData2_GetFileID(IFileSystemBindData2* This,LARGE_INTEGER *pliFileID) {
    return This->lpVtbl->GetFileID(This,pliFileID);
}
static inline HRESULT IFileSystemBindData2_SetJunctionCLSID(IFileSystemBindData2* This,REFCLSID clsid) {
    return This->lpVtbl->SetJunctionCLSID(This,clsid);
}
static inline 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 inline HRESULT ICustomDestinationList_QueryInterface(ICustomDestinationList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICustomDestinationList_AddRef(ICustomDestinationList* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICustomDestinationList_Release(ICustomDestinationList* This) {
    return This->lpVtbl->Release(This);
}
/*** ICustomDestinationList methods ***/
static inline HRESULT ICustomDestinationList_SetAppID(ICustomDestinationList* This,LPCWSTR pszAppID) {
    return This->lpVtbl->SetAppID(This,pszAppID);
}
static inline HRESULT ICustomDestinationList_BeginList(ICustomDestinationList* This,UINT *pcMinSlots,REFIID riid,void **ppv) {
    return This->lpVtbl->BeginList(This,pcMinSlots,riid,ppv);
}
static inline HRESULT ICustomDestinationList_AppendCategory(ICustomDestinationList* This,LPCWSTR pszCategory,IObjectArray *poa) {
    return This->lpVtbl->AppendCategory(This,pszCategory,poa);
}
static inline HRESULT ICustomDestinationList_AppendKnownCategory(ICustomDestinationList* This,KNOWNDESTCATEGORY category) {
    return This->lpVtbl->AppendKnownCategory(This,category);
}
static inline HRESULT ICustomDestinationList_AddUserTasks(ICustomDestinationList* This,IObjectArray *poa) {
    return This->lpVtbl->AddUserTasks(This,poa);
}
static inline HRESULT ICustomDestinationList_CommitList(ICustomDestinationList* This) {
    return This->lpVtbl->CommitList(This);
}
static inline HRESULT ICustomDestinationList_GetRemovedDestinations(ICustomDestinationList* This,REFIID riid,void **ppv) {
    return This->lpVtbl->GetRemovedDestinations(This,riid,ppv);
}
static inline HRESULT ICustomDestinationList_DeleteList(ICustomDestinationList* This,LPCWSTR pszAppID) {
    return This->lpVtbl->DeleteList(This,pszAppID);
}
static inline 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 inline HRESULT IApplicationDestinations_QueryInterface(IApplicationDestinations* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IApplicationDestinations_AddRef(IApplicationDestinations* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IApplicationDestinations_Release(IApplicationDestinations* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationDestinations methods ***/
static inline HRESULT IApplicationDestinations_SetAppID(IApplicationDestinations* This,LPCWSTR pszAppID) {
    return This->lpVtbl->SetAppID(This,pszAppID);
}
static inline HRESULT IApplicationDestinations_RemoveDestination(IApplicationDestinations* This,IUnknown *punk) {
    return This->lpVtbl->RemoveDestination(This,punk);
}
static inline 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 inline HRESULT IApplicationDocumentLists_QueryInterface(IApplicationDocumentLists* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IApplicationDocumentLists_AddRef(IApplicationDocumentLists* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IApplicationDocumentLists_Release(IApplicationDocumentLists* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationDocumentLists methods ***/
static inline HRESULT IApplicationDocumentLists_SetAppID(IApplicationDocumentLists* This,LPCWSTR pszAppID) {
    return This->lpVtbl->SetAppID(This,pszAppID);
}
static inline 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 inline HRESULT IObjectWithAppUserModelID_QueryInterface(IObjectWithAppUserModelID* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IObjectWithAppUserModelID_AddRef(IObjectWithAppUserModelID* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IObjectWithAppUserModelID_Release(IObjectWithAppUserModelID* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectWithAppUserModelID methods ***/
static inline HRESULT IObjectWithAppUserModelID_SetAppID(IObjectWithAppUserModelID* This,LPCWSTR pszAppID) {
    return This->lpVtbl->SetAppID(This,pszAppID);
}
static inline 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 inline HRESULT IObjectWithProgID_QueryInterface(IObjectWithProgID* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IObjectWithProgID_AddRef(IObjectWithProgID* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IObjectWithProgID_Release(IObjectWithProgID* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectWithProgID methods ***/
static inline HRESULT IObjectWithProgID_SetProgID(IObjectWithProgID* This,LPCWSTR pszProgID) {
    return This->lpVtbl->SetProgID(This,pszProgID);
}
static inline 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 inline HRESULT IUpdateIDList_QueryInterface(IUpdateIDList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUpdateIDList_AddRef(IUpdateIDList* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUpdateIDList_Release(IUpdateIDList* This) {
    return This->lpVtbl->Release(This);
}
/*** IUpdateIDList methods ***/
static inline 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 inline HRESULT IDesktopGadget_QueryInterface(IDesktopGadget* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDesktopGadget_AddRef(IDesktopGadget* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDesktopGadget_Release(IDesktopGadget* This) {
    return This->lpVtbl->Release(This);
}
/*** IDesktopGadget methods ***/
static inline HRESULT IDesktopGadget_RunGadget(IDesktopGadget* This,LPCWSTR gadgetPath) {
    return This->lpVtbl->RunGadget(This,gadgetPath);
}
#endif
#endif

#endif


#endif  /* __IDesktopGadget_INTERFACE_DEFINED__ */


#if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD)
/*****************************************************************************
 * IVirtualDesktopManager interface
 */
#ifndef __IVirtualDesktopManager_INTERFACE_DEFINED__
#define __IVirtualDesktopManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVirtualDesktopManager, 0xa5cd92ff, 0x29be, 0x454c, 0x8d,0x04, 0xd8,0x28,0x79,0xfb,0x3f,0x1b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a5cd92ff-29be-454c-8d04-d82879fb3f1b")
IVirtualDesktopManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE IsWindowOnCurrentVirtualDesktop(
        HWND topLevelWindow,
        WINBOOL *onCurrentDesktop) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWindowDesktopId(
        HWND topLevelWindow,
        GUID *desktopId) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveWindowToDesktop(
        HWND topLevelWindow,
        REFGUID desktopId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVirtualDesktopManager, 0xa5cd92ff, 0x29be, 0x454c, 0x8d,0x04, 0xd8,0x28,0x79,0xfb,0x3f,0x1b)
#endif
#else
typedef struct IVirtualDesktopManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVirtualDesktopManager methods ***/
    HRESULT (STDMETHODCALLTYPE *IsWindowOnCurrentVirtualDesktop)(
        IVirtualDesktopManager *This,
        HWND topLevelWindow,
        WINBOOL *onCurrentDesktop);

    HRESULT (STDMETHODCALLTYPE *GetWindowDesktopId)(
        IVirtualDesktopManager *This,
        HWND topLevelWindow,
        GUID *desktopId);

    HRESULT (STDMETHODCALLTYPE *MoveWindowToDesktop)(
        IVirtualDesktopManager *This,
        HWND topLevelWindow,
        REFGUID desktopId);

    END_INTERFACE
} IVirtualDesktopManagerVtbl;

interface IVirtualDesktopManager {
    CONST_VTBL IVirtualDesktopManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVirtualDesktopManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVirtualDesktopManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVirtualDesktopManager_Release(This) (This)->lpVtbl->Release(This)
/*** IVirtualDesktopManager methods ***/
#define IVirtualDesktopManager_IsWindowOnCurrentVirtualDesktop(This,topLevelWindow,onCurrentDesktop) (This)->lpVtbl->IsWindowOnCurrentVirtualDesktop(This,topLevelWindow,onCurrentDesktop)
#define IVirtualDesktopManager_GetWindowDesktopId(This,topLevelWindow,desktopId) (This)->lpVtbl->GetWindowDesktopId(This,topLevelWindow,desktopId)
#define IVirtualDesktopManager_MoveWindowToDesktop(This,topLevelWindow,desktopId) (This)->lpVtbl->MoveWindowToDesktop(This,topLevelWindow,desktopId)
#else
/*** IUnknown methods ***/
static inline HRESULT IVirtualDesktopManager_QueryInterface(IVirtualDesktopManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVirtualDesktopManager_AddRef(IVirtualDesktopManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVirtualDesktopManager_Release(IVirtualDesktopManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IVirtualDesktopManager methods ***/
static inline HRESULT IVirtualDesktopManager_IsWindowOnCurrentVirtualDesktop(IVirtualDesktopManager* This,HWND topLevelWindow,WINBOOL *onCurrentDesktop) {
    return This->lpVtbl->IsWindowOnCurrentVirtualDesktop(This,topLevelWindow,onCurrentDesktop);
}
static inline HRESULT IVirtualDesktopManager_GetWindowDesktopId(IVirtualDesktopManager* This,HWND topLevelWindow,GUID *desktopId) {
    return This->lpVtbl->GetWindowDesktopId(This,topLevelWindow,desktopId);
}
static inline HRESULT IVirtualDesktopManager_MoveWindowToDesktop(IVirtualDesktopManager* This,HWND topLevelWindow,REFGUID desktopId) {
    return This->lpVtbl->MoveWindowToDesktop(This,topLevelWindow,desktopId);
}
#endif
#endif

#endif


#endif  /* __IVirtualDesktopManager_INTERFACE_DEFINED__ */

#endif

#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 inline HRESULT IDesktopWallpaper_QueryInterface(IDesktopWallpaper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDesktopWallpaper_AddRef(IDesktopWallpaper* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDesktopWallpaper_Release(IDesktopWallpaper* This) {
    return This->lpVtbl->Release(This);
}
/*** IDesktopWallpaper methods ***/
static inline HRESULT IDesktopWallpaper_SetWallpaper(IDesktopWallpaper* This,LPCWSTR monitorID,LPCWSTR wallpaper) {
    return This->lpVtbl->SetWallpaper(This,monitorID,wallpaper);
}
static inline HRESULT IDesktopWallpaper_GetWallpaper(IDesktopWallpaper* This,LPCWSTR monitorID,LPWSTR *wallpaper) {
    return This->lpVtbl->GetWallpaper(This,monitorID,wallpaper);
}
static inline HRESULT IDesktopWallpaper_GetMonitorDevicePathAt(IDesktopWallpaper* This,UINT monitorIndex,LPWSTR *monitorID) {
    return This->lpVtbl->GetMonitorDevicePathAt(This,monitorIndex,monitorID);
}
static inline HRESULT IDesktopWallpaper_GetMonitorDevicePathCount(IDesktopWallpaper* This,UINT *count) {
    return This->lpVtbl->GetMonitorDevicePathCount(This,count);
}
static inline HRESULT IDesktopWallpaper_GetMonitorRECT(IDesktopWallpaper* This,LPCWSTR monitorID,RECT *displayRect) {
    return This->lpVtbl->GetMonitorRECT(This,monitorID,displayRect);
}
static inline HRESULT IDesktopWallpaper_SetBackgroundColor(IDesktopWallpaper* This,COLORREF color) {
    return This->lpVtbl->SetBackgroundColor(This,color);
}
static inline HRESULT IDesktopWallpaper_GetBackgroundColor(IDesktopWallpaper* This,COLORREF *color) {
    return This->lpVtbl->GetBackgroundColor(This,color);
}
static inline HRESULT IDesktopWallpaper_SetPosition(IDesktopWallpaper* This,DESKTOP_WALLPAPER_POSITION position) {
    return This->lpVtbl->SetPosition(This,position);
}
static inline HRESULT IDesktopWallpaper_GetPosition(IDesktopWallpaper* This,DESKTOP_WALLPAPER_POSITION *position) {
    return This->lpVtbl->GetPosition(This,position);
}
static inline HRESULT IDesktopWallpaper_SetSlideshow(IDesktopWallpaper* This,IShellItemArray *items) {
    return This->lpVtbl->SetSlideshow(This,items);
}
static inline HRESULT IDesktopWallpaper_GetSlideshow(IDesktopWallpaper* This,IShellItemArray **items) {
    return This->lpVtbl->GetSlideshow(This,items);
}
static inline HRESULT IDesktopWallpaper_SetSlideshowOptions(IDesktopWallpaper* This,DESKTOP_SLIDESHOW_OPTIONS options,UINT slideshowTick) {
    return This->lpVtbl->SetSlideshowOptions(This,options,slideshowTick);
}
static inline HRESULT IDesktopWallpaper_GetSlideshowOptions(IDesktopWallpaper* This,DESKTOP_SLIDESHOW_OPTIONS *options,UINT *slideshowTick) {
    return This->lpVtbl->GetSlideshowOptions(This,options,slideshowTick);
}
static inline HRESULT IDesktopWallpaper_AdvanceSlideshow(IDesktopWallpaper* This,LPCWSTR monitorID,DESKTOP_SLIDESHOW_DIRECTION direction) {
    return This->lpVtbl->AdvanceSlideshow(This,monitorID,direction);
}
static inline HRESULT IDesktopWallpaper_GetStatus(IDesktopWallpaper* This,DESKTOP_SLIDESHOW_STATE *state) {
    return This->lpVtbl->GetStatus(This,state);
}
static inline 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 inline HRESULT IHomeGroup_QueryInterface(IHomeGroup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IHomeGroup_AddRef(IHomeGroup* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IHomeGroup_Release(IHomeGroup* This) {
    return This->lpVtbl->Release(This);
}
/*** IHomeGroup methods ***/
static inline HRESULT IHomeGroup_IsMember(IHomeGroup* This,WINBOOL *member) {
    return This->lpVtbl->IsMember(This,member);
}
static inline 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 inline HRESULT IInitializeWithPropertyStore_QueryInterface(IInitializeWithPropertyStore* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IInitializeWithPropertyStore_AddRef(IInitializeWithPropertyStore* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IInitializeWithPropertyStore_Release(IInitializeWithPropertyStore* This) {
    return This->lpVtbl->Release(This);
}
/*** IInitializeWithPropertyStore methods ***/
static inline 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 inline HRESULT IOpenSearchSource_QueryInterface(IOpenSearchSource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IOpenSearchSource_AddRef(IOpenSearchSource* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IOpenSearchSource_Release(IOpenSearchSource* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpenSearchSource methods ***/
static inline 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 inline HRESULT IShellLibrary_QueryInterface(IShellLibrary* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IShellLibrary_AddRef(IShellLibrary* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IShellLibrary_Release(IShellLibrary* This) {
    return This->lpVtbl->Release(This);
}
/*** IShellLibrary methods ***/
static inline HRESULT IShellLibrary_LoadLibraryFromItem(IShellLibrary* This,IShellItem *psiLibrary,DWORD grfMode) {
    return This->lpVtbl->LoadLibraryFromItem(This,psiLibrary,grfMode);
}
static inline HRESULT IShellLibrary_LoadLibraryFromKnownFolder(IShellLibrary* This,REFKNOWNFOLDERID kfidLibrary,DWORD grfMode) {
    return This->lpVtbl->LoadLibraryFromKnownFolder(This,kfidLibrary,grfMode);
}
static inline HRESULT IShellLibrary_AddFolder(IShellLibrary* This,IShellItem *psiLocation) {
    return This->lpVtbl->AddFolder(This,psiLocation);
}
static inline HRESULT IShellLibrary_RemoveFolder(IShellLibrary* This,IShellItem *psiLocation) {
    return This->lpVtbl->RemoveFolder(This,psiLocation);
}
static inline HRESULT IShellLibrary_GetFolders(IShellLibrary* This,LIBRARYFOLDERFILTER lff,REFIID riid,void **ppv) {
    return This->lpVtbl->GetFolders(This,lff,riid,ppv);
}
static inline HRESULT IShellLibrary_ResolveFolder(IShellLibrary* This,IShellItem *psiFolderToResolve,DWORD dwTimeout,REFIID riid,void **ppv) {
    return This->lpVtbl->ResolveFolder(This,psiFolderToResolve,dwTimeout,riid,ppv);
}
static inline HRESULT IShellLibrary_GetDefaultSaveFolder(IShellLibrary* This,DEFAULTSAVEFOLDERTYPE dsft,REFIID riid,void **ppv) {
    return This->lpVtbl->GetDefaultSaveFolder(This,dsft,riid,ppv);
}
static inline HRESULT IShellLibrary_SetDefaultSaveFolder(IShellLibrary* This,DEFAULTSAVEFOLDERTYPE dsft,IShellItem *psi) {
    return This->lpVtbl->SetDefaultSaveFolder(This,dsft,psi);
}
static inline HRESULT IShellLibrary_GetOptions(IShellLibrary* This,LIBRARYOPTIONFLAGS *plofOptions) {
    return This->lpVtbl->GetOptions(This,plofOptions);
}
static inline HRESULT IShellLibrary_SetOptions(IShellLibrary* This,LIBRARYOPTIONFLAGS lofMask,LIBRARYOPTIONFLAGS lofOptions) {
    return This->lpVtbl->SetOptions(This,lofMask,lofOptions);
}
static inline HRESULT IShellLibrary_GetFolderType(IShellLibrary* This,FOLDERTYPEID *pftid) {
    return This->lpVtbl->GetFolderType(This,pftid);
}
static inline HRESULT IShellLibrary_SetFolderType(IShellLibrary* This,REFFOLDERTYPEID ftid) {
    return This->lpVtbl->SetFolderType(This,ftid);
}
static inline HRESULT IShellLibrary_GetIcon(IShellLibrary* This,LPWSTR *ppszIcon) {
    return This->lpVtbl->GetIcon(This,ppszIcon);
}
static inline HRESULT IShellLibrary_SetIcon(IShellLibrary* This,LPCWSTR pszIcon) {
    return This->lpVtbl->SetIcon(This,pszIcon);
}
static inline HRESULT IShellLibrary_Commit(IShellLibrary* This) {
    return This->lpVtbl->Commit(This);
}
static inline HRESULT IShellLibrary_Save(IShellLibrary* This,IShellItem *psiFolderToSaveIn,LPCWSTR pszLibraryName,LIBRARYSAVEFLAGS lsf,IShellItem **ppsiSavedTo) {
    return This->lpVtbl->Save(This,psiFolderToSaveIn,pszLibraryName,lsf,ppsiSavedTo);
}
static inline 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 inline HRESULT IPlaybackManagerEvents_QueryInterface(IPlaybackManagerEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPlaybackManagerEvents_AddRef(IPlaybackManagerEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPlaybackManagerEvents_Release(IPlaybackManagerEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IPlaybackManagerEvents methods ***/
static inline 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 inline HRESULT IPlaybackManager_QueryInterface(IPlaybackManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPlaybackManager_AddRef(IPlaybackManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPlaybackManager_Release(IPlaybackManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IPlaybackManager methods ***/
static inline HRESULT IPlaybackManager_Advise(IPlaybackManager* This,PBM_SESSION_TYPE type,IPlaybackManagerEvents *pEvents,DWORD *pdwSessionId) {
    return This->lpVtbl->Advise(This,type,pEvents,pdwSessionId);
}
static inline HRESULT IPlaybackManager_Unadvise(IPlaybackManager* This,DWORD dwSessionId) {
    return This->lpVtbl->Unadvise(This,dwSessionId);
}
static inline 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 inline HRESULT IDefaultFolderMenuInitialize_QueryInterface(IDefaultFolderMenuInitialize* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDefaultFolderMenuInitialize_AddRef(IDefaultFolderMenuInitialize* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDefaultFolderMenuInitialize_Release(IDefaultFolderMenuInitialize* This) {
    return This->lpVtbl->Release(This);
}
/*** IDefaultFolderMenuInitialize methods ***/
static inline 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 inline HRESULT IDefaultFolderMenuInitialize_SetMenuRestrictions(IDefaultFolderMenuInitialize* This,DEFAULT_FOLDER_MENU_RESTRICTIONS dfmrValues) {
    return This->lpVtbl->SetMenuRestrictions(This,dfmrValues);
}
static inline HRESULT IDefaultFolderMenuInitialize_GetMenuRestrictions(IDefaultFolderMenuInitialize* This,DEFAULT_FOLDER_MENU_RESTRICTIONS dfmrMask,DEFAULT_FOLDER_MENU_RESTRICTIONS *pdfmrValues) {
    return This->lpVtbl->GetMenuRestrictions(This,dfmrMask,pdfmrValues);
}
static inline 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 inline HRESULT IApplicationActivationManager_QueryInterface(IApplicationActivationManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IApplicationActivationManager_AddRef(IApplicationActivationManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IApplicationActivationManager_Release(IApplicationActivationManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationActivationManager methods ***/
static inline HRESULT IApplicationActivationManager_ActivateApplication(IApplicationActivationManager* This,LPCWSTR appUserModelId,LPCWSTR arguments,ACTIVATEOPTIONS options,DWORD *processId) {
    return This->lpVtbl->ActivateApplication(This,appUserModelId,arguments,options,processId);
}
static inline HRESULT IApplicationActivationManager_ActivateForFile(IApplicationActivationManager* This,LPCWSTR appUserModelId,IShellItemArray *itemArray,LPCWSTR verb,DWORD *processId) {
    return This->lpVtbl->ActivateForFile(This,appUserModelId,itemArray,verb,processId);
}
static inline 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

/*****************************************************************************
 * VirtualDesktopManager coclass
 */

DEFINE_GUID(CLSID_VirtualDesktopManager, 0xaa509086, 0x5ca9, 0x4c25, 0x8f,0x95, 0x58,0x9d,0x3c,0x07,0xb4,0x8a);

#ifdef __cplusplus
class DECLSPEC_UUID("aa509086-5ca9-4c25-8f95-589d3c07b48a") VirtualDesktopManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(VirtualDesktopManager, 0xaa509086, 0x5ca9, 0x4c25, 0x8f,0x95, 0x58,0x9d,0x3c,0x07,0xb4,0x8a)
#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 inline HRESULT IAssocHandlerInvoker_QueryInterface(IAssocHandlerInvoker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAssocHandlerInvoker_AddRef(IAssocHandlerInvoker* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAssocHandlerInvoker_Release(IAssocHandlerInvoker* This) {
    return This->lpVtbl->Release(This);
}
/*** IAssocHandlerInvoker methods ***/
static inline HRESULT IAssocHandlerInvoker_SupportsSelection(IAssocHandlerInvoker* This) {
    return This->lpVtbl->SupportsSelection(This);
}
static inline 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 inline HRESULT IAssocHandler_QueryInterface(IAssocHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAssocHandler_AddRef(IAssocHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAssocHandler_Release(IAssocHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IAssocHandler methods ***/
static inline HRESULT IAssocHandler_GetName(IAssocHandler* This,LPWSTR *ppsz) {
    return This->lpVtbl->GetName(This,ppsz);
}
static inline HRESULT IAssocHandler_GetUIName(IAssocHandler* This,LPWSTR *ppsz) {
    return This->lpVtbl->GetUIName(This,ppsz);
}
static inline HRESULT IAssocHandler_GetIconLocation(IAssocHandler* This,LPWSTR *ppszPath,int *pIndex) {
    return This->lpVtbl->GetIconLocation(This,ppszPath,pIndex);
}
static inline HRESULT IAssocHandler_IsRecommended(IAssocHandler* This) {
    return This->lpVtbl->IsRecommended(This);
}
static inline HRESULT IAssocHandler_MakeDefault(IAssocHandler* This,LPCWSTR pszDescription) {
    return This->lpVtbl->MakeDefault(This,pszDescription);
}
static inline HRESULT IAssocHandler_Invoke(IAssocHandler* This,IDataObject *pdo) {
    return This->lpVtbl->Invoke(This,pdo);
}
static inline 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 inline HRESULT IEnumAssocHandlers_QueryInterface(IEnumAssocHandlers* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IEnumAssocHandlers_AddRef(IEnumAssocHandlers* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IEnumAssocHandlers_Release(IEnumAssocHandlers* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumAssocHandlers methods ***/
static inline 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 inline HRESULT IDataObjectProvider_QueryInterface(IDataObjectProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDataObjectProvider_AddRef(IDataObjectProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDataObjectProvider_Release(IDataObjectProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IDataObjectProvider methods ***/
static inline HRESULT IDataObjectProvider_GetDataObject(IDataObjectProvider* This,IDataObject **dataObject) {
    return This->lpVtbl->GetDataObject(This,dataObject);
}
static inline 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 inline HRESULT IDataTransferManagerInterop_QueryInterface(IDataTransferManagerInterop* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDataTransferManagerInterop_AddRef(IDataTransferManagerInterop* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDataTransferManagerInterop_Release(IDataTransferManagerInterop* This) {
    return This->lpVtbl->Release(This);
}
/*** IDataTransferManagerInterop methods ***/
static inline HRESULT IDataTransferManagerInterop_GetForWindow(IDataTransferManagerInterop* This,HWND appWindow,REFIID riid,void **dataTransferManager) {
    return This->lpVtbl->GetForWindow(This,appWindow,riid,dataTransferManager);
}
static inline 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 inline HRESULT IFrameworkInputPaneHandler_QueryInterface(IFrameworkInputPaneHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFrameworkInputPaneHandler_AddRef(IFrameworkInputPaneHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFrameworkInputPaneHandler_Release(IFrameworkInputPaneHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IFrameworkInputPaneHandler methods ***/
static inline HRESULT IFrameworkInputPaneHandler_Showing(IFrameworkInputPaneHandler* This,RECT *prcInputPaneScreenLocation,WINBOOL fEnsureFocusedElementInView) {
    return This->lpVtbl->Showing(This,prcInputPaneScreenLocation,fEnsureFocusedElementInView);
}
static inline 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 inline HRESULT IFrameworkInputPane_QueryInterface(IFrameworkInputPane* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFrameworkInputPane_AddRef(IFrameworkInputPane* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFrameworkInputPane_Release(IFrameworkInputPane* This) {
    return This->lpVtbl->Release(This);
}
/*** IFrameworkInputPane methods ***/
static inline HRESULT IFrameworkInputPane_Advise(IFrameworkInputPane* This,IUnknown *pWindow,IFrameworkInputPaneHandler *pHandler,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pWindow,pHandler,pdwCookie);
}
static inline HRESULT IFrameworkInputPane_AdviseWithHWND(IFrameworkInputPane* This,HWND hwnd,IFrameworkInputPaneHandler *pHandler,DWORD *pdwCookie) {
    return This->lpVtbl->AdviseWithHWND(This,hwnd,pHandler,pdwCookie);
}
static inline HRESULT IFrameworkInputPane_Unadvise(IFrameworkInputPane* This,DWORD dwCookie) {
    return This->lpVtbl->Unadvise(This,dwCookie);
}
static inline 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 inline HRESULT ISearchableApplication_QueryInterface(ISearchableApplication* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISearchableApplication_AddRef(ISearchableApplication* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISearchableApplication_Release(ISearchableApplication* This) {
    return This->lpVtbl->Release(This);
}
/*** ISearchableApplication methods ***/
static inline 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 inline HRESULT IAccessibilityDockingServiceCallback_QueryInterface(IAccessibilityDockingServiceCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAccessibilityDockingServiceCallback_AddRef(IAccessibilityDockingServiceCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAccessibilityDockingServiceCallback_Release(IAccessibilityDockingServiceCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IAccessibilityDockingServiceCallback methods ***/
static inline 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 inline HRESULT IAccessibilityDockingService_QueryInterface(IAccessibilityDockingService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAccessibilityDockingService_AddRef(IAccessibilityDockingService* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAccessibilityDockingService_Release(IAccessibilityDockingService* This) {
    return This->lpVtbl->Release(This);
}
/*** IAccessibilityDockingService methods ***/
static inline HRESULT IAccessibilityDockingService_GetAvailableSize(IAccessibilityDockingService* This,HMONITOR hMonitor,UINT *pcxFixed,UINT *pcyMax) {
    return This->lpVtbl->GetAvailableSize(This,hMonitor,pcxFixed,pcyMax);
}
static inline HRESULT IAccessibilityDockingService_DockWindow(IAccessibilityDockingService* This,HWND hwnd,HMONITOR hMonitor,UINT cyRequested,IAccessibilityDockingServiceCallback *pCallback) {
    return This->lpVtbl->DockWindow(This,hwnd,hMonitor,cyRequested,pCallback);
}
static inline 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 inline HRESULT IAppVisibilityEvents_QueryInterface(IAppVisibilityEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAppVisibilityEvents_AddRef(IAppVisibilityEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAppVisibilityEvents_Release(IAppVisibilityEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IAppVisibilityEvents methods ***/
static inline HRESULT IAppVisibilityEvents_AppVisibilityOnMonitorChanged(IAppVisibilityEvents* This,HMONITOR hMonitor,MONITOR_APP_VISIBILITY previousMode,MONITOR_APP_VISIBILITY currentMode) {
    return This->lpVtbl->AppVisibilityOnMonitorChanged(This,hMonitor,previousMode,currentMode);
}
static inline 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 inline HRESULT IAppVisibility_QueryInterface(IAppVisibility* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAppVisibility_AddRef(IAppVisibility* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAppVisibility_Release(IAppVisibility* This) {
    return This->lpVtbl->Release(This);
}
/*** IAppVisibility methods ***/
static inline HRESULT IAppVisibility_GetAppVisibilityOnMonitor(IAppVisibility* This,HMONITOR hMonitor,MONITOR_APP_VISIBILITY *pMode) {
    return This->lpVtbl->GetAppVisibilityOnMonitor(This,hMonitor,pMode);
}
static inline HRESULT IAppVisibility_IsLauncherVisible(IAppVisibility* This,WINBOOL *pfVisible) {
    return This->lpVtbl->IsLauncherVisible(This,pfVisible);
}
static inline HRESULT IAppVisibility_Advise(IAppVisibility* This,IAppVisibilityEvents *pCallback,DWORD *pdwCookie) {
    return This->lpVtbl->Advise(This,pCallback,pdwCookie);
}
static inline 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 inline HRESULT IPackageExecutionStateChangeNotification_QueryInterface(IPackageExecutionStateChangeNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPackageExecutionStateChangeNotification_AddRef(IPackageExecutionStateChangeNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPackageExecutionStateChangeNotification_Release(IPackageExecutionStateChangeNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IPackageExecutionStateChangeNotification methods ***/
static inline 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 inline HRESULT IPackageDebugSettings_QueryInterface(IPackageDebugSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IPackageDebugSettings_AddRef(IPackageDebugSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IPackageDebugSettings_Release(IPackageDebugSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IPackageDebugSettings methods ***/
static inline HRESULT IPackageDebugSettings_EnableDebugging(IPackageDebugSettings* This,LPCWSTR packageFullName,LPCWSTR debuggerCommandLine,PZZWSTR environment) {
    return This->lpVtbl->EnableDebugging(This,packageFullName,debuggerCommandLine,environment);
}
static inline HRESULT IPackageDebugSettings_DisableDebugging(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->DisableDebugging(This,packageFullName);
}
static inline HRESULT IPackageDebugSettings_Suspend(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->Suspend(This,packageFullName);
}
static inline HRESULT IPackageDebugSettings_Resume(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->Resume(This,packageFullName);
}
static inline HRESULT IPackageDebugSettings_TerminateAllProcesses(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->TerminateAllProcesses(This,packageFullName);
}
static inline HRESULT IPackageDebugSettings_SetTargetSessionId(IPackageDebugSettings* This,ULONG sessionId) {
    return This->lpVtbl->SetTargetSessionId(This,sessionId);
}
static inline HRESULT IPackageDebugSettings_EnumerateBackgroundTasks(IPackageDebugSettings* This,LPCWSTR packageFullName,ULONG *taskCount,LPCGUID *taskIds,LPCWSTR **taskNames) {
    return This->lpVtbl->EnumerateBackgroundTasks(This,packageFullName,taskCount,taskIds,taskNames);
}
static inline HRESULT IPackageDebugSettings_ActivateBackgroundTask(IPackageDebugSettings* This,LPCGUID taskId) {
    return This->lpVtbl->ActivateBackgroundTask(This,taskId);
}
static inline HRESULT IPackageDebugSettings_StartServicing(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->StartServicing(This,packageFullName);
}
static inline HRESULT IPackageDebugSettings_StopServicing(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->StopServicing(This,packageFullName);
}
static inline HRESULT IPackageDebugSettings_StartSessionRedirection(IPackageDebugSettings* This,LPCWSTR packageFullName,ULONG sessionId) {
    return This->lpVtbl->StartSessionRedirection(This,packageFullName,sessionId);
}
static inline HRESULT IPackageDebugSettings_StopSessionRedirection(IPackageDebugSettings* This,LPCWSTR packageFullName) {
    return This->lpVtbl->StopSessionRedirection(This,packageFullName);
}
static inline HRESULT IPackageDebugSettings_GetPackageExecutionState(IPackageDebugSettings* This,LPCWSTR packageFullName,PACKAGE_EXECUTION_STATE *packageExecutionState) {
    return This->lpVtbl->GetPackageExecutionState(This,packageFullName,packageExecutionState);
}
static inline HRESULT IPackageDebugSettings_RegisterForPackageStateChanges(IPackageDebugSettings* This,LPCWSTR packageFullName,IPackageExecutionStateChangeNotification *pPackageExecutionStateChangeNotification,DWORD *pdwCookie) {
    return This->lpVtbl->RegisterForPackageStateChanges(This,packageFullName,pPackageExecutionStateChangeNotification,pdwCookie);
}
static inline 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 inline HRESULT IExecuteCommandApplicationHostEnvironment_QueryInterface(IExecuteCommandApplicationHostEnvironment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IExecuteCommandApplicationHostEnvironment_AddRef(IExecuteCommandApplicationHostEnvironment* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IExecuteCommandApplicationHostEnvironment_Release(IExecuteCommandApplicationHostEnvironment* This) {
    return This->lpVtbl->Release(This);
}
/*** IExecuteCommandApplicationHostEnvironment methods ***/
static inline 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 inline HRESULT IExecuteCommandHost_QueryInterface(IExecuteCommandHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IExecuteCommandHost_AddRef(IExecuteCommandHost* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IExecuteCommandHost_Release(IExecuteCommandHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IExecuteCommandHost methods ***/
static inline 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 inline HRESULT IApplicationDesignModeSettings_QueryInterface(IApplicationDesignModeSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IApplicationDesignModeSettings_AddRef(IApplicationDesignModeSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IApplicationDesignModeSettings_Release(IApplicationDesignModeSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IApplicationDesignModeSettings methods ***/
static inline HRESULT IApplicationDesignModeSettings_SetNativeDisplaySize(IApplicationDesignModeSettings* This,SIZE sizeNativeDisplay) {
    return This->lpVtbl->SetNativeDisplaySize(This,sizeNativeDisplay);
}
static inline HRESULT IApplicationDesignModeSettings_SetScaleFactor(IApplicationDesignModeSettings* This,DEVICE_SCALE_FACTOR scaleFactor) {
    return This->lpVtbl->SetScaleFactor(This,scaleFactor);
}
static inline HRESULT IApplicationDesignModeSettings_SetApplicationViewState(IApplicationDesignModeSettings* This,APPLICATION_VIEW_STATE viewState) {
    return This->lpVtbl->SetApplicationViewState(This,viewState);
}
static inline HRESULT IApplicationDesignModeSettings_ComputeApplicationSize(IApplicationDesignModeSettings* This,SIZE *psizeApplication) {
    return This->lpVtbl->ComputeApplicationSize(This,psizeApplication);
}
static inline 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 inline 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 inline HRESULT IInitializeWithWindow_QueryInterface(IInitializeWithWindow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IInitializeWithWindow_AddRef(IInitializeWithWindow* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IInitializeWithWindow_Release(IInitializeWithWindow* This) {
    return This->lpVtbl->Release(This);
}
/*** IInitializeWithWindow methods ***/
static inline 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 inline HRESULT IHandlerInfo_QueryInterface(IHandlerInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IHandlerInfo_AddRef(IHandlerInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IHandlerInfo_Release(IHandlerInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IHandlerInfo methods ***/
static inline HRESULT IHandlerInfo_GetApplicationDisplayName(IHandlerInfo* This,LPWSTR *value) {
    return This->lpVtbl->GetApplicationDisplayName(This,value);
}
static inline HRESULT IHandlerInfo_GetApplicationPublisher(IHandlerInfo* This,LPWSTR *value) {
    return This->lpVtbl->GetApplicationPublisher(This,value);
}
static inline 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 inline HRESULT IHandlerActivationHost_QueryInterface(IHandlerActivationHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IHandlerActivationHost_AddRef(IHandlerActivationHost* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IHandlerActivationHost_Release(IHandlerActivationHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IHandlerActivationHost methods ***/
static inline HRESULT IHandlerActivationHost_BeforeCoCreateInstance(IHandlerActivationHost* This,REFCLSID clsidHandler,IShellItemArray *itemsBeingActivated,IHandlerInfo *handlerInfo) {
    return This->lpVtbl->BeforeCoCreateInstance(This,clsidHandler,itemsBeingActivated,handlerInfo);
}
static inline 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__ */
