cpp_quote("/**")
cpp_quote(" * This file is part of the mingw-w64 runtime package.")
cpp_quote(" * No warranty is given; refer to the file DISCLAIMER within this package.")
cpp_quote(" */")
cpp_quote("")
cpp_quote("#include <winapifamily.h>")

#ifndef DO_NO_IMPORTS
import "objidl.idl";
#endif

cpp_quote("")
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")

interface ICreateTypeInfo;
interface ICreateTypeInfo2;
interface ICreateTypeLib;
interface ICreateTypeLib2;
cpp_quote("#endif")
cpp_quote("")
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)")
interface IDispatch;
interface IEnumVARIANT;
interface ITypeComp;
cpp_quote("#endif")
cpp_quote("")
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
interface ITypeInfo;
interface ITypeInfo2;
interface ITypeLib;
interface ITypeLib2;
interface ITypeChangeEvents;
interface IErrorInfo;
interface ICreateErrorInfo;
interface ISupportErrorInfo;
interface ITypeFactory;
interface ITypeMarshal;
interface IRecordInfo;
cpp_quote("#endif")
cpp_quote("")
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)")
[version (1.0), pointer_default (unique)]
interface IOleAutomationTypes {
  typedef CY CURRENCY;
  typedef struct tagSAFEARRAYBOUND {
    ULONG cElements;
    LONG lLbound;
  } SAFEARRAYBOUND,*LPSAFEARRAYBOUND;

cpp_quote("")
  typedef [unique] struct _wireVARIANT *wireVARIANT;
  typedef [unique] struct _wireBRECORD *wireBRECORD;
cpp_quote("")
  typedef struct _wireSAFEARR_BSTR {
    ULONG Size;
    [size_is (Size), ref] wireBSTR *aBstr;
  } SAFEARR_BSTR;

cpp_quote("")
  typedef struct _wireSAFEARR_UNKNOWN {
    ULONG Size;
    [size_is (Size), ref] IUnknown **apUnknown;
  } SAFEARR_UNKNOWN;

cpp_quote("")
  typedef struct _wireSAFEARR_DISPATCH {
    ULONG Size;
    [size_is (Size), ref] IDispatch **apDispatch;
  } SAFEARR_DISPATCH;

cpp_quote("")
  typedef struct _wireSAFEARR_VARIANT {
    ULONG Size;
    [size_is (Size), ref] wireVARIANT *aVariant;
  } SAFEARR_VARIANT;

cpp_quote("")
  typedef struct _wireSAFEARR_BRECORD {
    ULONG Size;
    [size_is (Size), ref] wireBRECORD *aRecord;
  } SAFEARR_BRECORD;

cpp_quote("")
  typedef struct _wireSAFEARR_HAVEIID {
    ULONG Size;
    [size_is (Size), ref] IUnknown **apUnknown;
    IID iid;
  } SAFEARR_HAVEIID;

cpp_quote("")
  typedef [v1_enum] enum tagSF_TYPE {
    SF_ERROR = VT_ERROR,
    SF_I1 = VT_I1,
    SF_I2 = VT_I2,
    SF_I4 = VT_I4,
    SF_I8 = VT_I8,
    SF_BSTR = VT_BSTR,
    SF_UNKNOWN = VT_UNKNOWN,
    SF_DISPATCH = VT_DISPATCH,
    SF_VARIANT = VT_VARIANT,
    SF_RECORD = VT_RECORD,
    SF_HAVEIID = VT_UNKNOWN | VT_RESERVED
  } SF_TYPE;

cpp_quote("")
  typedef union _wireSAFEARRAY_UNION switch (ULONG sfType) u {
    case SF_BSTR: SAFEARR_BSTR BstrStr;
    case SF_UNKNOWN: SAFEARR_UNKNOWN UnknownStr;
    case SF_DISPATCH: SAFEARR_DISPATCH DispatchStr;
    case SF_VARIANT: SAFEARR_VARIANT VariantStr;
    case SF_RECORD: SAFEARR_BRECORD RecordStr;
    case SF_HAVEIID: SAFEARR_HAVEIID HaveIidStr;
    case SF_I1: BYTE_SIZEDARR ByteStr;
    case SF_I2: WORD_SIZEDARR WordStr;
    case SF_I4: DWORD_SIZEDARR LongStr;
    case SF_I8: HYPER_SIZEDARR HyperStr;
  } SAFEARRAYUNION;

cpp_quote("")
  typedef [unique] struct _wireSAFEARRAY {
    USHORT cDims;
    USHORT fFeatures;
    ULONG cbElements;
    ULONG cLocks;
    SAFEARRAYUNION uArrayStructs;
    [size_is (cDims)] SAFEARRAYBOUND rgsabound[];
  } *wireSAFEARRAY;
  typedef [unique] wireSAFEARRAY *wirePSAFEARRAY;

cpp_quote("")
  typedef struct tagSAFEARRAY {
    USHORT cDims;
    USHORT fFeatures;
    ULONG cbElements;
    ULONG cLocks;
    PVOID pvData;
    SAFEARRAYBOUND rgsabound[];
  } SAFEARRAY;
  typedef [wire_marshal (wirePSAFEARRAY)] SAFEARRAY *LPSAFEARRAY;

cpp_quote("")
  const USHORT FADF_AUTO = 0x0001;
  const USHORT FADF_STATIC = 0x0002;
  const USHORT FADF_EMBEDDED = 0x0004;
  const USHORT FADF_FIXEDSIZE = 0x0010;
  const USHORT FADF_RECORD = 0x0020;
  const USHORT FADF_HAVEIID = 0x0040;
  const USHORT FADF_HAVEVARTYPE= 0x0080;
  const USHORT FADF_BSTR = 0x0100;
  const USHORT FADF_UNKNOWN = 0x0200;
  const USHORT FADF_DISPATCH = 0x0400;
  const USHORT FADF_VARIANT = 0x0800;
  const USHORT FADF_RESERVED = 0xf008;

cpp_quote("")
cpp_quote("/* Kludge for 3.0 release to disable new default-behavior.")
cpp_quote(" * For now we define _FORCENAMELESSUNION.  For 4.0 this define")
cpp_quote(" * will be removed. */")
cpp_quote("#ifndef _FORCENAMELESSUNION")
cpp_quote("#define _FORCENAMELESSUNION 1")
cpp_quote("#endif")
cpp_quote("")
cpp_quote("#if (__STDC__ && !defined(__cplusplus) && !defined(_FORCENAMELESSUNION)) || defined(NONAMELESSUNION) || (defined (_MSC_VER) && !defined(_MSC_EXTENSIONS) && !defined(_FORCENAMELESSUNION))")
cpp_quote("#define __VARIANT_NAME_1 n1")
cpp_quote("#define __VARIANT_NAME_2 n2")
cpp_quote("#define __VARIANT_NAME_3 n3")
cpp_quote("#define __VARIANT_NAME_4 brecVal")
cpp_quote("#else")
cpp_quote("#define __tagVARIANT")
cpp_quote("#define __VARIANT_NAME_1")
cpp_quote("#define __VARIANT_NAME_2")
cpp_quote("#define __VARIANT_NAME_3")
cpp_quote("#define __tagBRECORD")
cpp_quote("#define __VARIANT_NAME_4")
cpp_quote("#endif")

cpp_quote("")
  typedef [wire_marshal (wireVARIANT)] struct tagVARIANT VARIANT;

cpp_quote("")
  struct tagVARIANT {
    union {
      struct __tagVARIANT {
	VARTYPE vt;
	WORD wReserved1;
	WORD wReserved2;
	WORD wReserved3;
	union {
	  LONGLONG llVal;
	  LONG lVal;
	  BYTE bVal;
	  SHORT iVal;
	  FLOAT fltVal;
	  DOUBLE dblVal;
	  VARIANT_BOOL boolVal;
	  /* Removed due conflict with bool and gcc's inablity to express a macro expanding to a comment.
	  _VARIANT_BOOL bool; */
	  SCODE scode;
	  CY cyVal;
	  DATE date;
	  BSTR bstrVal;
	  IUnknown *punkVal;
	  IDispatch *pdispVal;
	  SAFEARRAY *parray;
	  BYTE *pbVal;
	  SHORT *piVal;
	  LONG *plVal;
	  LONGLONG *pllVal;
	  FLOAT *pfltVal;
	  DOUBLE *pdblVal;
	  VARIANT_BOOL *pboolVal;
	  /* Removed due conflict with bool and gcc's inablity to express a macro expanding to a comment.
	  _VARIANT_BOOL *pbool; */
	  SCODE *pscode;
	  CY *pcyVal;
	  DATE *pdate;
	  BSTR *pbstrVal;
	  IUnknown **ppunkVal;
	  IDispatch **ppdispVal;
	  SAFEARRAY **pparray;
	  VARIANT *pvarVal;
	  PVOID byref;
	  CHAR cVal;
	  USHORT uiVal;
	  ULONG ulVal;
	  ULONGLONG ullVal;
	  INT intVal;
	  UINT uintVal;
	  DECIMAL *pdecVal;
	  CHAR *pcVal;
	  USHORT *puiVal;
	  ULONG *pulVal;
	  ULONGLONG *pullVal;
	  INT *pintVal;
	  UINT *puintVal;
	  struct __tagBRECORD {
	    PVOID pvRecord;
	    IRecordInfo *pRecInfo;
	  } __VARIANT_NAME_4;
	} __VARIANT_NAME_3;
      } __VARIANT_NAME_2;
      DECIMAL decVal;
    } __VARIANT_NAME_1;
  };

cpp_quote("")
  typedef VARIANT *LPVARIANT;
  typedef VARIANT VARIANTARG;
  typedef VARIANT *LPVARIANTARG;
  cpp_quote("#if 0")
  typedef const VARIANT *REFVARIANT;
  cpp_quote("#else")
  cpp_quote("")
  cpp_quote("#ifndef _REFVARIANT_DEFINED")
  cpp_quote("#define _REFVARIANT_DEFINED")
  cpp_quote("#ifdef __cplusplus")
  cpp_quote("#define REFVARIANT const VARIANT &")
  cpp_quote("#else")
  cpp_quote("#define REFVARIANT const VARIANT * __MIDL_CONST")
  cpp_quote("#endif")
  cpp_quote("#endif")
  cpp_quote("#endif")

cpp_quote("")
  struct _wireBRECORD {
    ULONG fFlags;
    ULONG clSize;
    IRecordInfo *pRecInfo;
    [size_is (clSize)] byte *pRecord;
  };

cpp_quote("")
  struct _wireVARIANT {
    DWORD clSize;
    DWORD rpcReserved;
    USHORT vt;
    USHORT wReserved1;
    USHORT wReserved2;
    USHORT wReserved3;
    [switch_type (ULONG), switch_is (vt)] union {
      [case (VT_I8)] LONGLONG llVal;
      [case (VT_I4)] LONG lVal;
      [case (VT_UI1)] BYTE bVal;
      [case (VT_I2)] SHORT iVal;
      [case (VT_R4)] FLOAT fltVal;
      [case (VT_R8)] DOUBLE dblVal;
      [case (VT_BOOL)] VARIANT_BOOL boolVal;
      [case (VT_ERROR)] SCODE scode;
      [case (VT_CY)] CY cyVal;
      [case (VT_DATE)] DATE date;
      [case (VT_BSTR)] wireBSTR bstrVal;
      [case (VT_UNKNOWN)] IUnknown *punkVal;
      [case (VT_DISPATCH)] IDispatch *pdispVal;
      [case (VT_ARRAY)] wirePSAFEARRAY parray;
      [case (VT_RECORD, VT_RECORD|VT_BYREF)]
      wireBRECORD brecVal;
      [case (VT_UI1|VT_BYREF)]
      BYTE *pbVal;
      [case (VT_I2|VT_BYREF)]
      SHORT *piVal;
      [case (VT_I4|VT_BYREF)]
      LONG *plVal;
      [case (VT_I8|VT_BYREF)]
      LONGLONG *pllVal;
      [case (VT_R4|VT_BYREF)]
      FLOAT *pfltVal;
      [case (VT_R8|VT_BYREF)]
      DOUBLE *pdblVal;
      [case (VT_BOOL|VT_BYREF)]
      VARIANT_BOOL *pboolVal;
      [case (VT_ERROR|VT_BYREF)]
      SCODE *pscode;
      [case (VT_CY|VT_BYREF)]
      CY *pcyVal;
      [case (VT_DATE|VT_BYREF)]
      DATE *pdate;
      [case (VT_BSTR|VT_BYREF)]
      wireBSTR *pbstrVal;
      [case (VT_UNKNOWN|VT_BYREF)]
      IUnknown **ppunkVal;
      [case (VT_DISPATCH|VT_BYREF)]
      IDispatch **ppdispVal;
      [case (VT_ARRAY|VT_BYREF)]
      wirePSAFEARRAY *pparray;
      [case (VT_VARIANT|VT_BYREF)]
      wireVARIANT *pvarVal;
      [case (VT_I1)] CHAR cVal;
      [case (VT_UI2)] USHORT uiVal;
      [case (VT_UI4)] ULONG ulVal;
      [case (VT_UI8)] ULONGLONG ullVal;
      [case (VT_INT)] INT intVal;
      [case (VT_UINT)] UINT uintVal;
      [case (VT_DECIMAL)] DECIMAL decVal;
      [case (VT_BYREF|VT_DECIMAL)]
      DECIMAL *pdecVal;
      [case (VT_BYREF|VT_I1)]
      CHAR *pcVal;
      [case (VT_BYREF|VT_UI2)]
      USHORT *puiVal;
      [case (VT_BYREF|VT_UI4)]
      ULONG *pulVal;
      [case (VT_BYREF|VT_UI8)]
      ULONGLONG *pullVal;
      [case (VT_BYREF|VT_INT)]
      INT *pintVal;
      [case (VT_BYREF|VT_UINT)]
      UINT *puintVal;
      [case (VT_EMPTY)];
      [case (VT_NULL)];
    };
  };

cpp_quote("")
  typedef LONG DISPID;
  typedef DISPID MEMBERID;
  typedef DWORD HREFTYPE;
  typedef [v1_enum] enum tagTYPEKIND {
    TKIND_ENUM = 0,
    TKIND_RECORD,
    TKIND_MODULE,
    TKIND_INTERFACE,
    TKIND_DISPATCH,
    TKIND_COCLASS,
    TKIND_ALIAS,
    TKIND_UNION,
    TKIND_MAX
  } TYPEKIND;

cpp_quote("")
  typedef struct tagTYPEDESC {
    [switch_type (VARTYPE), switch_is (vt)] union {
      [case (VT_PTR, VT_SAFEARRAY)] struct tagTYPEDESC *lptdesc;
      [case (VT_CARRAY)] struct tagARRAYDESC *lpadesc;
      [case (VT_USERDEFINED)] HREFTYPE hreftype;
      [default];
    };
    VARTYPE vt;
  } TYPEDESC;

cpp_quote("")
  typedef struct tagARRAYDESC {
    TYPEDESC tdescElem;
    USHORT cDims;
    [size_is (cDims)] SAFEARRAYBOUND rgbounds[];
  } ARRAYDESC;

cpp_quote("")
  typedef struct tagPARAMDESCEX {
    ULONG cBytes;
    VARIANTARG varDefaultValue;
  } PARAMDESCEX,*LPPARAMDESCEX;

cpp_quote("")
  typedef struct tagPARAMDESC {
    LPPARAMDESCEX pparamdescex;
    USHORT wParamFlags;
  } PARAMDESC,*LPPARAMDESC;

cpp_quote("")
  const USHORT PARAMFLAG_NONE = 0x00;
  const USHORT PARAMFLAG_FIN = 0x01;
  const USHORT PARAMFLAG_FOUT = 0x02;
  const USHORT PARAMFLAG_FLCID = 0x04;
  const USHORT PARAMFLAG_FRETVAL = 0x08;
  const USHORT PARAMFLAG_FOPT = 0x10;
  const USHORT PARAMFLAG_FHASDEFAULT = 0x20;
  const USHORT PARAMFLAG_FHASCUSTDATA = 0x40;

cpp_quote("")
  typedef struct tagIDLDESC {
    ULONG_PTR dwReserved;
    USHORT wIDLFlags;
  } IDLDESC,*LPIDLDESC;

cpp_quote("")
  const USHORT IDLFLAG_NONE = PARAMFLAG_NONE;
  const USHORT IDLFLAG_FIN = PARAMFLAG_FIN;
  const USHORT IDLFLAG_FOUT = PARAMFLAG_FOUT;
  const USHORT IDLFLAG_FLCID = PARAMFLAG_FLCID;
  const USHORT IDLFLAG_FRETVAL = PARAMFLAG_FRETVAL;
  cpp_quote("")
  cpp_quote("#if 0")
  typedef struct tagELEMDESC {
    TYPEDESC tdesc;
    PARAMDESC paramdesc;
  } ELEMDESC;
  cpp_quote("#else")
  cpp_quote("")
  cpp_quote("  typedef struct tagELEMDESC {")
  cpp_quote("    TYPEDESC tdesc;")
  cpp_quote("    __C89_NAMELESS union {")
  cpp_quote("      IDLDESC idldesc;")
  cpp_quote("      PARAMDESC paramdesc;")
  cpp_quote("    } DUMMYUNIONNAME;")
  cpp_quote("  } ELEMDESC,*LPELEMDESC;")
  cpp_quote("#endif")

cpp_quote("")
  typedef struct tagTYPEATTR {
    GUID guid;
    LCID lcid;
    DWORD dwReserved;
    MEMBERID memidConstructor;
    MEMBERID memidDestructor;
    LPOLESTR lpstrSchema;
    ULONG cbSizeInstance;
    TYPEKIND typekind;
    WORD cFuncs;
    WORD cVars;
    WORD cImplTypes;
    WORD cbSizeVft;
    WORD cbAlignment;
    WORD wTypeFlags;
    WORD wMajorVerNum;
    WORD wMinorVerNum;
    TYPEDESC tdescAlias;
    IDLDESC idldescType;
  } TYPEATTR,*LPTYPEATTR;

cpp_quote("")
  typedef struct tagDISPPARAMS {
    [size_is (cArgs)] VARIANTARG *rgvarg;
    [size_is (cNamedArgs)] DISPID *rgdispidNamedArgs;
    UINT cArgs;
    UINT cNamedArgs;
  } DISPPARAMS;
  cpp_quote("")
  cpp_quote("#if 0")
  typedef struct tagEXCEPINFO {
    WORD wCode;
    WORD wReserved;
    BSTR bstrSource;
    BSTR bstrDescription;
    BSTR bstrHelpFile;
    DWORD dwHelpContext;
    ULONG_PTR pvReserved;
    ULONG_PTR pfnDeferredFillIn;
    SCODE scode;
  } EXCEPINFO;
  cpp_quote("#else")
  cpp_quote("  typedef struct tagEXCEPINFO {")
  cpp_quote("    WORD wCode;")
  cpp_quote("    WORD wReserved;")
  cpp_quote("    BSTR bstrSource;")
  cpp_quote("    BSTR bstrDescription;")
  cpp_quote("    BSTR bstrHelpFile;")
  cpp_quote("    DWORD dwHelpContext;")
  cpp_quote("    PVOID pvReserved;")
  cpp_quote("    HRESULT (__stdcall *pfnDeferredFillIn)(struct tagEXCEPINFO *);")
  cpp_quote("    SCODE scode;")
  cpp_quote("  } EXCEPINFO, *LPEXCEPINFO;")
  cpp_quote("#endif")

cpp_quote("")
  typedef [v1_enum] enum tagCALLCONV {
    CC_FASTCALL = 0,
    CC_CDECL = 1,
    CC_MSCPASCAL,
    CC_PASCAL = CC_MSCPASCAL,
    CC_MACPASCAL,
    CC_STDCALL,
    CC_FPFASTCALL,
    CC_SYSCALL,
    CC_MPWCDECL,
    CC_MPWPASCAL,
    CC_MAX
  } CALLCONV;

cpp_quote("")
  typedef [v1_enum] enum tagFUNCKIND {
    FUNC_VIRTUAL,
    FUNC_PUREVIRTUAL,
    FUNC_NONVIRTUAL,
    FUNC_STATIC,
    FUNC_DISPATCH
  } FUNCKIND;

cpp_quote("")
  typedef [v1_enum] enum tagINVOKEKIND {
    INVOKE_FUNC = 1,
    INVOKE_PROPERTYGET = 2,
    INVOKE_PROPERTYPUT = 4,
    INVOKE_PROPERTYPUTREF = 8
  } INVOKEKIND;

cpp_quote("")
  typedef struct tagFUNCDESC {
    MEMBERID memid;
    [size_is (cScodes)] SCODE *lprgscode;
    [size_is (cParams)] ELEMDESC *lprgelemdescParam;
    FUNCKIND funckind;
    INVOKEKIND invkind;
    CALLCONV callconv;
    SHORT cParams;
    SHORT cParamsOpt;
    SHORT oVft;
    SHORT cScodes;
    ELEMDESC elemdescFunc;
    WORD wFuncFlags;
  } FUNCDESC,*LPFUNCDESC;

cpp_quote("")
  typedef [v1_enum] enum tagVARKIND {
    VAR_PERINSTANCE,
    VAR_STATIC,
    VAR_CONST,
    VAR_DISPATCH
  } VARKIND;

cpp_quote("")
  const USHORT IMPLTYPEFLAG_FDEFAULT = 0x1;
  const USHORT IMPLTYPEFLAG_FSOURCE = 0x2;
  const USHORT IMPLTYPEFLAG_FRESTRICTED = 0x4;
  const USHORT IMPLTYPEFLAG_FDEFAULTVTABLE= 0x8;

cpp_quote("")
  typedef struct tagVARDESC {
    MEMBERID memid;
    LPOLESTR lpstrSchema;
    [switch_type (VARKIND), switch_is (varkind)] union {
      [case (VAR_PERINSTANCE, VAR_DISPATCH, VAR_STATIC)] ULONG oInst;
      [case (VAR_CONST)] VARIANT *lpvarValue;
    };
    ELEMDESC elemdescVar;
    WORD wVarFlags;
    VARKIND varkind;
  } VARDESC,*LPVARDESC;

cpp_quote("")
 typedef enum tagTYPEFLAGS {
    TYPEFLAG_FAPPOBJECT = 0x01,
    TYPEFLAG_FCANCREATE = 0x02,
    TYPEFLAG_FLICENSED = 0x04,
    TYPEFLAG_FPREDECLID = 0x08,
    TYPEFLAG_FHIDDEN = 0x10,
    TYPEFLAG_FCONTROL = 0x20,
    TYPEFLAG_FDUAL = 0x40,
    TYPEFLAG_FNONEXTENSIBLE = 0x80,
    TYPEFLAG_FOLEAUTOMATION = 0x100,
    TYPEFLAG_FRESTRICTED = 0x200,
    TYPEFLAG_FAGGREGATABLE = 0x400,
    TYPEFLAG_FREPLACEABLE = 0x800,
    TYPEFLAG_FDISPATCHABLE = 0x1000,
    TYPEFLAG_FREVERSEBIND = 0x2000,
    TYPEFLAG_FPROXY = 0x4000
  } TYPEFLAGS;

cpp_quote("")
  typedef enum tagFUNCFLAGS {
    FUNCFLAG_FRESTRICTED = 0x1,
    FUNCFLAG_FSOURCE = 0x2,
    FUNCFLAG_FBINDABLE = 0x4,
    FUNCFLAG_FREQUESTEDIT = 0x8,
    FUNCFLAG_FDISPLAYBIND = 0x10,
    FUNCFLAG_FDEFAULTBIND = 0x20,
    FUNCFLAG_FHIDDEN = 0x40,
    FUNCFLAG_FUSESGETLASTERROR = 0x80,
    FUNCFLAG_FDEFAULTCOLLELEM = 0x100,
    FUNCFLAG_FUIDEFAULT = 0x200,
    FUNCFLAG_FNONBROWSABLE = 0x400,
    FUNCFLAG_FREPLACEABLE = 0x800,
    FUNCFLAG_FIMMEDIATEBIND = 0x1000
  } FUNCFLAGS;

cpp_quote("")
  typedef enum tagVARFLAGS {
    VARFLAG_FREADONLY = 0x1,
    VARFLAG_FSOURCE = 0x2,
    VARFLAG_FBINDABLE = 0x4,
    VARFLAG_FREQUESTEDIT = 0x8,
    VARFLAG_FDISPLAYBIND = 0x10,
    VARFLAG_FDEFAULTBIND = 0x20,
    VARFLAG_FHIDDEN = 0x40,
    VARFLAG_FRESTRICTED = 0x80,
    VARFLAG_FDEFAULTCOLLELEM = 0x100,
    VARFLAG_FUIDEFAULT = 0x200,
    VARFLAG_FNONBROWSABLE = 0x400,
    VARFLAG_FREPLACEABLE = 0x800,
    VARFLAG_FIMMEDIATEBIND = 0x1000
  } VARFLAGS;

cpp_quote("")
  typedef [wire_marshal (DWORD)] struct tagCLEANLOCALSTORAGE {
    IUnknown *pInterface;
    PVOID pStorage;
    DWORD flags;
  } CLEANLOCALSTORAGE;

cpp_quote("")
  typedef struct tagCUSTDATAITEM {
    GUID guid;
    VARIANTARG varValue;
  } CUSTDATAITEM,*LPCUSTDATAITEM;

cpp_quote("")
  typedef struct tagCUSTDATA {
    DWORD cCustData;
    [size_is (cCustData)] LPCUSTDATAITEM prgCustData;
  } CUSTDATA,*LPCUSTDATA;
}
cpp_quote("#endif")
cpp_quote("")
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
[object, uuid (00020405-0000-0000-C000-000000000046), pointer_default (unique), local]
interface ICreateTypeInfo: IUnknown {
  typedef [unique] ICreateTypeInfo *LPCREATETYPEINFO;
cpp_quote("")
  HRESULT SetGuid ([in] REFGUID guid);
  HRESULT SetTypeFlags ([in] UINT uTypeFlags);
  HRESULT SetDocString ([in] LPOLESTR pStrDoc);
  HRESULT SetHelpContext ([in] DWORD dwHelpContext);
  HRESULT SetVersion ([in] WORD wMajorVerNum,[in] WORD wMinorVerNum);
  HRESULT AddRefTypeInfo ([in] ITypeInfo *pTInfo,[in] HREFTYPE *phRefType);
  HRESULT AddFuncDesc ([in] UINT index,[in] FUNCDESC *pFuncDesc);
  HRESULT AddImplType ([in] UINT index,[in] HREFTYPE hRefType);
  HRESULT SetImplTypeFlags ([in] UINT index,[in] INT implTypeFlags);
  HRESULT SetAlignment ([in] WORD cbAlignment);
  HRESULT SetSchema ([in] LPOLESTR pStrSchema);
  HRESULT AddVarDesc ([in] UINT index,[in] VARDESC *pVarDesc);
  HRESULT SetFuncAndParamNames ([in] UINT index,[in, size_is ((UINT) cNames)] LPOLESTR *rgszNames,[in] UINT cNames);
  HRESULT SetVarName ([in] UINT index,[in] LPOLESTR szName);
  HRESULT SetTypeDescAlias ([in] TYPEDESC *pTDescAlias);
  HRESULT DefineFuncAsDllEntry ([in] UINT index,[in] LPOLESTR szDllName,[in] LPOLESTR szProcName);
  HRESULT SetFuncDocString ([in] UINT index,[in] LPOLESTR szDocString);
  HRESULT SetVarDocString ([in] UINT index,[in] LPOLESTR szDocString);
  HRESULT SetFuncHelpContext ([in] UINT index,[in] DWORD dwHelpContext);
  HRESULT SetVarHelpContext ([in] UINT index,[in] DWORD dwHelpContext);
  HRESULT SetMops ([in] UINT index,[in] BSTR bstrMops);
  HRESULT SetTypeIdldesc ([in] IDLDESC *pIdlDesc);
  HRESULT LayOut (void);
}

cpp_quote("")
[object, uuid (0002040e-0000-0000-C000-000000000046), pointer_default (unique), local]
interface ICreateTypeInfo2: ICreateTypeInfo {
  typedef [unique] ICreateTypeInfo2 *LPCREATETYPEINFO2;
cpp_quote("")
  HRESULT DeleteFuncDesc ([in] UINT index);
  HRESULT DeleteFuncDescByMemId ([in] MEMBERID memid,[in] INVOKEKIND invKind);
  HRESULT DeleteVarDesc ([in] UINT index);
  HRESULT DeleteVarDescByMemId ([in] MEMBERID memid);
  HRESULT DeleteImplType ([in] UINT index);
  HRESULT SetCustData ([in] REFGUID guid,[in] VARIANT *pVarVal);
  HRESULT SetFuncCustData ([in] UINT index,[in] REFGUID guid,[in] VARIANT *pVarVal);
  HRESULT SetParamCustData ([in] UINT indexFunc,[in] UINT indexParam,[in] REFGUID guid,[in] VARIANT *pVarVal);
  HRESULT SetVarCustData ([in] UINT index,[in] REFGUID guid,[in] VARIANT *pVarVal);
  HRESULT SetImplTypeCustData ([in] UINT index,[in] REFGUID guid,[in] VARIANT *pVarVal);
  HRESULT SetHelpStringContext ([in] ULONG dwHelpStringContext);
  HRESULT SetFuncHelpStringContext ([in] UINT index,[in] ULONG dwHelpStringContext);
  HRESULT SetVarHelpStringContext ([in] UINT index,[in] ULONG dwHelpStringContext);
  HRESULT Invalidate (void);
  HRESULT SetName ([in] LPOLESTR szName);
}
cpp_quote("")
[object, uuid (00020406-0000-0000-C000-000000000046), pointer_default (unique), local]
interface ICreateTypeLib : IUnknown {
  typedef [unique] ICreateTypeLib *LPCREATETYPELIB;
cpp_quote("")
  HRESULT CreateTypeInfo ([in] LPOLESTR szName,[in] TYPEKIND tkind,[out] ICreateTypeInfo **ppCTInfo);
  HRESULT SetName ([in] LPOLESTR szName);
  HRESULT SetVersion ([in] WORD wMajorVerNum,[in] WORD wMinorVerNum);
  HRESULT SetGuid ([in] REFGUID guid);
  HRESULT SetDocString ([in] LPOLESTR szDoc);
  HRESULT SetHelpFileName ([in] LPOLESTR szHelpFileName);
  HRESULT SetHelpContext ([in] DWORD dwHelpContext);
  HRESULT SetLcid ([in] LCID lcid);
  HRESULT SetLibFlags ([in] UINT uLibFlags);
  HRESULT SaveAllChanges (void);
}
cpp_quote("")
[object, uuid (0002040f-0000-0000-C000-000000000046), pointer_default (unique), local]
interface ICreateTypeLib2 : ICreateTypeLib {
  typedef [unique] ICreateTypeLib2 *LPCREATETYPELIB2;
  HRESULT DeleteTypeInfo ([in] LPOLESTR szName);
  HRESULT SetCustData ([in] REFGUID guid,[in] VARIANT *pVarVal);
  HRESULT SetHelpStringContext ([in] ULONG dwHelpStringContext);
  HRESULT SetHelpStringDll ([in] LPOLESTR szFileName);
}
cpp_quote("#endif")
cpp_quote("")
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)")
[object, uuid (00020400-0000-0000-C000-000000000046), pointer_default (unique)]
interface IDispatch : IUnknown {
  typedef [unique] IDispatch *LPDISPATCH;
cpp_quote("")
  HRESULT GetTypeInfoCount ([out] UINT *pctinfo);
  HRESULT GetTypeInfo ([in] UINT iTInfo,[in] LCID lcid,[out] ITypeInfo **ppTInfo);
  HRESULT GetIDsOfNames ([in] REFIID riid,[in, size_is (cNames)] LPOLESTR *rgszNames,[in, range (0, 16384)] UINT cNames,[in] LCID lcid,[out, size_is (cNames)] DISPID *rgDispId);
  [local] HRESULT Invoke ([in] DISPID dispIdMember,[in] REFIID riid,[in] LCID lcid,[in] WORD wFlags,[in, out] DISPPARAMS *pDispParams,[out] VARIANT *pVarResult,[out] EXCEPINFO *pExcepInfo,[out] UINT *puArgErr);
  [call_as (Invoke)] HRESULT RemoteInvoke ([in] DISPID dispIdMember,[in] REFIID riid,[in] LCID lcid,[in] DWORD dwFlags,[in] DISPPARAMS *pDispParams,[out] VARIANT *pVarResult,[out] EXCEPINFO *pExcepInfo,[out] UINT *pArgErr,[in] UINT cVarRef,[in, size_is (cVarRef)] UINT *rgVarRefIdx,[in, out, size_is (cVarRef)] VARIANTARG *rgVarRef);
  cpp_quote("")
  const DISPID DISPID_UNKNOWN = -1;
  const DISPID DISPID_VALUE = 0;
  const DISPID DISPID_PROPERTYPUT = -3;
  const DISPID DISPID_NEWENUM = -4;
  const DISPID DISPID_EVALUATE = -5;
  const DISPID DISPID_CONSTRUCTOR = -6;
  const DISPID DISPID_DESTRUCTOR = -7;
  const DISPID DISPID_COLLECT = -8;
  cpp_quote("")
}

cpp_quote("")
[object, uuid (00020404-0000-0000-C000-000000000046), pointer_default (unique)]
interface IEnumVARIANT : IUnknown {
  typedef [unique] IEnumVARIANT *LPENUMVARIANT;
cpp_quote("")
  [local] HRESULT Next ([in] ULONG celt,[out, size_is (celt), length_is (*pCeltFetched)] VARIANT *rgVar,[out] ULONG *pCeltFetched);
  [call_as (Next)] HRESULT RemoteNext ([in] ULONG celt,[out, size_is (celt), length_is (*pCeltFetched)] VARIANT *rgVar,[out] ULONG *pCeltFetched);
  HRESULT Skip ([in] ULONG celt);
  HRESULT Reset ();
  HRESULT Clone ([out] IEnumVARIANT **ppEnum);
}

cpp_quote("")
[object, uuid (00020403-0000-0000-C000-000000000046), pointer_default (unique)]
interface ITypeComp : IUnknown {
  typedef [unique] ITypeComp *LPTYPECOMP;
cpp_quote("")
  typedef [v1_enum] enum tagDESCKIND {
    DESCKIND_NONE = 0,
    DESCKIND_FUNCDESC,
    DESCKIND_VARDESC,
    DESCKIND_TYPECOMP,
    DESCKIND_IMPLICITAPPOBJ,
    DESCKIND_MAX
  } DESCKIND;
cpp_quote("")
  typedef union tagBINDPTR {
    FUNCDESC *lpfuncdesc;
    VARDESC *lpvardesc;
    ITypeComp *lptcomp;
  } BINDPTR,*LPBINDPTR;
cpp_quote("")
  [local] HRESULT Bind ([in] LPOLESTR szName,[in] ULONG lHashVal,[in] WORD wFlags,[out] ITypeInfo **ppTInfo,[out] DESCKIND *pDescKind,[out] BINDPTR *pBindPtr);
  [call_as (Bind)] HRESULT RemoteBind ([in] LPOLESTR szName,[in] ULONG lHashVal,[in] WORD wFlags,[out] ITypeInfo **ppTInfo,[out] DESCKIND *pDescKind,[out] LPFUNCDESC *ppFuncDesc,[out] LPVARDESC *ppVarDesc,[out] ITypeComp **ppTypeComp,[out] CLEANLOCALSTORAGE *pDummy);
  [local] HRESULT BindType ([in] LPOLESTR szName,[in] ULONG lHashVal,[out] ITypeInfo **ppTInfo,[out] ITypeComp **ppTComp);
  [call_as (BindType)] HRESULT RemoteBindType ([in] LPOLESTR szName,[in] ULONG lHashVal,[out] ITypeInfo **ppTInfo);
}
cpp_quote("#endif")
cpp_quote("")
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
[object, uuid (00020401-0000-0000-C000-000000000046), pointer_default (unique)]
interface ITypeInfo : IUnknown {
  typedef [unique] ITypeInfo *LPTYPEINFO;
cpp_quote("")
  [local] HRESULT GetTypeAttr ([out] TYPEATTR **ppTypeAttr);
  [call_as (GetTypeAttr)] HRESULT RemoteGetTypeAttr ([out] LPTYPEATTR *ppTypeAttr,[out] CLEANLOCALSTORAGE *pDummy);
  HRESULT GetTypeComp ([out] ITypeComp **ppTComp);
  [local] HRESULT GetFuncDesc ([in] UINT index,[out] FUNCDESC **ppFuncDesc);
  [call_as (GetFuncDesc)] HRESULT RemoteGetFuncDesc ([in] UINT index,[out] LPFUNCDESC *ppFuncDesc,[out] CLEANLOCALSTORAGE *pDummy);
  [local] HRESULT GetVarDesc ([in] UINT index,[out] VARDESC **ppVarDesc);
  [call_as (GetVarDesc)] HRESULT RemoteGetVarDesc ([in] UINT index,[out] LPVARDESC *ppVarDesc,[out] CLEANLOCALSTORAGE *pDummy);
  [local] HRESULT GetNames ([in] MEMBERID memid,[out, size_is (cMaxNames), length_is (*pcNames)] BSTR *rgBstrNames,[in] UINT cMaxNames,[out] UINT *pcNames);
  [call_as (GetNames)] HRESULT RemoteGetNames ([in] MEMBERID memid,[out, size_is (cMaxNames), length_is (*pcNames)] BSTR *rgBstrNames,[in] UINT cMaxNames,[out] UINT *pcNames);
  HRESULT GetRefTypeOfImplType ([in] UINT index,[out] HREFTYPE *pRefType);
  HRESULT GetImplTypeFlags ([in] UINT index,[out] INT *pImplTypeFlags);
  [local] HRESULT GetIDsOfNames ([in, size_is (cNames)] LPOLESTR *rgszNames,[in] UINT cNames,[out, size_is (cNames)] MEMBERID *pMemId);
  [call_as (GetIDsOfNames)] HRESULT LocalGetIDsOfNames (void);
  [local] HRESULT Invoke ([in] PVOID pvInstance,[in] MEMBERID memid,[in] WORD wFlags,[in, out] DISPPARAMS *pDispParams,[out] VARIANT *pVarResult,[out] EXCEPINFO *pExcepInfo,[out] UINT *puArgErr);
  [call_as (Invoke)] HRESULT LocalInvoke (void);
  [local] HRESULT GetDocumentation ([in] MEMBERID memid,[out] BSTR *pBstrName,[out] BSTR *pBstrDocString,[out] DWORD *pdwHelpContext,[out] BSTR *pBstrHelpFile);
  [call_as (GetDocumentation)] HRESULT RemoteGetDocumentation ([in] MEMBERID memid,[in] DWORD refPtrFlags,[out] BSTR *pBstrName,[out] BSTR *pBstrDocString,[out] DWORD *pdwHelpContext,[out] BSTR *pBstrHelpFile);
  [local]
  HRESULT GetDllEntry ([in] MEMBERID memid,[in] INVOKEKIND invKind,[out] BSTR *pBstrDllName,[out] BSTR *pBstrName,[out] WORD *pwOrdinal);
  [call_as (GetDllEntry)]
  HRESULT RemoteGetDllEntry ([in] MEMBERID memid,[in] INVOKEKIND invKind,[in] DWORD refPtrFlags,[out] BSTR *pBstrDllName,[out] BSTR *pBstrName,[out] WORD *pwOrdinal);
  HRESULT GetRefTypeInfo ([in] HREFTYPE hRefType,[out] ITypeInfo **ppTInfo);
  [local] HRESULT AddressOfMember ([in] MEMBERID memid,[in] INVOKEKIND invKind,[out] PVOID *ppv);
  [call_as (AddressOfMember)] HRESULT LocalAddressOfMember (void);
  [local] HRESULT CreateInstance ([in] IUnknown *pUnkOuter,[in] REFIID riid,[out, iid_is (riid)] PVOID *ppvObj);
  [call_as (CreateInstance)] HRESULT RemoteCreateInstance ([in] REFIID riid,[out, iid_is (riid)] IUnknown **ppvObj);
  HRESULT GetMops ([in] MEMBERID memid,[out] BSTR *pBstrMops);
  [local] HRESULT GetContainingTypeLib ([out] ITypeLib **ppTLib,[out] UINT *pIndex);
  [call_as (GetContainingTypeLib)] HRESULT RemoteGetContainingTypeLib ([out] ITypeLib **ppTLib,[out] UINT *pIndex);
  [local] void ReleaseTypeAttr ([in] TYPEATTR *pTypeAttr);
  [call_as (ReleaseTypeAttr)] HRESULT LocalReleaseTypeAttr (void);
  [local] void ReleaseFuncDesc ([in] FUNCDESC *pFuncDesc);
  [call_as (ReleaseFuncDesc)] HRESULT LocalReleaseFuncDesc (void);
  [local] void ReleaseVarDesc ([in] VARDESC *pVarDesc);
  [call_as (ReleaseVarDesc)] HRESULT LocalReleaseVarDesc (void);
}

cpp_quote("")
[object, uuid (00020412-0000-0000-C000-000000000046), pointer_default (unique)]
interface ITypeInfo2 : ITypeInfo {
  typedef [unique] ITypeInfo2 *LPTYPEINFO2;
cpp_quote("")
  HRESULT GetTypeKind ([out] TYPEKIND *pTypeKind);
  HRESULT GetTypeFlags ([out] ULONG *pTypeFlags);
  HRESULT GetFuncIndexOfMemId ([in] MEMBERID memid,[in] INVOKEKIND invKind,[out] UINT *pFuncIndex);
  HRESULT GetVarIndexOfMemId ([in] MEMBERID memid,[out] UINT *pVarIndex);
  HRESULT GetCustData ([in] REFGUID guid,[out] VARIANT *pVarVal);
  HRESULT GetFuncCustData ([in] UINT index,[in] REFGUID guid,[out] VARIANT *pVarVal);
  HRESULT GetParamCustData ([in] UINT indexFunc,[in] UINT indexParam,[in] REFGUID guid,[out] VARIANT *pVarVal);
  HRESULT GetVarCustData ([in] UINT index,[in] REFGUID guid,[out] VARIANT *pVarVal);
  HRESULT GetImplTypeCustData ([in] UINT index,[in] REFGUID guid,[out] VARIANT *pVarVal);
  [local] HRESULT GetDocumentation2 ([in] MEMBERID memid,[in] LCID lcid,[out] BSTR *pbstrHelpString,[out] DWORD *pdwHelpStringContext,[out] BSTR *pbstrHelpStringDll);
  [call_as (GetDocumentation2)] HRESULT RemoteGetDocumentation2 ([in] MEMBERID memid,[in] LCID lcid,[in] DWORD refPtrFlags,[out] BSTR *pbstrHelpString,[out] DWORD *pdwHelpStringContext,[out] BSTR *pbstrHelpStringDll);
  HRESULT GetAllCustData ([out] CUSTDATA *pCustData);
  HRESULT GetAllFuncCustData ([in] UINT index,[out] CUSTDATA *pCustData);
  HRESULT GetAllParamCustData ([in] UINT indexFunc,[in] UINT indexParam,[out] CUSTDATA *pCustData);
  HRESULT GetAllVarCustData ([in] UINT index,[out] CUSTDATA *pCustData);
  HRESULT GetAllImplTypeCustData ([in] UINT index,[out] CUSTDATA *pCustData);
}
cpp_quote("#endif")
cpp_quote("")
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)")
[object, uuid (00020402-0000-0000-C000-000000000046), pointer_default (unique)]
interface ITypeLib : IUnknown {
  typedef [v1_enum] enum tagSYSKIND {
    SYS_WIN16 = 0,
    SYS_WIN32,
    SYS_MAC,
    SYS_WIN64
  } SYSKIND;
cpp_quote("")
  typedef [v1_enum] enum tagLIBFLAGS {
    LIBFLAG_FRESTRICTED = 0x01,
    LIBFLAG_FCONTROL = 0x02,
    LIBFLAG_FHIDDEN = 0x04,
    LIBFLAG_FHASDISKIMAGE = 0x08
  } LIBFLAGS;
cpp_quote("")
  typedef [unique] ITypeLib *LPTYPELIB;
cpp_quote("")
  typedef struct tagTLIBATTR {
    GUID guid;
    LCID lcid;
    SYSKIND syskind;
    WORD wMajorVerNum;
    WORD wMinorVerNum;
    WORD wLibFlags;
  } TLIBATTR,*LPTLIBATTR;
cpp_quote("")
  [local] UINT GetTypeInfoCount (void);
  [call_as (GetTypeInfoCount)] HRESULT RemoteGetTypeInfoCount ([out] UINT *pcTInfo);
  HRESULT GetTypeInfo ([in] UINT index,[out] ITypeInfo **ppTInfo);
  HRESULT GetTypeInfoType ([in] UINT index,[out] TYPEKIND *pTKind);
  HRESULT GetTypeInfoOfGuid ([in] REFGUID guid,[out] ITypeInfo **ppTinfo);
  [local] HRESULT GetLibAttr ([out] TLIBATTR **ppTLibAttr);
  [call_as (GetLibAttr)] HRESULT RemoteGetLibAttr ([out] LPTLIBATTR *ppTLibAttr,[out] CLEANLOCALSTORAGE *pDummy);
  HRESULT GetTypeComp ([out] ITypeComp **ppTComp);
  [local] HRESULT GetDocumentation ([in] INT index,[out] BSTR *pBstrName,[out] BSTR *pBstrDocString,[out] DWORD *pdwHelpContext,[out] BSTR *pBstrHelpFile);
  [call_as (GetDocumentation)] HRESULT RemoteGetDocumentation ([in] INT index,[in] DWORD refPtrFlags,[out] BSTR *pBstrName,[out] BSTR *pBstrDocString,[out] DWORD *pdwHelpContext,[out] BSTR *pBstrHelpFile);
  [local] HRESULT IsName ([in, out] LPOLESTR szNameBuf,[in] ULONG lHashVal,[out] BOOL *pfName);
  [call_as (IsName)] HRESULT RemoteIsName ([in] LPOLESTR szNameBuf,[in] ULONG lHashVal,[out] BOOL *pfName,[out] BSTR *pBstrLibName);
  [local] HRESULT FindName ([in, out] LPOLESTR szNameBuf,[in] ULONG lHashVal,[out, size_is (*pcFound), length_is (*pcFound)] ITypeInfo **ppTInfo,[out, size_is (*pcFound), length_is (*pcFound)] MEMBERID *rgMemId,[in, out] USHORT *pcFound);
  [call_as (FindName)] HRESULT RemoteFindName ([in] LPOLESTR szNameBuf,[in] ULONG lHashVal,[out, size_is (*pcFound), length_is (*pcFound)] ITypeInfo **ppTInfo,[out, size_is (*pcFound), length_is (*pcFound)] MEMBERID *rgMemId,[in, out] USHORT *pcFound,[out] BSTR *pBstrLibName);
  [local] void ReleaseTLibAttr ([in] TLIBATTR *pTLibAttr);
  [call_as (ReleaseTLibAttr)] HRESULT LocalReleaseTLibAttr (void);
}
cpp_quote("#endif")
cpp_quote("")
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
[object, uuid (00020411-0000-0000-C000-000000000046), pointer_default (unique)]
interface ITypeLib2 : ITypeLib {
  typedef [unique] ITypeLib2 *LPTYPELIB2;
cpp_quote("")
  HRESULT GetCustData ([in] REFGUID guid,[out] VARIANT *pVarVal);
  [local] HRESULT GetLibStatistics ([out] ULONG *pcUniqueNames,[out] ULONG *pcchUniqueNames);
  [call_as (GetLibStatistics)] HRESULT RemoteGetLibStatistics ([out] ULONG *pcUniqueNames,[out] ULONG *pcchUniqueNames);
  [local] HRESULT GetDocumentation2 ([in] INT index,[in] LCID lcid,[out] BSTR *pbstrHelpString,[out] DWORD *pdwHelpStringContext,[out] BSTR *pbstrHelpStringDll);
  [call_as (GetDocumentation2)] HRESULT RemoteGetDocumentation2 ([in] INT index,[in] LCID lcid,[in] DWORD refPtrFlags,[out] BSTR *pbstrHelpString,[out] DWORD *pdwHelpStringContext,[out] BSTR *pbstrHelpStringDll);
  HRESULT GetAllCustData ([out] CUSTDATA *pCustData);
}

cpp_quote("")
[object, uuid (00020410-0000-0000-C000-000000000046), pointer_default (unique), local]
interface ITypeChangeEvents: IUnknown {
  typedef [unique] ITypeChangeEvents *LPTYPECHANGEEVENTS;
cpp_quote("")
  typedef enum tagCHANGEKIND {
    CHANGEKIND_ADDMEMBER,
    CHANGEKIND_DELETEMEMBER,
    CHANGEKIND_SETNAMES,
    CHANGEKIND_SETDOCUMENTATION,
    CHANGEKIND_GENERAL,
    CHANGEKIND_INVALIDATE,
    CHANGEKIND_CHANGEFAILED,
    CHANGEKIND_MAX
  } CHANGEKIND;
cpp_quote("")
  HRESULT RequestTypeChange ([in] CHANGEKIND changeKind,[in] ITypeInfo *pTInfoBefore,[in] LPOLESTR pStrName,[out] INT *pfCancel);
  HRESULT AfterTypeChange ([in] CHANGEKIND changeKind,[in] ITypeInfo *pTInfoAfter,[in] LPOLESTR pStrName);
}

cpp_quote("")
[object, uuid (1cf2b120-547d-101b-8e65-08002b2bd119), pointer_default (unique)]
interface IErrorInfo: IUnknown {
  typedef [unique] IErrorInfo *LPERRORINFO;
cpp_quote("")
  HRESULT GetGUID ([out] GUID *pGUID);
  HRESULT GetSource ([out] BSTR *pBstrSource);
  HRESULT GetDescription ([out] BSTR *pBstrDescription);
  HRESULT GetHelpFile ([out] BSTR *pBstrHelpFile);
  HRESULT GetHelpContext ([out] DWORD *pdwHelpContext);
}

cpp_quote("")
[object, uuid (22f03340-547d-101b-8e65-08002b2bd119), pointer_default (unique)]
interface ICreateErrorInfo: IUnknown {
  typedef [unique] ICreateErrorInfo *LPCREATEERRORINFO;
cpp_quote("")
  HRESULT SetGUID ([in] REFGUID rguid);
  HRESULT SetSource ([in] LPOLESTR szSource);
  HRESULT SetDescription ([in] LPOLESTR szDescription);
  HRESULT SetHelpFile ([in] LPOLESTR szHelpFile);
  HRESULT SetHelpContext ([in] DWORD dwHelpContext);
}

cpp_quote("")
[object, uuid (DF0B3D60-548f-101b-8e65-08002b2bd119), pointer_default (unique)]
interface ISupportErrorInfo: IUnknown {
  typedef [unique] ISupportErrorInfo *LPSUPPORTERRORINFO;
cpp_quote("")
  HRESULT InterfaceSupportsErrorInfo ([in] REFIID riid);
}

cpp_quote("")
[object, uuid (0000002e-0000-0000-C000-000000000046)]
interface ITypeFactory : IUnknown {
  HRESULT CreateFromTypeInfo ([in] ITypeInfo *pTypeInfo,[in] REFIID riid,[out, iid_is (riid)] IUnknown **ppv);
}

cpp_quote("")
[local, object, uuid (0000002d-0000-0000-C000-000000000046)]
interface ITypeMarshal : IUnknown {
  HRESULT Size ([in] PVOID pvType,[in] DWORD dwDestContext,[in] PVOID pvDestContext,[out] ULONG *pSize);
  HRESULT Marshal ([in] PVOID pvType,[in] DWORD dwDestContext,[in] PVOID pvDestContext,[in] ULONG cbBufferLength,[out] BYTE *pBuffer,[out] ULONG *pcbWritten);
  HRESULT Unmarshal ([out] PVOID pvType,[in] DWORD dwFlags,[in] ULONG cbBufferLength,[in] BYTE *pBuffer,[out] ULONG *pcbRead);
  HRESULT Free ([in] PVOID pvType);
}

cpp_quote("")
[local, object, uuid (0000002f-0000-0000-C000-000000000046)]
interface IRecordInfo: IUnknown {
  typedef [unique] IRecordInfo *LPRECORDINFO;
cpp_quote("")
  HRESULT RecordInit ([out] PVOID pvNew);
  HRESULT RecordClear ([in] PVOID pvExisting);
  HRESULT RecordCopy ([in] PVOID pvExisting,[out] PVOID pvNew);
  HRESULT GetGuid ([out] GUID *pguid);
  HRESULT GetName ([out] BSTR *pbstrName);
  HRESULT GetSize ([out] ULONG *pcbSize);
  HRESULT GetTypeInfo ([out] ITypeInfo **ppTypeInfo);
  HRESULT GetField ([in] PVOID pvData,[in] LPCOLESTR szFieldName,[out] VARIANT *pvarField);
  HRESULT GetFieldNoCopy ([in] PVOID pvData,[in] LPCOLESTR szFieldName,[out] VARIANT *pvarField,[out] PVOID *ppvDataCArray);
  HRESULT PutField ([in] ULONG wFlags,[in, out] PVOID pvData,[in] LPCOLESTR szFieldName,[in] VARIANT *pvarField);
  HRESULT PutFieldNoCopy ([in] ULONG wFlags,[in, out] PVOID pvData,[in] LPCOLESTR szFieldName,[in] VARIANT *pvarField);
  HRESULT GetFieldNames ([in, out] ULONG *pcNames,[out, size_is (*pcNames), length_is (*pcNames)] BSTR *rgBstrNames);
  BOOL IsMatchingType ([in] IRecordInfo *pRecordInfo);
  PVOID RecordCreate ();
  HRESULT RecordCreateCopy ([in] PVOID pvSource,[out] PVOID *ppvDest);
  HRESULT RecordDestroy ([in] PVOID pvRecord);
}

cpp_quote("")
[object, uuid (3127ca40-446e-11ce-8135-00aa004bb851), pointer_default (unique)]
interface IErrorLog : IUnknown {
  typedef IErrorLog *LPERRORLOG;
cpp_quote("")
  HRESULT AddError ([in] LPCOLESTR pszPropName,[in] EXCEPINFO *pExcepInfo);
}

cpp_quote("")
[object, uuid (55272a00-42cb-11ce-8135-00aa004bb851), pointer_default (unique)]
interface IPropertyBag : IUnknown {
  typedef IPropertyBag *LPPROPERTYBAG;
cpp_quote("")
  [local] HRESULT Read ([in] LPCOLESTR pszPropName,[in, out] VARIANT *pVar,[in, unique] IErrorLog *pErrorLog);
  [call_as (Read)] HRESULT RemoteRead ([in] LPCOLESTR pszPropName,[out] VARIANT *pVar,[in, unique] IErrorLog *pErrorLog,[in] DWORD varType,[in] IUnknown *pUnkObj);
  HRESULT Write ([in] LPCOLESTR pszPropName,[in] VARIANT *pVar);
}
cpp_quote("#endif")
