Previous Table of Contents Next


19.11.2 Mapping a COM Service to OMG IDL


   This section provides an example of mapping a Microsoft IDL-described set of interfaces to an equivalent set of OMG IDL-described interfaces. The interface is mapped according to the rules provided in Section 18.3, “COM to CORBA Data Type Mapping,? on page 18-33. The example chosen is the COM ConnectionPoint set of interfaces. The ConnectionPoint service is commonly used for supporting event notification in OLE custom controls (OCXs). The service is a more general version of the IDataObject/IAdviseSink interfaces.

   The ConnectionPoint service is defined by four interfaces, described in Table 19-9. Table 19-9 Interfaces of the ConnectionPoint Service

IConnectionPointContainer Used by a client to acquire a reference to one or more of an object’s notification interfaces
IConnectionPoint Used to establish and maintain notification connections
IEnumConnectionPoints An iterator over a set of IConnectionPoint references
IEnumConnections Used to iterate over the connections currently associated with a ConnectionPoint

   For purposes of this example, we describe these interfaces in Microsoft IDL. The IConnectionPointContainer interface is shown next.

   // Microsoft IDL

   interface IConnectionPoint;

   interface IEnumConnectionPoints;

   typedef struct {

    unsigned long Data1;

    unsigned short Data2;

    unsigned short Data3;

    unsigned char Data4[8];

   } REFIID;

   [object, uuid(B196B284-BAB4-101A-B69C-00AA00241D07),

   pointer_default(unique)]

   interface IConnectionPointContainer: IUnknown

   {

   HRESULT EnumConnectionPoints ([out] IEnumConnectionPoints

   **pEnum);HRESULT FindConnectionPoint([in] REFIID iid, [out] IConnectionPoint **cp);};MIDL definition for IConnectionPointContainer

   This IConnectionPointContainer interface would correspond to the OMG IDL interface shown next.

   // OMG IDL

   interface IConnectionPoint;

   interface IEnumConnectionPoints;

   struct REFIID {

   unsigned long Data1;

   unsigned short Data2;

   unsigned short Data3;

   unsigned char Data4[8];

   };

   interface IConnectionPointContainer: CORBA::Composite,

   CosLifeCycle::LifeCycleObject { HRESULT EnumConnectionPoints (out IEnumConnectionPoints

   pEnum) raises (COM_HRESULT);HRESULT FindConnectionPoint(in REFIID iid, out

   IConnectionPoint cp) raises (COM_HRESULT); #pragma ID IConnectionPointContainer =‘‘DCE:B196B284-BAB4101A-B69C-00AA00241D07?;

   };

   Similarly, the forward-declared ConnectionPoint interface shown next is remapped to the OMG IDL definition shown in the second following example.

   // Microsoft IDL interface IEnumConnections;[object, uuid(B196B286-BAB4-101A-B69C-00AA00241D07),

   pointer_default(unique)]interface IConnectionPoint: IUnknown{HRESULT GetConnectionInterface([out] IID *pIID);HRESULT GetConnectionPointContainer([out]

   IConnectionPointContainer **ppCPC);HRESULT Advise([in] IUnknown *pUnkSink, [out] DWORD

   *pdwCookie);HRESULT Unadvise(in DWORD dwCookie);HRESULT EnumConnections([out] IEnumConnections

   **ppEnum);};

   // OMG IDLinterface IEnumConnections;interface IConnectionPoint:: CORBA::Composite,

   CosLifeCycle::LifeCycleObject { HRESULT GetConnectionInterface(out IID pIID) raises (COM_HRESULT);

   HRESULT GetConnectionPointContainer(out IConnectionPointContainer pCPC)raises (COM_HRESULT);

   HRESULT Advise(in IUnknown pUnkSink, out DWORD pdwCookie)

   raises (COM_HRESULT);HRESULT Unadvise(in DWORD dwCookie)raises (COM_HRESULT);

   HRESULT EnumConnections(out IEnumConnections ppEnum)

   raises (COM_HRESULT); #pragma ID IConnectionPoint = “DCE:B196B286-BAB4-101A-B69C-00AA00241D07?; };

   Finally, the MIDL definition for IEnumConnectionPoints and IEnum Connections interfaces are shown next.

   typedef struct tagCONNECTDATA {IUnknown * pUnk;

   DWORD dwCookie;} CONNECTDATA;

   [object, uuid(B196B285-BAB4-101A-B69C-00AA00241D07),

   pointer_default(unique)]interface IEnumConnectionPoints: IUnknown{

   HRESULT Next([in] unsigned long cConnections, [out] IConnectionPoint **rcpcn,[out] unsigned long *lpcFetched);

   HRESULT Skip([in] unsigned long cConnections);HRESULT Reset();HRESULT Clone([out] IEnumConnectionPoints **pEnumval);

   };[object, uuid(B196B287-BAB4-101A-B69C-00AA00241D07),

   pointer_default(unique)]interface IEnumConnections: IUnknown{

   HRESULT Next([in] unsigned long cConnections, [out] IConnectionData **rcpcn,[out] unsigned long *lpcFetched);

   HRESULT Skip([in] unsigned long cConnections);HRESULT Reset();HRESULT Clone([out] IEnumConnections **pEnumval);

   };

   The corresponding OMG IDL definition for EnumConnectionPoints and EnumConnections is shown next:

   struct CONNECTDATA {

   IUnknown * pUnk;DWORD dwCookie; }; interface IEnumConnectionPoints: CORBA::Composite, CosLifeCycle::LifeCycleObject {

   HRESULT Next(in unsigned long cConnections, out IConnectionPoint rcpcn,out unsigned long lpcFetched) raises (COM_HRESULT);

   HRESULT Skip(in unsigned long cConnections) raises

   (COM_HRESULT);HRESULT Reset() raises (COM_HRESULT);HRESULT Clone(out IEnumConnectionPoints pEnumval)

   raises(COM_HRESULT) #pragma ID IEnumConnectionPoints = “DCE:B196B285-BAB4-101A-B69C-00AA00241D07?;

   };

   interface IEnumConnections: CORBA::Composite, CosLifeCycle::LifeCycleObject { HRESULT Next(in unsigned long cConnections, out IConnectData rgcd,

   out unsigned long lpcFetched) raises (COM_HRESULT); HRESULT Skip(in unsigned long cConnections) raises

   (COM_HRESULT); HRESULT Reset() raises (COM_HRESULT); HRESULT Clone(out IEnumConnectionPoints pEnumVal) raises

   (COM_HRESULT); #pragma ID IEnumConnections = “DCE:B196B287-BAB4-101A-B69C-00AA00241D07?; };