/*
 * Copyright 2002 Ove Kaaven
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

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

interface IDispatch;
interface ITypeInfo;
interface ITypeLib;
interface IRecordInfo;

[
  version(1.0),
  pointer_default(unique)
]
interface IOleAutomationTypes
{

typedef CY CURRENCY;

/* Safe Array */

typedef struct tagSAFEARRAYBOUND {
  ULONG cElements;
  LONG lLbound;
} SAFEARRAYBOUND, *LPSAFEARRAYBOUND;

typedef [unique] struct _wireVARIANT *wireVARIANT;
typedef [unique] struct _wireBRECORD *wireBRECORD;

typedef struct _wireSAFEARR_BSTR {
  ULONG Size;
  [size_is(Size), ref] wireBSTR *aBstr;
} SAFEARR_BSTR;

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

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

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

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

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

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;

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;

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

typedef [unique] wireSAFEARRAY *wirePSAFEARRAY;

typedef struct tagSAFEARRAY {
  USHORT cDims;
  USHORT fFeatures;
  ULONG cbElements;
  ULONG cLocks;
  PVOID pvData;
  SAFEARRAYBOUND rgsabound[];
} SAFEARRAY;

typedef [wire_marshal(wirePSAFEARRAY)] SAFEARRAY *LPSAFEARRAY;

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;
/* Undocumented flags */
const USHORT FADF_DATADELETED  = 0x1000; /* Data in a vector has been deleted */
const USHORT FADF_CREATEVECTOR = 0x2000; /* This array is a vector */

/* Variant */

cpp_quote("#if (__STDC__ && !defined(_FORCENAMELESSUNION)) || defined(NONAMELESSUNION)")
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")

typedef [wire_marshal(wireVARIANT)] struct tagVARIANT VARIANT;

struct tagVARIANT {
  union {
    struct __tagVARIANT {
      VARTYPE vt;
      WORD wReserved1;
      WORD wReserved2;
      WORD wReserved3;
      union {
        signed char cVal;
        USHORT uiVal;
        ULONG ulVal;
        INT intVal;
        UINT uintVal;
        BYTE bVal;
        SHORT iVal;
        LONG lVal;
        FLOAT fltVal;
        DOUBLE dblVal;
        VARIANT_BOOL boolVal;
#if 0 /* illegal in C++ */
        _VARIANT_BOOL bool;
#endif
        SCODE scode;
        DATE date;
        BSTR bstrVal;
        CY cyVal;
        IUnknown *punkVal;
        IDispatch *pdispVal;
        SAFEARRAY *parray;
        LONGLONG llVal;
        ULONGLONG ullVal;
        signed char *pcVal;
        USHORT *puiVal;
        ULONG *pulVal;
        INT *pintVal;
        UINT *puintVal;
        BYTE *pbVal;
        SHORT *piVal;
        LONG *plVal;
        FLOAT *pfltVal;
        DOUBLE *pdblVal;
        VARIANT_BOOL *pboolVal;
#if 0
        _VARIANT_BOOL *pbool;
#endif
        SCODE *pscode;
        DATE *pdate;
        BSTR *pbstrVal;
        VARIANT *pvarVal;
        PVOID byref;
        CY *pcyVal;
        DECIMAL *pdecVal;
        IUnknown **ppunkVal;
        IDispatch **ppdispVal;
        SAFEARRAY **pparray;
        LONGLONG *pllVal;
        ULONGLONG *pullVal;
        struct __tagBRECORD {
          PVOID pvRecord;
          IRecordInfo *pRecInfo;
        } __VARIANT_NAME_4;
      } __VARIANT_NAME_3;
    } __VARIANT_NAME_2;

    DECIMAL decVal;
  } __VARIANT_NAME_1;
};

typedef VARIANT *LPVARIANT;
typedef VARIANT VARIANTARG;
typedef VARIANTARG *LPVARIANTARG;

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

struct _wireVARIANT {
  DWORD clSize;
  DWORD rpcReserved;
  USHORT vt;
  USHORT wReserved1;
  USHORT wReserved2;
  USHORT wReserved3;
  [switch_is(vt)] union {
  [case(VT_EMPTY, VT_NULL)]    ;
  [case(VT_I1)]                signed char cVal;
  [case(VT_UI2)]               USHORT uiVal;
  [case(VT_UI4)]               ULONG ulVal;
  [case(VT_INT)]               INT intVal;
  [case(VT_UINT)]              UINT uintVal;
  [case(VT_UI1)]               BYTE bVal;
  [case(VT_I2)]                SHORT iVal;
  [case(VT_I4)]                LONG lVal;
  [case(VT_R4)]                FLOAT fltVal;
  [case(VT_R8)]                DOUBLE dblVal;
  [case(VT_BOOL)]              VARIANT_BOOL boolVal;
  [case(VT_ERROR)]             SCODE scode;
  [case(VT_DATE)]              DATE date;
  [case(VT_BSTR)]              wireBSTR bstrVal;
  [case(VT_CY)]                CY cyVal;
  [case(VT_DECIMAL)]           DECIMAL decVal;
  [case(VT_UNKNOWN)]           IUnknown *punkVal;
  [case(VT_DISPATCH)]          IDispatch *pdispVal;
  [case(VT_ARRAY)]             wireSAFEARRAY parray;
  [case(VT_I1|VT_BYREF)]       signed char *pcVal;
  [case(VT_UI2|VT_BYREF)]      USHORT *puiVal;
  [case(VT_UI4|VT_BYREF)]      ULONG *pulVal;
  [case(VT_INT|VT_BYREF)]      INT *pintVal;
  [case(VT_UINT|VT_BYREF)]     UINT *puintVal;
  [case(VT_UI1|VT_BYREF)]      BYTE *pbVal;
  [case(VT_I2|VT_BYREF)]       SHORT *piVal;
  [case(VT_I4|VT_BYREF)]       LONG *plVal;
  [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_DATE|VT_BYREF)]     DATE *pdate;
  [case(VT_BSTR|VT_BYREF)]     wireBSTR *pbstrVal;
  [case(VT_VARIANT|VT_BYREF)]  wireVARIANT *pvarVal;
  [case(VT_CY|VT_BYREF)]       CY *pcyVal;
  [case(VT_DECIMAL|VT_BYREF)]  DECIMAL *pdecVal;
  [case(VT_UNKNOWN|VT_BYREF)]  IUnknown **ppunkVal;
  [case(VT_DISPATCH|VT_BYREF)] IDispatch **ppdispVal;
  [case(VT_ARRAY|VT_BYREF)]    wireSAFEARRAY *pparray;
  [case(VT_RECORD, VT_RECORD|VT_BYREF)] wireBRECORD brecVal;
  } DUMMYUNIONNAME;
};

/* Dispatch */

typedef LONG DISPID;
typedef DWORD HREFTYPE;
typedef DISPID MEMBERID;

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;

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

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

typedef struct tagPARAMDESCEX {
  ULONG cBytes;
  VARIANTARG varDefaultValue;
} PARAMDESCEX, *LPPARAMDESCEX;

typedef struct tagPARAMDESC {
  LPPARAMDESCEX pparamdescex;
  USHORT wParamFlags;
} PARAMDESC, *LPPARAMDESC;

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;

typedef struct tagIDLDESC {
  ULONG dwReserved;
  USHORT wIDLFlags;
} IDLDESC, *LPIDLDESC;

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("#if 0") /* for IDL only */
typedef struct tagELEMDESC {
  TYPEDESC tdesc;
  PARAMDESC paramdesc;
} ELEMDESC;
cpp_quote("#else") /* C/C++ defs */
cpp_quote("typedef struct tagELEMDESC {")
cpp_quote("  TYPEDESC tdesc;")
cpp_quote("  union {")
cpp_quote("    IDLDESC idldesc;")
cpp_quote("    PARAMDESC paramdesc;")
cpp_quote("  } DUMMYUNIONNAME;")
cpp_quote("} ELEMDESC, *LPELEMDESC;")
cpp_quote("#endif")

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;

typedef struct tagDISPPARAMS {
  [size_is(cArgs)] VARIANTARG *rgvarg;
  [size_is(cNamedArgs)] DISPID *rgdispidNamedArgs;
  UINT cArgs;
  UINT cNamedArgs;
} DISPPARAMS;

cpp_quote("#if 0") /* for IDL only */
typedef struct tagEXCEPINFO {
  WORD wCode;
  WORD wReserved;
  BSTR bstrSource;
  BSTR bstrDescription;
  BSTR bstrHelpFile;
  DWORD dwHelpContext;
  ULONG pvReserved;
  ULONG 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")

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;

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

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

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;

typedef [v1_enum] enum tagVARKIND {
  VAR_PERINSTANCE,
  VAR_STATIC,
  VAR_CONST,
  VAR_DISPATCH
} VARKIND;

const USHORT IMPLTYPEFLAG_FDEFAULT       = 0x1;
const USHORT IMPLTYPEFLAG_FSOURCE        = 0x2;
const USHORT IMPLTYPEFLAG_FRESTRICTED    = 0x4;
const USHORT IMPLTYPEFLAG_FDEFAULTVTABLE = 0x8;

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

typedef enum tagTYPEFLAGS {
  TYPEFLAG_FAPPOBJECT     = 0x0001,
  TYPEFLAG_FCANCREATE     = 0x0002,
  TYPEFLAG_FLICENSED      = 0x0004,
  TYPEFLAG_FPREDECLID     = 0x0008,
  TYPEFLAG_FHIDDEN        = 0x0010,
  TYPEFLAG_FCONTROL       = 0x0020,
  TYPEFLAG_FDUAL          = 0x0040,
  TYPEFLAG_FNONEXTENSIBLE = 0x0080,
  TYPEFLAG_FOLEAUTOMATION = 0x0100,
  TYPEFLAG_FRESTRICTED    = 0x0200,
  TYPEFLAG_FAGGREGATABLE  = 0x0400,
  TYPEFLAG_FREPLACEABLE   = 0x0800,
  TYPEFLAG_FDISPATCHABLE  = 0x1000,
  TYPEFLAG_FREVERSEBIND   = 0x2000,
  TYPEFLAG_FPROXY         = 0x4000
} TYPEFLAGS;

typedef enum tagFUNCFLAGS {
  FUNCFLAG_FRESTRICTED       = 0x0001,
  FUNCFLAG_FSOURCE           = 0x0002,
  FUNCFLAG_FBINDABLE         = 0x0004,
  FUNCFLAG_FREQUESTEDIT      = 0x0008,
  FUNCFLAG_FDISPLAYBIND      = 0x0010,
  FUNCFLAG_FDEFAULTBIND      = 0x0020,
  FUNCFLAG_FHIDDEN           = 0x0040,
  FUNCFLAG_FUSESGETLASTERROR = 0x0080,
  FUNCFLAG_FDEFAULTCOLLELEM  = 0x0100,
  FUNCFLAG_FUIDEFAULT        = 0x0200,
  FUNCFLAG_FNONBROWSABLE     = 0x0400,
  FUNCFLAG_FREPLACEABLE      = 0x0800,
  FUNCFLAG_FIMMEDIATEBIND    = 0x1000
} FUNCFLAGS;

typedef enum tagVARFLAGS {
  VARFLAG_FREADONLY        = 0x0001,
  VARFLAG_FSOURCE          = 0x0002,
  VARFLAG_FBINDABLE        = 0x0004,
  VARFLAG_FREQUESTEDIT     = 0x0008,
  VARFLAG_FDISPLAYBIND     = 0x0010,
  VARFLAG_FDEFAULTBIND     = 0x0020,
  VARFLAG_FHIDDEN          = 0x0040,
  VARFLAG_FRESTRICTED      = 0x0080,
  VARFLAG_FDEFAULTCOLLELEM = 0x0100,
  VARFLAG_FUIDEFAULT       = 0x0200,
  VARFLAG_FNONBROWSABLE    = 0x0400,
  VARFLAG_FREPLACEABLE     = 0x0800,
  VARFLAG_FIMMEDIATEBIND   = 0x1000
} VARFLAGS;

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

typedef struct tagCUSTDATAITEM {
  GUID guid;
  VARIANTARG varValue;
} CUSTDATAITEM, *LPCUSTDATAITEM;

typedef struct tagCUSTDATA {
  DWORD cCustData;
  [size_is(cCustData)] LPCUSTDATAITEM prgCustData;
} CUSTDATA, *LPCUSTDATA;

} /* interface IOleAutomationTypes */

/******************** INTERFACES ********************/

[
  object,
  uuid(00020400-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface IDispatch : IUnknown
{
  typedef [unique] IDispatch *LPDISPATCH;

  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;

  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] 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);
}

[
  object,
  uuid(00020404-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface IEnumVARIANT : IUnknown
{
  typedef [unique] IEnumVARIANT *LPENUMVARIANT;

  [local]
  HRESULT Next(
    [in] ULONG celt,
    [out] 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);
}

[
  object,
  uuid(00020403-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface ITypeComp : IUnknown
{
  typedef [unique] ITypeComp *LPTYPECOMP;

  typedef [v1_enum] enum tagDESCKIND {
    DESCKIND_NONE = 0,
    DESCKIND_FUNCDESC,
    DESCKIND_VARDESC,
    DESCKIND_TYPECOMP,
    DESCKIND_IMPLICITAPPOBJ,
    DESCKIND_MAX
  } DESCKIND;

  typedef union tagBINDPTR {
    FUNCDESC *lpfuncdesc;
    VARDESC *lpvardesc;
    ITypeComp *lptcomp;
  } BINDPTR, *LPBINDPTR;

  [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);
}

[
  object,
  uuid(00020401-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface ITypeInfo : IUnknown
{
  typedef [unique] ITypeInfo *LPTYPEINFO;

  [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();

  [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();

  [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();

  [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();

  [local]
  void ReleaseFuncDesc(
    [in] FUNCDESC *pFuncDesc);

  [call_as(ReleaseFuncDesc)]
  HRESULT LocalReleaseFuncDesc();

  [local]
  void ReleaseVarDesc(
    [in] VARDESC *pVarDesc);

  [call_as(ReleaseVarDesc)]
  HRESULT LocalReleaseVarDesc();
}

[
  object,
  uuid(00020412-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface ITypeInfo2 : ITypeInfo
{
  typedef [unique] ITypeInfo2 *LPTYPEINFO2;

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

[
  object,
  uuid(00020402-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface ITypeLib : IUnknown
{
  typedef [unique] ITypeLib *LPTYPELIB;

  typedef [v1_enum] enum tagSYSKIND {
    SYS_WIN16 = 0,
    SYS_WIN32,
    SYS_MAC
  } SYSKIND;

  typedef [v1_enum] enum tagLIBFLAGS {
    LIBFLAG_FRESTRICTED   = 0x01,
    LIBFLAG_FCONTROL      = 0x02,
    LIBFLAG_FHIDDEN       = 0x04,
    LIBFLAG_FHASDISKIMAGE = 0x08
  } LIBFLAGS;

  typedef struct tagTLIBATTR {
    GUID guid;
    LCID lcid;
    SYSKIND syskind;
    WORD wMajorVerNum;
    WORD wMinorVerNum;
    WORD wLibFlags;
  } TLIBATTR, *LPTLIBATTR;

  [local]
  UINT GetTypeInfoCount();

  [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();
}

[
  object,
  uuid(00020411-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface ITypeLib2 : ITypeLib
{
  typedef [unique] ITypeLib2 *LPTYPELIB2;

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

[
  local,
  object,
  uuid(00020410-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface ITypeChangeEvents : IUnknown
{
  typedef [unique] ITypeChangeEvents *LPTYPECHANGEEVENTS;

  typedef enum tagCHANGEKIND {
    CHANGEKIND_ADDMEMBER,
    CHANGEKIND_DELETEMEMBER,
    CHANGEKIND_SETNAMES,
    CHANGEKIND_SETDOCUMENTATION,
    CHANGEKIND_GENERAL,
    CHANGEKIND_INVALIDATE,
    CHANGEKIND_CHANGEFAILED,
    CHANGEKIND_MAX
  } CHANGEKIND;

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

[
  object,
  uuid(1CF2B120-547D-101B-8E65-08002B2BD119),
  pointer_default(unique)
]
interface IErrorInfo : IUnknown
{
  typedef [unique] IErrorInfo *LPERRORINFO;

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

[
  object,
  uuid(22F03340-547D-101B-8E65-08002B2BD119),
  pointer_default(unique)
]
interface ICreateErrorInfo : IUnknown
{
  typedef [unique] ICreateErrorInfo *LPCREATEERRORINFO;

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

[
  object,
  uuid(DF0B3D60-548F-101B-8E65-08002B2BD119),
  pointer_default(unique)
]
interface ISupportErrorInfo : IUnknown
{
  typedef [unique] ISupportErrorInfo *LPSUPPORTERRORINFO;

  HRESULT InterfaceSupportsErrorInfo(
    [in] REFIID riid);
}

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

[
  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);
}

[
  local,
  object,
  uuid(0000002F-0000-0000-C000-000000000046)
]
interface IRecordInfo : IUnknown
{
  typedef [unique] IRecordInfo *LPRECORDINFO;

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

[
  local,
  object,
  uuid(00020405-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface ICreateTypeInfo : IUnknown
{
  typedef [unique] ICreateTypeInfo *LPCREATETYPEINFO;

  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(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();
}

[
  local,
  object,
  uuid(0002040E-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface ICreateTypeInfo2 : ICreateTypeInfo
{
  typedef [unique] ICreateTypeInfo2 *LPCREATETYPEINFO2;

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

  HRESULT SetName(
    [in] LPOLESTR szName);
}

[
  local,
  object,
  uuid(00020406-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface ICreateTypeLib : IUnknown
{
  typedef [unique] ICreateTypeLib *LPCREATETYPELIB;

  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();
}

[
  local,
  object,
  uuid(0002040F-0000-0000-C000-000000000046),
  pointer_default(unique)
]
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);
}


/*****************************************************************************
 * IErrorLog interface
 */
[
  object,
  uuid(3127ca40-446e-11ce-8135-00aa004bb851),
  pointer_default(unique)
]
interface IErrorLog : IUnknown
{
  typedef IErrorLog *LPERRORLOG;

  HRESULT AddError(
    [in] LPCOLESTR pszPropName,
    [in] EXCEPINFO *pExcepInfo);
}


/*****************************************************************************
 * IPropertyBag interface
 */
[
  object,
  uuid(55272a00-42cb-11ce-8135-00aa004bb851),
  pointer_default(unique)
]
interface IPropertyBag : IUnknown
{
  typedef IPropertyBag *LPPROPERTYBAG;

  [local]
  HRESULT Read(
    [in] LPCOLESTR pszPropName,
    [in, out] VARIANT *pVar,
    [in] IErrorLog *pErrorLog);

  [call_as(Read)]
  HRESULT RemoteRead(
    [in] LPCOLESTR pszPropName,
    [out] VARIANT *pVar,
    [in] IErrorLog *pErrorLog,
    [in] DWORD varType,
    [in] IUnknown *pUnkObj);

  HRESULT Write(
    [in] LPCOLESTR pszPropName,
    [in] VARIANT *pVar);
}
