Previous | Table of Contents | Next |
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?; };