/*** Autogenerated by WIDL 8.12 from include/thumbcache.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 __thumbcache_h__
#define __thumbcache_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __ISharedBitmap_FWD_DEFINED__
#define __ISharedBitmap_FWD_DEFINED__
typedef interface ISharedBitmap ISharedBitmap;
#ifdef __cplusplus
interface ISharedBitmap;
#endif /* __cplusplus */
#endif

#ifndef __IThumbnailCache_FWD_DEFINED__
#define __IThumbnailCache_FWD_DEFINED__
typedef interface IThumbnailCache IThumbnailCache;
#ifdef __cplusplus
interface IThumbnailCache;
#endif /* __cplusplus */
#endif

#ifndef __IThumbnailProvider_FWD_DEFINED__
#define __IThumbnailProvider_FWD_DEFINED__
typedef interface IThumbnailProvider IThumbnailProvider;
#ifdef __cplusplus
interface IThumbnailProvider;
#endif /* __cplusplus */
#endif

#ifndef __IThumbnailSettings_FWD_DEFINED__
#define __IThumbnailSettings_FWD_DEFINED__
typedef interface IThumbnailSettings IThumbnailSettings;
#ifdef __cplusplus
interface IThumbnailSettings;
#endif /* __cplusplus */
#endif

#ifndef __IThumbnailCachePrimer_FWD_DEFINED__
#define __IThumbnailCachePrimer_FWD_DEFINED__
typedef interface IThumbnailCachePrimer IThumbnailCachePrimer;
#ifdef __cplusplus
interface IThumbnailCachePrimer;
#endif /* __cplusplus */
#endif

#ifndef __LocalThumbnailCache_FWD_DEFINED__
#define __LocalThumbnailCache_FWD_DEFINED__
#ifdef __cplusplus
typedef class LocalThumbnailCache LocalThumbnailCache;
#else
typedef struct LocalThumbnailCache LocalThumbnailCache;
#endif /* defined __cplusplus */
#endif /* defined __LocalThumbnailCache_FWD_DEFINED__ */

#ifndef __SharedBitmap_FWD_DEFINED__
#define __SharedBitmap_FWD_DEFINED__
#ifdef __cplusplus
typedef class SharedBitmap SharedBitmap;
#else
typedef struct SharedBitmap SharedBitmap;
#endif /* defined __cplusplus */
#endif /* defined __SharedBitmap_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <shtypes.h>
#include <shobjidl.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef enum WTS_FLAGS {
    WTS_NONE = 0x0,
    WTS_EXTRACT = 0x0,
    WTS_INCACHEONLY = 0x1,
    WTS_FASTEXTRACT = 0x2,
    WTS_FORCEEXTRACTION = 0x4,
    WTS_SLOWRECLAIM = 0x8,
    WTS_EXTRACTDONOTCACHE = 0x20,
    WTS_SCALETOREQUESTEDSIZE = 0x40,
    WTS_SKIPFASTEXTRACT = 0x80,
    WTS_EXTRACTINPROC = 0x100,
    WTS_CROPTOSQUARE = 0x200,
    WTS_INSTANCESURROGATE = 0x400,
    WTS_REQUIRESURROGATE = 0x800,
    WTS_APPSTYLE = 0x2000,
    WTS_WIDETHUMBNAILS = 0x4000,
    WTS_IDEALCACHESIZEONLY = 0x8000,
    WTS_SCALEUP = 0x10000
} WTS_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(WTS_FLAGS)
typedef enum WTS_CACHEFLAGS {
    WTS_DEFAULT = 0x0,
    WTS_LOWQUALITY = 0x1,
    WTS_CACHED = 0x2
} WTS_CACHEFLAGS;
DEFINE_ENUM_FLAG_OPERATORS(WTS_CACHEFLAGS)
typedef enum WTS_CONTEXTFLAGS {
    WTSCF_DEFAULT = 0x0,
    WTSCF_APPSTYLE = 0x1,
    WTSCF_SQUARE = 0x2,
    WTSCF_WIDE = 0x4,
    WTSCF_FAST = 0x8
} WTS_CONTEXTFLAGS;
DEFINE_ENUM_FLAG_OPERATORS(WTS_CONTEXTFLAGS)
typedef enum WTS_ALPHATYPE {
    WTSAT_UNKNOWN = 0,
    WTSAT_RGB = 1,
    WTSAT_ARGB = 2
} WTS_ALPHATYPE;
typedef struct WTS_THUMBNAILID {
    BYTE rgbKey[16];
} WTS_THUMBNAILID;
#define WTS_E_FAILEDEXTRACTION MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xb200)
#define WTS_E_EXTRACTIONTIMEDOUT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xb201)
#define WTS_E_SURROGATEUNAVAILABLE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xb202)
#define WTS_E_FASTEXTRACTIONNOTSUPPORTED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xb203)
#define WTS_E_DATAFILEUNAVAILABLE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xb204)
#define WTS_E_EXTRACTIONPENDING MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xb205)
#define WTS_E_EXTRACTIONBLOCKED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xb206)
/*****************************************************************************
 * ISharedBitmap interface
 */
#ifndef __ISharedBitmap_INTERFACE_DEFINED__
#define __ISharedBitmap_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISharedBitmap, 0x091162a4, 0xbc96, 0x411f, 0xaa,0xe8, 0xc5,0x12,0x2c,0xd0,0x33,0x63);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("091162a4-bc96-411f-aae8-c5122cd03363")
ISharedBitmap : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSharedBitmap(
        HBITMAP *phbm) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSize(
        SIZE *pSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFormat(
        WTS_ALPHATYPE *pat) = 0;

    virtual HRESULT STDMETHODCALLTYPE InitializeBitmap(
        HBITMAP hbm,
        WTS_ALPHATYPE wtsAT) = 0;

    virtual HRESULT STDMETHODCALLTYPE Detach(
        HBITMAP *phbm) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISharedBitmap, 0x091162a4, 0xbc96, 0x411f, 0xaa,0xe8, 0xc5,0x12,0x2c,0xd0,0x33,0x63)
#endif
#else
typedef struct ISharedBitmapVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISharedBitmap methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSharedBitmap)(
        ISharedBitmap *This,
        HBITMAP *phbm);

    HRESULT (STDMETHODCALLTYPE *GetSize)(
        ISharedBitmap *This,
        SIZE *pSize);

    HRESULT (STDMETHODCALLTYPE *GetFormat)(
        ISharedBitmap *This,
        WTS_ALPHATYPE *pat);

    HRESULT (STDMETHODCALLTYPE *InitializeBitmap)(
        ISharedBitmap *This,
        HBITMAP hbm,
        WTS_ALPHATYPE wtsAT);

    HRESULT (STDMETHODCALLTYPE *Detach)(
        ISharedBitmap *This,
        HBITMAP *phbm);

    END_INTERFACE
} ISharedBitmapVtbl;

interface ISharedBitmap {
    CONST_VTBL ISharedBitmapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISharedBitmap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISharedBitmap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISharedBitmap_Release(This) (This)->lpVtbl->Release(This)
/*** ISharedBitmap methods ***/
#define ISharedBitmap_GetSharedBitmap(This,phbm) (This)->lpVtbl->GetSharedBitmap(This,phbm)
#define ISharedBitmap_GetSize(This,pSize) (This)->lpVtbl->GetSize(This,pSize)
#define ISharedBitmap_GetFormat(This,pat) (This)->lpVtbl->GetFormat(This,pat)
#define ISharedBitmap_InitializeBitmap(This,hbm,wtsAT) (This)->lpVtbl->InitializeBitmap(This,hbm,wtsAT)
#define ISharedBitmap_Detach(This,phbm) (This)->lpVtbl->Detach(This,phbm)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISharedBitmap_QueryInterface(ISharedBitmap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISharedBitmap_AddRef(ISharedBitmap* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISharedBitmap_Release(ISharedBitmap* This) {
    return This->lpVtbl->Release(This);
}
/*** ISharedBitmap methods ***/
static __WIDL_INLINE HRESULT ISharedBitmap_GetSharedBitmap(ISharedBitmap* This,HBITMAP *phbm) {
    return This->lpVtbl->GetSharedBitmap(This,phbm);
}
static __WIDL_INLINE HRESULT ISharedBitmap_GetSize(ISharedBitmap* This,SIZE *pSize) {
    return This->lpVtbl->GetSize(This,pSize);
}
static __WIDL_INLINE HRESULT ISharedBitmap_GetFormat(ISharedBitmap* This,WTS_ALPHATYPE *pat) {
    return This->lpVtbl->GetFormat(This,pat);
}
static __WIDL_INLINE HRESULT ISharedBitmap_InitializeBitmap(ISharedBitmap* This,HBITMAP hbm,WTS_ALPHATYPE wtsAT) {
    return This->lpVtbl->InitializeBitmap(This,hbm,wtsAT);
}
static __WIDL_INLINE HRESULT ISharedBitmap_Detach(ISharedBitmap* This,HBITMAP *phbm) {
    return This->lpVtbl->Detach(This,phbm);
}
#endif
#endif

#endif


#endif  /* __ISharedBitmap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IThumbnailCache interface
 */
#ifndef __IThumbnailCache_INTERFACE_DEFINED__
#define __IThumbnailCache_INTERFACE_DEFINED__

DEFINE_GUID(IID_IThumbnailCache, 0xf676c15d, 0x596a, 0x4ce2, 0x82,0x34, 0x33,0x99,0x6f,0x44,0x5d,0xb1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f676c15d-596a-4ce2-8234-33996f445db1")
IThumbnailCache : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetThumbnail(
        IShellItem *pShellItem,
        UINT cxyRequestedThumbSize,
        WTS_FLAGS flags,
        ISharedBitmap **ppvThumb,
        WTS_CACHEFLAGS *pOutFlags,
        WTS_THUMBNAILID *pThumbnailID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetThumbnailByID(
        WTS_THUMBNAILID thumbnailID,
        UINT cxyRequestedThumbSize,
        ISharedBitmap **ppvThumb,
        WTS_CACHEFLAGS *pOutFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IThumbnailCache, 0xf676c15d, 0x596a, 0x4ce2, 0x82,0x34, 0x33,0x99,0x6f,0x44,0x5d,0xb1)
#endif
#else
typedef struct IThumbnailCacheVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IThumbnailCache methods ***/
    HRESULT (STDMETHODCALLTYPE *GetThumbnail)(
        IThumbnailCache *This,
        IShellItem *pShellItem,
        UINT cxyRequestedThumbSize,
        WTS_FLAGS flags,
        ISharedBitmap **ppvThumb,
        WTS_CACHEFLAGS *pOutFlags,
        WTS_THUMBNAILID *pThumbnailID);

    HRESULT (STDMETHODCALLTYPE *GetThumbnailByID)(
        IThumbnailCache *This,
        WTS_THUMBNAILID thumbnailID,
        UINT cxyRequestedThumbSize,
        ISharedBitmap **ppvThumb,
        WTS_CACHEFLAGS *pOutFlags);

    END_INTERFACE
} IThumbnailCacheVtbl;

interface IThumbnailCache {
    CONST_VTBL IThumbnailCacheVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IThumbnailCache_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IThumbnailCache_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IThumbnailCache_Release(This) (This)->lpVtbl->Release(This)
/*** IThumbnailCache methods ***/
#define IThumbnailCache_GetThumbnail(This,pShellItem,cxyRequestedThumbSize,flags,ppvThumb,pOutFlags,pThumbnailID) (This)->lpVtbl->GetThumbnail(This,pShellItem,cxyRequestedThumbSize,flags,ppvThumb,pOutFlags,pThumbnailID)
#define IThumbnailCache_GetThumbnailByID(This,thumbnailID,cxyRequestedThumbSize,ppvThumb,pOutFlags) (This)->lpVtbl->GetThumbnailByID(This,thumbnailID,cxyRequestedThumbSize,ppvThumb,pOutFlags)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IThumbnailCache_QueryInterface(IThumbnailCache* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IThumbnailCache_AddRef(IThumbnailCache* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IThumbnailCache_Release(IThumbnailCache* This) {
    return This->lpVtbl->Release(This);
}
/*** IThumbnailCache methods ***/
static __WIDL_INLINE HRESULT IThumbnailCache_GetThumbnail(IThumbnailCache* This,IShellItem *pShellItem,UINT cxyRequestedThumbSize,WTS_FLAGS flags,ISharedBitmap **ppvThumb,WTS_CACHEFLAGS *pOutFlags,WTS_THUMBNAILID *pThumbnailID) {
    return This->lpVtbl->GetThumbnail(This,pShellItem,cxyRequestedThumbSize,flags,ppvThumb,pOutFlags,pThumbnailID);
}
static __WIDL_INLINE HRESULT IThumbnailCache_GetThumbnailByID(IThumbnailCache* This,WTS_THUMBNAILID thumbnailID,UINT cxyRequestedThumbSize,ISharedBitmap **ppvThumb,WTS_CACHEFLAGS *pOutFlags) {
    return This->lpVtbl->GetThumbnailByID(This,thumbnailID,cxyRequestedThumbSize,ppvThumb,pOutFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IThumbnailCache_RemoteGetThumbnail_Proxy(
    IThumbnailCache* This,
    IShellItem *pShellItem,
    UINT cxyRequestedThumbSize,
    WTS_FLAGS flags,
    ISharedBitmap **ppvThumb,
    WTS_CACHEFLAGS *pOutFlags,
    WTS_THUMBNAILID *pThumbnailID);
void __RPC_STUB IThumbnailCache_RemoteGetThumbnail_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IThumbnailCache_RemoteGetThumbnailByID_Proxy(
    IThumbnailCache* This,
    WTS_THUMBNAILID thumbnailID,
    UINT cxyRequestedThumbSize,
    ISharedBitmap **ppvThumb,
    WTS_CACHEFLAGS *pOutFlags);
void __RPC_STUB IThumbnailCache_RemoteGetThumbnailByID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IThumbnailCache_GetThumbnail_Proxy(
    IThumbnailCache* This,
    IShellItem *pShellItem,
    UINT cxyRequestedThumbSize,
    WTS_FLAGS flags,
    ISharedBitmap **ppvThumb,
    WTS_CACHEFLAGS *pOutFlags,
    WTS_THUMBNAILID *pThumbnailID);
HRESULT __RPC_STUB IThumbnailCache_GetThumbnail_Stub(
    IThumbnailCache* This,
    IShellItem *pShellItem,
    UINT cxyRequestedThumbSize,
    WTS_FLAGS flags,
    ISharedBitmap **ppvThumb,
    WTS_CACHEFLAGS *pOutFlags,
    WTS_THUMBNAILID *pThumbnailID);
HRESULT CALLBACK IThumbnailCache_GetThumbnailByID_Proxy(
    IThumbnailCache* This,
    WTS_THUMBNAILID thumbnailID,
    UINT cxyRequestedThumbSize,
    ISharedBitmap **ppvThumb,
    WTS_CACHEFLAGS *pOutFlags);
HRESULT __RPC_STUB IThumbnailCache_GetThumbnailByID_Stub(
    IThumbnailCache* This,
    WTS_THUMBNAILID thumbnailID,
    UINT cxyRequestedThumbSize,
    ISharedBitmap **ppvThumb,
    WTS_CACHEFLAGS *pOutFlags);

#endif  /* __IThumbnailCache_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IThumbnailProvider interface
 */
#ifndef __IThumbnailProvider_INTERFACE_DEFINED__
#define __IThumbnailProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IThumbnailProvider, 0xe357fccd, 0xa995, 0x4576, 0xb0,0x1f, 0x23,0x46,0x30,0x15,0x4e,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e357fccd-a995-4576-b01f-234630154e96")
IThumbnailProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetThumbnail(
        UINT cx,
        HBITMAP *phbmp,
        WTS_ALPHATYPE *pdwAlpha) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IThumbnailProvider, 0xe357fccd, 0xa995, 0x4576, 0xb0,0x1f, 0x23,0x46,0x30,0x15,0x4e,0x96)
#endif
#else
typedef struct IThumbnailProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IThumbnailProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetThumbnail)(
        IThumbnailProvider *This,
        UINT cx,
        HBITMAP *phbmp,
        WTS_ALPHATYPE *pdwAlpha);

    END_INTERFACE
} IThumbnailProviderVtbl;

interface IThumbnailProvider {
    CONST_VTBL IThumbnailProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IThumbnailProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IThumbnailProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IThumbnailProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IThumbnailProvider methods ***/
#define IThumbnailProvider_GetThumbnail(This,cx,phbmp,pdwAlpha) (This)->lpVtbl->GetThumbnail(This,cx,phbmp,pdwAlpha)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IThumbnailProvider_QueryInterface(IThumbnailProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IThumbnailProvider_AddRef(IThumbnailProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IThumbnailProvider_Release(IThumbnailProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IThumbnailProvider methods ***/
static __WIDL_INLINE HRESULT IThumbnailProvider_GetThumbnail(IThumbnailProvider* This,UINT cx,HBITMAP *phbmp,WTS_ALPHATYPE *pdwAlpha) {
    return This->lpVtbl->GetThumbnail(This,cx,phbmp,pdwAlpha);
}
#endif
#endif

#endif


#endif  /* __IThumbnailProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IThumbnailSettings interface
 */
#ifndef __IThumbnailSettings_INTERFACE_DEFINED__
#define __IThumbnailSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID_IThumbnailSettings, 0xf4376f00, 0xbef5, 0x4d45, 0x80,0xf3, 0x1e,0x02,0x3b,0xbf,0x12,0x09);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f4376f00-bef5-4d45-80f3-1e023bbf1209")
IThumbnailSettings : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetContext(
        WTS_CONTEXTFLAGS dwContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IThumbnailSettings, 0xf4376f00, 0xbef5, 0x4d45, 0x80,0xf3, 0x1e,0x02,0x3b,0xbf,0x12,0x09)
#endif
#else
typedef struct IThumbnailSettingsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IThumbnailSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *SetContext)(
        IThumbnailSettings *This,
        WTS_CONTEXTFLAGS dwContext);

    END_INTERFACE
} IThumbnailSettingsVtbl;

interface IThumbnailSettings {
    CONST_VTBL IThumbnailSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IThumbnailSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IThumbnailSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IThumbnailSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IThumbnailSettings methods ***/
#define IThumbnailSettings_SetContext(This,dwContext) (This)->lpVtbl->SetContext(This,dwContext)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IThumbnailSettings_QueryInterface(IThumbnailSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IThumbnailSettings_AddRef(IThumbnailSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IThumbnailSettings_Release(IThumbnailSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IThumbnailSettings methods ***/
static __WIDL_INLINE HRESULT IThumbnailSettings_SetContext(IThumbnailSettings* This,WTS_CONTEXTFLAGS dwContext) {
    return This->lpVtbl->SetContext(This,dwContext);
}
#endif
#endif

#endif


#endif  /* __IThumbnailSettings_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IThumbnailCachePrimer interface
 */
#ifndef __IThumbnailCachePrimer_INTERFACE_DEFINED__
#define __IThumbnailCachePrimer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IThumbnailCachePrimer, 0x0f03f8fe, 0x2b26, 0x46f0, 0x96,0x5a, 0x21,0x2a,0xa8,0xd6,0x6b,0x76);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0f03f8fe-2b26-46f0-965a-212aa8d66b76")
IThumbnailCachePrimer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE PageInThumbnail(
        IShellItem *psi,
        WTS_FLAGS wtsFlags,
        UINT cxyRequestedThumbSize) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IThumbnailCachePrimer, 0x0f03f8fe, 0x2b26, 0x46f0, 0x96,0x5a, 0x21,0x2a,0xa8,0xd6,0x6b,0x76)
#endif
#else
typedef struct IThumbnailCachePrimerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IThumbnailCachePrimer methods ***/
    HRESULT (STDMETHODCALLTYPE *PageInThumbnail)(
        IThumbnailCachePrimer *This,
        IShellItem *psi,
        WTS_FLAGS wtsFlags,
        UINT cxyRequestedThumbSize);

    END_INTERFACE
} IThumbnailCachePrimerVtbl;

interface IThumbnailCachePrimer {
    CONST_VTBL IThumbnailCachePrimerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IThumbnailCachePrimer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IThumbnailCachePrimer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IThumbnailCachePrimer_Release(This) (This)->lpVtbl->Release(This)
/*** IThumbnailCachePrimer methods ***/
#define IThumbnailCachePrimer_PageInThumbnail(This,psi,wtsFlags,cxyRequestedThumbSize) (This)->lpVtbl->PageInThumbnail(This,psi,wtsFlags,cxyRequestedThumbSize)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IThumbnailCachePrimer_QueryInterface(IThumbnailCachePrimer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IThumbnailCachePrimer_AddRef(IThumbnailCachePrimer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IThumbnailCachePrimer_Release(IThumbnailCachePrimer* This) {
    return This->lpVtbl->Release(This);
}
/*** IThumbnailCachePrimer methods ***/
static __WIDL_INLINE HRESULT IThumbnailCachePrimer_PageInThumbnail(IThumbnailCachePrimer* This,IShellItem *psi,WTS_FLAGS wtsFlags,UINT cxyRequestedThumbSize) {
    return This->lpVtbl->PageInThumbnail(This,psi,wtsFlags,cxyRequestedThumbSize);
}
#endif
#endif

#endif


#endif  /* __IThumbnailCachePrimer_INTERFACE_DEFINED__ */

#ifndef __ThumbCacheLib_LIBRARY_DEFINED__
#define __ThumbCacheLib_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_ThumbCacheLib, 0x4c857096, 0x0514, 0x4d4d, 0xab,0xd5, 0xdf,0xaa,0xa3,0xc3,0x26,0xd2);

/*****************************************************************************
 * LocalThumbnailCache coclass
 */

DEFINE_GUID(CLSID_LocalThumbnailCache, 0x50ef4544, 0xac9f, 0x4a8e, 0xb2,0x1b, 0x8a,0x26,0x18,0x0d,0xb1,0x3f);

#ifdef __cplusplus
class DECLSPEC_UUID("50ef4544-ac9f-4a8e-b21b-8a26180db13f") LocalThumbnailCache;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(LocalThumbnailCache, 0x50ef4544, 0xac9f, 0x4a8e, 0xb2,0x1b, 0x8a,0x26,0x18,0x0d,0xb1,0x3f)
#endif
#endif

/*****************************************************************************
 * SharedBitmap coclass
 */

DEFINE_GUID(CLSID_SharedBitmap, 0x4db26476, 0x6787, 0x4046, 0xb8,0x36, 0xe8,0x41,0x2a,0x9e,0x8a,0x27);

#ifdef __cplusplus
class DECLSPEC_UUID("4db26476-6787-4046-b836-e8412a9e8a27") SharedBitmap;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SharedBitmap, 0x4db26476, 0x6787, 0x4046, 0xb8,0x36, 0xe8,0x41,0x2a,0x9e,0x8a,0x27)
#endif
#endif

#endif /* __ThumbCacheLib_LIBRARY_DEFINED__ */
/* Begin additional prototypes for all interfaces */

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 *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __thumbcache_h__ */
