/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER 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

  void *__RPC_API MIDL_user_allocate(size_t);
  void __RPC_API MIDL_user_free(void *);

  DEFINE_GUID(LIBID_IISOle,0x49D704A0L,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
