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定义的IUNKNOWN、IMATH、IADVANCEDMATH接口。
//
// 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 )
。。。。。。。。。
//
//组件的工厂类实现
//主要实现工厂类的IUnknown和IClassFactory接口
//
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;
}