Here's the dcom.idl and generated .h I've used for my interapartment COM marshalling stuff, to be placed in dlls/ole32. It's obviously needed by all the rest of my stuff, so I'll let this get installed first, with whatever makefile rules are desired. Log: Ove Kaaven <ovek@transgaming.com> DCOM IDL file based on the DCOM specification. --- /dev/null 2003-01-10 01:23:22.000000000 +0100 +++ dlls/ole32/dcom.idl 2002-12-06 11:46:56.000000000 +0100 @@ -0,0 +1,274 @@ +/* see http://www.microsoft.com/msj/0398/dcom.htm */ +/* and the official DCOM specification + * (there's a copy at http://www.grimes.demon.co.uk/DCOM/DCOMSpec.htm) */ + +import "unknwn.idl"; + +[ + uuid(99fcfe60-5260-101b-bbcb-00aa0021347a), + pointer_default(unique) +] +interface ObjectRpcBaseTypes +{ + typedef unsigned hyper ID; + typedef ID MID; + typedef ID OXID; + typedef ID OID; + typedef ID SETID; + typedef GUID IPID; + typedef GUID CID; + typedef REFGUID REFIPID; + + const unsigned short COM_MINOR_VERSION_1 = 1; + const unsigned short COM_MINOR_VERSION_2 = 2; + + const unsigned short COM_MAJOR_VERSION = 5; + const unsigned short COM_MINOR_VERSION = 3; + + typedef struct tagCOMVERSION { + unsigned short MajorVersion; + unsigned short MinorVersion; + } COMVERSION; + + const unsigned long ORPCF_NULL = 0; + const unsigned long ORPCF_LOCAL = 1; + const unsigned long ORPCF_RESERVED1 = 2; + const unsigned long ORPCF_RESERVED2 = 4; + const unsigned long ORPCF_RESERVED3 = 8; + const unsigned long ORPCF_RESERVED4 = 16; + + typedef struct tagORPC_EXTENT { + GUID id; + unsigned long size; + [size_is((size+7)&~7)] byte data[]; + } ORPC_EXTENT; + + typedef struct tagORPC_EXTENT_ARRAY { + unsigned long size; + unsigned long reserved; + [size_is((size+1)&~1,), unique] ORPC_EXTENT **extent; + } ORPC_EXTENT_ARRAY; + + typedef struct tagORPCTHIS { + COMVERSION version; + unsigned long flags; + unsigned long reserved1; + CID cid; + [unique] ORPC_EXTENT_ARRAY *extensions; + } ORPCTHIS; + + typedef struct tagORPCTHAT { + unsigned long flags; + [unique] ORPC_EXTENT_ARRAY *extensions; + } ORPCTHAT; + + const unsigned short NCADG_IP_UDP = 0x08; + const unsigned short NCACN_IP_TCP = 0x07; + const unsigned short NCADG_IPX = 0x0E; + const unsigned short NCACN_SPX = 0x0C; + const unsigned short NCACN_NB_NB = 0x12; + const unsigned short NCACN_NB_IPX = 0x0D; + const unsigned short NCACN_DNET_NSP = 0x04; + const unsigned short NCACN_HTTP = 0x1F; + + typedef struct tagSTRINGBINDING { + unsigned short wTowerId; + [string] unsigned short aNetworkAddr[]; + } STRINGBINDING; + + const unsigned short COM_C_AUTHZ_NONE = 0xffff; + + typedef struct tagSECURITYBINDING { + unsigned short wAuthnSvc; + unsigned short wAuthzSvc; + [string] unsigned short aPrincName[]; + } SECURITYBINDING; + + typedef struct tagDUALSTRINGARRAY { + unsigned short wNumEntries; + unsigned short wSecurityOffset; + [size_is(wNumEntries)] unsigned short aStringArray[]; + } DUALSTRINGARRAY; + + const unsigned long OBJREF_SIGNATURE = 0x574f454d; /* "MEOW" */ + const unsigned long OBJREF_STANDARD = 0x1; + const unsigned long OBJREF_HANDLER = 0x2; + const unsigned long OBJREF_CUSTOM = 0x4; + const unsigned long SORF_OXRES1 = 0x1; + const unsigned long SORF_OXRES2 = 0x20; + const unsigned long SORF_OXRES3 = 0x40; + const unsigned long SORF_OXRES4 = 0x80; + const unsigned long SORF_OXRES5 = 0x100; + const unsigned long SORF_OXRES6 = 0x200; + const unsigned long SORF_OXRES7 = 0x400; + const unsigned long SORF_OXRES8 = 0x800; + const unsigned long SORF_NULL = 0x0; + const unsigned long SORF_NOPING = 0x1000; + + typedef struct tagSTDOBJREF { + unsigned long flags; + unsigned long cPublicRefs; + OXID oxid; + OID oid; + IPID ipid; + } STDOBJREF; + + typedef struct tagOBJREF { + unsigned long signature; + unsigned long flags; + GUID iid; + [switch_is(flags)] union { + [case(OBJREF_STANDARD)] struct OR_STANDARD { + STDOBJREF std; + DUALSTRINGARRAY saResAddr; + } u_standard; + [case(OBJREF_HANDLER)] struct OR_HANDLER { + STDOBJREF std; + CLSID clsid; + DUALSTRINGARRAY saResAddr; + } u_handler; + [case(OBJREF_CUSTOM)] struct OR_CUSTOM { + CLSID clsid; + unsigned long cbExtension; + unsigned long size; + [size_is(size), ref] byte *pData; + } u_custom; + } u_objref; + } OBJREF; + + typedef struct tagMInterfacePointer { + ULONG ulCntData; + [size_is(ulCntData)] BYTE abData[]; + } MInterfacePointer; + + typedef [unique] MInterfacePointer *PMInterfacePointer; + +} /* interface ObjectRpcBaseTypes */ + +[ + object, + uuid(00000131-0000-0000-C000-000000000046) +] +interface IRemUnknown : IUnknown +{ + typedef [unique] IRemUnknown *LPREMUNKNOWN; + + typedef struct tagREMQIRESULT { + HRESULT hResult; + STDOBJREF std; + } REMQIRESULT; + + typedef struct tagREMINTERFACEREF { + IPID ipid; + unsigned long cPublicRefs; + unsigned long cPrivateRefs; + } REMINTERFACEREF; + + HRESULT RemQueryInterface( + [in] REFIPID ripid, + [in] unsigned long cRefs, + [in] unsigned short cIids, + [in, size_is(cIids)] IID *iids, + [out, size_is(,cIids)] REMQIRESULT **ppQIResults); + + HRESULT RemAddRef( + [in] unsigned short cInterfaceRefs, + [in, size_is(cInterfaceRefs)] REMINTERFACEREF* InterfaceRefs, + [out, size_is(cInterfaceRefs)] HRESULT *pResults); + + HRESULT RemRelease( + [in] unsigned short cInterfaceRefs, + [in, size_is(cInterfaceRefs)] REMINTERFACEREF* InterfaceRefs); +} + +[ + object, + uuid(00000142-0000-0000-C000-000000000046) +] +interface IRemUnknown2 : IRemUnknown +{ + typedef [unique] IRemUnknown2 *LPREMUNKNOWN2; + + HRESULT RemQueryInterface2( + [in] REFIPID ripid, + [in] unsigned short cIids, + [in, size_is(cIids)] IID *iids, + [out, size_is(cIids)] HRESULT *phr, + [out, size_is(cIids)] MInterfacePointer **ppMIF); +} + +cpp_quote("#if 0") +[ + uuid(99fcfec4-5260-101b-bbcb-00aa0021347a), + pointer_default(unique) +] +interface IOXIDResolver +{ + [idempotent] error_status_t ResolveOxid( + [in] handle_t hRpc, + [in] OXID *pOxid, + [in] unsigned short cRequestedProtseqs, + [in, ref, size_is(cRequestedProtseqs)] unsigned short arRequestedProtseqs[], + [out, ref] DUALSTRINGARRAY **ppdsaOxidBindings, + [out, ref] IPID *pipidRemUnknown, + [out, ref] DWORD *pAuthnHint); + + [idempotent] error_status_t SimplePing( + [in] handle_t hRpc, + [in] SETID *pSetId); + + [idempotent] error_status_t ComplexPing( + [in] handle_t hRpc, + [in, out] SETID *pSetId, + [in] unsigned short SequenceNum, + [in] unsigned short cAddToSet, + [in] unsigned short cDelFromSet, + [in, unique, size_is(cAddToSet)] OID AddToSet[], + [in, unique, size_is(cDelFromSet)] OID DelFromSet[], + [out] unsigned short *pPingBackoffFactor); + + [idempotent] error_status_t ServerAlive( + [in] handle_t hRpc); + + [idempotent] error_status_t ResolveOxid2( + [in] handle_t hRpc, + [in] OXID *pOxid, + [in] unsigned short cRequestedProtseqs, + [in, ref, size_is(cRequestedProtseqs)] unsigned short arRequestedProtseqs[], + [out, ref] DUALSTRINGARRAY **ppdsaOxidBindings, + [out, ref] IPID *pipidRemUnknown, + [out, ref] DWORD *pAuthnHint, + [out, ref] COMVERSION *pComVersion); +} + +[ + uuid(4d9f4ab8-7d1c-11cf-861e-0020af6e7c57), + pointer_default(unique) +] +interface IRemoteActivation +{ + const unsigned long MODE_GET_CLASS_OBJECT = 0xffffffff; + + HRESULT RemoteActivation( + [in] handle_t hRpc, + [in] ORPCTHIS *ORPCthis, + [out] ORPCTHAT *ORPCthat, + [in] GUID *Clsid, + [in, string, unique] WCHAR *pwszObjectName, + [in, unique] MInterfacePointer *pObjectStorage, + [in] DWORD ClientImpLevel, + [in] DWORD Mode, + [in] DWORD Interfaces, + [in, unique, size_is(Interfaces)] IID *pIIDs, + [in] unsigned short cRequestedProtseqs, + [in, size_is(cRequestedProtseqs)] unsigned short RequestedProtseqs[], + [out] OXID *pOxid, + [out] DUALSTRINGARRAY **ppdsaOxidBindings, + [out] IPID *pipidRemUnknown, + [out] DWORD *pAuthnHint, + [out] COMVERSION *pServerVersion, + [out] HRESULT *phr, + [out,size_is(Interfaces)] MInterfacePointer **ppInterfaceData, + [out,size_is(Interfaces)] HRESULT *pResults); +} +cpp_quote("#endif") --- /dev/null 2003-01-10 01:23:22.000000000 +0100 +++ dlls/ole32/dcom.h 2002-12-06 11:47:03.000000000 +0100 @@ -0,0 +1,358 @@ +/*** Autogenerated by WIDL 0.1 from dcom.idl - Do not edit ***/ +#ifndef __WIDL_DCOM_H +#define __WIDL_DCOM_H +#ifdef __cplusplus +extern "C" { +#endif +#include "unknwn.h" +typedef MIDL_uhyper ID; + +typedef ID MID; + +typedef ID OXID; + +typedef ID OID; + +typedef ID SETID; + +typedef GUID IPID; + +typedef GUID CID; + +typedef REFGUID REFIPID; + +#define COM_MINOR_VERSION_1 (1) + +#define COM_MINOR_VERSION_2 (2) + +#define COM_MAJOR_VERSION (5) + +#define COM_MINOR_VERSION (3) + +typedef struct tagCOMVERSION { + unsigned short MajorVersion; + unsigned short MinorVersion; +} COMVERSION; + +#define ORPCF_NULL (0) + +#define ORPCF_LOCAL (1) + +#define ORPCF_RESERVED1 (2) + +#define ORPCF_RESERVED2 (4) + +#define ORPCF_RESERVED3 (8) + +#define ORPCF_RESERVED4 (16) + +typedef struct tagORPC_EXTENT { + GUID id; + unsigned long size; + byte data[1]; +} ORPC_EXTENT; + +typedef struct tagORPC_EXTENT_ARRAY { + unsigned long size; + unsigned long reserved; + ORPC_EXTENT **extent; +} ORPC_EXTENT_ARRAY; + +typedef struct tagORPCTHIS { + COMVERSION version; + unsigned long flags; + unsigned long reserved1; + CID cid; + ORPC_EXTENT_ARRAY *extensions; +} ORPCTHIS; + +typedef struct tagORPCTHAT { + unsigned long flags; + ORPC_EXTENT_ARRAY *extensions; +} ORPCTHAT; + +#define NCADG_IP_UDP (0x8) + +#define NCACN_IP_TCP (0x7) + +#define NCADG_IPX (0xe) + +#define NCACN_SPX (0xc) + +#define NCACN_NB_NB (0x12) + +#define NCACN_NB_IPX (0xd) + +#define NCACN_DNET_NSP (0x4) + +#define NCACN_HTTP (0x1f) + +typedef struct tagSTRINGBINDING { + unsigned short wTowerId; + unsigned short aNetworkAddr[1]; +} STRINGBINDING; + +#define COM_C_AUTHZ_NONE (0xffff) + +typedef struct tagSECURITYBINDING { + unsigned short wAuthnSvc; + unsigned short wAuthzSvc; + unsigned short aPrincName[1]; +} SECURITYBINDING; + +typedef struct tagDUALSTRINGARRAY { + unsigned short wNumEntries; + unsigned short wSecurityOffset; + unsigned short aStringArray[1]; +} DUALSTRINGARRAY; + +#define OBJREF_SIGNATURE (0x574f454d) + +#define OBJREF_STANDARD (0x1) + +#define OBJREF_HANDLER (0x2) + +#define OBJREF_CUSTOM (0x4) + +#define SORF_OXRES1 (0x1) + +#define SORF_OXRES2 (0x20) + +#define SORF_OXRES3 (0x40) + +#define SORF_OXRES4 (0x80) + +#define SORF_OXRES5 (0x100) + +#define SORF_OXRES6 (0x200) + +#define SORF_OXRES7 (0x400) + +#define SORF_OXRES8 (0x800) + +#define SORF_NULL (0x0) + +#define SORF_NOPING (0x1000) + +typedef struct tagSTDOBJREF { + unsigned long flags; + unsigned long cPublicRefs; + OXID oxid; + OID oid; + IPID ipid; +} STDOBJREF; + +typedef struct tagOBJREF { + unsigned long signature; + unsigned long flags; + GUID iid; + union { + struct OR_STANDARD { + STDOBJREF std; + DUALSTRINGARRAY saResAddr; + } u_standard; + struct OR_HANDLER { + STDOBJREF std; + CLSID clsid; + DUALSTRINGARRAY saResAddr; + } u_handler; + struct OR_CUSTOM { + CLSID clsid; + unsigned long cbExtension; + unsigned long size; + byte *pData; + } u_custom; + } u_objref; +} OBJREF; + +typedef struct tagMInterfacePointer { + ULONG ulCntData; + BYTE abData[1]; +} MInterfacePointer; + +typedef MInterfacePointer *PMInterfacePointer; + +typedef struct IRemUnknown IRemUnknown; +typedef IRemUnknown *LPREMUNKNOWN; + +typedef struct tagREMQIRESULT { + HRESULT hResult; + STDOBJREF std; +} REMQIRESULT; + +typedef struct tagREMINTERFACEREF { + IPID ipid; + unsigned long cPublicRefs; + unsigned long cPrivateRefs; +} REMINTERFACEREF; + +/***************************************************************************** + * IRemUnknown interface + */ +DEFINE_GUID(IID_IRemUnknown, 0x00000131, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#define ICOM_INTERFACE IRemUnknown +#define IRemUnknown_METHODS \ + ICOM_METHOD5 (HRESULT,RemQueryInterface,REFIPID,ripid,unsigned long,cRefs,unsigned short,cIids,IID*,iids,REMQIRESULT**,ppQIResults) \ + ICOM_METHOD3 (HRESULT,RemAddRef,unsigned short,cInterfaceRefs,REMINTERFACEREF*,InterfaceRefs,HRESULT*,pResults) \ + ICOM_METHOD2 (HRESULT,RemRelease,unsigned short,cInterfaceRefs,REMINTERFACEREF*,InterfaceRefs) +#define IRemUnknown_IMETHODS \ + IUnknown_IMETHODS \ + IRemUnknown_METHODS +ICOM_DEFINE(IRemUnknown,IUnknown) +#undef ICOM_INTERFACE + +/*** IUnknown methods ***/ +#define IRemUnknown_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b) +#define IRemUnknown_AddRef(p) ICOM_CALL(AddRef,p) +#define IRemUnknown_Release(p) ICOM_CALL(Release,p) +/*** IRemUnknown methods ***/ +#define IRemUnknown_RemQueryInterface(p,a,b,c,d,e) ICOM_CALL5(RemQueryInterface,p,a,b,c,d,e) +#define IRemUnknown_RemAddRef(p,a,b,c) ICOM_CALL3(RemAddRef,p,a,b,c) +#define IRemUnknown_RemRelease(p,a,b) ICOM_CALL2(RemRelease,p,a,b) + +HRESULT CALLBACK IRemUnknown_RemQueryInterface_Proxy( + IRemUnknown* This, + REFIPID ripid, + unsigned long cRefs, + unsigned short cIids, + IID* iids, + REMQIRESULT** ppQIResults); +void __RPC_STUB IRemUnknown_RemQueryInterface_Stub( + struct IRpcStubBuffer* This, + struct IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT CALLBACK IRemUnknown_RemAddRef_Proxy( + IRemUnknown* This, + unsigned short cInterfaceRefs, + REMINTERFACEREF* InterfaceRefs, + HRESULT* pResults); +void __RPC_STUB IRemUnknown_RemAddRef_Stub( + struct IRpcStubBuffer* This, + struct IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT CALLBACK IRemUnknown_RemRelease_Proxy( + IRemUnknown* This, + unsigned short cInterfaceRefs, + REMINTERFACEREF* InterfaceRefs); +void __RPC_STUB IRemUnknown_RemRelease_Stub( + struct IRpcStubBuffer* This, + struct IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); + +typedef struct IRemUnknown2 IRemUnknown2; +typedef IRemUnknown2 *LPREMUNKNOWN2; + +/***************************************************************************** + * IRemUnknown2 interface + */ +DEFINE_GUID(IID_IRemUnknown2, 0x00000142, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#define ICOM_INTERFACE IRemUnknown2 +#define IRemUnknown2_METHODS \ + ICOM_METHOD5 (HRESULT,RemQueryInterface2,REFIPID,ripid,unsigned short,cIids,IID*,iids,HRESULT*,phr,MInterfacePointer**,ppMIF) +#define IRemUnknown2_IMETHODS \ + IRemUnknown_IMETHODS \ + IRemUnknown2_METHODS +ICOM_DEFINE(IRemUnknown2,IRemUnknown) +#undef ICOM_INTERFACE + +/*** IUnknown methods ***/ +#define IRemUnknown2_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b) +#define IRemUnknown2_AddRef(p) ICOM_CALL(AddRef,p) +#define IRemUnknown2_Release(p) ICOM_CALL(Release,p) +/*** IRemUnknown methods ***/ +#define IRemUnknown2_RemQueryInterface(p,a,b,c,d,e) ICOM_CALL5(RemQueryInterface,p,a,b,c,d,e) +#define IRemUnknown2_RemAddRef(p,a,b,c) ICOM_CALL3(RemAddRef,p,a,b,c) +#define IRemUnknown2_RemRelease(p,a,b) ICOM_CALL2(RemRelease,p,a,b) +/*** IRemUnknown2 methods ***/ +#define IRemUnknown2_RemQueryInterface2(p,a,b,c,d,e) ICOM_CALL5(RemQueryInterface2,p,a,b,c,d,e) + +HRESULT CALLBACK IRemUnknown2_RemQueryInterface2_Proxy( + IRemUnknown2* This, + REFIPID ripid, + unsigned short cIids, + IID* iids, + HRESULT* phr, + MInterfacePointer** ppMIF); +void __RPC_STUB IRemUnknown2_RemQueryInterface2_Stub( + struct IRpcStubBuffer* This, + struct IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); + +#if 0 +/***************************************************************************** + * IOXIDResolver interface (v0.0) + */ +DEFINE_GUID(IID_IOXIDResolver, 0x99fcfec4, 0x5260, 0x101b, 0xbb,0xcb, 0x00,0xaa,0x00,0x21,0x34,0x7a); +extern RPC_IF_HANDLE IOXIDResolver_v0_0_c_ifspec; +extern RPC_IF_HANDLE IOXIDResolver_v0_0_s_ifspec; +error_status_t ResolveOxid( + handle_t hRpc, + OXID* pOxid, + unsigned short cRequestedProtseqs, + unsigned short arRequestedProtseqs, + DUALSTRINGARRAY** ppdsaOxidBindings, + IPID* pipidRemUnknown, + DWORD* pAuthnHint); +error_status_t SimplePing( + handle_t hRpc, + SETID* pSetId); +error_status_t ComplexPing( + handle_t hRpc, + SETID* pSetId, + unsigned short SequenceNum, + unsigned short cAddToSet, + unsigned short cDelFromSet, + OID AddToSet, + OID DelFromSet, + unsigned short* pPingBackoffFactor); +error_status_t ServerAlive( + handle_t hRpc); +error_status_t ResolveOxid2( + handle_t hRpc, + OXID* pOxid, + unsigned short cRequestedProtseqs, + unsigned short arRequestedProtseqs, + DUALSTRINGARRAY** ppdsaOxidBindings, + IPID* pipidRemUnknown, + DWORD* pAuthnHint, + COMVERSION* pComVersion); + +#define MODE_GET_CLASS_OBJECT (0x7fffffff) + +/***************************************************************************** + * IRemoteActivation interface (v0.0) + */ +DEFINE_GUID(IID_IRemoteActivation, 0x4d9f4ab8, 0x7d1c, 0x11cf, 0x86,0x1e, 0x00,0x20,0xaf,0x6e,0x7c,0x57); +extern RPC_IF_HANDLE IRemoteActivation_v0_0_c_ifspec; +extern RPC_IF_HANDLE IRemoteActivation_v0_0_s_ifspec; +HRESULT RemoteActivation( + handle_t hRpc, + ORPCTHIS* ORPCthis, + ORPCTHAT* ORPCthat, + GUID* Clsid, + WCHAR* pwszObjectName, + MInterfacePointer* pObjectStorage, + DWORD ClientImpLevel, + DWORD Mode, + DWORD Interfaces, + IID* pIIDs, + unsigned short cRequestedProtseqs, + unsigned short RequestedProtseqs, + OXID* pOxid, + DUALSTRINGARRAY** ppdsaOxidBindings, + IPID* pipidRemUnknown, + DWORD* pAuthnHint, + COMVERSION* pServerVersion, + HRESULT* phr, + MInterfacePointer** ppInterfaceData, + HRESULT* pResults); + +#endif +#ifdef __cplusplus +} +#endif +#endif /* __WIDL_DCOM_H */