6 Appendix A: Full IDL

For ease of implementation, the full IDL is provided where "ms-dcom.idl" is the IDL specified in [MS-DCOM] Appendix A.

 import "ms-dtyp.idl";
 import "ms-dcom.idl";
  
 // Begin: Extra definitions
 // Use the next line in any IDL file that imports ms-oaut.idl 
 //  that makes use of SAFEARRAYs.
 // It is needed to bypass special assumptions MIDL compiler makes 
 //  about the SAFEARRAY type in windows environment. 
 // #define SAFEARRAY(type) SAFEARRAY 
  
  
 // basic type aliases
 typedef byte   BYTE;
 typedef LONG SCODE;
 typedef IID *REFIID;
 typedef GUID *REFGUID;
  
 typedef [string] wchar_t *LPOLESTR;
 typedef [string] const wchar_t *LPCOLESTR;
 typedef [public] unsigned __int3264 ULONG_PTR, *PULONG_PTR;
 typedef void *PVOID, *LPVOID;
  
 // forward declarations
 interface IDispatch;
 interface ITypeLib;
 interface ITypeInfo;
 typedef [unique] SAFEARRAY * PSAFEARRAY, *LPSAFEARRAY;
 typedef [unique] struct _wireVARIANT * VARIANT;
  
 // End: Extra definitions
  
 typedef enum tagVARENUM
 {
     VT_EMPTY           = 0x0000,
     VT_NULL            = 0x0001,
     VT_I2              = 0x0002,
     VT_I4              = 0x0003,
     VT_R4              = 0x0004,
     VT_R8              = 0x0005,
     VT_CY              = 0x0006,
     VT_DATE            = 0x0007,
     VT_BSTR            = 0x0008,
     VT_DISPATCH        = 0x0009,
     VT_ERROR           = 0x000A,
     VT_BOOL            = 0x000B,
     VT_VARIANT         = 0x000C,
     VT_UNKNOWN         = 0x000D,
     VT_DECIMAL         = 0x000E,
     VT_I1              = 0x0010,
     VT_UI1             = 0x0011,
     VT_UI2             = 0x0012,
     VT_UI4             = 0x0013,
     VT_I8              = 0x0014,
     VT_UI8             = 0x0015,
     VT_INT             = 0x0016,
     VT_UINT            = 0x0017,
     VT_VOID            = 0x0018,
     VT_HRESULT         = 0x0019,
     VT_PTR             = 0x001A,
     VT_SAFEARRAY       = 0x001B,
     VT_CARRAY          = 0x001C,
     VT_USERDEFINED     = 0x001D,
     VT_LPSTR           = 0x001E,
     VT_LPWSTR          = 0x001F,
     VT_RECORD          = 0x0024,
     VT_INT_PTR         = 0x0025,
     VT_UINT_PTR        = 0x0026,
     VT_ARRAY           = 0x2000,
     VT_BYREF           = 0x4000
 } VARENUM;
  
 typedef enum tagADVFEATUREFLAGS
 {
     FADF_AUTO       = 0x0001,
     FADF_STATIC     = 0x0002,
     FADF_EMBEDDED   = 0x0004,
     FADF_FIXEDSIZE  = 0x0010,
     FADF_RECORD     = 0x0020,
     FADF_HAVEIID    = 0x0040,
     FADF_HAVEVARTYPE = 0x0080,
     FADF_BSTR       = 0x0100,
     FADF_UNKNOWN    = 0x0200,
     FADF_DISPATCH   = 0x0400,
     FADF_VARIANT    = 0x0800
 } ADVFEATUREFLAGS;
  
 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|0x8000
 } SF_TYPE;
  
 typedef [v1_enum] enum tagCALLCONV {
     CC_CDECL    = 1,
     CC_PASCAL   = 2,
     CC_STDCALL  = 4
 } CALLCONV;
  
 typedef enum tagFUNCFLAGS {
     FUNCFLAG_FRESTRICTED        = 1,
     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;
  
 typedef [v1_enum] enum tagFUNCKIND {  
     FUNC_PUREVIRTUAL    = 1,
     FUNC_STATIC         = 3,
     FUNC_DISPATCH       = 4
 }   FUNCKIND;
  
 typedef enum tagIMPLTYPEFLAGS {
     IMPLTYPEFLAG_FDEFAULT       = 0x1,
     IMPLTYPEFLAG_FSOURCE        = 0x2,
     IMPLTYPEFLAG_FRESTRICTED    = 0x4,
     IMPLTYPEFLAG_FDEFAULTVTABLE = 0x8
 } IMPLTYPEFLAGS;
  
 typedef [v1_enum] enum tagINVOKEKIND {
     INVOKE_FUNC            = 0x1,
     INVOKE_PROPERTYGET     = 0x2,
     INVOKE_PROPERTYPUT     = 0x4,
     INVOKE_PROPERTYPUTREF  = 0x8
 } INVOKEKIND;
  
 typedef enum tagPARAMFLAGS {
     PARAMFLAG_NONE          = 0,
     PARAMFLAG_FIN           = 0x1,
     PARAMFLAG_FOUT          = 0x2,
     PARAMFLAG_FLCID         = 0x4,
     PARAMFLAG_FRETVAL       = 0x8,
     PARAMFLAG_FOPT          = 0x10,
     PARAMFLAG_FHASDEFAULT   = 0x20, 
     PARAMFLAG_FHASCUSTDATA  = 0x40 
 } PARAMFLAGS;
  
 typedef enum tagTYPEFLAGS {
     TYPEFLAG_FAPPOBJECT     = 0x1,
     TYPEFLAG_FCANCREATE     = 0x2,
     TYPEFLAG_FLICENSED      = 0x4,
     TYPEFLAG_FPREDECLID     = 0x8,
     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_FPROXY         = 0x4000
 } TYPEFLAGS;
  
 typedef [v1_enum] enum tagTYPEKIND {
   TKIND_ENUM = 0x0,
   TKIND_RECORD = 0x1,
   TKIND_MODULE = 0x2,
   TKIND_INTERFACE = 0x3,
   TKIND_DISPATCH = 0x4,
   TKIND_COCLASS = 0x5,
   TKIND_ALIAS = 0x6,
   TKIND_UNION = 0x7
 } TYPEKIND;
  
 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;
  
 typedef [v1_enum] enum tagVARKIND {
     VAR_PERINSTANCE     = 0,
     VAR_STATIC   = ( VAR_PERINSTANCE + 1 ),
     VAR_CONST    = ( VAR_STATIC + 1 ),
     VAR_DISPATCH = ( VAR_CONST + 1 )
 } VARKIND;
  
 typedef [v1_enum] enum tagLIBFLAGS {
     LIBFLAG_FRESTRICTED = 0x01,
     LIBFLAG_FCONTROL = 0x02,
     LIBFLAG_FHIDDEN = 0x04,
     LIBFLAG_FHASDISKIMAGE = 0x08
 } LIBFLAGS;
  
 typedef [v1_enum] enum tagSYSKIND {
     SYS_WIN32 = 1,
     SYS_WIN64 = 3
 } SYSKIND;
  
 typedef [v1_enum] enum tagDESCKIND {
     DESCKIND_NONE           = 0,
     DESCKIND_FUNCDESC       = 1,
     DESCKIND_VARDESC        = 2,
     DESCKIND_TYPECOMP       = 3,
     DESCKIND_IMPLICITAPPOBJ = 4
 } DESCKIND;
  
 typedef struct _FLAGGED_WORD_BLOB {
     unsigned long cBytes;
     unsigned long clSize;
     [size_is(clSize)] unsigned short asData[];
 } FLAGGED_WORD_BLOB;
  
 typedef [unique] FLAGGED_WORD_BLOB* BSTR;
  
 typedef struct tagCY {
     __int64 int64;
 } CURRENCY;
  
 typedef double DATE;
  
 typedef struct tagDEC {
     WORD wReserved;
     BYTE scale;
     BYTE sign;
     ULONG Hi32;
     ULONGLONG Lo64;
 } DECIMAL;
  
 typedef short VARIANT_BOOL;
  
 #define VARIANT_TRUE ((VARIANT_BOOL)0xffff)
 #define VARIANT_FALSE ((VARIANT_BOOL)0)
  
 typedef struct _wireBRECORD {
     ULONG fFlags;
     ULONG clSize;
     MInterfacePointer * pRecInfo;
     [size_is(clSize)] byte* pRecord;
 } wireBRECORDStr;
  
 typedef [unique] struct _wireBRECORD* BRECORD;
  
 typedef 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)]
           HRESULT scode;
         [case(VT_CY)]
           CURRENCY cyVal;
         [case(VT_DATE)]
           DATE date;
         [case(VT_BSTR)]
           BSTR bstrVal;
         [case(VT_UNKNOWN)]
           IUnknown* punkVal;
         [case(VT_DISPATCH)]
           IDispatch* pdispVal;
         [case(VT_ARRAY)]
           PSAFEARRAY parray;
         [case(VT_RECORD, VT_RECORD|VT_BYREF)]
           BRECORD 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)]
           HRESULT* pscode;
         [case(VT_CY|VT_BYREF)]
           CURRENCY* pcyVal;
         [case(VT_DATE|VT_BYREF)]
           DATE* pdate;
         [case(VT_BSTR|VT_BYREF)]
           BSTR* pbstrVal;
         [case(VT_UNKNOWN|VT_BYREF)]
           IUnknown** ppunkVal;
         [case(VT_DISPATCH|VT_BYREF)]
           IDispatch** ppdispVal;
         [case(VT_ARRAY|VT_BYREF)]
           PSAFEARRAY* pparray;
         [case(VT_VARIANT|VT_BYREF)]
           VARIANT* 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_I1|VT_BYREF)]
           CHAR* pcVal;
         [case(VT_UI2|VT_BYREF)]
           USHORT* puiVal;
         [case(VT_UI4|VT_BYREF)]
           ULONG* pulVal;
         [case(VT_UI8|VT_BYREF)]
           ULONGLONG* pullVal;
         [case(VT_INT|VT_BYREF)]
           INT* pintVal;
         [case(VT_UINT|VT_BYREF)]
           UINT* puintVal;
         [case(VT_DECIMAL|VT_BYREF)]
           DECIMAL* pdecVal;
         [case(VT_EMPTY)]
           ; /*nothing*/
         [case(VT_NULL)]
           ; /*nothing*/
     } _varUnion;
 } wireVARIANTStr;
  
 typedef struct tagSAFEARRAYBOUND {
     ULONG cElements;
     LONG lLbound;
 } SAFEARRAYBOUND, 
  *LPSAFEARRAYBOUND;
  
 typedef struct _wireSAFEARR_BSTR {
     ULONG Size;
     [size_is(Size), ref] BSTR* 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] VARIANT* aVariant;
 } SAFEARR_VARIANT;
  
 typedef struct _wireSAFEARR_BRECORD {
     ULONG Size;
     [size_is(Size), ref] BRECORD* aRecord;
 } SAFEARR_BRECORD;
  
 typedef struct _wireSAFEARR_HAVEIID {
     ULONG Size;
     [size_is(Size), ref] IUnknown** apUnknown;
     IID iid;
 } SAFEARR_HAVEIID;
  
 typedef struct _BYTE_SIZEDARR {
     unsigned long clSize;
     [size_is(clSize)] byte* pData;
 } BYTE_SIZEDARR;
  
 typedef struct _SHORT_SIZEDARR {
     unsigned long clSize;
     [size_is(clSize)] unsigned short* pData;
 } WORD_SIZEDARR;
  
 typedef struct _LONG_SIZEDARR {
     unsigned long clSize;
     [size_is(clSize)] unsigned long* pData;
 } DWORD_SIZEDARR;
  
 typedef struct _HYPER_SIZEDARR {
     unsigned long clSize;
     [size_is(clSize)] hyper* pData;
 } HYPER_SIZEDARR;
  
 typedef union _wireSAFEARRAY_UNION
     switch(unsigned long 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[];
 }  *SAFEARRAY;
  
 typedef struct tagRecordInfo {
     GUID libraryGuid;
     DWORD verMajor;
     GUID recGuid;
     DWORD verMinor;
     DWORD Lcid;
 } RecordInfo;
  
 typedef LONG DISPID;
  
 typedef struct tagDISPPARAMS {
     [size_is(cArgs)] VARIANT* rgvarg;
     [size_is(cNamedArgs)] DISPID* rgdispidNamedArgs;
     UINT cArgs;
     UINT cNamedArgs;
 } DISPPARAMS;
  
 typedef struct tagEXCEPINFO {
     WORD wCode;
     WORD wReserved;
     BSTR bstrSource;
     BSTR bstrDescription;
     BSTR bstrHelpFile;
     DWORD dwHelpContext;
     ULONG_PTR pvReserved;
     ULONG_PTR pfnDeferredFillIn;
     HRESULT scode;
 } EXCEPINFO;
  
 typedef DISPID MEMBERID;
  
 typedef DWORD HREFTYPE;
  
 typedef struct tagTYPEDESC {
     [switch_type(USHORT), switch_is(vt)] union {
         [case(VT_PTR, VT_SAFEARRAY)] struct tagTYPEDESC * lptdesc;
         [case(VT_CARRAY)] struct tagARRAYDESC * lpadesc;
         [case(VT_USERDEFINED)] HREFTYPE hreftype;
         [default]   ;
     } _tdUnion;
     USHORT vt;
 } TYPEDESC;
  
 typedef struct tagARRAYDESC {
     TYPEDESC tdescElem;
     USHORT cDims;
     [size_is(cDims)] SAFEARRAYBOUND rgbounds[];
 } ARRAYDESC;
  
 typedef struct tagPARAMDESCEX {
     ULONG cBytes;
     VARIANT varDefaultValue;
 } PARAMDESCEX;
  
 typedef struct tagPARAMDESC {
     PARAMDESCEX *pparamdescex;
     USHORT wParamFlags;
 } PARAMDESC;
  
 typedef struct tagELEMDESC {
     TYPEDESC tdesc;
     PARAMDESC paramdesc;     
 } ELEMDESC;
  
 typedef struct tagFUNCDESC {
     MEMBERID memid;
     [size_is(cReserved2)] SCODE * lReserved1;
     [size_is(cParams)] ELEMDESC * lprgelemdescParam;
     FUNCKIND funckind;
     INVOKEKIND invkind;
     CALLCONV callconv;
     SHORT cParams;
     SHORT cParamsOpt;
     SHORT oVft;
     SHORT cReserved2;
     ELEMDESC elemdescFunc;
     WORD wFuncFlags;
 } FUNCDESC, *LPFUNCDESC;
  
 typedef struct tagVARDESC {
     MEMBERID memid;
     LPOLESTR lpstrReserved;
     [switch_type(VARKIND), switch_is(varkind)] union {
         [case(VAR_PERINSTANCE, VAR_DISPATCH, VAR_STATIC)] ULONG oInst;
         [case(VAR_CONST)] VARIANT * lpvarValue;
     } _vdUnion;
     ELEMDESC elemdescVar;
     WORD     wVarFlags;
     VARKIND  varkind;
 } VARDESC, *LPVARDESC;
  
 typedef struct tagTYPEATTR {
     GUID guid;
     LCID lcid;
     DWORD dwReserved1;
     DWORD dwReserved2;
     DWORD dwReserved3;
     LPOLESTR lpstrReserved4;
     ULONG cbSizeInstance;
     TYPEKIND typekind;
     WORD cFuncs;
     WORD cVars;
     WORD cImplTypes;
     WORD cbSizeVft;
     WORD cbAlignment;
     WORD wTypeFlags;
     WORD wMajorVerNum;
     WORD wMinorVerNum;
     TYPEDESC tdescAlias;
     DWORD dwReserved5;
     WORD wReserved6;
 } TYPEATTR, *LPTYPEATTR;
  
 typedef struct tagTLIBATTR {
     GUID guid;
     LCID lcid;          
     SYSKIND syskind;
     unsigned short wMajorVerNum;
     unsigned short wMinorVerNum;
     unsigned short wLibFlags;   
 } TLIBATTR, *LPTLIBATTR;
  
 typedef struct tagCUSTDATAITEM {
     GUID guid;
     VARIANT varValue;
 } CUSTDATAITEM;
  
 typedef struct tagCUSTDATA {
     DWORD cCustData;
     [size_is(cCustData)] CUSTDATAITEM * prgCustData;
 } CUSTDATA;
  
 [
     object,
     uuid(00020400-0000-0000-C000-000000000046),
     pointer_default(unique)
 ]
 interface IDispatch : IUnknown
 {
     typedef [unique] IDispatch * LPDISPATCH;
  
     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
     );
  
     HRESULT Invoke(
         [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)] VARIANT * rgVarRef
     );
  
     const DWORD DISPATCH_METHOD         = 0x00000001;
     const DWORD DISPATCH_PROPERTYGET    = 0x00000002;
     const DWORD DISPATCH_PROPERTYPUT    = 0x00000004;
     const DWORD DISPATCH_PROPERTYPUTREF = 0x00000008;
     const DWORD DISPATCH_zeroVarResult = 0x00020000;
     const DWORD DISPATCH_zeroExcepInfo = 0x00040000;
     const DWORD DISPATCH_zeroArgErr    = 0x00080000;
  
     const DISPID DISPID_VALUE = 0;
     const DISPID DISPID_UNKNOWN = -1;
     const DISPID DISPID_PROPERTYPUT = -3;
     const DISPID DISPID_NEWENUM = -4;
 }
  
  
 [
     object,
     uuid(00020404-0000-0000-C000-000000000046),
     pointer_default(unique)
 ]
 interface IEnumVARIANT : IUnknown
 {
     HRESULT Next(
         [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
 {
     HRESULT Bind(
         [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] DWORD * pReserved
     );
  
     HRESULT BindType(
         [in] LPOLESTR szName,
         [in] ULONG lHashVal,
         [out] ITypeInfo ** ppTInfo
     );
 }
  
 [
     object,
     uuid(00020401-0000-0000-C000-000000000046),
     pointer_default(unique)
 ]
 interface ITypeInfo : IUnknown
 {
     HRESULT GetTypeAttr(
         [out] LPTYPEATTR * ppTypeAttr,
         [out] DWORD * pReserved
     );
  
     HRESULT GetTypeComp(
         [out] ITypeComp ** ppTComp
     );
  
     HRESULT GetFuncDesc(
         [in]  UINT index,
         [out] LPFUNCDESC * ppFuncDesc,
         [out] DWORD * pReserved
     );
  
     HRESULT GetVarDesc(
         [in]  UINT index,
         [out] LPVARDESC * ppVarDesc,
         [out] DWORD * pReserved
     );
  
     HRESULT GetNames(
         [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
     );
  
     HRESULT Opnum10NotUsedOnWire(
         void
     );
  
     HRESULT Opnum11NotUsedOnWire(
         void
     );
  
     HRESULT GetDocumentation(
         [in]  MEMBERID memid,
         [in]  DWORD refPtrFlags,
         [out] BSTR * pBstrName,
         [out] BSTR * pBstrDocString,
         [out] DWORD * pdwHelpContext,
         [out] BSTR * pBstrHelpFile
     );
  
     HRESULT GetDllEntry(
         [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
     );
  
     HRESULT Opnum15NotUsedOnWire(
         void
     );
  
     HRESULT CreateInstance(
         [in]  REFIID riid,
         [out, iid_is(riid)] IUnknown ** ppvObj
     );
  
     HRESULT GetMops(
         [in]  MEMBERID memid,
         [out] BSTR * pBstrMops
     );
  
     HRESULT GetContainingTypeLib(
         [out] ITypeLib ** ppTLib,
         [out] UINT * pIndex
     );
  
     HRESULT Opnum19NotUsedOnWire(
         void
     );
  
     HRESULT Opnum20NotUsedOnWire(
         void
     );
  
     HRESULT Opnum21NotUsedOnWire(
         void
     );
 }
  
 [
     object,
     uuid(00020412-0000-0000-C000-000000000046),
     pointer_default(unique)
 ]
 interface ITypeInfo2 : ITypeInfo
 {
     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
     );
  
     HRESULT GetDocumentation2(
         [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
 {
     HRESULT GetTypeInfoCount(
         [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
     );
  
     HRESULT GetLibAttr(
         [out] LPTLIBATTR * ppTLibAttr,
         [out] DWORD * pReserved
     );
  
     HRESULT GetTypeComp(
         [out] ITypeComp ** ppTComp
     );
  
     HRESULT GetDocumentation(
         [in]  INT index,
         [in]  DWORD refPtrFlags,
         [out] BSTR * pBstrName,
         [out] BSTR * pBstrDocString,
         [out] DWORD * pdwHelpContext,
         [out] BSTR * pBstrHelpFile
     );
  
     HRESULT IsName(
         [in] LPOLESTR szNameBuf,
         [in] ULONG lHashVal,
         [out] BOOL * pfName,
         [out] BSTR * pBstrNameInLibrary
     );
  
     HRESULT FindName(
         [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 * pBstrNameInLibrary
     );
  
     HRESULT Opnum12NotUsedOnWire(
         void
     );
 }
  
 [
     object,
     uuid(00020411-0000-0000-C000-000000000046),
     pointer_default(unique)
 ]
 interface ITypeLib2 : ITypeLib
 {
     HRESULT GetCustData(
         [in] REFGUID guid,
         [out] VARIANT * pVarVal
     );
  
     HRESULT GetLibStatistics(
         [out] ULONG * pcUniqueNames,
         [out] ULONG * pcchUniqueNames
     );
  
     HRESULT GetDocumentation2(
         [in]  INT index,
         [in]  LCID lcid,
         [in]  DWORD refPtrFlags,
         [out] BSTR *pbstrHelpString,
         [out] DWORD *pdwHelpStringContext,
         [out] BSTR *pbstrHelpStringDll
     );
  
     HRESULT GetAllCustData(
         [out] CUSTDATA * pCustData
     );
 }