/*** Autogenerated by WIDL 6.4 from include/dbgprop.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 __dbgprop_h__
#define __dbgprop_h__

/* Forward declarations */

#ifndef __IDebugProperty_FWD_DEFINED__
#define __IDebugProperty_FWD_DEFINED__
typedef interface IDebugProperty IDebugProperty;
#ifdef __cplusplus
interface IDebugProperty;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugPropertyInfo_FWD_DEFINED__
#define __IEnumDebugPropertyInfo_FWD_DEFINED__
typedef interface IEnumDebugPropertyInfo IEnumDebugPropertyInfo;
#ifdef __cplusplus
interface IEnumDebugPropertyInfo;
#endif /* __cplusplus */
#endif

#ifndef __IDebugExtendedProperty_FWD_DEFINED__
#define __IDebugExtendedProperty_FWD_DEFINED__
typedef interface IDebugExtendedProperty IDebugExtendedProperty;
#ifdef __cplusplus
interface IDebugExtendedProperty;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugExtendedPropertyInfo_FWD_DEFINED__
#define __IEnumDebugExtendedPropertyInfo_FWD_DEFINED__
typedef interface IEnumDebugExtendedPropertyInfo IEnumDebugExtendedPropertyInfo;
#ifdef __cplusplus
interface IEnumDebugExtendedPropertyInfo;
#endif /* __cplusplus */
#endif

#ifndef __IPerPropertyBrowsing2_FWD_DEFINED__
#define __IPerPropertyBrowsing2_FWD_DEFINED__
typedef interface IPerPropertyBrowsing2 IPerPropertyBrowsing2;
#ifdef __cplusplus
interface IPerPropertyBrowsing2;
#endif /* __cplusplus */
#endif

#ifndef __IDebugPropertyEnumType_All_FWD_DEFINED__
#define __IDebugPropertyEnumType_All_FWD_DEFINED__
typedef interface IDebugPropertyEnumType_All IDebugPropertyEnumType_All;
#ifdef __cplusplus
interface IDebugPropertyEnumType_All;
#endif /* __cplusplus */
#endif

#ifndef __IDebugPropertyEnumType_Locals_FWD_DEFINED__
#define __IDebugPropertyEnumType_Locals_FWD_DEFINED__
typedef interface IDebugPropertyEnumType_Locals IDebugPropertyEnumType_Locals;
#ifdef __cplusplus
interface IDebugPropertyEnumType_Locals;
#endif /* __cplusplus */
#endif

#ifndef __IDebugPropertyEnumType_Arguments_FWD_DEFINED__
#define __IDebugPropertyEnumType_Arguments_FWD_DEFINED__
typedef interface IDebugPropertyEnumType_Arguments IDebugPropertyEnumType_Arguments;
#ifdef __cplusplus
interface IDebugPropertyEnumType_Arguments;
#endif /* __cplusplus */
#endif

#ifndef __IDebugPropertyEnumType_LocalsPlusArgs_FWD_DEFINED__
#define __IDebugPropertyEnumType_LocalsPlusArgs_FWD_DEFINED__
typedef interface IDebugPropertyEnumType_LocalsPlusArgs IDebugPropertyEnumType_LocalsPlusArgs;
#ifdef __cplusplus
interface IDebugPropertyEnumType_LocalsPlusArgs;
#endif /* __cplusplus */
#endif

#ifndef __IDebugPropertyEnumType_Registers_FWD_DEFINED__
#define __IDebugPropertyEnumType_Registers_FWD_DEFINED__
typedef interface IDebugPropertyEnumType_Registers IDebugPropertyEnumType_Registers;
#ifdef __cplusplus
interface IDebugPropertyEnumType_Registers;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <ocidl.h>
#include <oleidl.h>

#ifdef __cplusplus
extern "C" {
#endif

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

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)


#ifndef __IDebugProperty_FWD_DEFINED__
#define __IDebugProperty_FWD_DEFINED__
typedef interface IDebugProperty IDebugProperty;
#ifdef __cplusplus
interface IDebugProperty;
#endif /* __cplusplus */
#endif

#ifndef __IDebugExtendedProperty_FWD_DEFINED__
#define __IDebugExtendedProperty_FWD_DEFINED__
typedef interface IDebugExtendedProperty IDebugExtendedProperty;
#ifdef __cplusplus
interface IDebugExtendedProperty;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugPropertyInfo_FWD_DEFINED__
#define __IEnumDebugPropertyInfo_FWD_DEFINED__
typedef interface IEnumDebugPropertyInfo IEnumDebugPropertyInfo;
#ifdef __cplusplus
interface IEnumDebugPropertyInfo;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDebugExtendedPropertyInfo_FWD_DEFINED__
#define __IEnumDebugExtendedPropertyInfo_FWD_DEFINED__
typedef interface IEnumDebugExtendedPropertyInfo IEnumDebugExtendedPropertyInfo;
#ifdef __cplusplus
interface IEnumDebugExtendedPropertyInfo;
#endif /* __cplusplus */
#endif

#ifndef __IPerPropertyBrowsing2_FWD_DEFINED__
#define __IPerPropertyBrowsing2_FWD_DEFINED__
typedef interface IPerPropertyBrowsing2 IPerPropertyBrowsing2;
#ifdef __cplusplus
interface IPerPropertyBrowsing2;
#endif /* __cplusplus */
#endif


extern GUID guidDocument;
extern GUID guidCodeContext;

enum {
    DBGPROP_ATTRIB_NO_ATTRIB = 0x0,
    DBGPROP_ATTRIB_VALUE_IS_INVALID = 0x8,
    DBGPROP_ATTRIB_VALUE_IS_EXPANDABLE = 0x10,
    DBGPROP_ATTRIB_VALUE_IS_FAKE = 0x20,
    DBGPROP_ATTRIB_VALUE_IS_METHOD = 0x100,
    DBGPROP_ATTRIB_VALUE_IS_EVENT = 0x200,
    DBGPROP_ATTRIB_VALUE_IS_RAW_STRING = 0x400,
    DBGPROP_ATTRIB_VALUE_READONLY = 0x800,
    DBGPROP_ATTRIB_ACCESS_PUBLIC = 0x1000,
    DBGPROP_ATTRIB_ACCESS_PRIVATE = 0x2000,
    DBGPROP_ATTRIB_ACCESS_PROTECTED = 0x4000,
    DBGPROP_ATTRIB_ACCESS_FINAL = 0x8000,
    DBGPROP_ATTRIB_STORAGE_GLOBAL = 0x10000,
    DBGPROP_ATTRIB_STORAGE_STATIC = 0x20000,
    DBGPROP_ATTRIB_STORAGE_FIELD = 0x40000,
    DBGPROP_ATTRIB_STORAGE_VIRTUAL = 0x80000,
    DBGPROP_ATTRIB_TYPE_IS_CONSTANT = 0x100000,
    DBGPROP_ATTRIB_TYPE_IS_SYNCHRONIZED = 0x200000,
    DBGPROP_ATTRIB_TYPE_IS_VOLATILE = 0x400000,
    DBGPROP_ATTRIB_HAS_EXTENDED_ATTRIBS = 0x800000
};

typedef DWORD DBGPROP_ATTRIB_FLAGS;

enum {
    DBGPROP_INFO_NAME = 0x1,
    DBGPROP_INFO_TYPE = 0x2,
    DBGPROP_INFO_VALUE = 0x4,
    DBGPROP_INFO_FULLNAME = 0x20,
    DBGPROP_INFO_ATTRIBUTES = 0x8,
    DBGPROP_INFO_DEBUGPROP = 0x10,
    DBGPROP_INFO_BEAUTIFY = 0x2000000,
    DBGPROP_INFO_CALLTOSTRING = 0x4000000,
    DBGPROP_INFO_AUTOEXPAND = 0x8000000
};

typedef DWORD DBGPROP_INFO_FLAGS;

#define DBGPROP_INFO_STANDARD (((DBGPROP_INFO_NAME | DBGPROP_INFO_TYPE) | DBGPROP_INFO_VALUE) | DBGPROP_INFO_ATTRIBUTES)

#define DBGPROP_INFO_ALL (((((DBGPROP_INFO_NAME | DBGPROP_INFO_TYPE) | DBGPROP_INFO_VALUE) | DBGPROP_INFO_FULLNAME) | DBGPROP_INFO_ATTRIBUTES) | DBGPROP_INFO_DEBUGPROP)


typedef enum tagOBJECT_ATTRIB_FLAG {
    OBJECT_ATTRIB_NO_ATTRIB = 0x0,
    OBJECT_ATTRIB_NO_NAME = 0x1,
    OBJECT_ATTRIB_NO_TYPE = 0x2,
    OBJECT_ATTRIB_NO_VALUE = 0x4,
    OBJECT_ATTRIB_VALUE_IS_INVALID = 0x8,
    OBJECT_ATTRIB_VALUE_IS_OBJECT = 0x10,
    OBJECT_ATTRIB_VALUE_IS_ENUM = 0x20,
    OBJECT_ATTRIB_VALUE_IS_CUSTOM = 0x40,
    OBJECT_ATTRIB_OBJECT_IS_EXPANDABLE = 0x70,
    OBJECT_ATTRIB_VALUE_HAS_CODE = 0x80,
    OBJECT_ATTRIB_TYPE_IS_OBJECT = 0x100,
    OBJECT_ATTRIB_TYPE_HAS_CODE = 0x200,
    OBJECT_ATTRIB_TYPE_IS_EXPANDABLE = 0x100,
    OBJECT_ATTRIB_SLOT_IS_CATEGORY = 0x400,
    OBJECT_ATTRIB_VALUE_READONLY = 0x800,
    OBJECT_ATTRIB_ACCESS_PUBLIC = 0x1000,
    OBJECT_ATTRIB_ACCESS_PRIVATE = 0x2000,
    OBJECT_ATTRIB_ACCESS_PROTECTED = 0x4000,
    OBJECT_ATTRIB_ACCESS_FINAL = 0x8000,
    OBJECT_ATTRIB_STORAGE_GLOBAL = 0x10000,
    OBJECT_ATTRIB_STORAGE_STATIC = 0x20000,
    OBJECT_ATTRIB_STORAGE_FIELD = 0x40000,
    OBJECT_ATTRIB_STORAGE_VIRTUAL = 0x80000,
    OBJECT_ATTRIB_TYPE_IS_CONSTANT = 0x100000,
    OBJECT_ATTRIB_TYPE_IS_SYNCHRONIZED = 0x200000,
    OBJECT_ATTRIB_TYPE_IS_VOLATILE = 0x400000,
    OBJECT_ATTRIB_HAS_EXTENDED_ATTRIBS = 0x800000,
    OBJECT_ATTRIB_IS_CLASS = 0x1000000,
    OBJECT_ATTRIB_IS_FUNCTION = 0x2000000,
    OBJECT_ATTRIB_IS_VARIABLE = 0x4000000,
    OBJECT_ATTRIB_IS_PROPERTY = 0x8000000,
    OBJECT_ATTRIB_IS_MACRO = 0x10000000,
    OBJECT_ATTRIB_IS_TYPE = 0x20000000,
    OBJECT_ATTRIB_IS_INHERITED = 0x40000000,
    OBJECT_ATTRIB_IS_INTERFACE = 0x80000000
} OBJECT_ATTRIB_FLAGS;

typedef enum tagPROP_INFO_FLAGS {
    PROP_INFO_NAME = 0x1,
    PROP_INFO_TYPE = 0x2,
    PROP_INFO_VALUE = 0x4,
    PROP_INFO_FULLNAME = 0x20,
    PROP_INFO_ATTRIBUTES = 0x8,
    PROP_INFO_DEBUGPROP = 0x10,
    PROP_INFO_AUTOEXPAND = 0x8000000
} PROP_INFO_FLAGS;

#define PROP_INFO_STANDARD (((PROP_INFO_NAME | PROP_INFO_TYPE) | PROP_INFO_VALUE) | PROP_INFO_ATTRIBUTES)

#define PROP_INFO_ALL (((((PROP_INFO_NAME | PROP_INFO_TYPE) | PROP_INFO_VALUE) | PROP_INFO_FULLNAME) | PROP_INFO_ATTRIBUTES) | PROP_INFO_DEBUGPROP)


typedef struct tagDebugPropertyInfo {
    DWORD m_dwValidFields;
    BSTR m_bstrName;
    BSTR m_bstrType;
    BSTR m_bstrValue;
    BSTR m_bstrFullName;
    DWORD m_dwAttrib;
    IDebugProperty *m_pDebugProp;
} DebugPropertyInfo;

typedef enum tagEX_PROP_INFO_FLAGS {
    EX_PROP_INFO_ID = 0x100,
    EX_PROP_INFO_NTYPE = 0x200,
    EX_PROP_INFO_NVALUE = 0x400,
    EX_PROP_INFO_LOCKBYTES = 0x800,
    EX_PROP_INFO_DEBUGEXTPROP = 0x1000
} EX_PROP_INFO_FLAGS;
typedef struct tagExtendedDebugPropertyInfo {
    DWORD dwValidFields;
    LPOLESTR pszName;
    LPOLESTR pszType;
    LPOLESTR pszValue;
    LPOLESTR pszFullName;
    DWORD dwAttrib;
    IDebugProperty *pDebugProp;
    DWORD nDISPID;
    DWORD nType;
    VARIANT varValue;
    ILockBytes *plbValue;
    IDebugExtendedProperty *pDebugExtProp;
} ExtendedDebugPropertyInfo;

/*****************************************************************************
 * IDebugProperty interface
 */
#ifndef __IDebugProperty_INTERFACE_DEFINED__
#define __IDebugProperty_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugProperty, 0x51973c50, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c50-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugProperty : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPropertyInfo(
        DWORD dwFieldSpec,
        UINT nRadix,
        DebugPropertyInfo *pPropertyInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetExtendedInfo(
        ULONG cInfos,
        GUID *rgguidExtendedInfo,
        VARIANT *rgvar) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetValueAsString(
        LPCOLESTR pszValue,
        UINT nRadix) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumMembers(
        DWORD dwFieldSpec,
        UINT nRadix,
        REFIID refiid,
        IEnumDebugPropertyInfo **ppepi) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetParent(
        IDebugProperty **ppDebugProp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugProperty, 0x51973c50, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugPropertyVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugProperty methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPropertyInfo)(
        IDebugProperty *This,
        DWORD dwFieldSpec,
        UINT nRadix,
        DebugPropertyInfo *pPropertyInfo);

    HRESULT (STDMETHODCALLTYPE *GetExtendedInfo)(
        IDebugProperty *This,
        ULONG cInfos,
        GUID *rgguidExtendedInfo,
        VARIANT *rgvar);

    HRESULT (STDMETHODCALLTYPE *SetValueAsString)(
        IDebugProperty *This,
        LPCOLESTR pszValue,
        UINT nRadix);

    HRESULT (STDMETHODCALLTYPE *EnumMembers)(
        IDebugProperty *This,
        DWORD dwFieldSpec,
        UINT nRadix,
        REFIID refiid,
        IEnumDebugPropertyInfo **ppepi);

    HRESULT (STDMETHODCALLTYPE *GetParent)(
        IDebugProperty *This,
        IDebugProperty **ppDebugProp);

    END_INTERFACE
} IDebugPropertyVtbl;

interface IDebugProperty {
    CONST_VTBL IDebugPropertyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugProperty_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugProperty methods ***/
#define IDebugProperty_GetPropertyInfo(This,dwFieldSpec,nRadix,pPropertyInfo) (This)->lpVtbl->GetPropertyInfo(This,dwFieldSpec,nRadix,pPropertyInfo)
#define IDebugProperty_GetExtendedInfo(This,cInfos,rgguidExtendedInfo,rgvar) (This)->lpVtbl->GetExtendedInfo(This,cInfos,rgguidExtendedInfo,rgvar)
#define IDebugProperty_SetValueAsString(This,pszValue,nRadix) (This)->lpVtbl->SetValueAsString(This,pszValue,nRadix)
#define IDebugProperty_EnumMembers(This,dwFieldSpec,nRadix,refiid,ppepi) (This)->lpVtbl->EnumMembers(This,dwFieldSpec,nRadix,refiid,ppepi)
#define IDebugProperty_GetParent(This,ppDebugProp) (This)->lpVtbl->GetParent(This,ppDebugProp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugProperty_QueryInterface(IDebugProperty* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugProperty_AddRef(IDebugProperty* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugProperty_Release(IDebugProperty* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugProperty methods ***/
static FORCEINLINE HRESULT IDebugProperty_GetPropertyInfo(IDebugProperty* This,DWORD dwFieldSpec,UINT nRadix,DebugPropertyInfo *pPropertyInfo) {
    return This->lpVtbl->GetPropertyInfo(This,dwFieldSpec,nRadix,pPropertyInfo);
}
static FORCEINLINE HRESULT IDebugProperty_GetExtendedInfo(IDebugProperty* This,ULONG cInfos,GUID *rgguidExtendedInfo,VARIANT *rgvar) {
    return This->lpVtbl->GetExtendedInfo(This,cInfos,rgguidExtendedInfo,rgvar);
}
static FORCEINLINE HRESULT IDebugProperty_SetValueAsString(IDebugProperty* This,LPCOLESTR pszValue,UINT nRadix) {
    return This->lpVtbl->SetValueAsString(This,pszValue,nRadix);
}
static FORCEINLINE HRESULT IDebugProperty_EnumMembers(IDebugProperty* This,DWORD dwFieldSpec,UINT nRadix,REFIID refiid,IEnumDebugPropertyInfo **ppepi) {
    return This->lpVtbl->EnumMembers(This,dwFieldSpec,nRadix,refiid,ppepi);
}
static FORCEINLINE HRESULT IDebugProperty_GetParent(IDebugProperty* This,IDebugProperty **ppDebugProp) {
    return This->lpVtbl->GetParent(This,ppDebugProp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDebugProperty_RemoteGetPropertyInfo_Proxy(
    IDebugProperty* This,
    DWORD dwFieldSpec,
    UINT nRadix,
    DWORD *dwValidFields,
    BSTR *pbstrName,
    BSTR *pbstrType,
    BSTR *pbstrValue,
    BSTR *pbstrFullName,
    DWORD *pdwAttrib,
    IDebugProperty **ppDebugProperty);
void __RPC_STUB IDebugProperty_RemoteGetPropertyInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IDebugProperty_GetPropertyInfo_Proxy(
    IDebugProperty* This,
    DWORD dwFieldSpec,
    UINT nRadix,
    DebugPropertyInfo *pPropertyInfo);
HRESULT __RPC_STUB IDebugProperty_GetPropertyInfo_Stub(
    IDebugProperty* This,
    DWORD dwFieldSpec,
    UINT nRadix,
    DWORD *dwValidFields,
    BSTR *pbstrName,
    BSTR *pbstrType,
    BSTR *pbstrValue,
    BSTR *pbstrFullName,
    DWORD *pdwAttrib,
    IDebugProperty **ppDebugProperty);

#endif  /* __IDebugProperty_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IEnumDebugPropertyInfo interface
 */
#ifndef __IEnumDebugPropertyInfo_INTERFACE_DEFINED__
#define __IEnumDebugPropertyInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumDebugPropertyInfo, 0x51973c51, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c51-cb0c-11d0-b5c9-00a0244a0e7a")
IEnumDebugPropertyInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        DebugPropertyInfo *pi,
        ULONG *pcEltsfetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumDebugPropertyInfo **ppepi) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCount(
        ULONG *pcelt) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumDebugPropertyInfo, 0x51973c51, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IEnumDebugPropertyInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumDebugPropertyInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumDebugPropertyInfo *This,
        ULONG celt,
        DebugPropertyInfo *pi,
        ULONG *pcEltsfetched);

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

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

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumDebugPropertyInfo *This,
        IEnumDebugPropertyInfo **ppepi);

    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IEnumDebugPropertyInfo *This,
        ULONG *pcelt);

    END_INTERFACE
} IEnumDebugPropertyInfoVtbl;

interface IEnumDebugPropertyInfo {
    CONST_VTBL IEnumDebugPropertyInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumDebugPropertyInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumDebugPropertyInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumDebugPropertyInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumDebugPropertyInfo methods ***/
#define IEnumDebugPropertyInfo_Next(This,celt,pi,pcEltsfetched) (This)->lpVtbl->Next(This,celt,pi,pcEltsfetched)
#define IEnumDebugPropertyInfo_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumDebugPropertyInfo_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumDebugPropertyInfo_Clone(This,ppepi) (This)->lpVtbl->Clone(This,ppepi)
#define IEnumDebugPropertyInfo_GetCount(This,pcelt) (This)->lpVtbl->GetCount(This,pcelt)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumDebugPropertyInfo_QueryInterface(IEnumDebugPropertyInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumDebugPropertyInfo_AddRef(IEnumDebugPropertyInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumDebugPropertyInfo_Release(IEnumDebugPropertyInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumDebugPropertyInfo methods ***/
static FORCEINLINE HRESULT IEnumDebugPropertyInfo_Next(IEnumDebugPropertyInfo* This,ULONG celt,DebugPropertyInfo *pi,ULONG *pcEltsfetched) {
    return This->lpVtbl->Next(This,celt,pi,pcEltsfetched);
}
static FORCEINLINE HRESULT IEnumDebugPropertyInfo_Skip(IEnumDebugPropertyInfo* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumDebugPropertyInfo_Reset(IEnumDebugPropertyInfo* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumDebugPropertyInfo_Clone(IEnumDebugPropertyInfo* This,IEnumDebugPropertyInfo **ppepi) {
    return This->lpVtbl->Clone(This,ppepi);
}
static FORCEINLINE HRESULT IEnumDebugPropertyInfo_GetCount(IEnumDebugPropertyInfo* This,ULONG *pcelt) {
    return This->lpVtbl->GetCount(This,pcelt);
}
#endif
#endif

#endif

HRESULT __stdcall IEnumDebugPropertyInfo_RemoteNext_Proxy(
    IEnumDebugPropertyInfo* This,
    ULONG celt,
    DebugPropertyInfo *pinfo,
    ULONG *pcEltsfetched);
void __RPC_STUB IEnumDebugPropertyInfo_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumDebugPropertyInfo_Next_Proxy(
    IEnumDebugPropertyInfo* This,
    ULONG celt,
    DebugPropertyInfo *pi,
    ULONG *pcEltsfetched);
HRESULT __RPC_STUB IEnumDebugPropertyInfo_Next_Stub(
    IEnumDebugPropertyInfo* This,
    ULONG celt,
    DebugPropertyInfo *pinfo,
    ULONG *pcEltsfetched);

#endif  /* __IEnumDebugPropertyInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDebugExtendedProperty interface
 */
#ifndef __IDebugExtendedProperty_INTERFACE_DEFINED__
#define __IDebugExtendedProperty_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugExtendedProperty, 0x51973c52, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c52-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugExtendedProperty : public IDebugProperty
{
    virtual HRESULT STDMETHODCALLTYPE GetExtendedPropertyInfo(
        DWORD dwFieldSpec,
        UINT nRadix,
        ExtendedDebugPropertyInfo *pExtendedPropertyInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumExtendedMembers(
        DWORD dwFieldSpec,
        UINT nRadix,
        IEnumDebugExtendedPropertyInfo **ppeepi) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugExtendedProperty, 0x51973c52, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugExtendedPropertyVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugProperty methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPropertyInfo)(
        IDebugExtendedProperty *This,
        DWORD dwFieldSpec,
        UINT nRadix,
        DebugPropertyInfo *pPropertyInfo);

    HRESULT (STDMETHODCALLTYPE *GetExtendedInfo)(
        IDebugExtendedProperty *This,
        ULONG cInfos,
        GUID *rgguidExtendedInfo,
        VARIANT *rgvar);

    HRESULT (STDMETHODCALLTYPE *SetValueAsString)(
        IDebugExtendedProperty *This,
        LPCOLESTR pszValue,
        UINT nRadix);

    HRESULT (STDMETHODCALLTYPE *EnumMembers)(
        IDebugExtendedProperty *This,
        DWORD dwFieldSpec,
        UINT nRadix,
        REFIID refiid,
        IEnumDebugPropertyInfo **ppepi);

    HRESULT (STDMETHODCALLTYPE *GetParent)(
        IDebugExtendedProperty *This,
        IDebugProperty **ppDebugProp);

    /*** IDebugExtendedProperty methods ***/
    HRESULT (STDMETHODCALLTYPE *GetExtendedPropertyInfo)(
        IDebugExtendedProperty *This,
        DWORD dwFieldSpec,
        UINT nRadix,
        ExtendedDebugPropertyInfo *pExtendedPropertyInfo);

    HRESULT (STDMETHODCALLTYPE *EnumExtendedMembers)(
        IDebugExtendedProperty *This,
        DWORD dwFieldSpec,
        UINT nRadix,
        IEnumDebugExtendedPropertyInfo **ppeepi);

    END_INTERFACE
} IDebugExtendedPropertyVtbl;

interface IDebugExtendedProperty {
    CONST_VTBL IDebugExtendedPropertyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugExtendedProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugExtendedProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugExtendedProperty_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugProperty methods ***/
#define IDebugExtendedProperty_GetPropertyInfo(This,dwFieldSpec,nRadix,pPropertyInfo) (This)->lpVtbl->GetPropertyInfo(This,dwFieldSpec,nRadix,pPropertyInfo)
#define IDebugExtendedProperty_GetExtendedInfo(This,cInfos,rgguidExtendedInfo,rgvar) (This)->lpVtbl->GetExtendedInfo(This,cInfos,rgguidExtendedInfo,rgvar)
#define IDebugExtendedProperty_SetValueAsString(This,pszValue,nRadix) (This)->lpVtbl->SetValueAsString(This,pszValue,nRadix)
#define IDebugExtendedProperty_EnumMembers(This,dwFieldSpec,nRadix,refiid,ppepi) (This)->lpVtbl->EnumMembers(This,dwFieldSpec,nRadix,refiid,ppepi)
#define IDebugExtendedProperty_GetParent(This,ppDebugProp) (This)->lpVtbl->GetParent(This,ppDebugProp)
/*** IDebugExtendedProperty methods ***/
#define IDebugExtendedProperty_GetExtendedPropertyInfo(This,dwFieldSpec,nRadix,pExtendedPropertyInfo) (This)->lpVtbl->GetExtendedPropertyInfo(This,dwFieldSpec,nRadix,pExtendedPropertyInfo)
#define IDebugExtendedProperty_EnumExtendedMembers(This,dwFieldSpec,nRadix,ppeepi) (This)->lpVtbl->EnumExtendedMembers(This,dwFieldSpec,nRadix,ppeepi)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugExtendedProperty_QueryInterface(IDebugExtendedProperty* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugExtendedProperty_AddRef(IDebugExtendedProperty* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugExtendedProperty_Release(IDebugExtendedProperty* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugProperty methods ***/
static FORCEINLINE HRESULT IDebugExtendedProperty_GetPropertyInfo(IDebugExtendedProperty* This,DWORD dwFieldSpec,UINT nRadix,DebugPropertyInfo *pPropertyInfo) {
    return This->lpVtbl->GetPropertyInfo(This,dwFieldSpec,nRadix,pPropertyInfo);
}
static FORCEINLINE HRESULT IDebugExtendedProperty_GetExtendedInfo(IDebugExtendedProperty* This,ULONG cInfos,GUID *rgguidExtendedInfo,VARIANT *rgvar) {
    return This->lpVtbl->GetExtendedInfo(This,cInfos,rgguidExtendedInfo,rgvar);
}
static FORCEINLINE HRESULT IDebugExtendedProperty_SetValueAsString(IDebugExtendedProperty* This,LPCOLESTR pszValue,UINT nRadix) {
    return This->lpVtbl->SetValueAsString(This,pszValue,nRadix);
}
static FORCEINLINE HRESULT IDebugExtendedProperty_EnumMembers(IDebugExtendedProperty* This,DWORD dwFieldSpec,UINT nRadix,REFIID refiid,IEnumDebugPropertyInfo **ppepi) {
    return This->lpVtbl->EnumMembers(This,dwFieldSpec,nRadix,refiid,ppepi);
}
static FORCEINLINE HRESULT IDebugExtendedProperty_GetParent(IDebugExtendedProperty* This,IDebugProperty **ppDebugProp) {
    return This->lpVtbl->GetParent(This,ppDebugProp);
}
/*** IDebugExtendedProperty methods ***/
static FORCEINLINE HRESULT IDebugExtendedProperty_GetExtendedPropertyInfo(IDebugExtendedProperty* This,DWORD dwFieldSpec,UINT nRadix,ExtendedDebugPropertyInfo *pExtendedPropertyInfo) {
    return This->lpVtbl->GetExtendedPropertyInfo(This,dwFieldSpec,nRadix,pExtendedPropertyInfo);
}
static FORCEINLINE HRESULT IDebugExtendedProperty_EnumExtendedMembers(IDebugExtendedProperty* This,DWORD dwFieldSpec,UINT nRadix,IEnumDebugExtendedPropertyInfo **ppeepi) {
    return This->lpVtbl->EnumExtendedMembers(This,dwFieldSpec,nRadix,ppeepi);
}
#endif
#endif

#endif


#endif  /* __IDebugExtendedProperty_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IEnumDebugExtendedPropertyInfo interface
 */
#ifndef __IEnumDebugExtendedPropertyInfo_INTERFACE_DEFINED__
#define __IEnumDebugExtendedPropertyInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumDebugExtendedPropertyInfo, 0x51973c53, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c53-cb0c-11d0-b5c9-00a0244a0e7a")
IEnumDebugExtendedPropertyInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        ExtendedDebugPropertyInfo *rgExtendedPropertyInfo,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumDebugExtendedPropertyInfo **pedpe) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCount(
        ULONG *pcelt) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumDebugExtendedPropertyInfo, 0x51973c53, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IEnumDebugExtendedPropertyInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumDebugExtendedPropertyInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumDebugExtendedPropertyInfo *This,
        ULONG celt,
        ExtendedDebugPropertyInfo *rgExtendedPropertyInfo,
        ULONG *pceltFetched);

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

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

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumDebugExtendedPropertyInfo *This,
        IEnumDebugExtendedPropertyInfo **pedpe);

    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IEnumDebugExtendedPropertyInfo *This,
        ULONG *pcelt);

    END_INTERFACE
} IEnumDebugExtendedPropertyInfoVtbl;

interface IEnumDebugExtendedPropertyInfo {
    CONST_VTBL IEnumDebugExtendedPropertyInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumDebugExtendedPropertyInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumDebugExtendedPropertyInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumDebugExtendedPropertyInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumDebugExtendedPropertyInfo methods ***/
#define IEnumDebugExtendedPropertyInfo_Next(This,celt,rgExtendedPropertyInfo,pceltFetched) (This)->lpVtbl->Next(This,celt,rgExtendedPropertyInfo,pceltFetched)
#define IEnumDebugExtendedPropertyInfo_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumDebugExtendedPropertyInfo_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumDebugExtendedPropertyInfo_Clone(This,pedpe) (This)->lpVtbl->Clone(This,pedpe)
#define IEnumDebugExtendedPropertyInfo_GetCount(This,pcelt) (This)->lpVtbl->GetCount(This,pcelt)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumDebugExtendedPropertyInfo_QueryInterface(IEnumDebugExtendedPropertyInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumDebugExtendedPropertyInfo_AddRef(IEnumDebugExtendedPropertyInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumDebugExtendedPropertyInfo_Release(IEnumDebugExtendedPropertyInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumDebugExtendedPropertyInfo methods ***/
static FORCEINLINE HRESULT IEnumDebugExtendedPropertyInfo_Next(IEnumDebugExtendedPropertyInfo* This,ULONG celt,ExtendedDebugPropertyInfo *rgExtendedPropertyInfo,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgExtendedPropertyInfo,pceltFetched);
}
static FORCEINLINE HRESULT IEnumDebugExtendedPropertyInfo_Skip(IEnumDebugExtendedPropertyInfo* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumDebugExtendedPropertyInfo_Reset(IEnumDebugExtendedPropertyInfo* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumDebugExtendedPropertyInfo_Clone(IEnumDebugExtendedPropertyInfo* This,IEnumDebugExtendedPropertyInfo **pedpe) {
    return This->lpVtbl->Clone(This,pedpe);
}
static FORCEINLINE HRESULT IEnumDebugExtendedPropertyInfo_GetCount(IEnumDebugExtendedPropertyInfo* This,ULONG *pcelt) {
    return This->lpVtbl->GetCount(This,pcelt);
}
#endif
#endif

#endif


#endif  /* __IEnumDebugExtendedPropertyInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IPerPropertyBrowsing2 interface
 */
#ifndef __IPerPropertyBrowsing2_INTERFACE_DEFINED__
#define __IPerPropertyBrowsing2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPerPropertyBrowsing2, 0x51973c54, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c54-cb0c-11d0-b5c9-00a0244a0e7a")
IPerPropertyBrowsing2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDisplayString(
        DISPID dispid,
        BSTR *pBstr) = 0;

    virtual HRESULT STDMETHODCALLTYPE MapPropertyToPage(
        DISPID dispid,
        CLSID *pClsidPropPage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPredefinedStrings(
        DISPID dispid,
        CALPOLESTR *pCaStrings,
        CADWORD *pCaCookies) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPredefinedValue(
        DISPID dispid,
        DWORD dwCookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPerPropertyBrowsing2, 0x51973c54, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IPerPropertyBrowsing2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IPerPropertyBrowsing2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDisplayString)(
        IPerPropertyBrowsing2 *This,
        DISPID dispid,
        BSTR *pBstr);

    HRESULT (STDMETHODCALLTYPE *MapPropertyToPage)(
        IPerPropertyBrowsing2 *This,
        DISPID dispid,
        CLSID *pClsidPropPage);

    HRESULT (STDMETHODCALLTYPE *GetPredefinedStrings)(
        IPerPropertyBrowsing2 *This,
        DISPID dispid,
        CALPOLESTR *pCaStrings,
        CADWORD *pCaCookies);

    HRESULT (STDMETHODCALLTYPE *SetPredefinedValue)(
        IPerPropertyBrowsing2 *This,
        DISPID dispid,
        DWORD dwCookie);

    END_INTERFACE
} IPerPropertyBrowsing2Vtbl;

interface IPerPropertyBrowsing2 {
    CONST_VTBL IPerPropertyBrowsing2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPerPropertyBrowsing2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPerPropertyBrowsing2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPerPropertyBrowsing2_Release(This) (This)->lpVtbl->Release(This)
/*** IPerPropertyBrowsing2 methods ***/
#define IPerPropertyBrowsing2_GetDisplayString(This,dispid,pBstr) (This)->lpVtbl->GetDisplayString(This,dispid,pBstr)
#define IPerPropertyBrowsing2_MapPropertyToPage(This,dispid,pClsidPropPage) (This)->lpVtbl->MapPropertyToPage(This,dispid,pClsidPropPage)
#define IPerPropertyBrowsing2_GetPredefinedStrings(This,dispid,pCaStrings,pCaCookies) (This)->lpVtbl->GetPredefinedStrings(This,dispid,pCaStrings,pCaCookies)
#define IPerPropertyBrowsing2_SetPredefinedValue(This,dispid,dwCookie) (This)->lpVtbl->SetPredefinedValue(This,dispid,dwCookie)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPerPropertyBrowsing2_QueryInterface(IPerPropertyBrowsing2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPerPropertyBrowsing2_AddRef(IPerPropertyBrowsing2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPerPropertyBrowsing2_Release(IPerPropertyBrowsing2* This) {
    return This->lpVtbl->Release(This);
}
/*** IPerPropertyBrowsing2 methods ***/
static FORCEINLINE HRESULT IPerPropertyBrowsing2_GetDisplayString(IPerPropertyBrowsing2* This,DISPID dispid,BSTR *pBstr) {
    return This->lpVtbl->GetDisplayString(This,dispid,pBstr);
}
static FORCEINLINE HRESULT IPerPropertyBrowsing2_MapPropertyToPage(IPerPropertyBrowsing2* This,DISPID dispid,CLSID *pClsidPropPage) {
    return This->lpVtbl->MapPropertyToPage(This,dispid,pClsidPropPage);
}
static FORCEINLINE HRESULT IPerPropertyBrowsing2_GetPredefinedStrings(IPerPropertyBrowsing2* This,DISPID dispid,CALPOLESTR *pCaStrings,CADWORD *pCaCookies) {
    return This->lpVtbl->GetPredefinedStrings(This,dispid,pCaStrings,pCaCookies);
}
static FORCEINLINE HRESULT IPerPropertyBrowsing2_SetPredefinedValue(IPerPropertyBrowsing2* This,DISPID dispid,DWORD dwCookie) {
    return This->lpVtbl->SetPredefinedValue(This,dispid,dwCookie);
}
#endif
#endif

#endif


#endif  /* __IPerPropertyBrowsing2_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDebugPropertyEnumType_All interface
 */
#ifndef __IDebugPropertyEnumType_All_INTERFACE_DEFINED__
#define __IDebugPropertyEnumType_All_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugPropertyEnumType_All, 0x51973c55, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c55-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugPropertyEnumType_All : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetName(
        BSTR *a) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugPropertyEnumType_All, 0x51973c55, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugPropertyEnumType_AllVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugPropertyEnumType_All methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugPropertyEnumType_All *This,
        BSTR *a);

    END_INTERFACE
} IDebugPropertyEnumType_AllVtbl;

interface IDebugPropertyEnumType_All {
    CONST_VTBL IDebugPropertyEnumType_AllVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugPropertyEnumType_All_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugPropertyEnumType_All_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugPropertyEnumType_All_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugPropertyEnumType_All methods ***/
#define IDebugPropertyEnumType_All_GetName(This,a) (This)->lpVtbl->GetName(This,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugPropertyEnumType_All_QueryInterface(IDebugPropertyEnumType_All* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugPropertyEnumType_All_AddRef(IDebugPropertyEnumType_All* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugPropertyEnumType_All_Release(IDebugPropertyEnumType_All* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugPropertyEnumType_All methods ***/
static FORCEINLINE HRESULT IDebugPropertyEnumType_All_GetName(IDebugPropertyEnumType_All* This,BSTR *a) {
    return This->lpVtbl->GetName(This,a);
}
#endif
#endif

#endif


#endif  /* __IDebugPropertyEnumType_All_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDebugPropertyEnumType_Locals interface
 */
#ifndef __IDebugPropertyEnumType_Locals_INTERFACE_DEFINED__
#define __IDebugPropertyEnumType_Locals_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugPropertyEnumType_Locals, 0x51973c56, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c56-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugPropertyEnumType_Locals : public IDebugPropertyEnumType_All
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugPropertyEnumType_Locals, 0x51973c56, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugPropertyEnumType_LocalsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugPropertyEnumType_All methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugPropertyEnumType_Locals *This,
        BSTR *a);

    END_INTERFACE
} IDebugPropertyEnumType_LocalsVtbl;

interface IDebugPropertyEnumType_Locals {
    CONST_VTBL IDebugPropertyEnumType_LocalsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugPropertyEnumType_Locals_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugPropertyEnumType_Locals_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugPropertyEnumType_Locals_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugPropertyEnumType_All methods ***/
#define IDebugPropertyEnumType_Locals_GetName(This,a) (This)->lpVtbl->GetName(This,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugPropertyEnumType_Locals_QueryInterface(IDebugPropertyEnumType_Locals* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugPropertyEnumType_Locals_AddRef(IDebugPropertyEnumType_Locals* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugPropertyEnumType_Locals_Release(IDebugPropertyEnumType_Locals* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugPropertyEnumType_All methods ***/
static FORCEINLINE HRESULT IDebugPropertyEnumType_Locals_GetName(IDebugPropertyEnumType_Locals* This,BSTR *a) {
    return This->lpVtbl->GetName(This,a);
}
#endif
#endif

#endif


#endif  /* __IDebugPropertyEnumType_Locals_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDebugPropertyEnumType_Arguments interface
 */
#ifndef __IDebugPropertyEnumType_Arguments_INTERFACE_DEFINED__
#define __IDebugPropertyEnumType_Arguments_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugPropertyEnumType_Arguments, 0x51973c57, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c57-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugPropertyEnumType_Arguments : public IDebugPropertyEnumType_All
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugPropertyEnumType_Arguments, 0x51973c57, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugPropertyEnumType_ArgumentsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugPropertyEnumType_All methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugPropertyEnumType_Arguments *This,
        BSTR *a);

    END_INTERFACE
} IDebugPropertyEnumType_ArgumentsVtbl;

interface IDebugPropertyEnumType_Arguments {
    CONST_VTBL IDebugPropertyEnumType_ArgumentsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugPropertyEnumType_Arguments_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugPropertyEnumType_Arguments_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugPropertyEnumType_Arguments_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugPropertyEnumType_All methods ***/
#define IDebugPropertyEnumType_Arguments_GetName(This,a) (This)->lpVtbl->GetName(This,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugPropertyEnumType_Arguments_QueryInterface(IDebugPropertyEnumType_Arguments* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugPropertyEnumType_Arguments_AddRef(IDebugPropertyEnumType_Arguments* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugPropertyEnumType_Arguments_Release(IDebugPropertyEnumType_Arguments* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugPropertyEnumType_All methods ***/
static FORCEINLINE HRESULT IDebugPropertyEnumType_Arguments_GetName(IDebugPropertyEnumType_Arguments* This,BSTR *a) {
    return This->lpVtbl->GetName(This,a);
}
#endif
#endif

#endif


#endif  /* __IDebugPropertyEnumType_Arguments_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDebugPropertyEnumType_LocalsPlusArgs interface
 */
#ifndef __IDebugPropertyEnumType_LocalsPlusArgs_INTERFACE_DEFINED__
#define __IDebugPropertyEnumType_LocalsPlusArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugPropertyEnumType_LocalsPlusArgs, 0x51973c58, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c58-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugPropertyEnumType_LocalsPlusArgs : public IDebugPropertyEnumType_All
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugPropertyEnumType_LocalsPlusArgs, 0x51973c58, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugPropertyEnumType_LocalsPlusArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugPropertyEnumType_All methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugPropertyEnumType_LocalsPlusArgs *This,
        BSTR *a);

    END_INTERFACE
} IDebugPropertyEnumType_LocalsPlusArgsVtbl;

interface IDebugPropertyEnumType_LocalsPlusArgs {
    CONST_VTBL IDebugPropertyEnumType_LocalsPlusArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugPropertyEnumType_LocalsPlusArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugPropertyEnumType_LocalsPlusArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugPropertyEnumType_LocalsPlusArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugPropertyEnumType_All methods ***/
#define IDebugPropertyEnumType_LocalsPlusArgs_GetName(This,a) (This)->lpVtbl->GetName(This,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugPropertyEnumType_LocalsPlusArgs_QueryInterface(IDebugPropertyEnumType_LocalsPlusArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugPropertyEnumType_LocalsPlusArgs_AddRef(IDebugPropertyEnumType_LocalsPlusArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugPropertyEnumType_LocalsPlusArgs_Release(IDebugPropertyEnumType_LocalsPlusArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugPropertyEnumType_All methods ***/
static FORCEINLINE HRESULT IDebugPropertyEnumType_LocalsPlusArgs_GetName(IDebugPropertyEnumType_LocalsPlusArgs* This,BSTR *a) {
    return This->lpVtbl->GetName(This,a);
}
#endif
#endif

#endif


#endif  /* __IDebugPropertyEnumType_LocalsPlusArgs_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDebugPropertyEnumType_Registers interface
 */
#ifndef __IDebugPropertyEnumType_Registers_INTERFACE_DEFINED__
#define __IDebugPropertyEnumType_Registers_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDebugPropertyEnumType_Registers, 0x51973c59, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51973c59-cb0c-11d0-b5c9-00a0244a0e7a")
IDebugPropertyEnumType_Registers : public IDebugPropertyEnumType_All
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDebugPropertyEnumType_Registers, 0x51973c59, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
#endif
#else
typedef struct IDebugPropertyEnumType_RegistersVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDebugPropertyEnumType_All methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        IDebugPropertyEnumType_Registers *This,
        BSTR *a);

    END_INTERFACE
} IDebugPropertyEnumType_RegistersVtbl;

interface IDebugPropertyEnumType_Registers {
    CONST_VTBL IDebugPropertyEnumType_RegistersVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDebugPropertyEnumType_Registers_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDebugPropertyEnumType_Registers_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDebugPropertyEnumType_Registers_Release(This) (This)->lpVtbl->Release(This)
/*** IDebugPropertyEnumType_All methods ***/
#define IDebugPropertyEnumType_Registers_GetName(This,a) (This)->lpVtbl->GetName(This,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDebugPropertyEnumType_Registers_QueryInterface(IDebugPropertyEnumType_Registers* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDebugPropertyEnumType_Registers_AddRef(IDebugPropertyEnumType_Registers* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDebugPropertyEnumType_Registers_Release(IDebugPropertyEnumType_Registers* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugPropertyEnumType_All methods ***/
static FORCEINLINE HRESULT IDebugPropertyEnumType_Registers_GetName(IDebugPropertyEnumType_Registers* This,BSTR *a) {
    return This->lpVtbl->GetName(This,a);
}
#endif
#endif

#endif


#endif  /* __IDebugPropertyEnumType_Registers_INTERFACE_DEFINED__ */

#endif
/* 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 *);
ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __dbgprop_h__ */
