/*** Autogenerated by WIDL 8.13 from include/oaidl.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __oaidl_h__
#define __oaidl_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __ICreateTypeInfo_FWD_DEFINED__
#define __ICreateTypeInfo_FWD_DEFINED__
typedef interface ICreateTypeInfo ICreateTypeInfo;
#ifdef __cplusplus
interface ICreateTypeInfo;
#endif /* __cplusplus */
#endif

#ifndef __ICreateTypeInfo2_FWD_DEFINED__
#define __ICreateTypeInfo2_FWD_DEFINED__
typedef interface ICreateTypeInfo2 ICreateTypeInfo2;
#ifdef __cplusplus
interface ICreateTypeInfo2;
#endif /* __cplusplus */
#endif

#ifndef __ICreateTypeLib_FWD_DEFINED__
#define __ICreateTypeLib_FWD_DEFINED__
typedef interface ICreateTypeLib ICreateTypeLib;
#ifdef __cplusplus
interface ICreateTypeLib;
#endif /* __cplusplus */
#endif

#ifndef __ICreateTypeLib2_FWD_DEFINED__
#define __ICreateTypeLib2_FWD_DEFINED__
typedef interface ICreateTypeLib2 ICreateTypeLib2;
#ifdef __cplusplus
interface ICreateTypeLib2;
#endif /* __cplusplus */
#endif

#ifndef __IDispatch_FWD_DEFINED__
#define __IDispatch_FWD_DEFINED__
typedef interface IDispatch IDispatch;
#ifdef __cplusplus
interface IDispatch;
#endif /* __cplusplus */
#endif

#ifndef __IEnumVARIANT_FWD_DEFINED__
#define __IEnumVARIANT_FWD_DEFINED__
typedef interface IEnumVARIANT IEnumVARIANT;
#ifdef __cplusplus
interface IEnumVARIANT;
#endif /* __cplusplus */
#endif

#ifndef __ITypeComp_FWD_DEFINED__
#define __ITypeComp_FWD_DEFINED__
typedef interface ITypeComp ITypeComp;
#ifdef __cplusplus
interface ITypeComp;
#endif /* __cplusplus */
#endif

#ifndef __ITypeInfo_FWD_DEFINED__
#define __ITypeInfo_FWD_DEFINED__
typedef interface ITypeInfo ITypeInfo;
#ifdef __cplusplus
interface ITypeInfo;
#endif /* __cplusplus */
#endif

#ifndef __ITypeInfo2_FWD_DEFINED__
#define __ITypeInfo2_FWD_DEFINED__
typedef interface ITypeInfo2 ITypeInfo2;
#ifdef __cplusplus
interface ITypeInfo2;
#endif /* __cplusplus */
#endif

#ifndef __ITypeLib_FWD_DEFINED__
#define __ITypeLib_FWD_DEFINED__
typedef interface ITypeLib ITypeLib;
#ifdef __cplusplus
interface ITypeLib;
#endif /* __cplusplus */
#endif

#ifndef __ITypeLib2_FWD_DEFINED__
#define __ITypeLib2_FWD_DEFINED__
typedef interface ITypeLib2 ITypeLib2;
#ifdef __cplusplus
interface ITypeLib2;
#endif /* __cplusplus */
#endif

#ifndef __ITypeChangeEvents_FWD_DEFINED__
#define __ITypeChangeEvents_FWD_DEFINED__
typedef interface ITypeChangeEvents ITypeChangeEvents;
#ifdef __cplusplus
interface ITypeChangeEvents;
#endif /* __cplusplus */
#endif

#ifndef __IErrorInfo_FWD_DEFINED__
#define __IErrorInfo_FWD_DEFINED__
typedef interface IErrorInfo IErrorInfo;
#ifdef __cplusplus
interface IErrorInfo;
#endif /* __cplusplus */
#endif

#ifndef __ICreateErrorInfo_FWD_DEFINED__
#define __ICreateErrorInfo_FWD_DEFINED__
typedef interface ICreateErrorInfo ICreateErrorInfo;
#ifdef __cplusplus
interface ICreateErrorInfo;
#endif /* __cplusplus */
#endif

#ifndef __ISupportErrorInfo_FWD_DEFINED__
#define __ISupportErrorInfo_FWD_DEFINED__
typedef interface ISupportErrorInfo ISupportErrorInfo;
#ifdef __cplusplus
interface ISupportErrorInfo;
#endif /* __cplusplus */
#endif

#ifndef __ITypeFactory_FWD_DEFINED__
#define __ITypeFactory_FWD_DEFINED__
typedef interface ITypeFactory ITypeFactory;
#ifdef __cplusplus
interface ITypeFactory;
#endif /* __cplusplus */
#endif

#ifndef __ITypeMarshal_FWD_DEFINED__
#define __ITypeMarshal_FWD_DEFINED__
typedef interface ITypeMarshal ITypeMarshal;
#ifdef __cplusplus
interface ITypeMarshal;
#endif /* __cplusplus */
#endif

#ifndef __IRecordInfo_FWD_DEFINED__
#define __IRecordInfo_FWD_DEFINED__
typedef interface IRecordInfo IRecordInfo;
#ifdef __cplusplus
interface IRecordInfo;
#endif /* __cplusplus */
#endif

#ifndef __IErrorLog_FWD_DEFINED__
#define __IErrorLog_FWD_DEFINED__
typedef interface IErrorLog IErrorLog;
#ifdef __cplusplus
interface IErrorLog;
#endif /* __cplusplus */
#endif

#ifndef __IPropertyBag_FWD_DEFINED__
#define __IPropertyBag_FWD_DEFINED__
typedef interface IPropertyBag IPropertyBag;
#ifdef __cplusplus
interface IPropertyBag;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <objidl.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#ifndef __ICreateTypeInfo_FWD_DEFINED__
#define __ICreateTypeInfo_FWD_DEFINED__
typedef interface ICreateTypeInfo ICreateTypeInfo;
#ifdef __cplusplus
interface ICreateTypeInfo;
#endif /* __cplusplus */
#endif

#ifndef __ICreateTypeInfo2_FWD_DEFINED__
#define __ICreateTypeInfo2_FWD_DEFINED__
typedef interface ICreateTypeInfo2 ICreateTypeInfo2;
#ifdef __cplusplus
interface ICreateTypeInfo2;
#endif /* __cplusplus */
#endif

#ifndef __ICreateTypeLib_FWD_DEFINED__
#define __ICreateTypeLib_FWD_DEFINED__
typedef interface ICreateTypeLib ICreateTypeLib;
#ifdef __cplusplus
interface ICreateTypeLib;
#endif /* __cplusplus */
#endif

#ifndef __ICreateTypeLib2_FWD_DEFINED__
#define __ICreateTypeLib2_FWD_DEFINED__
typedef interface ICreateTypeLib2 ICreateTypeLib2;
#ifdef __cplusplus
interface ICreateTypeLib2;
#endif /* __cplusplus */
#endif

#endif

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#ifndef __IDispatch_FWD_DEFINED__
#define __IDispatch_FWD_DEFINED__
typedef interface IDispatch IDispatch;
#ifdef __cplusplus
interface IDispatch;
#endif /* __cplusplus */
#endif

#ifndef __IEnumVARIANT_FWD_DEFINED__
#define __IEnumVARIANT_FWD_DEFINED__
typedef interface IEnumVARIANT IEnumVARIANT;
#ifdef __cplusplus
interface IEnumVARIANT;
#endif /* __cplusplus */
#endif

#ifndef __ITypeComp_FWD_DEFINED__
#define __ITypeComp_FWD_DEFINED__
typedef interface ITypeComp ITypeComp;
#ifdef __cplusplus
interface ITypeComp;
#endif /* __cplusplus */
#endif

#endif

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#ifndef __ITypeInfo_FWD_DEFINED__
#define __ITypeInfo_FWD_DEFINED__
typedef interface ITypeInfo ITypeInfo;
#ifdef __cplusplus
interface ITypeInfo;
#endif /* __cplusplus */
#endif

#ifndef __ITypeInfo2_FWD_DEFINED__
#define __ITypeInfo2_FWD_DEFINED__
typedef interface ITypeInfo2 ITypeInfo2;
#ifdef __cplusplus
interface ITypeInfo2;
#endif /* __cplusplus */
#endif

#ifndef __ITypeLib_FWD_DEFINED__
#define __ITypeLib_FWD_DEFINED__
typedef interface ITypeLib ITypeLib;
#ifdef __cplusplus
interface ITypeLib;
#endif /* __cplusplus */
#endif

#ifndef __ITypeLib2_FWD_DEFINED__
#define __ITypeLib2_FWD_DEFINED__
typedef interface ITypeLib2 ITypeLib2;
#ifdef __cplusplus
interface ITypeLib2;
#endif /* __cplusplus */
#endif

#ifndef __ITypeChangeEvents_FWD_DEFINED__
#define __ITypeChangeEvents_FWD_DEFINED__
typedef interface ITypeChangeEvents ITypeChangeEvents;
#ifdef __cplusplus
interface ITypeChangeEvents;
#endif /* __cplusplus */
#endif

#ifndef __IErrorInfo_FWD_DEFINED__
#define __IErrorInfo_FWD_DEFINED__
typedef interface IErrorInfo IErrorInfo;
#ifdef __cplusplus
interface IErrorInfo;
#endif /* __cplusplus */
#endif

#ifndef __ICreateErrorInfo_FWD_DEFINED__
#define __ICreateErrorInfo_FWD_DEFINED__
typedef interface ICreateErrorInfo ICreateErrorInfo;
#ifdef __cplusplus
interface ICreateErrorInfo;
#endif /* __cplusplus */
#endif

#ifndef __ISupportErrorInfo_FWD_DEFINED__
#define __ISupportErrorInfo_FWD_DEFINED__
typedef interface ISupportErrorInfo ISupportErrorInfo;
#ifdef __cplusplus
interface ISupportErrorInfo;
#endif /* __cplusplus */
#endif

#ifndef __ITypeFactory_FWD_DEFINED__
#define __ITypeFactory_FWD_DEFINED__
typedef interface ITypeFactory ITypeFactory;
#ifdef __cplusplus
interface ITypeFactory;
#endif /* __cplusplus */
#endif

#ifndef __ITypeMarshal_FWD_DEFINED__
#define __ITypeMarshal_FWD_DEFINED__
typedef interface ITypeMarshal ITypeMarshal;
#ifdef __cplusplus
interface ITypeMarshal;
#endif /* __cplusplus */
#endif

#ifndef __IRecordInfo_FWD_DEFINED__
#define __IRecordInfo_FWD_DEFINED__
typedef interface IRecordInfo IRecordInfo;
#ifdef __cplusplus
interface IRecordInfo;
#endif /* __cplusplus */
#endif

#endif

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
/*****************************************************************************
 * IOleAutomationTypes interface (v1.0)
 */
#ifndef __IOleAutomationTypes_INTERFACE_DEFINED__
#define __IOleAutomationTypes_INTERFACE_DEFINED__

extern RPC_IF_HANDLE IOleAutomationTypes_v1_0_c_ifspec;
extern RPC_IF_HANDLE IOleAutomationTypes_v1_0_s_ifspec;
typedef CY CURRENCY;
typedef struct tagSAFEARRAYBOUND {
    ULONG cElements;
    LONG lLbound;
} SAFEARRAYBOUND;
typedef struct tagSAFEARRAYBOUND *LPSAFEARRAYBOUND;

typedef struct _wireVARIANT *wireVARIANT;
typedef struct _wireBRECORD *wireBRECORD;

typedef struct _wireSAFEARR_BSTR {
    ULONG Size;
    wireBSTR *aBstr;
} SAFEARR_BSTR;

typedef struct _wireSAFEARR_UNKNOWN {
    ULONG Size;
    IUnknown **apUnknown;
} SAFEARR_UNKNOWN;

typedef struct _wireSAFEARR_DISPATCH {
    ULONG Size;
    IDispatch **apDispatch;
} SAFEARR_DISPATCH;

typedef struct _wireSAFEARR_VARIANT {
    ULONG Size;
    wireVARIANT *aVariant;
} SAFEARR_VARIANT;

typedef struct _wireSAFEARR_BRECORD {
    ULONG Size;
    wireBRECORD *aRecord;
} SAFEARR_BRECORD;

typedef struct _wireSAFEARR_HAVEIID {
    ULONG Size;
    IUnknown **apUnknown;
    IID iid;
} SAFEARR_HAVEIID;

typedef 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 struct _wireSAFEARRAY_UNION {
    ULONG sfType;
    union __WIDL_oaidl_generated_name_0000000E {
        SAFEARR_BSTR BstrStr;
        SAFEARR_UNKNOWN UnknownStr;
        SAFEARR_DISPATCH DispatchStr;
        SAFEARR_VARIANT VariantStr;
        SAFEARR_BRECORD RecordStr;
        SAFEARR_HAVEIID HaveIidStr;
        BYTE_SIZEDARR ByteStr;
        WORD_SIZEDARR WordStr;
        DWORD_SIZEDARR LongStr;
        HYPER_SIZEDARR HyperStr;
    } u;
} SAFEARRAYUNION;

typedef struct _wireSAFEARRAY {
    USHORT cDims;
    USHORT fFeatures;
    ULONG cbElements;
    ULONG cLocks;
    SAFEARRAYUNION uArrayStructs;
    SAFEARRAYBOUND rgsabound[1];
} *wireSAFEARRAY;
typedef wireSAFEARRAY *wirePSAFEARRAY;

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

#define FADF_AUTO (0x1)

#define FADF_STATIC (0x2)

#define FADF_EMBEDDED (0x4)

#define FADF_FIXEDSIZE (0x10)

#define FADF_RECORD (0x20)

#define FADF_HAVEIID (0x40)

#define FADF_HAVEVARTYPE (0x80)

#define FADF_BSTR (0x100)

#define FADF_UNKNOWN (0x200)

#define FADF_DISPATCH (0x400)

#define FADF_VARIANT (0x800)

#define FADF_RESERVED (0xf008)


/* Kludge for 3.0 release to disable new default-behavior.
 * For now we define _FORCENAMELESSUNION.  For 4.0 this define
 * will be removed. */
#ifndef _FORCENAMELESSUNION
#define _FORCENAMELESSUNION 1
#endif

#if (__STDC__ && !defined(__cplusplus) && !defined(_FORCENAMELESSUNION)) || defined(NONAMELESSUNION) || (defined (_MSC_VER) && !defined(_MSC_EXTENSIONS) && !defined(_FORCENAMELESSUNION))
#define __VARIANT_NAME_1 n1
#define __VARIANT_NAME_2 n2
#define __VARIANT_NAME_3 n3
#define __VARIANT_NAME_4 brecVal
#else
#define __tagVARIANT
#define __VARIANT_NAME_1
#define __VARIANT_NAME_2
#define __VARIANT_NAME_3
#define __tagBRECORD
#define __VARIANT_NAME_4
#endif

typedef struct tagVARIANT VARIANT;

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

typedef VARIANT *LPVARIANT;
typedef VARIANT VARIANTARG;
typedef VARIANT *LPVARIANTARG;
#if 0
typedef const VARIANT *REFVARIANT;
#else

#ifndef _REFVARIANT_DEFINED
#define _REFVARIANT_DEFINED
#ifdef __cplusplus
#define REFVARIANT const VARIANT &
#else
#define REFVARIANT const VARIANT * __MIDL_CONST
#endif
#endif
#endif

struct _wireBRECORD {
    ULONG fFlags;
    ULONG clSize;
    IRecordInfo *pRecInfo;
    byte *pRecord;
};

struct _wireVARIANT {
    DWORD clSize;
    DWORD rpcReserved;
    USHORT vt;
    USHORT wReserved1;
    USHORT wReserved2;
    USHORT wReserved3;
    __C89_NAMELESS union {
        LONGLONG llVal;
        LONG lVal;
        BYTE bVal;
        SHORT iVal;
        FLOAT fltVal;
        DOUBLE dblVal;
        VARIANT_BOOL boolVal;
        SCODE scode;
        CY cyVal;
        DATE date;
        wireBSTR bstrVal;
        IUnknown *punkVal;
        IDispatch *pdispVal;
        wirePSAFEARRAY parray;
        wireBRECORD brecVal;
        BYTE *pbVal;
        SHORT *piVal;
        LONG *plVal;
        LONGLONG *pllVal;
        FLOAT *pfltVal;
        DOUBLE *pdblVal;
        VARIANT_BOOL *pboolVal;
        SCODE *pscode;
        CY *pcyVal;
        DATE *pdate;
        wireBSTR *pbstrVal;
        IUnknown **ppunkVal;
        IDispatch **ppdispVal;
        wirePSAFEARRAY *pparray;
        wireVARIANT *pvarVal;
        CHAR cVal;
        USHORT uiVal;
        ULONG ulVal;
        ULONGLONG ullVal;
        INT intVal;
        UINT uintVal;
        DECIMAL decVal;
        DECIMAL *pdecVal;
        CHAR *pcVal;
        USHORT *puiVal;
        ULONG *pulVal;
        ULONGLONG *pullVal;
        INT *pintVal;
        UINT *puintVal;
    } __C89_NAMELESSUNIONNAME;
};

typedef LONG DISPID;
typedef DISPID MEMBERID;
typedef DWORD HREFTYPE;
typedef enum tagTYPEKIND {
    TKIND_ENUM = 0,
    TKIND_RECORD = 1,
    TKIND_MODULE = 2,
    TKIND_INTERFACE = 3,
    TKIND_DISPATCH = 4,
    TKIND_COCLASS = 5,
    TKIND_ALIAS = 6,
    TKIND_UNION = 7,
    TKIND_MAX = 8
} TYPEKIND;

typedef struct tagTYPEDESC {
    __C89_NAMELESS union {
        struct tagTYPEDESC *lptdesc;
        struct tagARRAYDESC *lpadesc;
        HREFTYPE hreftype;
    } __C89_NAMELESSUNIONNAME;
    VARTYPE vt;
} TYPEDESC;

typedef struct tagARRAYDESC {
    TYPEDESC tdescElem;
    USHORT cDims;
    SAFEARRAYBOUND rgbounds[1];
} ARRAYDESC;

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

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

#define PARAMFLAG_NONE (0x0)

#define PARAMFLAG_FIN (0x1)

#define PARAMFLAG_FOUT (0x2)

#define PARAMFLAG_FLCID (0x4)

#define PARAMFLAG_FRETVAL (0x8)

#define PARAMFLAG_FOPT (0x10)

#define PARAMFLAG_FHASDEFAULT (0x20)

#define PARAMFLAG_FHASCUSTDATA (0x40)


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

#define IDLFLAG_NONE (PARAMFLAG_NONE)

#define IDLFLAG_FIN (PARAMFLAG_FIN)

#define IDLFLAG_FOUT (PARAMFLAG_FOUT)

#define IDLFLAG_FLCID (PARAMFLAG_FLCID)

#define IDLFLAG_FRETVAL (PARAMFLAG_FRETVAL)


#if 0
typedef struct tagELEMDESC {
    TYPEDESC tdesc;
    PARAMDESC paramdesc;
} ELEMDESC;
#else

  typedef struct tagELEMDESC {
    TYPEDESC tdesc;
    __C89_NAMELESS union {
      IDLDESC idldesc;
      PARAMDESC paramdesc;
    } DUMMYUNIONNAME;
  } ELEMDESC,*LPELEMDESC;
#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;
typedef struct tagTYPEATTR *LPTYPEATTR;

typedef struct tagDISPPARAMS {
    VARIANTARG *rgvarg;
    DISPID *rgdispidNamedArgs;
    UINT cArgs;
    UINT cNamedArgs;
} DISPPARAMS;

#if 0
typedef struct tagEXCEPINFO {
    WORD wCode;
    WORD wReserved;
    BSTR bstrSource;
    BSTR bstrDescription;
    BSTR bstrHelpFile;
    DWORD dwHelpContext;
    ULONG_PTR pvReserved;
    ULONG_PTR pfnDeferredFillIn;
    SCODE scode;
} EXCEPINFO;
#else
  typedef struct tagEXCEPINFO {
    WORD wCode;
    WORD wReserved;
    BSTR bstrSource;
    BSTR bstrDescription;
    BSTR bstrHelpFile;
    DWORD dwHelpContext;
    PVOID pvReserved;
    HRESULT (__stdcall *pfnDeferredFillIn)(struct tagEXCEPINFO *);
    SCODE scode;
  } EXCEPINFO, *LPEXCEPINFO;
#endif

typedef enum tagCALLCONV {
    CC_FASTCALL = 0,
    CC_CDECL = 1,
    CC_MSCPASCAL = 2,
    CC_PASCAL = CC_MSCPASCAL,
    CC_MACPASCAL = 3,
    CC_STDCALL = 4,
    CC_FPFASTCALL = 5,
    CC_SYSCALL = 6,
    CC_MPWCDECL = 7,
    CC_MPWPASCAL = 8,
    CC_MAX = 9
} CALLCONV;

typedef enum tagFUNCKIND {
    FUNC_VIRTUAL = 0,
    FUNC_PUREVIRTUAL = 1,
    FUNC_NONVIRTUAL = 2,
    FUNC_STATIC = 3,
    FUNC_DISPATCH = 4
} FUNCKIND;

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

typedef struct tagFUNCDESC {
    MEMBERID memid;
    SCODE *lprgscode;
    ELEMDESC *lprgelemdescParam;
    FUNCKIND funckind;
    INVOKEKIND invkind;
    CALLCONV callconv;
    SHORT cParams;
    SHORT cParamsOpt;
    SHORT oVft;
    SHORT cScodes;
    ELEMDESC elemdescFunc;
    WORD wFuncFlags;
} FUNCDESC;
typedef struct tagFUNCDESC *LPFUNCDESC;

typedef enum tagVARKIND {
    VAR_PERINSTANCE = 0,
    VAR_STATIC = 1,
    VAR_CONST = 2,
    VAR_DISPATCH = 3
} VARKIND;

#define IMPLTYPEFLAG_FDEFAULT (0x1)

#define IMPLTYPEFLAG_FSOURCE (0x2)

#define IMPLTYPEFLAG_FRESTRICTED (0x4)

#define IMPLTYPEFLAG_FDEFAULTVTABLE (0x8)


typedef struct tagVARDESC {
    MEMBERID memid;
    LPOLESTR lpstrSchema;
    __C89_NAMELESS union {
        ULONG oInst;
        VARIANT *lpvarValue;
    } __C89_NAMELESSUNIONNAME;
    ELEMDESC elemdescVar;
    WORD wVarFlags;
    VARKIND varkind;
} VARDESC;
typedef struct tagVARDESC *LPVARDESC;

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_FREVERSEBIND = 0x2000,
    TYPEFLAG_FPROXY = 0x4000
} TYPEFLAGS;

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

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 struct tagCLEANLOCALSTORAGE {
    IUnknown *pInterface;
    PVOID pStorage;
    DWORD flags;
} CLEANLOCALSTORAGE;

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

typedef struct tagCUSTDATA {
    DWORD cCustData;
    LPCUSTDATAITEM prgCustData;
} CUSTDATA;
typedef struct tagCUSTDATA *LPCUSTDATA;

#endif  /* __IOleAutomationTypes_INTERFACE_DEFINED__ */

#endif

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
/*****************************************************************************
 * ICreateTypeInfo interface
 */
#ifndef __ICreateTypeInfo_INTERFACE_DEFINED__
#define __ICreateTypeInfo_INTERFACE_DEFINED__

typedef ICreateTypeInfo *LPCREATETYPEINFO;

DEFINE_GUID(IID_ICreateTypeInfo, 0x00020405, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00020405-0000-0000-c000-000000000046")
ICreateTypeInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetGuid(
        REFGUID guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTypeFlags(
        UINT uTypeFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDocString(
        LPOLESTR pStrDoc) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHelpContext(
        DWORD dwHelpContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVersion(
        WORD wMajorVerNum,
        WORD wMinorVerNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddRefTypeInfo(
        ITypeInfo *pTInfo,
        HREFTYPE *phRefType) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddFuncDesc(
        UINT index,
        FUNCDESC *pFuncDesc) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddImplType(
        UINT index,
        HREFTYPE hRefType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetImplTypeFlags(
        UINT index,
        INT implTypeFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAlignment(
        WORD cbAlignment) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSchema(
        LPOLESTR pStrSchema) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddVarDesc(
        UINT index,
        VARDESC *pVarDesc) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFuncAndParamNames(
        UINT index,
        LPOLESTR *rgszNames,
        UINT cNames) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVarName(
        UINT index,
        LPOLESTR szName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTypeDescAlias(
        TYPEDESC *pTDescAlias) = 0;

    virtual HRESULT STDMETHODCALLTYPE DefineFuncAsDllEntry(
        UINT index,
        LPOLESTR szDllName,
        LPOLESTR szProcName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFuncDocString(
        UINT index,
        LPOLESTR szDocString) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVarDocString(
        UINT index,
        LPOLESTR szDocString) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFuncHelpContext(
        UINT index,
        DWORD dwHelpContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVarHelpContext(
        UINT index,
        DWORD dwHelpContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMops(
        UINT index,
        BSTR bstrMops) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTypeIdldesc(
        IDLDESC *pIdlDesc) = 0;

    virtual HRESULT STDMETHODCALLTYPE LayOut(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICreateTypeInfo, 0x00020405, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ICreateTypeInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICreateTypeInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICreateTypeInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICreateTypeInfo *This);

    /*** ICreateTypeInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *SetGuid)(
        ICreateTypeInfo *This,
        REFGUID guid);

    HRESULT (STDMETHODCALLTYPE *SetTypeFlags)(
        ICreateTypeInfo *This,
        UINT uTypeFlags);

    HRESULT (STDMETHODCALLTYPE *SetDocString)(
        ICreateTypeInfo *This,
        LPOLESTR pStrDoc);

    HRESULT (STDMETHODCALLTYPE *SetHelpContext)(
        ICreateTypeInfo *This,
        DWORD dwHelpContext);

    HRESULT (STDMETHODCALLTYPE *SetVersion)(
        ICreateTypeInfo *This,
        WORD wMajorVerNum,
        WORD wMinorVerNum);

    HRESULT (STDMETHODCALLTYPE *AddRefTypeInfo)(
        ICreateTypeInfo *This,
        ITypeInfo *pTInfo,
        HREFTYPE *phRefType);

    HRESULT (STDMETHODCALLTYPE *AddFuncDesc)(
        ICreateTypeInfo *This,
        UINT index,
        FUNCDESC *pFuncDesc);

    HRESULT (STDMETHODCALLTYPE *AddImplType)(
        ICreateTypeInfo *This,
        UINT index,
        HREFTYPE hRefType);

    HRESULT (STDMETHODCALLTYPE *SetImplTypeFlags)(
        ICreateTypeInfo *This,
        UINT index,
        INT implTypeFlags);

    HRESULT (STDMETHODCALLTYPE *SetAlignment)(
        ICreateTypeInfo *This,
        WORD cbAlignment);

    HRESULT (STDMETHODCALLTYPE *SetSchema)(
        ICreateTypeInfo *This,
        LPOLESTR pStrSchema);

    HRESULT (STDMETHODCALLTYPE *AddVarDesc)(
        ICreateTypeInfo *This,
        UINT index,
        VARDESC *pVarDesc);

    HRESULT (STDMETHODCALLTYPE *SetFuncAndParamNames)(
        ICreateTypeInfo *This,
        UINT index,
        LPOLESTR *rgszNames,
        UINT cNames);

    HRESULT (STDMETHODCALLTYPE *SetVarName)(
        ICreateTypeInfo *This,
        UINT index,
        LPOLESTR szName);

    HRESULT (STDMETHODCALLTYPE *SetTypeDescAlias)(
        ICreateTypeInfo *This,
        TYPEDESC *pTDescAlias);

    HRESULT (STDMETHODCALLTYPE *DefineFuncAsDllEntry)(
        ICreateTypeInfo *This,
        UINT index,
        LPOLESTR szDllName,
        LPOLESTR szProcName);

    HRESULT (STDMETHODCALLTYPE *SetFuncDocString)(
        ICreateTypeInfo *This,
        UINT index,
        LPOLESTR szDocString);

    HRESULT (STDMETHODCALLTYPE *SetVarDocString)(
        ICreateTypeInfo *This,
        UINT index,
        LPOLESTR szDocString);

    HRESULT (STDMETHODCALLTYPE *SetFuncHelpContext)(
        ICreateTypeInfo *This,
        UINT index,
        DWORD dwHelpContext);

    HRESULT (STDMETHODCALLTYPE *SetVarHelpContext)(
        ICreateTypeInfo *This,
        UINT index,
        DWORD dwHelpContext);

    HRESULT (STDMETHODCALLTYPE *SetMops)(
        ICreateTypeInfo *This,
        UINT index,
        BSTR bstrMops);

    HRESULT (STDMETHODCALLTYPE *SetTypeIdldesc)(
        ICreateTypeInfo *This,
        IDLDESC *pIdlDesc);

    HRESULT (STDMETHODCALLTYPE *LayOut)(
        ICreateTypeInfo *This);

    END_INTERFACE
} ICreateTypeInfoVtbl;

interface ICreateTypeInfo {
    CONST_VTBL ICreateTypeInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICreateTypeInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICreateTypeInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICreateTypeInfo_Release(This) (This)->lpVtbl->Release(This)
/*** ICreateTypeInfo methods ***/
#define ICreateTypeInfo_SetGuid(This,guid) (This)->lpVtbl->SetGuid(This,guid)
#define ICreateTypeInfo_SetTypeFlags(This,uTypeFlags) (This)->lpVtbl->SetTypeFlags(This,uTypeFlags)
#define ICreateTypeInfo_SetDocString(This,pStrDoc) (This)->lpVtbl->SetDocString(This,pStrDoc)
#define ICreateTypeInfo_SetHelpContext(This,dwHelpContext) (This)->lpVtbl->SetHelpContext(This,dwHelpContext)
#define ICreateTypeInfo_SetVersion(This,wMajorVerNum,wMinorVerNum) (This)->lpVtbl->SetVersion(This,wMajorVerNum,wMinorVerNum)
#define ICreateTypeInfo_AddRefTypeInfo(This,pTInfo,phRefType) (This)->lpVtbl->AddRefTypeInfo(This,pTInfo,phRefType)
#define ICreateTypeInfo_AddFuncDesc(This,index,pFuncDesc) (This)->lpVtbl->AddFuncDesc(This,index,pFuncDesc)
#define ICreateTypeInfo_AddImplType(This,index,hRefType) (This)->lpVtbl->AddImplType(This,index,hRefType)
#define ICreateTypeInfo_SetImplTypeFlags(This,index,implTypeFlags) (This)->lpVtbl->SetImplTypeFlags(This,index,implTypeFlags)
#define ICreateTypeInfo_SetAlignment(This,cbAlignment) (This)->lpVtbl->SetAlignment(This,cbAlignment)
#define ICreateTypeInfo_SetSchema(This,pStrSchema) (This)->lpVtbl->SetSchema(This,pStrSchema)
#define ICreateTypeInfo_AddVarDesc(This,index,pVarDesc) (This)->lpVtbl->AddVarDesc(This,index,pVarDesc)
#define ICreateTypeInfo_SetFuncAndParamNames(This,index,rgszNames,cNames) (This)->lpVtbl->SetFuncAndParamNames(This,index,rgszNames,cNames)
#define ICreateTypeInfo_SetVarName(This,index,szName) (This)->lpVtbl->SetVarName(This,index,szName)
#define ICreateTypeInfo_SetTypeDescAlias(This,pTDescAlias) (This)->lpVtbl->SetTypeDescAlias(This,pTDescAlias)
#define ICreateTypeInfo_DefineFuncAsDllEntry(This,index,szDllName,szProcName) (This)->lpVtbl->DefineFuncAsDllEntry(This,index,szDllName,szProcName)
#define ICreateTypeInfo_SetFuncDocString(This,index,szDocString) (This)->lpVtbl->SetFuncDocString(This,index,szDocString)
#define ICreateTypeInfo_SetVarDocString(This,index,szDocString) (This)->lpVtbl->SetVarDocString(This,index,szDocString)
#define ICreateTypeInfo_SetFuncHelpContext(This,index,dwHelpContext) (This)->lpVtbl->SetFuncHelpContext(This,index,dwHelpContext)
#define ICreateTypeInfo_SetVarHelpContext(This,index,dwHelpContext) (This)->lpVtbl->SetVarHelpContext(This,index,dwHelpContext)
#define ICreateTypeInfo_SetMops(This,index,bstrMops) (This)->lpVtbl->SetMops(This,index,bstrMops)
#define ICreateTypeInfo_SetTypeIdldesc(This,pIdlDesc) (This)->lpVtbl->SetTypeIdldesc(This,pIdlDesc)
#define ICreateTypeInfo_LayOut(This) (This)->lpVtbl->LayOut(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICreateTypeInfo_QueryInterface(ICreateTypeInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICreateTypeInfo_AddRef(ICreateTypeInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICreateTypeInfo_Release(ICreateTypeInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** ICreateTypeInfo methods ***/
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetGuid(ICreateTypeInfo* This,REFGUID guid) {
    return This->lpVtbl->SetGuid(This,guid);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetTypeFlags(ICreateTypeInfo* This,UINT uTypeFlags) {
    return This->lpVtbl->SetTypeFlags(This,uTypeFlags);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetDocString(ICreateTypeInfo* This,LPOLESTR pStrDoc) {
    return This->lpVtbl->SetDocString(This,pStrDoc);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetHelpContext(ICreateTypeInfo* This,DWORD dwHelpContext) {
    return This->lpVtbl->SetHelpContext(This,dwHelpContext);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetVersion(ICreateTypeInfo* This,WORD wMajorVerNum,WORD wMinorVerNum) {
    return This->lpVtbl->SetVersion(This,wMajorVerNum,wMinorVerNum);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_AddRefTypeInfo(ICreateTypeInfo* This,ITypeInfo *pTInfo,HREFTYPE *phRefType) {
    return This->lpVtbl->AddRefTypeInfo(This,pTInfo,phRefType);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_AddFuncDesc(ICreateTypeInfo* This,UINT index,FUNCDESC *pFuncDesc) {
    return This->lpVtbl->AddFuncDesc(This,index,pFuncDesc);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_AddImplType(ICreateTypeInfo* This,UINT index,HREFTYPE hRefType) {
    return This->lpVtbl->AddImplType(This,index,hRefType);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetImplTypeFlags(ICreateTypeInfo* This,UINT index,INT implTypeFlags) {
    return This->lpVtbl->SetImplTypeFlags(This,index,implTypeFlags);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetAlignment(ICreateTypeInfo* This,WORD cbAlignment) {
    return This->lpVtbl->SetAlignment(This,cbAlignment);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetSchema(ICreateTypeInfo* This,LPOLESTR pStrSchema) {
    return This->lpVtbl->SetSchema(This,pStrSchema);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_AddVarDesc(ICreateTypeInfo* This,UINT index,VARDESC *pVarDesc) {
    return This->lpVtbl->AddVarDesc(This,index,pVarDesc);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetFuncAndParamNames(ICreateTypeInfo* This,UINT index,LPOLESTR *rgszNames,UINT cNames) {
    return This->lpVtbl->SetFuncAndParamNames(This,index,rgszNames,cNames);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetVarName(ICreateTypeInfo* This,UINT index,LPOLESTR szName) {
    return This->lpVtbl->SetVarName(This,index,szName);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetTypeDescAlias(ICreateTypeInfo* This,TYPEDESC *pTDescAlias) {
    return This->lpVtbl->SetTypeDescAlias(This,pTDescAlias);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_DefineFuncAsDllEntry(ICreateTypeInfo* This,UINT index,LPOLESTR szDllName,LPOLESTR szProcName) {
    return This->lpVtbl->DefineFuncAsDllEntry(This,index,szDllName,szProcName);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetFuncDocString(ICreateTypeInfo* This,UINT index,LPOLESTR szDocString) {
    return This->lpVtbl->SetFuncDocString(This,index,szDocString);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetVarDocString(ICreateTypeInfo* This,UINT index,LPOLESTR szDocString) {
    return This->lpVtbl->SetVarDocString(This,index,szDocString);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetFuncHelpContext(ICreateTypeInfo* This,UINT index,DWORD dwHelpContext) {
    return This->lpVtbl->SetFuncHelpContext(This,index,dwHelpContext);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetVarHelpContext(ICreateTypeInfo* This,UINT index,DWORD dwHelpContext) {
    return This->lpVtbl->SetVarHelpContext(This,index,dwHelpContext);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetMops(ICreateTypeInfo* This,UINT index,BSTR bstrMops) {
    return This->lpVtbl->SetMops(This,index,bstrMops);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_SetTypeIdldesc(ICreateTypeInfo* This,IDLDESC *pIdlDesc) {
    return This->lpVtbl->SetTypeIdldesc(This,pIdlDesc);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo_LayOut(ICreateTypeInfo* This) {
    return This->lpVtbl->LayOut(This);
}
#endif
#endif

#endif


#endif  /* __ICreateTypeInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ICreateTypeInfo2 interface
 */
#ifndef __ICreateTypeInfo2_INTERFACE_DEFINED__
#define __ICreateTypeInfo2_INTERFACE_DEFINED__

typedef ICreateTypeInfo2 *LPCREATETYPEINFO2;

DEFINE_GUID(IID_ICreateTypeInfo2, 0x0002040e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0002040e-0000-0000-c000-000000000046")
ICreateTypeInfo2 : public ICreateTypeInfo
{
    virtual HRESULT STDMETHODCALLTYPE DeleteFuncDesc(
        UINT index) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteFuncDescByMemId(
        MEMBERID memid,
        INVOKEKIND invKind) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteVarDesc(
        UINT index) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteVarDescByMemId(
        MEMBERID memid) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteImplType(
        UINT index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCustData(
        REFGUID guid,
        VARIANT *pVarVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFuncCustData(
        UINT index,
        REFGUID guid,
        VARIANT *pVarVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetParamCustData(
        UINT indexFunc,
        UINT indexParam,
        REFGUID guid,
        VARIANT *pVarVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVarCustData(
        UINT index,
        REFGUID guid,
        VARIANT *pVarVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetImplTypeCustData(
        UINT index,
        REFGUID guid,
        VARIANT *pVarVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHelpStringContext(
        ULONG dwHelpStringContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFuncHelpStringContext(
        UINT index,
        ULONG dwHelpStringContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVarHelpStringContext(
        UINT index,
        ULONG dwHelpStringContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE Invalidate(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetName(
        LPOLESTR szName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICreateTypeInfo2, 0x0002040e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ICreateTypeInfo2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICreateTypeInfo2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICreateTypeInfo2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICreateTypeInfo2 *This);

    /*** ICreateTypeInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *SetGuid)(
        ICreateTypeInfo2 *This,
        REFGUID guid);

    HRESULT (STDMETHODCALLTYPE *SetTypeFlags)(
        ICreateTypeInfo2 *This,
        UINT uTypeFlags);

    HRESULT (STDMETHODCALLTYPE *SetDocString)(
        ICreateTypeInfo2 *This,
        LPOLESTR pStrDoc);

    HRESULT (STDMETHODCALLTYPE *SetHelpContext)(
        ICreateTypeInfo2 *This,
        DWORD dwHelpContext);

    HRESULT (STDMETHODCALLTYPE *SetVersion)(
        ICreateTypeInfo2 *This,
        WORD wMajorVerNum,
        WORD wMinorVerNum);

    HRESULT (STDMETHODCALLTYPE *AddRefTypeInfo)(
        ICreateTypeInfo2 *This,
        ITypeInfo *pTInfo,
        HREFTYPE *phRefType);

    HRESULT (STDMETHODCALLTYPE *AddFuncDesc)(
        ICreateTypeInfo2 *This,
        UINT index,
        FUNCDESC *pFuncDesc);

    HRESULT (STDMETHODCALLTYPE *AddImplType)(
        ICreateTypeInfo2 *This,
        UINT index,
        HREFTYPE hRefType);

    HRESULT (STDMETHODCALLTYPE *SetImplTypeFlags)(
        ICreateTypeInfo2 *This,
        UINT index,
        INT implTypeFlags);

    HRESULT (STDMETHODCALLTYPE *SetAlignment)(
        ICreateTypeInfo2 *This,
        WORD cbAlignment);

    HRESULT (STDMETHODCALLTYPE *SetSchema)(
        ICreateTypeInfo2 *This,
        LPOLESTR pStrSchema);

    HRESULT (STDMETHODCALLTYPE *AddVarDesc)(
        ICreateTypeInfo2 *This,
        UINT index,
        VARDESC *pVarDesc);

    HRESULT (STDMETHODCALLTYPE *SetFuncAndParamNames)(
        ICreateTypeInfo2 *This,
        UINT index,
        LPOLESTR *rgszNames,
        UINT cNames);

    HRESULT (STDMETHODCALLTYPE *SetVarName)(
        ICreateTypeInfo2 *This,
        UINT index,
        LPOLESTR szName);

    HRESULT (STDMETHODCALLTYPE *SetTypeDescAlias)(
        ICreateTypeInfo2 *This,
        TYPEDESC *pTDescAlias);

    HRESULT (STDMETHODCALLTYPE *DefineFuncAsDllEntry)(
        ICreateTypeInfo2 *This,
        UINT index,
        LPOLESTR szDllName,
        LPOLESTR szProcName);

    HRESULT (STDMETHODCALLTYPE *SetFuncDocString)(
        ICreateTypeInfo2 *This,
        UINT index,
        LPOLESTR szDocString);

    HRESULT (STDMETHODCALLTYPE *SetVarDocString)(
        ICreateTypeInfo2 *This,
        UINT index,
        LPOLESTR szDocString);

    HRESULT (STDMETHODCALLTYPE *SetFuncHelpContext)(
        ICreateTypeInfo2 *This,
        UINT index,
        DWORD dwHelpContext);

    HRESULT (STDMETHODCALLTYPE *SetVarHelpContext)(
        ICreateTypeInfo2 *This,
        UINT index,
        DWORD dwHelpContext);

    HRESULT (STDMETHODCALLTYPE *SetMops)(
        ICreateTypeInfo2 *This,
        UINT index,
        BSTR bstrMops);

    HRESULT (STDMETHODCALLTYPE *SetTypeIdldesc)(
        ICreateTypeInfo2 *This,
        IDLDESC *pIdlDesc);

    HRESULT (STDMETHODCALLTYPE *LayOut)(
        ICreateTypeInfo2 *This);

    /*** ICreateTypeInfo2 methods ***/
    HRESULT (STDMETHODCALLTYPE *DeleteFuncDesc)(
        ICreateTypeInfo2 *This,
        UINT index);

    HRESULT (STDMETHODCALLTYPE *DeleteFuncDescByMemId)(
        ICreateTypeInfo2 *This,
        MEMBERID memid,
        INVOKEKIND invKind);

    HRESULT (STDMETHODCALLTYPE *DeleteVarDesc)(
        ICreateTypeInfo2 *This,
        UINT index);

    HRESULT (STDMETHODCALLTYPE *DeleteVarDescByMemId)(
        ICreateTypeInfo2 *This,
        MEMBERID memid);

    HRESULT (STDMETHODCALLTYPE *DeleteImplType)(
        ICreateTypeInfo2 *This,
        UINT index);

    HRESULT (STDMETHODCALLTYPE *SetCustData)(
        ICreateTypeInfo2 *This,
        REFGUID guid,
        VARIANT *pVarVal);

    HRESULT (STDMETHODCALLTYPE *SetFuncCustData)(
        ICreateTypeInfo2 *This,
        UINT index,
        REFGUID guid,
        VARIANT *pVarVal);

    HRESULT (STDMETHODCALLTYPE *SetParamCustData)(
        ICreateTypeInfo2 *This,
        UINT indexFunc,
        UINT indexParam,
        REFGUID guid,
        VARIANT *pVarVal);

    HRESULT (STDMETHODCALLTYPE *SetVarCustData)(
        ICreateTypeInfo2 *This,
        UINT index,
        REFGUID guid,
        VARIANT *pVarVal);

    HRESULT (STDMETHODCALLTYPE *SetImplTypeCustData)(
        ICreateTypeInfo2 *This,
        UINT index,
        REFGUID guid,
        VARIANT *pVarVal);

    HRESULT (STDMETHODCALLTYPE *SetHelpStringContext)(
        ICreateTypeInfo2 *This,
        ULONG dwHelpStringContext);

    HRESULT (STDMETHODCALLTYPE *SetFuncHelpStringContext)(
        ICreateTypeInfo2 *This,
        UINT index,
        ULONG dwHelpStringContext);

    HRESULT (STDMETHODCALLTYPE *SetVarHelpStringContext)(
        ICreateTypeInfo2 *This,
        UINT index,
        ULONG dwHelpStringContext);

    HRESULT (STDMETHODCALLTYPE *Invalidate)(
        ICreateTypeInfo2 *This);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ICreateTypeInfo2 *This,
        LPOLESTR szName);

    END_INTERFACE
} ICreateTypeInfo2Vtbl;

interface ICreateTypeInfo2 {
    CONST_VTBL ICreateTypeInfo2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICreateTypeInfo2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICreateTypeInfo2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICreateTypeInfo2_Release(This) (This)->lpVtbl->Release(This)
/*** ICreateTypeInfo methods ***/
#define ICreateTypeInfo2_SetGuid(This,guid) (This)->lpVtbl->SetGuid(This,guid)
#define ICreateTypeInfo2_SetTypeFlags(This,uTypeFlags) (This)->lpVtbl->SetTypeFlags(This,uTypeFlags)
#define ICreateTypeInfo2_SetDocString(This,pStrDoc) (This)->lpVtbl->SetDocString(This,pStrDoc)
#define ICreateTypeInfo2_SetHelpContext(This,dwHelpContext) (This)->lpVtbl->SetHelpContext(This,dwHelpContext)
#define ICreateTypeInfo2_SetVersion(This,wMajorVerNum,wMinorVerNum) (This)->lpVtbl->SetVersion(This,wMajorVerNum,wMinorVerNum)
#define ICreateTypeInfo2_AddRefTypeInfo(This,pTInfo,phRefType) (This)->lpVtbl->AddRefTypeInfo(This,pTInfo,phRefType)
#define ICreateTypeInfo2_AddFuncDesc(This,index,pFuncDesc) (This)->lpVtbl->AddFuncDesc(This,index,pFuncDesc)
#define ICreateTypeInfo2_AddImplType(This,index,hRefType) (This)->lpVtbl->AddImplType(This,index,hRefType)
#define ICreateTypeInfo2_SetImplTypeFlags(This,index,implTypeFlags) (This)->lpVtbl->SetImplTypeFlags(This,index,implTypeFlags)
#define ICreateTypeInfo2_SetAlignment(This,cbAlignment) (This)->lpVtbl->SetAlignment(This,cbAlignment)
#define ICreateTypeInfo2_SetSchema(This,pStrSchema) (This)->lpVtbl->SetSchema(This,pStrSchema)
#define ICreateTypeInfo2_AddVarDesc(This,index,pVarDesc) (This)->lpVtbl->AddVarDesc(This,index,pVarDesc)
#define ICreateTypeInfo2_SetFuncAndParamNames(This,index,rgszNames,cNames) (This)->lpVtbl->SetFuncAndParamNames(This,index,rgszNames,cNames)
#define ICreateTypeInfo2_SetVarName(This,index,szName) (This)->lpVtbl->SetVarName(This,index,szName)
#define ICreateTypeInfo2_SetTypeDescAlias(This,pTDescAlias) (This)->lpVtbl->SetTypeDescAlias(This,pTDescAlias)
#define ICreateTypeInfo2_DefineFuncAsDllEntry(This,index,szDllName,szProcName) (This)->lpVtbl->DefineFuncAsDllEntry(This,index,szDllName,szProcName)
#define ICreateTypeInfo2_SetFuncDocString(This,index,szDocString) (This)->lpVtbl->SetFuncDocString(This,index,szDocString)
#define ICreateTypeInfo2_SetVarDocString(This,index,szDocString) (This)->lpVtbl->SetVarDocString(This,index,szDocString)
#define ICreateTypeInfo2_SetFuncHelpContext(This,index,dwHelpContext) (This)->lpVtbl->SetFuncHelpContext(This,index,dwHelpContext)
#define ICreateTypeInfo2_SetVarHelpContext(This,index,dwHelpContext) (This)->lpVtbl->SetVarHelpContext(This,index,dwHelpContext)
#define ICreateTypeInfo2_SetMops(This,index,bstrMops) (This)->lpVtbl->SetMops(This,index,bstrMops)
#define ICreateTypeInfo2_SetTypeIdldesc(This,pIdlDesc) (This)->lpVtbl->SetTypeIdldesc(This,pIdlDesc)
#define ICreateTypeInfo2_LayOut(This) (This)->lpVtbl->LayOut(This)
/*** ICreateTypeInfo2 methods ***/
#define ICreateTypeInfo2_DeleteFuncDesc(This,index) (This)->lpVtbl->DeleteFuncDesc(This,index)
#define ICreateTypeInfo2_DeleteFuncDescByMemId(This,memid,invKind) (This)->lpVtbl->DeleteFuncDescByMemId(This,memid,invKind)
#define ICreateTypeInfo2_DeleteVarDesc(This,index) (This)->lpVtbl->DeleteVarDesc(This,index)
#define ICreateTypeInfo2_DeleteVarDescByMemId(This,memid) (This)->lpVtbl->DeleteVarDescByMemId(This,memid)
#define ICreateTypeInfo2_DeleteImplType(This,index) (This)->lpVtbl->DeleteImplType(This,index)
#define ICreateTypeInfo2_SetCustData(This,guid,pVarVal) (This)->lpVtbl->SetCustData(This,guid,pVarVal)
#define ICreateTypeInfo2_SetFuncCustData(This,index,guid,pVarVal) (This)->lpVtbl->SetFuncCustData(This,index,guid,pVarVal)
#define ICreateTypeInfo2_SetParamCustData(This,indexFunc,indexParam,guid,pVarVal) (This)->lpVtbl->SetParamCustData(This,indexFunc,indexParam,guid,pVarVal)
#define ICreateTypeInfo2_SetVarCustData(This,index,guid,pVarVal) (This)->lpVtbl->SetVarCustData(This,index,guid,pVarVal)
#define ICreateTypeInfo2_SetImplTypeCustData(This,index,guid,pVarVal) (This)->lpVtbl->SetImplTypeCustData(This,index,guid,pVarVal)
#define ICreateTypeInfo2_SetHelpStringContext(This,dwHelpStringContext) (This)->lpVtbl->SetHelpStringContext(This,dwHelpStringContext)
#define ICreateTypeInfo2_SetFuncHelpStringContext(This,index,dwHelpStringContext) (This)->lpVtbl->SetFuncHelpStringContext(This,index,dwHelpStringContext)
#define ICreateTypeInfo2_SetVarHelpStringContext(This,index,dwHelpStringContext) (This)->lpVtbl->SetVarHelpStringContext(This,index,dwHelpStringContext)
#define ICreateTypeInfo2_Invalidate(This) (This)->lpVtbl->Invalidate(This)
#define ICreateTypeInfo2_SetName(This,szName) (This)->lpVtbl->SetName(This,szName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICreateTypeInfo2_QueryInterface(ICreateTypeInfo2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICreateTypeInfo2_AddRef(ICreateTypeInfo2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICreateTypeInfo2_Release(ICreateTypeInfo2* This) {
    return This->lpVtbl->Release(This);
}
/*** ICreateTypeInfo methods ***/
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetGuid(ICreateTypeInfo2* This,REFGUID guid) {
    return This->lpVtbl->SetGuid(This,guid);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetTypeFlags(ICreateTypeInfo2* This,UINT uTypeFlags) {
    return This->lpVtbl->SetTypeFlags(This,uTypeFlags);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetDocString(ICreateTypeInfo2* This,LPOLESTR pStrDoc) {
    return This->lpVtbl->SetDocString(This,pStrDoc);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetHelpContext(ICreateTypeInfo2* This,DWORD dwHelpContext) {
    return This->lpVtbl->SetHelpContext(This,dwHelpContext);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetVersion(ICreateTypeInfo2* This,WORD wMajorVerNum,WORD wMinorVerNum) {
    return This->lpVtbl->SetVersion(This,wMajorVerNum,wMinorVerNum);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_AddRefTypeInfo(ICreateTypeInfo2* This,ITypeInfo *pTInfo,HREFTYPE *phRefType) {
    return This->lpVtbl->AddRefTypeInfo(This,pTInfo,phRefType);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_AddFuncDesc(ICreateTypeInfo2* This,UINT index,FUNCDESC *pFuncDesc) {
    return This->lpVtbl->AddFuncDesc(This,index,pFuncDesc);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_AddImplType(ICreateTypeInfo2* This,UINT index,HREFTYPE hRefType) {
    return This->lpVtbl->AddImplType(This,index,hRefType);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetImplTypeFlags(ICreateTypeInfo2* This,UINT index,INT implTypeFlags) {
    return This->lpVtbl->SetImplTypeFlags(This,index,implTypeFlags);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetAlignment(ICreateTypeInfo2* This,WORD cbAlignment) {
    return This->lpVtbl->SetAlignment(This,cbAlignment);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetSchema(ICreateTypeInfo2* This,LPOLESTR pStrSchema) {
    return This->lpVtbl->SetSchema(This,pStrSchema);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_AddVarDesc(ICreateTypeInfo2* This,UINT index,VARDESC *pVarDesc) {
    return This->lpVtbl->AddVarDesc(This,index,pVarDesc);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetFuncAndParamNames(ICreateTypeInfo2* This,UINT index,LPOLESTR *rgszNames,UINT cNames) {
    return This->lpVtbl->SetFuncAndParamNames(This,index,rgszNames,cNames);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetVarName(ICreateTypeInfo2* This,UINT index,LPOLESTR szName) {
    return This->lpVtbl->SetVarName(This,index,szName);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetTypeDescAlias(ICreateTypeInfo2* This,TYPEDESC *pTDescAlias) {
    return This->lpVtbl->SetTypeDescAlias(This,pTDescAlias);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_DefineFuncAsDllEntry(ICreateTypeInfo2* This,UINT index,LPOLESTR szDllName,LPOLESTR szProcName) {
    return This->lpVtbl->DefineFuncAsDllEntry(This,index,szDllName,szProcName);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetFuncDocString(ICreateTypeInfo2* This,UINT index,LPOLESTR szDocString) {
    return This->lpVtbl->SetFuncDocString(This,index,szDocString);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetVarDocString(ICreateTypeInfo2* This,UINT index,LPOLESTR szDocString) {
    return This->lpVtbl->SetVarDocString(This,index,szDocString);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetFuncHelpContext(ICreateTypeInfo2* This,UINT index,DWORD dwHelpContext) {
    return This->lpVtbl->SetFuncHelpContext(This,index,dwHelpContext);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetVarHelpContext(ICreateTypeInfo2* This,UINT index,DWORD dwHelpContext) {
    return This->lpVtbl->SetVarHelpContext(This,index,dwHelpContext);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetMops(ICreateTypeInfo2* This,UINT index,BSTR bstrMops) {
    return This->lpVtbl->SetMops(This,index,bstrMops);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetTypeIdldesc(ICreateTypeInfo2* This,IDLDESC *pIdlDesc) {
    return This->lpVtbl->SetTypeIdldesc(This,pIdlDesc);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_LayOut(ICreateTypeInfo2* This) {
    return This->lpVtbl->LayOut(This);
}
/*** ICreateTypeInfo2 methods ***/
static __WIDL_INLINE HRESULT ICreateTypeInfo2_DeleteFuncDesc(ICreateTypeInfo2* This,UINT index) {
    return This->lpVtbl->DeleteFuncDesc(This,index);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_DeleteFuncDescByMemId(ICreateTypeInfo2* This,MEMBERID memid,INVOKEKIND invKind) {
    return This->lpVtbl->DeleteFuncDescByMemId(This,memid,invKind);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_DeleteVarDesc(ICreateTypeInfo2* This,UINT index) {
    return This->lpVtbl->DeleteVarDesc(This,index);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_DeleteVarDescByMemId(ICreateTypeInfo2* This,MEMBERID memid) {
    return This->lpVtbl->DeleteVarDescByMemId(This,memid);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_DeleteImplType(ICreateTypeInfo2* This,UINT index) {
    return This->lpVtbl->DeleteImplType(This,index);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetCustData(ICreateTypeInfo2* This,REFGUID guid,VARIANT *pVarVal) {
    return This->lpVtbl->SetCustData(This,guid,pVarVal);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetFuncCustData(ICreateTypeInfo2* This,UINT index,REFGUID guid,VARIANT *pVarVal) {
    return This->lpVtbl->SetFuncCustData(This,index,guid,pVarVal);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetParamCustData(ICreateTypeInfo2* This,UINT indexFunc,UINT indexParam,REFGUID guid,VARIANT *pVarVal) {
    return This->lpVtbl->SetParamCustData(This,indexFunc,indexParam,guid,pVarVal);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetVarCustData(ICreateTypeInfo2* This,UINT index,REFGUID guid,VARIANT *pVarVal) {
    return This->lpVtbl->SetVarCustData(This,index,guid,pVarVal);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetImplTypeCustData(ICreateTypeInfo2* This,UINT index,REFGUID guid,VARIANT *pVarVal) {
    return This->lpVtbl->SetImplTypeCustData(This,index,guid,pVarVal);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetHelpStringContext(ICreateTypeInfo2* This,ULONG dwHelpStringContext) {
    return This->lpVtbl->SetHelpStringContext(This,dwHelpStringContext);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetFuncHelpStringContext(ICreateTypeInfo2* This,UINT index,ULONG dwHelpStringContext) {
    return This->lpVtbl->SetFuncHelpStringContext(This,index,dwHelpStringContext);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetVarHelpStringContext(ICreateTypeInfo2* This,UINT index,ULONG dwHelpStringContext) {
    return This->lpVtbl->SetVarHelpStringContext(This,index,dwHelpStringContext);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_Invalidate(ICreateTypeInfo2* This) {
    return This->lpVtbl->Invalidate(This);
}
static __WIDL_INLINE HRESULT ICreateTypeInfo2_SetName(ICreateTypeInfo2* This,LPOLESTR szName) {
    return This->lpVtbl->SetName(This,szName);
}
#endif
#endif

#endif


#endif  /* __ICreateTypeInfo2_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ICreateTypeLib interface
 */
#ifndef __ICreateTypeLib_INTERFACE_DEFINED__
#define __ICreateTypeLib_INTERFACE_DEFINED__

typedef ICreateTypeLib *LPCREATETYPELIB;

DEFINE_GUID(IID_ICreateTypeLib, 0x00020406, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00020406-0000-0000-c000-000000000046")
ICreateTypeLib : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateTypeInfo(
        LPOLESTR szName,
        TYPEKIND tkind,
        ICreateTypeInfo **ppCTInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetName(
        LPOLESTR szName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVersion(
        WORD wMajorVerNum,
        WORD wMinorVerNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGuid(
        REFGUID guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDocString(
        LPOLESTR szDoc) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHelpFileName(
        LPOLESTR szHelpFileName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHelpContext(
        DWORD dwHelpContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLcid(
        LCID lcid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLibFlags(
        UINT uLibFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveAllChanges(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICreateTypeLib, 0x00020406, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ICreateTypeLibVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICreateTypeLib *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICreateTypeLib *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICreateTypeLib *This);

    /*** ICreateTypeLib methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTypeInfo)(
        ICreateTypeLib *This,
        LPOLESTR szName,
        TYPEKIND tkind,
        ICreateTypeInfo **ppCTInfo);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ICreateTypeLib *This,
        LPOLESTR szName);

    HRESULT (STDMETHODCALLTYPE *SetVersion)(
        ICreateTypeLib *This,
        WORD wMajorVerNum,
        WORD wMinorVerNum);

    HRESULT (STDMETHODCALLTYPE *SetGuid)(
        ICreateTypeLib *This,
        REFGUID guid);

    HRESULT (STDMETHODCALLTYPE *SetDocString)(
        ICreateTypeLib *This,
        LPOLESTR szDoc);

    HRESULT (STDMETHODCALLTYPE *SetHelpFileName)(
        ICreateTypeLib *This,
        LPOLESTR szHelpFileName);

    HRESULT (STDMETHODCALLTYPE *SetHelpContext)(
        ICreateTypeLib *This,
        DWORD dwHelpContext);

    HRESULT (STDMETHODCALLTYPE *SetLcid)(
        ICreateTypeLib *This,
        LCID lcid);

    HRESULT (STDMETHODCALLTYPE *SetLibFlags)(
        ICreateTypeLib *This,
        UINT uLibFlags);

    HRESULT (STDMETHODCALLTYPE *SaveAllChanges)(
        ICreateTypeLib *This);

    END_INTERFACE
} ICreateTypeLibVtbl;

interface ICreateTypeLib {
    CONST_VTBL ICreateTypeLibVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICreateTypeLib_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICreateTypeLib_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICreateTypeLib_Release(This) (This)->lpVtbl->Release(This)
/*** ICreateTypeLib methods ***/
#define ICreateTypeLib_CreateTypeInfo(This,szName,tkind,ppCTInfo) (This)->lpVtbl->CreateTypeInfo(This,szName,tkind,ppCTInfo)
#define ICreateTypeLib_SetName(This,szName) (This)->lpVtbl->SetName(This,szName)
#define ICreateTypeLib_SetVersion(This,wMajorVerNum,wMinorVerNum) (This)->lpVtbl->SetVersion(This,wMajorVerNum,wMinorVerNum)
#define ICreateTypeLib_SetGuid(This,guid) (This)->lpVtbl->SetGuid(This,guid)
#define ICreateTypeLib_SetDocString(This,szDoc) (This)->lpVtbl->SetDocString(This,szDoc)
#define ICreateTypeLib_SetHelpFileName(This,szHelpFileName) (This)->lpVtbl->SetHelpFileName(This,szHelpFileName)
#define ICreateTypeLib_SetHelpContext(This,dwHelpContext) (This)->lpVtbl->SetHelpContext(This,dwHelpContext)
#define ICreateTypeLib_SetLcid(This,lcid) (This)->lpVtbl->SetLcid(This,lcid)
#define ICreateTypeLib_SetLibFlags(This,uLibFlags) (This)->lpVtbl->SetLibFlags(This,uLibFlags)
#define ICreateTypeLib_SaveAllChanges(This) (This)->lpVtbl->SaveAllChanges(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICreateTypeLib_QueryInterface(ICreateTypeLib* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICreateTypeLib_AddRef(ICreateTypeLib* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICreateTypeLib_Release(ICreateTypeLib* This) {
    return This->lpVtbl->Release(This);
}
/*** ICreateTypeLib methods ***/
static __WIDL_INLINE HRESULT ICreateTypeLib_CreateTypeInfo(ICreateTypeLib* This,LPOLESTR szName,TYPEKIND tkind,ICreateTypeInfo **ppCTInfo) {
    return This->lpVtbl->CreateTypeInfo(This,szName,tkind,ppCTInfo);
}
static __WIDL_INLINE HRESULT ICreateTypeLib_SetName(ICreateTypeLib* This,LPOLESTR szName) {
    return This->lpVtbl->SetName(This,szName);
}
static __WIDL_INLINE HRESULT ICreateTypeLib_SetVersion(ICreateTypeLib* This,WORD wMajorVerNum,WORD wMinorVerNum) {
    return This->lpVtbl->SetVersion(This,wMajorVerNum,wMinorVerNum);
}
static __WIDL_INLINE HRESULT ICreateTypeLib_SetGuid(ICreateTypeLib* This,REFGUID guid) {
    return This->lpVtbl->SetGuid(This,guid);
}
static __WIDL_INLINE HRESULT ICreateTypeLib_SetDocString(ICreateTypeLib* This,LPOLESTR szDoc) {
    return This->lpVtbl->SetDocString(This,szDoc);
}
static __WIDL_INLINE HRESULT ICreateTypeLib_SetHelpFileName(ICreateTypeLib* This,LPOLESTR szHelpFileName) {
    return This->lpVtbl->SetHelpFileName(This,szHelpFileName);
}
static __WIDL_INLINE HRESULT ICreateTypeLib_SetHelpContext(ICreateTypeLib* This,DWORD dwHelpContext) {
    return This->lpVtbl->SetHelpContext(This,dwHelpContext);
}
static __WIDL_INLINE HRESULT ICreateTypeLib_SetLcid(ICreateTypeLib* This,LCID lcid) {
    return This->lpVtbl->SetLcid(This,lcid);
}
static __WIDL_INLINE HRESULT ICreateTypeLib_SetLibFlags(ICreateTypeLib* This,UINT uLibFlags) {
    return This->lpVtbl->SetLibFlags(This,uLibFlags);
}
static __WIDL_INLINE HRESULT ICreateTypeLib_SaveAllChanges(ICreateTypeLib* This) {
    return This->lpVtbl->SaveAllChanges(This);
}
#endif
#endif

#endif


#endif  /* __ICreateTypeLib_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ICreateTypeLib2 interface
 */
#ifndef __ICreateTypeLib2_INTERFACE_DEFINED__
#define __ICreateTypeLib2_INTERFACE_DEFINED__

typedef ICreateTypeLib2 *LPCREATETYPELIB2;
DEFINE_GUID(IID_ICreateTypeLib2, 0x0002040f, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0002040f-0000-0000-c000-000000000046")
ICreateTypeLib2 : public ICreateTypeLib
{
    virtual HRESULT STDMETHODCALLTYPE DeleteTypeInfo(
        LPOLESTR szName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCustData(
        REFGUID guid,
        VARIANT *pVarVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHelpStringContext(
        ULONG dwHelpStringContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHelpStringDll(
        LPOLESTR szFileName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICreateTypeLib2, 0x0002040f, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ICreateTypeLib2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICreateTypeLib2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICreateTypeLib2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICreateTypeLib2 *This);

    /*** ICreateTypeLib methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTypeInfo)(
        ICreateTypeLib2 *This,
        LPOLESTR szName,
        TYPEKIND tkind,
        ICreateTypeInfo **ppCTInfo);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        ICreateTypeLib2 *This,
        LPOLESTR szName);

    HRESULT (STDMETHODCALLTYPE *SetVersion)(
        ICreateTypeLib2 *This,
        WORD wMajorVerNum,
        WORD wMinorVerNum);

    HRESULT (STDMETHODCALLTYPE *SetGuid)(
        ICreateTypeLib2 *This,
        REFGUID guid);

    HRESULT (STDMETHODCALLTYPE *SetDocString)(
        ICreateTypeLib2 *This,
        LPOLESTR szDoc);

    HRESULT (STDMETHODCALLTYPE *SetHelpFileName)(
        ICreateTypeLib2 *This,
        LPOLESTR szHelpFileName);

    HRESULT (STDMETHODCALLTYPE *SetHelpContext)(
        ICreateTypeLib2 *This,
        DWORD dwHelpContext);

    HRESULT (STDMETHODCALLTYPE *SetLcid)(
        ICreateTypeLib2 *This,
        LCID lcid);

    HRESULT (STDMETHODCALLTYPE *SetLibFlags)(
        ICreateTypeLib2 *This,
        UINT uLibFlags);

    HRESULT (STDMETHODCALLTYPE *SaveAllChanges)(
        ICreateTypeLib2 *This);

    /*** ICreateTypeLib2 methods ***/
    HRESULT (STDMETHODCALLTYPE *DeleteTypeInfo)(
        ICreateTypeLib2 *This,
        LPOLESTR szName);

    HRESULT (STDMETHODCALLTYPE *SetCustData)(
        ICreateTypeLib2 *This,
        REFGUID guid,
        VARIANT *pVarVal);

    HRESULT (STDMETHODCALLTYPE *SetHelpStringContext)(
        ICreateTypeLib2 *This,
        ULONG dwHelpStringContext);

    HRESULT (STDMETHODCALLTYPE *SetHelpStringDll)(
        ICreateTypeLib2 *This,
        LPOLESTR szFileName);

    END_INTERFACE
} ICreateTypeLib2Vtbl;

interface ICreateTypeLib2 {
    CONST_VTBL ICreateTypeLib2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICreateTypeLib2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICreateTypeLib2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICreateTypeLib2_Release(This) (This)->lpVtbl->Release(This)
/*** ICreateTypeLib methods ***/
#define ICreateTypeLib2_CreateTypeInfo(This,szName,tkind,ppCTInfo) (This)->lpVtbl->CreateTypeInfo(This,szName,tkind,ppCTInfo)
#define ICreateTypeLib2_SetName(This,szName) (This)->lpVtbl->SetName(This,szName)
#define ICreateTypeLib2_SetVersion(This,wMajorVerNum,wMinorVerNum) (This)->lpVtbl->SetVersion(This,wMajorVerNum,wMinorVerNum)
#define ICreateTypeLib2_SetGuid(This,guid) (This)->lpVtbl->SetGuid(This,guid)
#define ICreateTypeLib2_SetDocString(This,szDoc) (This)->lpVtbl->SetDocString(This,szDoc)
#define ICreateTypeLib2_SetHelpFileName(This,szHelpFileName) (This)->lpVtbl->SetHelpFileName(This,szHelpFileName)
#define ICreateTypeLib2_SetHelpContext(This,dwHelpContext) (This)->lpVtbl->SetHelpContext(This,dwHelpContext)
#define ICreateTypeLib2_SetLcid(This,lcid) (This)->lpVtbl->SetLcid(This,lcid)
#define ICreateTypeLib2_SetLibFlags(This,uLibFlags) (This)->lpVtbl->SetLibFlags(This,uLibFlags)
#define ICreateTypeLib2_SaveAllChanges(This) (This)->lpVtbl->SaveAllChanges(This)
/*** ICreateTypeLib2 methods ***/
#define ICreateTypeLib2_DeleteTypeInfo(This,szName) (This)->lpVtbl->DeleteTypeInfo(This,szName)
#define ICreateTypeLib2_SetCustData(This,guid,pVarVal) (This)->lpVtbl->SetCustData(This,guid,pVarVal)
#define ICreateTypeLib2_SetHelpStringContext(This,dwHelpStringContext) (This)->lpVtbl->SetHelpStringContext(This,dwHelpStringContext)
#define ICreateTypeLib2_SetHelpStringDll(This,szFileName) (This)->lpVtbl->SetHelpStringDll(This,szFileName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICreateTypeLib2_QueryInterface(ICreateTypeLib2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICreateTypeLib2_AddRef(ICreateTypeLib2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICreateTypeLib2_Release(ICreateTypeLib2* This) {
    return This->lpVtbl->Release(This);
}
/*** ICreateTypeLib methods ***/
static __WIDL_INLINE HRESULT ICreateTypeLib2_CreateTypeInfo(ICreateTypeLib2* This,LPOLESTR szName,TYPEKIND tkind,ICreateTypeInfo **ppCTInfo) {
    return This->lpVtbl->CreateTypeInfo(This,szName,tkind,ppCTInfo);
}
static __WIDL_INLINE HRESULT ICreateTypeLib2_SetName(ICreateTypeLib2* This,LPOLESTR szName) {
    return This->lpVtbl->SetName(This,szName);
}
static __WIDL_INLINE HRESULT ICreateTypeLib2_SetVersion(ICreateTypeLib2* This,WORD wMajorVerNum,WORD wMinorVerNum) {
    return This->lpVtbl->SetVersion(This,wMajorVerNum,wMinorVerNum);
}
static __WIDL_INLINE HRESULT ICreateTypeLib2_SetGuid(ICreateTypeLib2* This,REFGUID guid) {
    return This->lpVtbl->SetGuid(This,guid);
}
static __WIDL_INLINE HRESULT ICreateTypeLib2_SetDocString(ICreateTypeLib2* This,LPOLESTR szDoc) {
    return This->lpVtbl->SetDocString(This,szDoc);
}
static __WIDL_INLINE HRESULT ICreateTypeLib2_SetHelpFileName(ICreateTypeLib2* This,LPOLESTR szHelpFileName) {
    return This->lpVtbl->SetHelpFileName(This,szHelpFileName);
}
static __WIDL_INLINE HRESULT ICreateTypeLib2_SetHelpContext(ICreateTypeLib2* This,DWORD dwHelpContext) {
    return This->lpVtbl->SetHelpContext(This,dwHelpContext);
}
static __WIDL_INLINE HRESULT ICreateTypeLib2_SetLcid(ICreateTypeLib2* This,LCID lcid) {
    return This->lpVtbl->SetLcid(This,lcid);
}
static __WIDL_INLINE HRESULT ICreateTypeLib2_SetLibFlags(ICreateTypeLib2* This,UINT uLibFlags) {
    return This->lpVtbl->SetLibFlags(This,uLibFlags);
}
static __WIDL_INLINE HRESULT ICreateTypeLib2_SaveAllChanges(ICreateTypeLib2* This) {
    return This->lpVtbl->SaveAllChanges(This);
}
/*** ICreateTypeLib2 methods ***/
static __WIDL_INLINE HRESULT ICreateTypeLib2_DeleteTypeInfo(ICreateTypeLib2* This,LPOLESTR szName) {
    return This->lpVtbl->DeleteTypeInfo(This,szName);
}
static __WIDL_INLINE HRESULT ICreateTypeLib2_SetCustData(ICreateTypeLib2* This,REFGUID guid,VARIANT *pVarVal) {
    return This->lpVtbl->SetCustData(This,guid,pVarVal);
}
static __WIDL_INLINE HRESULT ICreateTypeLib2_SetHelpStringContext(ICreateTypeLib2* This,ULONG dwHelpStringContext) {
    return This->lpVtbl->SetHelpStringContext(This,dwHelpStringContext);
}
static __WIDL_INLINE HRESULT ICreateTypeLib2_SetHelpStringDll(ICreateTypeLib2* This,LPOLESTR szFileName) {
    return This->lpVtbl->SetHelpStringDll(This,szFileName);
}
#endif
#endif

#endif


#endif  /* __ICreateTypeLib2_INTERFACE_DEFINED__ */

#endif

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
/*****************************************************************************
 * IDispatch interface
 */
#ifndef __IDispatch_INTERFACE_DEFINED__
#define __IDispatch_INTERFACE_DEFINED__

typedef IDispatch *LPDISPATCH;


#define DISPID_UNKNOWN (-1)

#define DISPID_VALUE (0)

#define DISPID_PROPERTYPUT (-3)

#define DISPID_NEWENUM (-4)

#define DISPID_EVALUATE (-5)

#define DISPID_CONSTRUCTOR (-6)

#define DISPID_DESTRUCTOR (-7)

#define DISPID_COLLECT (-8)


DEFINE_GUID(IID_IDispatch, 0x00020400, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00020400-0000-0000-c000-000000000046")
IDispatch : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
        UINT *pctinfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId) = 0;

    virtual HRESULT STDMETHODCALLTYPE Invoke(
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDispatch, 0x00020400, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IDispatchVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDispatch *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDispatch *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDispatch *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDispatch *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDispatch *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDispatch *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDispatch *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} IDispatchVtbl;

interface IDispatch {
    CONST_VTBL IDispatchVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDispatch_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDispatch_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDispatch_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDispatch_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDispatch_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDispatch_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDispatch_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDispatch_QueryInterface(IDispatch* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDispatch_AddRef(IDispatch* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDispatch_Release(IDispatch* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDispatch_GetTypeInfoCount(IDispatch* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDispatch_GetTypeInfo(IDispatch* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IDispatch_GetIDsOfNames(IDispatch* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IDispatch_Invoke(IDispatch* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDispatch_RemoteInvoke_Proxy(
    IDispatch* This,
    DISPID dispIdMember,
    REFIID riid,
    LCID lcid,
    DWORD dwFlags,
    DISPPARAMS *pDispParams,
    VARIANT *pVarResult,
    EXCEPINFO *pExcepInfo,
    UINT *pArgErr,
    UINT cVarRef,
    UINT *rgVarRefIdx,
    VARIANTARG *rgVarRef);
void __RPC_STUB IDispatch_RemoteInvoke_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IDispatch_Invoke_Proxy(
    IDispatch* This,
    DISPID dispIdMember,
    REFIID riid,
    LCID lcid,
    WORD wFlags,
    DISPPARAMS *pDispParams,
    VARIANT *pVarResult,
    EXCEPINFO *pExcepInfo,
    UINT *puArgErr);
HRESULT __RPC_STUB IDispatch_Invoke_Stub(
    IDispatch* This,
    DISPID dispIdMember,
    REFIID riid,
    LCID lcid,
    DWORD dwFlags,
    DISPPARAMS *pDispParams,
    VARIANT *pVarResult,
    EXCEPINFO *pExcepInfo,
    UINT *pArgErr,
    UINT cVarRef,
    UINT *rgVarRefIdx,
    VARIANTARG *rgVarRef);

#endif  /* __IDispatch_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IEnumVARIANT interface
 */
#ifndef __IEnumVARIANT_INTERFACE_DEFINED__
#define __IEnumVARIANT_INTERFACE_DEFINED__

typedef IEnumVARIANT *LPENUMVARIANT;

DEFINE_GUID(IID_IEnumVARIANT, 0x00020404, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00020404-0000-0000-c000-000000000046")
IEnumVARIANT : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        VARIANT *rgVar,
        ULONG *pCeltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumVARIANT **ppEnum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumVARIANT, 0x00020404, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IEnumVARIANTVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumVARIANT *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumVARIANT *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumVARIANT *This);

    /*** IEnumVARIANT methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumVARIANT *This,
        ULONG celt,
        VARIANT *rgVar,
        ULONG *pCeltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumVARIANT *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumVARIANT *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumVARIANT *This,
        IEnumVARIANT **ppEnum);

    END_INTERFACE
} IEnumVARIANTVtbl;

interface IEnumVARIANT {
    CONST_VTBL IEnumVARIANTVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumVARIANT_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumVARIANT_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumVARIANT_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumVARIANT methods ***/
#define IEnumVARIANT_Next(This,celt,rgVar,pCeltFetched) (This)->lpVtbl->Next(This,celt,rgVar,pCeltFetched)
#define IEnumVARIANT_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumVARIANT_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumVARIANT_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IEnumVARIANT_QueryInterface(IEnumVARIANT* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumVARIANT_AddRef(IEnumVARIANT* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumVARIANT_Release(IEnumVARIANT* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumVARIANT methods ***/
static __WIDL_INLINE HRESULT IEnumVARIANT_Next(IEnumVARIANT* This,ULONG celt,VARIANT *rgVar,ULONG *pCeltFetched) {
    return This->lpVtbl->Next(This,celt,rgVar,pCeltFetched);
}
static __WIDL_INLINE HRESULT IEnumVARIANT_Skip(IEnumVARIANT* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static __WIDL_INLINE HRESULT IEnumVARIANT_Reset(IEnumVARIANT* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE HRESULT IEnumVARIANT_Clone(IEnumVARIANT* This,IEnumVARIANT **ppEnum) {
    return This->lpVtbl->Clone(This,ppEnum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEnumVARIANT_RemoteNext_Proxy(
    IEnumVARIANT* This,
    ULONG celt,
    VARIANT *rgVar,
    ULONG *pCeltFetched);
void __RPC_STUB IEnumVARIANT_RemoteNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumVARIANT_Next_Proxy(
    IEnumVARIANT* This,
    ULONG celt,
    VARIANT *rgVar,
    ULONG *pCeltFetched);
HRESULT __RPC_STUB IEnumVARIANT_Next_Stub(
    IEnumVARIANT* This,
    ULONG celt,
    VARIANT *rgVar,
    ULONG *pCeltFetched);

#endif  /* __IEnumVARIANT_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ITypeComp interface
 */
#ifndef __ITypeComp_INTERFACE_DEFINED__
#define __ITypeComp_INTERFACE_DEFINED__

typedef ITypeComp *LPTYPECOMP;

typedef enum tagDESCKIND {
    DESCKIND_NONE = 0,
    DESCKIND_FUNCDESC = 1,
    DESCKIND_VARDESC = 2,
    DESCKIND_TYPECOMP = 3,
    DESCKIND_IMPLICITAPPOBJ = 4,
    DESCKIND_MAX = 5
} DESCKIND;

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

DEFINE_GUID(IID_ITypeComp, 0x00020403, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00020403-0000-0000-c000-000000000046")
ITypeComp : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Bind(
        LPOLESTR szName,
        ULONG lHashVal,
        WORD wFlags,
        ITypeInfo **ppTInfo,
        DESCKIND *pDescKind,
        BINDPTR *pBindPtr) = 0;

    virtual HRESULT STDMETHODCALLTYPE BindType(
        LPOLESTR szName,
        ULONG lHashVal,
        ITypeInfo **ppTInfo,
        ITypeComp **ppTComp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITypeComp, 0x00020403, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ITypeCompVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITypeComp *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITypeComp *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITypeComp *This);

    /*** ITypeComp methods ***/
    HRESULT (STDMETHODCALLTYPE *Bind)(
        ITypeComp *This,
        LPOLESTR szName,
        ULONG lHashVal,
        WORD wFlags,
        ITypeInfo **ppTInfo,
        DESCKIND *pDescKind,
        BINDPTR *pBindPtr);

    HRESULT (STDMETHODCALLTYPE *BindType)(
        ITypeComp *This,
        LPOLESTR szName,
        ULONG lHashVal,
        ITypeInfo **ppTInfo,
        ITypeComp **ppTComp);

    END_INTERFACE
} ITypeCompVtbl;

interface ITypeComp {
    CONST_VTBL ITypeCompVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITypeComp_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITypeComp_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITypeComp_Release(This) (This)->lpVtbl->Release(This)
/*** ITypeComp methods ***/
#define ITypeComp_Bind(This,szName,lHashVal,wFlags,ppTInfo,pDescKind,pBindPtr) (This)->lpVtbl->Bind(This,szName,lHashVal,wFlags,ppTInfo,pDescKind,pBindPtr)
#define ITypeComp_BindType(This,szName,lHashVal,ppTInfo,ppTComp) (This)->lpVtbl->BindType(This,szName,lHashVal,ppTInfo,ppTComp)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITypeComp_QueryInterface(ITypeComp* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITypeComp_AddRef(ITypeComp* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITypeComp_Release(ITypeComp* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypeComp methods ***/
static __WIDL_INLINE HRESULT ITypeComp_Bind(ITypeComp* This,LPOLESTR szName,ULONG lHashVal,WORD wFlags,ITypeInfo **ppTInfo,DESCKIND *pDescKind,BINDPTR *pBindPtr) {
    return This->lpVtbl->Bind(This,szName,lHashVal,wFlags,ppTInfo,pDescKind,pBindPtr);
}
static __WIDL_INLINE HRESULT ITypeComp_BindType(ITypeComp* This,LPOLESTR szName,ULONG lHashVal,ITypeInfo **ppTInfo,ITypeComp **ppTComp) {
    return This->lpVtbl->BindType(This,szName,lHashVal,ppTInfo,ppTComp);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITypeComp_RemoteBind_Proxy(
    ITypeComp* This,
    LPOLESTR szName,
    ULONG lHashVal,
    WORD wFlags,
    ITypeInfo **ppTInfo,
    DESCKIND *pDescKind,
    LPFUNCDESC *ppFuncDesc,
    LPVARDESC *ppVarDesc,
    ITypeComp **ppTypeComp,
    CLEANLOCALSTORAGE *pDummy);
void __RPC_STUB ITypeComp_RemoteBind_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeComp_RemoteBindType_Proxy(
    ITypeComp* This,
    LPOLESTR szName,
    ULONG lHashVal,
    ITypeInfo **ppTInfo);
void __RPC_STUB ITypeComp_RemoteBindType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK ITypeComp_Bind_Proxy(
    ITypeComp* This,
    LPOLESTR szName,
    ULONG lHashVal,
    WORD wFlags,
    ITypeInfo **ppTInfo,
    DESCKIND *pDescKind,
    BINDPTR *pBindPtr);
HRESULT __RPC_STUB ITypeComp_Bind_Stub(
    ITypeComp* This,
    LPOLESTR szName,
    ULONG lHashVal,
    WORD wFlags,
    ITypeInfo **ppTInfo,
    DESCKIND *pDescKind,
    LPFUNCDESC *ppFuncDesc,
    LPVARDESC *ppVarDesc,
    ITypeComp **ppTypeComp,
    CLEANLOCALSTORAGE *pDummy);
HRESULT CALLBACK ITypeComp_BindType_Proxy(
    ITypeComp* This,
    LPOLESTR szName,
    ULONG lHashVal,
    ITypeInfo **ppTInfo,
    ITypeComp **ppTComp);
HRESULT __RPC_STUB ITypeComp_BindType_Stub(
    ITypeComp* This,
    LPOLESTR szName,
    ULONG lHashVal,
    ITypeInfo **ppTInfo);

#endif  /* __ITypeComp_INTERFACE_DEFINED__ */

#endif

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
/*****************************************************************************
 * ITypeInfo interface
 */
#ifndef __ITypeInfo_INTERFACE_DEFINED__
#define __ITypeInfo_INTERFACE_DEFINED__

typedef ITypeInfo *LPTYPEINFO;

DEFINE_GUID(IID_ITypeInfo, 0x00020401, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00020401-0000-0000-c000-000000000046")
ITypeInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetTypeAttr(
        TYPEATTR **ppTypeAttr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTypeComp(
        ITypeComp **ppTComp) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFuncDesc(
        UINT index,
        FUNCDESC **ppFuncDesc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVarDesc(
        UINT index,
        VARDESC **ppVarDesc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNames(
        MEMBERID memid,
        BSTR *rgBstrNames,
        UINT cMaxNames,
        UINT *pcNames) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRefTypeOfImplType(
        UINT index,
        HREFTYPE *pRefType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetImplTypeFlags(
        UINT index,
        INT *pImplTypeFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(
        LPOLESTR *rgszNames,
        UINT cNames,
        MEMBERID *pMemId) = 0;

    virtual HRESULT STDMETHODCALLTYPE Invoke(
        PVOID pvInstance,
        MEMBERID memid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocumentation(
        MEMBERID memid,
        BSTR *pBstrName,
        BSTR *pBstrDocString,
        DWORD *pdwHelpContext,
        BSTR *pBstrHelpFile) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDllEntry(
        MEMBERID memid,
        INVOKEKIND invKind,
        BSTR *pBstrDllName,
        BSTR *pBstrName,
        WORD *pwOrdinal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRefTypeInfo(
        HREFTYPE hRefType,
        ITypeInfo **ppTInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddressOfMember(
        MEMBERID memid,
        INVOKEKIND invKind,
        PVOID *ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
        IUnknown *pUnkOuter,
        REFIID riid,
        PVOID *ppvObj) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMops(
        MEMBERID memid,
        BSTR *pBstrMops) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContainingTypeLib(
        ITypeLib **ppTLib,
        UINT *pIndex) = 0;

    virtual void STDMETHODCALLTYPE ReleaseTypeAttr(
        TYPEATTR *pTypeAttr) = 0;

    virtual void STDMETHODCALLTYPE ReleaseFuncDesc(
        FUNCDESC *pFuncDesc) = 0;

    virtual void STDMETHODCALLTYPE ReleaseVarDesc(
        VARDESC *pVarDesc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITypeInfo, 0x00020401, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ITypeInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITypeInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITypeInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITypeInfo *This);

    /*** ITypeInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeAttr)(
        ITypeInfo *This,
        TYPEATTR **ppTypeAttr);

    HRESULT (STDMETHODCALLTYPE *GetTypeComp)(
        ITypeInfo *This,
        ITypeComp **ppTComp);

    HRESULT (STDMETHODCALLTYPE *GetFuncDesc)(
        ITypeInfo *This,
        UINT index,
        FUNCDESC **ppFuncDesc);

    HRESULT (STDMETHODCALLTYPE *GetVarDesc)(
        ITypeInfo *This,
        UINT index,
        VARDESC **ppVarDesc);

    HRESULT (STDMETHODCALLTYPE *GetNames)(
        ITypeInfo *This,
        MEMBERID memid,
        BSTR *rgBstrNames,
        UINT cMaxNames,
        UINT *pcNames);

    HRESULT (STDMETHODCALLTYPE *GetRefTypeOfImplType)(
        ITypeInfo *This,
        UINT index,
        HREFTYPE *pRefType);

    HRESULT (STDMETHODCALLTYPE *GetImplTypeFlags)(
        ITypeInfo *This,
        UINT index,
        INT *pImplTypeFlags);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITypeInfo *This,
        LPOLESTR *rgszNames,
        UINT cNames,
        MEMBERID *pMemId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITypeInfo *This,
        PVOID pvInstance,
        MEMBERID memid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    HRESULT (STDMETHODCALLTYPE *GetDocumentation)(
        ITypeInfo *This,
        MEMBERID memid,
        BSTR *pBstrName,
        BSTR *pBstrDocString,
        DWORD *pdwHelpContext,
        BSTR *pBstrHelpFile);

    HRESULT (STDMETHODCALLTYPE *GetDllEntry)(
        ITypeInfo *This,
        MEMBERID memid,
        INVOKEKIND invKind,
        BSTR *pBstrDllName,
        BSTR *pBstrName,
        WORD *pwOrdinal);

    HRESULT (STDMETHODCALLTYPE *GetRefTypeInfo)(
        ITypeInfo *This,
        HREFTYPE hRefType,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *AddressOfMember)(
        ITypeInfo *This,
        MEMBERID memid,
        INVOKEKIND invKind,
        PVOID *ppv);

    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        ITypeInfo *This,
        IUnknown *pUnkOuter,
        REFIID riid,
        PVOID *ppvObj);

    HRESULT (STDMETHODCALLTYPE *GetMops)(
        ITypeInfo *This,
        MEMBERID memid,
        BSTR *pBstrMops);

    HRESULT (STDMETHODCALLTYPE *GetContainingTypeLib)(
        ITypeInfo *This,
        ITypeLib **ppTLib,
        UINT *pIndex);

    void (STDMETHODCALLTYPE *ReleaseTypeAttr)(
        ITypeInfo *This,
        TYPEATTR *pTypeAttr);

    void (STDMETHODCALLTYPE *ReleaseFuncDesc)(
        ITypeInfo *This,
        FUNCDESC *pFuncDesc);

    void (STDMETHODCALLTYPE *ReleaseVarDesc)(
        ITypeInfo *This,
        VARDESC *pVarDesc);

    END_INTERFACE
} ITypeInfoVtbl;

interface ITypeInfo {
    CONST_VTBL ITypeInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITypeInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITypeInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITypeInfo_Release(This) (This)->lpVtbl->Release(This)
/*** ITypeInfo methods ***/
#define ITypeInfo_GetTypeAttr(This,ppTypeAttr) (This)->lpVtbl->GetTypeAttr(This,ppTypeAttr)
#define ITypeInfo_GetTypeComp(This,ppTComp) (This)->lpVtbl->GetTypeComp(This,ppTComp)
#define ITypeInfo_GetFuncDesc(This,index,ppFuncDesc) (This)->lpVtbl->GetFuncDesc(This,index,ppFuncDesc)
#define ITypeInfo_GetVarDesc(This,index,ppVarDesc) (This)->lpVtbl->GetVarDesc(This,index,ppVarDesc)
#define ITypeInfo_GetNames(This,memid,rgBstrNames,cMaxNames,pcNames) (This)->lpVtbl->GetNames(This,memid,rgBstrNames,cMaxNames,pcNames)
#define ITypeInfo_GetRefTypeOfImplType(This,index,pRefType) (This)->lpVtbl->GetRefTypeOfImplType(This,index,pRefType)
#define ITypeInfo_GetImplTypeFlags(This,index,pImplTypeFlags) (This)->lpVtbl->GetImplTypeFlags(This,index,pImplTypeFlags)
#define ITypeInfo_GetIDsOfNames(This,rgszNames,cNames,pMemId) (This)->lpVtbl->GetIDsOfNames(This,rgszNames,cNames,pMemId)
#define ITypeInfo_Invoke(This,pvInstance,memid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,pvInstance,memid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ITypeInfo_GetDocumentation(This,memid,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile) (This)->lpVtbl->GetDocumentation(This,memid,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile)
#define ITypeInfo_GetDllEntry(This,memid,invKind,pBstrDllName,pBstrName,pwOrdinal) (This)->lpVtbl->GetDllEntry(This,memid,invKind,pBstrDllName,pBstrName,pwOrdinal)
#define ITypeInfo_GetRefTypeInfo(This,hRefType,ppTInfo) (This)->lpVtbl->GetRefTypeInfo(This,hRefType,ppTInfo)
#define ITypeInfo_AddressOfMember(This,memid,invKind,ppv) (This)->lpVtbl->AddressOfMember(This,memid,invKind,ppv)
#define ITypeInfo_CreateInstance(This,pUnkOuter,riid,ppvObj) (This)->lpVtbl->CreateInstance(This,pUnkOuter,riid,ppvObj)
#define ITypeInfo_GetMops(This,memid,pBstrMops) (This)->lpVtbl->GetMops(This,memid,pBstrMops)
#define ITypeInfo_GetContainingTypeLib(This,ppTLib,pIndex) (This)->lpVtbl->GetContainingTypeLib(This,ppTLib,pIndex)
#define ITypeInfo_ReleaseTypeAttr(This,pTypeAttr) (This)->lpVtbl->ReleaseTypeAttr(This,pTypeAttr)
#define ITypeInfo_ReleaseFuncDesc(This,pFuncDesc) (This)->lpVtbl->ReleaseFuncDesc(This,pFuncDesc)
#define ITypeInfo_ReleaseVarDesc(This,pVarDesc) (This)->lpVtbl->ReleaseVarDesc(This,pVarDesc)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITypeInfo_QueryInterface(ITypeInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITypeInfo_AddRef(ITypeInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITypeInfo_Release(ITypeInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypeInfo methods ***/
static __WIDL_INLINE HRESULT ITypeInfo_GetTypeAttr(ITypeInfo* This,TYPEATTR **ppTypeAttr) {
    return This->lpVtbl->GetTypeAttr(This,ppTypeAttr);
}
static __WIDL_INLINE HRESULT ITypeInfo_GetTypeComp(ITypeInfo* This,ITypeComp **ppTComp) {
    return This->lpVtbl->GetTypeComp(This,ppTComp);
}
static __WIDL_INLINE HRESULT ITypeInfo_GetFuncDesc(ITypeInfo* This,UINT index,FUNCDESC **ppFuncDesc) {
    return This->lpVtbl->GetFuncDesc(This,index,ppFuncDesc);
}
static __WIDL_INLINE HRESULT ITypeInfo_GetVarDesc(ITypeInfo* This,UINT index,VARDESC **ppVarDesc) {
    return This->lpVtbl->GetVarDesc(This,index,ppVarDesc);
}
static __WIDL_INLINE HRESULT ITypeInfo_GetNames(ITypeInfo* This,MEMBERID memid,BSTR *rgBstrNames,UINT cMaxNames,UINT *pcNames) {
    return This->lpVtbl->GetNames(This,memid,rgBstrNames,cMaxNames,pcNames);
}
static __WIDL_INLINE HRESULT ITypeInfo_GetRefTypeOfImplType(ITypeInfo* This,UINT index,HREFTYPE *pRefType) {
    return This->lpVtbl->GetRefTypeOfImplType(This,index,pRefType);
}
static __WIDL_INLINE HRESULT ITypeInfo_GetImplTypeFlags(ITypeInfo* This,UINT index,INT *pImplTypeFlags) {
    return This->lpVtbl->GetImplTypeFlags(This,index,pImplTypeFlags);
}
static __WIDL_INLINE HRESULT ITypeInfo_GetIDsOfNames(ITypeInfo* This,LPOLESTR *rgszNames,UINT cNames,MEMBERID *pMemId) {
    return This->lpVtbl->GetIDsOfNames(This,rgszNames,cNames,pMemId);
}
static __WIDL_INLINE HRESULT ITypeInfo_Invoke(ITypeInfo* This,PVOID pvInstance,MEMBERID memid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,pvInstance,memid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
static __WIDL_INLINE HRESULT ITypeInfo_GetDocumentation(ITypeInfo* This,MEMBERID memid,BSTR *pBstrName,BSTR *pBstrDocString,DWORD *pdwHelpContext,BSTR *pBstrHelpFile) {
    return This->lpVtbl->GetDocumentation(This,memid,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile);
}
static __WIDL_INLINE HRESULT ITypeInfo_GetDllEntry(ITypeInfo* This,MEMBERID memid,INVOKEKIND invKind,BSTR *pBstrDllName,BSTR *pBstrName,WORD *pwOrdinal) {
    return This->lpVtbl->GetDllEntry(This,memid,invKind,pBstrDllName,pBstrName,pwOrdinal);
}
static __WIDL_INLINE HRESULT ITypeInfo_GetRefTypeInfo(ITypeInfo* This,HREFTYPE hRefType,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetRefTypeInfo(This,hRefType,ppTInfo);
}
static __WIDL_INLINE HRESULT ITypeInfo_AddressOfMember(ITypeInfo* This,MEMBERID memid,INVOKEKIND invKind,PVOID *ppv) {
    return This->lpVtbl->AddressOfMember(This,memid,invKind,ppv);
}
static __WIDL_INLINE HRESULT ITypeInfo_CreateInstance(ITypeInfo* This,IUnknown *pUnkOuter,REFIID riid,PVOID *ppvObj) {
    return This->lpVtbl->CreateInstance(This,pUnkOuter,riid,ppvObj);
}
static __WIDL_INLINE HRESULT ITypeInfo_GetMops(ITypeInfo* This,MEMBERID memid,BSTR *pBstrMops) {
    return This->lpVtbl->GetMops(This,memid,pBstrMops);
}
static __WIDL_INLINE HRESULT ITypeInfo_GetContainingTypeLib(ITypeInfo* This,ITypeLib **ppTLib,UINT *pIndex) {
    return This->lpVtbl->GetContainingTypeLib(This,ppTLib,pIndex);
}
static __WIDL_INLINE void ITypeInfo_ReleaseTypeAttr(ITypeInfo* This,TYPEATTR *pTypeAttr) {
    This->lpVtbl->ReleaseTypeAttr(This,pTypeAttr);
}
static __WIDL_INLINE void ITypeInfo_ReleaseFuncDesc(ITypeInfo* This,FUNCDESC *pFuncDesc) {
    This->lpVtbl->ReleaseFuncDesc(This,pFuncDesc);
}
static __WIDL_INLINE void ITypeInfo_ReleaseVarDesc(ITypeInfo* This,VARDESC *pVarDesc) {
    This->lpVtbl->ReleaseVarDesc(This,pVarDesc);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITypeInfo_RemoteGetTypeAttr_Proxy(
    ITypeInfo* This,
    LPTYPEATTR *ppTypeAttr,
    CLEANLOCALSTORAGE *pDummy);
void __RPC_STUB ITypeInfo_RemoteGetTypeAttr_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_RemoteGetFuncDesc_Proxy(
    ITypeInfo* This,
    UINT index,
    LPFUNCDESC *ppFuncDesc,
    CLEANLOCALSTORAGE *pDummy);
void __RPC_STUB ITypeInfo_RemoteGetFuncDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_RemoteGetVarDesc_Proxy(
    ITypeInfo* This,
    UINT index,
    LPVARDESC *ppVarDesc,
    CLEANLOCALSTORAGE *pDummy);
void __RPC_STUB ITypeInfo_RemoteGetVarDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_RemoteGetNames_Proxy(
    ITypeInfo* This,
    MEMBERID memid,
    BSTR *rgBstrNames,
    UINT cMaxNames,
    UINT *pcNames);
void __RPC_STUB ITypeInfo_RemoteGetNames_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_LocalGetIDsOfNames_Proxy(
    ITypeInfo* This);
void __RPC_STUB ITypeInfo_LocalGetIDsOfNames_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_LocalInvoke_Proxy(
    ITypeInfo* This);
void __RPC_STUB ITypeInfo_LocalInvoke_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_RemoteGetDocumentation_Proxy(
    ITypeInfo* This,
    MEMBERID memid,
    DWORD refPtrFlags,
    BSTR *pBstrName,
    BSTR *pBstrDocString,
    DWORD *pdwHelpContext,
    BSTR *pBstrHelpFile);
void __RPC_STUB ITypeInfo_RemoteGetDocumentation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_RemoteGetDllEntry_Proxy(
    ITypeInfo* This,
    MEMBERID memid,
    INVOKEKIND invKind,
    DWORD refPtrFlags,
    BSTR *pBstrDllName,
    BSTR *pBstrName,
    WORD *pwOrdinal);
void __RPC_STUB ITypeInfo_RemoteGetDllEntry_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_LocalAddressOfMember_Proxy(
    ITypeInfo* This);
void __RPC_STUB ITypeInfo_LocalAddressOfMember_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_RemoteCreateInstance_Proxy(
    ITypeInfo* This,
    REFIID riid,
    IUnknown **ppvObj);
void __RPC_STUB ITypeInfo_RemoteCreateInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_RemoteGetContainingTypeLib_Proxy(
    ITypeInfo* This,
    ITypeLib **ppTLib,
    UINT *pIndex);
void __RPC_STUB ITypeInfo_RemoteGetContainingTypeLib_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_LocalReleaseTypeAttr_Proxy(
    ITypeInfo* This);
void __RPC_STUB ITypeInfo_LocalReleaseTypeAttr_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_LocalReleaseFuncDesc_Proxy(
    ITypeInfo* This);
void __RPC_STUB ITypeInfo_LocalReleaseFuncDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeInfo_LocalReleaseVarDesc_Proxy(
    ITypeInfo* This);
void __RPC_STUB ITypeInfo_LocalReleaseVarDesc_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK ITypeInfo_GetTypeAttr_Proxy(
    ITypeInfo* This,
    TYPEATTR **ppTypeAttr);
HRESULT __RPC_STUB ITypeInfo_GetTypeAttr_Stub(
    ITypeInfo* This,
    LPTYPEATTR *ppTypeAttr,
    CLEANLOCALSTORAGE *pDummy);
HRESULT CALLBACK ITypeInfo_GetFuncDesc_Proxy(
    ITypeInfo* This,
    UINT index,
    FUNCDESC **ppFuncDesc);
HRESULT __RPC_STUB ITypeInfo_GetFuncDesc_Stub(
    ITypeInfo* This,
    UINT index,
    LPFUNCDESC *ppFuncDesc,
    CLEANLOCALSTORAGE *pDummy);
HRESULT CALLBACK ITypeInfo_GetVarDesc_Proxy(
    ITypeInfo* This,
    UINT index,
    VARDESC **ppVarDesc);
HRESULT __RPC_STUB ITypeInfo_GetVarDesc_Stub(
    ITypeInfo* This,
    UINT index,
    LPVARDESC *ppVarDesc,
    CLEANLOCALSTORAGE *pDummy);
HRESULT CALLBACK ITypeInfo_GetNames_Proxy(
    ITypeInfo* This,
    MEMBERID memid,
    BSTR *rgBstrNames,
    UINT cMaxNames,
    UINT *pcNames);
HRESULT __RPC_STUB ITypeInfo_GetNames_Stub(
    ITypeInfo* This,
    MEMBERID memid,
    BSTR *rgBstrNames,
    UINT cMaxNames,
    UINT *pcNames);
HRESULT CALLBACK ITypeInfo_GetIDsOfNames_Proxy(
    ITypeInfo* This,
    LPOLESTR *rgszNames,
    UINT cNames,
    MEMBERID *pMemId);
HRESULT __RPC_STUB ITypeInfo_GetIDsOfNames_Stub(
    ITypeInfo* This);
HRESULT CALLBACK ITypeInfo_Invoke_Proxy(
    ITypeInfo* This,
    PVOID pvInstance,
    MEMBERID memid,
    WORD wFlags,
    DISPPARAMS *pDispParams,
    VARIANT *pVarResult,
    EXCEPINFO *pExcepInfo,
    UINT *puArgErr);
HRESULT __RPC_STUB ITypeInfo_Invoke_Stub(
    ITypeInfo* This);
HRESULT CALLBACK ITypeInfo_GetDocumentation_Proxy(
    ITypeInfo* This,
    MEMBERID memid,
    BSTR *pBstrName,
    BSTR *pBstrDocString,
    DWORD *pdwHelpContext,
    BSTR *pBstrHelpFile);
HRESULT __RPC_STUB ITypeInfo_GetDocumentation_Stub(
    ITypeInfo* This,
    MEMBERID memid,
    DWORD refPtrFlags,
    BSTR *pBstrName,
    BSTR *pBstrDocString,
    DWORD *pdwHelpContext,
    BSTR *pBstrHelpFile);
HRESULT CALLBACK ITypeInfo_GetDllEntry_Proxy(
    ITypeInfo* This,
    MEMBERID memid,
    INVOKEKIND invKind,
    BSTR *pBstrDllName,
    BSTR *pBstrName,
    WORD *pwOrdinal);
HRESULT __RPC_STUB ITypeInfo_GetDllEntry_Stub(
    ITypeInfo* This,
    MEMBERID memid,
    INVOKEKIND invKind,
    DWORD refPtrFlags,
    BSTR *pBstrDllName,
    BSTR *pBstrName,
    WORD *pwOrdinal);
HRESULT CALLBACK ITypeInfo_AddressOfMember_Proxy(
    ITypeInfo* This,
    MEMBERID memid,
    INVOKEKIND invKind,
    PVOID *ppv);
HRESULT __RPC_STUB ITypeInfo_AddressOfMember_Stub(
    ITypeInfo* This);
HRESULT CALLBACK ITypeInfo_CreateInstance_Proxy(
    ITypeInfo* This,
    IUnknown *pUnkOuter,
    REFIID riid,
    PVOID *ppvObj);
HRESULT __RPC_STUB ITypeInfo_CreateInstance_Stub(
    ITypeInfo* This,
    REFIID riid,
    IUnknown **ppvObj);
HRESULT CALLBACK ITypeInfo_GetContainingTypeLib_Proxy(
    ITypeInfo* This,
    ITypeLib **ppTLib,
    UINT *pIndex);
HRESULT __RPC_STUB ITypeInfo_GetContainingTypeLib_Stub(
    ITypeInfo* This,
    ITypeLib **ppTLib,
    UINT *pIndex);
void CALLBACK ITypeInfo_ReleaseTypeAttr_Proxy(
    ITypeInfo* This,
    TYPEATTR *pTypeAttr);
HRESULT __RPC_STUB ITypeInfo_ReleaseTypeAttr_Stub(
    ITypeInfo* This);
void CALLBACK ITypeInfo_ReleaseFuncDesc_Proxy(
    ITypeInfo* This,
    FUNCDESC *pFuncDesc);
HRESULT __RPC_STUB ITypeInfo_ReleaseFuncDesc_Stub(
    ITypeInfo* This);
void CALLBACK ITypeInfo_ReleaseVarDesc_Proxy(
    ITypeInfo* This,
    VARDESC *pVarDesc);
HRESULT __RPC_STUB ITypeInfo_ReleaseVarDesc_Stub(
    ITypeInfo* This);

#endif  /* __ITypeInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ITypeInfo2 interface
 */
#ifndef __ITypeInfo2_INTERFACE_DEFINED__
#define __ITypeInfo2_INTERFACE_DEFINED__

typedef ITypeInfo2 *LPTYPEINFO2;

DEFINE_GUID(IID_ITypeInfo2, 0x00020412, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00020412-0000-0000-c000-000000000046")
ITypeInfo2 : public ITypeInfo
{
    virtual HRESULT STDMETHODCALLTYPE GetTypeKind(
        TYPEKIND *pTypeKind) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTypeFlags(
        ULONG *pTypeFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFuncIndexOfMemId(
        MEMBERID memid,
        INVOKEKIND invKind,
        UINT *pFuncIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVarIndexOfMemId(
        MEMBERID memid,
        UINT *pVarIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCustData(
        REFGUID guid,
        VARIANT *pVarVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFuncCustData(
        UINT index,
        REFGUID guid,
        VARIANT *pVarVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetParamCustData(
        UINT indexFunc,
        UINT indexParam,
        REFGUID guid,
        VARIANT *pVarVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVarCustData(
        UINT index,
        REFGUID guid,
        VARIANT *pVarVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetImplTypeCustData(
        UINT index,
        REFGUID guid,
        VARIANT *pVarVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocumentation2(
        MEMBERID memid,
        LCID lcid,
        BSTR *pbstrHelpString,
        DWORD *pdwHelpStringContext,
        BSTR *pbstrHelpStringDll) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllCustData(
        CUSTDATA *pCustData) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllFuncCustData(
        UINT index,
        CUSTDATA *pCustData) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllParamCustData(
        UINT indexFunc,
        UINT indexParam,
        CUSTDATA *pCustData) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllVarCustData(
        UINT index,
        CUSTDATA *pCustData) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllImplTypeCustData(
        UINT index,
        CUSTDATA *pCustData) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITypeInfo2, 0x00020412, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ITypeInfo2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITypeInfo2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITypeInfo2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITypeInfo2 *This);

    /*** ITypeInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeAttr)(
        ITypeInfo2 *This,
        TYPEATTR **ppTypeAttr);

    HRESULT (STDMETHODCALLTYPE *GetTypeComp)(
        ITypeInfo2 *This,
        ITypeComp **ppTComp);

    HRESULT (STDMETHODCALLTYPE *GetFuncDesc)(
        ITypeInfo2 *This,
        UINT index,
        FUNCDESC **ppFuncDesc);

    HRESULT (STDMETHODCALLTYPE *GetVarDesc)(
        ITypeInfo2 *This,
        UINT index,
        VARDESC **ppVarDesc);

    HRESULT (STDMETHODCALLTYPE *GetNames)(
        ITypeInfo2 *This,
        MEMBERID memid,
        BSTR *rgBstrNames,
        UINT cMaxNames,
        UINT *pcNames);

    HRESULT (STDMETHODCALLTYPE *GetRefTypeOfImplType)(
        ITypeInfo2 *This,
        UINT index,
        HREFTYPE *pRefType);

    HRESULT (STDMETHODCALLTYPE *GetImplTypeFlags)(
        ITypeInfo2 *This,
        UINT index,
        INT *pImplTypeFlags);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITypeInfo2 *This,
        LPOLESTR *rgszNames,
        UINT cNames,
        MEMBERID *pMemId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITypeInfo2 *This,
        PVOID pvInstance,
        MEMBERID memid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    HRESULT (STDMETHODCALLTYPE *GetDocumentation)(
        ITypeInfo2 *This,
        MEMBERID memid,
        BSTR *pBstrName,
        BSTR *pBstrDocString,
        DWORD *pdwHelpContext,
        BSTR *pBstrHelpFile);

    HRESULT (STDMETHODCALLTYPE *GetDllEntry)(
        ITypeInfo2 *This,
        MEMBERID memid,
        INVOKEKIND invKind,
        BSTR *pBstrDllName,
        BSTR *pBstrName,
        WORD *pwOrdinal);

    HRESULT (STDMETHODCALLTYPE *GetRefTypeInfo)(
        ITypeInfo2 *This,
        HREFTYPE hRefType,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *AddressOfMember)(
        ITypeInfo2 *This,
        MEMBERID memid,
        INVOKEKIND invKind,
        PVOID *ppv);

    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        ITypeInfo2 *This,
        IUnknown *pUnkOuter,
        REFIID riid,
        PVOID *ppvObj);

    HRESULT (STDMETHODCALLTYPE *GetMops)(
        ITypeInfo2 *This,
        MEMBERID memid,
        BSTR *pBstrMops);

    HRESULT (STDMETHODCALLTYPE *GetContainingTypeLib)(
        ITypeInfo2 *This,
        ITypeLib **ppTLib,
        UINT *pIndex);

    void (STDMETHODCALLTYPE *ReleaseTypeAttr)(
        ITypeInfo2 *This,
        TYPEATTR *pTypeAttr);

    void (STDMETHODCALLTYPE *ReleaseFuncDesc)(
        ITypeInfo2 *This,
        FUNCDESC *pFuncDesc);

    void (STDMETHODCALLTYPE *ReleaseVarDesc)(
        ITypeInfo2 *This,
        VARDESC *pVarDesc);

    /*** ITypeInfo2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeKind)(
        ITypeInfo2 *This,
        TYPEKIND *pTypeKind);

    HRESULT (STDMETHODCALLTYPE *GetTypeFlags)(
        ITypeInfo2 *This,
        ULONG *pTypeFlags);

    HRESULT (STDMETHODCALLTYPE *GetFuncIndexOfMemId)(
        ITypeInfo2 *This,
        MEMBERID memid,
        INVOKEKIND invKind,
        UINT *pFuncIndex);

    HRESULT (STDMETHODCALLTYPE *GetVarIndexOfMemId)(
        ITypeInfo2 *This,
        MEMBERID memid,
        UINT *pVarIndex);

    HRESULT (STDMETHODCALLTYPE *GetCustData)(
        ITypeInfo2 *This,
        REFGUID guid,
        VARIANT *pVarVal);

    HRESULT (STDMETHODCALLTYPE *GetFuncCustData)(
        ITypeInfo2 *This,
        UINT index,
        REFGUID guid,
        VARIANT *pVarVal);

    HRESULT (STDMETHODCALLTYPE *GetParamCustData)(
        ITypeInfo2 *This,
        UINT indexFunc,
        UINT indexParam,
        REFGUID guid,
        VARIANT *pVarVal);

    HRESULT (STDMETHODCALLTYPE *GetVarCustData)(
        ITypeInfo2 *This,
        UINT index,
        REFGUID guid,
        VARIANT *pVarVal);

    HRESULT (STDMETHODCALLTYPE *GetImplTypeCustData)(
        ITypeInfo2 *This,
        UINT index,
        REFGUID guid,
        VARIANT *pVarVal);

    HRESULT (STDMETHODCALLTYPE *GetDocumentation2)(
        ITypeInfo2 *This,
        MEMBERID memid,
        LCID lcid,
        BSTR *pbstrHelpString,
        DWORD *pdwHelpStringContext,
        BSTR *pbstrHelpStringDll);

    HRESULT (STDMETHODCALLTYPE *GetAllCustData)(
        ITypeInfo2 *This,
        CUSTDATA *pCustData);

    HRESULT (STDMETHODCALLTYPE *GetAllFuncCustData)(
        ITypeInfo2 *This,
        UINT index,
        CUSTDATA *pCustData);

    HRESULT (STDMETHODCALLTYPE *GetAllParamCustData)(
        ITypeInfo2 *This,
        UINT indexFunc,
        UINT indexParam,
        CUSTDATA *pCustData);

    HRESULT (STDMETHODCALLTYPE *GetAllVarCustData)(
        ITypeInfo2 *This,
        UINT index,
        CUSTDATA *pCustData);

    HRESULT (STDMETHODCALLTYPE *GetAllImplTypeCustData)(
        ITypeInfo2 *This,
        UINT index,
        CUSTDATA *pCustData);

    END_INTERFACE
} ITypeInfo2Vtbl;

interface ITypeInfo2 {
    CONST_VTBL ITypeInfo2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITypeInfo2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITypeInfo2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITypeInfo2_Release(This) (This)->lpVtbl->Release(This)
/*** ITypeInfo methods ***/
#define ITypeInfo2_GetTypeAttr(This,ppTypeAttr) (This)->lpVtbl->GetTypeAttr(This,ppTypeAttr)
#define ITypeInfo2_GetTypeComp(This,ppTComp) (This)->lpVtbl->GetTypeComp(This,ppTComp)
#define ITypeInfo2_GetFuncDesc(This,index,ppFuncDesc) (This)->lpVtbl->GetFuncDesc(This,index,ppFuncDesc)
#define ITypeInfo2_GetVarDesc(This,index,ppVarDesc) (This)->lpVtbl->GetVarDesc(This,index,ppVarDesc)
#define ITypeInfo2_GetNames(This,memid,rgBstrNames,cMaxNames,pcNames) (This)->lpVtbl->GetNames(This,memid,rgBstrNames,cMaxNames,pcNames)
#define ITypeInfo2_GetRefTypeOfImplType(This,index,pRefType) (This)->lpVtbl->GetRefTypeOfImplType(This,index,pRefType)
#define ITypeInfo2_GetImplTypeFlags(This,index,pImplTypeFlags) (This)->lpVtbl->GetImplTypeFlags(This,index,pImplTypeFlags)
#define ITypeInfo2_GetIDsOfNames(This,rgszNames,cNames,pMemId) (This)->lpVtbl->GetIDsOfNames(This,rgszNames,cNames,pMemId)
#define ITypeInfo2_Invoke(This,pvInstance,memid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,pvInstance,memid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ITypeInfo2_GetDocumentation(This,memid,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile) (This)->lpVtbl->GetDocumentation(This,memid,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile)
#define ITypeInfo2_GetDllEntry(This,memid,invKind,pBstrDllName,pBstrName,pwOrdinal) (This)->lpVtbl->GetDllEntry(This,memid,invKind,pBstrDllName,pBstrName,pwOrdinal)
#define ITypeInfo2_GetRefTypeInfo(This,hRefType,ppTInfo) (This)->lpVtbl->GetRefTypeInfo(This,hRefType,ppTInfo)
#define ITypeInfo2_AddressOfMember(This,memid,invKind,ppv) (This)->lpVtbl->AddressOfMember(This,memid,invKind,ppv)
#define ITypeInfo2_CreateInstance(This,pUnkOuter,riid,ppvObj) (This)->lpVtbl->CreateInstance(This,pUnkOuter,riid,ppvObj)
#define ITypeInfo2_GetMops(This,memid,pBstrMops) (This)->lpVtbl->GetMops(This,memid,pBstrMops)
#define ITypeInfo2_GetContainingTypeLib(This,ppTLib,pIndex) (This)->lpVtbl->GetContainingTypeLib(This,ppTLib,pIndex)
#define ITypeInfo2_ReleaseTypeAttr(This,pTypeAttr) (This)->lpVtbl->ReleaseTypeAttr(This,pTypeAttr)
#define ITypeInfo2_ReleaseFuncDesc(This,pFuncDesc) (This)->lpVtbl->ReleaseFuncDesc(This,pFuncDesc)
#define ITypeInfo2_ReleaseVarDesc(This,pVarDesc) (This)->lpVtbl->ReleaseVarDesc(This,pVarDesc)
/*** ITypeInfo2 methods ***/
#define ITypeInfo2_GetTypeKind(This,pTypeKind) (This)->lpVtbl->GetTypeKind(This,pTypeKind)
#define ITypeInfo2_GetTypeFlags(This,pTypeFlags) (This)->lpVtbl->GetTypeFlags(This,pTypeFlags)
#define ITypeInfo2_GetFuncIndexOfMemId(This,memid,invKind,pFuncIndex) (This)->lpVtbl->GetFuncIndexOfMemId(This,memid,invKind,pFuncIndex)
#define ITypeInfo2_GetVarIndexOfMemId(This,memid,pVarIndex) (This)->lpVtbl->GetVarIndexOfMemId(This,memid,pVarIndex)
#define ITypeInfo2_GetCustData(This,guid,pVarVal) (This)->lpVtbl->GetCustData(This,guid,pVarVal)
#define ITypeInfo2_GetFuncCustData(This,index,guid,pVarVal) (This)->lpVtbl->GetFuncCustData(This,index,guid,pVarVal)
#define ITypeInfo2_GetParamCustData(This,indexFunc,indexParam,guid,pVarVal) (This)->lpVtbl->GetParamCustData(This,indexFunc,indexParam,guid,pVarVal)
#define ITypeInfo2_GetVarCustData(This,index,guid,pVarVal) (This)->lpVtbl->GetVarCustData(This,index,guid,pVarVal)
#define ITypeInfo2_GetImplTypeCustData(This,index,guid,pVarVal) (This)->lpVtbl->GetImplTypeCustData(This,index,guid,pVarVal)
#define ITypeInfo2_GetDocumentation2(This,memid,lcid,pbstrHelpString,pdwHelpStringContext,pbstrHelpStringDll) (This)->lpVtbl->GetDocumentation2(This,memid,lcid,pbstrHelpString,pdwHelpStringContext,pbstrHelpStringDll)
#define ITypeInfo2_GetAllCustData(This,pCustData) (This)->lpVtbl->GetAllCustData(This,pCustData)
#define ITypeInfo2_GetAllFuncCustData(This,index,pCustData) (This)->lpVtbl->GetAllFuncCustData(This,index,pCustData)
#define ITypeInfo2_GetAllParamCustData(This,indexFunc,indexParam,pCustData) (This)->lpVtbl->GetAllParamCustData(This,indexFunc,indexParam,pCustData)
#define ITypeInfo2_GetAllVarCustData(This,index,pCustData) (This)->lpVtbl->GetAllVarCustData(This,index,pCustData)
#define ITypeInfo2_GetAllImplTypeCustData(This,index,pCustData) (This)->lpVtbl->GetAllImplTypeCustData(This,index,pCustData)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITypeInfo2_QueryInterface(ITypeInfo2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITypeInfo2_AddRef(ITypeInfo2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITypeInfo2_Release(ITypeInfo2* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypeInfo methods ***/
static __WIDL_INLINE HRESULT ITypeInfo2_GetTypeAttr(ITypeInfo2* This,TYPEATTR **ppTypeAttr) {
    return This->lpVtbl->GetTypeAttr(This,ppTypeAttr);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetTypeComp(ITypeInfo2* This,ITypeComp **ppTComp) {
    return This->lpVtbl->GetTypeComp(This,ppTComp);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetFuncDesc(ITypeInfo2* This,UINT index,FUNCDESC **ppFuncDesc) {
    return This->lpVtbl->GetFuncDesc(This,index,ppFuncDesc);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetVarDesc(ITypeInfo2* This,UINT index,VARDESC **ppVarDesc) {
    return This->lpVtbl->GetVarDesc(This,index,ppVarDesc);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetNames(ITypeInfo2* This,MEMBERID memid,BSTR *rgBstrNames,UINT cMaxNames,UINT *pcNames) {
    return This->lpVtbl->GetNames(This,memid,rgBstrNames,cMaxNames,pcNames);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetRefTypeOfImplType(ITypeInfo2* This,UINT index,HREFTYPE *pRefType) {
    return This->lpVtbl->GetRefTypeOfImplType(This,index,pRefType);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetImplTypeFlags(ITypeInfo2* This,UINT index,INT *pImplTypeFlags) {
    return This->lpVtbl->GetImplTypeFlags(This,index,pImplTypeFlags);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetIDsOfNames(ITypeInfo2* This,LPOLESTR *rgszNames,UINT cNames,MEMBERID *pMemId) {
    return This->lpVtbl->GetIDsOfNames(This,rgszNames,cNames,pMemId);
}
static __WIDL_INLINE HRESULT ITypeInfo2_Invoke(ITypeInfo2* This,PVOID pvInstance,MEMBERID memid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,pvInstance,memid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetDocumentation(ITypeInfo2* This,MEMBERID memid,BSTR *pBstrName,BSTR *pBstrDocString,DWORD *pdwHelpContext,BSTR *pBstrHelpFile) {
    return This->lpVtbl->GetDocumentation(This,memid,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetDllEntry(ITypeInfo2* This,MEMBERID memid,INVOKEKIND invKind,BSTR *pBstrDllName,BSTR *pBstrName,WORD *pwOrdinal) {
    return This->lpVtbl->GetDllEntry(This,memid,invKind,pBstrDllName,pBstrName,pwOrdinal);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetRefTypeInfo(ITypeInfo2* This,HREFTYPE hRefType,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetRefTypeInfo(This,hRefType,ppTInfo);
}
static __WIDL_INLINE HRESULT ITypeInfo2_AddressOfMember(ITypeInfo2* This,MEMBERID memid,INVOKEKIND invKind,PVOID *ppv) {
    return This->lpVtbl->AddressOfMember(This,memid,invKind,ppv);
}
static __WIDL_INLINE HRESULT ITypeInfo2_CreateInstance(ITypeInfo2* This,IUnknown *pUnkOuter,REFIID riid,PVOID *ppvObj) {
    return This->lpVtbl->CreateInstance(This,pUnkOuter,riid,ppvObj);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetMops(ITypeInfo2* This,MEMBERID memid,BSTR *pBstrMops) {
    return This->lpVtbl->GetMops(This,memid,pBstrMops);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetContainingTypeLib(ITypeInfo2* This,ITypeLib **ppTLib,UINT *pIndex) {
    return This->lpVtbl->GetContainingTypeLib(This,ppTLib,pIndex);
}
static __WIDL_INLINE void ITypeInfo2_ReleaseTypeAttr(ITypeInfo2* This,TYPEATTR *pTypeAttr) {
    This->lpVtbl->ReleaseTypeAttr(This,pTypeAttr);
}
static __WIDL_INLINE void ITypeInfo2_ReleaseFuncDesc(ITypeInfo2* This,FUNCDESC *pFuncDesc) {
    This->lpVtbl->ReleaseFuncDesc(This,pFuncDesc);
}
static __WIDL_INLINE void ITypeInfo2_ReleaseVarDesc(ITypeInfo2* This,VARDESC *pVarDesc) {
    This->lpVtbl->ReleaseVarDesc(This,pVarDesc);
}
/*** ITypeInfo2 methods ***/
static __WIDL_INLINE HRESULT ITypeInfo2_GetTypeKind(ITypeInfo2* This,TYPEKIND *pTypeKind) {
    return This->lpVtbl->GetTypeKind(This,pTypeKind);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetTypeFlags(ITypeInfo2* This,ULONG *pTypeFlags) {
    return This->lpVtbl->GetTypeFlags(This,pTypeFlags);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetFuncIndexOfMemId(ITypeInfo2* This,MEMBERID memid,INVOKEKIND invKind,UINT *pFuncIndex) {
    return This->lpVtbl->GetFuncIndexOfMemId(This,memid,invKind,pFuncIndex);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetVarIndexOfMemId(ITypeInfo2* This,MEMBERID memid,UINT *pVarIndex) {
    return This->lpVtbl->GetVarIndexOfMemId(This,memid,pVarIndex);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetCustData(ITypeInfo2* This,REFGUID guid,VARIANT *pVarVal) {
    return This->lpVtbl->GetCustData(This,guid,pVarVal);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetFuncCustData(ITypeInfo2* This,UINT index,REFGUID guid,VARIANT *pVarVal) {
    return This->lpVtbl->GetFuncCustData(This,index,guid,pVarVal);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetParamCustData(ITypeInfo2* This,UINT indexFunc,UINT indexParam,REFGUID guid,VARIANT *pVarVal) {
    return This->lpVtbl->GetParamCustData(This,indexFunc,indexParam,guid,pVarVal);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetVarCustData(ITypeInfo2* This,UINT index,REFGUID guid,VARIANT *pVarVal) {
    return This->lpVtbl->GetVarCustData(This,index,guid,pVarVal);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetImplTypeCustData(ITypeInfo2* This,UINT index,REFGUID guid,VARIANT *pVarVal) {
    return This->lpVtbl->GetImplTypeCustData(This,index,guid,pVarVal);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetDocumentation2(ITypeInfo2* This,MEMBERID memid,LCID lcid,BSTR *pbstrHelpString,DWORD *pdwHelpStringContext,BSTR *pbstrHelpStringDll) {
    return This->lpVtbl->GetDocumentation2(This,memid,lcid,pbstrHelpString,pdwHelpStringContext,pbstrHelpStringDll);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetAllCustData(ITypeInfo2* This,CUSTDATA *pCustData) {
    return This->lpVtbl->GetAllCustData(This,pCustData);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetAllFuncCustData(ITypeInfo2* This,UINT index,CUSTDATA *pCustData) {
    return This->lpVtbl->GetAllFuncCustData(This,index,pCustData);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetAllParamCustData(ITypeInfo2* This,UINT indexFunc,UINT indexParam,CUSTDATA *pCustData) {
    return This->lpVtbl->GetAllParamCustData(This,indexFunc,indexParam,pCustData);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetAllVarCustData(ITypeInfo2* This,UINT index,CUSTDATA *pCustData) {
    return This->lpVtbl->GetAllVarCustData(This,index,pCustData);
}
static __WIDL_INLINE HRESULT ITypeInfo2_GetAllImplTypeCustData(ITypeInfo2* This,UINT index,CUSTDATA *pCustData) {
    return This->lpVtbl->GetAllImplTypeCustData(This,index,pCustData);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITypeInfo2_RemoteGetDocumentation2_Proxy(
    ITypeInfo2* This,
    MEMBERID memid,
    LCID lcid,
    DWORD refPtrFlags,
    BSTR *pbstrHelpString,
    DWORD *pdwHelpStringContext,
    BSTR *pbstrHelpStringDll);
void __RPC_STUB ITypeInfo2_RemoteGetDocumentation2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK ITypeInfo2_GetDocumentation2_Proxy(
    ITypeInfo2* This,
    MEMBERID memid,
    LCID lcid,
    BSTR *pbstrHelpString,
    DWORD *pdwHelpStringContext,
    BSTR *pbstrHelpStringDll);
HRESULT __RPC_STUB ITypeInfo2_GetDocumentation2_Stub(
    ITypeInfo2* This,
    MEMBERID memid,
    LCID lcid,
    DWORD refPtrFlags,
    BSTR *pbstrHelpString,
    DWORD *pdwHelpStringContext,
    BSTR *pbstrHelpStringDll);

#endif  /* __ITypeInfo2_INTERFACE_DEFINED__ */

#endif

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
/*****************************************************************************
 * ITypeLib interface
 */
#ifndef __ITypeLib_INTERFACE_DEFINED__
#define __ITypeLib_INTERFACE_DEFINED__

typedef enum tagSYSKIND {
    SYS_WIN16 = 0,
    SYS_WIN32 = 1,
    SYS_MAC = 2,
    SYS_WIN64 = 3
} SYSKIND;

typedef enum tagLIBFLAGS {
    LIBFLAG_FRESTRICTED = 0x1,
    LIBFLAG_FCONTROL = 0x2,
    LIBFLAG_FHIDDEN = 0x4,
    LIBFLAG_FHASDISKIMAGE = 0x8
} LIBFLAGS;

typedef ITypeLib *LPTYPELIB;

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

DEFINE_GUID(IID_ITypeLib, 0x00020402, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00020402-0000-0000-c000-000000000046")
ITypeLib : public IUnknown
{
    virtual UINT STDMETHODCALLTYPE GetTypeInfoCount(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(
        UINT index,
        ITypeInfo **ppTInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTypeInfoType(
        UINT index,
        TYPEKIND *pTKind) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTypeInfoOfGuid(
        REFGUID guid,
        ITypeInfo **ppTinfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLibAttr(
        TLIBATTR **ppTLibAttr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTypeComp(
        ITypeComp **ppTComp) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocumentation(
        INT index,
        BSTR *pBstrName,
        BSTR *pBstrDocString,
        DWORD *pdwHelpContext,
        BSTR *pBstrHelpFile) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsName(
        LPOLESTR szNameBuf,
        ULONG lHashVal,
        WINBOOL *pfName) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindName(
        LPOLESTR szNameBuf,
        ULONG lHashVal,
        ITypeInfo **ppTInfo,
        MEMBERID *rgMemId,
        USHORT *pcFound) = 0;

    virtual void STDMETHODCALLTYPE ReleaseTLibAttr(
        TLIBATTR *pTLibAttr) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITypeLib, 0x00020402, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ITypeLibVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITypeLib *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITypeLib *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITypeLib *This);

    /*** ITypeLib methods ***/
    UINT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITypeLib *This);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITypeLib *This,
        UINT index,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfoType)(
        ITypeLib *This,
        UINT index,
        TYPEKIND *pTKind);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfoOfGuid)(
        ITypeLib *This,
        REFGUID guid,
        ITypeInfo **ppTinfo);

    HRESULT (STDMETHODCALLTYPE *GetLibAttr)(
        ITypeLib *This,
        TLIBATTR **ppTLibAttr);

    HRESULT (STDMETHODCALLTYPE *GetTypeComp)(
        ITypeLib *This,
        ITypeComp **ppTComp);

    HRESULT (STDMETHODCALLTYPE *GetDocumentation)(
        ITypeLib *This,
        INT index,
        BSTR *pBstrName,
        BSTR *pBstrDocString,
        DWORD *pdwHelpContext,
        BSTR *pBstrHelpFile);

    HRESULT (STDMETHODCALLTYPE *IsName)(
        ITypeLib *This,
        LPOLESTR szNameBuf,
        ULONG lHashVal,
        WINBOOL *pfName);

    HRESULT (STDMETHODCALLTYPE *FindName)(
        ITypeLib *This,
        LPOLESTR szNameBuf,
        ULONG lHashVal,
        ITypeInfo **ppTInfo,
        MEMBERID *rgMemId,
        USHORT *pcFound);

    void (STDMETHODCALLTYPE *ReleaseTLibAttr)(
        ITypeLib *This,
        TLIBATTR *pTLibAttr);

    END_INTERFACE
} ITypeLibVtbl;

interface ITypeLib {
    CONST_VTBL ITypeLibVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITypeLib_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITypeLib_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITypeLib_Release(This) (This)->lpVtbl->Release(This)
/*** ITypeLib methods ***/
#define ITypeLib_GetTypeInfoCount(This) (This)->lpVtbl->GetTypeInfoCount(This)
#define ITypeLib_GetTypeInfo(This,index,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,index,ppTInfo)
#define ITypeLib_GetTypeInfoType(This,index,pTKind) (This)->lpVtbl->GetTypeInfoType(This,index,pTKind)
#define ITypeLib_GetTypeInfoOfGuid(This,guid,ppTinfo) (This)->lpVtbl->GetTypeInfoOfGuid(This,guid,ppTinfo)
#define ITypeLib_GetLibAttr(This,ppTLibAttr) (This)->lpVtbl->GetLibAttr(This,ppTLibAttr)
#define ITypeLib_GetTypeComp(This,ppTComp) (This)->lpVtbl->GetTypeComp(This,ppTComp)
#define ITypeLib_GetDocumentation(This,index,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile) (This)->lpVtbl->GetDocumentation(This,index,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile)
#define ITypeLib_IsName(This,szNameBuf,lHashVal,pfName) (This)->lpVtbl->IsName(This,szNameBuf,lHashVal,pfName)
#define ITypeLib_FindName(This,szNameBuf,lHashVal,ppTInfo,rgMemId,pcFound) (This)->lpVtbl->FindName(This,szNameBuf,lHashVal,ppTInfo,rgMemId,pcFound)
#define ITypeLib_ReleaseTLibAttr(This,pTLibAttr) (This)->lpVtbl->ReleaseTLibAttr(This,pTLibAttr)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITypeLib_QueryInterface(ITypeLib* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITypeLib_AddRef(ITypeLib* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITypeLib_Release(ITypeLib* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypeLib methods ***/
static __WIDL_INLINE UINT ITypeLib_GetTypeInfoCount(ITypeLib* This) {
    return This->lpVtbl->GetTypeInfoCount(This);
}
static __WIDL_INLINE HRESULT ITypeLib_GetTypeInfo(ITypeLib* This,UINT index,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,index,ppTInfo);
}
static __WIDL_INLINE HRESULT ITypeLib_GetTypeInfoType(ITypeLib* This,UINT index,TYPEKIND *pTKind) {
    return This->lpVtbl->GetTypeInfoType(This,index,pTKind);
}
static __WIDL_INLINE HRESULT ITypeLib_GetTypeInfoOfGuid(ITypeLib* This,REFGUID guid,ITypeInfo **ppTinfo) {
    return This->lpVtbl->GetTypeInfoOfGuid(This,guid,ppTinfo);
}
static __WIDL_INLINE HRESULT ITypeLib_GetLibAttr(ITypeLib* This,TLIBATTR **ppTLibAttr) {
    return This->lpVtbl->GetLibAttr(This,ppTLibAttr);
}
static __WIDL_INLINE HRESULT ITypeLib_GetTypeComp(ITypeLib* This,ITypeComp **ppTComp) {
    return This->lpVtbl->GetTypeComp(This,ppTComp);
}
static __WIDL_INLINE HRESULT ITypeLib_GetDocumentation(ITypeLib* This,INT index,BSTR *pBstrName,BSTR *pBstrDocString,DWORD *pdwHelpContext,BSTR *pBstrHelpFile) {
    return This->lpVtbl->GetDocumentation(This,index,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile);
}
static __WIDL_INLINE HRESULT ITypeLib_IsName(ITypeLib* This,LPOLESTR szNameBuf,ULONG lHashVal,WINBOOL *pfName) {
    return This->lpVtbl->IsName(This,szNameBuf,lHashVal,pfName);
}
static __WIDL_INLINE HRESULT ITypeLib_FindName(ITypeLib* This,LPOLESTR szNameBuf,ULONG lHashVal,ITypeInfo **ppTInfo,MEMBERID *rgMemId,USHORT *pcFound) {
    return This->lpVtbl->FindName(This,szNameBuf,lHashVal,ppTInfo,rgMemId,pcFound);
}
static __WIDL_INLINE void ITypeLib_ReleaseTLibAttr(ITypeLib* This,TLIBATTR *pTLibAttr) {
    This->lpVtbl->ReleaseTLibAttr(This,pTLibAttr);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITypeLib_RemoteGetTypeInfoCount_Proxy(
    ITypeLib* This,
    UINT *pcTInfo);
void __RPC_STUB ITypeLib_RemoteGetTypeInfoCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeLib_RemoteGetLibAttr_Proxy(
    ITypeLib* This,
    LPTLIBATTR *ppTLibAttr,
    CLEANLOCALSTORAGE *pDummy);
void __RPC_STUB ITypeLib_RemoteGetLibAttr_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeLib_RemoteGetDocumentation_Proxy(
    ITypeLib* This,
    INT index,
    DWORD refPtrFlags,
    BSTR *pBstrName,
    BSTR *pBstrDocString,
    DWORD *pdwHelpContext,
    BSTR *pBstrHelpFile);
void __RPC_STUB ITypeLib_RemoteGetDocumentation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeLib_RemoteIsName_Proxy(
    ITypeLib* This,
    LPOLESTR szNameBuf,
    ULONG lHashVal,
    WINBOOL *pfName,
    BSTR *pBstrLibName);
void __RPC_STUB ITypeLib_RemoteIsName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeLib_RemoteFindName_Proxy(
    ITypeLib* This,
    LPOLESTR szNameBuf,
    ULONG lHashVal,
    ITypeInfo **ppTInfo,
    MEMBERID *rgMemId,
    USHORT *pcFound,
    BSTR *pBstrLibName);
void __RPC_STUB ITypeLib_RemoteFindName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeLib_LocalReleaseTLibAttr_Proxy(
    ITypeLib* This);
void __RPC_STUB ITypeLib_LocalReleaseTLibAttr_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
UINT CALLBACK ITypeLib_GetTypeInfoCount_Proxy(
    ITypeLib* This);
HRESULT __RPC_STUB ITypeLib_GetTypeInfoCount_Stub(
    ITypeLib* This,
    UINT *pcTInfo);
HRESULT CALLBACK ITypeLib_GetLibAttr_Proxy(
    ITypeLib* This,
    TLIBATTR **ppTLibAttr);
HRESULT __RPC_STUB ITypeLib_GetLibAttr_Stub(
    ITypeLib* This,
    LPTLIBATTR *ppTLibAttr,
    CLEANLOCALSTORAGE *pDummy);
HRESULT CALLBACK ITypeLib_GetDocumentation_Proxy(
    ITypeLib* This,
    INT index,
    BSTR *pBstrName,
    BSTR *pBstrDocString,
    DWORD *pdwHelpContext,
    BSTR *pBstrHelpFile);
HRESULT __RPC_STUB ITypeLib_GetDocumentation_Stub(
    ITypeLib* This,
    INT index,
    DWORD refPtrFlags,
    BSTR *pBstrName,
    BSTR *pBstrDocString,
    DWORD *pdwHelpContext,
    BSTR *pBstrHelpFile);
HRESULT CALLBACK ITypeLib_IsName_Proxy(
    ITypeLib* This,
    LPOLESTR szNameBuf,
    ULONG lHashVal,
    WINBOOL *pfName);
HRESULT __RPC_STUB ITypeLib_IsName_Stub(
    ITypeLib* This,
    LPOLESTR szNameBuf,
    ULONG lHashVal,
    WINBOOL *pfName,
    BSTR *pBstrLibName);
HRESULT CALLBACK ITypeLib_FindName_Proxy(
    ITypeLib* This,
    LPOLESTR szNameBuf,
    ULONG lHashVal,
    ITypeInfo **ppTInfo,
    MEMBERID *rgMemId,
    USHORT *pcFound);
HRESULT __RPC_STUB ITypeLib_FindName_Stub(
    ITypeLib* This,
    LPOLESTR szNameBuf,
    ULONG lHashVal,
    ITypeInfo **ppTInfo,
    MEMBERID *rgMemId,
    USHORT *pcFound,
    BSTR *pBstrLibName);
void CALLBACK ITypeLib_ReleaseTLibAttr_Proxy(
    ITypeLib* This,
    TLIBATTR *pTLibAttr);
HRESULT __RPC_STUB ITypeLib_ReleaseTLibAttr_Stub(
    ITypeLib* This);

#endif  /* __ITypeLib_INTERFACE_DEFINED__ */

#endif

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
/*****************************************************************************
 * ITypeLib2 interface
 */
#ifndef __ITypeLib2_INTERFACE_DEFINED__
#define __ITypeLib2_INTERFACE_DEFINED__

typedef ITypeLib2 *LPTYPELIB2;

DEFINE_GUID(IID_ITypeLib2, 0x00020411, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00020411-0000-0000-c000-000000000046")
ITypeLib2 : public ITypeLib
{
    virtual HRESULT STDMETHODCALLTYPE GetCustData(
        REFGUID guid,
        VARIANT *pVarVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLibStatistics(
        ULONG *pcUniqueNames,
        ULONG *pcchUniqueNames) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocumentation2(
        INT index,
        LCID lcid,
        BSTR *pbstrHelpString,
        DWORD *pdwHelpStringContext,
        BSTR *pbstrHelpStringDll) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllCustData(
        CUSTDATA *pCustData) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITypeLib2, 0x00020411, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ITypeLib2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITypeLib2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITypeLib2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITypeLib2 *This);

    /*** ITypeLib methods ***/
    UINT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITypeLib2 *This);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITypeLib2 *This,
        UINT index,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfoType)(
        ITypeLib2 *This,
        UINT index,
        TYPEKIND *pTKind);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfoOfGuid)(
        ITypeLib2 *This,
        REFGUID guid,
        ITypeInfo **ppTinfo);

    HRESULT (STDMETHODCALLTYPE *GetLibAttr)(
        ITypeLib2 *This,
        TLIBATTR **ppTLibAttr);

    HRESULT (STDMETHODCALLTYPE *GetTypeComp)(
        ITypeLib2 *This,
        ITypeComp **ppTComp);

    HRESULT (STDMETHODCALLTYPE *GetDocumentation)(
        ITypeLib2 *This,
        INT index,
        BSTR *pBstrName,
        BSTR *pBstrDocString,
        DWORD *pdwHelpContext,
        BSTR *pBstrHelpFile);

    HRESULT (STDMETHODCALLTYPE *IsName)(
        ITypeLib2 *This,
        LPOLESTR szNameBuf,
        ULONG lHashVal,
        WINBOOL *pfName);

    HRESULT (STDMETHODCALLTYPE *FindName)(
        ITypeLib2 *This,
        LPOLESTR szNameBuf,
        ULONG lHashVal,
        ITypeInfo **ppTInfo,
        MEMBERID *rgMemId,
        USHORT *pcFound);

    void (STDMETHODCALLTYPE *ReleaseTLibAttr)(
        ITypeLib2 *This,
        TLIBATTR *pTLibAttr);

    /*** ITypeLib2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCustData)(
        ITypeLib2 *This,
        REFGUID guid,
        VARIANT *pVarVal);

    HRESULT (STDMETHODCALLTYPE *GetLibStatistics)(
        ITypeLib2 *This,
        ULONG *pcUniqueNames,
        ULONG *pcchUniqueNames);

    HRESULT (STDMETHODCALLTYPE *GetDocumentation2)(
        ITypeLib2 *This,
        INT index,
        LCID lcid,
        BSTR *pbstrHelpString,
        DWORD *pdwHelpStringContext,
        BSTR *pbstrHelpStringDll);

    HRESULT (STDMETHODCALLTYPE *GetAllCustData)(
        ITypeLib2 *This,
        CUSTDATA *pCustData);

    END_INTERFACE
} ITypeLib2Vtbl;

interface ITypeLib2 {
    CONST_VTBL ITypeLib2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITypeLib2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITypeLib2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITypeLib2_Release(This) (This)->lpVtbl->Release(This)
/*** ITypeLib methods ***/
#define ITypeLib2_GetTypeInfoCount(This) (This)->lpVtbl->GetTypeInfoCount(This)
#define ITypeLib2_GetTypeInfo(This,index,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,index,ppTInfo)
#define ITypeLib2_GetTypeInfoType(This,index,pTKind) (This)->lpVtbl->GetTypeInfoType(This,index,pTKind)
#define ITypeLib2_GetTypeInfoOfGuid(This,guid,ppTinfo) (This)->lpVtbl->GetTypeInfoOfGuid(This,guid,ppTinfo)
#define ITypeLib2_GetLibAttr(This,ppTLibAttr) (This)->lpVtbl->GetLibAttr(This,ppTLibAttr)
#define ITypeLib2_GetTypeComp(This,ppTComp) (This)->lpVtbl->GetTypeComp(This,ppTComp)
#define ITypeLib2_GetDocumentation(This,index,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile) (This)->lpVtbl->GetDocumentation(This,index,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile)
#define ITypeLib2_IsName(This,szNameBuf,lHashVal,pfName) (This)->lpVtbl->IsName(This,szNameBuf,lHashVal,pfName)
#define ITypeLib2_FindName(This,szNameBuf,lHashVal,ppTInfo,rgMemId,pcFound) (This)->lpVtbl->FindName(This,szNameBuf,lHashVal,ppTInfo,rgMemId,pcFound)
#define ITypeLib2_ReleaseTLibAttr(This,pTLibAttr) (This)->lpVtbl->ReleaseTLibAttr(This,pTLibAttr)
/*** ITypeLib2 methods ***/
#define ITypeLib2_GetCustData(This,guid,pVarVal) (This)->lpVtbl->GetCustData(This,guid,pVarVal)
#define ITypeLib2_GetLibStatistics(This,pcUniqueNames,pcchUniqueNames) (This)->lpVtbl->GetLibStatistics(This,pcUniqueNames,pcchUniqueNames)
#define ITypeLib2_GetDocumentation2(This,index,lcid,pbstrHelpString,pdwHelpStringContext,pbstrHelpStringDll) (This)->lpVtbl->GetDocumentation2(This,index,lcid,pbstrHelpString,pdwHelpStringContext,pbstrHelpStringDll)
#define ITypeLib2_GetAllCustData(This,pCustData) (This)->lpVtbl->GetAllCustData(This,pCustData)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITypeLib2_QueryInterface(ITypeLib2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITypeLib2_AddRef(ITypeLib2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITypeLib2_Release(ITypeLib2* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypeLib methods ***/
static __WIDL_INLINE UINT ITypeLib2_GetTypeInfoCount(ITypeLib2* This) {
    return This->lpVtbl->GetTypeInfoCount(This);
}
static __WIDL_INLINE HRESULT ITypeLib2_GetTypeInfo(ITypeLib2* This,UINT index,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,index,ppTInfo);
}
static __WIDL_INLINE HRESULT ITypeLib2_GetTypeInfoType(ITypeLib2* This,UINT index,TYPEKIND *pTKind) {
    return This->lpVtbl->GetTypeInfoType(This,index,pTKind);
}
static __WIDL_INLINE HRESULT ITypeLib2_GetTypeInfoOfGuid(ITypeLib2* This,REFGUID guid,ITypeInfo **ppTinfo) {
    return This->lpVtbl->GetTypeInfoOfGuid(This,guid,ppTinfo);
}
static __WIDL_INLINE HRESULT ITypeLib2_GetLibAttr(ITypeLib2* This,TLIBATTR **ppTLibAttr) {
    return This->lpVtbl->GetLibAttr(This,ppTLibAttr);
}
static __WIDL_INLINE HRESULT ITypeLib2_GetTypeComp(ITypeLib2* This,ITypeComp **ppTComp) {
    return This->lpVtbl->GetTypeComp(This,ppTComp);
}
static __WIDL_INLINE HRESULT ITypeLib2_GetDocumentation(ITypeLib2* This,INT index,BSTR *pBstrName,BSTR *pBstrDocString,DWORD *pdwHelpContext,BSTR *pBstrHelpFile) {
    return This->lpVtbl->GetDocumentation(This,index,pBstrName,pBstrDocString,pdwHelpContext,pBstrHelpFile);
}
static __WIDL_INLINE HRESULT ITypeLib2_IsName(ITypeLib2* This,LPOLESTR szNameBuf,ULONG lHashVal,WINBOOL *pfName) {
    return This->lpVtbl->IsName(This,szNameBuf,lHashVal,pfName);
}
static __WIDL_INLINE HRESULT ITypeLib2_FindName(ITypeLib2* This,LPOLESTR szNameBuf,ULONG lHashVal,ITypeInfo **ppTInfo,MEMBERID *rgMemId,USHORT *pcFound) {
    return This->lpVtbl->FindName(This,szNameBuf,lHashVal,ppTInfo,rgMemId,pcFound);
}
static __WIDL_INLINE void ITypeLib2_ReleaseTLibAttr(ITypeLib2* This,TLIBATTR *pTLibAttr) {
    This->lpVtbl->ReleaseTLibAttr(This,pTLibAttr);
}
/*** ITypeLib2 methods ***/
static __WIDL_INLINE HRESULT ITypeLib2_GetCustData(ITypeLib2* This,REFGUID guid,VARIANT *pVarVal) {
    return This->lpVtbl->GetCustData(This,guid,pVarVal);
}
static __WIDL_INLINE HRESULT ITypeLib2_GetLibStatistics(ITypeLib2* This,ULONG *pcUniqueNames,ULONG *pcchUniqueNames) {
    return This->lpVtbl->GetLibStatistics(This,pcUniqueNames,pcchUniqueNames);
}
static __WIDL_INLINE HRESULT ITypeLib2_GetDocumentation2(ITypeLib2* This,INT index,LCID lcid,BSTR *pbstrHelpString,DWORD *pdwHelpStringContext,BSTR *pbstrHelpStringDll) {
    return This->lpVtbl->GetDocumentation2(This,index,lcid,pbstrHelpString,pdwHelpStringContext,pbstrHelpStringDll);
}
static __WIDL_INLINE HRESULT ITypeLib2_GetAllCustData(ITypeLib2* This,CUSTDATA *pCustData) {
    return This->lpVtbl->GetAllCustData(This,pCustData);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITypeLib2_RemoteGetLibStatistics_Proxy(
    ITypeLib2* This,
    ULONG *pcUniqueNames,
    ULONG *pcchUniqueNames);
void __RPC_STUB ITypeLib2_RemoteGetLibStatistics_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITypeLib2_RemoteGetDocumentation2_Proxy(
    ITypeLib2* This,
    INT index,
    LCID lcid,
    DWORD refPtrFlags,
    BSTR *pbstrHelpString,
    DWORD *pdwHelpStringContext,
    BSTR *pbstrHelpStringDll);
void __RPC_STUB ITypeLib2_RemoteGetDocumentation2_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK ITypeLib2_GetLibStatistics_Proxy(
    ITypeLib2* This,
    ULONG *pcUniqueNames,
    ULONG *pcchUniqueNames);
HRESULT __RPC_STUB ITypeLib2_GetLibStatistics_Stub(
    ITypeLib2* This,
    ULONG *pcUniqueNames,
    ULONG *pcchUniqueNames);
HRESULT CALLBACK ITypeLib2_GetDocumentation2_Proxy(
    ITypeLib2* This,
    INT index,
    LCID lcid,
    BSTR *pbstrHelpString,
    DWORD *pdwHelpStringContext,
    BSTR *pbstrHelpStringDll);
HRESULT __RPC_STUB ITypeLib2_GetDocumentation2_Stub(
    ITypeLib2* This,
    INT index,
    LCID lcid,
    DWORD refPtrFlags,
    BSTR *pbstrHelpString,
    DWORD *pdwHelpStringContext,
    BSTR *pbstrHelpStringDll);

#endif  /* __ITypeLib2_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ITypeChangeEvents interface
 */
#ifndef __ITypeChangeEvents_INTERFACE_DEFINED__
#define __ITypeChangeEvents_INTERFACE_DEFINED__

typedef ITypeChangeEvents *LPTYPECHANGEEVENTS;

typedef enum tagCHANGEKIND {
    CHANGEKIND_ADDMEMBER = 0,
    CHANGEKIND_DELETEMEMBER = 1,
    CHANGEKIND_SETNAMES = 2,
    CHANGEKIND_SETDOCUMENTATION = 3,
    CHANGEKIND_GENERAL = 4,
    CHANGEKIND_INVALIDATE = 5,
    CHANGEKIND_CHANGEFAILED = 6,
    CHANGEKIND_MAX = 7
} CHANGEKIND;

DEFINE_GUID(IID_ITypeChangeEvents, 0x00020410, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00020410-0000-0000-c000-000000000046")
ITypeChangeEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RequestTypeChange(
        CHANGEKIND changeKind,
        ITypeInfo *pTInfoBefore,
        LPOLESTR pStrName,
        INT *pfCancel) = 0;

    virtual HRESULT STDMETHODCALLTYPE AfterTypeChange(
        CHANGEKIND changeKind,
        ITypeInfo *pTInfoAfter,
        LPOLESTR pStrName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITypeChangeEvents, 0x00020410, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ITypeChangeEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITypeChangeEvents *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITypeChangeEvents *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITypeChangeEvents *This);

    /*** ITypeChangeEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *RequestTypeChange)(
        ITypeChangeEvents *This,
        CHANGEKIND changeKind,
        ITypeInfo *pTInfoBefore,
        LPOLESTR pStrName,
        INT *pfCancel);

    HRESULT (STDMETHODCALLTYPE *AfterTypeChange)(
        ITypeChangeEvents *This,
        CHANGEKIND changeKind,
        ITypeInfo *pTInfoAfter,
        LPOLESTR pStrName);

    END_INTERFACE
} ITypeChangeEventsVtbl;

interface ITypeChangeEvents {
    CONST_VTBL ITypeChangeEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITypeChangeEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITypeChangeEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITypeChangeEvents_Release(This) (This)->lpVtbl->Release(This)
/*** ITypeChangeEvents methods ***/
#define ITypeChangeEvents_RequestTypeChange(This,changeKind,pTInfoBefore,pStrName,pfCancel) (This)->lpVtbl->RequestTypeChange(This,changeKind,pTInfoBefore,pStrName,pfCancel)
#define ITypeChangeEvents_AfterTypeChange(This,changeKind,pTInfoAfter,pStrName) (This)->lpVtbl->AfterTypeChange(This,changeKind,pTInfoAfter,pStrName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITypeChangeEvents_QueryInterface(ITypeChangeEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITypeChangeEvents_AddRef(ITypeChangeEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITypeChangeEvents_Release(ITypeChangeEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypeChangeEvents methods ***/
static __WIDL_INLINE HRESULT ITypeChangeEvents_RequestTypeChange(ITypeChangeEvents* This,CHANGEKIND changeKind,ITypeInfo *pTInfoBefore,LPOLESTR pStrName,INT *pfCancel) {
    return This->lpVtbl->RequestTypeChange(This,changeKind,pTInfoBefore,pStrName,pfCancel);
}
static __WIDL_INLINE HRESULT ITypeChangeEvents_AfterTypeChange(ITypeChangeEvents* This,CHANGEKIND changeKind,ITypeInfo *pTInfoAfter,LPOLESTR pStrName) {
    return This->lpVtbl->AfterTypeChange(This,changeKind,pTInfoAfter,pStrName);
}
#endif
#endif

#endif


#endif  /* __ITypeChangeEvents_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IErrorInfo interface
 */
#ifndef __IErrorInfo_INTERFACE_DEFINED__
#define __IErrorInfo_INTERFACE_DEFINED__

typedef IErrorInfo *LPERRORINFO;

DEFINE_GUID(IID_IErrorInfo, 0x1cf2b120, 0x547d, 0x101b, 0x8e,0x65, 0x08,0x00,0x2b,0x2b,0xd1,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1cf2b120-547d-101b-8e65-08002b2bd119")
IErrorInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetGUID(
        GUID *pGUID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSource(
        BSTR *pBstrSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDescription(
        BSTR *pBstrDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHelpFile(
        BSTR *pBstrHelpFile) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHelpContext(
        DWORD *pdwHelpContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IErrorInfo, 0x1cf2b120, 0x547d, 0x101b, 0x8e,0x65, 0x08,0x00,0x2b,0x2b,0xd1,0x19)
#endif
#else
typedef struct IErrorInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IErrorInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IErrorInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IErrorInfo *This);

    /*** IErrorInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetGUID)(
        IErrorInfo *This,
        GUID *pGUID);

    HRESULT (STDMETHODCALLTYPE *GetSource)(
        IErrorInfo *This,
        BSTR *pBstrSource);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IErrorInfo *This,
        BSTR *pBstrDescription);

    HRESULT (STDMETHODCALLTYPE *GetHelpFile)(
        IErrorInfo *This,
        BSTR *pBstrHelpFile);

    HRESULT (STDMETHODCALLTYPE *GetHelpContext)(
        IErrorInfo *This,
        DWORD *pdwHelpContext);

    END_INTERFACE
} IErrorInfoVtbl;

interface IErrorInfo {
    CONST_VTBL IErrorInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IErrorInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IErrorInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IErrorInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IErrorInfo methods ***/
#define IErrorInfo_GetGUID(This,pGUID) (This)->lpVtbl->GetGUID(This,pGUID)
#define IErrorInfo_GetSource(This,pBstrSource) (This)->lpVtbl->GetSource(This,pBstrSource)
#define IErrorInfo_GetDescription(This,pBstrDescription) (This)->lpVtbl->GetDescription(This,pBstrDescription)
#define IErrorInfo_GetHelpFile(This,pBstrHelpFile) (This)->lpVtbl->GetHelpFile(This,pBstrHelpFile)
#define IErrorInfo_GetHelpContext(This,pdwHelpContext) (This)->lpVtbl->GetHelpContext(This,pdwHelpContext)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IErrorInfo_QueryInterface(IErrorInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IErrorInfo_AddRef(IErrorInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IErrorInfo_Release(IErrorInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IErrorInfo methods ***/
static __WIDL_INLINE HRESULT IErrorInfo_GetGUID(IErrorInfo* This,GUID *pGUID) {
    return This->lpVtbl->GetGUID(This,pGUID);
}
static __WIDL_INLINE HRESULT IErrorInfo_GetSource(IErrorInfo* This,BSTR *pBstrSource) {
    return This->lpVtbl->GetSource(This,pBstrSource);
}
static __WIDL_INLINE HRESULT IErrorInfo_GetDescription(IErrorInfo* This,BSTR *pBstrDescription) {
    return This->lpVtbl->GetDescription(This,pBstrDescription);
}
static __WIDL_INLINE HRESULT IErrorInfo_GetHelpFile(IErrorInfo* This,BSTR *pBstrHelpFile) {
    return This->lpVtbl->GetHelpFile(This,pBstrHelpFile);
}
static __WIDL_INLINE HRESULT IErrorInfo_GetHelpContext(IErrorInfo* This,DWORD *pdwHelpContext) {
    return This->lpVtbl->GetHelpContext(This,pdwHelpContext);
}
#endif
#endif

#endif


#endif  /* __IErrorInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ICreateErrorInfo interface
 */
#ifndef __ICreateErrorInfo_INTERFACE_DEFINED__
#define __ICreateErrorInfo_INTERFACE_DEFINED__

typedef ICreateErrorInfo *LPCREATEERRORINFO;

DEFINE_GUID(IID_ICreateErrorInfo, 0x22f03340, 0x547d, 0x101b, 0x8e,0x65, 0x08,0x00,0x2b,0x2b,0xd1,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("22f03340-547d-101b-8e65-08002b2bd119")
ICreateErrorInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetGUID(
        REFGUID rguid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSource(
        LPOLESTR szSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDescription(
        LPOLESTR szDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHelpFile(
        LPOLESTR szHelpFile) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHelpContext(
        DWORD dwHelpContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICreateErrorInfo, 0x22f03340, 0x547d, 0x101b, 0x8e,0x65, 0x08,0x00,0x2b,0x2b,0xd1,0x19)
#endif
#else
typedef struct ICreateErrorInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICreateErrorInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICreateErrorInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICreateErrorInfo *This);

    /*** ICreateErrorInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *SetGUID)(
        ICreateErrorInfo *This,
        REFGUID rguid);

    HRESULT (STDMETHODCALLTYPE *SetSource)(
        ICreateErrorInfo *This,
        LPOLESTR szSource);

    HRESULT (STDMETHODCALLTYPE *SetDescription)(
        ICreateErrorInfo *This,
        LPOLESTR szDescription);

    HRESULT (STDMETHODCALLTYPE *SetHelpFile)(
        ICreateErrorInfo *This,
        LPOLESTR szHelpFile);

    HRESULT (STDMETHODCALLTYPE *SetHelpContext)(
        ICreateErrorInfo *This,
        DWORD dwHelpContext);

    END_INTERFACE
} ICreateErrorInfoVtbl;

interface ICreateErrorInfo {
    CONST_VTBL ICreateErrorInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICreateErrorInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICreateErrorInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICreateErrorInfo_Release(This) (This)->lpVtbl->Release(This)
/*** ICreateErrorInfo methods ***/
#define ICreateErrorInfo_SetGUID(This,rguid) (This)->lpVtbl->SetGUID(This,rguid)
#define ICreateErrorInfo_SetSource(This,szSource) (This)->lpVtbl->SetSource(This,szSource)
#define ICreateErrorInfo_SetDescription(This,szDescription) (This)->lpVtbl->SetDescription(This,szDescription)
#define ICreateErrorInfo_SetHelpFile(This,szHelpFile) (This)->lpVtbl->SetHelpFile(This,szHelpFile)
#define ICreateErrorInfo_SetHelpContext(This,dwHelpContext) (This)->lpVtbl->SetHelpContext(This,dwHelpContext)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICreateErrorInfo_QueryInterface(ICreateErrorInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICreateErrorInfo_AddRef(ICreateErrorInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICreateErrorInfo_Release(ICreateErrorInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** ICreateErrorInfo methods ***/
static __WIDL_INLINE HRESULT ICreateErrorInfo_SetGUID(ICreateErrorInfo* This,REFGUID rguid) {
    return This->lpVtbl->SetGUID(This,rguid);
}
static __WIDL_INLINE HRESULT ICreateErrorInfo_SetSource(ICreateErrorInfo* This,LPOLESTR szSource) {
    return This->lpVtbl->SetSource(This,szSource);
}
static __WIDL_INLINE HRESULT ICreateErrorInfo_SetDescription(ICreateErrorInfo* This,LPOLESTR szDescription) {
    return This->lpVtbl->SetDescription(This,szDescription);
}
static __WIDL_INLINE HRESULT ICreateErrorInfo_SetHelpFile(ICreateErrorInfo* This,LPOLESTR szHelpFile) {
    return This->lpVtbl->SetHelpFile(This,szHelpFile);
}
static __WIDL_INLINE HRESULT ICreateErrorInfo_SetHelpContext(ICreateErrorInfo* This,DWORD dwHelpContext) {
    return This->lpVtbl->SetHelpContext(This,dwHelpContext);
}
#endif
#endif

#endif


#endif  /* __ICreateErrorInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ISupportErrorInfo interface
 */
#ifndef __ISupportErrorInfo_INTERFACE_DEFINED__
#define __ISupportErrorInfo_INTERFACE_DEFINED__

typedef ISupportErrorInfo *LPSUPPORTERRORINFO;

DEFINE_GUID(IID_ISupportErrorInfo, 0xdf0b3d60, 0x548f, 0x101b, 0x8e,0x65, 0x08,0x00,0x2b,0x2b,0xd1,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("df0b3d60-548f-101b-8e65-08002b2bd119")
ISupportErrorInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InterfaceSupportsErrorInfo(
        REFIID riid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISupportErrorInfo, 0xdf0b3d60, 0x548f, 0x101b, 0x8e,0x65, 0x08,0x00,0x2b,0x2b,0xd1,0x19)
#endif
#else
typedef struct ISupportErrorInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISupportErrorInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISupportErrorInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISupportErrorInfo *This);

    /*** ISupportErrorInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *InterfaceSupportsErrorInfo)(
        ISupportErrorInfo *This,
        REFIID riid);

    END_INTERFACE
} ISupportErrorInfoVtbl;

interface ISupportErrorInfo {
    CONST_VTBL ISupportErrorInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISupportErrorInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISupportErrorInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISupportErrorInfo_Release(This) (This)->lpVtbl->Release(This)
/*** ISupportErrorInfo methods ***/
#define ISupportErrorInfo_InterfaceSupportsErrorInfo(This,riid) (This)->lpVtbl->InterfaceSupportsErrorInfo(This,riid)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISupportErrorInfo_QueryInterface(ISupportErrorInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISupportErrorInfo_AddRef(ISupportErrorInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISupportErrorInfo_Release(ISupportErrorInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** ISupportErrorInfo methods ***/
static __WIDL_INLINE HRESULT ISupportErrorInfo_InterfaceSupportsErrorInfo(ISupportErrorInfo* This,REFIID riid) {
    return This->lpVtbl->InterfaceSupportsErrorInfo(This,riid);
}
#endif
#endif

#endif


#endif  /* __ISupportErrorInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ITypeFactory interface
 */
#ifndef __ITypeFactory_INTERFACE_DEFINED__
#define __ITypeFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITypeFactory, 0x0000002e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0000002e-0000-0000-c000-000000000046")
ITypeFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateFromTypeInfo(
        ITypeInfo *pTypeInfo,
        REFIID riid,
        IUnknown **ppv) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITypeFactory, 0x0000002e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ITypeFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITypeFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITypeFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITypeFactory *This);

    /*** ITypeFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateFromTypeInfo)(
        ITypeFactory *This,
        ITypeInfo *pTypeInfo,
        REFIID riid,
        IUnknown **ppv);

    END_INTERFACE
} ITypeFactoryVtbl;

interface ITypeFactory {
    CONST_VTBL ITypeFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITypeFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITypeFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITypeFactory_Release(This) (This)->lpVtbl->Release(This)
/*** ITypeFactory methods ***/
#define ITypeFactory_CreateFromTypeInfo(This,pTypeInfo,riid,ppv) (This)->lpVtbl->CreateFromTypeInfo(This,pTypeInfo,riid,ppv)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITypeFactory_QueryInterface(ITypeFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITypeFactory_AddRef(ITypeFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITypeFactory_Release(ITypeFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypeFactory methods ***/
static __WIDL_INLINE HRESULT ITypeFactory_CreateFromTypeInfo(ITypeFactory* This,ITypeInfo *pTypeInfo,REFIID riid,IUnknown **ppv) {
    return This->lpVtbl->CreateFromTypeInfo(This,pTypeInfo,riid,ppv);
}
#endif
#endif

#endif


#endif  /* __ITypeFactory_INTERFACE_DEFINED__ */


/*****************************************************************************
 * ITypeMarshal interface
 */
#ifndef __ITypeMarshal_INTERFACE_DEFINED__
#define __ITypeMarshal_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITypeMarshal, 0x0000002d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0000002d-0000-0000-c000-000000000046")
ITypeMarshal : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Size(
        PVOID pvType,
        DWORD dwDestContext,
        PVOID pvDestContext,
        ULONG *pSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE Marshal(
        PVOID pvType,
        DWORD dwDestContext,
        PVOID pvDestContext,
        ULONG cbBufferLength,
        BYTE *pBuffer,
        ULONG *pcbWritten) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unmarshal(
        PVOID pvType,
        DWORD dwFlags,
        ULONG cbBufferLength,
        BYTE *pBuffer,
        ULONG *pcbRead) = 0;

    virtual HRESULT STDMETHODCALLTYPE Free(
        PVOID pvType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITypeMarshal, 0x0000002d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct ITypeMarshalVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITypeMarshal *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITypeMarshal *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITypeMarshal *This);

    /*** ITypeMarshal methods ***/
    HRESULT (STDMETHODCALLTYPE *Size)(
        ITypeMarshal *This,
        PVOID pvType,
        DWORD dwDestContext,
        PVOID pvDestContext,
        ULONG *pSize);

    HRESULT (STDMETHODCALLTYPE *Marshal)(
        ITypeMarshal *This,
        PVOID pvType,
        DWORD dwDestContext,
        PVOID pvDestContext,
        ULONG cbBufferLength,
        BYTE *pBuffer,
        ULONG *pcbWritten);

    HRESULT (STDMETHODCALLTYPE *Unmarshal)(
        ITypeMarshal *This,
        PVOID pvType,
        DWORD dwFlags,
        ULONG cbBufferLength,
        BYTE *pBuffer,
        ULONG *pcbRead);

    HRESULT (STDMETHODCALLTYPE *Free)(
        ITypeMarshal *This,
        PVOID pvType);

    END_INTERFACE
} ITypeMarshalVtbl;

interface ITypeMarshal {
    CONST_VTBL ITypeMarshalVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITypeMarshal_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITypeMarshal_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITypeMarshal_Release(This) (This)->lpVtbl->Release(This)
/*** ITypeMarshal methods ***/
#define ITypeMarshal_Size(This,pvType,dwDestContext,pvDestContext,pSize) (This)->lpVtbl->Size(This,pvType,dwDestContext,pvDestContext,pSize)
#define ITypeMarshal_Marshal(This,pvType,dwDestContext,pvDestContext,cbBufferLength,pBuffer,pcbWritten) (This)->lpVtbl->Marshal(This,pvType,dwDestContext,pvDestContext,cbBufferLength,pBuffer,pcbWritten)
#define ITypeMarshal_Unmarshal(This,pvType,dwFlags,cbBufferLength,pBuffer,pcbRead) (This)->lpVtbl->Unmarshal(This,pvType,dwFlags,cbBufferLength,pBuffer,pcbRead)
#define ITypeMarshal_Free(This,pvType) (This)->lpVtbl->Free(This,pvType)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITypeMarshal_QueryInterface(ITypeMarshal* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITypeMarshal_AddRef(ITypeMarshal* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITypeMarshal_Release(ITypeMarshal* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypeMarshal methods ***/
static __WIDL_INLINE HRESULT ITypeMarshal_Size(ITypeMarshal* This,PVOID pvType,DWORD dwDestContext,PVOID pvDestContext,ULONG *pSize) {
    return This->lpVtbl->Size(This,pvType,dwDestContext,pvDestContext,pSize);
}
static __WIDL_INLINE HRESULT ITypeMarshal_Marshal(ITypeMarshal* This,PVOID pvType,DWORD dwDestContext,PVOID pvDestContext,ULONG cbBufferLength,BYTE *pBuffer,ULONG *pcbWritten) {
    return This->lpVtbl->Marshal(This,pvType,dwDestContext,pvDestContext,cbBufferLength,pBuffer,pcbWritten);
}
static __WIDL_INLINE HRESULT ITypeMarshal_Unmarshal(ITypeMarshal* This,PVOID pvType,DWORD dwFlags,ULONG cbBufferLength,BYTE *pBuffer,ULONG *pcbRead) {
    return This->lpVtbl->Unmarshal(This,pvType,dwFlags,cbBufferLength,pBuffer,pcbRead);
}
static __WIDL_INLINE HRESULT ITypeMarshal_Free(ITypeMarshal* This,PVOID pvType) {
    return This->lpVtbl->Free(This,pvType);
}
#endif
#endif

#endif


#endif  /* __ITypeMarshal_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IRecordInfo interface
 */
#ifndef __IRecordInfo_INTERFACE_DEFINED__
#define __IRecordInfo_INTERFACE_DEFINED__

typedef IRecordInfo *LPRECORDINFO;

DEFINE_GUID(IID_IRecordInfo, 0x0000002f, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0000002f-0000-0000-c000-000000000046")
IRecordInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RecordInit(
        PVOID pvNew) = 0;

    virtual HRESULT STDMETHODCALLTYPE RecordClear(
        PVOID pvExisting) = 0;

    virtual HRESULT STDMETHODCALLTYPE RecordCopy(
        PVOID pvExisting,
        PVOID pvNew) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGuid(
        GUID *pguid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetName(
        BSTR *pbstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSize(
        ULONG *pcbSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(
        ITypeInfo **ppTypeInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetField(
        PVOID pvData,
        LPCOLESTR szFieldName,
        VARIANT *pvarField) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFieldNoCopy(
        PVOID pvData,
        LPCOLESTR szFieldName,
        VARIANT *pvarField,
        PVOID *ppvDataCArray) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutField(
        ULONG wFlags,
        PVOID pvData,
        LPCOLESTR szFieldName,
        VARIANT *pvarField) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutFieldNoCopy(
        ULONG wFlags,
        PVOID pvData,
        LPCOLESTR szFieldName,
        VARIANT *pvarField) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFieldNames(
        ULONG *pcNames,
        BSTR *rgBstrNames) = 0;

    virtual WINBOOL STDMETHODCALLTYPE IsMatchingType(
        IRecordInfo *pRecordInfo) = 0;

    virtual PVOID STDMETHODCALLTYPE RecordCreate(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RecordCreateCopy(
        PVOID pvSource,
        PVOID *ppvDest) = 0;

    virtual HRESULT STDMETHODCALLTYPE RecordDestroy(
        PVOID pvRecord) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRecordInfo, 0x0000002f, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)
#endif
#else
typedef struct IRecordInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IRecordInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IRecordInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IRecordInfo *This);

    /*** IRecordInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *RecordInit)(
        IRecordInfo *This,
        PVOID pvNew);

    HRESULT (STDMETHODCALLTYPE *RecordClear)(
        IRecordInfo *This,
        PVOID pvExisting);

    HRESULT (STDMETHODCALLTYPE *RecordCopy)(
        IRecordInfo *This,
        PVOID pvExisting,
        PVOID pvNew);

    HRESULT (STDMETHODCALLTYPE *GetGuid)(
        IRecordInfo *This,
        GUID *pguid);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IRecordInfo *This,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *GetSize)(
        IRecordInfo *This,
        ULONG *pcbSize);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IRecordInfo *This,
        ITypeInfo **ppTypeInfo);

    HRESULT (STDMETHODCALLTYPE *GetField)(
        IRecordInfo *This,
        PVOID pvData,
        LPCOLESTR szFieldName,
        VARIANT *pvarField);

    HRESULT (STDMETHODCALLTYPE *GetFieldNoCopy)(
        IRecordInfo *This,
        PVOID pvData,
        LPCOLESTR szFieldName,
        VARIANT *pvarField,
        PVOID *ppvDataCArray);

    HRESULT (STDMETHODCALLTYPE *PutField)(
        IRecordInfo *This,
        ULONG wFlags,
        PVOID pvData,
        LPCOLESTR szFieldName,
        VARIANT *pvarField);

    HRESULT (STDMETHODCALLTYPE *PutFieldNoCopy)(
        IRecordInfo *This,
        ULONG wFlags,
        PVOID pvData,
        LPCOLESTR szFieldName,
        VARIANT *pvarField);

    HRESULT (STDMETHODCALLTYPE *GetFieldNames)(
        IRecordInfo *This,
        ULONG *pcNames,
        BSTR *rgBstrNames);

    WINBOOL (STDMETHODCALLTYPE *IsMatchingType)(
        IRecordInfo *This,
        IRecordInfo *pRecordInfo);

    PVOID (STDMETHODCALLTYPE *RecordCreate)(
        IRecordInfo *This);

    HRESULT (STDMETHODCALLTYPE *RecordCreateCopy)(
        IRecordInfo *This,
        PVOID pvSource,
        PVOID *ppvDest);

    HRESULT (STDMETHODCALLTYPE *RecordDestroy)(
        IRecordInfo *This,
        PVOID pvRecord);

    END_INTERFACE
} IRecordInfoVtbl;

interface IRecordInfo {
    CONST_VTBL IRecordInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRecordInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRecordInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRecordInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IRecordInfo methods ***/
#define IRecordInfo_RecordInit(This,pvNew) (This)->lpVtbl->RecordInit(This,pvNew)
#define IRecordInfo_RecordClear(This,pvExisting) (This)->lpVtbl->RecordClear(This,pvExisting)
#define IRecordInfo_RecordCopy(This,pvExisting,pvNew) (This)->lpVtbl->RecordCopy(This,pvExisting,pvNew)
#define IRecordInfo_GetGuid(This,pguid) (This)->lpVtbl->GetGuid(This,pguid)
#define IRecordInfo_GetName(This,pbstrName) (This)->lpVtbl->GetName(This,pbstrName)
#define IRecordInfo_GetSize(This,pcbSize) (This)->lpVtbl->GetSize(This,pcbSize)
#define IRecordInfo_GetTypeInfo(This,ppTypeInfo) (This)->lpVtbl->GetTypeInfo(This,ppTypeInfo)
#define IRecordInfo_GetField(This,pvData,szFieldName,pvarField) (This)->lpVtbl->GetField(This,pvData,szFieldName,pvarField)
#define IRecordInfo_GetFieldNoCopy(This,pvData,szFieldName,pvarField,ppvDataCArray) (This)->lpVtbl->GetFieldNoCopy(This,pvData,szFieldName,pvarField,ppvDataCArray)
#define IRecordInfo_PutField(This,wFlags,pvData,szFieldName,pvarField) (This)->lpVtbl->PutField(This,wFlags,pvData,szFieldName,pvarField)
#define IRecordInfo_PutFieldNoCopy(This,wFlags,pvData,szFieldName,pvarField) (This)->lpVtbl->PutFieldNoCopy(This,wFlags,pvData,szFieldName,pvarField)
#define IRecordInfo_GetFieldNames(This,pcNames,rgBstrNames) (This)->lpVtbl->GetFieldNames(This,pcNames,rgBstrNames)
#define IRecordInfo_IsMatchingType(This,pRecordInfo) (This)->lpVtbl->IsMatchingType(This,pRecordInfo)
#define IRecordInfo_RecordCreate(This) (This)->lpVtbl->RecordCreate(This)
#define IRecordInfo_RecordCreateCopy(This,pvSource,ppvDest) (This)->lpVtbl->RecordCreateCopy(This,pvSource,ppvDest)
#define IRecordInfo_RecordDestroy(This,pvRecord) (This)->lpVtbl->RecordDestroy(This,pvRecord)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IRecordInfo_QueryInterface(IRecordInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRecordInfo_AddRef(IRecordInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRecordInfo_Release(IRecordInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IRecordInfo methods ***/
static __WIDL_INLINE HRESULT IRecordInfo_RecordInit(IRecordInfo* This,PVOID pvNew) {
    return This->lpVtbl->RecordInit(This,pvNew);
}
static __WIDL_INLINE HRESULT IRecordInfo_RecordClear(IRecordInfo* This,PVOID pvExisting) {
    return This->lpVtbl->RecordClear(This,pvExisting);
}
static __WIDL_INLINE HRESULT IRecordInfo_RecordCopy(IRecordInfo* This,PVOID pvExisting,PVOID pvNew) {
    return This->lpVtbl->RecordCopy(This,pvExisting,pvNew);
}
static __WIDL_INLINE HRESULT IRecordInfo_GetGuid(IRecordInfo* This,GUID *pguid) {
    return This->lpVtbl->GetGuid(This,pguid);
}
static __WIDL_INLINE HRESULT IRecordInfo_GetName(IRecordInfo* This,BSTR *pbstrName) {
    return This->lpVtbl->GetName(This,pbstrName);
}
static __WIDL_INLINE HRESULT IRecordInfo_GetSize(IRecordInfo* This,ULONG *pcbSize) {
    return This->lpVtbl->GetSize(This,pcbSize);
}
static __WIDL_INLINE HRESULT IRecordInfo_GetTypeInfo(IRecordInfo* This,ITypeInfo **ppTypeInfo) {
    return This->lpVtbl->GetTypeInfo(This,ppTypeInfo);
}
static __WIDL_INLINE HRESULT IRecordInfo_GetField(IRecordInfo* This,PVOID pvData,LPCOLESTR szFieldName,VARIANT *pvarField) {
    return This->lpVtbl->GetField(This,pvData,szFieldName,pvarField);
}
static __WIDL_INLINE HRESULT IRecordInfo_GetFieldNoCopy(IRecordInfo* This,PVOID pvData,LPCOLESTR szFieldName,VARIANT *pvarField,PVOID *ppvDataCArray) {
    return This->lpVtbl->GetFieldNoCopy(This,pvData,szFieldName,pvarField,ppvDataCArray);
}
static __WIDL_INLINE HRESULT IRecordInfo_PutField(IRecordInfo* This,ULONG wFlags,PVOID pvData,LPCOLESTR szFieldName,VARIANT *pvarField) {
    return This->lpVtbl->PutField(This,wFlags,pvData,szFieldName,pvarField);
}
static __WIDL_INLINE HRESULT IRecordInfo_PutFieldNoCopy(IRecordInfo* This,ULONG wFlags,PVOID pvData,LPCOLESTR szFieldName,VARIANT *pvarField) {
    return This->lpVtbl->PutFieldNoCopy(This,wFlags,pvData,szFieldName,pvarField);
}
static __WIDL_INLINE HRESULT IRecordInfo_GetFieldNames(IRecordInfo* This,ULONG *pcNames,BSTR *rgBstrNames) {
    return This->lpVtbl->GetFieldNames(This,pcNames,rgBstrNames);
}
static __WIDL_INLINE WINBOOL IRecordInfo_IsMatchingType(IRecordInfo* This,IRecordInfo *pRecordInfo) {
    return This->lpVtbl->IsMatchingType(This,pRecordInfo);
}
static __WIDL_INLINE PVOID IRecordInfo_RecordCreate(IRecordInfo* This) {
    return This->lpVtbl->RecordCreate(This);
}
static __WIDL_INLINE HRESULT IRecordInfo_RecordCreateCopy(IRecordInfo* This,PVOID pvSource,PVOID *ppvDest) {
    return This->lpVtbl->RecordCreateCopy(This,pvSource,ppvDest);
}
static __WIDL_INLINE HRESULT IRecordInfo_RecordDestroy(IRecordInfo* This,PVOID pvRecord) {
    return This->lpVtbl->RecordDestroy(This,pvRecord);
}
#endif
#endif

#endif


#endif  /* __IRecordInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IErrorLog interface
 */
#ifndef __IErrorLog_INTERFACE_DEFINED__
#define __IErrorLog_INTERFACE_DEFINED__

typedef IErrorLog *LPERRORLOG;

DEFINE_GUID(IID_IErrorLog, 0x3127ca40, 0x446e, 0x11ce, 0x81,0x35, 0x00,0xaa,0x00,0x4b,0xb8,0x51);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3127ca40-446e-11ce-8135-00aa004bb851")
IErrorLog : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddError(
        LPCOLESTR pszPropName,
        EXCEPINFO *pExcepInfo) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IErrorLog, 0x3127ca40, 0x446e, 0x11ce, 0x81,0x35, 0x00,0xaa,0x00,0x4b,0xb8,0x51)
#endif
#else
typedef struct IErrorLogVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IErrorLog *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IErrorLog *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IErrorLog *This);

    /*** IErrorLog methods ***/
    HRESULT (STDMETHODCALLTYPE *AddError)(
        IErrorLog *This,
        LPCOLESTR pszPropName,
        EXCEPINFO *pExcepInfo);

    END_INTERFACE
} IErrorLogVtbl;

interface IErrorLog {
    CONST_VTBL IErrorLogVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IErrorLog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IErrorLog_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IErrorLog_Release(This) (This)->lpVtbl->Release(This)
/*** IErrorLog methods ***/
#define IErrorLog_AddError(This,pszPropName,pExcepInfo) (This)->lpVtbl->AddError(This,pszPropName,pExcepInfo)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IErrorLog_QueryInterface(IErrorLog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IErrorLog_AddRef(IErrorLog* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IErrorLog_Release(IErrorLog* This) {
    return This->lpVtbl->Release(This);
}
/*** IErrorLog methods ***/
static __WIDL_INLINE HRESULT IErrorLog_AddError(IErrorLog* This,LPCOLESTR pszPropName,EXCEPINFO *pExcepInfo) {
    return This->lpVtbl->AddError(This,pszPropName,pExcepInfo);
}
#endif
#endif

#endif


#endif  /* __IErrorLog_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IPropertyBag interface
 */
#ifndef __IPropertyBag_INTERFACE_DEFINED__
#define __IPropertyBag_INTERFACE_DEFINED__

typedef IPropertyBag *LPPROPERTYBAG;

DEFINE_GUID(IID_IPropertyBag, 0x55272a00, 0x42cb, 0x11ce, 0x81,0x35, 0x00,0xaa,0x00,0x4b,0xb8,0x51);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("55272a00-42cb-11ce-8135-00aa004bb851")
IPropertyBag : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Read(
        LPCOLESTR pszPropName,
        VARIANT *pVar,
        IErrorLog *pErrorLog) = 0;

    virtual HRESULT STDMETHODCALLTYPE Write(
        LPCOLESTR pszPropName,
        VARIANT *pVar) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPropertyBag, 0x55272a00, 0x42cb, 0x11ce, 0x81,0x35, 0x00,0xaa,0x00,0x4b,0xb8,0x51)
#endif
#else
typedef struct IPropertyBagVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPropertyBag *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPropertyBag *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPropertyBag *This);

    /*** IPropertyBag methods ***/
    HRESULT (STDMETHODCALLTYPE *Read)(
        IPropertyBag *This,
        LPCOLESTR pszPropName,
        VARIANT *pVar,
        IErrorLog *pErrorLog);

    HRESULT (STDMETHODCALLTYPE *Write)(
        IPropertyBag *This,
        LPCOLESTR pszPropName,
        VARIANT *pVar);

    END_INTERFACE
} IPropertyBagVtbl;

interface IPropertyBag {
    CONST_VTBL IPropertyBagVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPropertyBag_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPropertyBag_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPropertyBag_Release(This) (This)->lpVtbl->Release(This)
/*** IPropertyBag methods ***/
#define IPropertyBag_Read(This,pszPropName,pVar,pErrorLog) (This)->lpVtbl->Read(This,pszPropName,pVar,pErrorLog)
#define IPropertyBag_Write(This,pszPropName,pVar) (This)->lpVtbl->Write(This,pszPropName,pVar)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPropertyBag_QueryInterface(IPropertyBag* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPropertyBag_AddRef(IPropertyBag* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPropertyBag_Release(IPropertyBag* This) {
    return This->lpVtbl->Release(This);
}
/*** IPropertyBag methods ***/
static __WIDL_INLINE HRESULT IPropertyBag_Read(IPropertyBag* This,LPCOLESTR pszPropName,VARIANT *pVar,IErrorLog *pErrorLog) {
    return This->lpVtbl->Read(This,pszPropName,pVar,pErrorLog);
}
static __WIDL_INLINE HRESULT IPropertyBag_Write(IPropertyBag* This,LPCOLESTR pszPropName,VARIANT *pVar) {
    return This->lpVtbl->Write(This,pszPropName,pVar);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IPropertyBag_RemoteRead_Proxy(
    IPropertyBag* This,
    LPCOLESTR pszPropName,
    VARIANT *pVar,
    IErrorLog *pErrorLog,
    DWORD varType,
    IUnknown *pUnkObj);
void __RPC_STUB IPropertyBag_RemoteRead_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IPropertyBag_Read_Proxy(
    IPropertyBag* This,
    LPCOLESTR pszPropName,
    VARIANT *pVar,
    IErrorLog *pErrorLog);
HRESULT __RPC_STUB IPropertyBag_Read_Stub(
    IPropertyBag* This,
    LPCOLESTR pszPropName,
    VARIANT *pVar,
    IErrorLog *pErrorLog,
    DWORD varType,
    IUnknown *pUnkObj);

#endif  /* __IPropertyBag_INTERFACE_DEFINED__ */

#endif
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);
ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
ULONG           __RPC_USER CLEANLOCALSTORAGE_UserSize     (ULONG *, ULONG, CLEANLOCALSTORAGE *);
unsigned char * __RPC_USER CLEANLOCALSTORAGE_UserMarshal  (ULONG *, unsigned char *, CLEANLOCALSTORAGE *);
unsigned char * __RPC_USER CLEANLOCALSTORAGE_UserUnmarshal(ULONG *, unsigned char *, CLEANLOCALSTORAGE *);
void            __RPC_USER CLEANLOCALSTORAGE_UserFree     (ULONG *, CLEANLOCALSTORAGE *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __oaidl_h__ */
