5 Appendix A: Full IDL

 import "ms-dtyp.idl";
  
 // forward declaration
 typedef tag_inner_PROPVARIANT PROPVARIANT;
  
 // basic type aliases
 typedef unsigned long    PROPID;
 typedef short            VARIANT_BOOL;
  
  
 typedef struct {
   unsigned char rgb[16];
 } XACTUOW;
  
 typedef struct tagBLOB {
     unsigned long cbSize;
     [size_is(cbSize)]
     unsigned char *pBlobData;
 } BLOB;
  
 typedef struct tagCAUB
 {
     unsigned long   cElems;
     [size_is( cElems )]
     unsigned char *  pElems;
 } CAUB;
  
 typedef struct tagCAUI
 {
     unsigned long   cElems;
     [size_is( cElems )]
     unsigned short *  pElems;
 } CAUI;
  
 typedef struct tagCAL
 {
     unsigned long   cElems;
     [size_is( cElems )]
     long  *  pElems;
 } CAL;
  
 typedef struct tagCAUL
 {
     unsigned long   cElems;
     [size_is( cElems )]
     unsigned long *  pElems;
 } CAUL;
  
 typedef struct tagCAUH
 {
     unsigned long   cElems;
     [size_is( cElems )]
     ULARGE_INTEGER *  pElems;
 } CAUH;
  
 typedef struct tagCACLSID
 {
     unsigned long   cElems;
     [size_is( cElems )]
     GUID *  pElems;
 } CACLSID;
  
 typedef struct tagCALPWSTR
 {
     unsigned long   cElems;
     [size_is( cElems )]
     [string] wchar_t **  pElems;
 } CALPWSTR;
  
 typedef struct tagCAPROPVARIANT
 {
     unsigned long cElems;
     [size_is( cElems )]
     PROPVARIANT * pElems;
 } CAPROPVARIANT;
  
 typedef enum 
 {
     VT_EMPTY           = 0,
     VT_NULL            = 1,
     VT_I2              = 2,
     VT_I4              = 3,
     VT_BOOL            = 11,
     VT_VARIANT         = 12,
     VT_I1              = 16,
     VT_UI1             = 17,
     VT_UI2             = 18,
     VT_UI4             = 19,
     VT_I8              = 20,
     VT_UI8             = 21,
     VT_LPWSTR          = 31,
     VT_BLOB            = 65,
     VT_CLSID           = 72,
  
     VT_VECTOR          = 0x1000,
 } VARENUM;
  
 typedef unsigned short VARTYPE;
  
 typedef struct _tag_inner_PROPVARIANT
 {
     VARTYPE vt;
     UCHAR   wReserved1;
     UCHAR   wReserved2;
     ULONG   wReserved3;
     [switch_is(vt)] union
     {
         [case (VT_EMPTY, VT_NULL)];
         [case (VT_I1)]              CHAR            cVal;
         [case (VT_UI1)]             UCHAR           bVal;
         [case (VT_I2)]              SHORT           iVal;
         [case (VT_UI2)]             USHORT          uiVal;
         [case (VT_I4)]              LONG            lVal;
         [case (VT_UI4)]             ULONG           ulVal;
         [case (VT_I8)]              LARGE_INTEGER   hVal;
         [case (VT_UI8)]             ULARGE_INTEGER  uhVal;        
         [case (VT_BOOL)]            VARIANT_BOOL    boolVal;        
         [case (VT_CLSID)]           GUID *          puuid;
         [case (VT_BLOB)]            BLOB            blob;
         [case (VT_LPWSTR)]          [string] wchar_t * pwszVal;        
         [case (VT_VECTOR|VT_UI1)]     CAUB          caub;
         [case (VT_VECTOR|VT_UI2)]     CAUI          caui;
         [case (VT_VECTOR|VT_I4)]      CAL           cal;
         [case (VT_VECTOR|VT_UI4)]     CAUL          caul;
         [case (VT_VECTOR|VT_UI8)]     CAUH          cauh;
         [case (VT_VECTOR|VT_CLSID)]   CACLSID       cauuid;
         [case (VT_VECTOR|VT_LPWSTR)]  CALPWSTR      calpwstr;
         [case (VT_VECTOR|VT_VARIANT)] CAPROPVARIANT capropvar;
     } _varUnion;
 } tag_inner_PROPVARIANT;
  
 typedef struct _DL_ID {
   GUID m_DlGuid;
   [string] wchar_t * m_pwzDomain;
 } DL_ID;
  
 typedef struct _MULTICAST_ID {
   ULONG m_address;
   ULONG m_port;
 } MULTICAST_ID;
  
 typedef struct _OBJECTID {
   GUID Lineage;
   DWORD Uniquifier;
 } OBJECTID;
  
 typedef  enum __QUEUE_FORMAT_TYPE
 {
   QUEUE_FORMAT_TYPE_UNKNOWN = 0,
   QUEUE_FORMAT_TYPE_PUBLIC = 1,
   QUEUE_FORMAT_TYPE_PRIVATE = 2,
   QUEUE_FORMAT_TYPE_DIRECT = 3,
   QUEUE_FORMAT_TYPE_MACHINE = 4,
   QUEUE_FORMAT_TYPE_CONNECTOR = 5,
   QUEUE_FORMAT_TYPE_DL = 6,
   QUEUE_FORMAT_TYPE_MULTICAST = 7,
   QUEUE_FORMAT_TYPE_SUBQUEUE = 8
 } QUEUE_FORMAT_TYPE;
 typedef struct __QUEUE_FORMAT {
   unsigned char m_qft;
   unsigned char m_SuffixAndFlags;
   unsigned short m_reserved;
   [switch_is(m_qft)] union {
     [case(QUEUE_FORMAT_TYPE_UNKNOWN)] 
       ; // No member is set. Selected when an m_qft value
         // of 0 is returned.
     [case(QUEUE_FORMAT_TYPE_PUBLIC)] 
       GUID m_gPublicID;
     [case(QUEUE_FORMAT_TYPE_PRIVATE)] 
       OBJECTID m_oPrivateID;
     [case(QUEUE_FORMAT_TYPE_DIRECT)] 
       [string] wchar_t* m_pDirectID;
     [case(QUEUE_FORMAT_TYPE_MACHINE)] 
       GUID m_gMachineID;
     [case(QUEUE_FORMAT_TYPE_CONNECTOR)] 
       GUID m_GConnectorID;
     [case(QUEUE_FORMAT_TYPE_DL)] 
       DL_ID m_DlID;
     [case(QUEUE_FORMAT_TYPE_MULTICAST)] 
       MULTICAST_ID m_MulticastID;
     [case(QUEUE_FORMAT_TYPE_SUBQUEUE)] 
       [string] wchar_t* m_pDirectSubqueueID;
   };
 } QUEUE_FORMAT;