/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 440
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __iiis_h__
#define __iiis_h__

#ifndef __IISMimeType_FWD_DEFINED__
#define __IISMimeType_FWD_DEFINED__
typedef struct IISMimeType IISMimeType;
#endif

#ifndef __MimeMap_FWD_DEFINED__
#define __MimeMap_FWD_DEFINED__
#ifdef __cplusplus
typedef class MimeMap MimeMap;
#else
typedef struct MimeMap MimeMap;
#endif
#endif

#ifndef __IISIPSecurity_FWD_DEFINED__
#define __IISIPSecurity_FWD_DEFINED__
typedef struct IISIPSecurity IISIPSecurity;
#endif

#ifndef __IPSecurity_FWD_DEFINED__
#define __IPSecurity_FWD_DEFINED__
#ifdef __cplusplus
typedef class IPSecurity IPSecurity;
#else
typedef struct IPSecurity IPSecurity;
#endif
#endif

#ifndef __IISNamespace_FWD_DEFINED__
#define __IISNamespace_FWD_DEFINED__
#ifdef __cplusplus
typedef class IISNamespace IISNamespace;
#else
typedef struct IISNamespace IISNamespace;
#endif
#endif

#ifndef __IISProvider_FWD_DEFINED__
#define __IISProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class IISProvider IISProvider;
#else
typedef struct IISProvider IISProvider;
#endif
#endif

#ifndef __IISBaseObject_FWD_DEFINED__
#define __IISBaseObject_FWD_DEFINED__
typedef struct IISBaseObject IISBaseObject;
#endif

#ifndef __IISSchemaObject_FWD_DEFINED__
#define __IISSchemaObject_FWD_DEFINED__
typedef struct IISSchemaObject IISSchemaObject;
#endif

#ifndef __IISPropertyAttribute_FWD_DEFINED__
#define __IISPropertyAttribute_FWD_DEFINED__
typedef struct IISPropertyAttribute IISPropertyAttribute;
#endif

#ifndef __PropertyAttribute_FWD_DEFINED__
#define __PropertyAttribute_FWD_DEFINED__
#ifdef __cplusplus
typedef class PropertyAttribute PropertyAttribute;
#else
typedef struct PropertyAttribute PropertyAttribute;
#endif
#endif

#ifdef __cplusplus
extern "C"{
#endif

#ifndef __MIDL_user_allocate_free_DEFINED__
#define __MIDL_user_allocate_free_DEFINED__
  void *__RPC_API MIDL_user_allocate(size_t);
  void __RPC_API MIDL_user_free(void *);
#endif

  DEFINE_GUID(LIBID_IISOle,0x49D704A0,0x89F7,0x11D0,0x85,0x27,0x00,0xC0,0x4F,0xD8,0xD5,0x03);
  DEFINE_GUID(IID_IISBaseObject,0x4b42e390,0xe96,0x11d1,0x9c,0x3f,0x0,0xa0,0xc9,0x22,0xe7,0x3);

  extern RPC_IF_HANDLE __MIDL_itf_iis_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_iis_0000_v0_0_s_ifspec;

#ifndef __IISOle_LIBRARY_DEFINED__
#define __IISOle_LIBRARY_DEFINED__
  EXTERN_C const IID LIBID_IISOle;
#ifndef __IISMimeType_INTERFACE_DEFINED__
#define __IISMimeType_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IISMimeType;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IISMimeType : public IDispatch {
  public:
    virtual HRESULT WINAPI get_MimeType(BSTR *retval) = 0;
    virtual HRESULT WINAPI put_MimeType(BSTR bstrMimeType) = 0;
    virtual HRESULT WINAPI get_Extension(BSTR *retval) = 0;
    virtual HRESULT WINAPI put_Extension(BSTR bstrExtension) = 0;
  };
#else
  typedef struct IISMimeTypeVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IISMimeType *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IISMimeType *This);
      ULONG (WINAPI *Release)(IISMimeType *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IISMimeType *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IISMimeType *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IISMimeType *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IISMimeType *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_MimeType)(IISMimeType *This,BSTR *retval);
      HRESULT (WINAPI *put_MimeType)(IISMimeType *This,BSTR bstrMimeType);
      HRESULT (WINAPI *get_Extension)(IISMimeType *This,BSTR *retval);
      HRESULT (WINAPI *put_Extension)(IISMimeType *This,BSTR bstrExtension);
    END_INTERFACE
  } IISMimeTypeVtbl;
  struct IISMimeType {
    CONST_VTBL struct IISMimeTypeVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IISMimeType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IISMimeType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IISMimeType_Release(This) (This)->lpVtbl->Release(This)
#define IISMimeType_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IISMimeType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IISMimeType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IISMimeType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IISMimeType_get_MimeType(This,retval) (This)->lpVtbl->get_MimeType(This,retval)
#define IISMimeType_put_MimeType(This,bstrMimeType) (This)->lpVtbl->put_MimeType(This,bstrMimeType)
#define IISMimeType_get_Extension(This,retval) (This)->lpVtbl->get_Extension(This,retval)
#define IISMimeType_put_Extension(This,bstrExtension) (This)->lpVtbl->put_Extension(This,bstrExtension)
#endif
#endif
  HRESULT WINAPI IISMimeType_get_MimeType_Proxy(IISMimeType *This,BSTR *retval);
  void __RPC_STUB IISMimeType_get_MimeType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISMimeType_put_MimeType_Proxy(IISMimeType *This,BSTR bstrMimeType);
  void __RPC_STUB IISMimeType_put_MimeType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISMimeType_get_Extension_Proxy(IISMimeType *This,BSTR *retval);
  void __RPC_STUB IISMimeType_get_Extension_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISMimeType_put_Extension_Proxy(IISMimeType *This,BSTR bstrExtension);
  void __RPC_STUB IISMimeType_put_Extension_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  EXTERN_C const CLSID CLSID_MimeMap;
#ifdef __cplusplus
  class MimeMap;
#endif

#ifndef __IISIPSecurity_INTERFACE_DEFINED__
#define __IISIPSecurity_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IISIPSecurity;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IISIPSecurity : public IDispatch {
  public:
    virtual HRESULT WINAPI get_IPDeny(VARIANT *retval) = 0;
    virtual HRESULT WINAPI put_IPDeny(VARIANT vIPDeny) = 0;
    virtual HRESULT WINAPI get_IPGrant(VARIANT *retval) = 0;
    virtual HRESULT WINAPI put_IPGrant(VARIANT vIPGrant) = 0;
    virtual HRESULT WINAPI get_DomainDeny(VARIANT *retval) = 0;
    virtual HRESULT WINAPI put_DomainDeny(VARIANT vDomainDeny) = 0;
    virtual HRESULT WINAPI get_DomainGrant(VARIANT *retval) = 0;
    virtual HRESULT WINAPI put_DomainGrant(VARIANT vDomainGrant) = 0;
    virtual HRESULT WINAPI get_GrantByDefault(VARIANT_BOOL *retval) = 0;
    virtual HRESULT WINAPI put_GrantByDefault(VARIANT_BOOL fGrantByDefault) = 0;
  };
#else
  typedef struct IISIPSecurityVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IISIPSecurity *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IISIPSecurity *This);
      ULONG (WINAPI *Release)(IISIPSecurity *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IISIPSecurity *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IISIPSecurity *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IISIPSecurity *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IISIPSecurity *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_IPDeny)(IISIPSecurity *This,VARIANT *retval);
      HRESULT (WINAPI *put_IPDeny)(IISIPSecurity *This,VARIANT vIPDeny);
      HRESULT (WINAPI *get_IPGrant)(IISIPSecurity *This,VARIANT *retval);
      HRESULT (WINAPI *put_IPGrant)(IISIPSecurity *This,VARIANT vIPGrant);
      HRESULT (WINAPI *get_DomainDeny)(IISIPSecurity *This,VARIANT *retval);
      HRESULT (WINAPI *put_DomainDeny)(IISIPSecurity *This,VARIANT vDomainDeny);
      HRESULT (WINAPI *get_DomainGrant)(IISIPSecurity *This,VARIANT *retval);
      HRESULT (WINAPI *put_DomainGrant)(IISIPSecurity *This,VARIANT vDomainGrant);
      HRESULT (WINAPI *get_GrantByDefault)(IISIPSecurity *This,VARIANT_BOOL *retval);
      HRESULT (WINAPI *put_GrantByDefault)(IISIPSecurity *This,VARIANT_BOOL fGrantByDefault);
    END_INTERFACE
  } IISIPSecurityVtbl;
  struct IISIPSecurity {
    CONST_VTBL struct IISIPSecurityVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IISIPSecurity_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IISIPSecurity_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IISIPSecurity_Release(This) (This)->lpVtbl->Release(This)
#define IISIPSecurity_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IISIPSecurity_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IISIPSecurity_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IISIPSecurity_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IISIPSecurity_get_IPDeny(This,retval) (This)->lpVtbl->get_IPDeny(This,retval)
#define IISIPSecurity_put_IPDeny(This,vIPDeny) (This)->lpVtbl->put_IPDeny(This,vIPDeny)
#define IISIPSecurity_get_IPGrant(This,retval) (This)->lpVtbl->get_IPGrant(This,retval)
#define IISIPSecurity_put_IPGrant(This,vIPGrant) (This)->lpVtbl->put_IPGrant(This,vIPGrant)
#define IISIPSecurity_get_DomainDeny(This,retval) (This)->lpVtbl->get_DomainDeny(This,retval)
#define IISIPSecurity_put_DomainDeny(This,vDomainDeny) (This)->lpVtbl->put_DomainDeny(This,vDomainDeny)
#define IISIPSecurity_get_DomainGrant(This,retval) (This)->lpVtbl->get_DomainGrant(This,retval)
#define IISIPSecurity_put_DomainGrant(This,vDomainGrant) (This)->lpVtbl->put_DomainGrant(This,vDomainGrant)
#define IISIPSecurity_get_GrantByDefault(This,retval) (This)->lpVtbl->get_GrantByDefault(This,retval)
#define IISIPSecurity_put_GrantByDefault(This,fGrantByDefault) (This)->lpVtbl->put_GrantByDefault(This,fGrantByDefault)
#endif
#endif
  HRESULT WINAPI IISIPSecurity_get_IPDeny_Proxy(IISIPSecurity *This,VARIANT *retval);
  void __RPC_STUB IISIPSecurity_get_IPDeny_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISIPSecurity_put_IPDeny_Proxy(IISIPSecurity *This,VARIANT vIPDeny);
  void __RPC_STUB IISIPSecurity_put_IPDeny_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISIPSecurity_get_IPGrant_Proxy(IISIPSecurity *This,VARIANT *retval);
  void __RPC_STUB IISIPSecurity_get_IPGrant_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISIPSecurity_put_IPGrant_Proxy(IISIPSecurity *This,VARIANT vIPGrant);
  void __RPC_STUB IISIPSecurity_put_IPGrant_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISIPSecurity_get_DomainDeny_Proxy(IISIPSecurity *This,VARIANT *retval);
  void __RPC_STUB IISIPSecurity_get_DomainDeny_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISIPSecurity_put_DomainDeny_Proxy(IISIPSecurity *This,VARIANT vDomainDeny);
  void __RPC_STUB IISIPSecurity_put_DomainDeny_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISIPSecurity_get_DomainGrant_Proxy(IISIPSecurity *This,VARIANT *retval);
  void __RPC_STUB IISIPSecurity_get_DomainGrant_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISIPSecurity_put_DomainGrant_Proxy(IISIPSecurity *This,VARIANT vDomainGrant);
  void __RPC_STUB IISIPSecurity_put_DomainGrant_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISIPSecurity_get_GrantByDefault_Proxy(IISIPSecurity *This,VARIANT_BOOL *retval);
  void __RPC_STUB IISIPSecurity_get_GrantByDefault_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISIPSecurity_put_GrantByDefault_Proxy(IISIPSecurity *This,VARIANT_BOOL fGrantByDefault);
  void __RPC_STUB IISIPSecurity_put_GrantByDefault_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  EXTERN_C const CLSID CLSID_IPSecurity;
#ifdef __cplusplus
  class IPSecurity;
#endif
  EXTERN_C const CLSID CLSID_IISNamespace;
#ifdef __cplusplus
  class IISNamespace;
#endif
  EXTERN_C const CLSID CLSID_IISProvider;
#ifdef __cplusplus
  class IISProvider;
#endif

#ifndef __IISBaseObject_INTERFACE_DEFINED__
#define __IISBaseObject_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IISBaseObject;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IISBaseObject : public IDispatch {
  public:
    virtual HRESULT WINAPI GetDataPaths(BSTR bstrName,LONG lnAttribute,VARIANT *pvPaths) = 0;
    virtual HRESULT WINAPI GetPropertyAttribObj(BSTR bstrName,IDispatch **ppObject) = 0;

  };
#else
  typedef struct IISBaseObjectVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IISBaseObject *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IISBaseObject *This);
      ULONG (WINAPI *Release)(IISBaseObject *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IISBaseObject *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IISBaseObject *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IISBaseObject *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IISBaseObject *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *GetDataPaths)(IISBaseObject *This,BSTR bstrName,LONG lnAttribute,VARIANT *pvPaths);
      HRESULT (WINAPI *GetPropertyAttribObj)(IISBaseObject *This,BSTR bstrName,IDispatch **ppObject);
    END_INTERFACE
  } IISBaseObjectVtbl;
  struct IISBaseObject {
    CONST_VTBL struct IISBaseObjectVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IISBaseObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IISBaseObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IISBaseObject_Release(This) (This)->lpVtbl->Release(This)
#define IISBaseObject_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IISBaseObject_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IISBaseObject_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IISBaseObject_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IISBaseObject_GetDataPaths(This,bstrName,lnAttribute,pvPaths) (This)->lpVtbl->GetDataPaths(This,bstrName,lnAttribute,pvPaths)
#define IISBaseObject_GetPropertyAttribObj(This,bstrName,ppObject) (This)->lpVtbl->GetPropertyAttribObj(This,bstrName,ppObject)
#endif
#endif
  HRESULT WINAPI IISBaseObject_GetDataPaths_Proxy(IISBaseObject *This,BSTR bstrName,LONG lnAttribute,VARIANT *pvPaths);
  void __RPC_STUB IISBaseObject_GetDataPaths_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISBaseObject_GetPropertyAttribObj_Proxy(IISBaseObject *This,BSTR bstrName,IDispatch **ppObject);
  void __RPC_STUB IISBaseObject_GetPropertyAttribObj_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IISSchemaObject_INTERFACE_DEFINED__
#define __IISSchemaObject_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IISSchemaObject;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IISSchemaObject : public IDispatch {
  public:
    virtual HRESULT WINAPI GetSchemaPropertyAttributes(BSTR bstrName,IDispatch **ppObject) = 0;
    virtual HRESULT WINAPI PutSchemaPropertyAttributes(IDispatch *pObject) = 0;
  };
#else
  typedef struct IISSchemaObjectVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IISSchemaObject *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IISSchemaObject *This);
      ULONG (WINAPI *Release)(IISSchemaObject *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IISSchemaObject *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IISSchemaObject *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IISSchemaObject *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IISSchemaObject *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *GetSchemaPropertyAttributes)(IISSchemaObject *This,BSTR bstrName,IDispatch **ppObject);
      HRESULT (WINAPI *PutSchemaPropertyAttributes)(IISSchemaObject *This,IDispatch *pObject);
    END_INTERFACE
  } IISSchemaObjectVtbl;
  struct IISSchemaObject {
    CONST_VTBL struct IISSchemaObjectVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IISSchemaObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IISSchemaObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IISSchemaObject_Release(This) (This)->lpVtbl->Release(This)
#define IISSchemaObject_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IISSchemaObject_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IISSchemaObject_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IISSchemaObject_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IISSchemaObject_GetSchemaPropertyAttributes(This,bstrName,ppObject) (This)->lpVtbl->GetSchemaPropertyAttributes(This,bstrName,ppObject)
#define IISSchemaObject_PutSchemaPropertyAttributes(This,pObject) (This)->lpVtbl->PutSchemaPropertyAttributes(This,pObject)
#endif
#endif
  HRESULT WINAPI IISSchemaObject_GetSchemaPropertyAttributes_Proxy(IISSchemaObject *This,BSTR bstrName,IDispatch **ppObject);
  void __RPC_STUB IISSchemaObject_GetSchemaPropertyAttributes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISSchemaObject_PutSchemaPropertyAttributes_Proxy(IISSchemaObject *This,IDispatch *pObject);
  void __RPC_STUB IISSchemaObject_PutSchemaPropertyAttributes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IISPropertyAttribute_INTERFACE_DEFINED__
#define __IISPropertyAttribute_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IISPropertyAttribute;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IISPropertyAttribute : public IDispatch {
  public:
    virtual HRESULT WINAPI get_PropName(BSTR *retval) = 0;
    virtual HRESULT WINAPI get_MetaId(long *retval) = 0;
    virtual HRESULT WINAPI put_MetaId(long lnMetaId) = 0;
    virtual HRESULT WINAPI get_UserType(long *retval) = 0;
    virtual HRESULT WINAPI put_UserType(long lnUserType) = 0;
    virtual HRESULT WINAPI get_AllAttributes(long *retval) = 0;
    virtual HRESULT WINAPI get_Inherit(VARIANT_BOOL *retval) = 0;
    virtual HRESULT WINAPI put_Inherit(VARIANT_BOOL fInherit) = 0;
    virtual HRESULT WINAPI get_Secure(VARIANT_BOOL *retval) = 0;
    virtual HRESULT WINAPI put_Secure(VARIANT_BOOL fSecure) = 0;
    virtual HRESULT WINAPI get_Reference(VARIANT_BOOL *retval) = 0;
    virtual HRESULT WINAPI put_Reference(VARIANT_BOOL fReference) = 0;
    virtual HRESULT WINAPI get_Volatile(VARIANT_BOOL *retval) = 0;
    virtual HRESULT WINAPI put_Volatile(VARIANT_BOOL fVolatile) = 0;
    virtual HRESULT WINAPI get_Isinherit(VARIANT_BOOL *retval) = 0;
    virtual HRESULT WINAPI get_Default(VARIANT *retval) = 0;
    virtual HRESULT WINAPI put_Default(VARIANT vDefault) = 0;
  };
#else
  typedef struct IISPropertyAttributeVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IISPropertyAttribute *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IISPropertyAttribute *This);
      ULONG (WINAPI *Release)(IISPropertyAttribute *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IISPropertyAttribute *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IISPropertyAttribute *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IISPropertyAttribute *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IISPropertyAttribute *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_PropName)(IISPropertyAttribute *This,BSTR *retval);
      HRESULT (WINAPI *get_MetaId)(IISPropertyAttribute *This,long *retval);
      HRESULT (WINAPI *put_MetaId)(IISPropertyAttribute *This,long lnMetaId);
      HRESULT (WINAPI *get_UserType)(IISPropertyAttribute *This,long *retval);
      HRESULT (WINAPI *put_UserType)(IISPropertyAttribute *This,long lnUserType);
      HRESULT (WINAPI *get_AllAttributes)(IISPropertyAttribute *This,long *retval);
      HRESULT (WINAPI *get_Inherit)(IISPropertyAttribute *This,VARIANT_BOOL *retval);
      HRESULT (WINAPI *put_Inherit)(IISPropertyAttribute *This,VARIANT_BOOL fInherit);
      HRESULT (WINAPI *get_Secure)(IISPropertyAttribute *This,VARIANT_BOOL *retval);
      HRESULT (WINAPI *put_Secure)(IISPropertyAttribute *This,VARIANT_BOOL fSecure);
      HRESULT (WINAPI *get_Reference)(IISPropertyAttribute *This,VARIANT_BOOL *retval);
      HRESULT (WINAPI *put_Reference)(IISPropertyAttribute *This,VARIANT_BOOL fReference);
      HRESULT (WINAPI *get_Volatile)(IISPropertyAttribute *This,VARIANT_BOOL *retval);
      HRESULT (WINAPI *put_Volatile)(IISPropertyAttribute *This,VARIANT_BOOL fVolatile);
      HRESULT (WINAPI *get_Isinherit)(IISPropertyAttribute *This,VARIANT_BOOL *retval);
      HRESULT (WINAPI *get_Default)(IISPropertyAttribute *This,VARIANT *retval);
      HRESULT (WINAPI *put_Default)(IISPropertyAttribute *This,VARIANT vDefault);
    END_INTERFACE
  } IISPropertyAttributeVtbl;
  struct IISPropertyAttribute {
    CONST_VTBL struct IISPropertyAttributeVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IISPropertyAttribute_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IISPropertyAttribute_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IISPropertyAttribute_Release(This) (This)->lpVtbl->Release(This)
#define IISPropertyAttribute_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IISPropertyAttribute_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IISPropertyAttribute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IISPropertyAttribute_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define IISPropertyAttribute_get_PropName(This,retval) (This)->lpVtbl->get_PropName(This,retval)
#define IISPropertyAttribute_get_MetaId(This,retval) (This)->lpVtbl->get_MetaId(This,retval)
#define IISPropertyAttribute_put_MetaId(This,lnMetaId) (This)->lpVtbl->put_MetaId(This,lnMetaId)
#define IISPropertyAttribute_get_UserType(This,retval) (This)->lpVtbl->get_UserType(This,retval)
#define IISPropertyAttribute_put_UserType(This,lnUserType) (This)->lpVtbl->put_UserType(This,lnUserType)
#define IISPropertyAttribute_get_AllAttributes(This,retval) (This)->lpVtbl->get_AllAttributes(This,retval)
#define IISPropertyAttribute_get_Inherit(This,retval) (This)->lpVtbl->get_Inherit(This,retval)
#define IISPropertyAttribute_put_Inherit(This,fInherit) (This)->lpVtbl->put_Inherit(This,fInherit)
#define IISPropertyAttribute_get_Secure(This,retval) (This)->lpVtbl->get_Secure(This,retval)
#define IISPropertyAttribute_put_Secure(This,fSecure) (This)->lpVtbl->put_Secure(This,fSecure)
#define IISPropertyAttribute_get_Reference(This,retval) (This)->lpVtbl->get_Reference(This,retval)
#define IISPropertyAttribute_put_Reference(This,fReference) (This)->lpVtbl->put_Reference(This,fReference)
#define IISPropertyAttribute_get_Volatile(This,retval) (This)->lpVtbl->get_Volatile(This,retval)
#define IISPropertyAttribute_put_Volatile(This,fVolatile) (This)->lpVtbl->put_Volatile(This,fVolatile)
#define IISPropertyAttribute_get_Isinherit(This,retval) (This)->lpVtbl->get_Isinherit(This,retval)
#define IISPropertyAttribute_get_Default(This,retval) (This)->lpVtbl->get_Default(This,retval)
#define IISPropertyAttribute_put_Default(This,vDefault) (This)->lpVtbl->put_Default(This,vDefault)
#endif
#endif
  HRESULT WINAPI IISPropertyAttribute_get_PropName_Proxy(IISPropertyAttribute *This,BSTR *retval);
  void __RPC_STUB IISPropertyAttribute_get_PropName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_get_MetaId_Proxy(IISPropertyAttribute *This,long *retval);
  void __RPC_STUB IISPropertyAttribute_get_MetaId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_put_MetaId_Proxy(IISPropertyAttribute *This,long lnMetaId);
  void __RPC_STUB IISPropertyAttribute_put_MetaId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_get_UserType_Proxy(IISPropertyAttribute *This,long *retval);
  void __RPC_STUB IISPropertyAttribute_get_UserType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_put_UserType_Proxy(IISPropertyAttribute *This,long lnUserType);
  void __RPC_STUB IISPropertyAttribute_put_UserType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_get_AllAttributes_Proxy(IISPropertyAttribute *This,long *retval);
  void __RPC_STUB IISPropertyAttribute_get_AllAttributes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_get_Inherit_Proxy(IISPropertyAttribute *This,VARIANT_BOOL *retval);
  void __RPC_STUB IISPropertyAttribute_get_Inherit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_put_Inherit_Proxy(IISPropertyAttribute *This,VARIANT_BOOL fInherit);
  void __RPC_STUB IISPropertyAttribute_put_Inherit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_get_Secure_Proxy(IISPropertyAttribute *This,VARIANT_BOOL *retval);
  void __RPC_STUB IISPropertyAttribute_get_Secure_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_put_Secure_Proxy(IISPropertyAttribute *This,VARIANT_BOOL fSecure);
  void __RPC_STUB IISPropertyAttribute_put_Secure_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_get_Reference_Proxy(IISPropertyAttribute *This,VARIANT_BOOL *retval);
  void __RPC_STUB IISPropertyAttribute_get_Reference_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_put_Reference_Proxy(IISPropertyAttribute *This,VARIANT_BOOL fReference);
  void __RPC_STUB IISPropertyAttribute_put_Reference_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_get_Volatile_Proxy(IISPropertyAttribute *This,VARIANT_BOOL *retval);
  void __RPC_STUB IISPropertyAttribute_get_Volatile_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_put_Volatile_Proxy(IISPropertyAttribute *This,VARIANT_BOOL fVolatile);
  void __RPC_STUB IISPropertyAttribute_put_Volatile_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_get_Isinherit_Proxy(IISPropertyAttribute *This,VARIANT_BOOL *retval);
  void __RPC_STUB IISPropertyAttribute_get_Isinherit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_get_Default_Proxy(IISPropertyAttribute *This,VARIANT *retval);
  void __RPC_STUB IISPropertyAttribute_get_Default_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IISPropertyAttribute_put_Default_Proxy(IISPropertyAttribute *This,VARIANT vDefault);
  void __RPC_STUB IISPropertyAttribute_put_Default_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  EXTERN_C const CLSID CLSID_PropertyAttribute;
#ifdef __cplusplus
  class PropertyAttribute;
#endif
#endif

#ifdef __cplusplus
}
#endif
#endif
