很多年前,微软提供了COM组件对象模型。
随后,提供了COM SDK。
后来,又在MFC中,增加了COM开发的支持。
再后来,又提供了ATL类库,对COM开发提供了更强大的支持。
本文从使用MFC和ATL开发COM组件的角度,来分析比较两者的差异和优劣。
MFC代码部分
首先,需要继承一个基类,并声明成动态创建类(RuntimeClass)。
//.h
class CComMFCDemo : public CCmdTarget
{
DECLARE_DYNCREATE(CComMFCDemo)
};
//.cpp
IMPLEMENT_DYNCREATE(CComMFCDemo, CCmdTarget)
然后,声明并实现COM功能函数。
//.h
class CComMFCDemo : public CCmdTarget
{
BSTR Greeting(BSTR name);
long Add(long val1, long val2);
long Sub(long val1, long val2);
};
//.cpp
BSTR CComMFCDemo::Greeting(BSTR name)
{
CComBSTR tmp("Welcome, ");
tmp.Append(name);
return tmp;
}
long CComMFCDemo::Add(long val1, long val2)
{
return val1 + val2;
}
long CComMFCDemo::Sub(long val1, long val2)
{
return val1 - val2;
}
然后,声明并实现接口。
这里,为了通用性,使用了双重接口定义。并且,声明了两个不同的接口类型。即IWelcome和IMath。
//.h
class CComMFCDemo : public CCmdTarget
{
BEGIN_DUAL_INTERFACE_PART(Welcome, IWelcome)
STDMETHOD(Greeting)(BSTR name, BSTR *message);
END_INTERFACE_PART(Welcome)
BEGIN_DUAL_INTERFACE_PART(Math, IMath)
STDMETHOD(Add)(LONG val1, LONG val2, LONG* result);
STDMETHOD(Sub)(LONG val1, LONG val2, LONG* result);
END_INTERFACE_PART(Math)
};
//.cpp
DELEGATE_DUAL_INTERFACE(CComMFCDemo, Welcome)
STDMETHODIMP CComMFCDemo::DUAL_INTERFACE(Welcome)::Greeting(BSTR name, BSTR *message)
{
METHOD_PROLOGUE(CComMFCDemo, Welcome)
*message = pThis->Greeting(name);
return S_OK;
}
DELEGATE_DUAL_INTERFACE(CComMFCDemo, Math)
STDMETHODIMP CComMFCDemo::DUAL_INTERFACE(Math)::Add(LONG