Click here to Skip to main content
15,894,405 members
Articles / Programming Languages / C++

RCF - Interprocess Communication for C++

Rate me:
Please Sign up or sign in to vote.
4.94/5 (147 votes)
25 Oct 2011CPOL20 min read 4.6M   8.4K   331  
A server/client IPC framework, using the C++ preprocessor as an IDL compiler.
//******************************************************************************
// RCF - Remote Call Framework
// Copyright (c) 2005 - 2007. All rights reserved.
// Consult your license for conditions of use.
// Developed by Jarl Lindrud.
// Contact: jlindrud@hotmail.com .
//******************************************************************************

#ifndef INCLUDE_RCF_IDL_HPP
#define INCLUDE_RCF_IDL_HPP

#include <boost/mpl/bool.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/int.hpp>

#include <boost/shared_ptr.hpp>
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_same.hpp>

#include <RCF/ClientStub.hpp>
#include <RCF/ClientTransport.hpp>
#include <RCF/Endpoint.hpp>
#include <RCF/Exception.hpp>
#include <RCF/GetInterfaceName.hpp>
#include <RCF/Marshal.hpp>
#include <RCF/RcfClient.hpp>
#include <RCF/ServerStub.hpp>
#include <RCF/util/Meta.hpp>

// RCF_BEGIN
/// Alias for RCF_BEGIN_INHERITED_0
#define RCF_BEGIN(InterfaceT, Name) RCF_BEGIN_I0(InterfaceT, Name)

// RCF_BEGIN_INHERITED
/// Alias for RCF_BEGIN_INHERITED_1
//#define RCF_BEGIN_INHERITED(InterfaceT, Name, InheritT) RCF_BEGIN_INHERITED_1(InterfaceT, Name, InheritT)

// RCF_BEGIN_INHERITED_0
/// Marks the beginning of the definition of a RCF interface.
/// \param InterfaceT Interface name (symbolic).
/// \param Name Interface name (string). If "", then the name will be auto generated from the symbolic name.
#define RCF_BEGIN_I0(InterfaceT, Name)                                                                  \
    RCF_BEGIN_IMPL_PRELUDE(InterfaceT, Name)                                                            \
    RCF_BEGIN_IMPL_INHERITED_0(InterfaceT, Name)                                                        \
    RCF_BEGIN_IMPL_POSTLUDE(InterfaceT, Name)

// RCF_BEGIN_INHERITED_1
/// Marks the beginning of the definition of a inherited RCF interface.
/// \param InterfaceT Interface name (symbolic).
/// \param Name Interface name (string). If "", then the name will be auto generated from the symbolic name.
/// \param InheritT Interface to derive from. May be a generic C++ class, for instance an abstract base class, or a RCF interface.
#define RCF_BEGIN_I1(InterfaceT, Name, InheritT1)                                                       \
    RCF_BEGIN_IMPL_PRELUDE(InterfaceT, Name)                                                            \
    RCF_BEGIN_IMPL_INHERITED_1(InterfaceT, Name, InheritT1)                                             \
    RCF_BEGIN_IMPL_POSTLUDE(InterfaceT, Name)

// RCF_BEGIN_INHERITED_2
/// Marks the beginning of the definition of a inherited RCF interface.
/// \param InterfaceT Interface name (symbolic).
/// \param Name Interface name (string). If "", then the name will be auto generated from the symbolic name.
/// \param InheritT1 First interface to derive from. May be a generic C++ class, for instance an abstract base class, or a RCF interface.
/// \param InheritT2 Second interface to derive from. May be a generic C++ class, for instance an abstract base class, or a RCF interface.
#define RCF_BEGIN_I2(InterfaceT, Name, InheritT1, InheritT2)                                            \
    RCF_BEGIN_IMPL_PRELUDE(InterfaceT, Name)                                                            \
    RCF_BEGIN_IMPL_INHERITED_2(InterfaceT, Name, InheritT1, InheritT2)                                  \
    RCF_BEGIN_IMPL_POSTLUDE(InterfaceT, Name)

// RCF_BEGIN_IMPL_PRELUDE
#define RCF_BEGIN_IMPL_PRELUDE(InterfaceT, Name)                                                        \
                                                                                                        \
    template<typename T>                                                                                \
    class RcfClient;                                                                                    \
                                                                                                        \
    class InterfaceT                                                                                    \
    {                                                                                                   \
    public:                                                                                             \
        typedef RcfClient<InterfaceT> RcfClient;                                                        \
        static std::string getInterfaceName()                                                           \
        {                                                                                               \
            return std::string(Name) == "" ? #InterfaceT : Name;                                        \
        }                                                                                               \
    };

// RCF_BEGIN_IMPL_INHERITED_0
#define RCF_BEGIN_IMPL_INHERITED_0(InterfaceT, Name)                                                    \
    template<>                                                                                          \
    class RcfClient< InterfaceT > :                                                                     \
        public virtual ::RCF::I_RcfClient                                                               \
    {                                                                                                   \
    private:                                                                                            \
        template<typename DerefPtrT>                                                                    \
        void registerInvokeFunctors(::RCF::InvokeFunctorMap &invokeFunctorMap, DerefPtrT derefPtr)      \
        {                                                                                               \
            ::RCF::registerInvokeFunctors(*this, invokeFunctorMap, derefPtr);                           \
        }                                                                                               \
        void setClientStubPtr(::RCF::ClientStubPtr clientStubPtr)                                       \
        {                                                                                               \
            mClientStubPtr = clientStubPtr;                                                             \
        }

// RCF_BEGIN_IMPL_INHERITED_1
#define RCF_BEGIN_IMPL_INHERITED_1(InterfaceT, Name, InheritT1)                                         \
    template<>                                                                                          \
    class RcfClient< InterfaceT > :                                                                     \
        public virtual ::RCF::I_RcfClient,                                                              \
        public virtual ::RCF::GetInterface<InheritT1>::type                                             \
    {                                                                                                   \
    private:                                                                                            \
        template<typename DerefPtrT>                                                                    \
        void registerInvokeFunctors(::RCF::InvokeFunctorMap &invokeFunctorMap, DerefPtrT derefPtr)      \
        {                                                                                               \
            ::RCF::registerInvokeFunctors(*this, invokeFunctorMap, derefPtr);                           \
            ::RCF::StubAccess().registerParentInvokeFunctors( (InheritT1 *) NULL, *this, invokeFunctorMap, derefPtr); \
        }                                                                                               \
        void setClientStubPtr(::RCF::ClientStubPtr clientStubPtr)                                       \
        {                                                                                               \
            mClientStubPtr = clientStubPtr;                                                             \
            ::RCF::StubAccess().setClientStubPtr( (InheritT1*) 0, *this);                               \
        }

// RCF_BEGIN_IMPL_INHERITED_2
#define RCF_BEGIN_IMPL_INHERITED_2(InterfaceT, Name, InheritT1, InheritT2)                              \
    template<>                                                                                          \
    class RcfClient< InterfaceT > :                                                                     \
        public virtual ::RCF::I_RcfClient,                                                              \
        public virtual ::RCF::GetInterface<InheritT1>::type,                                            \
        public virtual ::RCF::GetInterface<InheritT2>::type                                             \
    {                                                                                                   \
    private:                                                                                            \
        template<typename DerefPtrT>                                                                    \
        void registerInvokeFunctors(::RCF::InvokeFunctorMap &invokeFunctorMap, DerefPtrT derefPtr)      \
        {                                                                                               \
            ::RCF::registerInvokeFunctors(*this, invokeFunctorMap, derefPtr);                           \
            ::RCF::StubAccess().registerParentInvokeFunctors( (InheritT1 *) NULL, *this, invokeFunctorMap, derefPtr);   \
            ::RCF::StubAccess().registerParentInvokeFunctors( (InheritT2 *) NULL, *this, invokeFunctorMap, derefPtr);   \
        }                                                                                               \
        void setClientStubPtr(::RCF::ClientStubPtr clientStubPtr)                                       \
        {                                                                                               \
            mClientStubPtr = clientStubPtr;                                                             \
            ::RCF::StubAccess().setClientStubPtr( (InheritT1*) 0, *this);                               \
            ::RCF::StubAccess().setClientStubPtr( (InheritT2*) 0, *this);                               \
        }

// RCF_BEGIN_IMPL_POSTLUDE
#define RCF_BEGIN_IMPL_POSTLUDE(InterfaceT, Name)                                                       \
    public:                                                                                             \
                                                                                                        \
        RcfClient()                                                                                     \
        {}                                                                                              \
                                                                                                        \
        template<typename DerefPtrT>                                                                    \
        RcfClient(::RCF::ServerStubPtr serverStubPtr, DerefPtrT derefPtr)                               \
        {                                                                                               \
            serverStubPtr->registerInvokeFunctors(*this, derefPtr);                                     \
            mServerStubPtr = serverStubPtr;                                                             \
        }                                                                                               \
                                                                                                        \
        RcfClient(                                                                                      \
            const ::RCF::I_Endpoint &endpoint,                                                          \
            const std::string &targetName_ = "")                                                        \
        {                                                                                               \
            const std::string &interfaceName = ::RCF::getInterfaceName( (InterfaceT *) NULL);           \
            const std::string &targetName = (targetName_ == "") ? interfaceName : targetName_;          \
            ::RCF::ClientStubPtr clientStubPtr( new ::RCF::ClientStub(interfaceName, targetName) );     \
            clientStubPtr->setEndpoint(endpoint);                                                       \
            setClientStubPtr(clientStubPtr);                                                            \
        }                                                                                               \
                                                                                                        \
        RcfClient(                                                                                      \
            ::RCF::ClientTransportAutoPtr clientTransportAutoPtr,                                       \
            const std::string &targetName_ = "")                                                        \
        {                                                                                               \
            const std::string &interfaceName = ::RCF::getInterfaceName( (InterfaceT *) NULL);           \
            const std::string &targetName = (targetName_ == "") ? interfaceName : targetName_;          \
            ::RCF::ClientStubPtr clientStubPtr( new ::RCF::ClientStub(interfaceName, targetName) );     \
            clientStubPtr->setTransport(clientTransportAutoPtr);                                        \
            setClientStubPtr(clientStubPtr);                                                            \
        }                                                                                               \
                                                                                                        \
        RcfClient(                                                                                      \
            const ::RCF::ClientStub &clientStub,                                                        \
            const std::string &targetName_ = "")                                                        \
        {                                                                                               \
            const std::string &interfaceName = ::RCF::getInterfaceName( (InterfaceT *) NULL);           \
            const std::string &targetName = (targetName_ == "") ? interfaceName : targetName_;          \
            ::RCF::ClientStubPtr clientStubPtr( new ::RCF::ClientStub(clientStub) );                    \
            clientStubPtr->setTargetName(targetName);                                                   \
            setClientStubPtr(clientStubPtr);                                                            \
        }                                                                                               \
                                                                                                        \
        template<typename T>                                                                            \
        RcfClient(                                                                                      \
            const RcfClient<T> &rhs)                                                                    \
        {                                                                                               \
            ::RCF::ClientStubPtr clientStubPtr( new ::RCF::ClientStub(rhs.getClientStub()));            \
            setClientStubPtr(clientStubPtr);                                                            \
        }                                                                                               \
                                                                                                        \
        template<typename T>                                                                            \
        RcfClient &operator=(const RcfClient<T> &rhs)                                                   \
        {                                                                                               \
            if (&rhs != this)                                                                           \
            {                                                                                           \
                ::RCF::ClientStubPtr clientStubPtr( new ::RCF::ClientStub(rhs.getClientStub()));        \
                setClientStubPtr(clientStubPtr);                                                        \
            }                                                                                           \
            return *this;                                                                               \
        }                                                                                               \
                                                                                                        \
    public:                                                                                             \
        ::RCF::ClientStub &getClientStub()                                                              \
        {                                                                                               \
            return *mClientStubPtr;                                                                     \
        }                                                                                               \
                                                                                                        \
        const ::RCF::ClientStub &getClientStub() const                                                  \
        {                                                                                               \
            return *mClientStubPtr;                                                                     \
        }                                                                                               \
                                                                                                        \
    private:                                                                                            \
        ::RCF::ServerStub &getServerStub()                                                              \
        {                                                                                               \
            return *mServerStubPtr;                                                                     \
        }                                                                                               \
                                                                                                        \
    public:                                                                                             \
        template<typename Archive>                                                                      \
        void serialize(Archive &ar, const unsigned int ver)                                             \
        {                                                                                               \
            ::RCF::StubAccess().serialize(ar, *this, ver);                                              \
        }                                                                                               \
                                                                                                        \
    private:                                                                                            \
                                                                                                        \
        template<typename T, typename U>                                                                \
        void invoke(                                                                                    \
            const T &,                                                                                  \
            ::RCF::SerializationProtocolIn &,                                                           \
            ::RCF::SerializationProtocolOut &, const U &)                                               \
        {                                                                                               \
            RCF_THROW(::RCF::Exception(::RCF::RcfError_FnId))(typeid(T));                               \
        }                                                                                               \
                                                                                                        \
        ::RCF::ClientStubPtr mClientStubPtr;                                                            \
        ::RCF::ServerStubPtr mServerStubPtr;                                                            \
        friend class ::RCF::StubAccess;                                                                 \
        typedef RcfClient< InterfaceT > ThisT;                                                          \
        typedef ::RCF::Dummy<ThisT> DummyThisT;                                                         \
        friend RCF::default_ RCF_make_next_dispatch_id_func(DummyThisT *, ThisT *,...);                 \
    public:                                                                                             \
        typedef InterfaceT Interface;


// RCF_END
/// Marks the end of the definition of a RCF interface.
/// \param InterfaceT Symbolic name of the interface

// TODO: we don't even need InterfaceT parameter here...
#define RCF_END( InterfaceT )                                                                           \
    };

// RCF_METHOD_R0
/// Defines a member function of an interface, having non-void return type and no arguments.
/// \param R Return type.
/// \param func Function name.
#define RCF_METHOD_R0(R,func)                        RCF_METHOD_R0_(R,func, RCF_MAKE_UNIQUE_ID(func, R0))
#define RCF_METHOD_R0_(R, func, id)                                                                     \
        public:                                                                                         \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            R func()                                                                                    \
            {                                                                                           \
                return func(getClientStub().getDefaultCallingSemantics());                              \
            }                                                                                           \
            R func(RCF::RemoteCallSemantics rcs)                                                        \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                return ::RCF::ClientMarshal_R0< R >()(                                                  \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value);                                                                         \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                RCF_UNUSED_VARIABLE(in);                                                                \
                ::RCF::IDL::OutReturnValue< R >(out, t.func());                                         \
            }



// RCF_METHOD_R1
/// Defines a member function of an interface, having non-void return type and one argument.
/// \param R Return type.
/// \param func Function name.
/// \param A1 Type of first argument.
#define RCF_METHOD_R1(R,func,A1)                        RCF_METHOD_R1_(R,func,A1, RCF_MAKE_UNIQUE_ID(func, R1))
#define RCF_METHOD_R1_(R,func,A1,id)                                                                    \
        public:                                                                                         \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            R func(A1 a1)                                                                               \
            {                                                                                           \
                return func(getClientStub().getDefaultCallingSemantics(), a1);                          \
            }                                                                                           \
            R func(::RCF::RemoteCallSemantics rcs, A1 a1)                                               \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                return ::RCF::ClientMarshal_R1<R,A1 >()(                                                \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1);                                                                                \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::OutReturnValue< R >(out, t.func(arg1.get()));                               \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                        \
            }

// RCF_METHOD_R2
/// Defines a member function of an interface, having non-void return type and two arguments.
/// \param R Return type.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
#define RCF_METHOD_R2(R,func,A1,A2)                        RCF_METHOD_R2_(R,func,A1,A2, RCF_MAKE_UNIQUE_ID(func, R2))
#define RCF_METHOD_R2_(R,func,A1,A2,id)                                                                 \
        public:                                                                                         \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            R func(A1 a1, A2 a2)                                                                        \
            {                                                                                           \
                return func(getClientStub().getDefaultCallingSemantics(), a1, a2);                      \
            }                                                                                           \
            R func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2)                                        \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                return ::RCF::ClientMarshal_R2< R,A1,A2 >()(                                            \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2);                                                                            \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::OutReturnValue< R >(out, t.func(arg1.get(), arg2.get()));                   \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                        \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
            }


// RCF_METHOD_R3
/// Defines a member function of an interface, having non-void return type and three arguments.
/// \param R Return type.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
/// \param A3 Type of third argument.
#define RCF_METHOD_R3(R,func,A1,A2,A3)                        RCF_METHOD_R3_(R,func,A1,A2,A3, RCF_MAKE_UNIQUE_ID(func, R3))
#define RCF_METHOD_R3_(R,func,A1,A2,A3,id)                                                              \
        public:                                                                                         \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            R func(A1 a1, A2 a2, A3 a3)                                                                 \
            {                                                                                           \
                return func(getClientStub().getDefaultCallingSemantics(), a1, a2, a3);                  \
            }                                                                                           \
            R func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2, A3 a3)                                 \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                return ::RCF::ClientMarshal_R3< R,A1,A2,A3 >()(                                         \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2, a3);                                                                        \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::InParameter< A3 >::type arg3(in);                                           \
                ::RCF::IDL::OutReturnValue< R >(out, t.func(arg1.get(), arg2.get(), arg3.get()));       \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                        \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
                ::RCF::IDL::OutParameter< A3 >::type(arg3, out);                                        \
            }

// RCF_METHOD_R4
/// Defines a member function of an interface, having non-void return type and four arguments.
/// \param R Return type.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
/// \param A3 Type of third argument.
/// \param A4 Type of fourth argument.
#define RCF_METHOD_R4(R,func,A1,A2,A3,A4)                        RCF_METHOD_R4_(R,func,A1,A2,A3,A4, RCF_MAKE_UNIQUE_ID(func, R4))
#define RCF_METHOD_R4_(R,func,A1,A2,A3,A4,id)                                                           \
        public:                                                                                         \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            R func(A1 a1, A2 a2, A3 a3, A4 a4)                                                          \
            {                                                                                           \
                return func(getClientStub().getDefaultCallingSemantics(), a1, a2, a3, a4);              \
            }                                                                                           \
            R func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2, A3 a3, A4 a4 )                         \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                return ::RCF::ClientMarshal_R4< R,A1,A2,A3,A4 >()(                                      \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2, a3, a4);                                                                    \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::InParameter< A3 >::type arg3(in);                                           \
                ::RCF::IDL::InParameter< A4 >::type arg4(in);                                                   \
                ::RCF::IDL::OutReturnValue< R >(out, t.func(arg1.get(), arg2.get(), arg3.get(), arg4.get()));   \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                                \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
                ::RCF::IDL::OutParameter< A3 >::type(arg3, out);                                        \
                ::RCF::IDL::OutParameter< A4 >::type(arg4, out);                                        \
            }

// RCF_METHOD_R5
/// Defines a member function of an interface, having non-void return type and five arguments.
/// \param R Return type.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
/// \param A3 Type of third argument.
/// \param A4 Type of fourth argument.
/// \param A5 Type of fifth argument.
#define RCF_METHOD_R5(R,func,A1,A2,A3,A4,A5)                        RCF_METHOD_R5_(R,func,A1,A2,A3,A4,A5, RCF_MAKE_UNIQUE_ID(func, R5))
#define RCF_METHOD_R5_(R,func,A1,A2,A3,A4,A5, id)                                                       \
        public:                                                                                         \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            R func(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)                                                   \
            {                                                                                           \
                return func(getClientStub().getDefaultCallingSemantics(), a1, a2, a3, a4, a5);          \
            }                                                                                           \
            R func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)                   \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                return ::RCF::ClientMarshal_R5< R,A1,A2,A3,A4,A5 >()(                                   \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2, a3, a4, a5);                                                                \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::InParameter< A3 >::type arg3(in);                                           \
                ::RCF::IDL::InParameter< A4 >::type arg4(in);                                           \
                ::RCF::IDL::InParameter< A5 >::type arg5(in);                                                               \
                ::RCF::IDL::OutReturnValue< R >(out, t.func(arg1.get(), arg2.get(), arg3.get(), arg4.get(), arg5.get()));    \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                                            \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
                ::RCF::IDL::OutParameter< A3 >::type(arg3, out);                                        \
                ::RCF::IDL::OutParameter< A4 >::type(arg4, out);                                        \
                ::RCF::IDL::OutParameter< A5 >::type(arg5, out);                                        \
            }

// RCF_METHOD_R6
/// Defines a member function of an interface, having non-void return type and six arguments.
/// \param R Return type.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
/// \param A3 Type of third argument.
/// \param A4 Type of fourth argument.
/// \param A5 Type of fifth argument.
/// \param A6 Type of sixth argument.
#define RCF_METHOD_R6(R,func,A1,A2,A3,A4,A5,A6)                        RCF_METHOD_R6_(R,func,A1,A2,A3,A4,A5,A6, RCF_MAKE_UNIQUE_ID(func, R6))
#define RCF_METHOD_R6_(R,func,A1,A2,A3,A4,A5,A6, id)                                                    \
        public:                                                                                         \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            R func(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)                                            \
            {                                                                                           \
                return func(getClientStub().getDefaultCallingSemantics(), a1, a2, a3, a4, a5, a6);      \
            }                                                                                           \
            R func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)            \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                return ::RCF::ClientMarshal_R6< R,A1,A2,A3,A4,A5,A6 >()(                                \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2, a3, a4, a5, a6);                                                            \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::InParameter< A3 >::type arg3(in);                                           \
                ::RCF::IDL::InParameter< A4 >::type arg4(in);                                           \
                ::RCF::IDL::InParameter< A5 >::type arg5(in);                                           \
                ::RCF::IDL::InParameter< A6 >::type arg6(in);                                                                           \
                ::RCF::IDL::OutReturnValue< R >(out, t.func(arg1.get(), arg2.get(), arg3.get(), arg4.get(), arg5.get(), arg6.get()));   \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                                                        \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
                ::RCF::IDL::OutParameter< A3 >::type(arg3, out);                                        \
                ::RCF::IDL::OutParameter< A4 >::type(arg4, out);                                        \
                ::RCF::IDL::OutParameter< A5 >::type(arg5, out);                                        \
                ::RCF::IDL::OutParameter< A6 >::type(arg6, out);                                        \
            }

// RCF_METHOD_R7
/// Defines a member function of an interface, having non-void return type and seven arguments.
/// \param R Return type.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
/// \param A3 Type of third argument.
/// \param A4 Type of fourth argument.
/// \param A5 Type of fifth argument.
/// \param A6 Type of fifth argument.
/// \param A7 Type of fifth argument.
#define RCF_METHOD_R7(R,func,A1,A2,A3,A4,A5,A6,A7)                        RCF_METHOD_R7_(R,func,A1,A2,A3,A4,A5,A6,A7, RCF_MAKE_UNIQUE_ID(func, R7))
#define RCF_METHOD_R7_(R,func,A1,A2,A3,A4,A5,A6,A7, id)                                                 \
        public:                                                                                         \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            R func(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)                                     \
            {                                                                                           \
                return func(getClientStub().getDefaultCallingSemantics(), a1, a2, a3, a4, a5, a6, a7);  \
            }                                                                                           \
            R func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)     \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                return ::RCF::ClientMarshal_R7< R,A1,A2,A3,A4,A5,A6,A7 >()(                             \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2, a3, a4, a5, a6, a7);                                                        \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::InParameter< A3 >::type arg3(in);                                           \
                ::RCF::IDL::InParameter< A4 >::type arg4(in);                                           \
                ::RCF::IDL::InParameter< A5 >::type arg5(in);                                           \
                ::RCF::IDL::InParameter< A6 >::type arg6(in);                                           \
                ::RCF::IDL::InParameter< A7 >::type arg7(in);                                                                                       \
                ::RCF::IDL::OutReturnValue< R >(out, t.func(arg1.get(), arg2.get(), arg3.get(), arg4.get(), arg5.get(), arg6.get(), arg7.get()));   \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                                                                    \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
                ::RCF::IDL::OutParameter< A3 >::type(arg3, out);                                        \
                ::RCF::IDL::OutParameter< A4 >::type(arg4, out);                                        \
                ::RCF::IDL::OutParameter< A5 >::type(arg5, out);                                        \
                ::RCF::IDL::OutParameter< A6 >::type(arg6, out);                                        \
                ::RCF::IDL::OutParameter< A7 >::type(arg7, out);                                        \
            }

// RCF_METHOD_R8
/// Defines a member function of an interface, having non-void return type and eight arguments.
/// \param R Return type.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
/// \param A3 Type of third argument.
/// \param A4 Type of fourth argument.
/// \param A5 Type of fifth argument.
/// \param A6 Type of sixth argument.
/// \param A7 Type of seventh argument.
/// \param A8 Type of eighth argument.
#define RCF_METHOD_R8(R,func,A1,A2,A3,A4,A5,A6,A7,A8)                        RCF_METHOD_R8_(R,func,A1,A2,A3,A4,A5,A6,A7,A8, RCF_MAKE_UNIQUE_ID(func, R8))
#define RCF_METHOD_R8_(R,func,A1,A2,A3,A4,A5,A6,A7,A8, id)                                              \
        public:                                                                                         \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            R func(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)                              \
            {                                                                                               \
                return func(getClientStub().getDefaultCallingSemantics(), a1, a2, a3, a4, a5, a6, a7, a8);  \
            }                                                                                               \
            R func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)  \
            {                                                                                               \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                return ::RCF::ClientMarshal_R8< R,A1,A2,A3,A4,A5,A6,A7,A8 >()(                          \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2, a3, a4, a5, a6, a7, a8);                                                    \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::InParameter< A3 >::type arg3(in);                                           \
                ::RCF::IDL::InParameter< A4 >::type arg4(in);                                           \
                ::RCF::IDL::InParameter< A5 >::type arg5(in);                                           \
                ::RCF::IDL::InParameter< A6 >::type arg6(in);                                           \
                ::RCF::IDL::InParameter< A7 >::type arg7(in);                                           \
                ::RCF::IDL::InParameter< A8 >::type arg8(in);                                                                                                   \
                ::RCF::IDL::OutReturnValue< R >(out, t.func(arg1.get(), arg2.get(), arg3.get(), arg4.get(), arg5.get(), arg6.get(), arg7.get(), arg8.get()));   \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                                                                                \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
                ::RCF::IDL::OutParameter< A3 >::type(arg3, out);                                        \
                ::RCF::IDL::OutParameter< A4 >::type(arg4, out);                                        \
                ::RCF::IDL::OutParameter< A5 >::type(arg5, out);                                        \
                ::RCF::IDL::OutParameter< A6 >::type(arg6, out);                                        \
                ::RCF::IDL::OutParameter< A7 >::type(arg7, out);                                        \
                ::RCF::IDL::OutParameter< A8 >::type(arg8, out);                                        \
            }

// RCF_METHOD_V0
/// Defines a member function of an interface, having void return type and no arguments.
/// \param R Return type - must be void.
/// \param func Function name.
#define RCF_METHOD_V0(R,func)                        RCF_METHOD_V0_(R,func, RCF_MAKE_UNIQUE_ID(func, V0))
#define RCF_METHOD_V0_(R,func, id)                                                                      \
        public:                                                                                         \
            BOOST_STATIC_ASSERT(( boost::is_same<R, void>::value ));                                    \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            void func()                                                                                 \
            {                                                                                           \
                func(getClientStub().getDefaultCallingSemantics());                                     \
            }                                                                                           \
            void func(::RCF::RemoteCallSemantics rcs)                                                   \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                ::RCF::ClientMarshal_R0< RCF::Void>()(                                                  \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value);                                                                         \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                RCF_UNUSED_VARIABLE(in);                                                                \
                ::RCF::IDL::OutReturnValue<>(out, (t.func(), 0));                                       \
            }

// RCF_METHOD_V1
/// Defines a member function of an interface, having void return type and one argument.
/// \param R Return type - must be void
/// \param func Function name.
/// \param A1 Type of first argument.
#define RCF_METHOD_V1(R,func,A1)                        RCF_METHOD_V1_(R,func,A1, RCF_MAKE_UNIQUE_ID(func, V1))
#define RCF_METHOD_V1_(R,func,A1, id)                                                                   \
        public:                                                                                         \
            BOOST_STATIC_ASSERT(( boost::is_same<R, void>::value ));                                    \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            void func(A1 a1)                                                                            \
            {                                                                                           \
                func(getClientStub().getDefaultCallingSemantics(), a1);                                 \
            }                                                                                           \
            void func(::RCF::RemoteCallSemantics rcs, A1 a1)                                            \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                ::RCF::ClientMarshal_R1< RCF::Void, A1 >()(                                             \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1);                                                                                \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::OutReturnValue<>(out, (t.func(arg1.get()), 0));                             \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                        \
            }


// RCF_METHOD_V2
/// Defines a member function of an interface, having void return type and two arguments.
/// \param R Return type - must be void.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
#define RCF_METHOD_V2(R,func,A1,A2)                        RCF_METHOD_V2_(R,func,A1,A2, RCF_MAKE_UNIQUE_ID(func, V2))
#define RCF_METHOD_V2_(R,func,A1,A2, id)                                                                \
        public:                                                                                         \
            BOOST_STATIC_ASSERT(( boost::is_same<R, void>::value ));                                    \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            void func(A1 a1, A2 a2)                                                                     \
            {                                                                                           \
                func(getClientStub().getDefaultCallingSemantics(), a1, a2);                             \
            }                                                                                           \
            void func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2)                                     \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                ::RCF::ClientMarshal_R2< RCF::Void, A1, A2 >()(                                         \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2);                                                                            \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::OutReturnValue<>(out, (t.func(arg1.get(), arg2.get()), 0));                 \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                        \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
            }


// RCF_METHOD_V3
/// Defines a member function of an interface, having void return type and three arguments.
/// \param R Return type - must be void.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
/// \param A3 Type of third argument.
#define RCF_METHOD_V3(R,func,A1,A2,A3)                        RCF_METHOD_V3_(R,func,A1,A2,A3, RCF_MAKE_UNIQUE_ID(func, V3))
#define RCF_METHOD_V3_(R,func,A1,A2,A3, id)                                                             \
        public:                                                                                         \
            BOOST_STATIC_ASSERT(( boost::is_same<R, void>::value ));                                    \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            void func(A1 a1, A2 a2, A3 a3)                                                              \
            {                                                                                           \
                func(getClientStub().getDefaultCallingSemantics(), a1, a2, a3);                         \
            }                                                                                           \
            void func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2, A3 a3)                              \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                ::RCF::ClientMarshal_R3< RCF::Void, A1, A2, A3 >()(                                     \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2, a3);                                                                        \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::InParameter< A3 >::type arg3(in);                                           \
                ::RCF::IDL::OutReturnValue<>(out, (t.func(arg1.get(), arg2.get(), arg3.get()), 0));     \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                        \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
                ::RCF::IDL::OutParameter< A3 >::type(arg3, out);                                        \
            }

// RCF_METHOD_V4
/// Defines a member function of an interface, having void return type and four arguments.
/// \param R Return type - must be void.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
/// \param A3 Type of third argument.
/// \param A4 Type of fourth argument.
#define RCF_METHOD_V4(R,func,A1,A2,A3,A4)                        RCF_METHOD_V4_(R,func,A1,A2,A3,A4, RCF_MAKE_UNIQUE_ID(func, V4))
#define RCF_METHOD_V4_(R,func,A1,A2,A3,A4, id)                                                          \
        public:                                                                                         \
            BOOST_STATIC_ASSERT(( boost::is_same<R, void>::value ));                                    \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            void func(A1 a1, A2 a2, A3 a3, A4 a4)                                                       \
            {                                                                                           \
                func(getClientStub().getDefaultCallingSemantics(), a1, a2, a3, a4);                     \
            }                                                                                           \
            void func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2, A3 a3, A4 a4)                       \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                ::RCF::ClientMarshal_R4< RCF::Void, A1, A2, A3, A4 >()(                                 \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2, a3, a4);                                                                    \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::InParameter< A3 >::type arg3(in);                                           \
                ::RCF::IDL::InParameter< A4 >::type arg4(in);                                                       \
                ::RCF::IDL::OutReturnValue<>(out, (t.func(arg1.get(), arg2.get(), arg3.get(), arg4.get()), 0));     \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                                    \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
                ::RCF::IDL::OutParameter< A3 >::type(arg3, out);                                        \
                ::RCF::IDL::OutParameter< A4 >::type(arg4, out);                                        \
            }

// RCF_METHOD_V5
/// Defines a member function of an interface, having void return type and five arguments.
/// \param R Return type - must be void.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
/// \param A3 Type of third argument.
/// \param A4 Type of fourth argument.
/// \param A5 Type of fifth argument.
#define RCF_METHOD_V5(R,func,A1,A2,A3,A4,A5)                        RCF_METHOD_V5_(R,func,A1,A2,A3,A4,A5, RCF_MAKE_UNIQUE_ID(func, V5))
#define RCF_METHOD_V5_(R,func,A1,A2,A3,A4,A5, id)                                                       \
        public:                                                                                         \
            BOOST_STATIC_ASSERT(( boost::is_same<R, void>::value ));                                    \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            void func(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)                                                \
            {                                                                                           \
                func(getClientStub().getDefaultCallingSemantics(), a1, a2, a3, a4, a5);                 \
            }                                                                                           \
            void func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)                \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                ::RCF::ClientMarshal_R5< RCF::Void, A1, A2, A3, A4, A5 >()(                             \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2, a3, a4, a5);                                                                \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::InParameter< A3 >::type arg3(in);                                           \
                ::RCF::IDL::InParameter< A4 >::type arg4(in);                                           \
                ::RCF::IDL::InParameter< A5 >::type arg5(in);                                                                   \
                ::RCF::IDL::OutReturnValue<>(out, (t.func(arg1.get(), arg2.get(), arg3.get(), arg4.get(), arg5.get()), 0));     \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                                                \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
                ::RCF::IDL::OutParameter< A3 >::type(arg3, out);                                        \
                ::RCF::IDL::OutParameter< A4 >::type(arg4, out);                                        \
                ::RCF::IDL::OutParameter< A5 >::type(arg5, out);                                        \
            }

// RCF_METHOD_V6
/// Defines a member function of an interface, having void return type and six arguments.
/// \param R Return type - must be void.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
/// \param A3 Type of third argument.
/// \param A4 Type of fourth argument.
/// \param A5 Type of fifth argument.
/// \param A6 Type of sixth argument.
#define RCF_METHOD_V6(R,func,A1,A2,A3,A4,A5,A6)                        RCF_METHOD_V6_(R,func,A1,A2,A3,A4,A5,A6, RCF_MAKE_UNIQUE_ID(func, V6))
#define RCF_METHOD_V6_(R,func,A1,A2,A3,A4,A5,A6, id)                                                    \
        public:                                                                                         \
            BOOST_STATIC_ASSERT(( boost::is_same<R, void>::value ));                                    \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            void func(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)                                         \
            {                                                                                           \
                func(getClientStub().getDefaultCallingSemantics(), a1, a2, a3, a4, a5, a6);             \
            }                                                                                           \
            void func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)         \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                ::RCF::ClientMarshal_R6< RCF::Void, A1, A2, A3, A4, A5, A6 >()(                         \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2, a3, a4, a5, a6);                                                            \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::InParameter< A3 >::type arg3(in);                                           \
                ::RCF::IDL::InParameter< A4 >::type arg4(in);                                           \
                ::RCF::IDL::InParameter< A5 >::type arg5(in);                                           \
                ::RCF::IDL::InParameter< A6 >::type arg6(in);                                                                               \
                ::RCF::IDL::OutReturnValue<>(out, (t.func(arg1.get(), arg2.get(), arg3.get(), arg4.get(), arg5.get(), arg6.get()), 0));     \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                                                            \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
                ::RCF::IDL::OutParameter< A3 >::type(arg3, out);                                        \
                ::RCF::IDL::OutParameter< A4 >::type(arg4, out);                                        \
                ::RCF::IDL::OutParameter< A5 >::type(arg5, out);                                        \
                ::RCF::IDL::OutParameter< A6 >::type(arg6, out);                                        \
            }

// RCF_METHOD_V7
/// Defines a member function of an interface, having void return type and seven arguments.
/// \param R Return type - must be void.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
/// \param A3 Type of third argument.
/// \param A4 Type of fourth argument.
/// \param A5 Type of fifth argument.
/// \param A6 Type of sixth argument.
/// \param A7 Type of seventh argument.
#define RCF_METHOD_V7(R,func,A1,A2,A3,A4,A5,A6,A7)                        RCF_METHOD_V7_(R,func,A1,A2,A3,A4,A5,A6,A7, RCF_MAKE_UNIQUE_ID(func, V7))
#define RCF_METHOD_V7_(R,func,A1,A2,A3,A4,A5,A6,A7, id)                                                 \
        public:                                                                                         \
            BOOST_STATIC_ASSERT(( boost::is_same<R, void>::value ));                                    \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            void func(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)                                  \
            {                                                                                           \
                func(getClientStub().getDefaultCallingSemantics(), a1, a2, a3, a4, a5, a6, a7);         \
            }                                                                                           \
            void func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)  \
            {                                                                                           \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                ::RCF::ClientMarshal_R7< RCF::Void, A1, A2, A3, A4, A5, A6, A7 >()(                     \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2, a3, a4, a5, a6, a7);                                                        \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::InParameter< A3 >::type arg3(in);                                           \
                ::RCF::IDL::InParameter< A4 >::type arg4(in);                                           \
                ::RCF::IDL::InParameter< A5 >::type arg5(in);                                           \
                ::RCF::IDL::InParameter< A6 >::type arg6(in);                                           \
                ::RCF::IDL::InParameter< A7 >::type arg7(in);                                                                                           \
                ::RCF::IDL::OutReturnValue<>(out, (t.func(arg1.get(), arg2.get(), arg3.get(), arg4.get(), arg5.get(), arg6.get(), arg7.get()), 0));     \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                                                                        \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
                ::RCF::IDL::OutParameter< A3 >::type(arg3, out);                                        \
                ::RCF::IDL::OutParameter< A4 >::type(arg4, out);                                        \
                ::RCF::IDL::OutParameter< A5 >::type(arg5, out);                                        \
                ::RCF::IDL::OutParameter< A6 >::type(arg6, out);                                        \
                ::RCF::IDL::OutParameter< A7 >::type(arg7, out);                                        \
            }

// RCF_METHOD_V8
/// Defines a member function of an interface, having void return type and eight arguments.
/// \param R Return type - must be void.
/// \param func Function name.
/// \param A1 Type of first argument.
/// \param A2 Type of second argument.
/// \param A3 Type of third argument.
/// \param A4 Type of fourth argument.
/// \param A5 Type of fifth argument.
/// \param A6 Type of sixth argument.
/// \param A7 Type of seventh argument.
/// \param A8 Type of eighth argument.
#define RCF_METHOD_V8(R,func,A1,A2,A3,A4,A5,A6,A7,A8)                        RCF_METHOD_V8_(R,func,A1,A2,A3,A4,A5,A6,A7,A8, RCF_MAKE_UNIQUE_ID(func, V8))
#define RCF_METHOD_V8_(R,func,A1,A2,A3,A4,A5,A6,A7,A8, id)                                              \
        public:                                                                                         \
            BOOST_STATIC_ASSERT(( boost::is_same<R, void>::value ));                                    \
            RCF_MAKE_NEXT_DISPATCH_ID(id);                                                              \
            void func(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)                           \
            {                                                                                           \
                func(getClientStub().getDefaultCallingSemantics(), a1, a2, a3, a4, a5, a6, a7, a8);     \
            }                                                                                                   \
            void func(::RCF::RemoteCallSemantics rcs, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)   \
            {                                                                                                   \
                ::RCF::CurrentClientStubPtrSentry sentry(mClientStubPtr);                               \
                ::RCF::ClientMarshal_R8< RCF::Void, A1, A2, A3, A4, A5, A6, A7, A8 >()(                 \
                    getClientStub(),                                                                    \
                    rcs,                                                                                \
                    ::RCF::getInterfaceName( (Interface *) NULL),                                       \
                    id::value,                                                                          \
                    a1, a2, a3, a4, a5, a6, a7, a8);                                                    \
            }                                                                                           \
                                                                                                        \
        private:                                                                                        \
            template<typename T>                                                                        \
            void invoke(                                                                                \
                const id &,                                                                             \
                ::RCF::SerializationProtocolIn &in,                                                     \
                ::RCF::SerializationProtocolOut &out,                                                   \
                T &t)                                                                                   \
            {                                                                                           \
                ::RCF::IDL::InParameter< A1 >::type arg1(in);                                           \
                ::RCF::IDL::InParameter< A2 >::type arg2(in);                                           \
                ::RCF::IDL::InParameter< A3 >::type arg3(in);                                           \
                ::RCF::IDL::InParameter< A4 >::type arg4(in);                                           \
                ::RCF::IDL::InParameter< A5 >::type arg5(in);                                           \
                ::RCF::IDL::InParameter< A6 >::type arg6(in);                                           \
                ::RCF::IDL::InParameter< A7 >::type arg7(in);                                           \
                ::RCF::IDL::InParameter< A8 >::type arg8(in);                                                                                                       \
                ::RCF::IDL::OutReturnValue<>(out, (t.func(arg1.get(), arg2.get(), arg3.get(), arg4.get(), arg5.get(), arg6.get(), arg7.get(), arg8.get()), 0));     \
                ::RCF::IDL::OutParameter< A1 >::type(arg1, out);                                                                                                    \
                ::RCF::IDL::OutParameter< A2 >::type(arg2, out);                                        \
                ::RCF::IDL::OutParameter< A3 >::type(arg3, out);                                        \
                ::RCF::IDL::OutParameter< A4 >::type(arg4, out);                                        \
                ::RCF::IDL::OutParameter< A5 >::type(arg5, out);                                        \
                ::RCF::IDL::OutParameter< A6 >::type(arg6, out);                                        \
                ::RCF::IDL::OutParameter< A7 >::type(arg7, out);                                        \
                ::RCF::IDL::OutParameter< A8 >::type(arg8, out);                                        \
            }


// RCF_MAKE_UNIQUE_ID

BOOST_STATIC_ASSERT( sizeof(RCF::defined_) != sizeof(RCF::default_));

#define RCF_MAKE_UNIQUE_ID(func, sig)                       RCF_MAKE_UNIQUE_ID_(func, sig, __LINE__)
#define RCF_MAKE_UNIQUE_ID_(func, sig, __LINE__)            RCF_MAKE_UNIQUE_ID__(func, sig, __LINE__)
#define RCF_MAKE_UNIQUE_ID__(func, sig, Line)               rcf_unique_id_##func##_##sig##_##Line

#define RCF_MAKE_NEXT_DISPATCH_ID(next_dispatch_id)                                                                                                                            \
    typedef                                                                                                                                                                    \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_< 0> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_< 1> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_< 2> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_< 3> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_< 4> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_< 5> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_< 6> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_< 7> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_< 8> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_< 9> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<10> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<11> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<12> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<13> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<14> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<15> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<16> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<17> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<18> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<19> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<20> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<21> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<22> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<23> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<24> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<25> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<26> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<27> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<28> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<29> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<30> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<31> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<32> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<33> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::if_< boost::mpl::bool_< (sizeof(RCF_make_next_dispatch_id_func((DummyThisT *) 0, (ThisT *) 0, (boost::mpl::int_<34> *) 0)) == sizeof(RCF::defined_)) >,        \
    boost::mpl::int_<35>,                           \
    boost::mpl::int_<34> >::type,                   \
    boost::mpl::int_<33> >::type,                   \
    boost::mpl::int_<32> >::type,                   \
    boost::mpl::int_<31> >::type,                   \
    boost::mpl::int_<30> >::type,                   \
    boost::mpl::int_<29> >::type,                   \
    boost::mpl::int_<28> >::type,                   \
    boost::mpl::int_<27> >::type,                   \
    boost::mpl::int_<26> >::type,                   \
    boost::mpl::int_<25> >::type,                   \
    boost::mpl::int_<24> >::type,                   \
    boost::mpl::int_<23> >::type,                   \
    boost::mpl::int_<22> >::type,                   \
    boost::mpl::int_<21> >::type,                   \
    boost::mpl::int_<20> >::type,                   \
    boost::mpl::int_<19> >::type,                   \
    boost::mpl::int_<18> >::type,                   \
    boost::mpl::int_<17> >::type,                   \
    boost::mpl::int_<16> >::type,                   \
    boost::mpl::int_<15> >::type,                   \
    boost::mpl::int_<14> >::type,                   \
    boost::mpl::int_<13> >::type,                   \
    boost::mpl::int_<12> >::type,                   \
    boost::mpl::int_<11> >::type,                   \
    boost::mpl::int_<10> >::type,                   \
    boost::mpl::int_< 9> >::type,                   \
    boost::mpl::int_< 8> >::type,                   \
    boost::mpl::int_< 7> >::type,                   \
    boost::mpl::int_< 6> >::type,                   \
    boost::mpl::int_< 5> >::type,                   \
    boost::mpl::int_< 4> >::type,                   \
    boost::mpl::int_< 3> >::type,                   \
    boost::mpl::int_< 2> >::type,                   \
    boost::mpl::int_< 1> >::type,                   \
    boost::mpl::int_< 0> >::type next_dispatch_id;  \
    friend RCF::defined_ RCF_make_next_dispatch_id_func(DummyThisT *, ThisT *, next_dispatch_id *)

#endif // ! INCLUDE_RCF_IDL_HPP

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
Australia Australia
Software developer, from Sweden and now living in Canberra, Australia, working on distributed C++ applications. When he is not programming, Jarl enjoys skiing and playing table tennis. He derives immense satisfaction from referring to himself in third person.

Comments and Discussions