/*** Autogenerated by WIDL 9.8 from include/xamlom.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 __xamlom_h__
#define __xamlom_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 __IVisualTreeServiceCallback_FWD_DEFINED__
#define __IVisualTreeServiceCallback_FWD_DEFINED__
typedef interface IVisualTreeServiceCallback IVisualTreeServiceCallback;
#ifdef __cplusplus
interface IVisualTreeServiceCallback;
#endif /* __cplusplus */
#endif

#ifndef __IVisualTreeServiceCallback2_FWD_DEFINED__
#define __IVisualTreeServiceCallback2_FWD_DEFINED__
typedef interface IVisualTreeServiceCallback2 IVisualTreeServiceCallback2;
#ifdef __cplusplus
interface IVisualTreeServiceCallback2;
#endif /* __cplusplus */
#endif

#ifndef __IVisualTreeService_FWD_DEFINED__
#define __IVisualTreeService_FWD_DEFINED__
typedef interface IVisualTreeService IVisualTreeService;
#ifdef __cplusplus
interface IVisualTreeService;
#endif /* __cplusplus */
#endif

#ifndef __IXamlDiagnostics_FWD_DEFINED__
#define __IXamlDiagnostics_FWD_DEFINED__
typedef interface IXamlDiagnostics IXamlDiagnostics;
#ifdef __cplusplus
interface IXamlDiagnostics;
#endif /* __cplusplus */
#endif

#ifndef __IBitmapData_FWD_DEFINED__
#define __IBitmapData_FWD_DEFINED__
typedef interface IBitmapData IBitmapData;
#ifdef __cplusplus
interface IBitmapData;
#endif /* __cplusplus */
#endif

#ifndef __IVisualTreeService2_FWD_DEFINED__
#define __IVisualTreeService2_FWD_DEFINED__
typedef interface IVisualTreeService2 IVisualTreeService2;
#ifdef __cplusplus
interface IVisualTreeService2;
#endif /* __cplusplus */
#endif

#ifndef __IVisualTreeService3_FWD_DEFINED__
#define __IVisualTreeService3_FWD_DEFINED__
typedef interface IVisualTreeService3 IVisualTreeService3;
#ifdef __cplusplus
interface IVisualTreeService3;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>
#include <inspectable.h>
#include <dxgi1_2.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef E_NOTFOUND
#define E_NOTFOUND HRESULT_FROM_WIN32(ERROR_NOT_FOUND)
#endif
#define E_UNKNOWNTYPE _HRESULT_TYPEDEF_(0x802b0028)
HRESULT WINAPI InitializeXamlDiagnostic(PCWSTR, DWORD, PCWSTR, PCWSTR, CLSID);
HRESULT WINAPI InitializeXamlDiagnosticsEx(PCWSTR, DWORD, PCWSTR, PCWSTR, CLSID, PCWSTR);
typedef MIDL_uhyper InstanceHandle;
typedef enum VisualMutationType {
    Add = 0,
    Remove = 1
} VisualMutationType;
typedef enum BaseValueSource {
    BaseValueSourceUnknown = 0,
    BaseValueSourceDefault = 1,
    BaseValueSourceBuiltInStyle = 2,
    BaseValueSourceStyle = 3,
    BaseValueSourceLocal = 4,
    Inherited = 5,
    DefaultStyleTrigger = 6,
    TemplateTrigger = 7,
    StyleTrigger = 8,
    ImplicitStyleReference = 9,
    ParentTemplate = 10,
    ParentTemplateTrigger = 11,
    Animation = 12,
    Coercion = 13,
    BaseValueSourceVisualState = 14
} BaseValueSource;
typedef struct SourceInfo {
    BSTR FileName;
    unsigned int LineNumber;
    unsigned int ColumnNumber;
    unsigned int CharPosition;
    BSTR Hash;
} SourceInfo;
typedef struct ParentChildRelation {
    InstanceHandle Parent;
    InstanceHandle Child;
    unsigned int ChildIndex;
} ParentChildRelation;
typedef struct VisualElement {
    InstanceHandle Handle;
    SourceInfo SrcInfo;
    BSTR Type;
    BSTR Name;
    unsigned int NumChildren;
} VisualElement;
typedef struct PropertyChainSource {
    InstanceHandle Handle;
    BSTR TargetType;
    BSTR Name;
    BaseValueSource Source;
    SourceInfo SrcInfo;
} PropertyChainSource;
typedef enum MetadataBit {
    None = 0x0,
    IsValueHandle = 0x1,
    IsPropertyReadOnly = 0x2,
    IsValueCollection = 0x4,
    IsValueCollectionReadOnly = 0x8,
    IsValueBindingExpression = 0x10,
    IsValueNull = 0x20,
    IsValueHandleAndEvaluatedValue = 0x40
} MetadataBit;
typedef struct PropertyChainValue {
    unsigned int Index;
    BSTR Type;
    BSTR DeclaringType;
    BSTR ValueType;
    BSTR ItemType;
    BSTR Value;
    WINBOOL Overridden;
    hyper MetadataBits;
    BSTR PropertyName;
    unsigned int PropertyChainIndex;
} PropertyChainValue;
typedef struct EnumType {
    BSTR Name;
    SAFEARRAY *ValueInts;
    SAFEARRAY *ValueStrings;
} EnumType;
typedef struct CollectionElementValue {
    unsigned int Index;
    BSTR ValueType;
    BSTR Value;
    hyper MetadataBits;
} CollectionElementValue;
typedef enum RenderTargetBitmapOptions {
    RenderTarget = 0,
    RenderTargetAndChildren = 1
} RenderTargetBitmapOptions;
typedef struct BitmapDescription {
    unsigned int Width;
    unsigned int Height;
    DXGI_FORMAT Format;
    DXGI_ALPHA_MODE AlphaMode;
} BitmapDescription;
typedef enum ResourceType {
    ResourceTypeStatic = 0,
    ResourceTypeTheme = 1
} ResourceType;
typedef enum VisualElementState {
    ErrorResolved = 0,
    ErrorResourceNotFound = 1,
    ErrorInvalidResource = 2
} VisualElementState;
/*****************************************************************************
 * IVisualTreeServiceCallback interface
 */
#ifndef __IVisualTreeServiceCallback_INTERFACE_DEFINED__
#define __IVisualTreeServiceCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVisualTreeServiceCallback, 0xaa7a8931, 0x80e4, 0x4fec, 0x8f,0x3b, 0x55,0x3f,0x87,0xb4,0x96,0x6e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("aa7a8931-80e4-4fec-8f3b-553f87b4966e")
IVisualTreeServiceCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnVisualTreeChange(
        ParentChildRelation relation,
        VisualElement element,
        VisualMutationType mutation_type) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVisualTreeServiceCallback, 0xaa7a8931, 0x80e4, 0x4fec, 0x8f,0x3b, 0x55,0x3f,0x87,0xb4,0x96,0x6e)
#endif
#else
typedef struct IVisualTreeServiceCallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVisualTreeServiceCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnVisualTreeChange)(
        IVisualTreeServiceCallback *This,
        ParentChildRelation relation,
        VisualElement element,
        VisualMutationType mutation_type);

    END_INTERFACE
} IVisualTreeServiceCallbackVtbl;

interface IVisualTreeServiceCallback {
    CONST_VTBL IVisualTreeServiceCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVisualTreeServiceCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVisualTreeServiceCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVisualTreeServiceCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IVisualTreeServiceCallback methods ***/
#define IVisualTreeServiceCallback_OnVisualTreeChange(This,relation,element,mutation_type) (This)->lpVtbl->OnVisualTreeChange(This,relation,element,mutation_type)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVisualTreeServiceCallback_QueryInterface(IVisualTreeServiceCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVisualTreeServiceCallback_AddRef(IVisualTreeServiceCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVisualTreeServiceCallback_Release(IVisualTreeServiceCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IVisualTreeServiceCallback methods ***/
static __WIDL_INLINE HRESULT IVisualTreeServiceCallback_OnVisualTreeChange(IVisualTreeServiceCallback* This,ParentChildRelation relation,VisualElement element,VisualMutationType mutation_type) {
    return This->lpVtbl->OnVisualTreeChange(This,relation,element,mutation_type);
}
#endif
#endif

#endif


#endif  /* __IVisualTreeServiceCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVisualTreeServiceCallback2 interface
 */
#ifndef __IVisualTreeServiceCallback2_INTERFACE_DEFINED__
#define __IVisualTreeServiceCallback2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVisualTreeServiceCallback2, 0xbad9eb88, 0xae77, 0x4397, 0xb9,0x48, 0x5f,0xa2,0xdb,0x0a,0x19,0xea);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bad9eb88-ae77-4397-b948-5fa2db0a19ea")
IVisualTreeServiceCallback2 : public IVisualTreeServiceCallback
{
    virtual HRESULT STDMETHODCALLTYPE OnElementStateChanged(
        InstanceHandle element,
        VisualElementState element_state,
        LPCWSTR context) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVisualTreeServiceCallback2, 0xbad9eb88, 0xae77, 0x4397, 0xb9,0x48, 0x5f,0xa2,0xdb,0x0a,0x19,0xea)
#endif
#else
typedef struct IVisualTreeServiceCallback2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVisualTreeServiceCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnVisualTreeChange)(
        IVisualTreeServiceCallback2 *This,
        ParentChildRelation relation,
        VisualElement element,
        VisualMutationType mutation_type);

    /*** IVisualTreeServiceCallback2 methods ***/
    HRESULT (STDMETHODCALLTYPE *OnElementStateChanged)(
        IVisualTreeServiceCallback2 *This,
        InstanceHandle element,
        VisualElementState element_state,
        LPCWSTR context);

    END_INTERFACE
} IVisualTreeServiceCallback2Vtbl;

interface IVisualTreeServiceCallback2 {
    CONST_VTBL IVisualTreeServiceCallback2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVisualTreeServiceCallback2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVisualTreeServiceCallback2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVisualTreeServiceCallback2_Release(This) (This)->lpVtbl->Release(This)
/*** IVisualTreeServiceCallback methods ***/
#define IVisualTreeServiceCallback2_OnVisualTreeChange(This,relation,element,mutation_type) (This)->lpVtbl->OnVisualTreeChange(This,relation,element,mutation_type)
/*** IVisualTreeServiceCallback2 methods ***/
#define IVisualTreeServiceCallback2_OnElementStateChanged(This,element,element_state,context) (This)->lpVtbl->OnElementStateChanged(This,element,element_state,context)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVisualTreeServiceCallback2_QueryInterface(IVisualTreeServiceCallback2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVisualTreeServiceCallback2_AddRef(IVisualTreeServiceCallback2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVisualTreeServiceCallback2_Release(IVisualTreeServiceCallback2* This) {
    return This->lpVtbl->Release(This);
}
/*** IVisualTreeServiceCallback methods ***/
static __WIDL_INLINE HRESULT IVisualTreeServiceCallback2_OnVisualTreeChange(IVisualTreeServiceCallback2* This,ParentChildRelation relation,VisualElement element,VisualMutationType mutation_type) {
    return This->lpVtbl->OnVisualTreeChange(This,relation,element,mutation_type);
}
/*** IVisualTreeServiceCallback2 methods ***/
static __WIDL_INLINE HRESULT IVisualTreeServiceCallback2_OnElementStateChanged(IVisualTreeServiceCallback2* This,InstanceHandle element,VisualElementState element_state,LPCWSTR context) {
    return This->lpVtbl->OnElementStateChanged(This,element,element_state,context);
}
#endif
#endif

#endif


#endif  /* __IVisualTreeServiceCallback2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVisualTreeService interface
 */
#ifndef __IVisualTreeService_INTERFACE_DEFINED__
#define __IVisualTreeService_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVisualTreeService, 0xa593b11a, 0xd17f, 0x48bb, 0x8f,0x66, 0x83,0x91,0x07,0x31,0xc8,0xa5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a593b11a-d17f-48bb-8f66-83910731c8a5")
IVisualTreeService : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AdviseVisualTreeChange(
        IVisualTreeServiceCallback *callback) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnadviseVisualTreeChange(
        IVisualTreeServiceCallback *callback) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnums(
        unsigned int *count,
        EnumType **enums) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
        BSTR type_name,
        BSTR value,
        InstanceHandle *instance_handle) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyValuesChain(
        InstanceHandle instance_handle,
        unsigned int *source_count,
        PropertyChainSource **property_sources,
        unsigned int *property_count,
        PropertyChainValue **property_values) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProperty(
        InstanceHandle instance_handle,
        InstanceHandle value,
        unsigned int property_index) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearProperty(
        InstanceHandle instance_handle,
        unsigned int property_index) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCollectionCount(
        InstanceHandle instance_handle,
        unsigned int *collection_size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCollectionElements(
        InstanceHandle instance_handle,
        unsigned int start_index,
        unsigned int *element_count,
        CollectionElementValue **element_values) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddChild(
        InstanceHandle parent,
        InstanceHandle child,
        unsigned int index) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveChild(
        InstanceHandle parent,
        unsigned int index) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearChildren(
        InstanceHandle parent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVisualTreeService, 0xa593b11a, 0xd17f, 0x48bb, 0x8f,0x66, 0x83,0x91,0x07,0x31,0xc8,0xa5)
#endif
#else
typedef struct IVisualTreeServiceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVisualTreeService methods ***/
    HRESULT (STDMETHODCALLTYPE *AdviseVisualTreeChange)(
        IVisualTreeService *This,
        IVisualTreeServiceCallback *callback);

    HRESULT (STDMETHODCALLTYPE *UnadviseVisualTreeChange)(
        IVisualTreeService *This,
        IVisualTreeServiceCallback *callback);

    HRESULT (STDMETHODCALLTYPE *GetEnums)(
        IVisualTreeService *This,
        unsigned int *count,
        EnumType **enums);

    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        IVisualTreeService *This,
        BSTR type_name,
        BSTR value,
        InstanceHandle *instance_handle);

    HRESULT (STDMETHODCALLTYPE *GetPropertyValuesChain)(
        IVisualTreeService *This,
        InstanceHandle instance_handle,
        unsigned int *source_count,
        PropertyChainSource **property_sources,
        unsigned int *property_count,
        PropertyChainValue **property_values);

    HRESULT (STDMETHODCALLTYPE *SetProperty)(
        IVisualTreeService *This,
        InstanceHandle instance_handle,
        InstanceHandle value,
        unsigned int property_index);

    HRESULT (STDMETHODCALLTYPE *ClearProperty)(
        IVisualTreeService *This,
        InstanceHandle instance_handle,
        unsigned int property_index);

    HRESULT (STDMETHODCALLTYPE *GetCollectionCount)(
        IVisualTreeService *This,
        InstanceHandle instance_handle,
        unsigned int *collection_size);

    HRESULT (STDMETHODCALLTYPE *GetCollectionElements)(
        IVisualTreeService *This,
        InstanceHandle instance_handle,
        unsigned int start_index,
        unsigned int *element_count,
        CollectionElementValue **element_values);

    HRESULT (STDMETHODCALLTYPE *AddChild)(
        IVisualTreeService *This,
        InstanceHandle parent,
        InstanceHandle child,
        unsigned int index);

    HRESULT (STDMETHODCALLTYPE *RemoveChild)(
        IVisualTreeService *This,
        InstanceHandle parent,
        unsigned int index);

    HRESULT (STDMETHODCALLTYPE *ClearChildren)(
        IVisualTreeService *This,
        InstanceHandle parent);

    END_INTERFACE
} IVisualTreeServiceVtbl;

interface IVisualTreeService {
    CONST_VTBL IVisualTreeServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVisualTreeService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVisualTreeService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVisualTreeService_Release(This) (This)->lpVtbl->Release(This)
/*** IVisualTreeService methods ***/
#define IVisualTreeService_AdviseVisualTreeChange(This,callback) (This)->lpVtbl->AdviseVisualTreeChange(This,callback)
#define IVisualTreeService_UnadviseVisualTreeChange(This,callback) (This)->lpVtbl->UnadviseVisualTreeChange(This,callback)
#define IVisualTreeService_GetEnums(This,count,enums) (This)->lpVtbl->GetEnums(This,count,enums)
#define IVisualTreeService_CreateInstance(This,type_name,value,instance_handle) (This)->lpVtbl->CreateInstance(This,type_name,value,instance_handle)
#define IVisualTreeService_GetPropertyValuesChain(This,instance_handle,source_count,property_sources,property_count,property_values) (This)->lpVtbl->GetPropertyValuesChain(This,instance_handle,source_count,property_sources,property_count,property_values)
#define IVisualTreeService_SetProperty(This,instance_handle,value,property_index) (This)->lpVtbl->SetProperty(This,instance_handle,value,property_index)
#define IVisualTreeService_ClearProperty(This,instance_handle,property_index) (This)->lpVtbl->ClearProperty(This,instance_handle,property_index)
#define IVisualTreeService_GetCollectionCount(This,instance_handle,collection_size) (This)->lpVtbl->GetCollectionCount(This,instance_handle,collection_size)
#define IVisualTreeService_GetCollectionElements(This,instance_handle,start_index,element_count,element_values) (This)->lpVtbl->GetCollectionElements(This,instance_handle,start_index,element_count,element_values)
#define IVisualTreeService_AddChild(This,parent,child,index) (This)->lpVtbl->AddChild(This,parent,child,index)
#define IVisualTreeService_RemoveChild(This,parent,index) (This)->lpVtbl->RemoveChild(This,parent,index)
#define IVisualTreeService_ClearChildren(This,parent) (This)->lpVtbl->ClearChildren(This,parent)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVisualTreeService_QueryInterface(IVisualTreeService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVisualTreeService_AddRef(IVisualTreeService* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVisualTreeService_Release(IVisualTreeService* This) {
    return This->lpVtbl->Release(This);
}
/*** IVisualTreeService methods ***/
static __WIDL_INLINE HRESULT IVisualTreeService_AdviseVisualTreeChange(IVisualTreeService* This,IVisualTreeServiceCallback *callback) {
    return This->lpVtbl->AdviseVisualTreeChange(This,callback);
}
static __WIDL_INLINE HRESULT IVisualTreeService_UnadviseVisualTreeChange(IVisualTreeService* This,IVisualTreeServiceCallback *callback) {
    return This->lpVtbl->UnadviseVisualTreeChange(This,callback);
}
static __WIDL_INLINE HRESULT IVisualTreeService_GetEnums(IVisualTreeService* This,unsigned int *count,EnumType **enums) {
    return This->lpVtbl->GetEnums(This,count,enums);
}
static __WIDL_INLINE HRESULT IVisualTreeService_CreateInstance(IVisualTreeService* This,BSTR type_name,BSTR value,InstanceHandle *instance_handle) {
    return This->lpVtbl->CreateInstance(This,type_name,value,instance_handle);
}
static __WIDL_INLINE HRESULT IVisualTreeService_GetPropertyValuesChain(IVisualTreeService* This,InstanceHandle instance_handle,unsigned int *source_count,PropertyChainSource **property_sources,unsigned int *property_count,PropertyChainValue **property_values) {
    return This->lpVtbl->GetPropertyValuesChain(This,instance_handle,source_count,property_sources,property_count,property_values);
}
static __WIDL_INLINE HRESULT IVisualTreeService_SetProperty(IVisualTreeService* This,InstanceHandle instance_handle,InstanceHandle value,unsigned int property_index) {
    return This->lpVtbl->SetProperty(This,instance_handle,value,property_index);
}
static __WIDL_INLINE HRESULT IVisualTreeService_ClearProperty(IVisualTreeService* This,InstanceHandle instance_handle,unsigned int property_index) {
    return This->lpVtbl->ClearProperty(This,instance_handle,property_index);
}
static __WIDL_INLINE HRESULT IVisualTreeService_GetCollectionCount(IVisualTreeService* This,InstanceHandle instance_handle,unsigned int *collection_size) {
    return This->lpVtbl->GetCollectionCount(This,instance_handle,collection_size);
}
static __WIDL_INLINE HRESULT IVisualTreeService_GetCollectionElements(IVisualTreeService* This,InstanceHandle instance_handle,unsigned int start_index,unsigned int *element_count,CollectionElementValue **element_values) {
    return This->lpVtbl->GetCollectionElements(This,instance_handle,start_index,element_count,element_values);
}
static __WIDL_INLINE HRESULT IVisualTreeService_AddChild(IVisualTreeService* This,InstanceHandle parent,InstanceHandle child,unsigned int index) {
    return This->lpVtbl->AddChild(This,parent,child,index);
}
static __WIDL_INLINE HRESULT IVisualTreeService_RemoveChild(IVisualTreeService* This,InstanceHandle parent,unsigned int index) {
    return This->lpVtbl->RemoveChild(This,parent,index);
}
static __WIDL_INLINE HRESULT IVisualTreeService_ClearChildren(IVisualTreeService* This,InstanceHandle parent) {
    return This->lpVtbl->ClearChildren(This,parent);
}
#endif
#endif

#endif


#endif  /* __IVisualTreeService_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXamlDiagnostics interface
 */
#ifndef __IXamlDiagnostics_INTERFACE_DEFINED__
#define __IXamlDiagnostics_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXamlDiagnostics, 0x18c9e2b6, 0x3f43, 0x4116, 0x9f,0x2b, 0xff,0x93,0x5d,0x77,0x70,0xd2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("18c9e2b6-3f43-4116-9f2b-ff935d7770d2")
IXamlDiagnostics : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDispatcher(
        IInspectable **dispatcher) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUiLayer(
        IInspectable **layer) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetApplication(
        IInspectable **application) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIInspectableFromHandle(
        InstanceHandle instance_handle,
        IInspectable **instance) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHandleFromIInspectable(
        IInspectable *instance,
        InstanceHandle *handle) = 0;

    virtual HRESULT STDMETHODCALLTYPE HitTest(
        RECT rect,
        unsigned int *count,
        InstanceHandle **instance_handles) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterInstance(
        IInspectable *instance,
        InstanceHandle *instance_handle) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInitializationData(
        BSTR *initialization_data) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXamlDiagnostics, 0x18c9e2b6, 0x3f43, 0x4116, 0x9f,0x2b, 0xff,0x93,0x5d,0x77,0x70,0xd2)
#endif
#else
typedef struct IXamlDiagnosticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXamlDiagnostics methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDispatcher)(
        IXamlDiagnostics *This,
        IInspectable **dispatcher);

    HRESULT (STDMETHODCALLTYPE *GetUiLayer)(
        IXamlDiagnostics *This,
        IInspectable **layer);

    HRESULT (STDMETHODCALLTYPE *GetApplication)(
        IXamlDiagnostics *This,
        IInspectable **application);

    HRESULT (STDMETHODCALLTYPE *GetIInspectableFromHandle)(
        IXamlDiagnostics *This,
        InstanceHandle instance_handle,
        IInspectable **instance);

    HRESULT (STDMETHODCALLTYPE *GetHandleFromIInspectable)(
        IXamlDiagnostics *This,
        IInspectable *instance,
        InstanceHandle *handle);

    HRESULT (STDMETHODCALLTYPE *HitTest)(
        IXamlDiagnostics *This,
        RECT rect,
        unsigned int *count,
        InstanceHandle **instance_handles);

    HRESULT (STDMETHODCALLTYPE *RegisterInstance)(
        IXamlDiagnostics *This,
        IInspectable *instance,
        InstanceHandle *instance_handle);

    HRESULT (STDMETHODCALLTYPE *GetInitializationData)(
        IXamlDiagnostics *This,
        BSTR *initialization_data);

    END_INTERFACE
} IXamlDiagnosticsVtbl;

interface IXamlDiagnostics {
    CONST_VTBL IXamlDiagnosticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXamlDiagnostics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXamlDiagnostics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXamlDiagnostics_Release(This) (This)->lpVtbl->Release(This)
/*** IXamlDiagnostics methods ***/
#define IXamlDiagnostics_GetDispatcher(This,dispatcher) (This)->lpVtbl->GetDispatcher(This,dispatcher)
#define IXamlDiagnostics_GetUiLayer(This,layer) (This)->lpVtbl->GetUiLayer(This,layer)
#define IXamlDiagnostics_GetApplication(This,application) (This)->lpVtbl->GetApplication(This,application)
#define IXamlDiagnostics_GetIInspectableFromHandle(This,instance_handle,instance) (This)->lpVtbl->GetIInspectableFromHandle(This,instance_handle,instance)
#define IXamlDiagnostics_GetHandleFromIInspectable(This,instance,handle) (This)->lpVtbl->GetHandleFromIInspectable(This,instance,handle)
#define IXamlDiagnostics_HitTest(This,rect,count,instance_handles) (This)->lpVtbl->HitTest(This,rect,count,instance_handles)
#define IXamlDiagnostics_RegisterInstance(This,instance,instance_handle) (This)->lpVtbl->RegisterInstance(This,instance,instance_handle)
#define IXamlDiagnostics_GetInitializationData(This,initialization_data) (This)->lpVtbl->GetInitializationData(This,initialization_data)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXamlDiagnostics_QueryInterface(IXamlDiagnostics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXamlDiagnostics_AddRef(IXamlDiagnostics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXamlDiagnostics_Release(IXamlDiagnostics* This) {
    return This->lpVtbl->Release(This);
}
/*** IXamlDiagnostics methods ***/
static __WIDL_INLINE HRESULT IXamlDiagnostics_GetDispatcher(IXamlDiagnostics* This,IInspectable **dispatcher) {
    return This->lpVtbl->GetDispatcher(This,dispatcher);
}
static __WIDL_INLINE HRESULT IXamlDiagnostics_GetUiLayer(IXamlDiagnostics* This,IInspectable **layer) {
    return This->lpVtbl->GetUiLayer(This,layer);
}
static __WIDL_INLINE HRESULT IXamlDiagnostics_GetApplication(IXamlDiagnostics* This,IInspectable **application) {
    return This->lpVtbl->GetApplication(This,application);
}
static __WIDL_INLINE HRESULT IXamlDiagnostics_GetIInspectableFromHandle(IXamlDiagnostics* This,InstanceHandle instance_handle,IInspectable **instance) {
    return This->lpVtbl->GetIInspectableFromHandle(This,instance_handle,instance);
}
static __WIDL_INLINE HRESULT IXamlDiagnostics_GetHandleFromIInspectable(IXamlDiagnostics* This,IInspectable *instance,InstanceHandle *handle) {
    return This->lpVtbl->GetHandleFromIInspectable(This,instance,handle);
}
static __WIDL_INLINE HRESULT IXamlDiagnostics_HitTest(IXamlDiagnostics* This,RECT rect,unsigned int *count,InstanceHandle **instance_handles) {
    return This->lpVtbl->HitTest(This,rect,count,instance_handles);
}
static __WIDL_INLINE HRESULT IXamlDiagnostics_RegisterInstance(IXamlDiagnostics* This,IInspectable *instance,InstanceHandle *instance_handle) {
    return This->lpVtbl->RegisterInstance(This,instance,instance_handle);
}
static __WIDL_INLINE HRESULT IXamlDiagnostics_GetInitializationData(IXamlDiagnostics* This,BSTR *initialization_data) {
    return This->lpVtbl->GetInitializationData(This,initialization_data);
}
#endif
#endif

#endif


#endif  /* __IXamlDiagnostics_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBitmapData interface
 */
#ifndef __IBitmapData_INTERFACE_DEFINED__
#define __IBitmapData_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBitmapData, 0xd1a34ef2, 0xcad8, 0x4635, 0xa3,0xd2, 0xfc,0xda,0x8d,0x3f,0x3c,0xaf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d1a34ef2-cad8-4635-a3d2-fcda8d3f3caf")
IBitmapData : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CopyBytesTo(
        unsigned int source_offset_in_bytes,
        unsigned int max_bytes_to_copy,
        byte *bytes,
        unsigned int *number_of_bytes_copied) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStride(
        unsigned int *stride) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBitmapDescription(
        BitmapDescription *bitmap_description) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSourceBitmapDescription(
        BitmapDescription *bitmap_description) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBitmapData, 0xd1a34ef2, 0xcad8, 0x4635, 0xa3,0xd2, 0xfc,0xda,0x8d,0x3f,0x3c,0xaf)
#endif
#else
typedef struct IBitmapDataVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBitmapData methods ***/
    HRESULT (STDMETHODCALLTYPE *CopyBytesTo)(
        IBitmapData *This,
        unsigned int source_offset_in_bytes,
        unsigned int max_bytes_to_copy,
        byte *bytes,
        unsigned int *number_of_bytes_copied);

    HRESULT (STDMETHODCALLTYPE *GetStride)(
        IBitmapData *This,
        unsigned int *stride);

    HRESULT (STDMETHODCALLTYPE *GetBitmapDescription)(
        IBitmapData *This,
        BitmapDescription *bitmap_description);

    HRESULT (STDMETHODCALLTYPE *GetSourceBitmapDescription)(
        IBitmapData *This,
        BitmapDescription *bitmap_description);

    END_INTERFACE
} IBitmapDataVtbl;

interface IBitmapData {
    CONST_VTBL IBitmapDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBitmapData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBitmapData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBitmapData_Release(This) (This)->lpVtbl->Release(This)
/*** IBitmapData methods ***/
#define IBitmapData_CopyBytesTo(This,source_offset_in_bytes,max_bytes_to_copy,bytes,number_of_bytes_copied) (This)->lpVtbl->CopyBytesTo(This,source_offset_in_bytes,max_bytes_to_copy,bytes,number_of_bytes_copied)
#define IBitmapData_GetStride(This,stride) (This)->lpVtbl->GetStride(This,stride)
#define IBitmapData_GetBitmapDescription(This,bitmap_description) (This)->lpVtbl->GetBitmapDescription(This,bitmap_description)
#define IBitmapData_GetSourceBitmapDescription(This,bitmap_description) (This)->lpVtbl->GetSourceBitmapDescription(This,bitmap_description)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IBitmapData_QueryInterface(IBitmapData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IBitmapData_AddRef(IBitmapData* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IBitmapData_Release(IBitmapData* This) {
    return This->lpVtbl->Release(This);
}
/*** IBitmapData methods ***/
static __WIDL_INLINE HRESULT IBitmapData_CopyBytesTo(IBitmapData* This,unsigned int source_offset_in_bytes,unsigned int max_bytes_to_copy,byte *bytes,unsigned int *number_of_bytes_copied) {
    return This->lpVtbl->CopyBytesTo(This,source_offset_in_bytes,max_bytes_to_copy,bytes,number_of_bytes_copied);
}
static __WIDL_INLINE HRESULT IBitmapData_GetStride(IBitmapData* This,unsigned int *stride) {
    return This->lpVtbl->GetStride(This,stride);
}
static __WIDL_INLINE HRESULT IBitmapData_GetBitmapDescription(IBitmapData* This,BitmapDescription *bitmap_description) {
    return This->lpVtbl->GetBitmapDescription(This,bitmap_description);
}
static __WIDL_INLINE HRESULT IBitmapData_GetSourceBitmapDescription(IBitmapData* This,BitmapDescription *bitmap_description) {
    return This->lpVtbl->GetSourceBitmapDescription(This,bitmap_description);
}
#endif
#endif

#endif


#endif  /* __IBitmapData_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVisualTreeService2 interface
 */
#ifndef __IVisualTreeService2_INTERFACE_DEFINED__
#define __IVisualTreeService2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVisualTreeService2, 0x130f5136, 0xec43, 0x4f61, 0x89,0xc7, 0x98,0x01,0xa3,0x6d,0x2e,0x95);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("130f5136-ec43-4f61-89c7-9801a36d2e95")
IVisualTreeService2 : public IVisualTreeService
{
    virtual HRESULT STDMETHODCALLTYPE GetPropertyIndex(
        InstanceHandle object,
        LPCWSTR property_name,
        unsigned int *property_index) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProperty(
        InstanceHandle object,
        unsigned int property_index,
        InstanceHandle *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReplaceResource(
        InstanceHandle resource_dictionary,
        InstanceHandle key,
        InstanceHandle new_value) = 0;

    virtual HRESULT STDMETHODCALLTYPE RenderTargetBitmap(
        InstanceHandle handle,
        RenderTargetBitmapOptions options,
        unsigned int max_pixel_width,
        unsigned int max_pixel_height,
        IBitmapData **bitmap_data) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVisualTreeService2, 0x130f5136, 0xec43, 0x4f61, 0x89,0xc7, 0x98,0x01,0xa3,0x6d,0x2e,0x95)
#endif
#else
typedef struct IVisualTreeService2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVisualTreeService methods ***/
    HRESULT (STDMETHODCALLTYPE *AdviseVisualTreeChange)(
        IVisualTreeService2 *This,
        IVisualTreeServiceCallback *callback);

    HRESULT (STDMETHODCALLTYPE *UnadviseVisualTreeChange)(
        IVisualTreeService2 *This,
        IVisualTreeServiceCallback *callback);

    HRESULT (STDMETHODCALLTYPE *GetEnums)(
        IVisualTreeService2 *This,
        unsigned int *count,
        EnumType **enums);

    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        IVisualTreeService2 *This,
        BSTR type_name,
        BSTR value,
        InstanceHandle *instance_handle);

    HRESULT (STDMETHODCALLTYPE *GetPropertyValuesChain)(
        IVisualTreeService2 *This,
        InstanceHandle instance_handle,
        unsigned int *source_count,
        PropertyChainSource **property_sources,
        unsigned int *property_count,
        PropertyChainValue **property_values);

    HRESULT (STDMETHODCALLTYPE *SetProperty)(
        IVisualTreeService2 *This,
        InstanceHandle instance_handle,
        InstanceHandle value,
        unsigned int property_index);

    HRESULT (STDMETHODCALLTYPE *ClearProperty)(
        IVisualTreeService2 *This,
        InstanceHandle instance_handle,
        unsigned int property_index);

    HRESULT (STDMETHODCALLTYPE *GetCollectionCount)(
        IVisualTreeService2 *This,
        InstanceHandle instance_handle,
        unsigned int *collection_size);

    HRESULT (STDMETHODCALLTYPE *GetCollectionElements)(
        IVisualTreeService2 *This,
        InstanceHandle instance_handle,
        unsigned int start_index,
        unsigned int *element_count,
        CollectionElementValue **element_values);

    HRESULT (STDMETHODCALLTYPE *AddChild)(
        IVisualTreeService2 *This,
        InstanceHandle parent,
        InstanceHandle child,
        unsigned int index);

    HRESULT (STDMETHODCALLTYPE *RemoveChild)(
        IVisualTreeService2 *This,
        InstanceHandle parent,
        unsigned int index);

    HRESULT (STDMETHODCALLTYPE *ClearChildren)(
        IVisualTreeService2 *This,
        InstanceHandle parent);

    /*** IVisualTreeService2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPropertyIndex)(
        IVisualTreeService2 *This,
        InstanceHandle object,
        LPCWSTR property_name,
        unsigned int *property_index);

    HRESULT (STDMETHODCALLTYPE *GetProperty)(
        IVisualTreeService2 *This,
        InstanceHandle object,
        unsigned int property_index,
        InstanceHandle *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceResource)(
        IVisualTreeService2 *This,
        InstanceHandle resource_dictionary,
        InstanceHandle key,
        InstanceHandle new_value);

    HRESULT (STDMETHODCALLTYPE *RenderTargetBitmap)(
        IVisualTreeService2 *This,
        InstanceHandle handle,
        RenderTargetBitmapOptions options,
        unsigned int max_pixel_width,
        unsigned int max_pixel_height,
        IBitmapData **bitmap_data);

    END_INTERFACE
} IVisualTreeService2Vtbl;

interface IVisualTreeService2 {
    CONST_VTBL IVisualTreeService2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVisualTreeService2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVisualTreeService2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVisualTreeService2_Release(This) (This)->lpVtbl->Release(This)
/*** IVisualTreeService methods ***/
#define IVisualTreeService2_AdviseVisualTreeChange(This,callback) (This)->lpVtbl->AdviseVisualTreeChange(This,callback)
#define IVisualTreeService2_UnadviseVisualTreeChange(This,callback) (This)->lpVtbl->UnadviseVisualTreeChange(This,callback)
#define IVisualTreeService2_GetEnums(This,count,enums) (This)->lpVtbl->GetEnums(This,count,enums)
#define IVisualTreeService2_CreateInstance(This,type_name,value,instance_handle) (This)->lpVtbl->CreateInstance(This,type_name,value,instance_handle)
#define IVisualTreeService2_GetPropertyValuesChain(This,instance_handle,source_count,property_sources,property_count,property_values) (This)->lpVtbl->GetPropertyValuesChain(This,instance_handle,source_count,property_sources,property_count,property_values)
#define IVisualTreeService2_SetProperty(This,instance_handle,value,property_index) (This)->lpVtbl->SetProperty(This,instance_handle,value,property_index)
#define IVisualTreeService2_ClearProperty(This,instance_handle,property_index) (This)->lpVtbl->ClearProperty(This,instance_handle,property_index)
#define IVisualTreeService2_GetCollectionCount(This,instance_handle,collection_size) (This)->lpVtbl->GetCollectionCount(This,instance_handle,collection_size)
#define IVisualTreeService2_GetCollectionElements(This,instance_handle,start_index,element_count,element_values) (This)->lpVtbl->GetCollectionElements(This,instance_handle,start_index,element_count,element_values)
#define IVisualTreeService2_AddChild(This,parent,child,index) (This)->lpVtbl->AddChild(This,parent,child,index)
#define IVisualTreeService2_RemoveChild(This,parent,index) (This)->lpVtbl->RemoveChild(This,parent,index)
#define IVisualTreeService2_ClearChildren(This,parent) (This)->lpVtbl->ClearChildren(This,parent)
/*** IVisualTreeService2 methods ***/
#define IVisualTreeService2_GetPropertyIndex(This,object,property_name,property_index) (This)->lpVtbl->GetPropertyIndex(This,object,property_name,property_index)
#define IVisualTreeService2_GetProperty(This,object,property_index,value) (This)->lpVtbl->GetProperty(This,object,property_index,value)
#define IVisualTreeService2_ReplaceResource(This,resource_dictionary,key,new_value) (This)->lpVtbl->ReplaceResource(This,resource_dictionary,key,new_value)
#define IVisualTreeService2_RenderTargetBitmap(This,handle,options,max_pixel_width,max_pixel_height,bitmap_data) (This)->lpVtbl->RenderTargetBitmap(This,handle,options,max_pixel_width,max_pixel_height,bitmap_data)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVisualTreeService2_QueryInterface(IVisualTreeService2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVisualTreeService2_AddRef(IVisualTreeService2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVisualTreeService2_Release(IVisualTreeService2* This) {
    return This->lpVtbl->Release(This);
}
/*** IVisualTreeService methods ***/
static __WIDL_INLINE HRESULT IVisualTreeService2_AdviseVisualTreeChange(IVisualTreeService2* This,IVisualTreeServiceCallback *callback) {
    return This->lpVtbl->AdviseVisualTreeChange(This,callback);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_UnadviseVisualTreeChange(IVisualTreeService2* This,IVisualTreeServiceCallback *callback) {
    return This->lpVtbl->UnadviseVisualTreeChange(This,callback);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_GetEnums(IVisualTreeService2* This,unsigned int *count,EnumType **enums) {
    return This->lpVtbl->GetEnums(This,count,enums);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_CreateInstance(IVisualTreeService2* This,BSTR type_name,BSTR value,InstanceHandle *instance_handle) {
    return This->lpVtbl->CreateInstance(This,type_name,value,instance_handle);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_GetPropertyValuesChain(IVisualTreeService2* This,InstanceHandle instance_handle,unsigned int *source_count,PropertyChainSource **property_sources,unsigned int *property_count,PropertyChainValue **property_values) {
    return This->lpVtbl->GetPropertyValuesChain(This,instance_handle,source_count,property_sources,property_count,property_values);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_SetProperty(IVisualTreeService2* This,InstanceHandle instance_handle,InstanceHandle value,unsigned int property_index) {
    return This->lpVtbl->SetProperty(This,instance_handle,value,property_index);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_ClearProperty(IVisualTreeService2* This,InstanceHandle instance_handle,unsigned int property_index) {
    return This->lpVtbl->ClearProperty(This,instance_handle,property_index);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_GetCollectionCount(IVisualTreeService2* This,InstanceHandle instance_handle,unsigned int *collection_size) {
    return This->lpVtbl->GetCollectionCount(This,instance_handle,collection_size);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_GetCollectionElements(IVisualTreeService2* This,InstanceHandle instance_handle,unsigned int start_index,unsigned int *element_count,CollectionElementValue **element_values) {
    return This->lpVtbl->GetCollectionElements(This,instance_handle,start_index,element_count,element_values);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_AddChild(IVisualTreeService2* This,InstanceHandle parent,InstanceHandle child,unsigned int index) {
    return This->lpVtbl->AddChild(This,parent,child,index);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_RemoveChild(IVisualTreeService2* This,InstanceHandle parent,unsigned int index) {
    return This->lpVtbl->RemoveChild(This,parent,index);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_ClearChildren(IVisualTreeService2* This,InstanceHandle parent) {
    return This->lpVtbl->ClearChildren(This,parent);
}
/*** IVisualTreeService2 methods ***/
static __WIDL_INLINE HRESULT IVisualTreeService2_GetPropertyIndex(IVisualTreeService2* This,InstanceHandle object,LPCWSTR property_name,unsigned int *property_index) {
    return This->lpVtbl->GetPropertyIndex(This,object,property_name,property_index);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_GetProperty(IVisualTreeService2* This,InstanceHandle object,unsigned int property_index,InstanceHandle *value) {
    return This->lpVtbl->GetProperty(This,object,property_index,value);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_ReplaceResource(IVisualTreeService2* This,InstanceHandle resource_dictionary,InstanceHandle key,InstanceHandle new_value) {
    return This->lpVtbl->ReplaceResource(This,resource_dictionary,key,new_value);
}
static __WIDL_INLINE HRESULT IVisualTreeService2_RenderTargetBitmap(IVisualTreeService2* This,InstanceHandle handle,RenderTargetBitmapOptions options,unsigned int max_pixel_width,unsigned int max_pixel_height,IBitmapData **bitmap_data) {
    return This->lpVtbl->RenderTargetBitmap(This,handle,options,max_pixel_width,max_pixel_height,bitmap_data);
}
#endif
#endif

#endif


#endif  /* __IVisualTreeService2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVisualTreeService3 interface
 */
#ifndef __IVisualTreeService3_INTERFACE_DEFINED__
#define __IVisualTreeService3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVisualTreeService3, 0x0e79c6e0, 0x85a0, 0x4be8, 0xb4,0x1a, 0x65,0x5c,0xf1,0xfd,0x19,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0e79c6e0-85a0-4be8-b41a-655cf1fd19bd")
IVisualTreeService3 : public IVisualTreeService2
{
    virtual HRESULT STDMETHODCALLTYPE ResolveResource(
        InstanceHandle resource_context,
        LPCWSTR resource_name,
        ResourceType resource_type,
        unsigned int property_index) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDictionaryItem(
        InstanceHandle dictionary_handle,
        LPCWSTR resource_name,
        WINBOOL resource_is_implicit_style,
        InstanceHandle *resource_handle) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddDictionaryItem(
        InstanceHandle dictionary_handle,
        InstanceHandle resource_key,
        InstanceHandle resource_handle) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveDictionaryItem(
        InstanceHandle dictionary_handle,
        InstanceHandle resource_key) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVisualTreeService3, 0x0e79c6e0, 0x85a0, 0x4be8, 0xb4,0x1a, 0x65,0x5c,0xf1,0xfd,0x19,0xbd)
#endif
#else
typedef struct IVisualTreeService3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVisualTreeService methods ***/
    HRESULT (STDMETHODCALLTYPE *AdviseVisualTreeChange)(
        IVisualTreeService3 *This,
        IVisualTreeServiceCallback *callback);

    HRESULT (STDMETHODCALLTYPE *UnadviseVisualTreeChange)(
        IVisualTreeService3 *This,
        IVisualTreeServiceCallback *callback);

    HRESULT (STDMETHODCALLTYPE *GetEnums)(
        IVisualTreeService3 *This,
        unsigned int *count,
        EnumType **enums);

    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        IVisualTreeService3 *This,
        BSTR type_name,
        BSTR value,
        InstanceHandle *instance_handle);

    HRESULT (STDMETHODCALLTYPE *GetPropertyValuesChain)(
        IVisualTreeService3 *This,
        InstanceHandle instance_handle,
        unsigned int *source_count,
        PropertyChainSource **property_sources,
        unsigned int *property_count,
        PropertyChainValue **property_values);

    HRESULT (STDMETHODCALLTYPE *SetProperty)(
        IVisualTreeService3 *This,
        InstanceHandle instance_handle,
        InstanceHandle value,
        unsigned int property_index);

    HRESULT (STDMETHODCALLTYPE *ClearProperty)(
        IVisualTreeService3 *This,
        InstanceHandle instance_handle,
        unsigned int property_index);

    HRESULT (STDMETHODCALLTYPE *GetCollectionCount)(
        IVisualTreeService3 *This,
        InstanceHandle instance_handle,
        unsigned int *collection_size);

    HRESULT (STDMETHODCALLTYPE *GetCollectionElements)(
        IVisualTreeService3 *This,
        InstanceHandle instance_handle,
        unsigned int start_index,
        unsigned int *element_count,
        CollectionElementValue **element_values);

    HRESULT (STDMETHODCALLTYPE *AddChild)(
        IVisualTreeService3 *This,
        InstanceHandle parent,
        InstanceHandle child,
        unsigned int index);

    HRESULT (STDMETHODCALLTYPE *RemoveChild)(
        IVisualTreeService3 *This,
        InstanceHandle parent,
        unsigned int index);

    HRESULT (STDMETHODCALLTYPE *ClearChildren)(
        IVisualTreeService3 *This,
        InstanceHandle parent);

    /*** IVisualTreeService2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPropertyIndex)(
        IVisualTreeService3 *This,
        InstanceHandle object,
        LPCWSTR property_name,
        unsigned int *property_index);

    HRESULT (STDMETHODCALLTYPE *GetProperty)(
        IVisualTreeService3 *This,
        InstanceHandle object,
        unsigned int property_index,
        InstanceHandle *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceResource)(
        IVisualTreeService3 *This,
        InstanceHandle resource_dictionary,
        InstanceHandle key,
        InstanceHandle new_value);

    HRESULT (STDMETHODCALLTYPE *RenderTargetBitmap)(
        IVisualTreeService3 *This,
        InstanceHandle handle,
        RenderTargetBitmapOptions options,
        unsigned int max_pixel_width,
        unsigned int max_pixel_height,
        IBitmapData **bitmap_data);

    /*** IVisualTreeService3 methods ***/
    HRESULT (STDMETHODCALLTYPE *ResolveResource)(
        IVisualTreeService3 *This,
        InstanceHandle resource_context,
        LPCWSTR resource_name,
        ResourceType resource_type,
        unsigned int property_index);

    HRESULT (STDMETHODCALLTYPE *GetDictionaryItem)(
        IVisualTreeService3 *This,
        InstanceHandle dictionary_handle,
        LPCWSTR resource_name,
        WINBOOL resource_is_implicit_style,
        InstanceHandle *resource_handle);

    HRESULT (STDMETHODCALLTYPE *AddDictionaryItem)(
        IVisualTreeService3 *This,
        InstanceHandle dictionary_handle,
        InstanceHandle resource_key,
        InstanceHandle resource_handle);

    HRESULT (STDMETHODCALLTYPE *RemoveDictionaryItem)(
        IVisualTreeService3 *This,
        InstanceHandle dictionary_handle,
        InstanceHandle resource_key);

    END_INTERFACE
} IVisualTreeService3Vtbl;

interface IVisualTreeService3 {
    CONST_VTBL IVisualTreeService3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVisualTreeService3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVisualTreeService3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVisualTreeService3_Release(This) (This)->lpVtbl->Release(This)
/*** IVisualTreeService methods ***/
#define IVisualTreeService3_AdviseVisualTreeChange(This,callback) (This)->lpVtbl->AdviseVisualTreeChange(This,callback)
#define IVisualTreeService3_UnadviseVisualTreeChange(This,callback) (This)->lpVtbl->UnadviseVisualTreeChange(This,callback)
#define IVisualTreeService3_GetEnums(This,count,enums) (This)->lpVtbl->GetEnums(This,count,enums)
#define IVisualTreeService3_CreateInstance(This,type_name,value,instance_handle) (This)->lpVtbl->CreateInstance(This,type_name,value,instance_handle)
#define IVisualTreeService3_GetPropertyValuesChain(This,instance_handle,source_count,property_sources,property_count,property_values) (This)->lpVtbl->GetPropertyValuesChain(This,instance_handle,source_count,property_sources,property_count,property_values)
#define IVisualTreeService3_SetProperty(This,instance_handle,value,property_index) (This)->lpVtbl->SetProperty(This,instance_handle,value,property_index)
#define IVisualTreeService3_ClearProperty(This,instance_handle,property_index) (This)->lpVtbl->ClearProperty(This,instance_handle,property_index)
#define IVisualTreeService3_GetCollectionCount(This,instance_handle,collection_size) (This)->lpVtbl->GetCollectionCount(This,instance_handle,collection_size)
#define IVisualTreeService3_GetCollectionElements(This,instance_handle,start_index,element_count,element_values) (This)->lpVtbl->GetCollectionElements(This,instance_handle,start_index,element_count,element_values)
#define IVisualTreeService3_AddChild(This,parent,child,index) (This)->lpVtbl->AddChild(This,parent,child,index)
#define IVisualTreeService3_RemoveChild(This,parent,index) (This)->lpVtbl->RemoveChild(This,parent,index)
#define IVisualTreeService3_ClearChildren(This,parent) (This)->lpVtbl->ClearChildren(This,parent)
/*** IVisualTreeService2 methods ***/
#define IVisualTreeService3_GetPropertyIndex(This,object,property_name,property_index) (This)->lpVtbl->GetPropertyIndex(This,object,property_name,property_index)
#define IVisualTreeService3_GetProperty(This,object,property_index,value) (This)->lpVtbl->GetProperty(This,object,property_index,value)
#define IVisualTreeService3_ReplaceResource(This,resource_dictionary,key,new_value) (This)->lpVtbl->ReplaceResource(This,resource_dictionary,key,new_value)
#define IVisualTreeService3_RenderTargetBitmap(This,handle,options,max_pixel_width,max_pixel_height,bitmap_data) (This)->lpVtbl->RenderTargetBitmap(This,handle,options,max_pixel_width,max_pixel_height,bitmap_data)
/*** IVisualTreeService3 methods ***/
#define IVisualTreeService3_ResolveResource(This,resource_context,resource_name,resource_type,property_index) (This)->lpVtbl->ResolveResource(This,resource_context,resource_name,resource_type,property_index)
#define IVisualTreeService3_GetDictionaryItem(This,dictionary_handle,resource_name,resource_is_implicit_style,resource_handle) (This)->lpVtbl->GetDictionaryItem(This,dictionary_handle,resource_name,resource_is_implicit_style,resource_handle)
#define IVisualTreeService3_AddDictionaryItem(This,dictionary_handle,resource_key,resource_handle) (This)->lpVtbl->AddDictionaryItem(This,dictionary_handle,resource_key,resource_handle)
#define IVisualTreeService3_RemoveDictionaryItem(This,dictionary_handle,resource_key) (This)->lpVtbl->RemoveDictionaryItem(This,dictionary_handle,resource_key)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVisualTreeService3_QueryInterface(IVisualTreeService3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVisualTreeService3_AddRef(IVisualTreeService3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVisualTreeService3_Release(IVisualTreeService3* This) {
    return This->lpVtbl->Release(This);
}
/*** IVisualTreeService methods ***/
static __WIDL_INLINE HRESULT IVisualTreeService3_AdviseVisualTreeChange(IVisualTreeService3* This,IVisualTreeServiceCallback *callback) {
    return This->lpVtbl->AdviseVisualTreeChange(This,callback);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_UnadviseVisualTreeChange(IVisualTreeService3* This,IVisualTreeServiceCallback *callback) {
    return This->lpVtbl->UnadviseVisualTreeChange(This,callback);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_GetEnums(IVisualTreeService3* This,unsigned int *count,EnumType **enums) {
    return This->lpVtbl->GetEnums(This,count,enums);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_CreateInstance(IVisualTreeService3* This,BSTR type_name,BSTR value,InstanceHandle *instance_handle) {
    return This->lpVtbl->CreateInstance(This,type_name,value,instance_handle);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_GetPropertyValuesChain(IVisualTreeService3* This,InstanceHandle instance_handle,unsigned int *source_count,PropertyChainSource **property_sources,unsigned int *property_count,PropertyChainValue **property_values) {
    return This->lpVtbl->GetPropertyValuesChain(This,instance_handle,source_count,property_sources,property_count,property_values);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_SetProperty(IVisualTreeService3* This,InstanceHandle instance_handle,InstanceHandle value,unsigned int property_index) {
    return This->lpVtbl->SetProperty(This,instance_handle,value,property_index);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_ClearProperty(IVisualTreeService3* This,InstanceHandle instance_handle,unsigned int property_index) {
    return This->lpVtbl->ClearProperty(This,instance_handle,property_index);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_GetCollectionCount(IVisualTreeService3* This,InstanceHandle instance_handle,unsigned int *collection_size) {
    return This->lpVtbl->GetCollectionCount(This,instance_handle,collection_size);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_GetCollectionElements(IVisualTreeService3* This,InstanceHandle instance_handle,unsigned int start_index,unsigned int *element_count,CollectionElementValue **element_values) {
    return This->lpVtbl->GetCollectionElements(This,instance_handle,start_index,element_count,element_values);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_AddChild(IVisualTreeService3* This,InstanceHandle parent,InstanceHandle child,unsigned int index) {
    return This->lpVtbl->AddChild(This,parent,child,index);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_RemoveChild(IVisualTreeService3* This,InstanceHandle parent,unsigned int index) {
    return This->lpVtbl->RemoveChild(This,parent,index);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_ClearChildren(IVisualTreeService3* This,InstanceHandle parent) {
    return This->lpVtbl->ClearChildren(This,parent);
}
/*** IVisualTreeService2 methods ***/
static __WIDL_INLINE HRESULT IVisualTreeService3_GetPropertyIndex(IVisualTreeService3* This,InstanceHandle object,LPCWSTR property_name,unsigned int *property_index) {
    return This->lpVtbl->GetPropertyIndex(This,object,property_name,property_index);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_GetProperty(IVisualTreeService3* This,InstanceHandle object,unsigned int property_index,InstanceHandle *value) {
    return This->lpVtbl->GetProperty(This,object,property_index,value);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_ReplaceResource(IVisualTreeService3* This,InstanceHandle resource_dictionary,InstanceHandle key,InstanceHandle new_value) {
    return This->lpVtbl->ReplaceResource(This,resource_dictionary,key,new_value);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_RenderTargetBitmap(IVisualTreeService3* This,InstanceHandle handle,RenderTargetBitmapOptions options,unsigned int max_pixel_width,unsigned int max_pixel_height,IBitmapData **bitmap_data) {
    return This->lpVtbl->RenderTargetBitmap(This,handle,options,max_pixel_width,max_pixel_height,bitmap_data);
}
/*** IVisualTreeService3 methods ***/
static __WIDL_INLINE HRESULT IVisualTreeService3_ResolveResource(IVisualTreeService3* This,InstanceHandle resource_context,LPCWSTR resource_name,ResourceType resource_type,unsigned int property_index) {
    return This->lpVtbl->ResolveResource(This,resource_context,resource_name,resource_type,property_index);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_GetDictionaryItem(IVisualTreeService3* This,InstanceHandle dictionary_handle,LPCWSTR resource_name,WINBOOL resource_is_implicit_style,InstanceHandle *resource_handle) {
    return This->lpVtbl->GetDictionaryItem(This,dictionary_handle,resource_name,resource_is_implicit_style,resource_handle);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_AddDictionaryItem(IVisualTreeService3* This,InstanceHandle dictionary_handle,InstanceHandle resource_key,InstanceHandle resource_handle) {
    return This->lpVtbl->AddDictionaryItem(This,dictionary_handle,resource_key,resource_handle);
}
static __WIDL_INLINE HRESULT IVisualTreeService3_RemoveDictionaryItem(IVisualTreeService3* This,InstanceHandle dictionary_handle,InstanceHandle resource_key) {
    return This->lpVtbl->RemoveDictionaryItem(This,dictionary_handle,resource_key);
}
#endif
#endif

#endif


#endif  /* __IVisualTreeService3_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

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

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __xamlom_h__ */
