/*** Autogenerated by WIDL 10.13 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__

/* 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 inline HRESULT ISharedBitmap_QueryInterface(ISharedBitmap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISharedBitmap_AddRef(ISharedBitmap* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISharedBitmap_Release(ISharedBitmap* This) {
    return This->lpVtbl->Release(This);
}
/*** ISharedBitmap methods ***/
static inline HRESULT ISharedBitmap_GetSharedBitmap(ISharedBitmap* This,HBITMAP *phbm) {
    return This->lpVtbl->GetSharedBitmap(This,phbm);
}
static inline HRESULT ISharedBitmap_GetSize(ISharedBitmap* This,SIZE *pSize) {
    return This->lpVtbl->GetSize(This,pSize);
}
static inline HRESULT ISharedBitmap_GetFormat(ISharedBitmap* This,WTS_ALPHATYPE *pat) {
    return This->lpVtbl->GetFormat(This,pat);
}
static inline HRESULT ISharedBitmap_InitializeBitmap(ISharedBitmap* This,HBITMAP hbm,WTS_ALPHATYPE wtsAT) {
    return This->lpVtbl->InitializeBitmap(This,hbm,wtsAT);
}
static 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 inline HRESULT IThumbnailCache_QueryInterface(IThumbnailCache* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IThumbnailCache_AddRef(IThumbnailCache* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IThumbnailCache_Release(IThumbnailCache* This) {
    return This->lpVtbl->Release(This);
}
/*** IThumbnailCache methods ***/
static 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 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 inline HRESULT IThumbnailProvider_QueryInterface(IThumbnailProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IThumbnailProvider_AddRef(IThumbnailProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IThumbnailProvider_Release(IThumbnailProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IThumbnailProvider methods ***/
static 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 inline HRESULT IThumbnailSettings_QueryInterface(IThumbnailSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IThumbnailSettings_AddRef(IThumbnailSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IThumbnailSettings_Release(IThumbnailSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IThumbnailSettings methods ***/
static 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 inline HRESULT IThumbnailCachePrimer_QueryInterface(IThumbnailCachePrimer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IThumbnailCachePrimer_AddRef(IThumbnailCachePrimer* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IThumbnailCachePrimer_Release(IThumbnailCachePrimer* This) {
    return This->lpVtbl->Release(This);
}
/*** IThumbnailCachePrimer methods ***/
static 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__ */
