COM组件的定义和实现

COM组件的一般由以下三个文件进行定义和实现:

1.         IMATH.H                     组件的接口定义文件

2.         MATH.H                      组件的头文件

3.         MATH.CPP                  组件的实现文件

 

IMATH.H一般定义了组件的接口和一些GUID,内容如下

 

//

// imath.h

//            三个GUID分别唯一标识了组件类和两个接口,以便客户程序可以通过这两个GUID获得组件类和两个接口的实例引用。

 

 

// {A888F560-58E4-11d0-A68A-0000837E3100}

//     组件类GUID----CLISD

//

DEFINE_GUID( CLSID_Math,

             0xa888f560, 0x58e4, 0x11d0, 0xa6, 0x8a, 0x0, 0x0, 0x83, 0x7e, 0x31, 0x0);

// {A888F561-58E4-11d0-A68A-0000837E3100}

//     接口IMATH   GUID------IID

//

DEFINE_GUID( IID_IMath,

             0xa888f561, 0x58e4, 0x11d0, 0xa6, 0x8a, 0x0, 0x0, 0x83, 0x7e, 0x31, 0x0);

 

// {A888F562-58E4-11d0-A68A-0000837E3100}

//     接口 IADVANCEDMATH GUID------IID

DEFINE_GUID( IID_IAdvancedMath,

             0xa888f562, 0x58e4, 0x11d0, 0xa6, 0x8a, 0x0, 0x0, 0x83, 0x7e, 0x31, 0x0);

 

//

//接口IMATH的定义

//

class IMath : public IUnknown

{

public:

   STDMETHOD( Add( long, long, long* ))      PURE;

   STDMETHOD( Subtract( long, long, long* )) PURE;

   STDMETHOD( Multiply( long, long, long* )) PURE;

   STDMETHOD( Divide( long, long, long* ))   PURE;

};

 

//

//接口IADVANCEDMATH的定义

//

class IAdvancedMath : public IUnknown

{

public:

   STDMETHOD( Factorial( short, long* )) PURE;

   STDMETHOD( Fibonacci( short, long* ))  PURE;

};

 

 

 

MATH.H 描述组件类定义和工厂类的定义,内容如下:

//

// math.h

//

 

#include "imath.h"

 

extern long g_lObjs;

extern long g_lLocks;

 

 

class Math : public IMath, public IAdvancedMath

{

protected:

   // Reference count

   long          m_lRef;

 

public:

   Math();

   ~Math();

 

public:

   // IUnknown

   STDMETHOD(QueryInterface( REFIID, void** ));

   STDMETHOD_(ULONG, AddRef());

   STDMETHOD_(ULONG, Release());

 

   // IMath

   STDMETHOD(Add( long, long, long* ));

   STDMETHOD(Subtract( long, long, long* ));

   STDMETHOD(Multiply( long, long, long* ));

   STDMETHOD(Divide( long, long, long* ));

 

   // IAdvancedMath

   STDMETHOD( Factorial( short, long* ));

   STDMETHOD( Fibonacci( short, long* ));

 

};

 

class MathClassFactory : public IClassFactory

{

protected:

   long       m_lRef;

 

public:

   MathClassFactory();

   ~MathClassFactory();

 

   // IUnknown

   STDMETHOD( QueryInterface(REFIID, void** ));

   STDMETHOD_(ULONG, AddRef());

   STDMETHOD_(ULONG, Release());

 

   // IClassFactory

   STDMETHOD( CreateInstance(LPUNKNOWN, REFIID, void**));

   STDMETHOD( LockServer(BOOL));

};

 

 

在组件实现MATH.CPP,中,要实现在MATH.H定义的IUNKNOWNIMATHIADVANCEDMATH接口。

//

// Math.cpp

//

 

#include <windows.h>

#include "math.h"

 

//

// Math class implementation

//

// Constructors

Math::Math()

{

   m_lRef = 0;

 

   // Increment the global object count

   InterlockedIncrement( &g_lObjs );

}

 

// The destructor

Math::~Math()

{

   // Decrement the global object count

   InterlockedDecrement( &g_lObjs );

}

//

//实现由Math类的IUnknown接口

//

STDMETHODIMP Math::QueryInterface( REFIID riid, void** ppv )

{

    *ppv = 0;

 

    if ( riid == IID_IUnknown )   

        *ppv = (IMath*) this;

    else  if ( riid == IID_IMath )   

        *ppv = (IMath*) this;

    else  if ( riid == IID_IAdvancedMath )   

        *ppv = (IAdvancedMath*) this;

 

    if ( *ppv )

    {

        AddRef();

        return( S_OK );

    }

    return (E_NOINTERFACE);

}

 

STDMETHODIMP_(ULONG) Math::AddRef()

{

   return InterlockedIncrement( &m_lRef );

}

 

STDMETHODIMP_(ULONG) Math::Release()

{

   if ( InterlockedDecrement( &m_lRef ) == 0 )

   {

      delete this;

      return 0;

   }

 

   return m_lRef;

}

//

//实现IMath接口

STDMETHODIMP Math::Add( long lOp1, long lOp2, long* pResult )

。。。。。。。。。。。。

 

//

// IAdvancedMath interface

//实现IAdvancedMath接口

//

STDMETHODIMP Math::Factorial( short sOp, long* pResult )

。。。。。。。。。

 

//

//组件的工厂类实现

//主要实现工厂类的IUnknownIClassFactory接口

//

MathClassFactory::MathClassFactory()

{

    m_lRef = 0;

}

 

MathClassFactory::~MathClassFactory()

{

}

 

STDMETHODIMP MathClassFactory::QueryInterface( REFIID riid, void** ppv )

{

   。。。。。。。。。。

 

   return(E_NOINTERFACE);

}

 

STDMETHODIMP_(ULONG) MathClassFactory::AddRef()

{

   return InterlockedIncrement( &m_lRef );

}

 

STDMETHODIMP_(ULONG) MathClassFactory::Release()

{

   。。。。。。。

 

   return m_lRef;

}

 

STDMETHODIMP MathClassFactory::CreateInstance

     ( LPUNKNOWN pUnkOuter, REFIID riid, void** ppvObj )

{

   。。。。。。。。。。

 

   return hr;

}

 

STDMETHODIMP MathClassFactory::LockServer( BOOL fLock )

{

  。。。。。。。。。

 

    return S_OK;

}

 

转载于:https://www.cnblogs.com/cchyao/archive/2010/09/05/1818426.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值