Click here to Skip to main content
15,895,746 members
Articles / Desktop Programming / ATL

Circular Reference-proof ATL Object Collections

Rate me:
Please Sign up or sign in to vote.
3.90/5 (9 votes)
13 Jul 2017CPOL11 min read 68.3K   1.7K   39  
Using ATL and STL to create collections of COM objects without circular references

/* this ALWAYS GENERATED file contains the definitions for the interfaces */


 /* File created by MIDL compiler version 6.00.0361 */
/* at Wed Sep 17 23:22:13 2003
 */
/* Compiler settings for .\CollectionTest.idl:
    Oicf, W1, Zp8, env=Win32 (32b run)
    protocol : dce , ms_ext, c_ext, robust
    error checks: allocation ref bounds_check enum stub_data 
    VC __declspec() decoration level: 
         __declspec(uuid()), __declspec(selectany), __declspec(novtable)
         DECLSPEC_UUID(), MIDL_INTERFACE()
*/
//@@MIDL_FILE_HEADING(  )

#pragma warning( disable: 4049 )  /* more than 64k source lines */


/* verify that the <rpcndr.h> version is high enough to compile this file*/
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __RPCNDR_H_VERSION__
#error this stub requires an updated version of <rpcndr.h>
#endif // __RPCNDR_H_VERSION__

#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif /*COM_NO_WINDOWS_H*/

#ifndef __CollectionTest_h__
#define __CollectionTest_h__

#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

/* Forward Declarations */ 

#ifndef __IContainer_FWD_DEFINED__
#define __IContainer_FWD_DEFINED__
typedef interface IContainer IContainer;
#endif 	/* __IContainer_FWD_DEFINED__ */


#ifndef __IMember_FWD_DEFINED__
#define __IMember_FWD_DEFINED__
typedef interface IMember IMember;
#endif 	/* __IMember_FWD_DEFINED__ */


#ifndef __IMemberData_FWD_DEFINED__
#define __IMemberData_FWD_DEFINED__
typedef interface IMemberData IMemberData;
#endif 	/* __IMemberData_FWD_DEFINED__ */


#ifndef __IDepartment_FWD_DEFINED__
#define __IDepartment_FWD_DEFINED__
typedef interface IDepartment IDepartment;
#endif 	/* __IDepartment_FWD_DEFINED__ */


#ifndef __IEmployee_FWD_DEFINED__
#define __IEmployee_FWD_DEFINED__
typedef interface IEmployee IEmployee;
#endif 	/* __IEmployee_FWD_DEFINED__ */


#ifndef __Department_FWD_DEFINED__
#define __Department_FWD_DEFINED__

#ifdef __cplusplus
typedef class Department Department;
#else
typedef struct Department Department;
#endif /* __cplusplus */

#endif 	/* __Department_FWD_DEFINED__ */


#ifndef __Employee_FWD_DEFINED__
#define __Employee_FWD_DEFINED__

#ifdef __cplusplus
typedef class Employee Employee;
#else
typedef struct Employee Employee;
#endif /* __cplusplus */

#endif 	/* __Employee_FWD_DEFINED__ */


/* header files for imported files */
#include "oaidl.h"
#include "ocidl.h"

#ifdef __cplusplus
extern "C"{
#endif 

void * __RPC_USER MIDL_user_allocate(size_t);
void __RPC_USER MIDL_user_free( void * ); 

/* interface __MIDL_itf_CollectionTest_0000 */
/* [local] */ 






extern RPC_IF_HANDLE __MIDL_itf_CollectionTest_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_CollectionTest_0000_v0_0_s_ifspec;

#ifndef __IContainer_INTERFACE_DEFINED__
#define __IContainer_INTERFACE_DEFINED__

/* interface IContainer */
/* [unique][helpstring][uuid][object] */ 


EXTERN_C const IID IID_IContainer;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("7B66C6A1-6987-4c75-BBA1-7D60AC31D43C")
    IContainer : public IUnknown
    {
    public:
        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get__NewEnum( 
            /* [retval][out] */ IUnknown **ppUnk) = 0;
        
        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Item( 
            /* [in] */ VARIANT Index,
            /* [retval][out] */ IMember **ppMember) = 0;
        
        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Count( 
            /* [retval][out] */ long *pCount) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct IContainerVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            IContainer * This,
            /* [in] */ REFIID riid,
            /* [iid_is][out] */ void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            IContainer * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IContainer * This);
        
        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( 
            IContainer * This,
            /* [retval][out] */ IUnknown **ppUnk);
        
        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Item )( 
            IContainer * This,
            /* [in] */ VARIANT Index,
            /* [retval][out] */ IMember **ppMember);
        
        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( 
            IContainer * This,
            /* [retval][out] */ long *pCount);
        
        END_INTERFACE
    } IContainerVtbl;

    interface IContainer
    {
        CONST_VTBL struct IContainerVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IContainer_QueryInterface(This,riid,ppvObject)	\
    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)

#define IContainer_AddRef(This)	\
    (This)->lpVtbl -> AddRef(This)

#define IContainer_Release(This)	\
    (This)->lpVtbl -> Release(This)


#define IContainer_get__NewEnum(This,ppUnk)	\
    (This)->lpVtbl -> get__NewEnum(This,ppUnk)

#define IContainer_get_Item(This,Index,ppMember)	\
    (This)->lpVtbl -> get_Item(This,Index,ppMember)

#define IContainer_get_Count(This,pCount)	\
    (This)->lpVtbl -> get_Count(This,pCount)

#endif /* COBJMACROS */


#endif 	/* C style interface */



/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IContainer_get__NewEnum_Proxy( 
    IContainer * This,
    /* [retval][out] */ IUnknown **ppUnk);


void __RPC_STUB IContainer_get__NewEnum_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IContainer_get_Item_Proxy( 
    IContainer * This,
    /* [in] */ VARIANT Index,
    /* [retval][out] */ IMember **ppMember);


void __RPC_STUB IContainer_get_Item_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IContainer_get_Count_Proxy( 
    IContainer * This,
    /* [retval][out] */ long *pCount);


void __RPC_STUB IContainer_get_Count_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);



#endif 	/* __IContainer_INTERFACE_DEFINED__ */


#ifndef __IMember_INTERFACE_DEFINED__
#define __IMember_INTERFACE_DEFINED__

/* interface IMember */
/* [unique][helpstring][uuid][object] */ 


EXTERN_C const IID IID_IMember;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("7B66C6A2-6987-4c75-BBA1-7D60AC31D43C")
    IMember : public IUnknown
    {
    public:
        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Parent( 
            /* [retval][out] */ IContainer **ppCollection) = 0;
        
        virtual /* [helpstring][restricted][hidden][propput][id] */ HRESULT STDMETHODCALLTYPE put_Parent( 
            /* [in] */ IContainer *pCollection) = 0;
        
        virtual /* [helpstring][restricted][hidden][propget][id] */ HRESULT STDMETHODCALLTYPE get_Data( 
            /* [retval][out] */ IMemberData **ppData) = 0;
        
        virtual /* [helpstring][restricted][hidden][propput][id] */ HRESULT STDMETHODCALLTYPE put_Data( 
            /* [in] */ IMemberData *pData) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct IMemberVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            IMember * This,
            /* [in] */ REFIID riid,
            /* [iid_is][out] */ void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            IMember * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IMember * This);
        
        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Parent )( 
            IMember * This,
            /* [retval][out] */ IContainer **ppCollection);
        
        /* [helpstring][restricted][hidden][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Parent )( 
            IMember * This,
            /* [in] */ IContainer *pCollection);
        
        /* [helpstring][restricted][hidden][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Data )( 
            IMember * This,
            /* [retval][out] */ IMemberData **ppData);
        
        /* [helpstring][restricted][hidden][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Data )( 
            IMember * This,
            /* [in] */ IMemberData *pData);
        
        END_INTERFACE
    } IMemberVtbl;

    interface IMember
    {
        CONST_VTBL struct IMemberVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IMember_QueryInterface(This,riid,ppvObject)	\
    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)

#define IMember_AddRef(This)	\
    (This)->lpVtbl -> AddRef(This)

#define IMember_Release(This)	\
    (This)->lpVtbl -> Release(This)


#define IMember_get_Parent(This,ppCollection)	\
    (This)->lpVtbl -> get_Parent(This,ppCollection)

#define IMember_put_Parent(This,pCollection)	\
    (This)->lpVtbl -> put_Parent(This,pCollection)

#define IMember_get_Data(This,ppData)	\
    (This)->lpVtbl -> get_Data(This,ppData)

#define IMember_put_Data(This,pData)	\
    (This)->lpVtbl -> put_Data(This,pData)

#endif /* COBJMACROS */


#endif 	/* C style interface */



/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IMember_get_Parent_Proxy( 
    IMember * This,
    /* [retval][out] */ IContainer **ppCollection);


void __RPC_STUB IMember_get_Parent_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][restricted][hidden][propput][id] */ HRESULT STDMETHODCALLTYPE IMember_put_Parent_Proxy( 
    IMember * This,
    /* [in] */ IContainer *pCollection);


void __RPC_STUB IMember_put_Parent_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][restricted][hidden][propget][id] */ HRESULT STDMETHODCALLTYPE IMember_get_Data_Proxy( 
    IMember * This,
    /* [retval][out] */ IMemberData **ppData);


void __RPC_STUB IMember_get_Data_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][restricted][hidden][propput][id] */ HRESULT STDMETHODCALLTYPE IMember_put_Data_Proxy( 
    IMember * This,
    /* [in] */ IMemberData *pData);


void __RPC_STUB IMember_put_Data_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);



#endif 	/* __IMember_INTERFACE_DEFINED__ */


#ifndef __IMemberData_INTERFACE_DEFINED__
#define __IMemberData_INTERFACE_DEFINED__

/* interface IMemberData */
/* [object][unique][restricted][hidden][helpstring][uuid] */ 


EXTERN_C const IID IID_IMemberData;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("7B66C6A3-6987-4c75-BBA1-7D60AC31D43C")
    IMemberData : public IUnknown
    {
    public:
        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CreateObject( 
            /* [out] */ IMember **ppMember) = 0;
        
        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CanCompareKeys( void) = 0;
        
        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Key( 
            /* [retval][out] */ BSTR *pKey) = 0;
        
        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CompareKey( 
            /* [in] */ BSTR sKey,
            /* [retval][out] */ short *pResult) = 0;
        
        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CanCompareObjects( void) = 0;
        
        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CompareObject( 
            /* [in] */ IMemberData *pData,
            /* [retval][out] */ short *pResult) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct IMemberDataVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            IMemberData * This,
            /* [in] */ REFIID riid,
            /* [iid_is][out] */ void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            IMemberData * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IMemberData * This);
        
        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CreateObject )( 
            IMemberData * This,
            /* [out] */ IMember **ppMember);
        
        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CanCompareKeys )( 
            IMemberData * This);
        
        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Key )( 
            IMemberData * This,
            /* [retval][out] */ BSTR *pKey);
        
        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CompareKey )( 
            IMemberData * This,
            /* [in] */ BSTR sKey,
            /* [retval][out] */ short *pResult);
        
        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CanCompareObjects )( 
            IMemberData * This);
        
        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CompareObject )( 
            IMemberData * This,
            /* [in] */ IMemberData *pData,
            /* [retval][out] */ short *pResult);
        
        END_INTERFACE
    } IMemberDataVtbl;

    interface IMemberData
    {
        CONST_VTBL struct IMemberDataVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IMemberData_QueryInterface(This,riid,ppvObject)	\
    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)

#define IMemberData_AddRef(This)	\
    (This)->lpVtbl -> AddRef(This)

#define IMemberData_Release(This)	\
    (This)->lpVtbl -> Release(This)


#define IMemberData_CreateObject(This,ppMember)	\
    (This)->lpVtbl -> CreateObject(This,ppMember)

#define IMemberData_CanCompareKeys(This)	\
    (This)->lpVtbl -> CanCompareKeys(This)

#define IMemberData_get_Key(This,pKey)	\
    (This)->lpVtbl -> get_Key(This,pKey)

#define IMemberData_CompareKey(This,sKey,pResult)	\
    (This)->lpVtbl -> CompareKey(This,sKey,pResult)

#define IMemberData_CanCompareObjects(This)	\
    (This)->lpVtbl -> CanCompareObjects(This)

#define IMemberData_CompareObject(This,pData,pResult)	\
    (This)->lpVtbl -> CompareObject(This,pData,pResult)

#endif /* COBJMACROS */


#endif 	/* C style interface */



/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMemberData_CreateObject_Proxy( 
    IMemberData * This,
    /* [out] */ IMember **ppMember);


void __RPC_STUB IMemberData_CreateObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMemberData_CanCompareKeys_Proxy( 
    IMemberData * This);


void __RPC_STUB IMemberData_CanCompareKeys_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IMemberData_get_Key_Proxy( 
    IMemberData * This,
    /* [retval][out] */ BSTR *pKey);


void __RPC_STUB IMemberData_get_Key_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMemberData_CompareKey_Proxy( 
    IMemberData * This,
    /* [in] */ BSTR sKey,
    /* [retval][out] */ short *pResult);


void __RPC_STUB IMemberData_CompareKey_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMemberData_CanCompareObjects_Proxy( 
    IMemberData * This);


void __RPC_STUB IMemberData_CanCompareObjects_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMemberData_CompareObject_Proxy( 
    IMemberData * This,
    /* [in] */ IMemberData *pData,
    /* [retval][out] */ short *pResult);


void __RPC_STUB IMemberData_CompareObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);



#endif 	/* __IMemberData_INTERFACE_DEFINED__ */


/* interface __MIDL_itf_CollectionTest_0259 */
/* [local] */ 





extern RPC_IF_HANDLE __MIDL_itf_CollectionTest_0259_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_CollectionTest_0259_v0_0_s_ifspec;

#ifndef __IDepartment_INTERFACE_DEFINED__
#define __IDepartment_INTERFACE_DEFINED__

/* interface IDepartment */
/* [unique][helpstring][nonextensible][dual][uuid][object] */ 


EXTERN_C const IID IID_IDepartment;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("34D1A8C4-1730-4097-AB45-EBECA058E139")
    IDepartment : public IDispatch
    {
    public:
        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Item( 
            /* [in] */ VARIANT Index,
            /* [retval][out] */ IEmployee **pVal) = 0;
        
        virtual /* [propget][id] */ HRESULT STDMETHODCALLTYPE get__NewEnum( 
            /* [retval][out] */ IUnknown **ppUnk) = 0;
        
        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Name( 
            /* [retval][out] */ BSTR *pVal) = 0;
        
        virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Name( 
            /* [in] */ BSTR newVal) = 0;
        
        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Add( 
            /* [in] */ IEmployee *pEmployee) = 0;
        
        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Remove( 
            /* [in] */ VARIANT Index) = 0;
        
        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Count( 
            /* [retval][out] */ long *pVal) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct IDepartmentVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            IDepartment * This,
            /* [in] */ REFIID riid,
            /* [iid_is][out] */ void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            IDepartment * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IDepartment * This);
        
        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( 
            IDepartment * This,
            /* [out] */ UINT *pctinfo);
        
        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( 
            IDepartment * This,
            /* [in] */ UINT iTInfo,
            /* [in] */ LCID lcid,
            /* [out] */ ITypeInfo **ppTInfo);
        
        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( 
            IDepartment * This,
            /* [in] */ REFIID riid,
            /* [size_is][in] */ LPOLESTR *rgszNames,
            /* [in] */ UINT cNames,
            /* [in] */ LCID lcid,
            /* [size_is][out] */ DISPID *rgDispId);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( 
            IDepartment * This,
            /* [in] */ DISPID dispIdMember,
            /* [in] */ REFIID riid,
            /* [in] */ LCID lcid,
            /* [in] */ WORD wFlags,
            /* [out][in] */ DISPPARAMS *pDispParams,
            /* [out] */ VARIANT *pVarResult,
            /* [out] */ EXCEPINFO *pExcepInfo,
            /* [out] */ UINT *puArgErr);
        
        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Item )( 
            IDepartment * This,
            /* [in] */ VARIANT Index,
            /* [retval][out] */ IEmployee **pVal);
        
        /* [propget][id] */ HRESULT ( STDMETHODCALLTYPE *get__NewEnum )( 
            IDepartment * This,
            /* [retval][out] */ IUnknown **ppUnk);
        
        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( 
            IDepartment * This,
            /* [retval][out] */ BSTR *pVal);
        
        /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Name )( 
            IDepartment * This,
            /* [in] */ BSTR newVal);
        
        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Add )( 
            IDepartment * This,
            /* [in] */ IEmployee *pEmployee);
        
        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Remove )( 
            IDepartment * This,
            /* [in] */ VARIANT Index);
        
        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Count )( 
            IDepartment * This,
            /* [retval][out] */ long *pVal);
        
        END_INTERFACE
    } IDepartmentVtbl;

    interface IDepartment
    {
        CONST_VTBL struct IDepartmentVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IDepartment_QueryInterface(This,riid,ppvObject)	\
    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)

#define IDepartment_AddRef(This)	\
    (This)->lpVtbl -> AddRef(This)

#define IDepartment_Release(This)	\
    (This)->lpVtbl -> Release(This)


#define IDepartment_GetTypeInfoCount(This,pctinfo)	\
    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)

#define IDepartment_GetTypeInfo(This,iTInfo,lcid,ppTInfo)	\
    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)

#define IDepartment_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)	\
    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)

#define IDepartment_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)	\
    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)


#define IDepartment_get_Item(This,Index,pVal)	\
    (This)->lpVtbl -> get_Item(This,Index,pVal)

#define IDepartment_get__NewEnum(This,ppUnk)	\
    (This)->lpVtbl -> get__NewEnum(This,ppUnk)

#define IDepartment_get_Name(This,pVal)	\
    (This)->lpVtbl -> get_Name(This,pVal)

#define IDepartment_put_Name(This,newVal)	\
    (This)->lpVtbl -> put_Name(This,newVal)

#define IDepartment_Add(This,pEmployee)	\
    (This)->lpVtbl -> Add(This,pEmployee)

#define IDepartment_Remove(This,Index)	\
    (This)->lpVtbl -> Remove(This,Index)

#define IDepartment_get_Count(This,pVal)	\
    (This)->lpVtbl -> get_Count(This,pVal)

#endif /* COBJMACROS */


#endif 	/* C style interface */



/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDepartment_get_Item_Proxy( 
    IDepartment * This,
    /* [in] */ VARIANT Index,
    /* [retval][out] */ IEmployee **pVal);


void __RPC_STUB IDepartment_get_Item_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [propget][id] */ HRESULT STDMETHODCALLTYPE IDepartment_get__NewEnum_Proxy( 
    IDepartment * This,
    /* [retval][out] */ IUnknown **ppUnk);


void __RPC_STUB IDepartment_get__NewEnum_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDepartment_get_Name_Proxy( 
    IDepartment * This,
    /* [retval][out] */ BSTR *pVal);


void __RPC_STUB IDepartment_get_Name_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IDepartment_put_Name_Proxy( 
    IDepartment * This,
    /* [in] */ BSTR newVal);


void __RPC_STUB IDepartment_put_Name_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IDepartment_Add_Proxy( 
    IDepartment * This,
    /* [in] */ IEmployee *pEmployee);


void __RPC_STUB IDepartment_Add_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IDepartment_Remove_Proxy( 
    IDepartment * This,
    /* [in] */ VARIANT Index);


void __RPC_STUB IDepartment_Remove_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IDepartment_get_Count_Proxy( 
    IDepartment * This,
    /* [retval][out] */ long *pVal);


void __RPC_STUB IDepartment_get_Count_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);



#endif 	/* __IDepartment_INTERFACE_DEFINED__ */


#ifndef __IEmployee_INTERFACE_DEFINED__
#define __IEmployee_INTERFACE_DEFINED__

/* interface IEmployee */
/* [unique][helpstring][nonextensible][dual][uuid][object] */ 


EXTERN_C const IID IID_IEmployee;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("59004EFF-82B9-4511-A5EB-957FF782BF25")
    IEmployee : public IDispatch
    {
    public:
        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Name( 
            /* [retval][out] */ BSTR *pVal) = 0;
        
        virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Name( 
            /* [in] */ BSTR newVal) = 0;
        
        virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Department( 
            /* [retval][out] */ IDepartment **pVal) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct IEmployeeVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            IEmployee * This,
            /* [in] */ REFIID riid,
            /* [iid_is][out] */ void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            IEmployee * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IEmployee * This);
        
        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( 
            IEmployee * This,
            /* [out] */ UINT *pctinfo);
        
        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( 
            IEmployee * This,
            /* [in] */ UINT iTInfo,
            /* [in] */ LCID lcid,
            /* [out] */ ITypeInfo **ppTInfo);
        
        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( 
            IEmployee * This,
            /* [in] */ REFIID riid,
            /* [size_is][in] */ LPOLESTR *rgszNames,
            /* [in] */ UINT cNames,
            /* [in] */ LCID lcid,
            /* [size_is][out] */ DISPID *rgDispId);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( 
            IEmployee * This,
            /* [in] */ DISPID dispIdMember,
            /* [in] */ REFIID riid,
            /* [in] */ LCID lcid,
            /* [in] */ WORD wFlags,
            /* [out][in] */ DISPPARAMS *pDispParams,
            /* [out] */ VARIANT *pVarResult,
            /* [out] */ EXCEPINFO *pExcepInfo,
            /* [out] */ UINT *puArgErr);
        
        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( 
            IEmployee * This,
            /* [retval][out] */ BSTR *pVal);
        
        /* [helpstring][id][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Name )( 
            IEmployee * This,
            /* [in] */ BSTR newVal);
        
        /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Department )( 
            IEmployee * This,
            /* [retval][out] */ IDepartment **pVal);
        
        END_INTERFACE
    } IEmployeeVtbl;

    interface IEmployee
    {
        CONST_VTBL struct IEmployeeVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IEmployee_QueryInterface(This,riid,ppvObject)	\
    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)

#define IEmployee_AddRef(This)	\
    (This)->lpVtbl -> AddRef(This)

#define IEmployee_Release(This)	\
    (This)->lpVtbl -> Release(This)


#define IEmployee_GetTypeInfoCount(This,pctinfo)	\
    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)

#define IEmployee_GetTypeInfo(This,iTInfo,lcid,ppTInfo)	\
    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)

#define IEmployee_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)	\
    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)

#define IEmployee_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)	\
    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)


#define IEmployee_get_Name(This,pVal)	\
    (This)->lpVtbl -> get_Name(This,pVal)

#define IEmployee_put_Name(This,newVal)	\
    (This)->lpVtbl -> put_Name(This,newVal)

#define IEmployee_get_Department(This,pVal)	\
    (This)->lpVtbl -> get_Department(This,pVal)

#endif /* COBJMACROS */


#endif 	/* C style interface */



/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IEmployee_get_Name_Proxy( 
    IEmployee * This,
    /* [retval][out] */ BSTR *pVal);


void __RPC_STUB IEmployee_get_Name_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE IEmployee_put_Name_Proxy( 
    IEmployee * This,
    /* [in] */ BSTR newVal);


void __RPC_STUB IEmployee_put_Name_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IEmployee_get_Department_Proxy( 
    IEmployee * This,
    /* [retval][out] */ IDepartment **pVal);


void __RPC_STUB IEmployee_get_Department_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);



#endif 	/* __IEmployee_INTERFACE_DEFINED__ */



#ifndef __CollectionTestLib_LIBRARY_DEFINED__
#define __CollectionTestLib_LIBRARY_DEFINED__

/* library CollectionTestLib */
/* [helpstring][version][uuid] */ 


EXTERN_C const IID LIBID_CollectionTestLib;

EXTERN_C const CLSID CLSID_Department;

#ifdef __cplusplus

class DECLSPEC_UUID("66F3A9E6-698E-48C8-878A-5E36807569C6")
Department;
#endif

EXTERN_C const CLSID CLSID_Employee;

#ifdef __cplusplus

class DECLSPEC_UUID("BBE92CAB-2230-4195-8550-1F7E8D4050D4")
Employee;
#endif
#endif /* __CollectionTestLib_LIBRARY_DEFINED__ */

/* Additional Prototypes for ALL interfaces */

unsigned long             __RPC_USER  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
unsigned char * __RPC_USER  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
unsigned char * __RPC_USER  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
void                      __RPC_USER  BSTR_UserFree(     unsigned long *, BSTR * ); 

unsigned long             __RPC_USER  VARIANT_UserSize(     unsigned long *, unsigned long            , VARIANT * ); 
unsigned char * __RPC_USER  VARIANT_UserMarshal(  unsigned long *, unsigned char *, VARIANT * ); 
unsigned char * __RPC_USER  VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); 
void                      __RPC_USER  VARIANT_UserFree(     unsigned long *, VARIANT * ); 

/* end of Additional Prototypes */

#ifdef __cplusplus
}
#endif

#endif


By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Australia Australia
Been programming for 40 years now, starting when I was 13 on DEC PDP 11 (back in the day of paper tape storage, and hex switch boot procedures). Got right into micro-computers from an early age, with machines like the Dick Smith Sorcerer and the CompuColor II. Started CP/M and MS-DOS programming in the mid 1980's. By the end of the '80's, I was just starting to get a good grip on OOP (Had Zortech C++ V1.0).

Got into ATL and COM programming early 2002. As a result, my gutter vocabulary has expanded, but it certainly keeps me off the streets.

Recently, I have had to stop working full time as a programmer due to permanent brain damage as a result of a tumour (I just can't keep up the pace required to meet KPI's). I still like to keep my hand in it, though, and will probably post more articles here as I discover various tricky things.

Comments and Discussions