packages feed

hdirect-0.21.0: comlib/TypeLib.idl

module TypeLib {
import "StdTypes.idl";

  cpp_quote("#include \"StdTypes.h\"");
  cpp_quote("typedef void* VARIANT;");
  cpp_quote("typedef void* BSTR;");
  cpp_quote("typedef DWORD HRESULT;");
  cpp_quote("typedef void* IUnknown;");

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

//TypeInfo stuff.

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

typedef [v1_enum] enum tagTYPEKIND {
    TKIND_ENUM = 0,
    TKIND_RECORD,
    TKIND_MODULE,
    TKIND_INTERFACE,
    TKIND_DISPATCH,
    TKIND_COCLASS,
    TKIND_ALIAS,
    TKIND_UNION,
    TKIND_MAX                   /* end of enum marker */
} TYPEKIND;

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

typedef struct tagARRAYDESC {
    TYPEDESC tdescElem;         /* element type */
    USHORT cDims;               /* dimension count */
    [size_is(cDims)] SAFEARRAYBOUND rgbounds[]; /* var len array of bounds */
} ARRAYDESC;

// Added sof.
typedef VARIANT VARIANTARG;

// parameter description

typedef struct tagPARAMDESCEX {
    ULONG cBytes;               /* size of this structure */
    VARIANTARG varDefaultValue; /* default value of this parameter */
} PARAMDESCEX;

typedef [unique]PARAMDESCEX* LPPARAMDESCEX;

typedef struct tagPARAMDESC {
    LPPARAMDESCEX pparamdescex; /* valid if PARAMFLAG_FHASDEFAULT bit is set */
    USHORT wParamFlags;         /* IN, OUT, etc */
} PARAMDESC, * LPPARAMDESC;

const USHORT PARAMFLAG_NONE         = 0x00;
const USHORT PARAMFLAG_FIN          = 0x01;
const USHORT PARAMFLAG_FOUT         = 0x02;
const USHORT PARAMFLAG_FLCID        = 0x04;
const USHORT PARAMFLAG_FRETVAL      = 0x08;
const USHORT PARAMFLAG_FOPT         = 0x10;
const USHORT PARAMFLAG_FHASDEFAULT  = 0x20;

typedef struct tagIDLDESC {
    ULONG dwReserved;
    USHORT wIDLFlags;           /* IN, OUT, etc */
} IDLDESC, * LPIDLDESC;

const USHORT IDLFLAG_NONE    = PARAMFLAG_NONE;
const USHORT IDLFLAG_FIN     = PARAMFLAG_FIN;
const USHORT IDLFLAG_FOUT    = PARAMFLAG_FOUT;
const USHORT IDLFLAG_FLCID   = PARAMFLAG_FLCID;
const USHORT IDLFLAG_FRETVAL = PARAMFLAG_FRETVAL;

cpp_quote("#if 0")
cpp_quote("/* the following is what MIDL knows how to remote */")

typedef struct tagELEMDESC {    /* a format that MIDL likes */
    TYPEDESC tdesc;             /* the type of the element */
    PARAMDESC paramdesc;        /* IDLDESC is a subset of PARAMDESC */
} ELEMDESC;

cpp_quote("#else /* 0 */")
cpp_quote("typedef struct tagELEMDESC {")
cpp_quote("    TYPEDESC tdesc;             /* the type of the element */")
cpp_quote("    union {")
cpp_quote("        IDLDESC idldesc;        /* info for remoting the element */")
cpp_quote("        PARAMDESC paramdesc;    /* info about the parameter */")
cpp_quote("    };")
cpp_quote("} ELEMDESC, * LPELEMDESC;")
cpp_quote("#endif /* 0 */")


typedef [nofree]struct tagTYPEATTR {
    GUID guid;                  /* the GUID of the TypeInfo */
    LCID lcid;                  /* locale of member names and doc strings */
    DWORD dwReserved;
    MEMBERID memidConstructor;  /* ID of constructor, MEMBERID_NIL if none */
    MEMBERID memidDestructor;   /* ID of destructor, MEMBERID_NIL if none */
    LPOLESTR lpstrSchema;
    ULONG cbSizeInstance;       /* the size of an instance of this type */
    TYPEKIND typekind;          /* the kind of type this typeinfo describes */
    WORD cFuncs;                /* number of functions */
    WORD cVars;                 /* number of variables / data members */
    WORD cImplTypes;            /* number of implemented interfaces */
    WORD cbSizeVft;             /* the size of this types virtual func table */
    WORD cbAlignment;           /* specifies the alignment requirements for
                                   an instance of this type,
                                   0 = align on 64k boundary
                                   1 = byte align
                                   2 = word align
                                   4 = dword align... */
    WORD wTypeFlags;
    WORD wMajorVerNum;          /* major version number */
    WORD wMinorVerNum;          /* minor version number */
    TYPEDESC tdescAlias;        /* if typekind == TKIND_ALIAS this field
                                   specifies the type for which this type
                                   is an alias */
    IDLDESC idldescType;        /* IDL attributes of the described type */
} TYPEATTR, * LPTYPEATTR;

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

cpp_quote("#if 0")
cpp_quote("/* the following is what MIDL knows how to remote */")

typedef struct tagEXCEPINFO {
    WORD  wCode;            /* An error code describing the error. */
    WORD  wReserved;
    BSTR  bstrSource;       /* A source of the exception */
    BSTR  bstrDescription;  /* A description of the error */
    BSTR  bstrHelpFile;     /* Fully qualified drive, path, and file name */
    DWORD dwHelpContext;    /* help context of topic within the help file */
    ULONG pvReserved;
    ULONG pfnDeferredFillIn;
    SCODE scode;
} EXCEPINFO;

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

typedef [v1_enum] enum tagCALLCONV {
    CC_FASTCALL = 0,
    CC_CDECL = 1,
    CC_MSCPASCAL,
    CC_PASCAL = CC_MSCPASCAL,
    CC_MACPASCAL,
    CC_STDCALL,
    CC_FPFASTCALL,
    CC_SYSCALL,
    CC_MPWCDECL,
    CC_MPWPASCAL,
    CC_MAX          /* end of enum marker */
} CALLCONV;

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

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

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

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

/* IMPLTYPE Flags */
const USHORT IMPLTYPEFLAG_FDEFAULT      = 0x1;
const USHORT IMPLTYPEFLAG_FSOURCE       = 0x2;
const USHORT IMPLTYPEFLAG_FRESTRICTED   = 0x4;
const USHORT IMPLTYPEFLAG_FDEFAULTVTABLE= 0x8;


typedef [nofree]struct tagVARDESC {
    MEMBERID memid;
    LPOLESTR lpstrSchema;
    [switch_type(VARKIND), switch_is(varkind)] union {
        /* offset of variable within the instance */
        [case(VAR_PERINSTANCE, VAR_DISPATCH, VAR_STATIC)] ULONG oInst;
        [case(VAR_CONST)] VARIANT * lpvarValue; /* the value of the constant */
    };
    ELEMDESC elemdescVar;
    WORD     wVarFlags;
    VARKIND  varkind;
} VARDESC, * LPVARDESC;

typedef enum tagTYPEFLAGS {
    TYPEFLAG_FAPPOBJECT = 0x01,
    TYPEFLAG_FCANCREATE = 0x02,
    TYPEFLAG_FLICENSED = 0x04,
    TYPEFLAG_FPREDECLID = 0x08,
    TYPEFLAG_FHIDDEN = 0x10,
    TYPEFLAG_FCONTROL = 0x20,
    TYPEFLAG_FDUAL = 0x40,
    TYPEFLAG_FNONEXTENSIBLE = 0x80,
    TYPEFLAG_FOLEAUTOMATION = 0x100,
    TYPEFLAG_FRESTRICTED = 0x200,
    TYPEFLAG_FAGGREGATABLE = 0x400,
    TYPEFLAG_FREPLACEABLE = 0x800,
    TYPEFLAG_FDISPATCHABLE = 0x1000,
    TYPEFLAG_FREVERSEBIND = 0x2000
} 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 [wire_marshal(DWORD)] struct tagCLEANLOCALSTORAGE {
    IUnknown * pInterface;      /* interface that is responsible for storage */
    PVOID pStorage;             /* the storage being managed by interface */
    DWORD flags;                /* which interface, what storage */
} CLEANLOCALSTORAGE;

typedef struct tagCUSTDATAITEM {
    GUID guid;           /* guid identifying this custom data item */
    VARIANTARG varValue; /* value of this custom data item */
} CUSTDATAITEM, * LPCUSTDATAITEM;

typedef struct tagCUSTDATA {
    DWORD cCustData;            /* number of custom data items in rgCustData */
    [size_is(cCustData)] LPCUSTDATAITEM prgCustData;
                                /* array of custom data items */
} CUSTDATA, * LPCUSTDATA;

interface ITypeInfo;
interface ITypeLib;

[
    object,
    uuid(00020405-0000-0000-C000-000000000046),
    pointer_default(unique),
    local
]

interface ICreateTypeInfo: IUnknown
{
    typedef [unique] ICreateTypeInfo * LPCREATETYPEINFO;

    HRESULT SetGuid(
                [in] REFGUID guid
            );

    HRESULT SetTypeFlags(
                [in] UINT uTypeFlags
            );

    HRESULT SetDocString(
                [in] LPOLESTR pStrDoc
            );

    HRESULT SetHelpContext(
                [in] DWORD dwHelpContext
            );

    HRESULT SetVersion(
                [in] WORD wMajorVerNum,
                [in] WORD wMinorVerNum
            );

    HRESULT AddRefTypeInfo(

                [in] ITypeInfo * pTInfo,
                [out] HREFTYPE * phRefType
            );

    HRESULT AddFuncDesc(
                [in] UINT index,
                [in] FUNCDESC * pFuncDesc
            );

    HRESULT AddImplType(
                [in] UINT index,
                [in] HREFTYPE hRefType
            );

    HRESULT SetImplTypeFlags(
                [in] UINT index,
                [in] INT implTypeFlags
            );

    HRESULT SetAlignment(
                [in] WORD cbAlignment
            );

    HRESULT SetSchema(
                [in] LPOLESTR pStrSchema
            );

    HRESULT AddVarDesc(
                [in] UINT index,
                [in] VARDESC * pVarDesc
            );

    HRESULT SetFuncAndParamNames(
                [in] UINT index,
                [in, size_is((UINT) cNames)]
                [in] LPOLESTR * rgszNames,
                [in] UINT cNames
            );

    HRESULT SetVarName(
                [in] UINT index,
                [in] LPOLESTR szName
            );

    HRESULT SetTypeDescAlias(
                [in] TYPEDESC * pTDescAlias
            );

    HRESULT DefineFuncAsDllEntry(
                [in] UINT index,
                [in] LPOLESTR szDllName,
                [in] LPOLESTR szProcName
            );

    HRESULT SetFuncDocString(
                [in] UINT index,
                [in] LPOLESTR szDocString
            );

    HRESULT SetVarDocString(
                [in] UINT index,
                [in] LPOLESTR szDocString
            );

    HRESULT SetFuncHelpContext(
                [in] UINT index,
                [in] DWORD dwHelpContext
            );

    HRESULT SetVarHelpContext(
                [in] UINT index,
                [in] DWORD dwHelpContext
            );

    HRESULT SetMops(
                [in] UINT index,
                [in] BSTR bstrMops
            );

    HRESULT SetTypeIdldesc(
                [in] IDLDESC * pIdlDesc
            );

    HRESULT LayOut(
                void
            );

}


[
    object,
    uuid(0002040E-0000-0000-C000-000000000046),
    pointer_default(unique),
    local
]

interface ICreateTypeInfo2: ICreateTypeInfo
{
    typedef [unique] ICreateTypeInfo2 * LPCREATETYPEINFO2;

    HRESULT DeleteFuncDesc(
                [in] UINT index
            );

    HRESULT DeleteFuncDescByMemId(
                [in] MEMBERID memid,
                [in] INVOKEKIND invKind
            );

    HRESULT DeleteVarDesc(
                [in] UINT index
            );

    HRESULT DeleteVarDescByMemId(
                [in] MEMBERID memid
            );

    HRESULT DeleteImplType(
                [in] UINT index
            );

    HRESULT SetCustData(
                [in] REFGUID guid,
                [in] VARIANT * pVarVal
            );

    HRESULT SetFuncCustData( 
                [in] UINT index, 
                [in] REFGUID guid, 
                [in] VARIANT * pVarVal
            );
    
    HRESULT SetParamCustData( 
                [in] UINT indexFunc, 
                [in] UINT indexParam, 
                [in] REFGUID guid, 
                [in] VARIANT * pVarVal
            );

    HRESULT SetVarCustData( 
                [in] UINT index, 
                [in] REFGUID guid, 
                [in] VARIANT * pVarVal
            );

    HRESULT SetImplTypeCustData( 
                [in] UINT index, 
                [in] REFGUID guid, 
                [in] VARIANT * pVarVal
            );

    HRESULT SetHelpStringContext(
                [in] ULONG dwHelpStringContext
            );

    HRESULT SetFuncHelpStringContext(
                [in] UINT index,
                [in] ULONG dwHelpStringContext
            );

    HRESULT SetVarHelpStringContext(
                [in] UINT index,
                [in] ULONG dwHelpStringContext
            );

    HRESULT Invalidate(
                void
            );

    HRESULT SetName(
                [in]  LPOLESTR szName
            );

}


[
    object,
    uuid(00020406-0000-0000-C000-000000000046),
    pointer_default(unique),
    local
]

interface ICreateTypeLib : IUnknown
{
    typedef [unique] ICreateTypeLib * LPCREATETYPELIB;

    HRESULT CreateTypeInfo(
                [in]  LPOLESTR szName,
                [in]  TYPEKIND tkind,
                [out] ICreateTypeInfo ** ppCTInfo
            );

    HRESULT SetName(
                [in]  LPOLESTR szName
            );

    HRESULT SetVersion(
                [in] WORD wMajorVerNum,
                [in] WORD wMinorVerNum
            );

    HRESULT SetGuid(
                [in] REFGUID guid
            );

    HRESULT SetDocString(
                [in] LPOLESTR szDoc
            );

    HRESULT SetHelpFileName(
                [in] LPOLESTR szHelpFileName
            );

    HRESULT SetHelpContext(
                [in] DWORD dwHelpContext
            );

    HRESULT SetLcid(
                [in] LCID lcid
            );

    HRESULT SetLibFlags(
                [in] UINT uLibFlags
            );

    HRESULT SaveAllChanges(
                void
            );
}


[
    object,
    uuid(0002040F-0000-0000-C000-000000000046),
    pointer_default(unique),
    local
]

interface ICreateTypeLib2 : ICreateTypeLib
{
    typedef [unique] ICreateTypeLib2 * LPCREATETYPELIB2;

    HRESULT DeleteTypeInfo(
                [in] LPOLESTR szName
            );

    HRESULT SetCustData(
                [in] REFGUID guid,
                [in] VARIANT * pVarVal
            );

    HRESULT SetHelpStringContext(
                [in] ULONG dwHelpStringContext
            );

    HRESULT SetHelpStringDll(
                [in] LPOLESTR szFileName
            );
}

cpp_quote("/* DISPID reserved to indicate an \"unknown\" name */")
cpp_quote("/* only reserved for data members (properties); reused as a method dispid below */")
const DISPID DISPID_UNKNOWN = -1;

cpp_quote("/* DISPID reserved for the \"value\" property */")
const DISPID DISPID_VALUE = 0;

cpp_quote("/* The following DISPID is reserved to indicate the param")
cpp_quote(" * that is the right-hand-side (or \"put\" value) of a PropertyPut")
cpp_quote(" */")
const DISPID DISPID_PROPERTYPUT = -3;

cpp_quote("/* DISPID reserved for the standard \"NewEnum\" method */")
const DISPID DISPID_NEWENUM = -4;

cpp_quote("/* DISPID reserved for the standard \"Evaluate\" method */")
const DISPID DISPID_EVALUATE = -5;

const DISPID DISPID_CONSTRUCTOR = -6;

const DISPID DISPID_DESTRUCTOR = -7;
const DISPID DISPID_COLLECT = -8;

[
    object,
    uuid(00020403-0000-0000-C000-000000000046),
    pointer_default(unique)
]

interface ITypeComp : IUnknown
{
    typedef [unique] ITypeComp * LPTYPECOMP;

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

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

    [local]
    HRESULT Bind(
                [in] LPOLESTR szName,
                [in] ULONG lHashVal,
                [in] WORD wFlags,
                [out] ITypeInfo ** ppTInfo,
                [out] DESCKIND * pDescKind,
                [out] BINDPTR * pBindPtr
            );

    [call_as(Bind)]
    HRESULT RemoteBind(
                [in] LPOLESTR szName,
                [in] ULONG lHashVal,
                [in] WORD wFlags,
                [out] ITypeInfo ** ppTInfo,
                [out] DESCKIND * pDescKind,
                [out] LPFUNCDESC * ppFuncDesc,
                [out] LPVARDESC * ppVarDesc,
                [out] ITypeComp ** ppTypeComp,
                [out] CLEANLOCALSTORAGE * pDummy
            );

    [local]
    HRESULT BindType(
                [in] LPOLESTR szName,
                [in] ULONG lHashVal,
                [out] ITypeInfo ** ppTInfo,
                [out] ITypeComp ** ppTComp
            );

    [call_as(BindType)]
    HRESULT RemoteBindType(
                [in] LPOLESTR szName,
                [in] ULONG lHashVal,
                [out] ITypeInfo ** ppTInfo
            );
}


[
    object,
    uuid(00020401-0000-0000-C000-000000000046),
    pointer_default(unique)
]

interface ITypeInfo : IUnknown
{
    typedef [unique] ITypeInfo * LPTYPEINFO;

    [local]
    HRESULT GetTypeAttr(
                [out] TYPEATTR ** ppTypeAttr
            );

    [call_as(GetTypeAttr)]
    HRESULT RemoteGetTypeAttr(
                [out] LPTYPEATTR * ppTypeAttr,
                [out] CLEANLOCALSTORAGE * pDummy
            );

    HRESULT GetTypeComp(
                [out] ITypeComp ** ppTComp
            );

    [local]
    HRESULT GetFuncDesc(
                [in] UINT index,
                [out] FUNCDESC ** ppFuncDesc
            );

    [call_as(GetFuncDesc)]
    HRESULT RemoteGetFuncDesc(
                [in] UINT index,
                [out] LPFUNCDESC * ppFuncDesc,
                [out] CLEANLOCALSTORAGE * pDummy
            );

    [local]
    HRESULT GetVarDesc(
                [in] UINT index,
                [out] VARDESC ** ppVarDesc
            );

    [call_as(GetVarDesc)]
    HRESULT RemoteGetVarDesc(
                [in] UINT index,
                [out] LPVARDESC * ppVarDesc,
                [out] CLEANLOCALSTORAGE * pDummy
            );

    [local]
    HRESULT GetNames(
                [in] MEMBERID memid,
                [out,size_is(cMaxNames),length_is(*pcNames)] BSTR * rgBstrNames,
                [in] UINT cMaxNames,
                [out] UINT * pcNames
            );

    [call_as(GetNames)]
    HRESULT RemoteGetNames(
                [in] MEMBERID memid,
                [out,size_is(cMaxNames),length_is(*pcNames)] BSTR * rgBstrNames,
                [in] UINT cMaxNames,
                [out] UINT * pcNames
            );

    HRESULT GetRefTypeOfImplType(
                [in] UINT index,
                [out] HREFTYPE * pRefType
            );

    HRESULT GetImplTypeFlags(
                [in] UINT index,
                [out] INT * pImplTypeFlags
            );

    HRESULT GetIDsOfNames(
                [in, size_is(cNames)] LPOLESTR * rgszNames,
                [in] UINT cNames,
                [out, size_is(cNames)] MEMBERID * pMemId
            );

    [local]
    HRESULT Invoke(
                [in] PVOID pvInstance,
                [in] MEMBERID memid,
                [in] WORD wFlags,
                [in, out] DISPPARAMS * pDispParams,
                [out] VARIANT * pVarResult,
                [out] EXCEPINFO * pExcepInfo,
                [out] UINT * puArgErr
            );

    [call_as(Invoke)]
    HRESULT RemoteInvoke (
                [in] IUnknown * pIUnk,
                [in] MEMBERID memid,
                [in] DWORD dwFlags,
                [in] DISPPARAMS * pDispParams,
                [out] VARIANT * pVarResult,
                [out] EXCEPINFO * pExcepInfo,
                [out] UINT * pArgErr,
                [in] UINT cVarRef,
                [in, size_is(cVarRef)] UINT * rgVarRefIdx,
                [in, out, size_is(cVarRef)] VARIANTARG * rgVarRef
            );

    [local]
    HRESULT GetDocumentation(
                [in] MEMBERID memid,
                [out] BSTR * pBstrName,
                [out] BSTR * pBstrDocString,
                [out] DWORD * pdwHelpContext,
                [out] BSTR * pBstrHelpFile
            );

    [call_as(GetDocumentation)]
    HRESULT RemoteGetDocumentation(
                [in] MEMBERID memid,
                [in] DWORD refPtrFlags,
                [out] BSTR * pBstrName,
                [out] BSTR * pBstrDocString,
                [out] DWORD * pdwHelpContext,
                [out] BSTR * pBstrHelpFile
            );

    [local]
    HRESULT GetDllEntry(
                [in] MEMBERID memid,
                [in] INVOKEKIND invKind,
                [out] BSTR * pBstrDllName,
                [out] BSTR * pBstrName,
                [out] WORD * pwOrdinal
            );

    [call_as(GetDllEntry)]
    HRESULT RemoteGetDllEntry(
                [in] MEMBERID memid,
                [in] INVOKEKIND invKind,
                [in] DWORD refPtrFlags,
                [out] BSTR * pBstrDllName,
                [out] BSTR * pBstrName,
                [out] WORD * pwOrdinal
            );

    HRESULT GetRefTypeInfo(
                [in] HREFTYPE hRefType,
                [out] ITypeInfo ** ppTInfo
            );

    [local]
    HRESULT AddressOfMember(
                [in] MEMBERID memid,
                [in] INVOKEKIND invKind,
                [out] PVOID * ppv
            );

    [call_as(AddressOfMember)]
    HRESULT LocalAddressOfMember(
                void
            );

    [local]
    HRESULT CreateInstance(
                [in] IUnknown * pUnkOuter,
                [in,ref] IID* riid,
                [out, iid_is(riid)] PVOID * ppvObj
            );

    [call_as(CreateInstance)]
    HRESULT RemoteCreateInstance(
                [in,ref] IID* riid,
                [out, iid_is(riid)] IUnknown ** ppvObj
            );

    HRESULT GetMops(
                [in] MEMBERID memid,
                [out] BSTR * pBstrMops
            );

    [local]
    HRESULT GetContainingTypeLib(
                [out] ITypeLib ** ppTLib,
                [out] UINT * pIndex
            );

    [call_as(GetContainingTypeLib)]
    HRESULT RemoteGetContainingTypeLib(
                [out] ITypeLib ** ppTLib,
                [out] UINT * pIndex
            );

    [local]
    void ReleaseTypeAttr(
                [in,ptr] TYPEATTR * pTypeAttr
            );

    [call_as(ReleaseTypeAttr)]
    HRESULT LocalReleaseTypeAttr(
                void
            );

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

    [call_as(ReleaseFuncDesc)]
    HRESULT LocalReleaseFuncDesc(
                void
            );

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

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



[
    object,
    uuid(00020412-0000-0000-C000-000000000046),
    pointer_default(unique)
]

interface ITypeInfo2 : ITypeInfo
{
    typedef [unique] ITypeInfo2 * LPTYPEINFO2;

    HRESULT GetTypeKind(
                [out] TYPEKIND * pTypeKind
            );

    HRESULT GetTypeFlags(
                [out] ULONG * pTypeFlags
            );

    HRESULT GetFuncIndexOfMemId(
                [in] MEMBERID memid, 
                [in] INVOKEKIND invKind, 
                [out] UINT * pFuncIndex
            );

    HRESULT GetVarIndexOfMemId(
                [in] MEMBERID memid, 
                [out] UINT * pVarIndex
            );

    HRESULT GetCustData(
                [in] REFGUID guid,
                [out] VARIANT * pVarVal
            );
    
    HRESULT GetFuncCustData(
                [in] UINT index, 
                [in] REFGUID guid, 
                [out] VARIANT * pVarVal
            );
    
    HRESULT GetParamCustData(
                [in] UINT indexFunc, 
                [in] UINT indexParam, 
                [in] REFGUID guid, 
                [out] VARIANT * pVarVal
            );

    HRESULT GetVarCustData(
                [in] UINT index, 
                [in] REFGUID guid, 
                [out] VARIANT * pVarVal
            );

    HRESULT GetImplTypeCustData(
                [in] UINT index, 
                [in] REFGUID guid, 
                [out] VARIANT * pVarVal
            );

    [local]
    HRESULT GetDocumentation2(
                [in] MEMBERID memid,
                [in] LCID lcid,
                [out] BSTR *pbstrHelpString,
                [out] DWORD *pdwHelpStringContext,
                [out] BSTR *pbstrHelpStringDll
            );

    [call_as(GetDocumentation2)]
    HRESULT RemoteGetDocumentation2(
                [in] MEMBERID memid,
                [in] LCID lcid,
                [in] DWORD refPtrFlags,
                [out] BSTR *pbstrHelpString,
                [out] DWORD *pdwHelpStringContext,
                [out] BSTR *pbstrHelpStringDll
            );

    HRESULT GetAllCustData(
                [out] CUSTDATA * pCustData
            );
    
    HRESULT GetAllFuncCustData(
                [in] UINT index, 
                [out] CUSTDATA * pCustData
            );
    
    HRESULT GetAllParamCustData(
                [in] UINT indexFunc, 
                [in] UINT indexParam, 
                [out] CUSTDATA * pCustData
            );

    HRESULT GetAllVarCustData(
                [in] UINT index, 
                [out] CUSTDATA * pCustData
            );

    HRESULT GetAllImplTypeCustData(
                [in] UINT index, 
                [out] CUSTDATA * pCustData
            );
}


[
    object,
    uuid(00020402-0000-0000-C000-000000000046),
    pointer_default(unique)
]

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

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

    typedef [unique] ITypeLib * LPTYPELIB;

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

    [local]
    UINT GetTypeInfoCount(
                void
            );

    [call_as(GetTypeInfoCount)]
    HRESULT RemoteGetTypeInfoCount(
                [out]  UINT * pcTInfo
            );

    HRESULT GetTypeInfo(
                [in]  UINT index,
                [out] ITypeInfo ** ppTInfo
            );

    HRESULT GetTypeInfoType(
                [in]  UINT index,
                [out] TYPEKIND * pTKind
            );

    HRESULT GetTypeInfoOfGuid(
                [in]  REFGUID guid,
                [out] ITypeInfo ** ppTinfo
            );

    [local]
    HRESULT GetLibAttr(
                [out] TLIBATTR ** ppTLibAttr
            );

    [call_as(GetLibAttr)]
    HRESULT RemoteGetLibAttr(
                [out] LPTLIBATTR * ppTLibAttr,
                [out] CLEANLOCALSTORAGE * pDummy
            );

    HRESULT GetTypeComp(
                [out] ITypeComp ** ppTComp
            );

    [local]
    HRESULT GetDocumentation(
                [in]  INT index,
                [out] BSTR * pBstrName,
                [out] BSTR * pBstrDocString,
                [out] DWORD * pdwHelpContext,
                [out] BSTR * pBstrHelpFile
            );

    [call_as(GetDocumentation)]
    HRESULT RemoteGetDocumentation(
                [in]  INT index,
                [in]  DWORD refPtrFlags,
                [out] BSTR * pBstrName,
                [out] BSTR * pBstrDocString,
                [out] DWORD * pdwHelpContext,
                [out] BSTR * pBstrHelpFile
            );

    [local]
    HRESULT IsName(
                [in, out] LPOLESTR szNameBuf,
                [in] ULONG lHashVal,
                [out] BOOL * pfName
            );

    [call_as(IsName)]
    HRESULT RemoteIsName(
                [in] LPOLESTR szNameBuf,
                [in] ULONG lHashVal,
                [out] BOOL * pfName,
                [out] BSTR * pBstrLibName
            );

    [local]
    HRESULT FindName(
                [in, out] LPOLESTR szNameBuf,
                [in] ULONG lHashVal,
                [out,size_is(*pcFound),length_is(*pcFound)] ITypeInfo **ppTInfo,
                [out,size_is(*pcFound),length_is(*pcFound)] MEMBERID * rgMemId,
                [in, out] USHORT * pcFound
            );

    [call_as(FindName)]
    HRESULT RemoteFindName(
                [in] LPOLESTR szNameBuf,
                [in] ULONG lHashVal,
                [out,size_is(*pcFound),length_is(*pcFound)] ITypeInfo **ppTInfo,
                [out,size_is(*pcFound),length_is(*pcFound)] MEMBERID * rgMemId,
                [in, out] USHORT * pcFound,
                [out] BSTR * pBstrLibName
            );

    [local]
    void ReleaseTLibAttr(
                [in,ptr]  TLIBATTR * pTLibAttr
            );

    [call_as(ReleaseTLibAttr)]
    HRESULT LocalReleaseTLibAttr(
                void
            );
}


[
    object,
    uuid(00020411-0000-0000-C000-000000000046),
    pointer_default(unique)
]

interface ITypeLib2 : ITypeLib
{
    typedef [unique] ITypeLib2 * LPTYPELIB2;

    HRESULT GetCustData(
                [in] GUID* guid,
                [out] VARIANT * pVarVal
            );

    [local]
    HRESULT GetLibStatistics(
                [out] ULONG * pcUniqueNames,
                [out] ULONG * pcchUniqueNames
            );

    [call_as(GetLibStatistics)]
    HRESULT RemoteGetLibStatistics(
                [out] ULONG * pcUniqueNames,
                [out] ULONG * pcchUniqueNames
            );

    [local]
    HRESULT GetDocumentation2(
                [in]  INT index,
                [in]  LCID lcid,
                [out] BSTR *pbstrHelpString,
                [out] DWORD *pdwHelpStringContext,
                [out] BSTR *pbstrHelpStringDll
            );

    [call_as(GetDocumentation2)]
    HRESULT RemoteGetDocumentation2(
                [in]  INT index,
                [in]  LCID lcid,
                [in]  DWORD refPtrFlags,
                [out] BSTR *pbstrHelpString,
                [out] DWORD *pdwHelpStringContext,
                [out] BSTR *pbstrHelpStringDll
            );


    HRESULT GetAllCustData(
                [out] CUSTDATA * pCustData
            );
}


[
    object,
    uuid(00020410-0000-0000-C000-000000000046),
    pointer_default(unique),
    local
]

interface ITypeChangeEvents: IUnknown
{
    typedef [unique] ITypeChangeEvents * LPTYPECHANGEEVENTS;

    // notification messages used by the dynamic typeinfo protocol.
    typedef enum tagCHANGEKIND {
        CHANGEKIND_ADDMEMBER,
        CHANGEKIND_DELETEMEMBER,
        CHANGEKIND_SETNAMES,
        CHANGEKIND_SETDOCUMENTATION,
        CHANGEKIND_GENERAL,
        CHANGEKIND_INVALIDATE,
        CHANGEKIND_CHANGEFAILED,
        CHANGEKIND_MAX
    } CHANGEKIND;

    HRESULT RequestTypeChange(
                [in] CHANGEKIND changeKind,
                [in] ITypeInfo * pTInfoBefore,
                [in] LPOLESTR pStrName,
                [out] INT * pfCancel
            );
    
    HRESULT AfterTypeChange(
                [in] CHANGEKIND changeKind,
                [in] ITypeInfo * pTInfoAfter,
                [in] LPOLESTR pStrName
            );
}

};