view org.eclipse.swt.win32.win32.x86/src/org/eclipse/swt/internal/ole/win32/OAIDL.d @ 0:6dd524f61e62

add dwt win and basic java stuff
author Frank Benoit <benoit@tionex.de>
date Mon, 02 Mar 2009 14:44:16 +0100
parents
children 2e09b0e6857a
line wrap: on
line source

module org.eclipse.swt.internal.ole.win32.OAIDL;

//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright 1992 - 1998 Microsoft Corporation.
//
//  File: oaidl.idl
//
//----------------------------------------------------------------------------

//private import std.c.windows.windows;
//private import std.c.windows.com;
private import org.eclipse.swt.internal.ole.win32.OBJIDL;
private import org.eclipse.swt.internal.ole.win32.extras;
private import org.eclipse.swt.internal.win32.WINTYPES;
private import org.eclipse.swt.ole.win32.Variant;

extern(Windows) {

struct  DECIMAL
    {
    USHORT wReserved;
    BYTE scale;
    BYTE sign;
    ULONG Hi32;
    ulong Lo64;
    }	;

alias wchar * BSTR;
struct  FLAGGED_WORD_BLOB
    {
    ULONG fFlags;
    ULONG clSize;
    ushort[1] asData;
    }

alias FLAGGED_WORD_BLOB  *wireBSTR;

 struct BYTE_SIZEDARR
    {
    ULONG clSize;
    byte  *pData;
    }	;

 struct  WORD_SIZEDARR
    {
    ULONG clSize;
    ushort *pData;
    }	;

struct  DWORD_SIZEDARR
    {
    ULONG clSize;
    ULONG * pData;
    }	;

struct  HYPER_SIZEDARR
    {
    ULONG clSize;
    long *pData;
    }


enum
{	VT_EMPTY	= 0,
	VT_NULL	= 1,
	VT_I2	= 2,
	VT_I4	= 3,
	VT_R4	= 4,
	VT_R8	= 5,
	VT_CY	= 6,
	VT_DATE	= 7,
	VT_BSTR	= 8,
	VT_DISPATCH	= 9,
	VT_ERROR	= 10,
	VT_BOOL	= 11,
	VT_VARIANT	= 12,
	VT_UNKNOWN	= 13,
	VT_DECIMAL	= 14,
	VT_I1	= 16,
	VT_UI1	= 17,
	VT_UI2	= 18,
	VT_UI4	= 19,
	VT_I8	= 20,
	VT_UI8	= 21,
	VT_INT	= 22,
	VT_UINT	= 23,
	VT_VOID	= 24,
	VT_HRESULT	= 25,
	VT_PTR	= 26,
	VT_SAFEARRAY	= 27,
	VT_CARRAY	= 28,
	VT_USERDEFINED	= 29,
	VT_LPSTR	= 30,
	VT_LPWSTR	= 31,
	VT_RECORD	= 36,
	VT_FILETIME	= 64,
	VT_BLOB	= 65,
	VT_STREAM	= 66,
	VT_STORAGE	= 67,
	VT_STREAMED_OBJECT	= 68,
	VT_STORED_OBJECT	= 69,
	VT_BLOB_OBJECT	= 70,
	VT_CF	= 71,
	VT_CLSID	= 72,
	VT_BSTR_BLOB	= 0xfff,
	VT_VECTOR	= 0x1000,
	VT_ARRAY	= 0x2000,
	VT_BYREF	= 0x4000,
	VT_RESERVED	= 0x8000,
	VT_ILLEGAL	= 0xffff,
	VT_ILLEGALMASKED	= 0xfff,
	VT_TYPEMASK	= 0xfff
};


/*
cpp_quote("//+-------------------------------------------------------------------------")
cpp_quote("//")
cpp_quote("//  Microsoft Windows")
cpp_quote("//  Copyright 1992 - 1998 Microsoft Corporation.")
cpp_quote("//")
cpp_quote("//--------------------------------------------------------------------------")

cpp_quote("#if ( _MSC_VER >= 800 )")
*/
//cpp_quote("#pragma warning(disable:4201)    /* Nameless struct/union */")
/*
cpp_quote("#endif")

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

interface ICreateTypeInfo;
interface ICreateTypeInfo2;
interface ICreateTypeLib;
interface ICreateTypeLib2;
interface IDispatch;
interface IEnumVARIANT;
interface ITypeComp;
interface ITypeInfo;
interface ITypeInfo2;
interface ITypeLib;
interface ITypeLib2;
interface ITypeChangeEvents;
interface IErrorInfo;
interface ICreateErrorInfo;
interface ISupportErrorInfo;
interface ITypeFactory;
interface ITypeMarshal;
interface IRecordInfo;


[
  version(1.0), pointer_default(unique)
]

interface IOleAutomationTypes
{

typedef CY CURRENCY;

// #########################################################################
//      SAFEARRAY
// #########################################################################
*/
struct SAFEARRAYBOUND {
    ULONG cElements;
    LONG  lLbound;
}
alias SAFEARRAYBOUND * LPSAFEARRAYBOUND;

struct _wireVARIANT {
}
struct _wireBRECORD {
}
// Forward references.
alias _wireVARIANT * wireVARIANT;
alias _wireBRECORD * wireBRECORD;

struct SAFEARR_BSTR {
    ULONG Size;
    wireBSTR * aBstr;
}
struct SAFEARR_UNKNOWN {
    ULONG Size;
    IUnknown * apUnknown;
}

struct SAFEARR_DISPATCH {
    ULONG Size;
    IDispatch * apDispatch;
}

struct SAFEARR_VARIANT {
    ULONG Size;
    wireVARIANT * aVariant;
}

struct SAFEARR_BRECORD {
    ULONG Size;
    wireBRECORD * aRecord;
}

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

enum SF_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,
}

union uSAFEARRAY_UNION {
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;
}

struct SAFEARRAY_UNION {
	ULONG sfType;
	uSAFEARRAY_UNION u;
}

alias SAFEARRAY_UNION SAFEARRAYUNION;

struct wireSAFEARRAY {
    USHORT cDims;
    USHORT fFeatures;
    ULONG  cbElements;
    ULONG  cLocks;
    SAFEARRAYUNION uArrayStructs;
    SAFEARRAYBOUND[1] rgsabound;
}
alias wireSAFEARRAY SAFEARRAY ;

alias wireSAFEARRAY * wirePSAFEARRAY;


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

alias SAFEARRAY * LPSAFEARRAY;

const USHORT FADF_AUTO       = 0x0001;  /* array is allocated on the stack */
const USHORT FADF_STATIC     = 0x0002;  /* array is staticly allocated */
const USHORT FADF_EMBEDDED   = 0x0004;  /* array is embedded in a structure */
const USHORT FADF_FIXEDSIZE  = 0x0010;  /* may not be resized or reallocated */
const USHORT FADF_RECORD     = 0x0020;  /* an array of records */
const USHORT FADF_HAVEIID    = 0x0040;  /* with FADF_DISPATCH, FADF_UNKNOWN */
                                        /* array has an IID for interfaces */
const USHORT FADF_HAVEVARTYPE= 0x0080;  /* array has a VT type */
const USHORT FADF_BSTR       = 0x0100;  /* an array of BSTRs */
const USHORT FADF_UNKNOWN    = 0x0200;  /* an array of IUnknown* */
const USHORT FADF_DISPATCH   = 0x0400;  /* an array of IDispatch* */
const USHORT FADF_VARIANT    = 0x0800;  /* an array of VARIANTs */
const USHORT FADF_RESERVED   = 0xF008;  /* reserved bits */


// #########################################################################
//      VARIANT
// #########################################################################
/*
cpp_quote("#if (__STDC__ && !defined(_FORCENAMELESSUNION)) || defined(NONAMELESSUNION)")
cpp_quote("#define __VARIANT_NAME_1 n1")
cpp_quote("#define __VARIANT_NAME_2 n2")
cpp_quote("#define __VARIANT_NAME_3 n3")
cpp_quote("#define __VARIANT_NAME_4 brecVal")
cpp_quote("#else")
cpp_quote("#define __tagVARIANT")
cpp_quote("#define __VARIANT_NAME_1")
cpp_quote("#define __VARIANT_NAME_2")
cpp_quote("#define __VARIANT_NAME_3")
cpp_quote("#define __tagBRECORD")
cpp_quote("#define __VARIANT_NAME_4")
cpp_quote("#endif")
*/

/*struct brecVal_t {
	PVOID         pvRecord;
	IRecordInfo * pRecInfo;
}*/
struct brecVal_t {
	PVOID         pvRecord;
	IUnknown * pRecInfo;
}

alias double DOUBLE;
alias double DATE;
alias VARIANT_BOOL _VARIANT_BOOL;
alias long CY;


union n3_t {
    LONG          lVal;         /* VT_I4                */
    BYTE          bVal;         /* VT_UI1               */
    SHORT         iVal;         /* VT_I2                */
    FLOAT         fltVal;       /* VT_R4                */
    DOUBLE        dblVal;       /* VT_R8                */
    VARIANT_BOOL  boolVal;      /* VT_BOOL              */
    _VARIANT_BOOL BOOLval;         /* (obsolete)           */
    SCODE         scode;        /* VT_ERROR             */
    CY            cyVal;        /* VT_CY                */
    DATE          date;         /* VT_DATE              */
    BSTR          bstrVal;      /* VT_BSTR              */
    IUnknown     punkVal;      /* VT_UNKNOWN           */
    IDispatch    pdispVal;     /* VT_DISPATCH          */
    SAFEARRAY *   parray;       /* VT_ARRAY             */
    BYTE *        pbVal;        /* VT_BYREF|VT_UI1      */
    SHORT *       piVal;        /* VT_BYREF|VT_I2       */
    LONG *        plVal;        /* VT_BYREF|VT_I4       */
    FLOAT *       pfltVal;      /* VT_BYREF|VT_R4       */
    DOUBLE *      pdblVal;      /* VT_BYREF|VT_R8       */
    VARIANT_BOOL *pboolVal;     /* VT_BYREF|VT_BOOL     */
    _VARIANT_BOOL *pbool;       /* (obsolete)           */
    SCODE *       pscode;       /* VT_BYREF|VT_ERROR    */
    CY *          pcyVal;       /* VT_BYREF|VT_CY       */
    DATE *        pdate;        /* VT_BYREF|VT_DATE     */
    BSTR *        pbstrVal;     /* VT_BYREF|VT_BSTR     */
    IUnknown *   ppunkVal;     /* VT_BYREF|VT_UNKNOWN  */
    IDispatch *   ppdispVal;    /* VT_BYREF|VT_DISPATCH */
    SAFEARRAY **  pparray;      /* VT_BYREF|VT_ARRAY    */
    VARIANT *     pvarVal;      /* VT_BYREF|VT_VARIANT  */
    PVOID         byref;        /* Generic ByRef        */
    CHAR          cVal;         /* VT_I1                */
    USHORT        uiVal;        /* VT_UI2               */
    ULONG         ulVal;        /* VT_UI4               */
    INT           intVal;       /* VT_INT               */
    UINT          uintVal;      /* VT_UINT              */
    DECIMAL *     pdecVal;      /* VT_BYREF|VT_DECIMAL  */
    CHAR *        pcVal;        /* VT_BYREF|VT_I1       */
    USHORT *      puiVal;       /* VT_BYREF|VT_UI2      */
    ULONG *       pulVal;       /* VT_BYREF|VT_UI4      */
    INT *         pintVal;      /* VT_BYREF|VT_INT      */
    UINT *        puintVal;     /* VT_BYREF|VT_UINT     */
	brecVal_t brecVal;         /* VT_RECORD            */
}

struct n2_t {
    VARTYPE vt;
    WORD    wReserved1;
    WORD    wReserved2;
    WORD    wReserved3;
    n3_t n3;
};
union n1_t {
	n2_t n2;
    DECIMAL decVal;
};

// in tango.sys.win32.Types
/+
struct VARIANT {
	n1_t n1;

	VARTYPE vt() { return n1.n2.vt; };
	void vt(VARTYPE val) { n1.n2.vt = val; }
	LONG lVal()  { return n1.n2.n3.lVal; }
	void lVal(LONG val) { return n1.n2.n3.lVal = val; }
	FLOAT fltVal()  { return n1.n2.n3.fltVal; }
	void fltVal(FLOAT val) { return n1.n2.n3.fltVal = val; }
	IDispatch pdispVal() { return n1.n2.n3.pdispVal; }
	void pdispVal(IDispatch val) { n1.n2.n3.pdispVal = val; }
	IUnknown punkVal() { return n1.n2.n3.punkVal; }
	void punkVal(IUnknown val) { n1.n2.n3.punkVal = val; }
	VARIANT_BOOL boolVal() { return n1.n2.n3.boolVal; }
	void boolVal(VARIANT_BOOL val) { n1.n2.n3.boolVal = val; }
	SHORT iVal() { return n1.n2.n3.iVal; }
	void iVal(SHORT val) { n1.n2.n3.iVal = val; }
	BSTR bstrVal() { return n1.n2.n3.bstrVal; }
	void bstrVal(BSTR val) { n1.n2.n3.bstrVal = val; }

};
+/


/*
struct VARIANT {
	LONG[4] mmmm;
}
*/
alias VARIANT * LPVARIANT;
alias VARIANT VARIANTARG;
alias VARIANT * LPVARIANTARG;

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


/+
struct _wireVARIANT {
    DWORD  clSize;
    DWORD  rpcReserved;
    USHORT vt;
    USHORT wReserved1;
    USHORT wReserved2;
    USHORT wReserved3;
    [switch_type(ULONG), switch_is(vt)] union {
    [case(VT_I4)]       LONG          lVal;         /* VT_I4                */
    [case(VT_UI1)]      BYTE          bVal;         /* VT_UI1               */
    [case(VT_I2)]       SHORT         iVal;         /* VT_I2                */
    [case(VT_R4)]       FLOAT         fltVal;       /* VT_R4                */
    [case(VT_R8)]       DOUBLE        dblVal;       /* VT_R8                */
    [case(VT_BOOL)]     VARIANT_BOOL  boolVal;      /* VT_BOOL              */
    [case(VT_ERROR)]    SCODE         scode;        /* VT_ERROR             */
    [case(VT_CY)]       CY            cyVal;        /* VT_CY                */
    [case(VT_DATE)]     DATE          date;         /* VT_DATE              */
    [case(VT_BSTR)]     wireBSTR      bstrVal;      /* VT_BSTR              */
    [case(VT_UNKNOWN)]  IUnknown *    punkVal;      /* VT_UNKNOWN           */
    [case(VT_DISPATCH)] IDispatch *   pdispVal;     /* VT_DISPATCH          */
    [case(VT_ARRAY)]    wireSAFEARRAY parray;       /* VT_ARRAY             */

    [case(VT_RECORD, VT_RECORD|VT_BYREF)]
                        wireBRECORD   brecVal;      /* VT_RECORD            */

    [case(VT_UI1|VT_BYREF)]
                        BYTE *        pbVal;        /* VT_BYREF|VT_UI1      */
    [case(VT_I2|VT_BYREF)]
                        SHORT *       piVal;        /* VT_BYREF|VT_I2       */
    [case(VT_I4|VT_BYREF)]
                        LONG *        plVal;        /* VT_BYREF|VT_I4       */
    [case(VT_R4|VT_BYREF)]
                        FLOAT *       pfltVal;      /* VT_BYREF|VT_R4       */
    [case(VT_R8|VT_BYREF)]
                        DOUBLE *      pdblVal;      /* VT_BYREF|VT_R8       */
    [case(VT_BOOL|VT_BYREF)]
                        VARIANT_BOOL *pboolVal;     /* VT_BYREF|VT_BOOL     */
    [case(VT_ERROR|VT_BYREF)]
                        SCODE *       pscode;       /* VT_BYREF|VT_ERROR    */
    [case(VT_CY|VT_BYREF)]
                        CY *          pcyVal;       /* VT_BYREF|VT_CY       */
    [case(VT_DATE|VT_BYREF)]
                        DATE *        pdate;        /* VT_BYREF|VT_DATE     */
    [case(VT_BSTR|VT_BYREF)]
                        wireBSTR *    pbstrVal;     /* VT_BYREF|VT_BSTR     */
    [case(VT_UNKNOWN|VT_BYREF)]
                        IUnknown **   ppunkVal;     /* VT_BYREF|VT_UNKNOWN  */
    [case(VT_DISPATCH|VT_BYREF)]
                        IDispatch **  ppdispVal;    /* VT_BYREF|VT_DISPATCH */
    [case(VT_ARRAY|VT_BYREF)]
                        wireSAFEARRAY *pparray;     /* VT_BYREF|VT_ARRAY    */
    [case(VT_VARIANT|VT_BYREF)]
                        wireVARIANT * pvarVal;      /* VT_BYREF|VT_VARIANT  */

    [case(VT_I1)]       CHAR          cVal;         /* VT_I1                */
    [case(VT_UI2)]      USHORT        uiVal;        /* VT_UI2               */
    [case(VT_UI4)]      ULONG         ulVal;        /* VT_UI4               */
    [case(VT_INT)]      INT           intVal;       /* VT_INT               */
    [case(VT_UINT)]     UINT          uintVal;      /* VT_UINT              */
    [case(VT_DECIMAL)]  DECIMAL       decVal;       /* VT_DECIMAL           */

    [case(VT_BYREF|VT_DECIMAL)]
                        DECIMAL *     pdecVal;      /* VT_BYREF|VT_DECIMAL  */
    [case(VT_BYREF|VT_I1)]
                        CHAR *        pcVal;        /* VT_BYREF|VT_I1       */
    [case(VT_BYREF|VT_UI2)]
                        USHORT *      puiVal;       /* VT_BYREF|VT_UI2      */
    [case(VT_BYREF|VT_UI4)]
                        ULONG *       pulVal;       /* VT_BYREF|VT_UI4      */
    [case(VT_BYREF|VT_INT)]
                        INT *         pintVal;      /* VT_BYREF|VT_INT      */
    [case(VT_BYREF|VT_UINT)]
                        UINT *        puintVal;     /* VT_BYREF|VT_UINT     */
    [case(VT_EMPTY)]    ;                           /* nothing              */
    [case(VT_NULL)]     ;                           /* nothing              */
    };
};
+/

//########################################################################
//     End of VARIANT & SAFEARRAY
//########################################################################


//TypeInfo stuff.

alias LONG DISPID;
alias DISPID MEMBERID;
alias DWORD HREFTYPE;

enum TYPEKIND {
    TKIND_ENUM = 0,
    TKIND_RECORD,
    TKIND_MODULE,
    TKIND_INTERFACE,
    TKIND_DISPATCH,
    TKIND_COCLASS,
    TKIND_ALIAS,
    TKIND_UNION,
    TKIND_MAX                   /* end of enum marker */
}
union TD_00{
        TYPEDESC * lptdesc;
        ARRAYDESC * lpadesc;
		  HREFTYPE hreftype;
};

struct TYPEDESC {
    TD_00 u;
    VARTYPE vt;
}

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

// parameter description
struct PARAMDESCEX {
    ULONG cBytes;               /* size of this structure */
    VARIANTARG varDefaultValue; /* default value of this parameter */
}
alias PARAMDESCEX * LPPARAMDESCEX;

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

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

struct IDLDESC {
    ULONG dwReserved;
    USHORT wIDLFlags;           /* IN, OUT, etc */
}
alias 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;


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

struct TYPEATTR {
    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 */
}
alias TYPEATTR * LPTYPEATTR;


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

struct EXCEPINFO {
    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;
}
/+

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 */")
+/

enum CALLCONV {
    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 */
}
enum FUNCKIND {
    FUNC_VIRTUAL,
    FUNC_PUREVIRTUAL,
    FUNC_NONVIRTUAL,
    FUNC_STATIC,
    FUNC_DISPATCH
}

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

struct FUNCDESC {
    MEMBERID memid;
    SCODE * lprgscode;
    ELEMDESC * lprgelemdescParam; /* array of param types */
    FUNCKIND funckind;
    INVOKEKIND invkind;
    CALLCONV callconv;
    SHORT cParams;
    SHORT cParamsOpt;
    SHORT oVft;
    SHORT cScodes;
    ELEMDESC elemdescFunc;
    WORD wFuncFlags;
}
alias FUNCDESC * LPFUNCDESC;

enum VARKIND {
    VAR_PERINSTANCE,
    VAR_STATIC,
    VAR_CONST,
    VAR_DISPATCH
}
/* IMPLTYPE Flags */
const USHORT IMPLTYPEFLAG_FDEFAULT      = 0x1;
const USHORT IMPLTYPEFLAG_FSOURCE       = 0x2;
const USHORT IMPLTYPEFLAG_FRESTRICTED   = 0x4;
const USHORT IMPLTYPEFLAG_FDEFAULTVTABLE= 0x8;

union VD_u {
        /* offset of variable within the instance */
	ULONG oInst;
	VARIANT * lpvarValue; /* the value of the constant */
}
struct VARDESC {
    MEMBERID memid;
    LPOLESTR lpstrSchema;
    VD_u u;
    ELEMDESC elemdescVar;
    WORD     wVarFlags;
    VARKIND  varkind;
}
alias VARDESC * LPVARDESC;

enum TYPEFLAGS {
    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
}

enum FUNCFLAGS {
    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
}

enum VARFLAGS {
    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
}

struct CLEANLOCALSTORAGE {
    IUnknown pInterface;      /* interface that is responsible for storage */
    PVOID pStorage;             /* the storage being managed by interface */
    DWORD flags;                /* which interface, what storage */
}

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

struct CUSTDATA {
    DWORD cCustData;            /* number of custom data items in rgCustData */
    LPCUSTDATAITEM prgCustData;
                                /* array of custom data items */
}
alias CUSTDATA * LPCUSTDATA;


interface ICreateTypeInfo: IUnknown
{
    HRESULT SetGuid( REFGUID guid );
    HRESULT SetTypeFlags( UINT uTypeFlags );
    HRESULT SetDocString( LPOLESTR pStrDoc );
    HRESULT SetHelpContext( DWORD dwHelpContext);
    HRESULT SetVersion( WORD wMajorVerNum, WORD wMinorVerNum );
    HRESULT AddRefTypeInfo( ITypeInfo pTInfo, HREFTYPE * phRefType );
    HRESULT AddFuncDesc( UINT index, FUNCDESC * pFuncDesc            );
    HRESULT AddImplType( UINT index, HREFTYPE hRefType             );
    HRESULT SetImplTypeFlags( UINT index, INT implTypeFlags            );
    HRESULT SetAlignment( WORD cbAlignment             );
    HRESULT SetSchema( LPOLESTR pStrSchema            );
    HRESULT AddVarDesc( UINT index, VARDESC * pVarDesc            );
    HRESULT SetFuncAndParamNames( UINT index, LPOLESTR * rgszNames, UINT cNames );
    HRESULT SetVarName( UINT index, LPOLESTR szName         );
    HRESULT SetTypeDescAlias( TYPEDESC * pTDescAlias    );
    HRESULT DefineFuncAsDllEntry( UINT index,LPOLESTR szDllName,LPOLESTR szProcName            );
    HRESULT SetFuncDocString( UINT index, LPOLESTR szDocString            );
    HRESULT SetVarDocString(UINT index,LPOLESTR szDocString            );
    HRESULT SetFuncHelpContext(UINT index,DWORD dwHelpContext            );
    HRESULT SetVarHelpContext(UINT index,DWORD dwHelpContext            );
    HRESULT SetMops(UINT index,BSTR bstrMops            );
    HRESULT SetTypeIdldesc(IDLDESC * pIdlDesc            );
    HRESULT LayOut();
}
alias ICreateTypeInfo LPCREATETYPEINFO;

interface ICreateTypeInfo2: ICreateTypeInfo
{
	HRESULT DeleteFuncDesc(UINT index);
	HRESULT DeleteFuncDescByMemId(MEMBERID memid,INVOKEKIND invKind);
	HRESULT DeleteVarDesc(UINT index);
	HRESULT DeleteVarDescByMemId(MEMBERID memid);
	HRESULT DeleteImplType(UINT index);
	HRESULT SetCustData(REFGUID guid,VARIANT * pVarVal);
	HRESULT SetFuncCustData(UINT index,REFGUID guid,VARIANT * pVarVal);
	HRESULT SetParamCustData(UINT indexFunc,UINT indexParam,REFGUID guid,VARIANT * pVarVal);
	HRESULT SetVarCustData(UINT index,REFGUID guid,VARIANT * pVarVal);
	HRESULT SetImplTypeCustData(UINT index,REFGUID guid,VARIANT * pVarVal);
	HRESULT SetHelpStringContext(ULONG dwHelpStringContext);
	HRESULT SetFuncHelpStringContext(UINT index,ULONG dwHelpStringContext);
	HRESULT SetVarHelpStringContext(UINT index,ULONG dwHelpStringContext);
	HRESULT Invalidate();
	HRESULT SetName(LPOLESTR szName);
}
alias ICreateTypeInfo2 LPCREATETYPEINFO2;

interface ICreateTypeLib : IUnknown
{
	HRESULT CreateTypeInfo(LPOLESTR szName,TYPEKIND tkind,ICreateTypeInfo * ppCTInfo);
	HRESULT SetName(LPOLESTR szName);
	HRESULT SetVersion(WORD wMajorVerNum,WORD wMinorVerNum);
	HRESULT SetGuid(REFGUID guid);
	HRESULT SetDocString( LPOLESTR szDoc);
	HRESULT SetHelpFileName(LPOLESTR szHelpFileName);
	HRESULT SetHelpContext(DWORD dwHelpContext);
	HRESULT SetLcid(LCID lcid);
	HRESULT SetLibFlags(UINT uLibFlags);
	HRESULT SaveAllChanges();
}
alias ICreateTypeLib LPCREATETYPELIB;

interface ICreateTypeLib2 : ICreateTypeLib
{
	HRESULT DeleteTypeInfo(LPOLESTR szName);
	HRESULT SetCustData(REFGUID guid,VARIANT * pVarVal);
	HRESULT SetHelpStringContext(ULONG dwHelpStringContext);
	HRESULT SetHelpStringDll(LPOLESTR szFileName);
}

interface IDispatch : IUnknown
{
HRESULT GetTypeInfoCount(UINT * pctinfo);
HRESULT GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo * ppTInfo);
HRESULT GetIDsOfNames(REFIID riid, LPOLESTR * rgszNames, UINT cNames, LCID lcid, DISPID * rgDispId);
HRESULT Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS* pDispParams,VARIANT* pVarResult,EXCEPINFO* pExcepInfo,UINT* puArgErr);
}
alias IDispatch LPDISPATCH;
const DISPID DISPID_UNKNOWN = cast(DISPID)-1;
const DISPID DISPID_VALUE = cast(DISPID)0;
const DISPID DISPID_PROPERTYPUT = cast(DISPID)-3;
const DISPID DISPID_NEWENUM = cast(DISPID)-4;
const DISPID DISPID_EVALUATE = cast(DISPID)-5;
const DISPID DISPID_CONSTRUCTOR = cast(DISPID)-6;
const DISPID DISPID_DESTRUCTOR = cast(DISPID)-7;
const DISPID DISPID_COLLECT = cast(DISPID)-8;

/+++++++++++++++++++++++++++++++++++++++

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

interface IEnumVARIANT : IUnknown
{
    typedef [unique] IEnumVARIANT* LPENUMVARIANT;

    [local]
    HRESULT Next(
                [in] ULONG celt,
                [out, size_is(celt), length_is(*pCeltFetched)] VARIANT * rgVar,
                [out] ULONG * pCeltFetched
            );

    [call_as(Next)]
    HRESULT RemoteNext(
                [in] ULONG celt,
                [out, size_is(celt), length_is(*pCeltFetched)] VARIANT * rgVar,
                [out] ULONG * pCeltFetched
            );

    HRESULT Skip(
                [in] ULONG celt
            );

    HRESULT Reset(
            );

    HRESULT Clone(
                [out] IEnumVARIANT ** ppEnum
            );
}


+/
enum DESCKIND {
        DESCKIND_NONE = 0,
        DESCKIND_FUNCDESC,
        DESCKIND_VARDESC,
        DESCKIND_TYPECOMP,
        DESCKIND_IMPLICITAPPOBJ,
        DESCKIND_MAX
}


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

interface ITypeComp : IUnknown
{

    HRESULT Bind(LPOLESTR szName,ULONG lHashVal,WORD wFlags,
ITypeInfo * ppTInfo,DESCKIND * pDescKind,BINDPTR * pBindPtr
            );


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

}

interface ITypeInfo : IUnknown
{
    HRESULT GetTypeAttr(TYPEATTR ** ppTypeAttr);
    HRESULT GetTypeComp( ITypeComp * ppTComp );
    HRESULT GetFuncDesc( UINT index, FUNCDESC ** ppFuncDesc );
    HRESULT GetVarDesc( UINT index,VARDESC ** ppVarDesc);
    HRESULT GetNames(MEMBERID memid,BSTR * rgBstrNames,UINT cMaxNames,UINT * pcNames);
    HRESULT GetRefTypeOfImplType(UINT index,HREFTYPE * pRefType);
    HRESULT GetImplTypeFlags(UINT index,INT * pImplTypeFlags);
    HRESULT GetIDsOfNames(LPOLESTR * rgszNames,UINT cNames,MEMBERID * pMemId);
    HRESULT Invoke(PVOID pvInstance,MEMBERID memid,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO * pExcepInfo,UINT * puArgErr);
    HRESULT GetDocumentation(MEMBERID memid,BSTR * pBstrName,BSTR * pBstrDocString,DWORD * pdwHelpContext,BSTR * pBstrHelpFile);
    HRESULT GetDllEntry(MEMBERID memid,INVOKEKIND invKind,BSTR * pBstrDllName,BSTR * pBstrName,WORD * pwOrdinal);
    HRESULT GetRefTypeInfo(HREFTYPE hRefType,ITypeInfo * ppTInfo);
    HRESULT AddressOfMember(MEMBERID memid,INVOKEKIND invKind,PVOID * ppv);
    HRESULT CreateInstance(IUnknown pUnkOuter,REFIID riid,PVOID * ppvObj);
    HRESULT GetMops(MEMBERID memid,BSTR * pBstrMops);
    HRESULT GetContainingTypeLib( ITypeLib ** ppTLib,UINT * pIndex);
    void ReleaseTypeAttr(TYPEATTR * pTypeAttr );
    void ReleaseFuncDesc( FUNCDESC * pFuncDesc  );
    void ReleaseVarDesc(VARDESC * pVarDesc            );
}
alias ITypeInfo LPTYPEINFO;

interface ITypeInfo2 : ITypeInfo
{
	HRESULT GetTypeKind(TYPEKIND * pTypeKind);
	HRESULT GetTypeFlags(ULONG * pTypeFlags);
	HRESULT GetFuncIndexOfMemId(MEMBERID memid,INVOKEKIND invKind,UINT * pFuncIndex);
	HRESULT GetVarIndexOfMemId(MEMBERID memid,UINT * pVarIndex);
	HRESULT GetCustData(REFGUID guid,VARIANT * pVarVal);
	HRESULT GetFuncCustData(UINT index,REFGUID guid,VARIANT * pVarVal);
	HRESULT GetParamCustData(UINT indexFunc,UINT indexParam,REFGUID guid,VARIANT * pVarVal);
	HRESULT GetVarCustData(UINT index,REFGUID guid,VARIANT * pVarVal);
	HRESULT GetImplTypeCustData(UINT index,REFGUID guid,VARIANT * pVarVal);
	HRESULT GetDocumentation2(MEMBERID memid,LCID lcid,BSTR *pbstrHelpString,DWORD *pdwHelpStringContext,BSTR *pbstrHelpStringDll);
	HRESULT GetAllCustData(CUSTDATA * pCustData);
	HRESULT GetAllFuncCustData(UINT index,CUSTDATA * pCustData);
	HRESULT GetAllParamCustData(UINT indexFunc,UINT indexParam,CUSTDATA * pCustData);
	HRESULT GetAllVarCustData(UINT index,CUSTDATA * pCustData);
	HRESULT GetAllImplTypeCustData(UINT index,CUSTDATA * pCustData);
}

alias ITypeInfo2 LPTYPEINFO2;

enum SYSKIND {
        SYS_WIN16 = 0,
        SYS_WIN32,
        SYS_MAC
}

enum LIBFLAGS {
        LIBFLAG_FRESTRICTED = 0x01,
        LIBFLAG_FCONTROL = 0x02,
        LIBFLAG_FHIDDEN = 0x04,
        LIBFLAG_FHASDISKIMAGE = 0x08
}

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

interface ITypeLib : IUnknown
{
    UINT GetTypeInfoCount(
            );

    HRESULT GetTypeInfo(
	UINT index,
ITypeInfo * ppTInfo
            );

HRESULT GetTypeInfoType(
	UINT index,
	TYPEKIND * pTKind
            );

   HRESULT GetTypeInfoOfGuid(
	REFGUID guid,
	ITypeInfo * ppTinfo
            );

    HRESULT GetLibAttr(
			TLIBATTR ** ppTLibAttr
);

    HRESULT GetTypeComp(ITypeComp * ppTComp            );

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

    HRESULT IsName(LPOLESTR szNameBuf,ULONG lHashVal,BOOL * pfName
            );

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

    void ReleaseTLibAttr(		TLIBATTR * pTLibAttr            );
}

alias ITypeLib  LPTYPELIB;

interface ITypeLib2 : ITypeLib
{
	HRESULT GetCustData(REFGUID guid,VARIANT * pVarVal);
	HRESULT GetLibStatistics(ULONG * pcUniqueNames,ULONG * pcchUniqueNames);
	HRESULT GetDocumentation2(INT index,LCID lcid,BSTR *pbstrHelpString,DWORD *pdwHelpStringContext,BSTR *pbstrHelpStringDll);
	HRESULT GetAllCustData(CUSTDATA * pCustData);
}
alias ITypeLib2 LPTYPELIB2;

enum CHANGEKIND {
        CHANGEKIND_ADDMEMBER,
        CHANGEKIND_DELETEMEMBER,
        CHANGEKIND_SETNAMES,
        CHANGEKIND_SETDOCUMENTATION,
        CHANGEKIND_GENERAL,
        CHANGEKIND_INVALIDATE,
        CHANGEKIND_CHANGEFAILED,
        CHANGEKIND_MAX,
        ADDMEMBER    = CHANGEKIND_ADDMEMBER,
        DELETEMEMBER = CHANGEKIND_DELETEMEMBER,
        SETNAMES     = CHANGEKIND_SETNAMES,
        SETDOCUMENTATION = CHANGEKIND_SETDOCUMENTATION,
        GENERAL          = CHANGEKIND_GENERAL,
        INVALIDATE       = CHANGEKIND_INVALIDATE,
        CHANGEFAILED     = CHANGEKIND_CHANGEFAILED,
        MAX       = CHANGEKIND_MAX
}

interface ITypeChangeEvents: IUnknown
{
    // notification messages used by the dynamic typeinfo protocol.
    HRESULT RequestTypeChange(CHANGEKIND changeKind,ITypeInfo pTInfoBefore,LPOLESTR pStrName,INT * pfCancel);
    HRESULT AfterTypeChange(CHANGEKIND changeKind,ITypeInfo pTInfoAfter,LPOLESTR pStrName);
}
alias ITypeChangeEvents LPTYPECHANGEEVENTS;

interface IErrorInfo: IUnknown
{
	HRESULT GetGUID( GUID * pGUID );
	HRESULT GetSource(BSTR * pBstrSource);
	HRESULT GetDescription(BSTR * pBstrDescription);
	HRESULT GetHelpFile(BSTR * pBstrHelpFile);
	HRESULT GetHelpContext(DWORD * pdwHelpContext);
}
alias IErrorInfo LPERRORINFO;

interface ICreateErrorInfo: IUnknown
{
	HRESULT SetGUID(REFGUID rguid);
	HRESULT SetSource(LPOLESTR szSource);
	HRESULT SetDescription(LPOLESTR szDescription);
	HRESULT SetHelpFile(LPOLESTR szHelpFile);
	HRESULT SetHelpContext(DWORD dwHelpContext);
}
alias ICreateErrorInfo LPCREATEERRORINFO;

interface ISupportErrorInfo: IUnknown
{
	HRESULT InterfaceSupportsErrorInfo(REFIID riid);
}
alias ISupportErrorInfo LPSUPPORTERRORINFO;

interface ITypeFactory : IUnknown
{
	HRESULT CreateFromTypeInfo(ITypeInfo pTypeInfo,REFIID riid, IUnknown *ppv);
}

interface ITypeMarshal : IUnknown
{
    HRESULT Size(PVOID pvType,DWORD dwDestContext,PVOID pvDestContext,ULONG * pSize);
    HRESULT Marshal(PVOID pvType,DWORD dwDestContext,PVOID pvDestContext,ULONG cbBufferLength,BYTE  * pBuffer,ULONG * pcbWritten);
    HRESULT Unmarshal(PVOID pvType,DWORD dwFlags,ULONG cbBufferLength,BYTE  * pBuffer,ULONG * pcbRead);
    HRESULT Free(PVOID pvType);
}


interface IRecordInfo: IUnknown
{
	HRESULT RecordInit(PVOID pvNew);
	HRESULT RecordClear(PVOID pvExisting);
	HRESULT RecordCopy(PVOID pvExisting,PVOID pvNew);
	HRESULT GetGuid(GUID * pguid);
	HRESULT GetName(BSTR * pbstrName);
	HRESULT GetSize(ULONG * pcbSize);
	HRESULT GetTypeInfo(ITypeInfo * ppTypeInfo);
	HRESULT GetField(PVOID pvData,LPCOLESTR szFieldName,VARIANT * pvarField);
	HRESULT GetFieldNoCopy(PVOID pvData,LPCOLESTR szFieldName,VARIANT * pvarField,PVOID * ppvDataCArray);
	HRESULT PutField(ULONG wFlags,PVOID pvData,LPCOLESTR szFieldName,VARIANT * pvarField);
	HRESULT PutFieldNoCopy(ULONG wFlags,PVOID pvData,LPCOLESTR szFieldName,VARIANT * pvarField);
	HRESULT GetFieldNames(ULONG * pcNames,BSTR * rgBstrNames);
	BOOL IsMatchingType(IRecordInfo pRecordInfo);
	PVOID RecordCreate();
	HRESULT RecordCreateCopy(PVOID pvSource,PVOID * ppvDest);
	HRESULT RecordDestroy(PVOID pvRecord);
}
alias IRecordInfo LPRECORDINFO;

} // extern(WIndows);