/*
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

import "objidl.idl";

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

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